npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

good-cop

v1.2.11

Published

EXTENDABLE VALIDATION LIBRARY (zod like syntax, can generate mongo models and infer types)

Downloads

718

Readme

          ,   
     _.-"` `'_  _________________________________________________________
 __ '._ __{}_/       __________  ____  ____     __________  ____        /\
||||  |'--.__\      / ____/ __ \/ __ \/ __ \   / ____/ __ \/ __ \      / /
|  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