good-cop
TypeScript icon, indicating that this package has built-in type declarations

1.2.5 • Public • Published
          ,   
     _.-"` `'_  _________________________________________________________
 __ '._ __{}_/       __________  ____  ____     __________  ____        /\
||||  |'--.__\      / ____/ __ \/ __ \/ __ \   / ____/ __ \/ __ \      / /
|  L.(   ^ \^      / / __/ / / / / / / / / /  / /   / / / / /_/ /     / /
\ .-' |   _'|     / /_/ / /_/ / /_/ / /_/ /  / /___/ /_/ / ____/     / /
| |   )\___/      \____/\____/\____/_____/   \____/\____/_/         / /
|  \-'`:._] _______________________________________________________/ /
\__/;      '-. ____________________________________________________\/

This library is a personal work, actually used in production apps feel free to contact me via github to collaborate or for feature request

VALIDATION LIBRARY (zod like syntax)

  • Infer typescript types
  • Generate type as string for file generation
  • Generate mongo schemas from types
  • format and validation
  • Can return a different type (ts and validation) depending of a method (create, update, delete...).
    • Eg: When using .required(), you usually want to throw an error on create but not on update
    • Also, when required, the typescript prop type in an object will be required (myProp: val instead of myProp: val) so you wont have to check for undefined before accessing the value
    • Eg2: in a mongo model, you usually want _id field to be mandatory in an object type on read but not on write

Examples

import { _, InferType } from 'good-cop/frontend'

const strDef = _.string().optional()

const objDef = _.object({ 
  string: _.string().required(), 
  enum: _.enum(
    _.number().min(0).max(100).round2(),
    _.boolean()
  ),
  arr: [_.email()],
  otherArr: _.array(_.url()).maxLength(3).required(),
  subObj: {
    subField: _.genericObject('fieldName', { date: _.date() }), // tsType: { [fieldName: string]: { date: Date } }
    regexp: _.string().regexp(/my\sregexp/),
  }
})

type Obj = InferType<typeof objDef>
/*
{
  string: string
  enum?: [ number, boolean ]
  arr?: string[]
  otherArr: string[]
  subObj?: {
    subField?: { [fieldName: string]: { date: Date } }
    regexp?: string
  }
}
*/

Mongo models

import { _, InferTypeRead, InferTypeWrite } from 'good-cop/frontend'

const _ = new Definition<{
  default: { // instead of default you can also have multiple databases
    [modelName: 'user' | 'organization']: any 
  }
}>({ 
  default: {
    user,
    organization
  } 
}).init() // the .init is necessary for the types suggestions to work best

const user = _.mongoModel(
  ['creationDate'], // those fields will be autoCreated and will appear as always defined on read method but not required in write
  {
    firstName: _.string(),
    org: _.ref('organization')
  }
)

type userWrite = InferTypeWrite<typeof user> // this is the type that may be used in a create or an update function

type userRead = InferTypeRead<typeof user> // this is the default and may be used for data outputted by the database

const organization = _.mongoModel([], { name: _.string() }})

TODOS

  • make a way for types to work with population or provide a helper

Readme

Keywords

none

Package Sidebar

Install

npm i good-cop

Weekly Downloads

144

Version

1.2.5

License

ISC

Unpacked Size

1.05 MB

Total Files

92

Last publish

Collaborators

  • topkat