{"_id":"@cmcarey/smart-router","_rev":"2-468aa45b20432f039e21ef6c7a9e6cc4","name":"@cmcarey/smart-router","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@cmcarey/smart-router","version":"1.0.0","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"Chance Carey","email":"chance@carey.sh"},"license":"MIT","scripts":{"build":"tsc","test":"jest","test:dev":"jest --watch","test:coverage":"jest --coverage"},"dependencies":{"express":"^4.17.1","joi":"^17.3.0","ts-results":"^3.0.0"},"devDependencies":{"@types/express":"^4.17.9","@types/supertest":"^2.0.10","jest":"^26.6.3","supertest":"^6.0.1","ts-jest":"^26.4.4","typescript":"^4.1.3"},"_id":"@cmcarey/smart-router@1.0.0","dist":{"shasum":"06bf0dc64860af58173a526b0ff6db004db04d0e","integrity":"sha512-LjeK+0r43+9UjCNkn3dOMqOZSl2lbspRW9QTGFsnr5wuXDaEUsZK2gifRKAfSBiMr5KUHQJzDKV7DgzNvVCSrg==","tarball":"https://registry.npmjs.org/@cmcarey/smart-router/-/smart-router-1.0.0.tgz","fileCount":11,"unpackedSize":11530,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf7hfECRA9TVsSAnZWagAAm3oP/1UDvZwg8P7rtimH9Sye\nP30hyU3vX1h2Ij/C8ucWCWZuk0UKp386V/ErIeMnAR2ObcYAKGSgYxq6u/Qb\nDHnOQdmfPccpS6hrMDbH/k8dcR6081Sg732hyllbuTHbcKtaI+0UaXhmbrtI\np06Jg1Zj38O6pSJz/Ld4g0FcbSnRybgvmGeUhQVqZylU41b0Eab8AoGJ+bf+\nXSDyDCg4cQsf489gPjINAMO081J0jSyHvnd9y0eoZ2DVsu84/Att3ArZ2pdF\neUYwBIoF7Ce71aAPzP4NZkeSBnFz+e+CU+SgOaWhepZFnq/uQsDtHRXrBnju\nigsugEM6VDSNuYry2+bmhpNtT6HY/LtxebUpRN+TNJnTvUQEkDoD/tWDtKdj\nVtKF1nyJvB578TIlGhfWDJGhzWbwvdVmqdtxYhLiqaP3iZmNBGR3Pz48vnwL\nBP/MibkBQ7Z5mfxpKEI9buJdxitfTy2F5vIX5/q/TVu43zWAM/ta3C6p7iIR\nyRQca1x77+GHNtoMFqC54xv6NLTYe60QD+eUZZtHEKyv0CpzjcCO7lDBvayg\nas6c/FZNCGe2oTPZSCG2pGkpZ27uReUjYhPdqZAgJI2cFfRFDg9ZV3Gl86BH\nxGaUBIh3eY3TG/iu0PyB8HAGC4/0eqog6/sU7/ghEVgz69grDsNfiCBZsUgP\n+b+/\r\n=3efJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDQuGGQrXJsP437PV827vDvCI7cpv83aslzn7SnmhS1EwIgYWKIczrDa347NIzXXWpBjSm7lPIDxB5CVzlnkJ1VEJ4="}]},"_npmUser":{"name":"cmcarey","email":"chance@carey.sh"},"directories":{},"maintainers":[{"name":"cmcarey","email":"chance@carey.sh"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/smart-router_1.0.0_1609439171968_0.7430859841065951"},"_hasShrinkwrap":false},"1.0.1":{"name":"@cmcarey/smart-router","version":"1.0.1","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"Chance Carey","email":"chance@carey.sh"},"license":"MIT","repository":{"type":"git","url":"https://github.com/cmcarey/smart-router.git"},"scripts":{"build":"tsc","test":"jest","test:dev":"jest --watch","test:coverage":"jest --coverage"},"dependencies":{"express":"^4.17.1","joi":"^17.3.0","ts-results":"^3.0.0"},"devDependencies":{"@types/express":"^4.17.9","@types/supertest":"^2.0.10","jest":"^26.6.3","supertest":"^6.0.1","ts-jest":"^26.4.4","typescript":"^4.1.3"},"description":"```js const stub: RouteStub = { in_schema: { type: \"object\", values: { str: { type: \"string\" } } }, out_schema: { type: \"object\", values: { str: { type: \"string\" } } }, handler: async ({ body }) => { if (body.str === \"good\") return Ok({ str: \"okay\" }); el","_id":"@cmcarey/smart-router@1.0.1","dist":{"shasum":"da337fe9f15825f19c2ed0b6733c85d276aece78","integrity":"sha512-p61zVqkBuAIuz9GjcnlrrlkpWldXVMyMot7jHLTUi5u28HoEicDw6rtXVoyTs84IZQdGdgdP2Rq1dTcvwdtYpQ==","tarball":"https://registry.npmjs.org/@cmcarey/smart-router/-/smart-router-1.0.1.tgz","fileCount":12,"unpackedSize":13308,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf7h4wCRA9TVsSAnZWagAAbIcP/RQr91W4z+4/3oXdKX4v\nibkOIDiJHqAOvqlQbRiwJPl+4v5L4vhaM2aQZTOZJBHg2tTJzJmZVjpmebdz\nLR2yR3d4m0MNKLxXdMaMNDilF14/ydDF7/aPcyWA+FtcAzHKxo7hUhNFBizO\nD5A3wrx0OUvaLEP5bFxj5yyFHdpYuAXifCqrxadpurC6eFRd6SzN5OGR56/K\n8pr3b+u3gykoWYo87bhPADqqsMq3QnhT7vfiHTX4veKaWd+j3vu9RBcpsvkk\nh8uGf5DyGQK1XVSiUR4Fz72T211r9EW1jyjg9PIyMRrcRpFhaEuhi8GLnYJ9\n25xsXAgx7yOlwsWtbp7nWPAcGlZiOxxrkWd3ZarU7pGJ0ShrR7hm3ykoCBVd\nMr38K24CEno+V/W0hZezFwiU01JXG8zZAFZ2k+9Sd7/PqE91Gf12l46861U9\ngcREMCQxPHJSE0korF52Ivi83A0V/eodPVARgL9m1hZHAxbfbJbx6j7C47QO\nse3dM+fcpzSVDgBImw8zto2k0JUS4s3gr7S3Q7xGgFouv/J+ynUmzWA9JjLz\nLSUGzW6diTcJk+InoeIpNUzf+koEBbsVdwVLg8wCOhSpVv2oUs9/utQsZ8E/\nBkOJtfUEMT5rwHbjFTtjOiX1/8rw3V5U2YSXNq2nFHrKHSy/h9I5bt3TVuKp\nS5/e\r\n=nitY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkeKE95Q+ZDCT5hrBPdvO0QQ0wShcFiWpHkAw1XKAY/wIhAKrUtwlVKYca7EDxy3N7xIOkIqSPZtgpIbV3WY1wyrJi"}]},"_npmUser":{"name":"cmcarey","email":"chance@carey.sh"},"directories":{},"maintainers":[{"name":"cmcarey","email":"chance@carey.sh"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/smart-router_1.0.1_1609440816036_0.47053471195215835"},"_hasShrinkwrap":false}},"time":{"created":"2020-12-31T18:26:11.907Z","1.0.0":"2020-12-31T18:26:12.128Z","modified":"2022-04-04T23:43:01.889Z","1.0.1":"2020-12-31T18:53:36.148Z"},"maintainers":[{"name":"cmcarey","email":"chance@carey.sh"}],"author":{"name":"Chance Carey","email":"chance@carey.sh"},"license":"MIT","readme":"<h1 align=\"center\">smart-router</h1>\n\nRouting, schema verification, and handling utilities on top of [Express](http://expressjs.com/).\n\n- 🗺 Extend existing applications using an `express.Router`\n- 🚪 Automatic path prefixing using a route map\n- ✅ Schema validation primitives built using [Joi](https://joi.dev)\n- 📚 Generate API documentation from routes\n- 📑 Fully typed\n\nSchema validation occurs on both input _and_ output, preventing unexpected outputs and allowing for full automatic documentation of both inputs and outputs.\n\n## Example\n\n```js\nconst stub: RouteStub = {\n  in_schema: { type: \"object\", values: { str: { type: \"string\" } } },\n  out_schema: { type: \"object\", values: { str: { type: \"string\" } } },\n  handler: async ({ body }) => {\n    if (body.str === \"good\") return Ok({ str: \"okay\" });\n    else return Err(\"not okay\");\n  },\n};\n\nconst apiRoutes: Route[] = [{ path: \"/get\", method: \"post\", stub }];\n\nconst routeMap: RouteMap = [[\"/api\", apiRoutes]];\nconst routes = compileRouteMap(routeMap);\n```\n\n## Applying the router\n\n```js\nconst server = express();\nconst router = express.Router();\ncompileRouter(router, routes);\nserver.use(router);\n```\n\n## Generating API documentation\n\n```js\nexportRoutes(routes);\n```\n\n```js\n[\n  {\n    path: \"/api/get\",\n    method: \"post\",\n    in_schema: { type: \"object\", values: { str: { type: \"string\" } } },\n    out_schema: { type: \"object\", values: { str: { type: \"string\" } } },\n  },\n];\n```\n\n## Schema validation\n\n```js\n{\n  type: \"object\",\n  values: {\n    email: { type: \"string\", subType: \"email\" },\n    minMax: { type: \"string\", min: 5, max: 50, optional: true },\n    els: { type: \"array\", elementType: { type: \"string\" } },\n  },\n}\n```\n","readmeFilename":"readme.md","description":"```js const stub: RouteStub = { in_schema: { type: \"object\", values: { str: { type: \"string\" } } }, out_schema: { type: \"object\", values: { str: { type: \"string\" } } }, handler: async ({ body }) => { if (body.str === \"good\") return Ok({ str: \"okay\" }); el","repository":{"type":"git","url":"https://github.com/cmcarey/smart-router.git"}}