{"_id":"easy-stack","_rev":"9-21252529a0d53b861a9077d876c2d901","name":"easy-stack","dist-tags":{"latest":"2.1.1"},"versions":{"1.0.0":{"name":"easy-stack","version":"1.0.0","keywords":["stack","node","js","auto","run","execute","browser","react"],"author":{"name":"Brandon Nozaki Miller"},"license":"DBAD","_id":"easy-stack@1.0.0","maintainers":[{"name":"riaevangelist","email":"brandon@diginow.it"}],"homepage":"https://github.com/RIAEvangelist/easy-stack#readme","bugs":{"url":"https://github.com/RIAEvangelist/easy-stack/issues"},"dist":{"shasum":"12c91b3085a37f0baa336e9486eac4bf94e3e788","tarball":"https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.0.tgz","integrity":"sha512-NBSaRoxVKlAztEnJUaXNDvdjU8xMqdvLk8opj/s599loYxjdc9pmGMxN9vMgffcupEUlaIRyYJ6jmxhYm0sPjg==","signatures":[{"sig":"MEYCIQCsSiuqoqY8l/lUYjbMx2e6GDsi71THK3n5FPYo466m4QIhAJnyUIKfp5w/z79uHm//Sg4tUmRs3csZ8S52BgfMvufU","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"stack.js","_from":".","_shasum":"12c91b3085a37f0baa336e9486eac4bf94e3e788","engines":{"node":">=6.0.0"},"gitHead":"88baaf113ead5a94a4b06c3c8b30244c2f286041","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"riaevangelist","email":"brandon@diginow.it"},"repository":{"url":"git+https://github.com/RIAEvangelist/easy-stack.git","type":"git"},"_npmVersion":"3.5.2","description":"Simple JS stack with auto run for node and browsers","directories":{},"_nodeVersion":"4.2.6","_npmOperationalInternal":{"tmp":"tmp/easy-stack-1.0.0.tgz_1482203212486_0.018312066327780485","host":"packages-12-west.internal.npmjs.com"}},"1.0.1":{"name":"easy-stack","version":"1.0.1","keywords":["stack","node","js","auto","run","execute","browser","react"],"author":{"name":"Brandon Nozaki Miller"},"license":"MIT","_id":"easy-stack@1.0.1","maintainers":[{"name":"riaevangelist","email":"brandon@diginow.it"}],"homepage":"https://github.com/RIAEvangelist/easy-stack#readme","bugs":{"url":"https://github.com/RIAEvangelist/easy-stack/issues"},"dist":{"shasum":"8afe4264626988cabb11f3c704ccd0c835411066","tarball":"https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz","fileCount":6,"integrity":"sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==","signatures":[{"sig":"MEQCICADvzpvbLZC76w5x2RGbMcUN5BM0BXpLN1YU3ugCyy5AiAOT2n9gE/gDa0tDlWruMv6AmyEw1NgVft/4WmaGYSOVA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13123,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfrFLUCRA9TVsSAnZWagAAfEkP/iHpIvxhwlB3deOuZEaQ\nddj2j5XElwUxZ//IuQLbhWX44gAa5lMTcXVi4Nne7YmAeHY3373h2WjNvgms\n76NTSaRH+QUzyF+fr1ly2jPQ71WkLmwLmbWdBF46Vr8/nm6GNjks1zujduTp\nRHwKo5W3SRaDSiILGQstB2TU9ldFOiCDwEOlspaSjILxWh06yYiCMnoiUiE3\nMhHY2x+LyJxTpGt53Gh4Vr/w1xUDs6xfPAHMTt/b30UsNJ2VaK+zArPmWq2c\nD8jXyuIaO+SRmPqylF2xwWDgUY6qeDACvyVVBPsAl/K11kDoLRwkCjEnt4Cl\n5lF82hQ6CO5+Ld2JvIAGhiqASVny2Nw5z2xbLLS+7drzO0LcPxGGl/zD67yO\nP/vMZ3zHWtukjlYK5gNJEZhWsquQfkFnneqN3JUuEHa9HBrD23iiVbdGY5bd\na+LChOA3ur/XaHneWf0JU17/EGSLGtswRJBm+AAB/Ua+VfmEIK03dK9WQUJ/\n5d/3y5+JPoMKzKx9BP7ZE43HKI6X/4E4ed/JQEXa9kLEB9kRz3x6qcjfTasV\n9becJxnrLuVAteDJKS+Axc8zdNsjIADiQqDyAyiIn7p48wDCJM/jL2crFPt5\nw0BU2pbd4mW8pCmjS6s3ebpKtvX6cVRxWdw2aNyK4qKqeUt0ZSW1RPhHVB+o\n/fzs\r\n=YXDK\r\n-----END PGP SIGNATURE-----\r\n"},"main":"stack.js","engines":{"node":">=6.0.0"},"gitHead":"9c86c104a31f00a91e44c467a13e13232b317085","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"riaevangelist","email":"brandon@diginow.it"},"repository":{"url":"git+https://github.com/RIAEvangelist/easy-stack.git","type":"git"},"_npmVersion":"6.14.8","description":"Simple JS stack with auto run for node and browsers","directories":{},"_nodeVersion":"14.11.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/easy-stack_1.0.1_1605128915996_0.48139750689840444","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"easy-stack","version":"2.0.0","keywords":["stack","lifo","scheduler","priority","javascript","node","browser","zero-dependency"],"author":{"name":"Brandon Nozaki Miller"},"license":"MIT","_id":"easy-stack@2.0.0","maintainers":[{"name":"riaevangelist","email":"brandon@diginow.it"}],"homepage":"https://riaevangelist.github.io/easy-stack/","bugs":{"url":"https://github.com/RIAEvangelist/easy-stack/issues"},"dist":{"shasum":"62eecc80c8726023372e49ebf95d5c5223093ffb","tarball":"https://registry.npmjs.org/easy-stack/-/easy-stack-2.0.0.tgz","fileCount":9,"integrity":"sha512-kr6rWL48jxaM0+n+m3FhtJ5is30WWFo6zu3JY2e4ztbW423/GlVav8Li6b71gmDnAh99zHsagsvAFmJPlIBr0A==","signatures":[{"sig":"MEUCIQCwYbvmyKXTWrThUz+n2MTX/4Kgtj4fvbt0b53SSdcynQIgL/FrRNDE2G3IjA5Isr7ACK3KEfrEQpQxUXsE9GRbob0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDjvazEBCiuX01GB6caajdiHgO85V7u4L3emXMeM2RZOQIgfBFhqqJ2gsmWQEsq2ZWbtF3UpLojxTcu3u5arN8dzcU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21905},"main":"./stack.cjs","type":"module","module":"./stack.js","browser":"./stack.js","engines":{"node":">=12.22.0"},"exports":{".":{"import":"./stack.js","default":"./stack.js","require":"./stack.cjs"},"./es5.js":{"import":"./stack.js","default":"./es5.js","require":"./stack.cjs"},"./stack.js":{"import":"./stack.js","default":"./stack.js","require":"./stack.cjs"},"./package.json":"./package.json","./stack-vanilla.js":"./stack-vanilla.js"},"gitHead":"9bb6148b2934d9885bfc48199c02d121a7e25afd","scripts":{"test":"node ./scripts/test.js","check":"npm test && npm run coverage:node","start":"node ./scripts/serve.js","coverage":"vanilla-test coverage","test:core":"node ./scripts/test.js core","test:docs":"node ./scripts/test.js docs","test:legacy":"node ./scripts/test.js legacy","test:server":"node ./scripts/test.js server","test:package":"node ./scripts/test.js package","coverage:node":"vanilla-test coverage node","coverage:chrome":"vanilla-test coverage chrome"},"_npmUser":{"name":"riaevangelist","email":"brandon@diginow.it"},"repository":{"url":"git+https://github.com/RIAEvangelist/easy-stack.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency cooperative LIFO execution for Node.js and browsers","directories":{},"sideEffects":["./stack-vanilla.js","./es5.js"],"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"vanilla-test":"2.1.1"},"_npmOperationalInternal":{"tmp":"tmp/easy-stack_2.0.0_1786898324496_0.8603195567343063","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"easy-stack","version":"2.1.0","keywords":["stack","lifo","scheduler","priority","javascript","node","browser","zero-dependency"],"author":{"name":"Brandon Nozaki Miller"},"license":"MIT","_id":"easy-stack@2.1.0","maintainers":[{"name":"riaevangelist","email":"brandon@diginow.it"}],"homepage":"https://riaevangelist.github.io/easy-stack/","bugs":{"url":"https://github.com/RIAEvangelist/easy-stack/issues"},"dist":{"shasum":"6d62e91209a71224054fbe46b6fd644ea8c11372","tarball":"https://registry.npmjs.org/easy-stack/-/easy-stack-2.1.0.tgz","fileCount":8,"integrity":"sha512-ZpUD5AJeKhRic1RrajfGKuLl721bCeIpnAj1i7BtlC1XX5Mb52ku3e9pDWryV32yndd28ZyqdVsVcBuI7WY2Iw==","signatures":[{"sig":"MEUCIA2gOWb+qAzWi7Vp41Ox8oI6yBTRnK6FyH104IG7DLTGAiEAkqNbclpXTC7OIgnXfTfA+PxxnABrUTxXIOrVw4gvcBU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDBBDa+jltzL8jLx+QBYCmoDvsKFBSZJVaIPp5Uc5pghAiAzNVNXMRxI0B5P437YqW8IN0E5FCnfIrqcDVL7PgqLJg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23622},"main":"./stack.js","type":"module","module":"./stack.js","browser":"./stack.js","engines":{"node":">=22.13.0"},"exports":{".":{"import":"./stack.js","default":"./stack.js","require":"./stack.js"},"./es5.js":{"import":"./stack.js","default":"./es5.js","require":"./stack.js"},"./stack.js":{"import":"./stack.js","default":"./stack.js","require":"./stack.js"},"./package.json":"./package.json","./stack-vanilla.js":"./stack-vanilla.js"},"gitHead":"d8dd4edf55ada50ed6c60705a50442ff879ce483","scripts":{"test":"node ./scripts/test.js all","check":"npm test && npm run coverage:node","start":"node ./scripts/serve.js","coverage":"vanilla-test coverage","benchmark":"node --expose-gc ./scripts/benchmark.js","test:unit":"node ./scripts/test.js unit","coverage:node":"vanilla-test coverage node","coverage:chrome":"vanilla-test coverage chrome","test:functional":"node ./scripts/test.js functional","test:regression":"node ./scripts/test.js regression","test:integration":"node ./scripts/test.js integration","test:regression:chrome":"node ./scripts/test.js browser"},"_npmUser":{"name":"riaevangelist","email":"brandon@diginow.it"},"repository":{"url":"git+https://github.com/RIAEvangelist/easy-stack.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency cooperative LIFO execution for Node.js and browsers","directories":{},"sideEffects":["./stack-vanilla.js","./es5.js"],"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"vanilla-test":"2.1.1"},"_npmOperationalInternal":{"tmp":"tmp/easy-stack_2.1.0_1787369974478_0.84333360552732","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"_id":"easy-stack@2.1.1","bugs":{"url":"https://github.com/RIAEvangelist/easy-stack/issues"},"dist":{"shasum":"70ab02f95ebce538996052caec669b43b7bda8f5","tarball":"https://registry.npmjs.org/easy-stack/-/easy-stack-2.1.1.tgz","fileCount":8,"integrity":"sha512-8Q59fNZmDbCvEsBgl4qiCpZwDbZFFsD91oSAPtSe+kuiZ7rUREXXbP28AlzYORRNtd3WTQWHK6QIVY9BJAtoOw==","signatures":[{"sig":"MEUCIQDNVfkr/pXnJx9BDEfNWm3ykjsbG8hO7kIcDUNj0RmhkwIgBWcSXoO4eNhYE2FaQ3dmZI871ho4IRJKqQvcAFpNwAA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCph5qxPoHbWJxTyDKbi+GvZo+xeF22Ps6WgcfnY4aEIAIhAIijeB8aew72vJait32rRQfoGakCCDSAJCx+A//UOSRR"}],"unpackedSize":26982},"main":"./stack.js","name":"easy-stack","type":"module","author":{"name":"Brandon Nozaki Miller"},"module":"./stack.js","browser":"./stack.js","engines":{"node":">=22.13.0"},"exports":{".":{"import":"./stack.js","default":"./stack.js","require":"./stack.js"},"./es5.js":{"import":"./stack.js","default":"./es5.js","require":"./stack.js"},"./stack.js":{"import":"./stack.js","default":"./stack.js","require":"./stack.js"},"./package.json":"./package.json","./stack-vanilla.js":"./stack-vanilla.js"},"gitHead":"41bddcced79f692007f52189db806983d3965934","license":"MIT","scripts":{"test":"node ./scripts/test.js all","check":"npm test && npm run coverage:node","start":"node ./scripts/serve.js","coverage":"vanilla-test coverage","benchmark":"node --expose-gc ./scripts/benchmark.js","test:unit":"node ./scripts/test.js unit","coverage:node":"vanilla-test coverage node","coverage:chrome":"vanilla-test coverage chrome","test:behavioral":"node ./scripts/test.js behavioral","test:functional":"node ./scripts/test.js functional","test:regression":"node ./scripts/test.js regression","test:integration":"node ./scripts/test.js integration","test:browser-contract":"node ./scripts/verify-browser-contract.js .","test:behavioral:chrome":"node ./scripts/test.js behavioral-browser","test:regression:chrome":"node ./scripts/test.js browser","test:coverage-inventory":"node ./scripts/verify-coverage-inventory.js"},"version":"2.1.1","_npmUser":{"name":"riaevangelist","email":"brandon@diginow.it"},"homepage":"https://riaevangelist.github.io/easy-stack/","keywords":["stack","lifo","scheduler","priority","javascript","node","browser","zero-dependency"],"repository":{"url":"git+https://github.com/RIAEvangelist/easy-stack.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency cooperative LIFO execution for Node.js and browsers","directories":{},"maintainers":[{"name":"riaevangelist","email":"brandon@diginow.it"}],"sideEffects":["./stack-vanilla.js","./es5.js"],"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"vanilla-test":"2.1.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/easy-stack_2.1.1_1787545770328_0.8774023871053216"}}},"time":{"created":"2016-12-20T03:06:52.705Z","modified":"2026-08-24T04:29:30.564Z","1.0.0":"2016-12-20T03:06:52.705Z","1.0.1":"2020-11-11T21:08:36.175Z","2.0.0":"2026-08-16T16:38:44.571Z","2.1.0":"2026-08-22T03:39:34.588Z","2.1.1":"2026-08-24T04:29:30.409Z"},"bugs":{"url":"https://github.com/RIAEvangelist/easy-stack/issues"},"author":{"name":"Brandon Nozaki Miller"},"license":"MIT","homepage":"https://riaevangelist.github.io/easy-stack/","keywords":["stack","lifo","scheduler","priority","javascript","node","browser","zero-dependency"],"repository":{"url":"git+https://github.com/RIAEvangelist/easy-stack.git","type":"git"},"description":"Zero-dependency cooperative LIFO execution for Node.js and browsers","maintainers":[{"name":"riaevangelist","email":"brandon@diginow.it"}],"readme":"[![easy-stack — explicit LIFO flow control for JavaScript](https://raw.githubusercontent.com/RIAEvangelist/easy-stack/main/assets/easy-stack-header.png)](https://riaevangelist.github.io/easy-stack/)\n\n# easy-stack\n\nZero-dependency cooperative LIFO execution for Node.js and browsers.\n\n[Overview](https://riaevangelist.github.io/easy-stack/) · [Why easy-stack](https://riaevangelist.github.io/easy-stack/why/) · [Guide](https://riaevangelist.github.io/easy-stack/guide/) · [API](https://riaevangelist.github.io/easy-stack/api/) · [Patterns](https://riaevangelist.github.io/easy-stack/patterns/) · [Browser](https://riaevangelist.github.io/easy-stack/browser/) · [Examples](https://riaevangelist.github.io/easy-stack/examples/) · [Playground](https://riaevangelist.github.io/easy-stack/playground/) · [Stack vs queue](https://riaevangelist.github.io/easy-stack/queue/) · [Benchmarks](https://riaevangelist.github.io/easy-stack/benchmarks/) · [Migration](https://riaevangelist.github.io/easy-stack/migration/) · [Testing](https://riaevangelist.github.io/easy-stack/testing/)\n\n[![npm version](https://img.shields.io/npm/v/easy-stack?logo=npm)](https://www.npmjs.com/package/easy-stack)\n[![npm downloads](https://img.shields.io/npm/dm/easy-stack?logo=npm)](https://www.npmjs.com/package/easy-stack)\n[![Node.js support](https://img.shields.io/badge/node-%3E%3D22.13-339933?logo=nodedotjs&logoColor=white)](https://riaevangelist.github.io/easy-stack/testing/)\n[![CI](https://github.com/RIAEvangelist/easy-stack/actions/workflows/ci.yml/badge.svg)](https://github.com/RIAEvangelist/easy-stack/actions/workflows/ci.yml)\n[![test cases](https://img.shields.io/badge/test_cases-94_unique-12d9c4)](https://riaevangelist.github.io/easy-stack/testing/)\n[![test runner](https://img.shields.io/badge/test_runner-vanilla--test%202.1.1-12d9c4)](https://riaevangelist.github.io/easy-stack/testing/)\n[![coverage](https://img.shields.io/badge/coverage-100%25-12d9c4)](https://riaevangelist.github.io/easy-stack/testing/)\n[![runtime dependencies](https://img.shields.io/badge/runtime_dependencies-0-12d9c4)](https://www.npmjs.com/package/easy-stack?activeTab=dependencies)\n[![license](https://img.shields.io/npm/l/easy-stack)](./licence)\n\n## Quick start\n\n```sh\nnpm install easy-stack\n```\n\n```javascript\nimport Stack from 'easy-stack';\n\nconst stack = new Stack();\nconst order = [];\n\nstack.autoRun = false;\nstack.add(\n    function first() {\n        order.push('first');\n        this.next();\n    },\n    function newest() {\n        order.push('newest');\n        this.next();\n    }\n);\nstack.next();\n\nconsole.log(order); // ['newest', 'first']\n```\n\nCommonJS remains supported:\n\n```javascript\nconst Stack = require('easy-stack');\n```\n\nBoth loaders resolve the same synchronous `stack.js` implementation on Node 22.13 and newer.\n\nEach task receives the stack as `this` and explicitly continues the flow with `this.next()`. Execution begins synchronously when `autoRun` is truthy; set it to `false` while assembling a batch.\n\n## Contract at a glance\n\n| API | Result |\n| --- | --- |\n| `new Stack()` | Creates an isolated stack with `autoRun = true` and `stop = false`. |\n| `add(...tasks)` | Validates and appends functions, starts eligible work, and returns the stack. |\n| `next()` | Runs the newest pending task and returns `undefined`. |\n| `clear()` | Removes pending work and returns the new empty live array. |\n| `contents()` | Returns the live pending array. |\n| `contents(tasks)` | Replaces pending work after validating the complete array. |\n| `stack` | Gets or replaces the live pending array. |\n| `size` | Reports the pending task count. |\n| `running` | Reports whether a task has started and not yet yielded or drained. |\n\nThe runner is intentionally cooperative. A task that does not call `this.next()` keeps the stack active until another part of the program calls `next()`. New tasks added while active take priority over older pending work.\n\n## Why choose it\n\nChoose easy-stack when the newest pending intent should run first and the active task should control the hand-off. It has zero runtime dependencies, exposes pending work for inspection, works in Node and browsers, and keeps its behavior small enough to verify exhaustively. Use a FIFO queue, concurrency pool, or durable job broker when those are the actual requirements.\n\nRead the focused [selection guide](https://riaevangelist.github.io/easy-stack/why/) and [version benchmarks](https://riaevangelist.github.io/easy-stack/benchmarks/).\n\n[![easy-stack 2.1.0 benchmark chart showing about 18 times faster construction and 1.57 to 2.40 times faster task-turn scheduling](https://raw.githubusercontent.com/RIAEvangelist/easy-stack/main/assets/benchmark-chart.svg)](https://riaevangelist.github.io/easy-stack/benchmarks/)\n\nCaptured microbenchmarks compare the exact 2.0.0 WeakMap runtime with 2.1.0 private fields. See the linked page for the complete method, exact timings, machine data, and reproduction command.\n\n## Browser entry points\n\neasy-stack works with bundlers and without a bundler. Bundlers resolve the bare `easy-stack` import normally. Native browser ESM resolves that same bare import through an import map, with no build or transpilation step:\n\n```html\n<script type=\"importmap\">\n{\n    \"imports\": {\n        \"easy-stack\": \"./node_modules/easy-stack/stack.js\"\n    }\n}\n</script>\n<script type=\"module\">\n    import Stack from 'easy-stack';\n\n    const stack = new Stack();\n</script>\n```\n\nImport-map URLs are relative to the HTML document. Serve the page over HTTP(S), and configure the server to expose the mapped `node_modules` files; `file://` is not a supported path. easy-stack currently has zero runtime dependencies, so the complete normal-layout map needs only the package entry and no scoped nested-dependency map.\n\nAlternatively, use `stack-vanilla.js` as a modern classic script or `es5.js` for legacy syntax:\n\n```html\n<script src=\"https://unpkg.com/easy-stack@2.1.1/stack-vanilla.js\"></script>\n<script>\n    const stack = new Stack();\n</script>\n```\n\nSee the focused [browser guide](https://riaevangelist.github.io/easy-stack/browser/) for module and classic-script examples.\n\n## Verification\n\nThe non-duplicated catalog contains 94 uniquely identified Unit, Functional, Behavioral, Integration, and Regression cases, all registered through `vanilla-test@2.1.1`. The same shared JavaScript inventory imports `easy-stack` by package name in Node and real Chrome; Chrome resolves it through the configured native import map. CI proves the exact Node 22.13 floor and Node 24 across Linux, macOS, and Windows; it also verifies composite consumer outcomes, five rendered Playground journeys in real Chrome, same-constructor ESM/CommonJS interop, browser globals, the packed npm artifact, documentation and deployment contracts, the opaque Playground Worker, and 100% statement, branch, function, and line coverage.\n\n```sh\nnpm test\nnpm run test:unit\nnpm run test:functional\nnpm run test:behavioral\nnpm run test:behavioral:chrome\nnpm run test:integration\nnpm run test:regression\nnpm run test:regression:chrome\nnpm run coverage\nnpm run benchmark\n```\n\nRead the [testing evidence](https://riaevangelist.github.io/easy-stack/testing/) or the [v2 migration guide](./MIGRATION.md).\n\n## License\n\n[MIT](./licence) © Brandon Nozaki Miller\n","readmeFilename":"README.md"}