{"_id":"@alcadica/contract","_rev":"2-670e140811700181efb10eaa0020fa71","name":"@alcadica/contract","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@alcadica/contract","version":"1.0.0","description":"Data contracts for data validation","main":"dist/index.js","homepage":"http://www.alcadica.com","types":"dist/index.d.ts","keywords":["contracts","data contracts","data validation","validation"],"author":{"name":"alcadica","email":"npm@alcadica.com"},"scripts":{"build":"tsc -p .","prepublishOnly":"npm run build","test":"jest"},"repository":{"type":"git","url":"git+https://github.com/alcadica/alcadica.git"},"license":"MIT","devDependencies":{"@types/jest":"^23.3.3","jest":"^23.6.0","ts-jest":"^23.10.4","typescript":"^3.1.1"},"bugs":{"url":"https://github.com/alcadica/alcadica/issues"},"_id":"@alcadica/contract@1.0.0","_npmVersion":"6.5.0","_nodeVersion":"11.5.0","_npmUser":{"name":"octod","email":"iamoctod@gmail.com"},"dist":{"integrity":"sha512-H4aMrZGoCbnecwG+PxvDDtv+6OHIBqlEnsYSkhOkNZs8uxJeIDo6aemAHpUQ5xgwOOfjPhid4M4xq7TUW+ymiA==","shasum":"56f053a55ce2914d267d892de8e8638a3038a493","tarball":"https://registry.npmjs.org/@alcadica/contract/-/contract-1.0.0.tgz","fileCount":5,"unpackedSize":24075,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcNz2KCRA9TVsSAnZWagAAkVQP/1fB/NMFVUXZmv3vtjdC\nH9phsFZCBHQyBj+EQMyZQPqhzAYmoKzsj3yw7WZqFP+UZgsX/+msQB/7DnS7\nLXCkXvjJ5/axcPBVHdbttJz3Jfq1vc2mXbzXfnDaA/G12sxztMy48u11POut\njoH86dYIlEaI3zoQu7JOawWpdCeSZg0RPnmY5tjWPhaMvYMZ6Ft1OcNwnIna\nSzYTnEkeg9JNxzYVXC9rShXLKCFTLGFu4kHr8btQfhACmpLqkAQAq8b9zoiH\n4E+vG81JsDlPyGA+ok98TII44/MJFt3kBkS8qy6mX6AgcqRsvDsZwPKgWapD\n1snS7X8L/IiwqcFSpzBqnRANulff6Ii2J0rBSOpLcn3cYE5SzwdG0ESXdzsX\nJ2lc9i0qb9a7aeaEm5FQcxdvqHPV+jr8L/Ma8Pp17ngmlJU1z3xNl1REWHKi\nUNysUoovUy3UszZeQAYc9c+trTO0AZ+wW9xUtqDXN0P+igOoq65gHgvatx6p\nFMt7D2U30Bu/Yts7Iie2NrInlW3waAVrTdH3dmNNujjvGrQ85NSBgW+cPRjc\nS2oiPbfi6pGdupSoea9FrmtzSBTnsF2HFQsfJJfW3olcGX8WfS1XtIvGPs/A\nhJ+LWBvDFKdNCne4owIoObJWlYZnXLxhYUpUBRQjcpqdGzgu8Z5aH3Af63pa\n5VbJ\r\n=LFmx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFGqyA+dqzR8Sf494mwTxkf0TP2oEJbKERGK3UIMG1bxAiBwKr6q56TywTyGUk3T01LPsFvGaOHnOHbSPvibjXMCpw=="}]},"maintainers":[{"name":"npm-alcadica","email":"npm@alcadica.com"},{"name":"octod","email":"iamoctod@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/contract_1.0.0_1547124106215_0.16873968537761197"},"_hasShrinkwrap":false},"1.0.1":{"name":"@alcadica/contract","version":"1.0.1","description":"Data contracts for data validation","main":"dist/index.js","homepage":"http://www.alcadica.com","types":"dist/index.d.ts","keywords":["contracts","data contracts","data validation","validation"],"author":{"name":"alcadica","email":"npm@alcadica.com"},"scripts":{"build":"tsc -p .","prepublishOnly":"npm run build","test":"jest"},"repository":{"type":"git","url":"git+https://github.com/alcadica/alcadica.git"},"license":"MIT","devDependencies":{"@types/jest":"^23.3.3","jest":"^23.6.0","ts-jest":"^23.10.4","typescript":"^3.1.1"},"bugs":{"url":"https://github.com/alcadica/alcadica/issues"},"_id":"@alcadica/contract@1.0.1","_npmVersion":"6.5.0","_nodeVersion":"11.5.0","_npmUser":{"name":"octod","email":"iamoctod@gmail.com"},"dist":{"integrity":"sha512-Eu4PcvXy/xwUbAIDPueo62i88qwU23fmNCg7PNDW8KGUjQrOy0SzmLBWPnIqScHs6RwFFey0bD/gkc4DLwGz1w==","shasum":"9a36d86e56a7ed3a7b5baf53b24b5be4b0bdf39d","tarball":"https://registry.npmjs.org/@alcadica/contract/-/contract-1.0.1.tgz","fileCount":5,"unpackedSize":24068,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcSCvuCRA9TVsSAnZWagAAB1gP/RhmYCyBsrnVhD4dx6hu\nrfs9QtUaWp0/V19WxGT5SDbREUhyt+oLzRZfA4FxY3gZxYOg3RxwJ1YJeYEY\nqd75c0PgV7h8bLG+tcrTBPGGeRxxsJwtk7ZC5uGQE2heE3/NrvDa6E/UXxhV\n8LJmYfSANq0yepU/mB6mYHSdzbIKEUlfxzIcB61LzwViHe/lLjs9MXXhFDps\n6OtdISvU5aBo+d8RMNQ9kWwffajQhoXE1HC8zTHC9g/iA4ItRgbSqK5YmfxT\ncsx0sRXh8Au6/9vq97oMcKQy4+a3PcAlVUL33RypbD8QhqqQzGoMZbabYRpI\ns1U8E8iQ0s/pPXN1rOFGdk4C+CIMPLp3qjyjAPTJmNN5zcNlUM/UNHTh919W\n0A/EgzHsdbhO8mh6Zu2eqxhVO0H6u1ER2Hnj19K6YqJJmFEroHku5mVR951Z\nn8GTq5CUCAD6ihZujoUdC/5z85qll89OIp2l4Yihd//TSwUJ+Fbwnlj63LeY\nrQv+CJmYZURneYv/86di8e0goOzVuWRXrKSon25V/5u8CvPjzKMnYGzewhkn\nbUnd8VX5fD+p4EacSxVGLjDCaBQbStZKbJZ9ypvEmwFGmVUB7PAFvW78INcr\nyxjcJE/MhSrJAGTAZ/1KdaDnlyZX5gRtnjORvQ22bzQhVVSCmRL87N0S8Dl6\n/Jqc\r\n=dws3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCCIaFd2DAQFpsA3eowIYlY6LTlXp3GTo5WCbLFiy5f3QIgHSDYmdSjY8lnZmofj54OBiRicj2c11J4KuI6aFUBekk="}]},"maintainers":[{"name":"npm-alcadica","email":"npm@alcadica.com"},{"name":"octod","email":"iamoctod@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/contract_1.0.1_1548233709996_0.10737430157054217"},"_hasShrinkwrap":false}},"time":{"created":"2019-01-10T12:41:46.129Z","1.0.0":"2019-01-10T12:41:46.355Z","modified":"2022-04-04T12:35:35.837Z","1.0.1":"2019-01-23T08:55:10.074Z"},"maintainers":[{"name":"npm-alcadica","email":"npm@alcadica.com"},{"name":"octod","email":"iamoctod@gmail.com"}],"description":"Data contracts for data validation","homepage":"http://www.alcadica.com","keywords":["contracts","data contracts","data validation","validation"],"repository":{"type":"git","url":"git+https://github.com/alcadica/alcadica.git"},"author":{"name":"alcadica","email":"npm@alcadica.com"},"bugs":{"url":"https://github.com/alcadica/alcadica/issues"},"license":"MIT","readme":"# @alcadica/contract\n\n<a href=\"https://travis-ci.org/alcadica/alcadica\">\n  <img src=\"https://img.shields.io/travis/alcadica/alcadica.svg?colorB=555555&style=for-the-badge\" />\n</a>\n<a href=\"https://github.com/alcadica/alcadica/issues\">\n  <img src=\"https://img.shields.io/github/issues/alcadica/alcadica.svg?colorB=555555&style=for-the-badge\" />\n</a>\n<a href=\"https://codecov.io/gh/alcadica/alcadica\">\n  <img src=\"https://img.shields.io/codecov/c/github/alcadica/alcadica.svg?colorB=555555&style=for-the-badge\" alt=\"Coverage\" />\n<a href=\"https://beerpay.io/alcadica/alcadica\">\n  <img src=\"https://img.shields.io/beerpay/alcadica/alcadica.svg?colorB=555555&style=for-the-badge\" />\n</a>\n<a href=\"https://codeclimate.com/github/alcadica/alcadica\">\n  <img src=\"https://img.shields.io/codeclimate/maintainability/alcadica/alcadica.svg?colorB=555555&style=for-the-badge\" alt=\"Maintainability\">\n</a>\n\n- [@alcadica/contract](#alcadicacontract)\n  - [Install](#install)\n  - [Examples](#examples)\n  - [Licence](#licence)\n\n## Install\n\n```bash\nnpm i --save @alcadica/contract\n```\n\nThis package provides a simple but powerful way to estabilish a contract between a datasource and an entity. A contract is used to handle data channeling between a caller (application layer) and an owner (data layer, contract provider).\n\n## Examples\n\n```ts\nimport contract from '@alcadica/contract';\n\nclass MyEntity {\n  public foo: string = '';\n}\n\nlet instance = new MyEntity();\n\nlet MyEntityContract = contract.createFromInstance(instance);\n\nMyEntityContract.validators.foo.validate = entity => entity.foo.length > 0;\n\nconsole.log(MyEntityContract.valid) // outputs false\n\ninstance.foo = '123';\n\nconsole.log(MyEntityContract.valid) // outputs true\n\nlet newinstance = new MyEntity();\n\nMyEntityContract.entity = newinstance;\n\nconsole.log(MyEntityContract.valid) // outputs false\n```\n\nCreating a custom validator\n\n```typescript\nimport contract from '@alcadica/contract';\n\nclass Test {\n  public constructor (\n    public bar: string,\n    public foo: number\n  ) {};\n}\n\nconst testContract = contract.createFromClass(Test, 'hello', 100);\n\ntestContract.entity.foo.validate = () => {\n  return (value: string) => {\n    return contract.createValidatorOutput(value.length > 5, 'foo length must be greater than 5');\n  }\n}\n```\n\nUsing in express.js for input data validation\n\n```typescript\nimport Contract from '@alcadica/contract';\nimport * as express from 'express';\n\nconst route = express.Route();\nconst contract = Contract.create(['bar', 'foo']);\n\n// we assume that the server will receive a json like this\n// { \"foo\": \"hello world\", \"bar\": 123 }\n\ncontract.validators.bar.validator = (value: number) => value && value > 3 && value < 6;\ncontract.validators.foo.validator = (value: string) => value && value.length > 3;\n\nroute.post('/resource', (request, response) => {\n  contract.entity = request.body;\n\n  if (contract.valid) {\n    response.status(200).json(contract);\n  } else {\n    response.status(400).json(contract);\n  }\n});\n```\n\nUsing react form\n\n```tsx\nimport Contract from '@alcadica/contract';\nimport React from 'react';\n\ninterface IState {\n  name: string;\n  email: string;\n}\n\nconst getInitialState: () => IState = () => ({\n  name: '',\n  email: '',\n});\n\nexport default class MyForm extends React.Component<{}, IState> {\n  public contract = Contract.createFromInstance(getInitialState());\n  public state = getInitialState();\n\n  public componentDidMount() {\n    this.contract.validators.name.validator = (value: string) => value.length >= 3;\n    this.contract.validators.name.validator = (email: string) => /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(value);\n  }\n\n  public createChangeListener(name: keyof IState) {\n    return (event: React.ChangeEvent<HTMLInputElement>) => {\n      this.contract.entity[name] = event.target.value;\n      this.setState({ [name]: event.target.value });\n    }\n  }\n\n  public render() {\n    \n    return (\n      <form>\n        <fieldset>\n          <label>Name</label>\n          <input onChange={ this.createChangeListener('name') } type=\"text\" />\n        </fieldset>\n        <fieldset>  \n          <label>Email</label>\n          <input onChange={ this.createChangeListener('email') } type=\"text\" />\n        </fieldset>\n        <div hidden={this.contract.valid}>\n          Invalid fields are {this.contract.invalidKeys}\n        </div>\n      </form> \n    )\n  }\n}\n```\n\n## Licence\n\n[MIT](LICENCE)\n\n","readmeFilename":"README.md"}