{"_id":"@playfast/reform","_rev":"22-d71f95a3793196d7681c774b28f87891","name":"@playfast/reform","dist-tags":{"next":"0.0.1","latest":"1.5.0"},"versions":{"0.0.1":{"name":"@playfast/reform","version":"0.0.1","license":"MIT","_id":"@playfast/reform@0.0.1","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"dist":{"shasum":"535b426807564b2ee8420994b07ebdb342758df3","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-0.0.1.tgz","fileCount":204,"integrity":"sha512-q7RGfdjg+NhHCbimsiDw1zSLHnem4BsipRWdvgS64wqOR1TISD1XUHX53a460qAh5W2JgAxLhypbrIyrWLf1zA==","signatures":[{"sig":"MEYCIQC9btlL/YvFE8+U9P+ud3qjrfTWa0bP/qwHdJoWmLVo3QIhAOPLWlJAVH1dhJGfAdc1YWFqT6IWIK8dn+ON4FSEUB8m","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":494883},"main":"./dist/cjs/index.js","type":"module","types":"./dist/dts/index.d.ts","module":"./dist/esm/index.js","exports":{".":{"types":"./dist/dts/index.d.ts","import":"./dist/esm/index.js","default":"./dist/cjs/index.js"},"./package.json":"./package.json"},"gitHead":"4aa3d17801cc7118d0e95aa401847e8746a39271","_npmUser":{"name":"play-fast","email":"company@play.fast"},"_npmVersion":"10.9.2","description":"The renderer-neutral primitives and runtime. Renders nothing itself (that is `@reform/react`); the whole core is headless and testable without a DOM.","directories":{},"sideEffects":[],"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_0.0.1_1781469403895_0.5459090134332603","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@playfast/reform","version":"0.0.2","license":"MIT","_id":"@playfast/reform@0.0.2","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"dist":{"shasum":"fe592ddf2b83b5cf9d5f8558aeceda1bbcbfbae1","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-0.0.2.tgz","fileCount":204,"integrity":"sha512-T40VjlguMJHlq+9z/rI635BYLKNnEglJClB9hLXabf2p/MSZDXTKcyGF12g28mpbkNnQgth0z0MIbfr2eZO5xg==","signatures":[{"sig":"MEYCIQDgnmRg50P6MUY29Qx4HQkges+JuNS0JXTsscP2E6AkUgIhANCOUKsVuElgomc+c8mxBI0ohSRQeA25VU3izf1+deY9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":515754},"main":"./dist/cjs/index.js","type":"module","types":"./dist/dts/index.d.ts","module":"./dist/esm/index.js","exports":{".":{"types":"./dist/dts/index.d.ts","import":"./dist/esm/index.js","default":"./dist/cjs/index.js"},"./package.json":"./package.json"},"gitHead":"4b99513da64fcffe312b2302bb42280380b007c4","_npmUser":{"name":"play-fast","email":"company@play.fast"},"_npmVersion":"10.9.2","description":"<div align=\"center\">","directories":{},"sideEffects":[],"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_0.0.2_1781510831462_0.19475579247369113","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@playfast/reform","version":"0.0.3","license":"MIT","_id":"@playfast/reform@0.0.3","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"dist":{"shasum":"169c29946515dd18dcf09f52b5a885688515df4e","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-0.0.3.tgz","fileCount":43,"integrity":"sha512-cXM8EYGr5Ul4nYysyqerAK7qy64OarcMTpZAoKwbJg5TT7+dAnt+Hbmbl05kZTGZQnsZZb2dQGJ7p67lhfMpTQ==","signatures":[{"sig":"MEYCIQC6WyrFZbqg81yunPbI/NJIBUdmyCOuaCCacqKl4jq8MgIhAP2pZOsDKzGapEU5hXU2EtPcyPo17bHjXWh2CCkeBVM8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":217709},"type":"module","exports":{".":"./src/index.ts","./package.json":"./package.json"},"gitHead":"30b0719d0e3e8da1c06310fb42e71b2b2bad32eb","scripts":{"test":"vitest run","typecheck":"tsc --noEmit"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"_npmVersion":"10.9.2","description":"<div align=\"center\">","directories":{},"sideEffects":[],"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_0.0.3_1781695508472_0.3052925231219872","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@playfast/reform","version":"0.0.4","license":"MIT","_id":"@playfast/reform@0.0.4","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"dist":{"shasum":"2e7db12b855e50bf4aa905ee1ac5de18c64eed92","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-0.0.4.tgz","fileCount":43,"integrity":"sha512-YIfgQ1PwZHwVKn7YjOreId7gh0b7Mflq1hNUrRCuC1aU+SRhqkU5ZU0zEjGNpcfScRXc51Wqml7ib8V7chX3OA==","signatures":[{"sig":"MEUCIQDf+nooSzFVwQeMg9dW7A8XYJaeGvY+5z9TpeDG6OU9qQIgTZThItGkzzhC7NKtEh3N3HO/nwFC3ag8CsuIe1KQyxU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":217709},"type":"module","exports":{".":"./src/index.ts","./package.json":"./package.json"},"scripts":{"test":"vitest run","typecheck":"tsc --noEmit"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"_npmVersion":"10.9.2","description":"<div align=\"center\">","directories":{},"sideEffects":[],"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_0.0.4_1781708502295_0.9135670351788894","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@playfast/reform","version":"0.0.5","license":"MIT","_id":"@playfast/reform@0.0.5","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"dist":{"shasum":"de4bde5ee31fc88bf3ae5de7599713866f6d4ddb","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-0.0.5.tgz","fileCount":43,"integrity":"sha512-CQQ3sv3Wg0cMTC6pwHkHHVwm1rHiGSgvEEHdjfaU93XbntdHJGTpHntuMGPOt6t/Hh6+4ppZrIuBIgdDwIZwvQ==","signatures":[{"sig":"MEQCIGuAod26U0ujelc2uo3jrw4B3L4lEBmmkH3aHaSzpCSBAiB1Ub9x+MH32OJgEkcjkpOlUbYUaIonC8bFpWl8wWMH4w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":217692},"type":"module","exports":{".":"./src/index.ts","./package.json":"./package.json"},"scripts":{"test":"vitest run","typecheck":"tsc --noEmit"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"_npmVersion":"10.9.2","description":"<div align=\"center\">","directories":{},"sideEffects":[],"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_0.0.5_1781711864759_0.7951850829303515","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"@playfast/reform","version":"0.0.7","keywords":["reform","effect","state-management","headless","framework","reactive"],"license":"MIT","_id":"@playfast/reform@0.0.7","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"1ee7a6a62836ee9c0c8669cdb515add92733b91b","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-0.0.7.tgz","fileCount":182,"integrity":"sha512-ee5WZqIJZ6it89PeHWVUr9kw8ix1kKJdyEvEQB1PSkiY0JpCsHcHMYUMnCwL+qvGTByYVQc35CBUT26AffWjrw==","signatures":[{"sig":"MEUCIQCo6s/0n2llhGD+VEPPL64nzztjS8dJMvhogGS16r+VnQIgHIAWi9jMKHl1ZlPwzAjUl4EpubPmJ3pGFQOnFRpBmpU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":438352},"type":"module","exports":{".":"./src/index.ts","./*":"./src/*.ts","./package.json":"./package.json"},"gitHead":"65217e8fa0b2947065da4b70c8f16b078104221e","scripts":{"lint":"oxlint src","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_0.0.7_1782130759066_0.8956214449714626","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"@playfast/reform","version":"0.0.8","keywords":["reform","effect","state-management","headless","framework","reactive"],"license":"MIT","_id":"@playfast/reform@0.0.8","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"0db1d300b85c2c351734ff73143ee2ec164e2a78","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-0.0.8.tgz","fileCount":70,"integrity":"sha512-q+eVIWIkDRZ26GtavkYQ8fnVZ9+lVcoI1o+QL8mON1kBJMEtKkjP1XqdbckoWMrni1YsSzNia+AaZUBHzU18ZQ==","signatures":[{"sig":"MEUCIENq5Oys6ZyFwxEXAKnCc7T2iGkTnIKgJ00nDfy4ggahAiEAstZbCuLr0W03KhQSlfe1Hx2NpSG8CeF15S9bpsnp3NQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":390156},"type":"module","exports":{".":"./src/index.ts","./*":"./src/*.ts","./package.json":"./package.json"},"gitHead":"bc3f52e10c5d9d1c59b08e0d54095842a33859e1","scripts":{"lint":"oxlint src","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_0.0.8_1782138408618_0.20054673300112547","host":"s3://npm-registry-packages-npm-production"}},"0.0.9":{"name":"@playfast/reform","version":"0.0.9","keywords":["reform","effect","state-management","headless","framework","reactive"],"license":"MIT","_id":"@playfast/reform@0.0.9","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"5bbffda90489b1084201331e943faeeab86881e5","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-0.0.9.tgz","fileCount":72,"integrity":"sha512-ieYpbPKItPz2L+ISK+SRMLqNQRUW6avQKuQRTOk06xX4Twd3JAnaKOQWNlpHkSk6aTBIC4hzF+kVeJe24iAkiw==","signatures":[{"sig":"MEQCICp6U4DwakHgiiq2g0u8DlV7lOsuyKrdBKGGsEFR2IdUAiB4HCOPzb6r8Q/9pcAGqn7rp/qD8AxYqWyY0SsBjyCCVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":402474},"type":"module","exports":{".":"./src/index.ts","./*":"./src/*.ts","./package.json":"./package.json"},"scripts":{"lint":"oxlint src","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_0.0.9_1782168445445_0.9696588730501894","host":"s3://npm-registry-packages-npm-production"}},"0.0.10":{"name":"@playfast/reform","version":"0.0.10","keywords":["reform","effect","state-management","headless","framework","reactive"],"license":"MIT","_id":"@playfast/reform@0.0.10","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"d9902f93e1a91a2f3a0575d79b525333b50d4f34","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-0.0.10.tgz","fileCount":77,"integrity":"sha512-DdQ6OS6ah+Mn1642+AqKJb5iaBPAcrJTZbBn+zIjmB++At5xzosWnJq2LW38DCvp/Lcj+/JTbNeB5jAmxArRSg==","signatures":[{"sig":"MEYCIQCdU0qommp3aYhElBvpoyyjTdAOxeX/LQQlJ4NMUHOT5gIhAPHwZgVJQFqyT0ibA3pzhfM7YQLBD/GcvFIbSl5N1cx5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":425318},"type":"module","exports":{".":"./src/index.ts","./*":"./src/*.ts","./package.json":"./package.json"},"gitHead":"3022cf7b6e3b9b5bb9e280afcc91dc102573dce4","scripts":{"lint":"oxlint src","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_0.0.10_1782647335516_0.37948828037760096","host":"s3://npm-registry-packages-npm-production"}},"0.0.11":{"name":"@playfast/reform","version":"0.0.11","keywords":["reform","effect","state-management","headless","framework","reactive"],"license":"MIT","_id":"@playfast/reform@0.0.11","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"61dfe538a42b17465ef9d7c90cd7a44ca9ba1690","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-0.0.11.tgz","fileCount":77,"integrity":"sha512-ivI2BrGVQhWinqmnikd8zVQshJDHUWYzg4OfFavXMs5CEUGYEZJbjrQIz4Iz0mhkwzStuc2C9sOpdanJgXFnpA==","signatures":[{"sig":"MEUCICH4xOpRFGgwjyAfaXMZg1wxeCtL3RlfsyenuDhUAeH1AiEAyHFDP4ebHuFM6jP6YNr7jBUIHErEovNFSeV2+RDHbGw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":460436},"type":"module","exports":{".":"./src/index.ts","./*":"./src/*.ts","./package.json":"./package.json"},"scripts":{"lint":"oxlint src","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_0.0.11_1782723704391_0.12890117241472332","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@playfast/reform","version":"0.1.0","keywords":["reform","effect","state-management","headless","framework","reactive"],"license":"MIT","_id":"@playfast/reform@0.1.0","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"0cd9470ed9e42e17d5e3b9b491c9f83f03e896cc","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-0.1.0.tgz","fileCount":77,"integrity":"sha512-XCtNMo+myNJ1IFr1/RLsN/pqXQYX+aa0lMsTVRpqW37ORDjgtuexNhdpr5h2xtRmfCqqmw6JEHPl2SNV/zF7IQ==","signatures":[{"sig":"MEUCIHZ22uhiA5qlpsAqNYl0ogxEiSM2IumjxkmtK58gJ3VxAiEAmB3cW4DG5ipGmegQC4wLFbSXcWca0230JFlkZi0l6DM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":460615},"type":"module","exports":{".":"./src/index.ts","./*":"./src/*.ts","./package.json":"./package.json"},"gitHead":"d39f209f4c15dfbfe5d6a7eba34c14c1446337ed","scripts":{"lint":"oxlint src","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_0.1.0_1783273322461_0.7783961779592365","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@playfast/reform","version":"1.0.1","keywords":["reform","effect","state-management","headless","framework","reactive"],"license":"MIT","_id":"@playfast/reform@1.0.1","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"692ca67ad68ff3c3e742fc552d0369cdc70cf962","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-1.0.1.tgz","fileCount":80,"integrity":"sha512-Vy5NIwe4Q9vPL5CgOJv2Mh2ujA/ug3EOMMoWihLw09SEfh9t4FCyjiwruelwiZVpJHDBChz2C55Ys8BGGHlvJw==","signatures":[{"sig":"MEUCIQDUjGlRDCxhNaEYRyAvFTZB6AtRP04sST4Mr0RJlS9L8QIgf7ocTg/+zReQDnLjOjCF/aty/xg+5ZJ0bsZrQWT4PWs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":488996},"type":"module","exports":{".":"./src/index.ts","./*":"./src/*.ts","./package.json":"./package.json"},"gitHead":"c1b2b13293e736c767f6c916d1afd1b316820de4","scripts":{"lint":"oxlint src","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_1.0.1_1783418117876_0.5725279830410901","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@playfast/reform","version":"1.1.1","keywords":["reform","effect","state-management","headless","framework","reactive"],"license":"MIT","_id":"@playfast/reform@1.1.1","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"e05972ed169a37f66a75fafa29b7f080d8e0ce02","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-1.1.1.tgz","fileCount":97,"integrity":"sha512-pdA2LtTvXoroCWAsmmIFTEdVWYQaw2EISG5z6Vsvi5Sab0r5enl8wftcxh/Bqb6CX+w8pBUZvk76eZW/BuUG0Q==","signatures":[{"sig":"MEYCIQDTvQ5gCav4c+r/t60rFYwmac8pxxDWLOq5BV8AOEc8fwIhAJnly76NnParrPlI8AuBsc+oCEnyqjx2pvUoB7Pl0T2S","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":390460},"type":"module","exports":{".":"./src/index.ts","./*":"./src/*.ts","./package.json":"./package.json"},"gitHead":"4edb486742279a92b26ac8089bf8e3f8c67e6c96","scripts":{"lint":"oxlint src","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_1.1.1_1784035799298_0.6829333446119557","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@playfast/reform","version":"1.2.0","keywords":["effect","framework","headless","reactive","reform","state-management"],"license":"MIT","_id":"@playfast/reform@1.2.0","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"890c0079928156f6c74d660e0358c7d911159836","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-1.2.0.tgz","fileCount":98,"integrity":"sha512-U0K2xI46eUXlcPSRhb1Hv+5hltGtDy8C+drwIt7Bwjxu5VjTqXg3TUIAteLTTHIag7yPJOgEpa9yvSCI/NZkqQ==","signatures":[{"sig":"MEQCIQCtJi2YBhZQ5s/o1N7P6RgmBN3XpgNxA27Qw46LY/cmmgIfLv54KdivstxOEwNy+6W9M/sN0EzbZtEmygXCcoj4Yw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":559727},"type":"module","exports":{".":"./src/index.ts","./*":"./src/*.ts","./package.json":"./package.json"},"gitHead":"e31a97b7939d6c971f73b11cc43cbf31bead3f79","scripts":{"lint":"oxlint src","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_1.2.0_1785754081353_0.6386172301707036","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@playfast/reform","version":"1.2.1","keywords":["effect","framework","headless","reactive","reform","state-management"],"license":"MIT","_id":"@playfast/reform@1.2.1","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"624e44604a5434c492450554b135e26bc2fe4f56","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-1.2.1.tgz","fileCount":121,"integrity":"sha512-2booBwu8eyuYlWcwPB3H7vi/i8l7kGyydT33/wuDL//FMCGZt8PZeVxY4hsTijiaPZbW040Sr4u9oZgvOaexYA==","signatures":[{"sig":"MEUCIQCT8e3rdViTmDokk3Z3skuA0lh1aWAR6Sb8+uYTEBoZFAIgYzyXGz0fHIgmY2Jv685x6pF1FZamHfRR9Lyn6ZegKXY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":592754},"type":"module","exports":{".":"./src/index.ts","./*":"./src/*.ts","./package.json":"./package.json"},"gitHead":"fcdfd63f7dfbacc26f48ae1be8e37f0cec2ed47e","scripts":{"lint":"oxlint src","test":"vitest run","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_1.2.1_1785946892322_0.566981559078237","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@playfast/reform","version":"1.3.0","keywords":["effect","framework","headless","reactive","reform","state-management"],"license":"MIT","_id":"@playfast/reform@1.3.0","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"5f04aa6db05cf90d5f5c6d07863c85eba45a8040","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-1.3.0.tgz","fileCount":454,"integrity":"sha512-HCYJJ2Zgak5Q7aNohMvUv2m+H6s/Wqsk+01t+SmR2P72YDKHkKQ2e4OtKS25gtUJm953MAmutxExSiK0qjMMnA==","signatures":[{"sig":"MEUCIQCItKyF6kzLMstrqH5A2crVsSeXrfOzKoOHcTdeoo1uygIgQYEU78UFs8bH7EowPEMes/G4AdvSVN9fwauNHDTPVlE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1268559},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","playfast-src":"./src/index.ts"},"./*":{"types":"./dist/*.d.ts","default":"./dist/*.js","playfast-src":"./src/*.ts"},"./package.json":"./package.json"},"gitHead":"1c475e7ca802ffbc82b8869afad5c5770dd46f75","scripts":{"lint":"oxlint src","test":"vitest run","build":"rm -rf dist .tsbuildinfo && tsc -p tsconfig.build.json && bun ../../scripts/fix-esm-extensions.ts dist","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","prepack":"bun run build","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_1.3.0_1786007483505_0.9162895010648293","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@playfast/reform","version":"1.4.0","keywords":["effect","framework","headless","reactive","reform","state-management"],"license":"MIT","_id":"@playfast/reform@1.4.0","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"56ba9c24b193d6f4c4dfc2a150111df83989354e","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-1.4.0.tgz","fileCount":504,"integrity":"sha512-4pnZRzu+OHCVH7v2xuJlE1MgrY5+WbCfvwurYQvnMP0aw1aaSj7Z3QXYBpj2bG0xmrElka93fa53HcivKSXmDA==","signatures":[{"sig":"MEUCIQCYH5sbp44jBxmAA4P7gpnTSrrJ5e5knS2g31aeAgoNTAIgN4UFs6ihwoi68MPH4Gmd/ep//k1Kw99FNbuTuaCw3RA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1527690},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","playfast-src":"./src/index.ts"},"./*":{"types":"./dist/*.d.ts","default":"./dist/*.js","playfast-src":"./src/*.ts"},"./package.json":"./package.json"},"gitHead":"b5850a3d4779bcaf073983cf17c2cd9f3b7f1b91","scripts":{"lint":"oxlint src","test":"vitest run","build":"rm -rf dist .tsbuildinfo && tsc -p tsconfig.build.json && bun ../../scripts/fix-esm-extensions.ts dist","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","prepack":"bun run build","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_1.4.0_1787341756590_0.4950657756701118","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@playfast/reform","version":"1.4.1","keywords":["effect","framework","headless","reactive","reform","state-management"],"license":"MIT","_id":"@playfast/reform@1.4.1","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"62bb081d8b96a165329ba2d8f7a1c9dd4cfaee48","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-1.4.1.tgz","fileCount":504,"integrity":"sha512-WYO5peceieUXnxiku5NwsIno9F87v2N8AbegtVdZm59rmUxUhMysybS788v8OHhN3x+x/MmQtItZsIcaknL0oQ==","signatures":[{"sig":"MEMCIDC54dSyjeuLB7xooLwiUz+pHeerb5S17fHso+m3bzyjAh9A+LHHMmnX9BUgU2t6lAoRkbh9t5OZZHyynyRepzBd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1530964},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","playfast-src":"./src/index.ts"},"./*":{"types":"./dist/*.d.ts","default":"./dist/*.js","playfast-src":"./src/*.ts"},"./package.json":"./package.json"},"scripts":{"lint":"oxlint src","test":"vitest run","build":"rm -rf dist .tsbuildinfo && tsc -p tsconfig.build.json && bun ../../scripts/fix-esm-extensions.ts dist","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","prepack":"bun run build","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_1.4.1_1787482729263_0.7062443847452222","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"@playfast/reform","version":"1.4.2","keywords":["effect","framework","headless","reactive","reform","state-management"],"license":"MIT","_id":"@playfast/reform@1.4.2","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"3de675ed2ae3e987d4942a20726fb8ddd5954d27","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-1.4.2.tgz","fileCount":505,"integrity":"sha512-WaHKV3wHWfbwDWiesfOwCLwk7z0q+QSJecTwp35ETvZf/FEoi+ZoeQrziF2lxfWGfKWbd6pwL/UIGFZWYyClZw==","signatures":[{"sig":"MEUCIQD/l8trGO/Pip4HuwskSRhQCfBgM/s4VWMuHUmTDYYbDQIgHbTb6qIvZyakIAUj926d7Suym4zGUA/agCrnrtVArRQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1536257},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","playfast-src":"./src/index.ts"},"./*":{"types":"./dist/*.d.ts","default":"./dist/*.js","playfast-src":"./src/*.ts"},"./package.json":"./package.json"},"gitHead":"ab0e01761248a12d6e8190c43738ad8bc363466e","scripts":{"lint":"oxlint src","test":"vitest run","build":"rm -rf dist .tsbuildinfo && tsc -p tsconfig.build.json && bun ../../scripts/fix-esm-extensions.ts dist","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","prepack":"bun run build","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_1.4.2_1789662011378_0.957327016861061","host":"s3://npm-registry-packages-npm-production"}},"1.4.3":{"name":"@playfast/reform","version":"1.4.3","keywords":["effect","framework","headless","reactive","reform","state-management"],"license":"MIT","_id":"@playfast/reform@1.4.3","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"e949e1582203c7d5ccc95930ba007206c8ddaf0e","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-1.4.3.tgz","fileCount":517,"integrity":"sha512-xUdndWzI5M6WFAig2WtoxpPI5AY2ekLeltNUmfgZkPGKk1J+B6mOLd3FwChdMs+6KRaB1lrylNZKNn75RgeXBA==","signatures":[{"sig":"MEYCIQDwZWhLPN3oZWkKSIU1H1/opHhidMhxJS8v5qG0v5EmNgIhANiuGSU7xP6ckS/SYz0wrplqw9rusdIYjWjYb4PFUd7Y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1564162},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","playfast-src":"./src/index.ts"},"./*":{"types":"./dist/*.d.ts","default":"./dist/*.js","playfast-src":"./src/*.ts"},"./package.json":"./package.json"},"gitHead":"9d6f56e08ff633c4736fb6689ec10b98aa1506b5","scripts":{"lint":"oxlint src","test":"vitest run","build":"rm -rf dist .tsbuildinfo && tsc -p tsconfig.build.json && bun ../../scripts/fix-esm-extensions.ts dist","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","prepack":"bun run build","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_1.4.3_1789666800189_0.6087838959818428","host":"s3://npm-registry-packages-npm-production"}},"1.4.4":{"name":"@playfast/reform","version":"1.4.4","keywords":["effect","framework","headless","reactive","reform","state-management"],"license":"MIT","_id":"@playfast/reform@1.4.4","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"homepage":"https://github.com/playfast/reform#readme","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"f14e29a5db8b13b2b0689c0f10475aa41666d3e2","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-1.4.4.tgz","fileCount":517,"integrity":"sha512-11ncTfmYkRNdMdPhHNjlD3Vh+eWdo/pxvrAMph5KM8bDAq/cEsMDdOM73naS8kXhqvmt0GtmX+ly275j2QpExA==","signatures":[{"sig":"MEQCICS1k1824GB2BaMHp0LLaxCZzUigRAldRsw1RJ2SIgZ7AiAy5nCIchzJgUQo/73ITlo/YZz3l9OmXPG7REsQINXqiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEJo2emjOJkZIAypwSdoUYmYBdMCZoHk5Kwal52SnOsbAiBR0yNw5a7qDIWyv3hcbr2OeH8qdhW7r7HhUteK43yNGw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1564162},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","playfast-src":"./src/index.ts"},"./*":{"types":"./dist/*.d.ts","default":"./dist/*.js","playfast-src":"./src/*.ts"},"./package.json":"./package.json"},"gitHead":"7467a311788514b1535a3dbfd215e96fd885bd38","scripts":{"lint":"oxlint src","test":"vitest run","build":"rm -rf dist .tsbuildinfo && tsc -p tsconfig.build.json && bun ../../scripts/fix-esm-extensions.ts dist","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","prepack":"bun run build","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"_npmUser":{"name":"play-fast","email":"company@play.fast"},"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/reform_1.4.4_1790685666355_0.5481945391148615","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"_id":"@playfast/reform@1.5.0","bugs":{"url":"https://github.com/playfast/reform/issues"},"dist":{"shasum":"64db53868526d339a62f1f891d9c432472aedba2","tarball":"https://registry.npmjs.org/@playfast/reform/-/reform-1.5.0.tgz","fileCount":546,"integrity":"sha512-j19sIJgu6agXbDIx+SKyJQwKn4Vj1gHwzYtNzqZFBPMWKjR6OoQseG+qGsLdohCq3cvuHnhu2TvlOPwUXdNrNw==","signatures":[{"sig":"MEUCIQC/h5TnoUN3AGySsMRaY/sT97Xg/v9v4SHB4FK3v17QQwIgKWAQuPUp5YhiCtR0HvARj5XrrFE64NSAROhtgEVK2l8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFGzPOS9lCxgCCgUhq4yrVj79Ex6dYQyZXzOIWVKGRfyAiEAiQnS/N/opyLzMZ8axe9iiBZOb2qHkPYKRjqSZ5g+akE="}],"unpackedSize":1700635},"main":"./dist/index.js","name":"@playfast/reform","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","playfast-src":"./src/index.ts"},"./*":{"types":"./dist/*.d.ts","default":"./dist/*.js","playfast-src":"./src/*.ts"},"./package.json":"./package.json"},"gitHead":"0d12a915814ce2aa0f02db5a010f2520b14fffda","license":"MIT","scripts":{"lint":"oxlint src","test":"vitest run","build":"rm -rf dist .tsbuildinfo && tsc -p tsconfig.build.json && bun ../../scripts/fix-esm-extensions.ts dist","check":"tsc --noEmit","clean":"rm -rf dist .tsbuildinfo","prepack":"bun run build","coverage":"vitest run --coverage","lint:fix":"oxlint --fix src","test:watch":"vitest"},"version":"1.5.0","_npmUser":{"name":"play-fast","email":"company@play.fast"},"homepage":"https://github.com/playfast/reform#readme","keywords":["effect","framework","headless","reactive","reform","state-management"],"playbook":"./playbook","repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"_npmVersion":"10.9.2","description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","directories":{},"maintainers":[{"name":"play-fast","email":"company@play.fast"}],"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","effect":"*"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/reform_1.5.0_1790697719854_0.019703237937347406"}}},"time":{"created":"2026-06-14T20:36:43.686Z","modified":"2026-09-29T16:02:00.244Z","0.0.1":"2026-06-14T20:36:44.072Z","0.0.2":"2026-06-15T08:07:11.604Z","0.0.3":"2026-06-17T11:25:08.620Z","0.0.4":"2026-06-17T15:01:42.436Z","0.0.5":"2026-06-17T15:57:44.906Z","0.0.7":"2026-06-22T12:19:19.218Z","0.0.8":"2026-06-22T14:26:48.757Z","0.0.9":"2026-06-22T22:47:25.605Z","0.0.10":"2026-06-28T11:48:55.706Z","0.0.11":"2026-06-29T09:01:44.536Z","0.1.0":"2026-07-05T17:42:02.588Z","1.0.1":"2026-07-07T09:55:18.044Z","1.1.1":"2026-07-14T13:29:59.430Z","1.2.0":"2026-08-03T10:48:01.476Z","1.2.1":"2026-08-05T16:21:32.476Z","1.3.0":"2026-08-06T09:11:23.661Z","1.4.0":"2026-08-21T19:49:16.744Z","1.4.1":"2026-08-23T10:58:49.412Z","1.4.2":"2026-09-17T16:20:11.569Z","1.4.3":"2026-09-17T17:40:00.376Z","1.4.4":"2026-09-29T12:41:06.447Z","1.5.0":"2026-09-29T16:01:59.962Z"},"bugs":{"url":"https://github.com/playfast/reform/issues"},"license":"MIT","homepage":"https://github.com/playfast/reform#readme","keywords":["effect","framework","headless","reactive","reform","state-management"],"repository":{"url":"git+https://github.com/playfast/reform.git","type":"git","directory":"packages/reform"},"description":"The renderer-neutral core of the reform framework — typed, headless state, events, reducers, derived values, async/remote data, and compositions built on Effect.","maintainers":[{"name":"play-fast","email":"company@play.fast"}],"readme":"<div align=\"center\">\n\n# `@playfast/reform`\n\n**The renderer-neutral core of the reform framework.**\nState, events, reducers, derived values, async & remote data, and compositions — headless, typed end to end, and provable without a DOM.\n\n[![npm](https://img.shields.io/npm/v/@playfast/reform.svg)](https://www.npmjs.com/package/@playfast/reform)\n[![license](https://img.shields.io/npm/l/@playfast/reform.svg)](#license)\n[![built with Effect](https://img.shields.io/badge/built%20with-Effect-5a67d8.svg)](https://effect.website)\n\n</div>\n\n---\n\nreform is an application framework built on [Effect](https://effect.website). You describe your app as **definitions** — state, events, reducers, calculations, compositions — and provide their behavior **separately** as Effect layers. The core renders nothing: a host package ([`@playfast/reform-react`](https://www.npmjs.com/package/@playfast/reform-react), [`@playfast/reform-react-native`](https://www.npmjs.com/package/@playfast/reform-react-native)) turns a closed _scene_ into a live tree, and [`@playfast/reform-proof`](https://www.npmjs.com/package/@playfast/reform-proof) drives that same scene headlessly in tests. One model, three consumers, no seam between them.\n\n## Install\n\n```sh\nbun add @playfast/reform effect\n# npm install @playfast/reform effect   ·   pnpm add @playfast/reform effect\n```\n\n`effect` is a peer dependency. `react` is an optional peer (only the React-facing primitives need it).\n\n## Contents\n\n- [The core idea: definition / implementation split](#the-core-idea-definition--implementation-split)\n- [The model](#the-model)\n- **Reference**\n  - [State, StateGroup, StateFamily](#state)\n  - [Event, EventGroup](#event)\n  - [Reducer](#reducer)\n  - [Calc, CalcFamily](#calc)\n  - [AsyncCalc & AsyncData](#asynccalc)\n  - [RemoteState](#remotestate)\n  - [Boundary](#boundary)\n  - [Procedure & Channel](#procedure)\n  - [Composition, ui, slot, provide](#composition)\n  - [Feature (lazy code-splitting)](#feature)\n  - [Scene](#scene)\n  - [Engine & runtime surface](#engine)\n- [Putting it together](#putting-it-together)\n- [The reform family](#the-reform-family)\n- [License](#license)\n\n---\n\n## The core idea: definition / implementation split\n\nEvery primitive comes in two halves. `X.make(…)` is a **reflectable definition** — a manifest plus a DI tag, safe to import anywhere and to inspect. `X.live(…)` provides its **behavior** as a layer. Nothing self-registers on import, so the dependency graph is explicit, tree-shakeable, and fully testable.\n\n```ts\nimport { Schema as S } from 'effect'\nimport { State, Event, Reducer } from '@playfast/reform'\n\nclass Count extends State.make('count', S.Number) {}\nclass Bumped extends Event.make('Bumped', S.Struct({ by: S.Number })) {}\n\nclass Bump extends Reducer.make('Bump', { states: [Count], events: [Bumped] }) {}\nconst BumpLive = Reducer.live(Bump, (n, e) => n + e.by)\n```\n\nA `State` lives in a plain reactive store; reducers only _return_ values, so by construction they are the **only** writers. Reads return the current snapshot through Effect.\n\n### The primitives at a glance\n\n| primitive                                        | definition                                                               | implementation                     |\n| ------------------------------------------------ | ------------------------------------------------------------------------ | ---------------------------------- |\n| [`State` / `StateGroup` / `StateFamily`](#state) | `State.make(name, schema, opts?)`                                        | `.live(initial)`                   |\n| [`Event` / `EventGroup`](#event)                 | `Event.make(name, schema)`                                               | — (pure data)                      |\n| [`Reducer`](#reducer)                            | `Reducer.make(name, { states / family, events })`                        | `.live(fold)`                      |\n| [`Calc` / `CalcFamily`](#calc)                   | `Calc.make(name, { inputs, output })`                                    | `.live(fn)`                        |\n| [`AsyncCalc`](#asynccalc)                        | `AsyncCalc.make(name, { inputs, output, error?, alwaysOn? })`            | `.live({ query, … })`              |\n| [`RemoteState`](#remotestate)                    | `RemoteState.make(name, { inputs, output, error?, alwaysOn?, intents })` | `.live({ query, send, apply, … })` |\n| [`Boundary`](#boundary)                          | `Boundary.make(name, { over })`                                          | `.live({ once? })`                 |\n| [`Procedure`](#procedure)                        | `Procedure.make(name, { events, channel })`                              | `.live(fn*)`                       |\n| [`Channel`](#procedure)                          | `Channel.make(name, { policy })`                                         | `.live()`                          |\n| [`Composition`](#composition)                    | `Composition.make(name, manifest)`                                       | `.live(fn*)`                       |\n| [`ui` / `slot`](#composition)                    | `ui(name)<C>()` / `slot(name, identity)<Comp>()`                         | `Ui.make` / `provide`              |\n| [`Feature`](#feature)                            | `Feature.make(name, config)`                                             | (eager `module` / lazy `load`)     |\n\n## The model\n\n```\nUI trigger ──► Bus (High) ─┐\n                           ├─► reduce loop ──► reducers (the only writers) ──► stores\nprocedure  ──► Bus (Normal)┘                          │\n   ▲                                                   ▼\n   └────────────── reads state, dispatches ◄──── calc (derived, memoized)\n```\n\n- **The bus** is one `PubSub`. A central drain loop batches events per microtask and runs matching reducers — `High`-priority (UI) folds before `Normal`-priority (procedure) folds within a frame. **Procedures** consume the bus on their own forked fibers, scheduled by their **channel**'s concurrency policy.\n- **Derived reads** take any `Source` (a state member, a `Calc`, an `AsyncCalc`, a `RemoteState`) and accept an optional `invalidateBy` key projection that bounds recompute to a value-equal key change.\n- **Notifications** coalesce into a single microtask flush, which the host's `useSyncExternalStore` bridge binds to.\n\n---\n\n<a name=\"state\"></a>\n\n## State · StateGroup · StateFamily\n\nReactive stores held outside Effect. Reducers are the sole writers; everything else reads.\n\n### `State`\n\n```ts\nState.make(name, schema, options?)      // → StateClass\nState.live(State, initial)              // → Layer<Store<value>>\n```\n\n`options` is `{ title?, description? }` (reflectable metadata). A `State` class is itself yieldable — `yield* Count` reads its current value.\n\n### `StateGroup`\n\nA bundle of related states provided together. `StateGroup.select(Group, 'name')` returns a `StateToken` (a `Source`) used both as a calc input and as a yieldable read.\n\n```ts\nimport { State, StateGroup } from '@playfast/reform'\n\nclass Count extends State.make('count', S.Number) {}\nclass Step extends State.make('step', S.Number) {}\nclass Counter extends StateGroup.make(Count, Step) {}\n\nconst CounterLive = StateGroup.live(Counter, { count: 0, step: 1 }) // all members required\n\n// read inside any Effect / composition:\nconst count = yield * StateGroup.select(Counter, 'count')\n```\n\n### `StateFamily`\n\nA keyed collection — one store per key over a shared schema.\n\n```ts\nStateFamily.make(name, keySchema, valueSchema, options?)   // → StateFamilyClass\nStateFamily.live(Family, initial | (key) => value, { evictWhenUnused? }?)\n\nclass Items extends StateFamily.make('items', S.String, ItemSchema) {}\nconst ItemsLive = StateFamily.live(Items, (id) => blankItem(id), { evictWhenUnused: true })\n\nconst item = yield* StateFamily.read(Items, id)\n```\n\n`evictWhenUnused: true` ref-counts each key and drops it on the next microtask once its last subscriber leaves (re-access re-seeds from `initial`). A family reducer fold may return `StateFamily.Tombstone` to evict a key.\n\n> **`StateToken` / `Source` / `AnySource`** — `Source<N, A>` is the structural shape (`{ name, store }`) that `StateToken`, `Calc`, `AsyncCalc`, and `RemoteState` all satisfy, so any of them can feed a calc's `inputs`. `AnySource = Source<string, any>`.\n\n---\n\n<a name=\"event\"></a>\n\n## Event · EventGroup\n\nEvents are pure tagged data — definitions only, no `.live`.\n\n```ts\nEvent.make(name, schema) // → EventClass; EventOf<N, P> = { _tag: N } & P\nEventGroup.make(...events) // → bundle, used in Reducer/Composition manifests\n\nclass LoadedTodos extends Event.make('LoadedTodos', S.Struct({ todos: S.Array(Todo) })) {}\n```\n\n**Dispatching.** Two idioms, two priorities:\n\n```ts\n// From a UI view — High priority, synchronous:\nconst toggle = yield * Event.trigger(ToggledTodo) // toggle: (payload) => void\n// ...later: <input onChange={() => toggle({ id })} />\n\n// From a procedure — Normal priority:\nyield * Event.dispatch(TodoUpserted, { todo })\n```\n\n`Event.trigger` returns a plain callback (`Trigger<P>`) you hand to the view; `Event.dispatch` returns an `Effect` you yield inside logic.\n\n---\n\n<a name=\"reducer\"></a>\n\n## Reducer\n\nThe only writers of state. A fold is a **pure, synchronous** `(value, event) => value` (async values throw at startup).\n\n```ts\nReducer.make(name, { states: [State], events: [...] })            // state reducer\nReducer.make(name, { family: Family, keyOf, events: [...] })      // family reducer\nReducer.live(Reducer, fold)\n```\n\nState reducers receive and return the whole state value; family reducers receive and return one entry (or `StateFamily.Tombstone`). The idiomatic fold matches on the event tag with Effect's `Match`:\n\n```ts\nimport { Match } from 'effect'\n\nconst FeedReducerLive = Reducer.live(FeedReducer, (feed, event) =>\n  Match.value(event).pipe(\n    Match.tags({\n      StartedLoading: (): Feed => ({ _tag: 'Loading' }),\n      LoadedTodos: ({ todos }): Feed => ({ _tag: 'Ok', todos }),\n      FailedTodos: ({ message }): Feed => ({ _tag: 'Error', message }),\n      TodoRemoved: ({ id }) =>\n        onOk(\n          feed,\n          Array.filter((t) => t.id !== id),\n        ),\n    }),\n    Match.exhaustive,\n  ),\n)\n```\n\nAn event outside the reducer's declared `events` never reaches the fold; the drain loop owns every `store.set`, so logic can never write state directly.\n\n---\n\n<a name=\"calc\"></a>\n\n## Calc · CalcFamily\n\nSynchronous derived values — memoized projections over one or more sources.\n\n```ts\nCalc.make(name, { inputs, output })                 // inputs: ReadonlyArray<Source>\nCalc.live(Calc, (inputs) => output, { invalidateBy?, reuse? }?)\n\nclass IsPositive extends Calc.make('IsPositive', {\n  inputs: [StateGroup.select(Counter, 'count')],\n  output: S.Boolean,\n}) {}\nconst IsPositiveLive = Calc.live(IsPositive, ({ count }) => count > 0)\n\nconst positive = yield* IsPositive          // read the memoized value\n```\n\n`inputs` are keyed in the compute argument by each source's **name**. A calc recomputes only when its invalidation key changes (default: all input values; override with `invalidateBy: (inputs) => [...]`). `reuse: true` does structural sharing on the output, keeping unchanged subtree identities stable across recomputes.\n\n**`CalcFamily`** parameterizes a calc by key, one memoized store per key over shared inputs — each member notifies only its own subscribers:\n\n```ts\nclass GroupView extends CalcFamily.make('GroupView', {\n  key: GroupId,\n  inputs: [Board],\n  output: GroupSchema,\n}) {}\nconst GroupViewLive = CalcFamily.live(\n  GroupView,\n  (id) =>\n    ({ Board }) =>\n      project(Board, id),\n  { evictWhenUnused: true },\n)\n\nconst view = yield * CalcFamily.read(GroupView, groupId)\n```\n\n---\n\n<a name=\"asynccalc\"></a>\n\n## AsyncCalc & AsyncData\n\nServer reads with a stale-while-revalidate lifecycle. The query re-runs reactively from its inputs.\n\n```ts\nAsyncCalc.make(name, { inputs, output, error?, alwaysOn? })\nAsyncCalc.live(AsyncCalc, {\n  query,          // (inputs) => Effect<A, E, R>\n  invalidateBy?,  // (inputs) => ReadonlyArray<unknown> — refetch only when this key changes\n  invalidateOn?,  // ReadonlyArray<Event> — also refetch on these events\n  coalesce?,      // 'switch' (default, latest-wins) | 'trailing' (one trailing refetch after a burst)\n  reuse?,         // structural-share Success values across refetches\n  keepPreviousData?, // show the previous input key's result while the new key loads\n  disabled?,      // (inputs) => boolean — gate the query off (Idle); gatable calcs only\n})\n```\n\n- **A re-fetch is not a key change.** Re-validating the _same_ inputs keeps the last\n  `Success`/`Error` under `refetching: true`. When the **inputs move**, the retained\n  result answers a question no one is asking any more, so it is not shown: the value\n  reads `Loading` (or `Idle` when gated off) until the new key settles. Set\n  `keepPreviousData: true` to opt back into showing it — safe when the payload is only\n  displayed, unsafe when consumers read fields off it (a permission flag on the previous\n  key's row is a real hazard, not a flicker).\n\n- `error` omitted ⇒ the query is infallible (no `Error` arm). `alwaysOn: true` ⇒ no `Idle` arm and `disabled` is rejected.\n- Reading `yield* MyAsyncCalc` yields an **`AsyncData<A, E, Gated>`**:\n\n| arm            | `_tag`      | fields                | when                                                              |\n| -------------- | ----------- | --------------------- | ----------------------------------------------------------------- |\n| `AsyncIdle`    | `'Idle'`    | —                     | gated query is `disabled`                                         |\n| `AsyncLoading` | `'Loading'` | —                     | first fetch, or the inputs moved and the new key is still loading |\n| `AsyncSuccess` | `'Success'` | `value`, `refetching` | succeeded (`refetching: true` while re-fetching)                  |\n| `AsyncError`   | `'Error'`   | `error`, `refetching` | failed                                                            |\n\n```ts\nclass Doubled extends AsyncCalc.make('Doubled', {\n  inputs: [StateGroup.select(Counter, 'count')],\n  output: S.Number,\n  alwaysOn: true,\n}) {}\nconst DoubledLive = AsyncCalc.live(Doubled, {\n  query: ({ count }) => Effect.succeed(count * 2),\n})\n\nconst data = yield * Doubled\nMatch.value(data).pipe(\n  Match.tag('Loading', () => spinner),\n  Match.tag('Success', ({ value }) => render(value)),\n  Match.exhaustive,\n)\n```\n\n---\n\n<a name=\"remotestate\"></a>\n\n## RemoteState\n\nServer-owned state with optimistic mutations, fused into one primitive. **Remote state is derived-only:** the only writer is the server, the only write surface is dispatching a declared _intent_, and the visible value is `pending.reduce(apply, serverTruth)`.\n\n```ts\nRemoteState.make(name, { inputs, output, error?, alwaysOn?, intents })   // intents: Event definitions\nRemoteState.live(Remote, {\n  query,          // (inputs) => Effect<A, E, R>      — same as AsyncCalc\n  send,           // (intent) => Effect<_, _, R2>     — deliver one intent to the server\n  apply,          // (value, intent) => value         — pure, total, idempotent overlay fold\n  channel?,       // send lane (default: a generated `merge` channel)\n  invalidateBy?, invalidateOn?, coalesce?, reuse?, disabled?,            // inherited\n})\n```\n\nClass surface:\n\n- `yield* Board` → the **overlaid** `AsyncData<A, E, Gated>` (server truth with pending intents applied).\n- `Board.truth` → the un-overlaid query lifecycle (a `Source`), for chrome that must show raw server state.\n- `Board.pending` → read-only `Source` of `ReadonlyArray<PendingIntent<I>>` (`{ opId, intent, status: 'sending' | 'confirmed' }`).\n- `Board.Failed` → a public `Event` carrying `FailedIntent` (`{ intent, error }`) for toasts / retry UX.\n\n```ts\nclass Board extends RemoteState.make('Board', {\n  inputs: [Session, StateGroup.select(Router, 'route')],\n  output: BoardSnapshot,\n  error: S.String,\n  intents: [ItemAddIntent, ItemRenameIntent],\n}) {}\n\nconst BoardLive = RemoteState.live(Board, {\n  query: ({ route }) => loadBoard(route.boardId),\n  send: (intent) =>\n    Match.value(intent).pipe(\n      Match.tag('ItemAddIntent', ({ groupId, name }) => client.AddItem({ groupId, name })),\n      Match.tag('ItemRenameIntent', ({ itemId, name }) => client.RenameItem({ id: itemId, name })),\n      Match.exhaustive,\n    ),\n  apply: (snapshot, intent) => applyIntent(snapshot, intent), // idempotent\n  invalidateOn: [BoardChanged],\n  coalesce: 'trailing',\n})\n```\n\n**Semantics.** A dispatched intent appends to the queue and appears in the overlay in the same flush. On send failure the intent settles immediately and `Board.Failed` fires — there is **no rollback machinery**, the derivation just converges. The **generation rule** guarantees an optimistic change never flickers out between the RPC confirming and the refetch landing: an intent acked at query generation _g_ is settled only by a later-generation `Success` run.\n\n---\n\n<a name=\"boundary\"></a>\n\n## Boundary\n\nMerges the lifecycle arms of several async sources into one first-load signal, so a subtree shows a single fallback instead of per-query spinners.\n\n```ts\nBoundary.make(name, { over })          // over: ReadonlyArray<AsyncCalc | RemoteState | ...>\nBoundary.live(Boundary, { once? }?)\n\nclass BootBoundary extends Boundary.make('BootBoundary', { over: [Session, BootstrapQuery, Board] }) {}\nconst BootBoundaryLive = Boundary.live(BootBoundary, { once: true })\n\nconst boot = yield* BootBoundary   // BoundaryState\n```\n\n`yield* BootBoundary` yields a `BoundaryState`:\n\n- **`BoundaryPending`** — some source is on its first load.\n- **`BoundaryReady`** — every source has settled (`Success`, even `refetching`, or a deliberately gated `Idle`).\n- **`BoundaryErrored`** — a source errored before first value; carries `errors: ReadonlyArray<unknown>`.\n\n`once: true` latches: once `Ready`, it stays `Ready` (a boot boundary won't re-splash when a later navigation first-loads a route-gated query). It latches only on converged values, never mid-flush.\n\n---\n\n<a name=\"procedure\"></a>\n\n## Procedure & Channel\n\nProcedures are side-effecting reactions to events, running on forked fibers. A **channel** is the named concurrency lane they run on.\n\n```ts\nChannel.make(name, { policy })    // policy: 'merge' | 'latest' | 'debounce' | 'throttle' | 'exclusive'\nChannel.live(Channel)\n\nProcedure.make(name, { events, channel })\nProcedure.live(Procedure, function* (event) { … })\n```\n\nThe generator body receives the matched event, can read services from context, and dispatches follow-up events with `Event.dispatch`:\n\n```ts\nclass ActionsChannel extends Channel.make('Actions', { policy: { _tag: 'merge' } }) {}\n\nclass CreateTodo extends Procedure.make('CreateTodo', {\n  events: [SubmittedNewTodo],\n  channel: ActionsChannel,\n}) {}\nconst CreateTodoLive = Procedure.live(CreateTodo, function* (event) {\n  const client = yield* TodosClient\n  const result = yield* Effect.either(client.AddTodo({ text: event.text }))\n  yield* Match.value(result).pipe(\n    Match.tags({\n      Right: ({ right }) => Event.dispatch(TodoUpserted, { todo: right }),\n      Left: ({ left }) => Event.dispatch(FailedTodos, { message: String(left) }),\n    }),\n    Match.exhaustive,\n  )\n})\n```\n\nPolicies: `merge` (unbounded concurrency), `latest` (new event cancels the in-flight run), `exclusive` (serialized), `debounce`/`throttle` (rate-shaping). Many procedures may share one channel.\n\n---\n\n<a name=\"composition\"></a>\n\n## Composition · ui · slot · provide\n\nA **composition** is a unit of logic that reads state and renders a typed UI contract. The contract (`ui`) and its presentation are authored separately, so logic stays renderer-neutral.\n\n```ts\n// 1. declare the contract — props the view receives, events it can fire\nclass CounterUi extends ui('Counter')<{\n  props: { count: number }\n  events: { bump: Trigger<{}> }\n}>() {}\n\n// 2. declare the composition and what it reads\nclass Counter extends Composition.make('Counter', { ui: CounterUi, states: [Count] }) {}\n\n// 3. implement the logic — read sources, return the view applied to computed props\nconst CounterLive = Composition.live(Counter, function* () {\n  const count = yield* StateGroup.select(Counters, 'count')\n  const bump  = yield* Event.trigger(Bumped)\n  const view  = yield* CounterUi\n  return view({ count }, { bump })\n})\n\n// 4. provide a presentation for the contract (DOM/native/custom)\nconst CounterView = provide(CounterUi, Ui.make(CounterUi, ({ count }, _slots, { bump }) =>\n  <button onClick={() => bump({})}>{count}</button>\n))\n```\n\n- **`Composition.make(name, manifest)`** — manifest declares `ui` plus the `states` / `calcs` / `events` / `slots` it touches (all reflectable).\n- **`Composition.live(comp, fn*)`** — the generator reads sources and returns a `Node` (the view applied to props/events).\n- **`slot(name, identity)<Comp>()`** — a hole a parent composition declares (`slots: { body: BodySlot }`) and fills with `provide(BodySlot, ChildComposition)` (or a `Feature`). Declare `identity` as a named module-level unique symbol (`const BodySlotIdentity: unique symbol = Symbol('BodySlot')`); `Symbol.for(...)` and inline `Symbol(...)` arguments are forbidden. Reform generates a separate runtime key for every slot definition, while `name` remains a display label, so independently authored same-name slots remain distinct. Children render through the host.\n- **`provide(...)`** — binds a UI presentation to a contract, or fills a slot with a composition / feature. Returns a `Layer`.\n\n---\n\n<a name=\"feature\"></a>\n\n## Feature\n\nThe lazy/eager code-split unit. Definitions stay eager and reflectable; the heavy implementation can load on demand as an **Effect** (never a bare Promise), so code-splitting composes with the rest of the layer graph.\n\n```ts\nimport { Feature, featureModule, lazyImport, mountFeature } from '@playfast/reform'\n\n// eager: ship the module with the definition\nclass Counter extends Feature.make('counter', {\n  composition: CounterComp,\n  module: featureModule([], CounterLive),\n  boot: [Event.construct(Tick, {})],\n}) {}\n\n// lazy: defer the module behind an import\nclass Reports extends Feature.make('reports', {\n  loadingStrategy: 'lazy',\n  composition: ReportsComp,\n  load: lazyImport(() => import('./reports.module')),\n  eager: featureModule([], PlaceholderLive),\n  placeholder: { loading: SpinnerComp, failed: RetryComp },\n}) {}\n```\n\nA feature's `requires` tuple accepts shared State/Calc carriers, StateGroups, and\nordinary Effect `Context.Tag`s. A lazy feature shares the app's engine but gets\nits own scope — `mountFeature(binding, parentContext)` loads it, builds its layer\nagainst the immediate parent, dispatches its boot events, and disposes everything\nwhen the scope closes. Fill a slot with one via `provide(SomeSlot, Reports)`;\n`provide` merges its optional eager placeholder module automatically while the\nhost paints the placeholders and loads the main module.\n\nDefault Features retain their binding identity too. Their module is merged by\n`provide`, their composition renders synchronously from the parent runtime, and\ntheir boot events run once for each keyed activation.\n\n---\n\n<a name=\"scene\"></a>\n\n## Scene\n\nA scene bundles a root composition with the closed wiring that runs it — the single handle the React host, React Native host, and proofs all consume.\n\n```ts\nscene(composition, { provide: [...layers], boot?: [...events] })   // → Scene\nfeatureScene(eagerFeature, { provide: closedEnvironment })         // → Scene\nseedScene(base, seeds)                                             // tooling: override seed values\nisScene(value)                                                     // reflection guard\n\nconst AppScene = scene(AppRoot, {\n  provide: [Engine, AppStateLive, AppLogicLive, AppViews],\n  boot: [Event.construct(AppStarted, {})],\n})\n```\n\n`provide` is the list of layers that close the app (they must resolve to `MountedServices` — every composition's render service plus the `Bus`). Hand the scene to [`@playfast/reform-react`](https://www.npmjs.com/package/@playfast/reform-react) to mount or to [`@playfast/reform-proof`](https://www.npmjs.com/package/@playfast/reform-proof) to assert. `seedScene` overlays seed values onto already-closed layers (used by the dev tool to preview alternative initial state).\n\n`featureScene` is the typed root helper for a default/eager Feature. Its `provide`\nlayer closes the engine plus the Feature's declared requirements; lazy Features\nare rejected because an application root must be immediately available.\n\n---\n\n<a name=\"engine\"></a>\n\n## Engine & runtime surface\n\n`Engine` is the layer that ties a runtime together: it provides the `Bus` (one `PubSub`), the `Reducers` / `Channels` / `Procedures` registries, and forks the single drain loop. Merge it at the root of your app's layers:\n\n```ts\nimport { Engine } from '@playfast/reform'\n\nconst AppLayer = Layer.mergeAll(\n  Engine,\n  StateGroup.live(AppStates, AppSeeds),\n  AppReducersLive,\n  AppProceduresLive,\n  AppClientsLive,\n)\n```\n\nAlso exported for hosts and headless tests: `Bus` / `publish(priority, event)` / `Priority` (`'High' | 'Normal'`); the `Reducers` / `Channels` / `Procedures` registries and their `ReducerEntry` / `ProcedureEntry` shapes; `CaptureSink` (the capturing UI sink proofs assert against); the tagged errors (`AsyncReducer`, `AsyncSceneLayer`, `DuplicateRegistration`, `FeatureLoadFailed`, `InvalidProvideTarget`, `UnknownGroupState`); and the **notification scheduler** — `Notifications` / `notificationsLayer` / `makeScheduler` / `defaultScheduler`, which hosts provide upstream for per-runtime isolation (concurrent SSR, multiple mounted roots). Everything else coalesces on the process-wide default scheduler.\n\n---\n\n## Putting it together\n\nA minimal counter, end to end:\n\n```ts\nimport { Schema as S, Layer, Match } from 'effect'\nimport {\n  State, StateGroup, Event, Reducer, Composition, ui, provide, Ui, Engine, scene,\n  type Trigger,\n} from '@playfast/reform'\n\n// state + event + reducer\nclass Count extends State.make('count', S.Number) {}\nclass Counters extends StateGroup.make(Count) {}\nclass Bumped extends Event.make('Bumped', S.Struct({ by: S.Number })) {}\nclass Bump extends Reducer.make('Bump', { states: [Count], events: [Bumped] }) {}\n\n// contract + composition\nclass CounterUi extends ui('Counter')<{\n  props: { count: number }\n  events: { bump: Trigger<{ by: number }> }\n}>() {}\nclass Counter extends Composition.make('Counter', { ui: CounterUi, states: [Count] }) {}\n\nconst logic = Layer.mergeAll(\n  StateGroup.live(Counters, { count: 0 }),\n  Reducer.live(Bump, (n, e) => n + e.by),\n  Composition.live(Counter, function* () {\n    const count = yield* StateGroup.select(Counters, 'count')\n    const bump  = yield* Event.trigger(Bumped)\n    return (yield* CounterUi)({ count }, { bump })\n  }),\n)\n\n// a DOM presentation (rendered by @playfast/reform-react)\nconst view = provide(CounterUi, Ui.make(CounterUi, ({ count }, _s, { bump }) =>\n  <button onClick={() => bump({ by: 1 })}>count: {count}</button>\n))\n\nexport const CounterScene = scene(Counter, { provide: [Engine, logic, view] })\n```\n\nMount it with [`@playfast/reform-react`](https://www.npmjs.com/package/@playfast/reform-react), or prove it headlessly with [`@playfast/reform-proof`](https://www.npmjs.com/package/@playfast/reform-proof) — the same `CounterScene` value.\n\n---\n\n## The reform family\n\n| Package                                                                                          | Role                                 |\n| ------------------------------------------------------------------------------------------------ | ------------------------------------ |\n| **`@playfast/reform`**                                                                           | Renderer-neutral core (this package) |\n| [`@playfast/reform-react`](https://www.npmjs.com/package/@playfast/reform-react)                 | React / DOM host                     |\n| [`@playfast/reform-react-native`](https://www.npmjs.com/package/@playfast/reform-react-native)   | React Native host                    |\n| [`@playfast/reform-forms`](https://www.npmjs.com/package/@playfast/reform-forms)                 | Headless form state                  |\n| [`@playfast/reform-forms-react`](https://www.npmjs.com/package/@playfast/reform-forms-react)     | Typed JSX mapping for forms          |\n| [`@playfast/reform-proof`](https://www.npmjs.com/package/@playfast/reform-proof)                 | Headless testing toolkit             |\n| [`@playfast/reform-eslint-plugin`](https://www.npmjs.com/package/@playfast/reform-eslint-plugin) | Lint rules for reform conventions    |\n\n## License\n\nMIT\n","readmeFilename":"README.md"}