{"_id":"@ao-framework/gates","_rev":"3-03012cd6ec7bdf557e9eeb92c76eeee5","name":"@ao-framework/gates","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"@ao-framework/gates","version":"0.0.1","description":"Conditional logic","main":"dist/src/index.js","types":"dist/src/index.d.ts","directories":{"test":"test"},"scripts":{"test":"ao-acumen main","test:dev":"ao-acumen dev","dev":"tsc --watch","preversion":"npm test","postversion":"git push --tags"},"repository":{"type":"git","url":"git+https://github.com/ao-framework/gates.git"},"keywords":["conditional","logic"],"author":{"name":"Josh Miller"},"license":"MIT","bugs":{"url":"https://github.com/ao-framework/gates/issues"},"homepage":"https://github.com/ao-framework/gates#readme","devDependencies":{"@ao-framework/acumen":"^0.0.3","@types/node":"^13.1.2","typescript":"^3.7.4"},"gitHead":"4f5e50aa8be3479254da082b00277b0b5e84a4c6","_id":"@ao-framework/gates@0.0.1","_npmVersion":"6.4.1","_nodeVersion":"10.15.0","_npmUser":{"name":"josh-josh-miller","email":"wickedhillsmedia@gmail.com"},"dist":{"integrity":"sha512-Ui5ZdIiZi6q/vZbAWxPBjPAVTdBaN+nASf/SdngHd0kvMyFaHPnuNdI86q2Ntt4D/4oouASsz6xPNpz3tj22cA==","shasum":"dcb56a423f036058b448be88c477a2d6640ac353","tarball":"https://registry.npmjs.org/@ao-framework/gates/-/gates-0.0.1.tgz","fileCount":89,"unpackedSize":468905,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeDu9LCRA9TVsSAnZWagAAiTwP/RUEhJAML1HpqztJxwNW\nzKlQ3Bcum3nWERrxjwtCm/S3OTSt081xZEIBEQfZPtpsUmZyls81VlPqXFHw\nEcj+YR+bm7faIe2RYYLJPsYxfFAxh+pCJoPKucxkzGnKASCWHD7NXntGcjhh\ne4Z7ML/cSIIcLxkjXB+DHx9YqAjeLz3qtzzqsJAXUM8St0vEVdJAHqQeTNuE\nWX+xk0kT67vNt46JUEsdYfU4PYVY4E2lXBCv69T9sTROGYRMfiJhlrOaQ+DC\nmN+Krqacpg5p4tBDM20AqGbbRbJvBuwlvdNyULo49FfLkmq3FzZ2aAEVmvl7\n1ljDnZmmRvI3NtqWMEcJHysVkB6XPsKVyCwIOYzcUVpF4DuSgaWXNGBtKGLL\nWHKqNzYZgt9MsE+l7B1jNgaE+U8Aao7dD4kGAS3/99QIvn6/+45h7o6qQoRV\nUe6WOQnqmWQ/KckRBKyMAMAVqEkBiTmxm3l/judaaPlzU8liocVDMQpXmLVk\n71kmSnrFFndvkG0wU7aUerOcY5zjHgojY9dfCjoOXyEJjJqvL9YuMClMA3bD\n3SP8uIKMl2fCYxIiygDWDylF6L4GljjF9yLfhehewhYpdz2iYLmYBP5iL3u/\nGFCcTq5UhjixJkCTfcCtK64VfKN0XsV3CIIV7Q4SuneLgxs1iJLwvv5SUIJI\nSCpl\r\n=4Edp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEYVGbbHedQnlTq9bBfp7b2XqBrAVGNuYY0hg8c6Qqa9AiB+9wlHEo2OCki7udab8W5ceCmsUzoJTKPy7mTHK0UVHw=="}]},"maintainers":[{"name":"josh-josh-miller","email":"wickedhillsmedia@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gates_0.0.1_1578037067031_0.17294886986981206"},"_hasShrinkwrap":false},"0.0.2":{"name":"@ao-framework/gates","version":"0.0.2","description":"Conditional logic","main":"dist/src/index.js","types":"dist/src/index.d.ts","directories":{"test":"test"},"scripts":{"test":"ao-acumen main","test:dev":"ao-acumen dev","dev":"tsc --watch","preversion":"npm test","postversion":"git push --tags"},"repository":{"type":"git","url":"git+https://github.com/ao-framework/gates.git"},"keywords":["conditional","logic"],"author":{"name":"Josh Miller"},"license":"MIT","bugs":{"url":"https://github.com/ao-framework/gates/issues"},"homepage":"https://github.com/ao-framework/gates#readme","devDependencies":{"@ao-framework/acumen":"^0.0.3","@types/node":"^13.1.2","typescript":"^3.7.4"},"gitHead":"7ddc4278d012e5b32cc603ffba86d41a32f7be39","_id":"@ao-framework/gates@0.0.2","_npmVersion":"6.4.1","_nodeVersion":"10.15.0","_npmUser":{"name":"josh-josh-miller","email":"wickedhillsmedia@gmail.com"},"dist":{"integrity":"sha512-YOxcosG3KNN4K9tIKc2PuSgBSxnUvQyYvlzWu3zik9IKTAy8erkx1t3nlctT8Ou3za7eiAAI9aDIxNshyhvFUg==","shasum":"1ac991c473f0a9c60d07b1f5813622472a05c7f7","tarball":"https://registry.npmjs.org/@ao-framework/gates/-/gates-0.0.2.tgz","fileCount":89,"unpackedSize":476472,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeEDGOCRA9TVsSAnZWagAADQsP/0Tx22vbVl9Bh7tO2VeI\nOtX9u+qgz5u5JaHNkup11NT2jdqmoOlagG8s4qQhG11zBbYm02ZYWQjvQIu3\ngNglymAMKrAik1xq36qxrYxy3phBOXCzO4RTzOWQWy45YMUJ5hvOx/YW5ViA\nh4SZctx4IW2FNtaP6EP8PkpNc436e82RxplTatgylq9la6bWOicQ+yHDeHF4\nGECc6aLUfpR+j0dUW28l4Q3j67YxbJcBnO7bFTnFWnUMUu9TbCCI66bt6Zl4\nfVwOOqvb4tI43hyPaBdGuUlYMBU2xx9aF8BUJkC6PcuVg6QN7uWMSWsHtWre\n2MTkjanv3i9BoJI8ZZu/5fz81jma/oN1Jc/AB/zMHwCI3UTqEF9Q1Dwg6ODF\nWH5/X74RNVRWwoaBo77c9OmIJu6u/OeWbUOXs8zhMKzWSjBQfqHj2a4CG2e4\ncYCGVZjRLbysRFdWQhsxR70XKuVjqFoTGT9yO/s4BTih7auQZPy0hWwcoSho\nZniFN7BHPmHxPfGi2M5lfD7u4X2ias+ydQn0Y6mxP7dztt1N3YrHHnnLFjCU\n6c6GEtAdTwiuDeZSOnjbMifwe/k1vBXRxRMwWc9F40wUK196Yk+C65N+jC33\n6hp8UlZHo4E43koz6N/htGg/cbz+7rTfX062Mm7RgEjGXbFRXDrnXCYKmKAx\nhQlm\r\n=yqTk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA5JYSIYG6wiJx8WfncmLo5KHlxZKHVg5Ogq7RjBERD7AiBCB1m/yZkldyBiUt6d5RwlEMJAh0FbLKoIVzVsDyW1eA=="}]},"maintainers":[{"name":"josh-josh-miller","email":"wickedhillsmedia@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gates_0.0.2_1578119565782_0.7652858255181747"},"_hasShrinkwrap":false},"0.0.3":{"name":"@ao-framework/gates","version":"0.0.3","description":"Conditional logic","main":"dist/src/index.js","types":"dist/src/index.d.ts","directories":{"test":"test"},"scripts":{"test":"ao-acumen main","test:dev":"ao-acumen dev","dev":"tsc --watch","preversion":"npm test","postversion":"git push --tags"},"repository":{"type":"git","url":"git+https://github.com/ao-framework/gates.git"},"keywords":["conditional","logic"],"author":{"name":"Josh Miller"},"license":"MIT","bugs":{"url":"https://github.com/ao-framework/gates/issues"},"homepage":"https://github.com/ao-framework/gates#readme","devDependencies":{"@ao-framework/acumen":"^0.0.3","@types/node":"^13.1.2","typescript":"^3.7.4"},"dependencies":{"tslib":"^1.10.0"},"gitHead":"a4a2b190383aa614ddbcd11b9d6751f62245fe27","_id":"@ao-framework/gates@0.0.3","_npmVersion":"6.4.1","_nodeVersion":"10.15.0","_npmUser":{"name":"josh-josh-miller","email":"wickedhillsmedia@gmail.com"},"dist":{"integrity":"sha512-X2Vln/qY2Itghb6c7tWfragDGFsKL7TafejyjOLYM4LQqm5rCVLJEypIKm/fSZxWYawr3yDj7ibAGwKrPk1Pfg==","shasum":"4e11b26c7838804a999afe2b2cd1bb4b7af06d5f","tarball":"https://registry.npmjs.org/@ao-framework/gates/-/gates-0.0.3.tgz","fileCount":89,"unpackedSize":476524,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeEDYRCRA9TVsSAnZWagAA+qIP/jb44Q+TUH8jJfP3f2WW\nV7c7LcSVO99Cd6oPrBi42hdxBWi3AE0atWSIjfG7xr6x8rZ0GU4iaenlTMUr\nuIYBeHz9RUsCJ1TOTY4Duniv7Rp/PxYS0ZqynXWfVwp9wQwkI5A5yWDn8LFV\nS4zNrK5QtIi6GlKh0qk63Lmk68IgwRLeIlgNFACPj7KDqXmAY4BeVyZsqIy/\nfh17TFBAEQDHg5w5D64Dcl5NRdYjARG1ZZ7ks0uWAWpHFktRIv9bVOAP/Dg7\n+zd6IEU0fxbAs/YlCTM/vFzfgNZvI/HaMQpTAGlfsBRNH6nG6kXGiKwu0M8n\nsOkPSX5BwNWXa7A17ZpNMGY6Qz9tAxXY0G+q1NiKiApK4oGMhyRTWBYj39ny\nQ/xUnWmte/NG1DTFQ/ay7DggEXh3OnMYWwploUxc2HiT3rAAZQUBaUHPfdIq\ny12JAl3dLQC46S5ZaOR/qLqM0jPq4oUCN95/CJBDWnPjoFoY2OFXceEEdShy\nZr9m5bb5mpqiCsQSQQOCIs3pBF7Xrc+oMejaibNH7xncar1lTenXSZmaNAq6\n+9LPaj7UFsFdxEoZnI92soYgFx3imitf6i9EAJAS7IWFFoUSGP6LzD6U47b0\nLR8cdgNOwuomta0UUEmdF57+5ER+RXRu0O2Q5V/MAug2QjhyQp8nFXNeLcTH\nMhex\r\n=bSqz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAv2oSoKIYGiJDr+31WptamQjBg5Gt47TfbdkRKfS6K8AiAIQkv9Izsy5kK5txFk7rLure9qmNYMNPZUtCbh43IfJw=="}]},"maintainers":[{"name":"josh-josh-miller","email":"wickedhillsmedia@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gates_0.0.3_1578120720717_0.5862700727484664"},"_hasShrinkwrap":false}},"time":{"created":"2020-01-03T07:37:46.831Z","0.0.1":"2020-01-03T07:37:47.172Z","modified":"2022-04-04T14:28:25.806Z","0.0.2":"2020-01-04T06:32:45.930Z","0.0.3":"2020-01-04T06:52:00.874Z"},"maintainers":[{"name":"josh-josh-miller","email":"wickedhillsmedia@gmail.com"}],"description":"Conditional logic","homepage":"https://github.com/ao-framework/gates#readme","keywords":["conditional","logic"],"repository":{"type":"git","url":"git+https://github.com/ao-framework/gates.git"},"author":{"name":"Josh Miller"},"bugs":{"url":"https://github.com/ao-framework/gates/issues"},"license":"MIT","readme":"<p align=\"center\">\r\n    <img width=\"250\" src=\"https://ao-framework.github.io/assets/readmeHeader.png\">\r\n</p>\r\n<p align=\"center\">\r\n    <b>Gates. To streamline logic.</b>\r\n</p>\r\n<p align=\"center\">\r\n    <em>\r\n        This project is currently in early development. \r\n        Expect erratic behaviour frequently as development happens.\r\n    </em>\r\n</p>\r\n\r\n### What is Gates?\r\nGates is a library with many functions to make writing logic less fatiguing and more stable. The functions are broken into five categories: \r\n- Ensure Functions\r\n- Is Functions\r\n- Returning Functions\r\n- Throwing Functions\r\n- When Functions\r\n\r\n### Installation\r\n```bash\r\nnpm install --save @ao-framework/gates\r\n```\r\n<small><em>Typescript types are included.</em></small>\r\n\r\n### How Do I Import Gates?\r\n```js\r\n// You can import a single function for tree shaking\r\nimport { isFunction } from \"@ao-framework/gates\"\r\n\r\n// You can import everything\r\nimport * as gates from \"@ao-framework/gates\"\r\n\r\n// You can import by using Old Faithful.\r\nconst gates = require(\"@ao-framework/gates\")\r\n```\r\n*************************\r\n<small><em>**A common use case code example is provided below each description for visual code learners.</em></small>\r\n\r\n\r\n### Ensure Functions\r\nThis category is used to ensure that variables are what you think they are.\r\n```ts\r\nimport { ensureObject, ensureFunction } from \"@ao-framework/gates\"\r\n\r\nfunction myLibrary(options: iMyOptions) {\r\n    const defaultOptions = { x: 0, y: 0 }\r\n    const finalOptions = ensureObject(options, defaultOptions, false);\r\n    ensureFunction(finalOptions.loaded)()\r\n}\r\n```\r\n- ensureObject\r\n- ensureArray\r\n- ensureFunction \r\n\r\n\r\n### Is Functions\r\nThis category is used to assert that a variable is a particular type.\r\n```ts\r\nimport { isString, isNumber } from \"@ao-framework/gates\"\r\n\r\nfunction doSomething(v: string | number) {\r\n    if(isString(v)) { /** do something */ }\r\n    if(isNumber(v)) { /** do something */ }\r\n}\r\n```\r\n<small><em>For **Typescript** users, please note that **Type Guards** were used so that intellisense knowledge is maintained.</em></small>\r\n\r\n- isObjectLike\r\n- isObject\r\n- isString\r\n- isStringWithLength\r\n- isFunction\r\n- isBoolean\r\n- isNumber\r\n- isArray\r\n- isUndefined\r\n- isNull\r\n- isNill\r\n- isBigInt\r\n- isSymbol\r\n- constructedFrom\r\n\r\n#### Is Functions include the negations\r\n- isNotObjectLike\r\n- isNotObject\r\n- isNotString\r\n- isNotStringWithLength\r\n- isNotFunction\r\n- isNotBoolean\r\n- isNotNumber\r\n- isNotArray\r\n- isNotUndefined\r\n- isNotNull\r\n- isNotNill\r\n- isNotBigInt\r\n- isNotSymbol\r\n\r\n### Returning Functions\r\nThis category is used to make sure that you have either the correct type assigned or nothing at all.\r\n```ts\r\nimport { returnStringWithLengthOrNothing } from \"@ao-framework/gates\"\r\n\r\nfunction createUser(data: iCreateUserRequest) {\r\n    const user = new User();\r\n    user.name = returnStringWithLengthOrNothing(data.name);\r\n    user.email = returnStringWithLengthOrNothing(data.email);\r\n}\r\n```\r\n\r\n- returnObjectLikeOrNothing\r\n- returnObjectOrNothing\r\n- returnStringOrNothing\r\n- returnStringWithLengthOrNothing\r\n- returnFunctionOrNothing\r\n- returnBooleanOrNothing\r\n- returnNumberOrNothing\r\n- returnArrayOrNothing\r\n- returnNullOrNothing\r\n- returnBigIntOrNothing\r\n- returnSymbolOrNothing\r\n\r\n### Throwing Functions\r\nThis category is used to streamline throwing exceptions when variables are not needed types.\r\n```ts\r\nimport { throwWhenNotObject, throwWhenNotStringWithLength } from \"@ao-framework/gates\"\r\n\r\nfunction validateUser(user: User) {\r\n    throwWhenNotObject(user, \"User object was not created\", SystemException)\r\n    throwWhenNotStringWithLength(user.name, \"User must have a name\", BadInputException)\r\n    throwWhenNotStringWithLength(user.email, \"User must have an email\", BadInputException)\r\n}\r\n```\r\n\r\n- throwException\r\n- throwWhenObjectLike\r\n- throwWhenObject\r\n- throwWhenString\r\n- throwWhenStringWithLength\r\n- throwWhenFunction\r\n- throwWhenBoolean\r\n- throwWhenNumber\r\n- throwWhenArray\r\n- throwWhenUndefined\r\n- throwWhenNull\r\n- throwWhenNill\r\n- throwWhenBigInt\r\n- throwWhenSymbol\r\n\r\n#### Throwing Functions include the negations\r\n- throwWhenNotObjectLike\r\n- throwWhenNotObject\r\n- throwWhenNotString\r\n- throwWhenNotStringWithLength\r\n- throwWhenNotFunction\r\n- throwWhenNotBoolean\r\n- throwWhenNotNumber\r\n- throwWhenNotArray\r\n- throwWhenNotUndefined\r\n- throwWhenNotNull\r\n- throwWhenNotNill\r\n- throwWhenNotBigInt\r\n- throwWhenNotSymbol\r\n\r\n### When Functions\r\nThis category is used to be a short replacement for if statements.\r\n```ts\r\nimport { when, whenString } from \"@ao-framework/gates\"\r\n\r\nwhen(something === true)(fnThatCanBeCalled)\r\nwhenString(nameOfUser)(fnThatCanBeCalledExpectingString);\r\n```\r\n\r\n- when\r\n- whenObjectLike\r\n- whenObject\r\n- whenString\r\n- whenStringWithLength\r\n- whenFunction\r\n- whenBoolean\r\n- whenNumber\r\n- whenArray\r\n- whenUndefined\r\n- whenNull\r\n- whenNill\r\n- whenBigInt\r\n- whenSymbol\r\n\r\n#### When Functions include the negations\r\n- whenNotObjectLike\r\n- whenNotObject\r\n- whenNotString\r\n- whenNotStringWithLength\r\n- whenNotFunction\r\n- whenNotBoolean\r\n- whenNotNumber\r\n- whenNotArray\r\n- whenNotUndefined\r\n- whenNotNull\r\n- whenNotNill\r\n- whenNotBigInt\r\n- whenNotSymbol\r\n\r\n\r\n### At the End of the Day\r\n\r\nYou can turn something like this...\r\n```ts\r\nimport { cleanString } from \"./commons\"\r\n\r\nfunction createPost(request: iPostRequest) {\r\n\r\n    // validation & construction are together\r\n    // and not easily refactorable.\r\n\r\n    if(typeof request === \"object\" && request !== null) {\r\n         const post = new Post();\r\n        if(typeof request.title === \"string\") { \r\n            post.title = cleanString(request.title)\r\n        } else { \r\n            throw new Error(\"Post title must be a string\") \r\n        }\r\n        if(typeof request.content === \"string\") { \r\n            post.content = cleanString(request.content) \r\n        } else { \r\n            throw new Error(\"Post content must be a string\") \r\n        }\r\n        if(Array.isArray(request.tags)) {\r\n            request.tags.forEach(tag => {\r\n                if(typeof tag !== \"string\") {\r\n                    throw new Error(\"Post tag must be a string\")\r\n                }\r\n            })\r\n        } else {\r\n            throw new Error(\"Post tags must be an array\")\r\n        }\r\n        return post;\r\n    } else {\r\n        throw new Error(\"Post request data is corrupt\")\r\n    }\r\n}\r\n```\r\n\r\nTo something more refactorable...\r\n```ts\r\nimport { cleanString } from \"./commons\"\r\n\r\nfunction createPost(request: iPostRequest) {\r\n\r\n    // validation -> easily refactorable\r\n\r\n    assert(typeof request === \"object\" && request !== null, \r\n        \"Post request data is corrupt\")\r\n\r\n    assert(typeof request.title === \"string\", \r\n        \"Post title must be a string\")\r\n    \r\n    assert(typeof request.content === \"string\", \r\n        \"Post content must be a string\")\r\n    \r\n    assert(Array.isArray(request.tags), \r\n        \"Post tags must be an array\")\r\n    \r\n    request.tags.forEach(tag => \r\n        assert(typeof tag === \"string\", \r\n            \"Post tag must be a string\"))\r\n\r\n    // construction -> feeling secure\r\n\r\n    const post = new Post();\r\n    post.title = cleanString(request.title)\r\n    post.content = cleanString(request.content)\r\n    post.tags = request.tags.map(tag => cleanString(tag))\r\n    return post;\r\n}\r\n```\r\nNow something more readable\r\n```ts\r\nimport { cleanString } from \"./commons\"\r\n\r\nfunction createPost(request: iPostRequest) {\r\n    \r\n    // validation -> easily refactorable\r\n\r\n    throwWhenNotObject(request, \"Post request data is corrupt\")\r\n    throwWhenNotString(request.title, \"Post title must be a string\")\r\n    throwWhenNotString(request.content, \"Post content must be a string\")\r\n    throwWhenNotArray(request.tags, \"Post tags must be an array\")\r\n    request.tags.forEach(tag => throwWhenNotString(tag, \"Post tag must be a string\"))\r\n\r\n    // construction -> feeling secure\r\n\r\n    const post = new Post();\r\n    post.title = cleanString(request.title)\r\n    post.content = cleanString(request.content)\r\n    post.tags = request.tags.map(tag => cleanString(tag))\r\n    return post;\r\n}\r\n```\r\n","readmeFilename":"README.md"}