{"_id":"@scenarist/core","_rev":"26-0fcd4429545f7084ded1de1a31809b0f","name":"@scenarist/core","dist-tags":{"latest":"0.4.14"},"versions":{"0.0.1":{"name":"@scenarist/core","version":"0.0.1","keywords":["oidc","trusted-publishing","setup"],"_id":"@scenarist/core@0.0.1","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"dist":{"shasum":"0a5268afca21412e07b4949fe329834fff66279e","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.0.1.tgz","fileCount":2,"integrity":"sha512-qHOrqp5/CRBqM7kA1E4KXeydUSdjpqFBSlDXcuy5jqYi3mm83VH12pZR5IhngihNw7eqhuZMZYFgI1v2o3l3jA==","signatures":[{"sig":"MEUCIQCxn+Foi2KB8olvlaIZC0EszOsgIQUbg8HlbxYcGy9xLAIgWiOII1d8PYujEsH9uMm7C+fAwm4wFB9rsIzO+PDSprI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2023},"_npmUser":{"name":"citypaul","email":"paul.ian.hammond@gmail.com"},"_npmVersion":"10.9.4","description":"OIDC trusted publishing setup package for @scenarist/core","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/core_0.0.1_1764202930733_0.5552359966657352","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@scenarist/core","version":"0.1.0","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.1.0","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"4df7bc3514510ec88643a4a888ffd2323dd10c71","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.1.0.tgz","fileCount":102,"integrity":"sha512-liWt4MAhlaZYmXxUGhpSqSvMLq7u+NX0qdaspqiIX/88U09NyMvZLBlO0hlIscgtSMSLAHulJP0Z90wLc4frSQ==","signatures":[{"sig":"MEUCIAbydU/kSCmlx60UEPQUm6V0ALjThCa707/XThABazfkAiEAxMEvXFrwZdocGFXkcg+XzMPvl7r8MsRRds87Cns3qcc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":139378},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/fded0a6dbe2f93d0d602317ed90bd68a/scenarist-core-0.1.0.tgz","_integrity":"sha512-liWt4MAhlaZYmXxUGhpSqSvMLq7u+NX0qdaspqiIX/88U09NyMvZLBlO0hlIscgtSMSLAHulJP0Z90wLc4frSQ==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"msw":"^2.12.1","zod":"^4.1.12","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.8","@vitest/ui":"^4.0.8","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.8","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.0_1764209352708_0.7508907157967784","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@scenarist/core","version":"0.1.1","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.1.1","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"46dda397d6a65b5dab76861bafe680bd8fd0c3df","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.1.1.tgz","fileCount":102,"integrity":"sha512-b3xnXyXQD4jy+DXOt/Ix3ISsBGUYz1Bt5J8bUjOcE0wjGz5hQ7uDYAJzEVL6QtUururjK2UvkQaLXbl3nNrYfw==","signatures":[{"sig":"MEQCIGLmiOe5KM6dHJLeC21H8G1WBWFmNzGo7UZEkPAHgQiNAiBZAIvz5IwvgK/h+oerAB6k7fUT9+L3MLhm6DMvNyHf8g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":139409},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.1.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/c75a3709ddd0ae26d22c2357982ca075/scenarist-core-0.1.1.tgz","_integrity":"sha512-b3xnXyXQD4jy+DXOt/Ix3ISsBGUYz1Bt5J8bUjOcE0wjGz5hQ7uDYAJzEVL6QtUururjK2UvkQaLXbl3nNrYfw==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"msw":"^2.12.3","zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.14","@vitest/ui":"^4.0.14","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.1_1764284616253_0.767118162424153","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@scenarist/core","version":"0.1.2","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.1.2","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"686cd79dedcf8b2fb7f71da52006f795c06a94ce","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.1.2.tgz","fileCount":102,"integrity":"sha512-/+719/+iT9pZOG1FTIT/0imtNKgFi0tDoU4JdKZJltM2dd9ujHof6uGdC1ZJ99CYBVNkzQhXBnsTdjZo4zFOGQ==","signatures":[{"sig":"MEQCIAPZRFjglgEPGp/QqfnXw2QqjS7cBnMF2dr2MS3hlSXLAiBlTTwbJluaOJVS8VxmN0GH3vkOPLwfvwBQw/BHJSYqTQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":139913},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.1.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/e5e2249a46d196945b93e2dbfc1e748d/scenarist-core-0.1.2.tgz","_integrity":"sha512-/+719/+iT9pZOG1FTIT/0imtNKgFi0tDoU4JdKZJltM2dd9ujHof6uGdC1ZJ99CYBVNkzQhXBnsTdjZo4zFOGQ==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"msw":"^2.12.3","zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.14","@vitest/ui":"^4.0.14","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.2_1764286652774_0.9509326312509732","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@scenarist/core","version":"0.1.3","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.1.3","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"135a6be77cc22d0bf9c575a5c1b6926e92fd9f80","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.1.3.tgz","fileCount":102,"integrity":"sha512-W056dD/c2cqaC2uSnYEdahpuGNy9kSHYc/iepNzx79pM32zxp4Ut1JfoM51NF0yfZe/zzJFx6bM0AAVP/vshXA==","signatures":[{"sig":"MEUCIQDCAjv987NB5CWCBqarde22P974WSa/Q3B13TEqwIUzVgIgJtlbpL0Jg6UlAZ6NiKXG0n+GfA+4/u50ncvRDEwaMzM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":142333},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.1.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/94cde2f3a5e95007496d6589469fde49/scenarist-core-0.1.3.tgz","_integrity":"sha512-W056dD/c2cqaC2uSnYEdahpuGNy9kSHYc/iepNzx79pM32zxp4Ut1JfoM51NF0yfZe/zzJFx6bM0AAVP/vshXA==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.14","@vitest/ui":"^4.0.14","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.3_1764608879441_0.9684626915727208","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"@scenarist/core","version":"0.1.16","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.1.16","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"5d39843ab04f2a71151732e3a59b1c239aa5ffb0","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.1.16.tgz","fileCount":102,"integrity":"sha512-ouRtBqVVL9TNKCufcLw4RQAOn084TodA6gdoGvnfLcPjka4FFtRQNBNP3zfQhfLRC0FHxyMiDSKMZXFXKXne6w==","signatures":[{"sig":"MEUCIQDRS2Xb1zszuFL+z92DAcR+aEtZsGhyo01WDHRc/6FiEQIgGalXYu5L/zNqg0hdYHn49InYheStbO12v0HNiuZPIic=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.1.16","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":142334},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.1.16.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/df5b990af9aabbeb2fdc55bbc11e6950/scenarist-core-0.1.16.tgz","_integrity":"sha512-ouRtBqVVL9TNKCufcLw4RQAOn084TodA6gdoGvnfLcPjka4FFtRQNBNP3zfQhfLRC0FHxyMiDSKMZXFXKXne6w==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.14","@vitest/ui":"^4.0.14","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.16_1764610594102_0.08726172113119035","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@scenarist/core","version":"0.2.0","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.2.0","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"0e392803b720b4234d249d4cfc89dc22062f9330","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.2.0.tgz","fileCount":117,"integrity":"sha512-qzpuP4DWt3JllIx+dhLLJGYcVp/rnWyOPdM91jHpSJyQEnkw82/RlzwNxJqNjKtW79RM3FA+2vcS1J2yEaGD2A==","signatures":[{"sig":"MEUCIQDDTumD6OZvHGNQ/B3TtEK6Gv7xqP8RbIY1s1w+GAc/BgIgMKbk8cvNmFlQpKPD8KYawo/nQQUttdWyTpQGY3Tg6nM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":167281},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/05f235c6af81ed20554f575be7e9b394/scenarist-core-0.2.0.tgz","_integrity":"sha512-qzpuP4DWt3JllIx+dhLLJGYcVp/rnWyOPdM91jHpSJyQEnkw82/RlzwNxJqNjKtW79RM3FA+2vcS1J2yEaGD2A==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.14","@vitest/ui":"^4.0.14","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.2.0_1764682128548_0.40720878614891864","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@scenarist/core","version":"0.2.1","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.2.1","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"b9c1bd461f782efc74ea832d25cd2815a610e129","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.2.1.tgz","fileCount":117,"integrity":"sha512-USWSwc8CqYiAiGkRyW8FMLTItxDO6tUvw8V50nejmf0Y00TiKUU3eBGrTRodRcYmqe/YlRy9O8JNyQ7YhWTMHw==","signatures":[{"sig":"MEYCIQDZu5b3FzxHO5SDqDSGZPuUqS6jnz7L6TsHYM5JNje1zAIhAKVVSrXmJPBWsPXlPiZXgjaP+1ajN0TatJKl3jHcS+ch","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":167430},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.2.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/b6bd9b401a2347fa5e759ce334c740f6/scenarist-core-0.2.1.tgz","_integrity":"sha512-USWSwc8CqYiAiGkRyW8FMLTItxDO6tUvw8V50nejmf0Y00TiKUU3eBGrTRodRcYmqe/YlRy9O8JNyQ7YhWTMHw==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.14","@vitest/ui":"^4.0.14","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.2.1_1764719072685_0.9791808588354238","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@scenarist/core","version":"0.3.0","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.3.0","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"dcf9cafd4b8ba7e1bba7716e0b9aba47f6b62cb0","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.3.0.tgz","fileCount":132,"integrity":"sha512-nvqguvU7zhDM7Raqi96WFYwlLYuVZ7k+RPM4INWqAWia6K4sPVBlz8bA/3cvzeYVEUGJD+DevYAfYLv6iB9PTg==","signatures":[{"sig":"MEQCIAr2xKdU7GhyUjLgNtB39guZ+7UrHKVnU6tsIIVOD+JcAiBAUuyE6HfgSl1QwM9e3WHbAgvTwgKurSaJpRU8t8TaCQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":205279},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.3.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/386946fe35aaf2db2bfd242d0f5c6e75/scenarist-core-0.3.0.tgz","_integrity":"sha512-nvqguvU7zhDM7Raqi96WFYwlLYuVZ7k+RPM4INWqAWia6K4sPVBlz8bA/3cvzeYVEUGJD+DevYAfYLv6iB9PTg==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.15","@vitest/ui":"^4.0.15","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.0_1764800422382_0.6519269557918788","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@scenarist/core","version":"0.3.1","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.3.1","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"515f09bcad82f64b7581877024900dfa639540c8","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.3.1.tgz","fileCount":132,"integrity":"sha512-uIegYbEyYTCEPkSK0MAT9XxOQiOoQJYok+kFftf0TeCsaanDFhshZqxN7Hwck0xhSNzB1zvqOOdOEag4Rpr3qw==","signatures":[{"sig":"MEQCIHPGWsEO0+jM1huEEo4cNl+e8oPxnR0ro1L68irOkluUAiBCa6F5ylXioun5BfLiBptYcWYEhLLI+V5J68l6blyP1Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":207149},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.3.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/94b881a963890b7816aab2b40f6b03d7/scenarist-core-0.3.1.tgz","_integrity":"sha512-uIegYbEyYTCEPkSK0MAT9XxOQiOoQJYok+kFftf0TeCsaanDFhshZqxN7Hwck0xhSNzB1zvqOOdOEag4Rpr3qw==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.15","@vitest/ui":"^4.0.15","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.1_1764843901561_0.791583467831181","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@scenarist/core","version":"0.3.2","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.3.2","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"d6c4961cc2c94e2866422660b582154ad6e52185","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.3.2.tgz","fileCount":132,"integrity":"sha512-mxbQBZ8P4Hjgccss0bcOfYSw9uyFzZoBEMjP+BuUjFbh+VD9TJsQ+1shXrY6TUBYk9Z9cs4xZ6F4W5R8JfHdLg==","signatures":[{"sig":"MEUCIQCTIoJRCn/z8mJR6EgBh/duU208s67TVxvmjqyWsd/G0AIgWOAGxg6Gk6bjC6yUeF/iq5IdZkkGDdRf0RgeGOZY/ew=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":210410},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.3.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/b9cb1f6df69414420656856f7464cec8/scenarist-core-0.3.2.tgz","_integrity":"sha512-mxbQBZ8P4Hjgccss0bcOfYSw9uyFzZoBEMjP+BuUjFbh+VD9TJsQ+1shXrY6TUBYk9Z9cs4xZ6F4W5R8JfHdLg==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.15","@vitest/ui":"^4.0.15","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.2_1764891445234_0.9185140846597928","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@scenarist/core","version":"0.3.3","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.3.3","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"02de4aae101729fbb3c7bdfddda84cf210f0bc32","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.3.3.tgz","fileCount":132,"integrity":"sha512-Mz6BQrmJDd6cR5NmJDve3RPxleIKBWk0Zgl+no/etD01pswztP9AFfg87rfh2ghNehA4UYfVONYULptKs6ukow==","signatures":[{"sig":"MEUCIEnL+N1mdmTHN4jFqkBI+BbwTUNxIfuk9OTkxBMqJn6PAiEAnZoGzVD1xdnX+ANRTUi9UcTlOsjDFsU1qcDAARhBjEo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":210410},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.3.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/3a950bf27c5be170816cbe3e940ac1ab/scenarist-core-0.3.3.tgz","_integrity":"sha512-Mz6BQrmJDd6cR5NmJDve3RPxleIKBWk0Zgl+no/etD01pswztP9AFfg87rfh2ghNehA4UYfVONYULptKs6ukow==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.15","@vitest/ui":"^4.0.15","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.3_1764960520453_0.4754739651395825","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@scenarist/core","version":"0.4.0","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.4.0","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"942d9826a982d097698f65b69c93ae6607b577f1","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.0.tgz","fileCount":132,"integrity":"sha512-nroXxJXqft6ti+XU9xTxOfO6M0+sUi1ylDV/vjyErXl5vrCNEtu0lVlvK+sNkALwY84v+Ha/m1UKINt8QS5zcQ==","signatures":[{"sig":"MEUCIQCQwZSZ1PkTAPXB6vP34WXeFdJrG3UPHklTG5cX2tKMWgIgLslLOWdb/pWyYNSTWi5zMqzQB2btZjQE/SC2V2VuY7A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":217447},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.4.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/a3da7fd9957055b7a6e2d8e7a0d335c6/scenarist-core-0.4.0.tgz","_integrity":"sha512-nroXxJXqft6ti+XU9xTxOfO6M0+sUi1ylDV/vjyErXl5vrCNEtu0lVlvK+sNkALwY84v+Ha/m1UKINt8QS5zcQ==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.15","@vitest/ui":"^4.0.15","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.0_1765050578076_0.6088463573142202","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@scenarist/core","version":"0.4.1","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.4.1","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"7191b377e6c9175bf86bd2b29c325141d23d2df6","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.1.tgz","fileCount":132,"integrity":"sha512-k8c/dB8a70xdV2iDuV7DAMSZgOUvn/rnHv4q7K+iW/5TZTTVCjOEKVLXo1fr0q0gabAMeLMqEsIfEw9Fz2bhXw==","signatures":[{"sig":"MEUCIHDPcsr9YDTCeZ+DpJOyzUprTLhADt4POB37fXl2N18jAiEAkOe/FDEICkOf+IXvfN6hkkdB5ByaLIXnjNMTBq0ZK4Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":217447},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.4.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/cfc2de4bccb2a2ed68deccd0e3e6fae1/scenarist-core-0.4.1.tgz","_integrity":"sha512-k8c/dB8a70xdV2iDuV7DAMSZgOUvn/rnHv4q7K+iW/5TZTTVCjOEKVLXo1fr0q0gabAMeLMqEsIfEw9Fz2bhXw==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.15","@vitest/ui":"^4.0.15","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.1_1765131113533_0.8156713003009328","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@scenarist/core","version":"0.4.2","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.4.2","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"8e410c26e7ad2db7236c3605244f828e01cae0c1","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.2.tgz","fileCount":132,"integrity":"sha512-d2Dw+c0YGVDy6eO/2bNbOUTxTNxjstibKK03hMnNcfqn71LXYTUhBIKMPW/4q8TLW2i0riQ3luaT5OYG73HreA==","signatures":[{"sig":"MEYCIQDCbjuOW0z1Y8Gf5EtNUpGuxcGO3T5kAQoSHyucWCFrLAIhALEAY5JFLoziLKAijdIwR6u8hXE6xPN+jEIH7HMApYdS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":217447},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.4.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/ca4cafb77aa340cc21b467f71033e4ce/scenarist-core-0.4.2.tgz","_integrity":"sha512-d2Dw+c0YGVDy6eO/2bNbOUTxTNxjstibKK03hMnNcfqn71LXYTUhBIKMPW/4q8TLW2i0riQ3luaT5OYG73HreA==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.15","@vitest/ui":"^4.0.15","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.2_1765132826248_0.5474033012240691","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@scenarist/core","version":"0.4.3","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.4.3","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"5346c78274809858e5683f33fd86b24b7c98d839","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.3.tgz","fileCount":132,"integrity":"sha512-kqz923WGK4sG0JK484386Cvj22Zsv0HCafmQy3rJmxh2+gC0ATrkVEG4A7ahsoa7qvCaod01iYqknxGXScuLvg==","signatures":[{"sig":"MEQCIEdchxdgG1HIZGv41DHWqyrfh6yqseq0g7+Jds5h0bxEAiBGZ8cx3QD9Bc7+Zg06xHXy1X69ixfk+hua8/ZIwb+YJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":217447},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.4.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/d109e13942a6306982e69883afdfed10/scenarist-core-0.4.3.tgz","_integrity":"sha512-kqz923WGK4sG0JK484386Cvj22Zsv0HCafmQy3rJmxh2+gC0ATrkVEG4A7ahsoa7qvCaod01iYqknxGXScuLvg==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.15","@vitest/ui":"^4.0.15","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.3_1765231885184_0.927207234892957","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@scenarist/core","version":"0.4.4","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.4.4","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"d2438967bce45e20c0f1fe545134af0d9d6498d8","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.4.tgz","fileCount":132,"integrity":"sha512-K7zql3FL9smj7J/nji41EOHTP1SqSVkm7RfLC32rKVzPHMJnn6jOBew1kjNiB4p1Gd+NkFe9hSB28t7Noc9vAw==","signatures":[{"sig":"MEQCIDf00oZP9VIqMxbi+NYGjTckeFW64QwTQAgWoXvTgbTKAiArDEuuOirgjYmEA+V0QR2DoesVzJtpfRowjU9zKBe7zA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":217447},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.4.4.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/80aca0b0a47820af29fda2f261209164/scenarist-core-0.4.4.tgz","_integrity":"sha512-K7zql3FL9smj7J/nji41EOHTP1SqSVkm7RfLC32rKVzPHMJnn6jOBew1kjNiB4p1Gd+NkFe9hSB28t7Noc9vAw==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.15","@vitest/ui":"^4.0.15","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.4_1765803813753_0.19382170023905032","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@scenarist/core","version":"0.4.5","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.4.5","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"da93e096775f20193b09d2bd37e2f97ae1a2fa83","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.5.tgz","fileCount":132,"integrity":"sha512-W9phdzCrK4prTyd4xpEODQsNfS+MLFPNTbkImP2WOC4wGAj6lf9sab2A4hoxgUV5MOse+qZDiVbh9GTr56Vb1g==","signatures":[{"sig":"MEYCIQDeRDVA0hsC7uxFyZErq3dpeUyZzeKw3ZR2n4nsf2Q04AIhAKlqVPz1H8wWlsPBD+aO+jXBoGvT0OnDz3rcpJA5APDP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":217447},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.4.5.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/e817cb88dbf27f66fc7d878a7c904293/scenarist-core-0.4.5.tgz","_integrity":"sha512-W9phdzCrK4prTyd4xpEODQsNfS+MLFPNTbkImP2WOC4wGAj6lf9sab2A4hoxgUV5MOse+qZDiVbh9GTr56Vb1g==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.1.13","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.1","vitest":"^4.0.15","@vitest/ui":"^4.0.15","fast-check":"^4.3.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.14","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.5_1765804609025_0.3137342216546799","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"@scenarist/core","version":"0.4.6","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.4.6","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"edd2c48b3ad8a2caafdb5a3bf7c42900dad9d57c","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.6.tgz","fileCount":132,"integrity":"sha512-muQ2YuC/Jh6kkLoPCb9eN8EYkruNWFYegdMqZ1I5J/l1Mfo9/vHWmpCovzdA8KW0VqUUF7nX9q1uSOnJdYUVsQ==","signatures":[{"sig":"MEQCIDF247cXY1mjzz3h46YAmg8cuM6rjuKEMCe3SxAXDJ9eAiAndiYoR0sfF9s/dCfOeWPT9iPQQL/9OMCZdfhjM05Jbg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":217791},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.4.6.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/ebe158b7f7f1408a314127bc331b2c6e/scenarist-core-0.4.6.tgz","_integrity":"sha512-muQ2YuC/Jh6kkLoPCb9eN8EYkruNWFYegdMqZ1I5J/l1Mfo9/vHWmpCovzdA8KW0VqUUF7nX9q1uSOnJdYUVsQ==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.2.1","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.2","vitest":"^4.0.16","@vitest/ui":"^4.0.16","fast-check":"^4.5.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.16","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.6_1767111356760_0.32577208810226166","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"@scenarist/core","version":"0.4.7","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.4.7","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"1432c9d599f3d8fabe9a6b5161ca21f4512c64af","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.7.tgz","fileCount":132,"integrity":"sha512-bxIh2hbd2Ei5vsXMUR5pes0+dLeeWYtVzfTQbAlncWi5/SED4V6TrIid4GuS/ZcOnCpuK4Z//YEiCbToY0UY6Q==","signatures":[{"sig":"MEUCIDTWc2yCMhj6cirZoNUcg+tbukwC5wtWOXi7qVm6RGLrAiEA6PI902hjWhZsMm/dKeH4Gf7Pwu1eQAqXvzxBRAQPrAs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":217791},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.4.7.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/27c8db3f8e6fa25473148fc5bba50662/scenarist-core-0.4.7.tgz","_integrity":"sha512-bxIh2hbd2Ei5vsXMUR5pes0+dLeeWYtVzfTQbAlncWi5/SED4V6TrIid4GuS/ZcOnCpuK4Z//YEiCbToY0UY6Q==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.2.1","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.2","vitest":"^4.0.16","@vitest/ui":"^4.0.16","fast-check":"^4.5.2","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.16","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.7_1771018326801_0.21440560315770085","host":"s3://npm-registry-packages-npm-production"}},"0.4.8":{"name":"@scenarist/core","version":"0.4.8","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.4.8","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"15bbcef4c6cc3e7c710bacd5eea6a18cd72731f5","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.8.tgz","fileCount":132,"integrity":"sha512-bzyEAVELiHcul12oGeY35JM0RKCCqiKiTmMCx/48/ChBUliYaVp48FT+HPWkhQNJJZwATP4wuShyzEgmvV0lcw==","signatures":[{"sig":"MEUCIQD4UBINPEe6XGlVw4oT0AK9Evf1BPznS1S7uLurjnqQeAIgYFBlEB2/HI4drdwhV5b6gYJEMyaLArqPOCcQTUJfOcg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":217791},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.4.8.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/dae4f5eeb902e971d3a01cb47f394563/scenarist-core-0.4.8.tgz","_integrity":"sha512-bzyEAVELiHcul12oGeY35JM0RKCCqiKiTmMCx/48/ChBUliYaVp48FT+HPWkhQNJJZwATP4wuShyzEgmvV0lcw==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.3.6","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.2","vitest":"^4.0.18","@vitest/ui":"^4.0.18","fast-check":"^4.5.3","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.18","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.8_1771023053286_0.680967086379106","host":"s3://npm-registry-packages-npm-production"}},"0.4.9":{"name":"@scenarist/core","version":"0.4.9","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.4.9","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"8f237833b33e9d8e8a495c6c650373d636529dc6","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.9.tgz","fileCount":135,"integrity":"sha512-L7TwjO4xRXD2ApDw+yoyg0lmWby8G8R7b12iTwVO0KVAOorMAFeiupgRrC1lFMVj+DaJdEb3FMWQv9Eg9+/f8A==","signatures":[{"sig":"MEUCIGuOOx99fKitU60GQTHSAarGZK3exik7lXuBa7il7M82AiEAoGtQWsFyNbmbwIxfoD3G6IwQXh7qjX3kbJzxVvwIJTw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":212328},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.4.9.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/bcab8322452c737a2fa4e3e3cda24852/scenarist-core-0.4.9.tgz","_integrity":"sha512-L7TwjO4xRXD2ApDw+yoyg0lmWby8G8R7b12iTwVO0KVAOorMAFeiupgRrC1lFMVj+DaJdEb3FMWQv9Eg9+/f8A==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.3.6","redos-detector":"^6.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.2","vitest":"^4.0.18","@vitest/ui":"^4.0.18","fast-check":"^4.5.3","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.18","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.9_1771976756112_0.8811696626889856","host":"s3://npm-registry-packages-npm-production"}},"0.4.10":{"name":"@scenarist/core","version":"0.4.10","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.4.10","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"37839298d6ad98d4be7df7ee92e2ddc125431be1","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.10.tgz","fileCount":135,"integrity":"sha512-2Nadyg1ANLlFBPVGNzbqUuXhicfBVu2eDb5HHsKiJHZJeutz99ph45FfXH9vaPYyPcnd+SqxCxYkLtwcZ3sfhQ==","signatures":[{"sig":"MEUCIBHDMj7imck/UPPtKjlYBnOUgpNmagnJaE8CgEvjbQ3rAiEA1UZmsiYW2Qk229ijBxFfL+dI2nkOx15TUSNTN5vi5+E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":212329},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.4.10.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/5059a933f52cd8ca8e1687b9d94c3449/scenarist-core-0.4.10.tgz","_integrity":"sha512-2Nadyg1ANLlFBPVGNzbqUuXhicfBVu2eDb5HHsKiJHZJeutz99ph45FfXH9vaPYyPcnd+SqxCxYkLtwcZ3sfhQ==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.3.6","redos-detector":"^6.1.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.3","vitest":"^4.0.18","@vitest/ui":"^4.0.18","fast-check":"^4.5.3","typescript":"^5.9.3","@vitest/coverage-v8":"^4.0.18","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.10_1772015146305_0.8659172601547216","host":"s3://npm-registry-packages-npm-production"}},"0.4.11":{"name":"@scenarist/core","version":"0.4.11","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.4.11","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"c3b7da1bff1ace21a36678fc528f6ae7e5fe0d39","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.11.tgz","fileCount":135,"integrity":"sha512-RUAyHqAVLW9Mey1MBCIShZVTZIzHdA5u0xDaRF7NyaOLV0bNdYzWujpDoZlcT4OC8LO+NwBQlDcxQN2jeTIjMQ==","signatures":[{"sig":"MEUCIFx2Jz2mh4Qttwv1sQ6J7jKCm/FxtSqvj0o0133trIxJAiEAkeWAnGNvoGBqqh5LlINc3dqV6cDGpBjVyBhewLGLp6E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":211612},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.4.11.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/cf8e9686743e19c50b60ce84e2dffbef/scenarist-core-0.4.11.tgz","_integrity":"sha512-RUAyHqAVLW9Mey1MBCIShZVTZIzHdA5u0xDaRF7NyaOLV0bNdYzWujpDoZlcT4OC8LO+NwBQlDcxQN2jeTIjMQ==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.3.6","redos-detector":"^6.1.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^4.1.2","@vitest/ui":"^4.1.2","fast-check":"^4.5.3","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.2","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.11_1775130282629_0.6996587169861548","host":"s3://npm-registry-packages-npm-production"}},"0.4.13":{"name":"@scenarist/core","version":"0.4.13","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"author":{"url":"citypaul","name":"Paul Hammond","email":"paul@packsoftware.co.uk"},"license":"MIT","_id":"@scenarist/core@0.4.13","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"homepage":"https://github.com/citypaul/scenarist#readme","bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"dist":{"shasum":"2dfd2180410474a1d54d4a4633165f5418315e5b","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.13.tgz","fileCount":135,"integrity":"sha512-IeyoM2pa6N7iAI3Kv59WtE4pLX/eFo6XOvOQvh6UoWaMONDSRDi6gif8nsPXGiKm5xQjD/B5mKqay7qr5XD/8Q==","signatures":[{"sig":"MEUCIFwwsLSJkwQM+UvAIeu2q1uzEjKklHOzKY4yrAVSGKYMAiEAyg4KEqLJeC2oKRm5q2DUs7d+YLXj9XMOTLbOu9VAdvI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":213550},"main":"./dist/index.js","type":"module","_from":"file:scenarist-core-0.4.13.tgz","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint .","test":"vitest run","build":"tsc","typecheck":"tsc --project tsconfig.typecheck.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"_resolved":"/tmp/97190b2e82276467d521ee986aa3f1b7/scenarist-core-0.4.13.tgz","_integrity":"sha512-IeyoM2pa6N7iAI3Kv59WtE4pLX/eFo6XOvOQvh6UoWaMONDSRDi6gif8nsPXGiKm5xQjD/B5mKqay7qr5XD/8Q==","repository":{"url":"git+https://github.com/citypaul/scenarist.git","type":"git","directory":"internal/core"},"_npmVersion":"11.6.4","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","dependencies":{"zod":"^4.3.6","redos-detector":"^6.1.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^4.1.5","@vitest/ui":"^4.1.5","fast-check":"^4.5.3","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.5","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.13_1778272724073_0.2000921655016874","host":"s3://npm-registry-packages-npm-production"}},"0.4.14":{"name":"@scenarist/core","version":"0.4.14","description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","author":{"name":"Paul Hammond","email":"paul@packsoftware.co.uk","url":"citypaul"},"license":"MIT","homepage":"https://github.com/citypaul/scenarist#readme","repository":{"type":"git","url":"git+https://github.com/citypaul/scenarist.git","directory":"internal/core"},"bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"engines":{"node":">=18.0.0"},"publishConfig":{"access":"public"},"type":"module","sideEffects":false,"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"dependencies":{"redos-detector":"^6.1.4","zod":"^4.3.6"},"devDependencies":{"@vitest/coverage-v8":"^4.1.5","@vitest/ui":"^4.1.5","eslint":"^9.39.4","fast-check":"^4.5.3","typescript":"^5.9.3","vitest":"^4.1.5","@scenarist/eslint-config":"0.0.0","@scenarist/typescript-config":"0.0.0"},"scripts":{"build":"tsc","dev":"tsc --watch","test":"vitest run","test:watch":"vitest","lint":"eslint .","typecheck":"tsc --project tsconfig.typecheck.json --noEmit"},"_id":"@scenarist/core@0.4.14","_integrity":"sha512-l2HcB4ViWTDqNdB3cTWQ9kB5lX4vpkUpkSvF1XTbRrmEC5B3xdwbwbGxokCzSTX4EAyoDB/SfHpn/GOYOkXScQ==","_resolved":"/tmp/57c6cef425e72229b22800138dfe63f5/scenarist-core-0.4.14.tgz","_from":"file:scenarist-core-0.4.14.tgz","_nodeVersion":"22.21.1","_npmVersion":"11.6.4","dist":{"integrity":"sha512-l2HcB4ViWTDqNdB3cTWQ9kB5lX4vpkUpkSvF1XTbRrmEC5B3xdwbwbGxokCzSTX4EAyoDB/SfHpn/GOYOkXScQ==","shasum":"4b34977d3b3e79dba8d8079e7fb543d1dd62c1a7","tarball":"https://registry.npmjs.org/@scenarist/core/-/core-0.4.14.tgz","fileCount":135,"unpackedSize":213466,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@scenarist%2fcore@0.4.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIG5pnBAeyGWmH3xtXnfRYm7JY7Tnk4+6nq24lqqrQqVzAiBKDFZRzZTLE7BkU2P75hgcSNUlLv5bgY28A5Yt94hfzQ=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:329c282d-0ae7-4de0-bf87-83b9fb045b3d"}},"directories":{},"maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core_0.4.14_1786811326748_0.05670344675262662"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-27T00:22:10.607Z","modified":"2026-08-15T16:28:47.200Z","0.0.1":"2025-11-27T00:22:10.898Z","0.1.0":"2025-11-27T02:09:12.913Z","0.1.1":"2025-11-27T23:03:36.484Z","0.1.2":"2025-11-27T23:37:32.992Z","0.1.3":"2025-12-01T17:07:59.622Z","0.1.16":"2025-12-01T17:36:34.300Z","0.2.0":"2025-12-02T13:28:48.751Z","0.2.1":"2025-12-02T23:44:32.874Z","0.3.0":"2025-12-03T22:20:22.731Z","0.3.1":"2025-12-04T10:25:01.703Z","0.3.2":"2025-12-04T23:37:25.396Z","0.3.3":"2025-12-05T18:48:40.594Z","0.4.0":"2025-12-06T19:49:38.254Z","0.4.1":"2025-12-07T18:11:53.688Z","0.4.2":"2025-12-07T18:40:26.384Z","0.4.3":"2025-12-08T22:11:25.367Z","0.4.4":"2025-12-15T13:03:33.907Z","0.4.5":"2025-12-15T13:16:49.204Z","0.4.6":"2025-12-30T16:15:56.924Z","0.4.7":"2026-02-13T21:32:06.940Z","0.4.8":"2026-02-13T22:50:53.462Z","0.4.9":"2026-02-24T23:45:56.284Z","0.4.10":"2026-02-25T10:25:46.434Z","0.4.11":"2026-04-02T11:44:42.788Z","0.4.13":"2026-05-08T20:38:44.243Z","0.4.14":"2026-08-15T16:28:46.902Z"},"bugs":{"url":"https://github.com/citypaul/scenarist/issues"},"author":{"name":"Paul Hammond","email":"paul@packsoftware.co.uk","url":"citypaul"},"license":"MIT","homepage":"https://github.com/citypaul/scenarist#readme","keywords":["msw","mock-service-worker","testing","scenario-testing","test-isolation","e2e-testing","integration-testing","hexagonal-architecture","typescript"],"repository":{"type":"git","url":"git+https://github.com/citypaul/scenarist.git","directory":"internal/core"},"description":"Internal: Hexagonal architecture core for scenario-based testing with MSW","maintainers":[{"name":"citypaul","email":"paul.ian.hammond@gmail.com"}],"readme":"# @scenarist/core\n\n> **Note:** This is an internal package. Users should install framework-specific adapters instead:\n>\n> - **Express:** `@scenarist/express-adapter`\n> - **Next.js:** `@scenarist/nextjs-adapter`\n> - **Playwright:** `@scenarist/playwright-helpers`\n>\n> All types are re-exported from adapters for convenience. See the [full documentation](https://scenarist.io) for usage guides.\n\nThe core domain logic for Scenarist - a framework-agnostic library for managing MSW mock scenarios for scenario-based testing where your real code runs.\n\n## What is Scenarist?\n\n**Scenarist** enables concurrent tests to run with different backend states by switching mock scenarios at runtime via test IDs. Your real application code executes while external API responses are controlled by scenarios. No application restarts needed, no complex per-test mocking, just simple scenario switching.\n\n**Problem it solves:**\n\nTesting multiple backend states (success, errors, loading, edge cases) traditionally requires:\n\n- Restarting your app for each scenario\n- Complex per-test MSW handler setup\n- Serial test execution to avoid conflicts\n- Brittle mocks duplicated across test files\n\n**Scenarist's solution:**\n\nDefine scenarios once, switch at runtime via HTTP calls, run tests in parallel with complete isolation.\n\n```typescript\n// Define once\nconst errorScenario = {\n  id: \"error\",\n  mocks: [{ method: \"GET\", url: \"*/api/*\", response: { status: 500 } }],\n};\n\n// Switch instantly\nawait switchScenario(\"test-1\", \"error\"); // Test 1 sees errors\nawait switchScenario(\"test-2\", \"success\"); // Test 2 sees success (parallel!)\n\n// Tests run concurrently with different backend states\n```\n\n## Why Use Scenarist?\n\n**Runtime Scenario Switching**\n\n- Change entire backend state with one API call\n- No server restarts between tests\n- Instant feedback during development\n\n**True Parallel Testing**\n\n- 100+ tests run concurrently with different scenarios\n- Each test ID has isolated scenario state\n- No conflicts between tests\n\n**Reusable Scenarios**\n\n- Define scenarios once, use across all tests\n- Version control your mock scenarios\n- Share scenarios across teams\n\n**Framework-Agnostic Core**\n\n- Zero framework dependencies\n- Works with Express, Next.js, and any Node.js framework\n- Hexagonal architecture enables custom adapters\n\n**Type-Safe & Tested**\n\n- TypeScript strict mode throughout\n- 100% test coverage\n- Immutable, declarative data structures\n\n## Architecture\n\nThis package contains the **hexagon** - pure TypeScript domain logic with zero framework dependencies (except MSW types).\n\n### Package Structure\n\n```\nsrc/\n├── types/       # Data structures (use `type` with `readonly`)\n├── ports/       # Interfaces (use `interface` for behavior contracts)\n├── domain/      # Business logic implementations\n└── index.ts     # Public API exports\n```\n\n### Hexagonal Architecture Principles\n\n**Types (Data Structures):**\n\n- Defined with `type` keyword\n- All properties are `readonly` for immutability\n- Use declarative patterns (no imperative functions, closures, or hidden logic)\n- Native RegExp allowed for pattern matching (ADR-0016)\n- Examples: `ScenaristScenario`, `ScenaristConfig`, `ActiveScenario`, `ScenaristMock`\n\n**Ports (Behavior Contracts):**\n\n- Defined with `interface` keyword (domain ports) or `type` keyword (adapter contracts)\n- Contracts that adapters must implement\n- Domain ports: `ScenarioManager`, `ScenarioStore`, `RequestContext`\n- Adapter contract: `ScenaristAdapter<TMiddleware>`, `BaseAdapterOptions`\n\n**Domain (Implementations):**\n\n- Pure TypeScript functions and factory patterns\n- No framework dependencies\n- Implements the core business logic\n\n## Core Capabilities\n\nScenarist provides 20+ powerful features for scenario-based testing. All capabilities are framework-agnostic and available via any adapter (Express, Next.js, etc.).\n\n### Request Matching (11 capabilities)\n\n**1. Body matching (partial match)**\n\n- Match requests based on request body fields\n- Additional fields in request are ignored\n- Perfect for testing different payload scenarios\n\n**2. Header matching (case-insensitive)**\n\n- Match requests based on header values\n- Header names are case-insensitive\n- Ideal for user tier testing (`x-user-tier: premium`)\n\n**3. Query parameter matching**\n\n- Match requests based on query string parameters\n- Enables different responses for filtered requests\n\n**4. String matching (6 modes)**\n\n- **Plain string** (`\"value\"`): Exact match (backward compatible)\n- **Equals** (`{ equals: \"value\" }`): Explicit exact match\n- **Contains** (`{ contains: \"substring\" }`): Substring matching\n- **Starts with** (`{ startsWith: \"prefix\" }`): Prefix matching\n- **Ends with** (`{ endsWith: \"suffix\" }`): Suffix matching\n- **Regex** (`{ regex: { source: \"pattern\", flags: \"i\" } }`): Pattern matching with ReDoS protection\n\n**5. ReDoS protection for regex matching**\n\n- Validates regex patterns before execution using `redos-detector`\n- Prevents catastrophic backtracking attacks\n- Rejects unsafe patterns at scenario registration\n\n**6. Combined matching (all criteria together)**\n\n- Combine body + headers + query parameters\n- ALL criteria must pass for mock to apply\n\n**7. Specificity-based selection**\n\n- Most specific mock wins regardless of position\n- Calculated score: body fields + headers + query params\n- No need to carefully order your mocks\n- **Tie-breaking:** For mocks with same specificity:\n  - Specificity > 0 (with match criteria): First match wins\n  - Specificity = 0 (fallback mocks): Last match wins\n- Last fallback wins enables active scenario fallbacks to override default fallbacks\n\n**8. Fallback mocks**\n\n- Mocks without match criteria act as catch-all\n- Specific mocks always take precedence\n- Perfect for default responses\n- When multiple fallbacks exist, last one wins (enables override pattern)\n\n**9. Number and boolean matching**\n\n- Automatically stringifies number/boolean criteria values\n- Enables matching against numeric query params and body fields\n\n**10. Null matching**\n\n- `null` criteria matches empty string (`\"\"`)\n- Useful for optional fields\n\n**11. Type coercion**\n\n- All match values converted to strings before comparison\n- Consistent behavior across headers, query params, and body\n\n### Case-Insensitive Header Matching (RFC 2616 Compliant)\n\nPer [RFC 2616 Section 4.2](https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2), HTTP header names are case-insensitive. Scenarist implements this standard correctly:\n\n**Header Keys:** Case-insensitive (normalized to lowercase for matching)\n**Header Values:** Case-sensitive (preserved as-is)\n\n```typescript\n// All of these match the same mock:\n{\n  match: {\n    headers: { 'x-user-tier': 'premium' }\n  }\n}\n\n// Request with 'X-User-Tier: premium' → ✅ Matches\n// Request with 'x-user-tier: premium' → ✅ Matches\n// Request with 'X-USER-TIER: premium' → ✅ Matches\n\n// But header VALUES are case-sensitive:\n// Request with 'x-user-tier: Premium' → ❌ Does NOT match (value casing differs)\n```\n\n**Implementation Details:**\n\n- Core's `ResponseSelector` normalizes both request headers AND criteria headers to lowercase\n- Adapters pass headers as-is (no normalization required)\n- Works regardless of framework (Express, Next.js, etc.)\n\n**Why This Matters:**\n\n- Browser and client libraries may send headers with any casing\n- Tests remain portable across different HTTP clients\n- Standards-compliant behavior prevents matching bugs\n\n### Response Sequences (4 capabilities)\n\n**7. Single responses**\n\n- Return same response every time\n- Simplest mock definition\n\n**8. Response sequences (ordered)**\n\n- Return different response on each call\n- Perfect for polling APIs (pending → processing → complete)\n\n**9. Repeat modes (last, cycle, none)**\n\n- `last`: Stay at final response forever\n- `cycle`: Loop back to first response\n- `none`: Mark as exhausted after last response\n\n**10. Sequence exhaustion with fallback**\n\n- Exhausted sequences (`repeat: none`) skip to next mock\n- Enables rate limiting scenarios\n\n### Stateful Mocks (6 capabilities)\n\n**11. State capture from requests**\n\n- Extract values from request body, headers, or query\n- Store in per-test-ID state\n\n**12. State injection via templates**\n\n- Inject captured state into responses using `{{state.X}}`\n- Dynamic responses based on earlier requests\n\n**13. Array append support**\n\n- Syntax: `stateKey[]` appends to array\n- Perfect for shopping cart scenarios\n\n**14. Nested state paths**\n\n- Support dot notation: `user.profile.name`\n- Both capture and injection support nesting\n\n**15. State isolation per test ID**\n\n- Each test ID has isolated state\n- Parallel tests don't interfere\n\n**16. State reset on scenario switch**\n\n- State cleared when switching scenarios\n- Fresh state for each scenario\n\n### Core Features (4 capabilities)\n\n**17. Multiple API mocking**\n\n- Mock any number of external APIs\n- Combine APIs in single scenario\n\n**18. Automatic default scenario fallback**\n\n- Active scenarios automatically inherit mocks from default scenario\n- Default + active scenario mocks collected together\n- Specificity-based selection chooses best match\n- Only define what changes in active scenario - rest falls back to default\n- No explicit fallback mocks needed in specialized scenarios\n\n**19. Test ID isolation (parallel tests)**\n\n- Run 100+ tests concurrently\n- Each test ID has isolated scenario/state\n\n**20. Scenario switching at runtime**\n\n- Change backend state with one HTTP call\n- No application restart needed\n\n### Additional Features\n\n**21. Path parameters** (`/users/:id`)\n**22. Wildcard URLs** (`*/api/*`)\n**23. Response delays** (simulate slow networks)\n**24. Custom headers** in responses\n**25. Strict mode** (fail on unmocked requests)\n\n## Current Status\n\n**All Core Features Implemented** ✅\n\n- ✅ **Phase 1: Request Content Matching** - Body/headers/query matching with specificity-based selection\n- ✅ **Phase 2: Response Sequences** - Ordered sequences with repeat modes (last/cycle/none)\n- ✅ **Phase 3: Stateful Mocks** - State capture, injection, reset on scenario switch\n- ✅ **Integration**: Used by Express, Next.js, MSW adapters\n- ✅ **Total: 281 tests passing** across all packages with 100% coverage\n\n## Installation\n\nThis package is part of the Scenarist monorepo. Install dependencies from the root:\n\n```bash\npnpm install\n```\n\n## Development\n\n```bash\n# Build the package\npnpm build\n\n# Run tests\npnpm test\n\n# Run tests in watch mode\npnpm test:watch\n\n# Type check\npnpm typecheck\n```\n\n## Usage\n\n### Basic Setup\n\n```typescript\nimport {\n  createScenarioManager,\n  InMemoryScenarioRegistry,\n  InMemoryScenarioStore,\n  buildConfig,\n  type ScenaristScenario,\n} from \"@scenarist/core\";\n\n// 1. Define scenarios (declarative patterns)\nconst defaultScenario: ScenaristScenario = {\n  id: \"default\",\n  name: \"Default Scenario\",\n  description: \"Baseline mocks for all APIs\",\n  mocks: [\n    {\n      method: \"GET\",\n      url: \"https://api.example.com/users\",\n      response: {\n        status: 200,\n        body: { users: [] },\n      },\n    },\n  ],\n};\n\nconst happyPathScenario: ScenaristScenario = {\n  id: \"happy-path\",\n  name: \"Happy Path\",\n  description: \"All API calls succeed\",\n  devToolEnabled: true,\n  mocks: [\n    {\n      method: \"GET\",\n      url: \"https://api.example.com/users\",\n      response: {\n        status: 200,\n        body: { users: [{ id: 1, name: \"Test User\" }] },\n      },\n    },\n  ],\n};\n\n// 2. Build configuration (declarative plain data)\nconst config = buildConfig({\n  enabled: process.env.NODE_ENV !== \"production\", // Evaluated first!\n  defaultScenario: defaultScenario, // REQUIRED - fallback for unmocked requests\n  strictMode: false, // true = error on unmocked requests, false = passthrough\n  headers: {\n    testId: \"x-scenarist-test-id\",\n  },\n});\n\n// 3. Create adapters (dependency injection)\nconst registry = new InMemoryScenarioRegistry();\nconst store = new InMemoryScenarioStore();\n\n// 4. Create scenario manager\nconst manager = createScenarioManager({ registry, store });\n\n// 5. Register scenarios\nmanager.registerScenario(defaultScenario); // Must register default\nmanager.registerScenario(happyPathScenario);\n\n// 6. Switch to a scenario\nconst result = manager.switchScenario(\"test-123\", \"happy-path\");\n\nif (result.success) {\n  console.log(\"Scenario activated!\");\n}\n```\n\n### String Matching Strategies\n\nScenarist supports 5 matching strategies for headers, query params, and body fields:\n\n```typescript\nconst scenario: ScenaristScenario = {\n  id: \"string-matching-examples\",\n  mocks: [\n    // 1. Exact match (default)\n    {\n      method: \"GET\",\n      url: \"/api/products\",\n      match: {\n        headers: {\n          \"x-user-tier\": \"premium\", // Must match exactly\n        },\n      },\n      response: { status: 200, body: { products: [] } },\n    },\n\n    // 2. Explicit exact match (same as above)\n    {\n      method: \"GET\",\n      url: \"/api/products\",\n      match: {\n        headers: {\n          \"x-user-tier\": { equals: \"premium\" },\n        },\n      },\n      response: { status: 200, body: { products: [] } },\n    },\n\n    // 3. Contains (substring match)\n    {\n      method: \"GET\",\n      url: \"/api/products\",\n      match: {\n        headers: {\n          \"x-campaign\": { contains: \"summer\" }, // Matches 'summer-sale', 'mega-summer-event', etc.\n        },\n      },\n      response: { status: 200, body: { campaign: \"summer\" } },\n    },\n\n    // 4. Starts with (prefix match)\n    {\n      method: \"GET\",\n      url: \"/api/keys\",\n      match: {\n        headers: {\n          \"x-api-key\": { startsWith: \"sk_\" }, // Matches 'sk_test_123', 'sk_live_456', etc.\n        },\n      },\n      response: { status: 200, body: { valid: true } },\n    },\n\n    // 5. Ends with (suffix match)\n    {\n      method: \"GET\",\n      url: \"/api/users\",\n      match: {\n        query: {\n          email: { endsWith: \"@company.com\" }, // Matches 'john@company.com', 'admin@company.com', etc.\n        },\n      },\n      response: { status: 200, body: { users: [] } },\n    },\n\n    // 6. Regex (pattern match with ReDoS protection)\n    {\n      method: \"GET\",\n      url: \"/api/products\",\n      match: {\n        headers: {\n          referer: {\n            regex: {\n              source: \"/premium|/vip\", // Matches any referer containing '/premium' or '/vip'\n              flags: \"i\", // Case-insensitive\n            },\n          },\n        },\n      },\n      response: { status: 200, body: { tier: \"premium\" } },\n    },\n  ],\n};\n```\n\n### Native RegExp Support\n\nYou can use native JavaScript RegExp objects directly instead of the serialized form:\n\n```typescript\nconst scenario: ScenaristScenario = {\n  id: \"native-regex-examples\",\n  mocks: [\n    // Native RegExp in URL matching\n    {\n      method: \"GET\",\n      url: /\\/api\\/v\\d+\\/products/, // Matches /api/v1/products, /api/v2/products, etc.\n      response: { status: 200, body: { products: [] } },\n    },\n\n    // Native RegExp in header matching\n    {\n      method: \"GET\",\n      url: \"/api/products\",\n      match: {\n        headers: {\n          referer: /\\/premium|\\/vip/i, // Case-insensitive pattern\n        },\n      },\n      response: { status: 200, body: { tier: \"premium\" } },\n    },\n\n    // Both forms are equivalent and have same ReDoS protection\n    {\n      method: \"GET\",\n      url: \"/api/data\",\n      match: {\n        query: {\n          filter: /^\\w+$/, // Native RegExp\n          // Same as: { regex: { source: '^\\\\w+$', flags: '' } }\n        },\n      },\n      response: { status: 200, body: { data: [] } },\n    },\n  ],\n};\n```\n\n**Both serialized and native RegExp patterns receive the same security validation.**\n\n### URL Pattern Matching Rules\n\nScenarist supports three pattern types with different hostname matching behaviors:\n\n**1. Pathname-only patterns** (origin-agnostic)\n\n```typescript\n{\n  url: \"/api/users/:id\";\n}\n```\n\n- **Matches ANY hostname** - environment-agnostic\n- Best for mocks that should work across localhost, staging, production\n- Example: `/api/users/123` matches requests to:\n  - `http://localhost:3000/api/users/123` ✅\n  - `https://staging.example.com/api/users/123` ✅\n  - `https://api.production.com/api/users/123` ✅\n\n**2. Full URL patterns** (hostname-specific)\n\n```typescript\n{\n  url: \"http://api.example.com/users/:id\";\n}\n```\n\n- **Matches ONLY the specified hostname** - environment-specific\n- Best for mocks that should only apply to specific domains\n- Example: `http://api.example.com/users/:id` matches:\n  - `http://api.example.com/users/123` ✅\n  - `http://localhost:3000/users/123` ❌ (different hostname)\n  - `https://api.example.com/users/123` ❌ (different protocol)\n\n**3. Native RegExp patterns** (origin-agnostic)\n\n```typescript\n{\n  url: /\\/users\\/\\d+/;\n}\n```\n\n- **Matches ANY hostname** - substring matching (MSW weak comparison)\n- Best for flexible pattern matching across environments\n- Example: `/\\/users\\/\\d+/` matches:\n  - `http://localhost:3000/users/123` ✅\n  - `https://api.example.com/api/v1/users/456` ✅\n  - Any URL containing `/users/` followed by digits ✅\n\n**Choosing the right pattern type:**\n\n```typescript\n// ✅ Use pathname patterns for environment-agnostic mocks\nconst defaultScenario = {\n  mocks: [\n    {\n      url: \"/api/products\", // Works in dev, staging, prod\n      response: { status: 200, body: { products: [] } },\n    },\n  ],\n};\n\n// ✅ Use full URL patterns when hostname matters\nconst productionOnlyScenario = {\n  mocks: [\n    {\n      url: \"https://api.production.com/admin\", // Only matches production\n      response: { status: 403, body: { error: \"Admin disabled in prod\" } },\n    },\n  ],\n};\n\n// ✅ Use RegExp for flexible pattern matching\nconst versionAgnosticScenario = {\n  mocks: [\n    {\n      url: /\\/api\\/v\\d+\\/users/, // Matches /api/v1/users, /api/v2/users, etc.\n      response: { status: 200, body: { users: [] } },\n    },\n  ],\n};\n```\n\n**IMPORTANT:** If you specify a hostname explicitly, it WILL be matched. Choose pathname patterns for flexibility, full URL patterns for control.\n\n### Common URL Pattern Examples\n\nHere are helpful regex patterns for common use cases:\n\n```typescript\n// API versioning - match any version number\n{\n  url: /\\/api\\/v\\d+\\//;\n}\n// Matches: /api/v1/, /api/v2/, /api/v10/, etc.\n\n// Numeric IDs only (reject non-numeric)\n{\n  url: /\\/users\\/\\d+$/;\n}\n// Matches: /users/123 ✅\n// Rejects: /users/abc ❌\n\n// File extensions\n{\n  url: /\\.json$/;\n}\n// Matches: /data.json, /api/users.json ✅\n// Rejects: /data.xml, /users ❌\n\n// Optional trailing slash\n{\n  url: /\\/products\\/?$/;\n}\n// Matches: /products ✅ and /products/ ✅\n\n// Multiple extensions\n{\n  url: /\\.(jpg|png|gif)$/i;\n}\n// Matches: image.jpg, photo.PNG, avatar.gif ✅\n\n// UUID format (simplified)\n{\n  url: /\\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n}\n// Matches: /550e8400-e29b-41d4-a716-446655440000 ✅\n\n// Subdomain matching\n{\n  match: {\n    headers: {\n      host: /^(api|cdn)\\.example\\.com$/;\n    }\n  }\n}\n// Matches: api.example.com, cdn.example.com ✅\n```\n\n### Security: ReDoS Protection\n\n⚠️ **IMPORTANT**: Both serialized and native RegExp patterns are validated using `redos-detector` to prevent ReDoS (Regular Expression Denial of Service) attacks.\n\n**Unsafe patterns are automatically rejected at scenario registration:**\n\n```typescript\n// ❌ REJECTED - Catastrophic backtracking\n{\n  url: /(a+)+b/;\n}\n// Error: Unsafe regex pattern detected\n\n// ❌ REJECTED - Exponential time complexity\n{\n  match: {\n    headers: {\n      referer: {\n        regex: {\n          source: \"(x+x+)+y\";\n        }\n      }\n    }\n  }\n}\n// Error: Unsafe regex pattern detected\n\n// ✅ SAFE - Linear time complexity\n{\n  url: /\\/api\\/[^/]+\\/users/;\n}\n// Matches safely with bounded backtracking\n```\n\nScenarist validates patterns before execution to protect your tests from denial-of-service attacks caused by malicious or poorly designed regex patterns.\n\n### Key Principles\n\n- **Declarative Patterns**: All types use explicit patterns, no imperative functions (ADR-0016)\n- **Dependency Injection**: Ports are injected, never created internally\n- **Immutability**: All data structures use `readonly`\n- **Factory Pattern**: Use `createScenarioManager()`, not classes\n- **Side Benefit**: Most scenarios CAN be JSON-serializable (when not using native RegExp)\n\n## Adapter Contract\n\nThe core package defines a **universal adapter contract** that all framework adapters (Express, Next.js, etc.) must implement. This ensures consistent API across all frameworks.\n\n### BaseAdapterOptions\n\nAll adapters must accept these base options:\n\n```typescript\ntype BaseAdapterOptions<T extends ScenaristScenarios> = {\n  readonly enabled: boolean;\n  readonly scenarios: T; // REQUIRED - scenarios object (must have 'default' key)\n  readonly strictMode?: boolean;\n  readonly headers?: {\n    readonly testId?: string;\n  };\n  readonly endpoints?: {\n    readonly setScenario?: string;\n    readonly getScenario?: string;\n  };\n  readonly defaultTestId?: string;\n  readonly registry?: ScenarioRegistry;\n  readonly store?: ScenarioStore;\n  readonly stateManager?: StateManager;\n  readonly sequenceTracker?: SequenceTracker;\n};\n```\n\n**IMPORTANT:** The `scenarios` object must include a `'default'` key. This is enforced at runtime via Zod validation in `buildConfig()`. The 'default' scenario serves as the baseline when no specific scenario is active.\n\nAdapters can extend this with framework-specific options:\n\n```typescript\n// Express adapter\ntype ExpressAdapterOptions<T extends ScenaristScenarios> =\n  BaseAdapterOptions<T> & { // Add Express-specific options if needed };\n\n// Next.js adapter\ntype NextJSAdapterOptions<T extends ScenaristScenarios> =\n  BaseAdapterOptions<T> & { // Add Next.js-specific options if needed };\n```\n\n### ScenaristAdapter<T, TMiddleware>\n\nAll adapters must return an object matching this contract:\n\n```typescript\ntype ScenaristAdapter<T extends ScenaristScenarios, TMiddleware = unknown> = {\n  readonly config: ScenaristConfig; // Resolved configuration\n  readonly middleware?: TMiddleware; // Framework-specific middleware (optional - Next.js doesn't have global middleware)\n  readonly switchScenario: (\n    testId: string,\n    scenarioId: ScenarioIds<T>,\n    variant?: string,\n  ) => ScenaristResult<void, Error>;\n  readonly getActiveScenario: (testId: string) => ActiveScenario | undefined;\n  readonly getScenarioById: (\n    scenarioId: ScenarioIds<T>,\n  ) => ScenaristScenario | undefined;\n  readonly listScenarios: () => ReadonlyArray<ScenaristScenario>;\n  readonly clearScenario: (testId: string) => void;\n  readonly start: () => void;\n  readonly stop: () => Promise<void>;\n};\n```\n\nThe generic parameters:\n\n- `T extends ScenaristScenarios`: The scenarios object type for type-safe scenario IDs\n- `TMiddleware`: Framework-specific middleware type\n\nExamples:\n\n- Express: `ScenaristAdapter<typeof scenarios, Router>`\n- Next.js: `ScenaristAdapter<typeof scenarios, never>` (no global middleware)\n\n### Implementation Example\n\n```typescript\n// Express adapter implementation\nexport const createScenarist = <T extends ScenaristScenarios>(\n  options: ExpressAdapterOptions<T>,\n): ScenaristAdapter<T, Router> => {\n  // Implementation automatically wires:\n  // - MSW server with dynamic handler\n  // - Test ID middleware\n  // - Scenario endpoints\n  // - Scenario manager\n  // - Registers all scenarios from scenarios object\n\n  // Register all scenarios upfront\n  Object.values(options.scenarios).forEach((scenario) => {\n    manager.registerScenario(scenario);\n  });\n\n  return {\n    config: resolvedConfig,\n    middleware: router, // Express Router\n    switchScenario: (id, scenario, variant) =>\n      manager.switchScenario(id, scenario, variant),\n    // ... all other required methods\n    start: () => server.listen(),\n    stop: async () => server.close(),\n  };\n};\n```\n\n### Benefits\n\n1. **TypeScript Enforcement**: Adapters must implement the full contract\n2. **Consistent API**: All adapters work the same way from user perspective\n3. **Framework Flexibility**: Each adapter can add framework-specific features\n4. **Future-Proof**: New frameworks can be added with guaranteed API consistency\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../CONTRIBUTING.md) for development setup and guidelines.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}