{"_id":"@jarenjs/forms","_rev":"27-2c00495e874c6587eb3254d6d5c7b546","name":"@jarenjs/forms","dist-tags":{"latest":"0.91.4"},"versions":{"0.9.2":{"name":"@jarenjs/forms","version":"0.9.2","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.9.2","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"a3dcfec934df6ffc1ee4484e0f0dac425b55839e","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.9.2.tgz","fileCount":15,"integrity":"sha512-CoqmyKdVY3uVVvPPCdlHE649VR68rfHx2LiviUN2u67thDP5gqOik80CbcohHojLjZyC/GJP0ZiCmhV+jThdVw==","signatures":[{"sig":"MEUCIQCdLXFefy+rMEVm4E15DYOz/feI6Tf8/YrvRNqZufjaRwIgLIADmrrrqESwly1yEYRaoRknpPVfY6GBC0vAr5+S0c0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77542},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"f189a33a97d152a1e13ca0c8e55e8af1a062adb8","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"10.9.7","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","dependencies":{"@jarenjs/core":"^0.9.2","@jarenjs/json":"^0.9.2","@jarenjs/formats":"^0.9.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.9.2_1784299384100_0.08392010687326179","host":"s3://npm-registry-packages-npm-production"}},"0.34.0":{"name":"@jarenjs/forms","version":"0.34.0","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.34.0","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"b6a49d90fcee2033c8b714512d12956536157ded","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.34.0.tgz","fileCount":21,"integrity":"sha512-EQZCe5QTT6hI06ThoQnFnTVJkYqjqdcGKOs1q7fgNir8SKNcyZQJtEwlOsyZaDDsgLzyXyq2QlsfgTDQ4nOwIg==","signatures":[{"sig":"MEUCIEA69gcY/St7j5met2b5Z2YdUNuI1jwhV+0ZOi74sdwEAiEAtAWyEonzLMLoh5EfdKqQvIrI4suOgPBv2o8Ng2YhaBM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173162},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"2c2376a53a0905e8adbca04e3cc2510c358d3462","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@jarenjs/core":"^0.34.0","@jarenjs/json":"^0.34.0","@jarenjs/formats":"^0.34.0","@jarenjs/validate":"^0.34.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.34.0_1786632476028_0.1063826410801294","host":"s3://npm-registry-packages-npm-production"}},"0.34.2":{"name":"@jarenjs/forms","version":"0.34.2","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.34.2","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"a9eb6c4b139c0d1d20878681aaa68308c597c0c3","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.34.2.tgz","fileCount":21,"integrity":"sha512-Entq3et11pQxA3SRBNaXce+Pjm5t6raQ5/IKLwId9xVPtE8/jV5bSyby/RJYephJTfpIjJJ+0Qr7AC2iZJjEkg==","signatures":[{"sig":"MEYCIQCCmfBe/iIseJ7c1toGh4ngN74I7ESm45rWcSKeY09qQwIhAMEM3iBaNgKUOTvW3IYEJ/R3+4xB7I2WjD63u7eXaHYH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173162},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"50d115c4d4a0cdf96f0a9775bb55cd3ec1f1aeab","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@jarenjs/core":"^0.34.2","@jarenjs/json":"^0.34.2","@jarenjs/formats":"^0.34.2","@jarenjs/validate":"^0.34.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.34.2_1786889750567_0.6653084474882816","host":"s3://npm-registry-packages-npm-production"}},"0.43.1":{"name":"@jarenjs/forms","version":"0.43.1","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.43.1","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"d9e57c44d2982638462a9e68d1b0baa31cd7e6cf","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.43.1.tgz","fileCount":21,"integrity":"sha512-eDsHpmSGxI6jd/1rYmanwRp6ql2zFDzifxzBR9wS8+qZiMBFAk3earLLtLhzV+eRrWkj3JsijxJcOqBXQNFZCg==","signatures":[{"sig":"MEUCIDvpgmT5Qe4DK+LahO6kbkF1SYhbn/JSzp/o5Hr6o0uxAiEAr1/hM0r5sEJ+qRsKSzL5Bsn7B/NmuSwOnWw9/WucWDM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173614},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"6e03d18fb68dd79a80c58f04f47901641901a2ec","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@jarenjs/core":"^0.43.1","@jarenjs/json":"^0.43.1","@jarenjs/formats":"^0.43.1","@jarenjs/validate":"^0.43.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.43.1_1787481687645_0.4653674312099423","host":"s3://npm-registry-packages-npm-production"}},"0.43.3":{"name":"@jarenjs/forms","version":"0.43.3","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.43.3","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"fb2aa0a1f79b4ef84d39afdbfeca0870be5ea2cb","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.43.3.tgz","fileCount":21,"integrity":"sha512-pkNMzUjLYOxUdEk7UMX8HLQji27SOzG2c6OgiW+x3zL2BzgV26EIPzTMYM+SwxoQwpoKExeNtj6+zI/XwhfMrA==","signatures":[{"sig":"MEUCIQDjb1WhtE9GjwADRXRgMSWIXeUuKsfq4Hg3LqR79/0SCgIgCVkNF3uxWZo2qOaSWl/SGaovfwo3aeKAexFMyx7ONdw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173614},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"efd18dec49c026ddd9dd301cb17eb97e5feb1288","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@jarenjs/core":"^0.43.3","@jarenjs/json":"^0.43.3","@jarenjs/formats":"^0.43.3","@jarenjs/validate":"^0.43.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.43.3_1787588974004_0.4983316909616109","host":"s3://npm-registry-packages-npm-production"}},"0.46.4":{"name":"@jarenjs/forms","version":"0.46.4","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.46.4","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"ecdd59d7f65855cccb2eb26dbae808a4d0f50da3","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.46.4.tgz","fileCount":21,"integrity":"sha512-oPRCxmylEqRECg0D109XUZ1XaH/MrYFBY4dWaRGzW/orY7w2RooR40b87XXewXemI0jSxuWP8R+EL7V9VeK7wQ==","signatures":[{"sig":"MEQCIAWHifUp+PckYlTX9rmUql+bVg26xHyl5XTgLY1M9iERAiAJe8vzv0CLLbJtmzN2MG48pZZuUZDVAnTXZPVX3pGi/g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177517},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"e1dc4417ddc0acc42402e7486f45bbc5bff2cb41","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@jarenjs/core":"^0.46.4","@jarenjs/json":"^0.46.4","@jarenjs/formats":"^0.46.4","@jarenjs/validate":"^0.46.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.46.4_1787728812420_0.7298647447496849","host":"s3://npm-registry-packages-npm-production"}},"0.46.5":{"name":"@jarenjs/forms","version":"0.46.5","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.46.5","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"a0feb177fb10307620efd9c37cbc300a7d4dc301","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.46.5.tgz","fileCount":21,"integrity":"sha512-dwHqs4YFhGi2Rre9Kw8kOiY3arMUseQCsICe+u2HskgrkkbUPFD8dDS/+nIo4abYy0fTdoR569Xf4a4wuaYAcw==","signatures":[{"sig":"MEUCIFdUrNw7sn07KmsEQkTno39lM56WGuz4M25udIN1seJnAiEA/OuUTv2329hPUNXw7ojGUBKa+AFeeTMxb2znFSRgbaw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177517},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"0df1ef3a27b39e1408acf1ba2e63eed34b1c8621","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@jarenjs/core":"^0.46.5","@jarenjs/json":"^0.46.5","@jarenjs/formats":"^0.46.5","@jarenjs/validate":"^0.46.5"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.46.5_1787734454125_0.6764793843319998","host":"s3://npm-registry-packages-npm-production"}},"0.49.2":{"name":"@jarenjs/forms","version":"0.49.2","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.49.2","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"59e6b5035cd795512b286b82ad5a5bd5f38973fc","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.49.2.tgz","fileCount":21,"integrity":"sha512-sv4OEup/6GR8MjBs3F0XTqcpMSMIRMRHnGQ36e6LeiKUJ9hM69LwMs6QCZDAtQuWMf6HGz6z0yZYWxDi3DrpGg==","signatures":[{"sig":"MEYCIQCJYXNhkufLLshzmH0KuIVOiIO1xXNyzd91Tal6mXU/ywIhALJ+4ajuu9rV4c8ucKgRpQ6G5rvd7/aGBGpo3diCHwH6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":182135},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"15e048f0cba387991c17758f689e8fd3b306dea8","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@jarenjs/core":"^0.49.2","@jarenjs/json":"^0.49.2","@jarenjs/formats":"^0.49.2","@jarenjs/validate":"^0.49.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.49.2_1787775767449_0.2692852208075227","host":"s3://npm-registry-packages-npm-production"}},"0.56.0":{"name":"@jarenjs/forms","version":"0.56.0","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.56.0","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"0cb335453b4a05ae702079817601ba37a1c852c8","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.56.0.tgz","fileCount":21,"integrity":"sha512-E5lOoyobvlYbmpbSXmbIueGktBsr1JlK9aTcLiV1PiO7YO/u4FgQk8TK64JcR3+x0/IEZAY4nN0yyxPn80gLGA==","signatures":[{"sig":"MEYCIQC3spQJDkBhJorT8ZfPqhPOsLwL0tBAmOlWQ/1k6CfNwQIhAJRKDzbsxXbUdAzYjmSC6v75LJ/Gp3q6n+mdQvvAITOX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183338},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"74f70f52b57410763dab4c52173cf037da601e70","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@jarenjs/core":"^0.56.0","@jarenjs/json":"^0.56.0","@jarenjs/formats":"^0.56.0","@jarenjs/validate":"^0.56.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.56.0_1788053692663_0.5738692707184032","host":"s3://npm-registry-packages-npm-production"}},"0.66.1":{"name":"@jarenjs/forms","version":"0.66.1","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.66.1","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"9997622e599d58744da9983181ae8145fa414c8d","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.66.1.tgz","fileCount":21,"integrity":"sha512-qX9V/tkihpizYxol8F2BdPRza3sub11ntQBpXArz5MPvK1SuIKQWgJBllsLNBOJeKhxR3apPAce1dt76laDeGw==","signatures":[{"sig":"MEQCIHfGpPIZpYw1pG6UhBRojQdupiunOUMzTVW0Fo1nHnvgAiB8/kEglXDOk6lSc4NEH68TdNdfuf+NHKpk5cpAsNNmkw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185425},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"38bd730da099aff22b13944f85b691b0bd399bec","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.66.1","@jarenjs/json":"^0.66.1","@jarenjs/formats":"^0.66.1","@jarenjs/validate":"^0.66.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.66.1_1788890800363_0.6127510821077564","host":"s3://npm-registry-packages-npm-production"}},"0.67.0":{"name":"@jarenjs/forms","version":"0.67.0","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.67.0","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"6ea12e0098ce71bc350c448b74c5eea98e58c425","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.67.0.tgz","fileCount":21,"integrity":"sha512-QYT+vk3LNjHIluCVvaxWhdV7hRlRwsHRK8A4YewskhwXf1720DKz+Z9qsuP2eQn20G/yYvidsSa6zgrY06oqcg==","signatures":[{"sig":"MEUCIQCZjNqygqEbX7vw3DDSgvkRD8ojh1H3ItJSc7z2BFU+iQIgW5oR9cXTURY3HkDhOyt7NK94qfykLpQr4/lAxTPogpA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185425},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"78082760da582ed92ccb3f4dedbf550090f1f18f","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.67.0","@jarenjs/json":"^0.67.0","@jarenjs/formats":"^0.67.0","@jarenjs/validate":"^0.67.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.67.0_1788896668321_0.8879825173109623","host":"s3://npm-registry-packages-npm-production"}},"0.72.0":{"name":"@jarenjs/forms","version":"0.72.0","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.72.0","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"30f8136fbebfefffbe78901a96a9ca842d60d305","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.72.0.tgz","fileCount":21,"integrity":"sha512-hBtI2epfxGJBqWfnKKl1uKTWcve0T5K4zHvxAJ3uWFW4T1D4nBrF9rPQ/PWPK0AWh5JcbDRdEh25dLVnYWYQQQ==","signatures":[{"sig":"MEUCIQD7MmX5znvEkEXOEJG9hkK2cGdD89GTVaVivsSB3TJ5xQIgILjJVNRsgVDsMuadpaCo73KDlXNic+m3tfdaUHmUaAE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185425},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"661647bcd8ec149b3d466d3929ba3b5e7a2d267d","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.72.0","@jarenjs/json":"^0.72.0","@jarenjs/formats":"^0.72.0","@jarenjs/validate":"^0.72.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.72.0_1788952134088_0.47544199221135663","host":"s3://npm-registry-packages-npm-production"}},"0.72.2":{"name":"@jarenjs/forms","version":"0.72.2","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.72.2","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"3cef241dd1122c489e5f4a265fa398550221d7c0","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.72.2.tgz","fileCount":21,"integrity":"sha512-HSiKOqFSQwtT+A8+2SlM+5nhOv48aL6BvW7he+18GpcBsZvepZrMQxEyv+6EzE2FgXx1ut0tLNzNXDUuxR+Llg==","signatures":[{"sig":"MEUCIF7/xLI6IxE/MNxSZYrbLq09R43y7YLK0SbcprzXvLwCAiEAqMvMY8z5B7nTdZUb3nGxPDvANN+ClQjkha5L2L/eKYc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185425},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"fe4a5f69ee8d59552c53795c279c46091aa3ff8c","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.72.2","@jarenjs/json":"^0.72.2","@jarenjs/formats":"^0.72.2","@jarenjs/validate":"^0.72.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.72.2_1788964323882_0.10051145870864997","host":"s3://npm-registry-packages-npm-production"}},"0.72.3":{"name":"@jarenjs/forms","version":"0.72.3","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.72.3","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"6e723f501bb76609c27b669cf2456d620c34e66f","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.72.3.tgz","fileCount":21,"integrity":"sha512-EE4RBIFbe3udIjUWUq7wOkm5noQVUg2wzd5zhygRldxa2a+ryBU9d6aVwQCHEgRmryQD+YS/MBRN9jeotfj5bA==","signatures":[{"sig":"MEYCIQCkBJit6cXK5v9y7csbDXgIAHRBNSrak8ASkK9m3HK19QIhAKu5JoJw1wm02irpftXm5w0f8yLfrWqQXyXpp3wD32P9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185691},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"a5ef0d342fdb56b58f5bd1301af4a23d0cc3ec00","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.72.3","@jarenjs/json":"^0.72.3","@jarenjs/formats":"^0.72.3","@jarenjs/validate":"^0.72.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.72.3_1788973970667_0.47155248780823866","host":"s3://npm-registry-packages-npm-production"}},"0.73.0":{"name":"@jarenjs/forms","version":"0.73.0","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.73.0","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"b83266bd2ba8b89cc98b184fc2f37cf47cc06037","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.73.0.tgz","fileCount":21,"integrity":"sha512-LudDtoSzJnehOLiGqJfOL5vRo88fdc4N35Q83e8QbTc7YMkJBFKUru5zTQf1aPsQsGMxQPP+umidiKUusxkyrw==","signatures":[{"sig":"MEQCICP0dH/Llc32u7viFnTkxQj2mBD5LAFTVTdMkFaPoZY6AiBdqqvutmYAbTLTq00r+ojETJMs4ZoR40z1ylOn0FKa4w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185691},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"7f700942ad404a8203452f3b263b05c2aec2fe05","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.73.0","@jarenjs/json":"^0.73.0","@jarenjs/formats":"^0.73.0","@jarenjs/validate":"^0.73.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.73.0_1788980313774_0.029208042387815603","host":"s3://npm-registry-packages-npm-production"}},"0.75.0":{"name":"@jarenjs/forms","version":"0.75.0","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.75.0","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"dfd651ffe2f48be3afacc6423e34e59125913e32","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.75.0.tgz","fileCount":21,"integrity":"sha512-QFANNN62ZSApotQpsFUR4ha89z6GSe6BPbOaJlGwKeXUB+vL+WtfUjVGsTkM9CFVzS8eEmCVOGm+vXdv0eUqJg==","signatures":[{"sig":"MEQCIHz+kAxQEhPIOhSu/ltNJ4wiOCvZ6vZqP3xtv26t06MDAiAoPpfTBVMiyVxC4N7p8wBZYQb1YBNs26/Gs1/AniNaBQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188466},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"a50e9c57bc3e867529c18433a448178559d20c85","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.75.0","@jarenjs/json":"^0.75.0","@jarenjs/formats":"^0.75.0","@jarenjs/validate":"^0.75.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.75.0_1788994280360_0.8159915784875791","host":"s3://npm-registry-packages-npm-production"}},"0.83.2":{"name":"@jarenjs/forms","version":"0.83.2","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.83.2","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"bca6370e101bf561c400ce63cce21d2fb96d41a8","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.83.2.tgz","fileCount":21,"integrity":"sha512-jC8cqq7qjqKwMCmM4AnOK5/6pDgePcb7zmhr61VMdc4B2D8P/JgnC7gsfcmQFLsaJtfJA+Pr/OOEXaHD9lrgKw==","signatures":[{"sig":"MEUCIAd+Vztaeb676R3vVY34+cYC3MtxGuLfYJEbjki1Jy0KAiEA3jG9fXMOe+gpR2pU8PabRELBtPnO/a1mRkW8JGjH+m8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE/p7DppPvrlTQepMLQKOpZLayHCCbb/SITMYnrLqcw3AiAF0nm96xXcaDLrBPlNXlYBjZPFcCFzSY+BFXjZxqSfeQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188466},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"f21b18fa123a6c72a0ca31dbad374ec5a8bf78ff","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.83.2","@jarenjs/json":"^0.83.2","@jarenjs/formats":"^0.83.2","@jarenjs/validate":"^0.83.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.83.2_1789113371879_0.7939942777036852","host":"s3://npm-registry-packages-npm-production"}},"0.83.3":{"name":"@jarenjs/forms","version":"0.83.3","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.83.3","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"14637a8c8295647858476af6d3e928268ec7492d","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.83.3.tgz","fileCount":21,"integrity":"sha512-wvHNOYQw+/nsaxUVWRIxHqt0hMiuRb+1kkEneUkzdNDkW1CiNRJ36GJ1ESE2TZccH04c502Agw4iUuHyrUL6gw==","signatures":[{"sig":"MEYCIQC5i9Mq0J4bjyaT4DOXR7h8O/fpw9LGsW5YEGxCxhaBdQIhANwpEeNjzxsCvbCv3ZEy+SKYlHDIUS8INDZyFhmIFJ4j","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDvPJtoL/yhZugDZztCJwxctW/eHZ1qs8seTdX3LpqPSAIgMTm7E5Ic8hlZOFJof+ELH0NTqZp3gI2Lkxs7PrOnrJg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188466},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"3491513e164dc30e429c84e709bd738841f4df16","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.83.3","@jarenjs/json":"^0.83.3","@jarenjs/formats":"^0.83.3","@jarenjs/validate":"^0.83.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.83.3_1789132277442_0.49564885092601396","host":"s3://npm-registry-packages-npm-production"}},"0.84.3":{"name":"@jarenjs/forms","version":"0.84.3","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.84.3","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"b48a22ddde3b23d60609856e675b4ac8710730e9","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.84.3.tgz","fileCount":21,"integrity":"sha512-duwHQmruHOQPzYAqruduPZ4TaFKnLHFWQ5GSSCwYmdE1y9oU9tWkGo0Ay2Rek/g/89TyWErGe7oolV0zyb5RSg==","signatures":[{"sig":"MEYCIQCRgRnfRcxl8yugcaDfgG3tuKjS/8luyt/JJK8yZw6/WQIhAMRvIoNmeMJYkbKDWL2Zx4pPJfCLj/CEhn2/XSSj76/1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIF9fRmLeYj/9k1HNYfwsBfxifezoMGtScYQATNj9CLlMAiBr7vwPRXLwJz3WmY+ZpKN5cSmCfbFYL6GxKOzzvexYMA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188466},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"ac8749711f5d058251f72842ce7e0095b389403f","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.84.3","@jarenjs/json":"^0.84.3","@jarenjs/formats":"^0.84.3","@jarenjs/validate":"^0.84.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.84.3_1789191929623_0.0694975741443733","host":"s3://npm-registry-packages-npm-production"}},"0.85.0":{"name":"@jarenjs/forms","version":"0.85.0","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.85.0","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"f8de7cb8b7d357506014271416ff50a48ae1d9dc","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.85.0.tgz","fileCount":21,"integrity":"sha512-pLqI/KbTysYcumlO+WC5c5Xb7W1qncatKLopmGpD5zfr3HrDKne2wISzOMVSyVrL+KutwklDq9OveiEPh31yJw==","signatures":[{"sig":"MEQCIFDfPMkLip3ie85LeBAnWIixC4bSxu/d13AkWDJsGJrLAiBUOG1JxUvvte4sqbbw56QAfOfqAhfh1veZE2rJivSYLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCTw3pT+B1c5lPLCND1vXX72phoHIFv4V1Lk/coCGKaKgIgCPesR2b73uCkuGZR013IzvuaD+OjIziUa5fI9j0IP/k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188466},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"5765fba5ab5c1d390dc28316a4255b47cd0f6f8a","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.85.0","@jarenjs/json":"^0.85.0","@jarenjs/formats":"^0.85.0","@jarenjs/validate":"^0.85.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.85.0_1789214028900_0.06853122366224529","host":"s3://npm-registry-packages-npm-production"}},"0.86.0":{"name":"@jarenjs/forms","version":"0.86.0","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.86.0","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"9e7d8c33d8a203e38af719cae413eac91efeaa4e","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.86.0.tgz","fileCount":21,"integrity":"sha512-GYlZLlmpKQ0WFl6O41tPtxb8y6bNjZP+xEAr3wMKnmbSpEPFvCyTgzg9gV/G9am1p3g3AvsXQCLIUhDVPF4ySw==","signatures":[{"sig":"MEYCIQDvBnvsBILVM6LmVffgdWAF28RiBUBpc4Ph8Q+HJa5t5wIhANbRG1n2+480yEKr4ADd7sE9cB19WmAemDzLyEZONabv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCwioD99tijnD8xAZsA4GUCcpaqIBUinmCWH3rPlKJYbwIgGrTh8Zojk9agd+BHeS869Rgx8R+7c5e8E4TdQxPRPVI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188466},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"ce489546f21a176a2574169b65b95f9dc15461f7","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.86.0","@jarenjs/json":"^0.86.0","@jarenjs/formats":"^0.86.0","@jarenjs/validate":"^0.86.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.86.0_1789221903298_0.8794948268609755","host":"s3://npm-registry-packages-npm-production"}},"0.87.0":{"name":"@jarenjs/forms","version":"0.87.0","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.87.0","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"d7eed47162005379ac2ba4e48061d8aca02ae197","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.87.0.tgz","fileCount":21,"integrity":"sha512-0kAa1qCJTxjTzSaqLls/yL6pJcs6nzX8p4j6Nl7qvZEIjsphVjwd5V+34KWxNpDxGgsUk364/iLrLx8DLJ2q4g==","signatures":[{"sig":"MEQCIAiMA+1iefBc4cO+0h8eebsJvxBb2DsJhsUaNNmURf4KAiBLwEr4+5m2eRWiJZ/k1o+fSmNUHSkD59BnrzAb9sWSlA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDXW2RhtYgpvIWXC2Lx1zoftwZMWDmsxz2VmU/iVsEOsAiACmApm0R4l+WNcKRDQ3VA65V7SsCSxrmN9/jYZFpGbRQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188466},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"9b67ed8cb88d2dbe95cb3eb5fe0ac88cfb70f347","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.87.0","@jarenjs/json":"^0.87.0","@jarenjs/formats":"^0.87.0","@jarenjs/validate":"^0.87.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.87.0_1789243389198_0.4806323219976816","host":"s3://npm-registry-packages-npm-production"}},"0.89.0":{"name":"@jarenjs/forms","version":"0.89.0","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.89.0","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"4e558672306810f45a674a36d068fd4dbcc34138","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.89.0.tgz","fileCount":21,"integrity":"sha512-cYKYbiBymDaMyshJ7PIeJOdP7VfnCx6mGPCcc/mG2jqnS2MT7jbcaTKuTe8svcRTNqWPG6UU1MBIuo18rckO/A==","signatures":[{"sig":"MEYCIQD9WOuQ0Ahaveb1MphQ78Bcwpd9Xa+610+XL94EbD7J9AIhAMXwi1lQR6qJXbIO/5oMKGHHM3uA6ummw+VTr1TvdtL9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHzurBsq75yYKbCBxLIgH2ra7tOLfme7Y+7eaxVb+05DAiEAyCSisb2tWwtTArn3cro7bIXPH31qshOLq6YhtdmfB/8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188947},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"41f5a36eccd43591d7c04d9116a6d210617e9146","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.89.0","@jarenjs/json":"^0.89.0","@jarenjs/formats":"^0.89.0","@jarenjs/validate":"^0.89.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.89.0_1789288755670_0.0726866055032267","host":"s3://npm-registry-packages-npm-production"}},"0.90.6":{"name":"@jarenjs/forms","version":"0.90.6","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.90.6","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"442b9deab9819186dcadf55bb2684b6a99f2afaf","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.90.6.tgz","fileCount":21,"integrity":"sha512-5tIAvoNiB4BeAX6JHkanGr+XRD9kJ/cPpJdPhwksNiSYiLf51+nMYcVHS4V6liric9RaBT1j+1wT69qqvRpBlA==","signatures":[{"sig":"MEQCIFyh1qOXy4p+/CS/PHfzg266UrJVbwMEcpu8SeWyoSq/AiB5h9ehe7EqGPheDAWBUN93/ZNwr2pip3L3UvzA2zd+Qg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCHHS/JzJYUErim2xn7YQhYb+mjxJ5fS9wF/9ewc6IbDgIhANozqCmnat7rs/d+Kq/IRP9s5Z5B0LmctsdoTXC+MSwy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188947},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"37ba1676dab7868b168858b413a3ec647eebefdd","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.90.6","@jarenjs/json":"^0.90.6","@jarenjs/formats":"^0.90.6","@jarenjs/validate":"^0.90.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.90.6_1789444621035_0.43971360149076255","host":"s3://npm-registry-packages-npm-production"}},"0.91.2":{"name":"@jarenjs/forms","version":"0.91.2","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.91.2","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"adb746a32484454a4ed721a89e45885f9ed43930","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.91.2.tgz","fileCount":21,"integrity":"sha512-7BBl5vz/4seJzHwfYOAaVT3i3jKd96dzzPydxK/R0fSsK4G11iVzgUfnTWTZQ9Z0HvbOPxdqEOn1W3ULoPpRPA==","signatures":[{"sig":"MEUCIAEkov7hLQwlA9rtga/WVI32DjikjApbEFl1CYHw2FlFAiEA4D+usPNyfYvVxZS8WRFOFY26WKFZvvXFUIZbhinFFK8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGwNhbqxxbruwbFvgF5uBCCqTZewb5y2waz0ZjsBhD18AiAQ6PYrD06g/cvNZkA68fvh+qoKrfTuR4BPpmFPbmHyvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188947},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"74036c063c5a4efa8c41aa878713d405223cc464","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.91.2","@jarenjs/json":"^0.91.2","@jarenjs/formats":"^0.91.2","@jarenjs/validate":"^0.91.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.91.2_1789572395388_0.3847666720274545","host":"s3://npm-registry-packages-npm-production"}},"0.91.3":{"name":"@jarenjs/forms","version":"0.91.3","keywords":["jaren","json","schema","form","forms","generator","validation"],"author":{"name":"joham"},"license":"MIT","_id":"@jarenjs/forms@0.91.3","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"homepage":"https://github.com/jklarenbeek/jarenjs#readme","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"cd29135736b37b7e38a0db731c2c2e63c40d9640","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.91.3.tgz","fileCount":21,"integrity":"sha512-CHHgxoco2L5+loBxFvXwZ2WLmS9iO6fbQ2eFlJttMApIcHhC/PwaK6PLEfH4LjaJWUEgx3emZ8R3jvdGoFFhRA==","signatures":[{"sig":"MEUCIGxPjMb/6/AmgY9fnrdJYCoosCDWxfX5uK9Zp37mFPtUAiEA+Wg44fDyPpBNjS0dP1JKFCZfN43vedraaLvs09dcFXU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEvHjPsNn6ZhM4aM7cWhNKBk1MtdVm5w1FsRgV/BO9H7AiB2Pz5XmFk6zSqeYSh/WlntP3Za8GwedhbBKWd84Fh3Ew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188947},"main":"./src/index.js","type":"module","types":"./dist/types/index.d.ts","engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"1577600d98b9ef23381843911958aab10728707f","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.91.3","@jarenjs/json":"^0.91.3","@jarenjs/formats":"^0.91.3","@jarenjs/validate":"^0.91.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/forms_0.91.3_1789659331027_0.9360362111233609","host":"s3://npm-registry-packages-npm-production"}},"0.91.4":{"_id":"@jarenjs/forms@0.91.4","bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"dist":{"shasum":"140a0fbfb3da2573146e9dd49318cc0a8fd4a7d9","tarball":"https://registry.npmjs.org/@jarenjs/forms/-/forms-0.91.4.tgz","fileCount":21,"integrity":"sha512-hMoKDPKD/x8wY+UeVEQn006k9QB1Plq2JbpGogCcPnTA8ybYrlQzg8/9LuSb7bWJYfIlgequCv5Cnj6324Nwow==","signatures":[{"sig":"MEQCICg455OVN2DKYSzvN3aCijSX1g3yrN4kJGgVOE1ixaGrAiACwUq++wUM+vwv/aqIDCJhKU8HspTPcXfwYXAEZ42HWw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCiAPSSEfMUSacrexuToSabuRIIz4DFLLNf16OaJuzB2gIgcrv+GCYYbyGAxWCOrOUAp2ZsvTum+y6E9MfQbPwJxAQ="}],"unpackedSize":188947},"main":"./src/index.js","name":"@jarenjs/forms","type":"module","types":"./dist/types/index.d.ts","author":{"name":"joham"},"engines":{"node":">=24"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"30ec046081c02c80ad1916569c45e134e33fb82b","license":"MIT","private":false,"scripts":{"build":"npm run build:types","prepack":"npm run build:types","build:types":"tsc -p tsconfig.json"},"version":"0.91.4","_npmUser":{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"},"homepage":"https://github.com/jklarenbeek/jarenjs#readme","keywords":["jaren","json","schema","form","forms","generator","validation"],"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"_npmVersion":"11.12.1","description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","directories":{},"maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@jarenjs/core":"^0.91.4","@jarenjs/json":"^0.91.4","@jarenjs/formats":"^0.91.4","@jarenjs/validate":"^0.91.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/forms_0.91.4_1789820629798_0.32385092235010937"}}},"time":{"created":"2026-07-17T14:43:04.008Z","modified":"2026-09-19T12:23:50.201Z","0.9.2":"2026-07-17T14:43:04.217Z","0.34.0":"2026-08-13T14:47:56.199Z","0.34.2":"2026-08-16T14:15:50.714Z","0.43.1":"2026-08-23T10:41:27.796Z","0.43.3":"2026-08-24T16:29:34.142Z","0.46.4":"2026-08-26T07:20:12.568Z","0.46.5":"2026-08-26T08:54:14.289Z","0.49.2":"2026-08-26T20:22:47.582Z","0.56.0":"2026-08-30T01:34:52.801Z","0.66.1":"2026-09-08T18:06:40.510Z","0.67.0":"2026-09-08T19:44:28.569Z","0.72.0":"2026-09-09T11:08:54.244Z","0.72.2":"2026-09-09T14:32:04.022Z","0.72.3":"2026-09-09T17:12:50.898Z","0.73.0":"2026-09-09T18:58:33.940Z","0.75.0":"2026-09-09T22:51:20.506Z","0.83.2":"2026-09-11T07:56:11.979Z","0.83.3":"2026-09-11T13:11:17.534Z","0.84.3":"2026-09-12T05:45:29.708Z","0.85.0":"2026-09-12T11:53:48.987Z","0.86.0":"2026-09-12T14:05:03.403Z","0.87.0":"2026-09-12T20:03:09.294Z","0.89.0":"2026-09-13T08:39:15.754Z","0.90.6":"2026-09-15T03:57:01.126Z","0.91.2":"2026-09-16T15:26:35.494Z","0.91.3":"2026-09-17T15:35:31.130Z","0.91.4":"2026-09-19T12:23:49.990Z"},"bugs":{"url":"https://github.com/jklarenbeek/jarenjs/issues"},"author":{"name":"joham"},"license":"MIT","homepage":"https://github.com/jklarenbeek/jarenjs#readme","keywords":["jaren","json","schema","form","forms","generator","validation"],"repository":{"url":"git+https://github.com/jklarenbeek/jarenjs.git","type":"git","directory":"packages/forms"},"description":"Framework-agnostic form model generator for JSON Schema with preemptive per-field validation powered by @jarenjs/core","maintainers":[{"name":"jklarenbeek","email":"jklarenbeek@gmail.com"}],"readme":"# @jarenjs/forms\n\nFramework-agnostic form generation for JSON Schema. Turns a schema into a renderable field tree and validates it in **three layers, one stack**:\n\n1. **Per field, every keystroke** — cheap, synchronous checks powered directly by [`@jarenjs/core`](../core) primitives (grapheme-aware string lengths, unicode patterns, deep equality) and the canonical format-tester registry of [`@jarenjs/formats`](../formats): everything one field can know about itself.\n2. **Cross field, every keystroke** — visibility, enablement, computed values, and preemptive assertions expressed as [Jaren JSON Query](../json/docs/QUERY-FORMAT.md) documents in an `x-form` annotation, compiled once per model by [`@jarenjs/json`](../json) and evaluated per keystroke as cheap closures.\n3. **Authoritative, on submit** — the complete compiled schema validation with [`@jarenjs/validate`](../validate), which owns `required` combinations, `dependentSchemas`, `if/then/else`, `unevaluatedProperties`, and (via the `$query` keyword) the very same cross-field rules.\n\nNo DOM, no framework: render the model with React, Vue, vanilla JS or anything else. Forms never runs the validator — apps wire the authoritative layer themselves; the only thing it imports from `@jarenjs/validate` is the pure same-document `$ref`/`$anchor` resolution in `@jarenjs/validate/normalize`. See it in action in the [Jaren playground](https://jklarenbeek.github.io/jarenjs/#/playground).\n\n## Usage\n\n```javascript\nimport {\n  buildFormModel,\n  createInitialData,\n  validateField,\n  parseFieldInput,\n  setValueAtPointer,\n} from '@jarenjs/forms';\n\nconst schema = {\n  type: 'object',\n  properties: {\n    username: { type: 'string', minLength: 3, pattern: '^[a-z0-9_]+$' },\n    email: { type: 'string', format: 'email' },\n    age: { type: 'integer', minimum: 13 },\n  },\n  required: ['username', 'email'],\n  title: 'Sign up',\n};\n\n// 1. Build the field tree once\nconst model = buildFormModel(schema);\n// model.children -> [{ pointer: '/username', label: 'Username', control: 'text',\n//                      required: true, constraints: {...} }, ...]\n\n// 2. Start with the schema's defaults (untouched fields stay absent)\nlet data = createInitialData(model);\n\n// 3. On every keystroke: coerce the raw input and validate the field\nconst field = model.children.find((f) => f.key === 'email');\nconst value = parseFieldInput(field, 'not-an-email');   // '' -> undefined, numbers -> Number, ...\nconst errors = validateField(field, value);\n// [{ keyword: 'format', message: 'Must be a valid email' }]\n\ndata = setValueAtPointer(data, field.pointer, value);   // immutable update\n\n// 4. On submit (or continuously): the authoritative validation\nimport { JarenValidator } from '@jarenjs/validate';\nconst validate = new JarenValidator({ skipErrors: false, collectErrors: true }).compile(schema);\nconst result = validate(data); // { valid, errors: [{ instancePath, keyword, message, ... }] }\n```\n\n## The form model\n\n`buildFormModel(schema)` resolves local `$ref`s (`#/$defs/...`), merges `allOf` branches, and returns a tree of field descriptors:\n\n| Property | Meaning |\n|---|---|\n| `pointer` | JSON pointer into the data (`/user/name`) |\n| `label` | `title` or a humanized property name (`firstName` → \"First Name\") |\n| `kind` | `string` `number` `integer` `boolean` `enum` `const` `object` `array` |\n| `control` | Rendering hint: `text` `email` `url` `password` `textarea` `number` `checkbox` `select` `date` `datetime-local` `time` `color` `json` |\n| `required` | Whether the parent object requires this property |\n| `constraints` | `minLength`/`maxLength`/`pattern`/`format`/`minimum`/`maximum`/`multipleOf`/`minItems`/... |\n| `rules` | The raw `x-form` rules annotation, if any (see below) |\n| `enumValues` / `constValue` / `defaultValue` / `placeholder` | Values for the UI |\n| `preview` | A preview hint, or `null`: what a host MAY draw beside the control, as data (`{ kind: 'map' }` for `geojson`) — see below |\n| `children` | Child fields (object kinds) |\n| `item` / `tuple` | Item template and tuple prefix fields (array kinds) |\n\nField kinds are inferred from structural keywords when `type` is absent, and `format` maps to input controls and placeholders through the same registry the preemptive validation uses (`getFormatInfo`).\n\n### The preview hint — a renderer described as data\n\nA `geojson` field is a `textarea` whose text is validated by parsing it and judging the\nobject (`isValidGeoJson`), and that is where a text control stops: the value can be valid\nGeoJSON long before it is the shape the user meant, and no textarea can show the\ndifference. The format registry therefore carries a **preview hint** —\n`getFormatInfo('geojson').preview` is `{ kind: 'map' }` — and the field and the view node\ncarry it through as `preview`. It is a description, not a renderer: `@jarenjs/forms`\nimports no chart, and the dependency arrow forbids it (`@jarenjs/charts` sits above this\npackage). A **host that understands** `preview.kind === 'map'` parses the field's text and\nhands it to a map renderer — `@jarenjs/charts` draws a `FeatureCollection`, a `Feature` or a\ngeometry through `compileChart({ type: 'map' }, { features })` — beside the control. A host\nthat does **not** ignores the member, and the field is exactly the textarea it always was:\nsame control, same placeholder, same test. Both paths are tests; the `@jarenjs/app` form\nstylesheet is the second kind of host, and the website's data studio the first.\n\nWhich date formats get a **native** control is decided by the offset, not by convenience. HTML's `datetime-local` and `time` inputs cannot produce one, and RFC 3339 requires one — binding them to `date-time`/`time` would make the control emit values its own schema rejects, so those stay text inputs. The `iso-date-time`/`iso-time` formats leave the offset optional and are exactly what those inputs spell, so they map losslessly. `formatMinimum`/`formatMaximum` reach the field as constraints and become the control's `min`/`max`, so the picker itself refuses an out-of-range date; HTML has no exclusive date bounds, so `formatExclusive*` stays a submit-time check.\n\n### The same model, by code\n\nThe schema above is what `@jarenjs/linq/forms` emits, byte for byte:\n\n```javascript\nimport * as f from '@jarenjs/linq/forms';\n\nexport const signup = f.object({\n  username: f.string().min(3).pattern('^[a-z0-9_]+$'),\n  email: f.string().format('email'),\n  age: f.integer().min(13).optional(),\n}).open().title('Sign up');\n\nconst model = buildFormModel(signup.schema);\n```\n\nEvery rule of the next section is a `.form({ … })` on the member it\nbelongs to; the pen's document is\n[FORMS-PEN.md](../linq/docs/FORMS-PEN.md), and nothing in this package\ndepends on it — the schema is the contract.\n\n## Layer 1 — preemptive per-field validation\n\n`validateField(field, value)` returns `[{ keyword, message }]` using `@jarenjs/core` directly:\n\n- **strings**: grapheme-aware `minLength`/`maxLength` (`getStringLength`), unicode `pattern` (`createRegExp`, cached), and 50+ `format` testers from the [`@jarenjs/formats`](../formats) `formatTesters` registry — the same name → predicate table the authoritative validator's format compilers wrap, so both layers accept exactly the same strings\n- **numbers**: type/integer checks, bounds, `multipleOf`\n- **enum/const**: deep equality (`equalsDeep`)\n- **arrays**: `minItems`/`maxItems`/`uniqueItems` (`isUniqueDeepArray`)\n\n`validateAllFields(model, data)` walks the whole tree and returns a `{ '/pointer': errors }` map — ideal for rendering inline errors next to every field. It reads own JSON members, like the pointer helpers: a field named `constructor`, `toString` or `__proto__` is absent until the data supplies that member.\n\n## Layer 2 — `x-form` rules: cross-field behavior per keystroke\n\nOne namespaced annotation keyword — safe under every metaschema, invisible to validators — on any subschema. Its members are [Jaren JSON Query](../json/docs/QUERY-FORMAT.md) documents (a bare RFC 9535 JSONPath string is the degenerate query):\n\n```json\n{ \"type\": \"object\",\n  \"properties\": {\n    \"company\":  { \"type\": \"string\" },\n    \"vatId\":    { \"type\": \"string\",\n                  \"x-form\": { \"visible\": { \"$ne\": [\"$.company\", \"\"] },\n                              \"assert\":  { \"$or\": [ { \"$eq\": [\"$.company\", \"\"] },\n                                                    { \"$ne\": [\"$.vatId\", \"\"] } ] },\n                              \"message\": \"VAT id is required for companies\" } },\n    \"total\":    { \"type\": \"number\",\n                  \"x-form\": { \"computed\": { \"$sum\": \"$.lines[*].amount\" } } }\n  } }\n```\n\nThese annotations can be **written by code**: `@jarenjs/linq/forms` is\nthe schema pen plus `form({ visible, enabled, assert, computed,\nmessage })` on every builder, with the rules captured as callbacks over\nthe same context (`c.root`, `c.value`, `c.pointer`) rather than typed\nas path strings, and `assertOnSubmit()` answering the layer-3 twin\nbelow in one call. The document above is what it emits, byte for byte\n— see [the by-code twin](#the-same-model-by-code) and\n[FORMS-PEN.md](../linq/docs/FORMS-PEN.md). This package depends on\nnone of it; the annotation is the contract.\n\nRecognized members — unknown members are ignored for forward compatibility:\n\n| Member | Kind | Meaning |\n|---|---|---|\n| `visible` | EBV query | Should the field be shown? |\n| `enabled` | EBV query | Should the field accept input? |\n| `assert` | EBV query | Cross-field preemptive validation |\n| `computed` | query | The field's derived value, mapped to plain JSON |\n| `message` | string | Shown when `assert` fails |\n\nRules compile **once per model** and evaluate per keystroke:\n\n```javascript\nimport { buildFormModel, compileFormRules, evaluateFormRules } from '@jarenjs/forms';\n\nconst model = buildFormModel(schema);\nconst rules = compileFormRules(model);          // throws on malformed rules, with the field pointer\n\n// per keystroke, after updating `data`:\nconst state = evaluateFormRules(rules, data);\n// { '/vatId': { visible: true, errors: [{ keyword: 'x-form/assert',\n//               message: 'VAT id is required for companies' }] },\n//   '/total': { computed: 20 } }\n```\n\n### The rule query context\n\nEvery rule kind shares one context:\n\n- **`$`** — the input document is the **whole form data root**: cross-field is the point.\n- **`$value`** — the field's current value, bound as an external per evaluation. An absent field binds `null` (`undefined` is not a JSON value).\n- **`$pointer`** — the field's data pointer string (`'/vatId'`).\n\nThese two externals are the whole vocabulary: any other free name in a rule is a **compile-time** error naming it.\n\n`visible`/`enabled`/`assert` are asserted by **effective boolean value** (EBV, [QUERY-FORMAT.md §2.2](../json/docs/QUERY-FORMAT.md)): the empty sequence is `false`, a singleton counts per its type, a multi-item sequence is runtime error `JQ2003`. Runtime errors follow a fixed policy: `visible`/`enabled` **fail open** (evaluate to `true` — a broken rule must never hide data or lock a control), `assert` **fails closed** (an assertion that cannot be computed has not been satisfied), and `computed` leaves the value absent.\n\n### Array item templates\n\nA rule on an array item template (`/lines/-/amount`) compiles **once** and evaluates **per element** of the actual array, binding `$value`/`$pointer` per index — results are keyed by the expanded pointer (`/lines/2/amount`). Rendering uses [`@jarenjs/json/jslt`](../json/docs/JSLT-FORMAT.md) rules over the composed view model. Composition retains the model, data and session cursors together; see the addressing measurement below.\n\n### Schema literals in rules\n\nRules may use the query engine's schema operators (`$valid`/`$as`) by passing the same `compileTypeTest` hook the engine defines ([QUERY-FORMAT.md §8.11](../json/docs/QUERY-FORMAT.md)) — this is the only door through which a validator reaches forms, and the app holds the key:\n\n```javascript\nimport { createTypeTestCompiler } from '@jarenjs/validate/query'; // app-side, not a forms dependency\nconst rules = compileFormRules(model, { compileTypeTest: createTypeTestCompiler() });\n```\n\n### Composing rule errors with field errors\n\n`validateAllFields` and `evaluateFormRules` stay separate on purpose (a render loop usually wants them at different times). Both speak the same error shape, so merging is one spread per pointer:\n\n```javascript\nconst fieldErrors = validateAllFields(model, data);   // layer 1\nconst ruleState = evaluateFormRules(rules, data);     // layer 2\nconst errorsAt = (pointer) => [\n  ...(fieldErrors[pointer] ?? []),\n  ...(ruleState[pointer]?.errors ?? []),\n];\n```\n\n## Layer 3 — write the rule once, enforce it on submit\n\nThe same constraint can be spelled twice — `x-form.assert` for keystroke feedback, the [`$query` keyword](../validate) for authoritative submit validation — or written **once** and copied:\n\n```javascript\nimport { formRulesToQueryAssertions } from '@jarenjs/forms';\n\n// pure schema-to-schema transform: every x-form.assert becomes its own\n// allOf branch { $query, errorMessage } on the root, with value/pointer\n// rebound to the field's location and the rule's message carried along\nconst submitSchema = formRulesToQueryAssertions(schema);\n\nimport { JarenValidator } from '@jarenjs/validate';                // app-side\nconst validate = new JarenValidator().compile(submitSchema);\nvalidate({ company: 'ACME', vatId: '' }); // false - the vatId assert, now authoritative\n```\n\nEach branch's `errorMessage` carries the rule's `message` (inline string\nor `$msgid` form) with `params` merged over `{ pointer: <field pointer> }`\n— so every submit-time `$query` failure names its owning field in\n`params.pointer`, letting the UI place root-level `$query` errors onto\nfields, and renders the **same text** as the keystroke path (see below).\n\n**One rule, one meaning.** Whatever the keystroke evaluation says about a\ndocument, submit says too — the copy is not allowed to change what an author\nwrote. Three things enforce that, and each is a place the naive copy went\nwrong:\n\n- an **absent field binds `null`**, not the empty sequence, so `$ne`/`$eq`\n  cannot mean opposite things on the two sides (the binding is wrapped in\n  `$default`);\n- an **item-template assert quantifies over the ELEMENTS**, not over the\n  selected leaf values — quantifying over leaves silently skips an element\n  that lacks the member, where the keystroke path evaluates it with `null`;\n- an assert is **guarded by the field's own and ancestor `visible` rules**,\n  each with its own value/pointer bindings, holding vacuously while the\n  field is hidden — which is what the keystroke path already does, since\n  `buildFormViewModel` drops hidden subtrees and their errors never render\n  or count. Ordinary schema constraints still apply to retained values.\n\nOne divergence remains, and is inherent: `$pointer` for template elements\nstays the template pointer, because element indexes are a render-time notion.\n\nA hidden field's *value* is a separate question, and the answer is explicit:\nvalues are kept while editing — a field that reappears must not have\nforgotten what the operator typed — and dropped only at the submit boundary,\nby a caller who asks:\n\n```javascript\nimport { pruneHiddenValues } from '@jarenjs/forms';\n\nconst submitted = pruneHiddenValues(compiledRules, session.data);\n```\n\nVisibility is evaluated once, against the incoming document. Hidden array\nelements are removed and their siblings renumber, which is right for a\ndocument being sent — and means the returned pointers no longer line up with\nthe ones the view model rendered.\n\n## Messages & i18n\n\nEvery `FieldError` is structured: `{ keyword, params, msgid, message }`.\nThe `msgid` is `form/<keyword>` (field checks) or `x-form/assert` /\nthe author's `$msgid` (rules); `message` is rendered eagerly —\nfailure-only, cheap — through a **catalog** (see\n[ERROR-MESSAGES.md](../validate/docs/ERROR-MESSAGES.md) for the shared\ncontract). `validateField`, `validateAllFields` and `evaluateFormRules`\ntake an optional compiled catalog, default English:\n\n```javascript\nimport { validateAllFields, compileMessageCatalog } from '@jarenjs/forms';\nimport { nl } from '@jarenjs/locales';\n\nconst catalog = compileMessageCatalog(nl);\nconst errors = validateAllFields(model, data, catalog);\n// errors['/name'][0].message === 'Dit veld is verplicht'\n```\n\n### A format's name, in the reader's language\n\nA format's name is its wire name — `date-time`, `iso-time` — which is\nEnglish by construction and reads as gibberish inside a translated\nsentence (*\"Moet een geldige date-time zijn\"*). A catalog that carries\n`format/name/<format>` says how that format is called in its own\nlanguage, and `renderFormsMessage` swaps it in before `form/format`\nrenders. The error's own `params.format` stays the raw wire name, so the\nsame error re-rendered through a second catalog answers in *that*\nlanguage rather than repeating the first one's noun:\n\n```javascript\nconst error = validateField(whenField, 'nope', catalog)[0];\nerror.message;       // 'Moet een geldige datum en tijd zijn'\nerror.params.format; // 'date-time'\nformatDisplayName(catalog, 'email');  // 'email' — already a word\n```\n\n`@jarenjs/locales` carries the six date and time names in every pack; a\nformat the catalog cannot name keeps its own, which is the readable\nanswer for the names that are already words and the only possible one for\na format nobody has heard of.\n\n### MessageSpec in `x-form.message`\n\nA rule's `message` may be a plain string (backward compatible — an inline\ntemplate, `{pointer}` etc. interpolated) or a `$msgid` spec resolving\nthrough the catalog:\n\n```javascript\n{ \"x-form\": {\n    \"assert\": { \"$or\": [{ \"$eq\": [\"$.company\", \"\"] }, { \"$ne\": [\"$.vatId\", \"\"] }] },\n    \"message\": { \"$msgid\": \"checkout.vat-required\",\n                 \"message\": \"A VAT id is required for companies\" } } }\n```\n\n### One rule, one message — keystroke and submit\n\nThe same rule renders the **identical string** per keystroke\n(`evaluateFormRules`) and at submit (the transformed schema's `$query`\nfailure through the validator), in every locale:\n\n```javascript\nconst compiled = compileFormRules(buildFormModel(schema));\nevaluateFormRules(compiled, data, catalog);      // keystroke: Dutch text\n\nconst validate = new JarenValidator({ collectErrors: true })\n  .compile(formRulesToQueryAssertions(schema));  // app-side\nconst result = validate(data);\nlocalizeErrors(result.errors, catalog);          // submit: the same Dutch text\n```\n\n### Static text — the l10n surface everyone forgets\n\nLabels, descriptions, placeholders and enum option labels resolve once at\nmodel-build time; `buildFormModel` takes a `t` hook (default: identity)\nreceiving role-qualified message ids built from each field's base — its\n`x-msgid` annotation or its data pointer:\n\n```javascript\nconst staticNl = {\n  '/firstName#label': 'Voornaam',\n  'account.country#label': 'Land',\n  'account.country#enum/nl': 'Nederland',\n};\nconst model = buildFormModel(schema, {\n  t: (msgid, fallback) => staticNl[msgid] ?? fallback,\n});\n```\n\nEnum option labels come from the JSON Schema idiom\n`oneOf: [{ \"const\": \"nl\", \"title\": \"Netherlands\" }, ...]` (treated as an\nenum with per-option titles) or `String(value)`, each through\n`t('<base>#enum/<value>', fallback)`; the labels land on\n`field.enumLabels`, parallel to `field.enumValues`. An explicit `enum`\nsupplies its own values and `String(value)` labels even when `oneOf` is\nalso present. The view model selects object and array options by JSON\nequality, so values loaded from JSON keep their selection.\n\n## Data helpers\n\nForm data keeps plain JSON semantics — an untouched field is *absent*, not an empty string. Pointers parse, read AND write through the [`@jarenjs/json`](../json) engines (RFC 6901, one implementation repo-wide): reads hit a compiled-getter cache and allocate nothing, and writes run on the same copy-on-write kernel as the patch module (`compileJSONPointerSetter` with `parents: 'create'`), so untouched siblings are shared by reference on every keystroke — which feeds the JSLT memo and the view patcher's reference-equality fast path downstream:\n\n- `createInitialData(model)` — defaults and `const` values filled in as own JSON members (including `__proto__`), everything else absent\n- `parseFieldInput(field, raw)` — input coercion (`''` → undefined, numeric strings → numbers, enum options → typed values)\n- `getValueAtPointer` / `setValueAtPointer` / `appendItem` / `removeItemAt` — immutable updates addressed by JSON pointer\n- `createItemValue(field.item)` — starter value for a new array item\n\n## The view model — one render tree per instant\n\n`buildFormViewModel(model, data, options)` composes everything above — the field tree, the current data, per-field validation and `x-form` rule state — into **one plain-JSON render tree**: the \"computed view\" layer this README promised. Each node carries `pointer`, `label`, `control`, `value` (`x-form.computed` wins, `null` when absent), precomputed select `options` (with `selected`), localized `errors`, `enabled`, and the write discipline flags (`element`: array elements must be written with RFC 6902 `replace`, since `add` inserts; `removable`; `addValue` from `createItemValue`). Rule-hidden fields are *excluded* — a renderer cannot leak hidden data by accident. Array item templates expand per data element with concrete pointers (`/lines/2/amount`), matching the pointer keys of `evaluateFormRules` and `validateAllFields`. A short tuple's `addValue` comes from its next prefix slot; the tail item template supplies starters only after the prefix is filled.\n\nThe composition walk carries the current **raw data cursor** and the\nsession's **initial cursor** down beside each field. It reads one pointer\nsuffix per descent instead of starting from the document root per field;\ncomputed container values do not replace the raw cursor used by children.\nMissing baseline ancestors stay missing, preserving dirty-state detection.\n\n`$fold` can implement a second cursor with typed segments, but this alone\nis not a reason to replace the composer. The executable experiment in\n`benchmark/forms-composition.js` compares a fold-based JSLT rule with root\npointer getters and carried cursors on the same expanded fields. Its\nparity tests include escaped keys, array indexes and missing ancestors.\n\n<!--fact:forms.addressing-->\n\nMeasured on v24.19.0, linux/x64; median milliseconds per expanded-field projection. Compilation and field expansion are excluded from all contenders.\n\n| Depth | Nodes | Root pointers | Carried cursors | Fold stylesheet |\n|---|---|---|---|---|\n| 1 | 33 | 0.0043 | 0.0040 | 0.0817 |\n| 8 | 136 | 0.0314 | 0.0101 | 0.6325 |\n| 24 | 536 | 0.2811 | 0.0319 | 5.1716 |\n\n<!--/fact-->\n\nThe shallow timings are close and do not justify a universal speedup\nclaim; deeper trees benefit from carrying cursors. The fold stylesheet loses on every\nfixture even with expansion excluded. These measurements cover addressing\nonly, not the complete session/validation/render pipeline. The production\ncomposer therefore keeps the JS walk. A complete stylesheet replacement\nstill needs evidence for array-template expansion, hidden fields, enum\nvalues, errors and session state; first-class functions are not a\nprerequisite.\n\n```javascript\nconst model = buildFormModel(schema);\nconst rules = compileFormRules(model);\nconst tree = buildFormViewModel(model, data, { rules, validateFields: true, catalog });\n// tree.children[0] -> { pointer: '/email', control: 'email', value: 'a@b',\n//                       errors: ['Must be a valid email'], ... }\n```\n\nRender it with anything — a React component walking the tree, or **no framework at all**: the standard form rules of [`@jarenjs/app`](../app) are a shipped JSLT rule set that dispatches over exactly this shape and produces [`@jarenjs/view`](../view) vnodes, closing the loop from JSON Schema to live DOM without a single hand-written render function.\n\nTwo node members exist because a **DOM control's value is a string** and not\nevery field's value is: each select option carries `key`, its value as JSON\ntext, and a `json`-control node carries `json`, its value as indented JSON\ntext. A renderer puts those in the control and hands them back verbatim;\n`@jarenjs/app`'s `formEventFields()` decodes them. That keeps a `enum: [1, 2]`\nselection a number instead of `\"2\"`.\n\n### Re-evaluating only what changed\n\nRules compile once and run per keystroke. On a wide form most of that work is\nwasted — a keystroke in one field cannot change what a rule reading two other\nfields concludes — so pass a **memo** and only the reachable rules re-run:\n\n```javascript\nimport { createRuleMemo } from '@jarenjs/forms';\n\nconst memo = createRuleMemo();                       // one per form session\nconst tree = buildFormViewModel(model, data, { rules, memo, catalog });\n```\n\nEach rule's dependencies are derived at compile time from the root-anchored\npaths in its query documents (plus its own location). That over-approximates\nevery read, and soundly: the only way into the document is such a path, and a\n`$let`/`$for` variable can only hold what one of them produced.\n\nNested filters contribute their root reads too. Replacing the compiled rule set\ninvalidates the memo's results and template keys, even when the data is unchanged.\nThe memo diffs the previous document against the new one — reference-equal\nsubtrees are skipped whole, so an immutable edit costs O(change). A host that\nalready knows what it wrote can skip even that with `memo.touch(pointer)`,\nwhich is a promise as much as an optimization: touch one pointer while\nchanging another and the rules you did not name keep stale results.\n\nMeasured on a 200-rule form (one `visible` + one `assert` each):\n\n| tick | cost |\n|---|---|\n| full evaluation | ~54 µs |\n| memo, one field changed (diffed) | ~13 µs |\n| memo, one field changed (declared) | ~4.7 µs |\n| memo, a field every rule reads | ~58 µs |\n\nThe last row is the honest one: when a change reaches every rule there is\nnothing to skip, and the memo's bookkeeping makes it slightly *slower* than\nevaluating straight through. It pays when a form is wide and its rules are\nmostly local — which is what a large form usually is, and exactly when the\nfull evaluation starts to hurt.\n\n### The form session — submit/draft lifecycle around one document\n\nPass `options.session` and every node additionally carries `id` (a stable, **injective** accessible element id derived from the pointer — distinct pointers can never collide, because every character outside `[A-Za-z0-9]` (`-` and `_` themselves included) is escaped as `_<codepoint>_` *before* the segments are joined on `-`, so a member name containing the separator or an escape cannot forge another pointer's id: `/a/b` → `<prefix>--f-a-b`, `/a-b` → `<prefix>--f-a_45_b`. Member ids carry the `f-` marker so the `<prefix>--root` sentinel is disjoint from every member, a member literally named `root` included. Write the same escaping in your `<label for=…>` if you build an id by hand), `describedBy` (the id of the node's error text, or `null`), `dirty` (presence-aware deep compare against `session.initial` — adding or removing a member counts even when both sides read back `null`), `touched`, and `serverErrors` (kept distinct from client `errors`). The root gains a `session` summary:\n\n```javascript\nconst tree = buildFormViewModel(model, data, {\n  rules, validateFields: true,\n  session: {\n    initial,                       // the baseline document\n    touched: ['/email'],           // pointers the operator visited\n    submitted: true,\n    submitStatus: 'pending',       // echoed verbatim\n    requestId: 'req-7',            // the in-flight submit's identity\n    serverErrors: { '/email': ['Al in gebruik.'] },\n    idPrefix: 'customer',          // ids become customer--…\n  },\n});\ntree.session;\n// { dirty, dirtyPaths, submitted, submitStatus, requestId,\n//   errorCount, serverErrorCount }\n```\n\n`session.dirty`/`session.dirtyPaths` are the **navigation-guard authority**: they come from a full JSON diff of `initial` against the current data — independent of what is rendered — so removed array tails, members removed or added (including explicit `null`), and values retained under rule-hidden fields all count, each contributing its pointer. The diff walks **own** keys only (`Object.hasOwn`), so hostile-but-legal member names like `constructor` or a JSON-parsed `__proto__` diff as data, never through the prototype chain, and it RFC 6901-encodes every member name as it builds the pointer (`~` → `~0`, `/` → `~1`, the same `encodeJSONPointerSegment` the model, rule and validation walks use) — so a key containing a slash or a tilde cannot collide with a nested path, and the entries of `dirtyPaths` feed straight back into `getValueAtPointer`. To keep the authority unconditional, a root-level `x-form` `visible` rule is rejected by `compileFormRules` with a `TypeError` — hiding the whole form would null the render tree *and* its summary; gate whole-form visibility at the mount boundary instead. The per-node `dirty`/`errors` members remain the render-layer, visible-only summary. Without `session`, the tree is byte-identical to the sessionless shape.\n\n## Exports\n\nEvery subpath a consumer can import, derived from the manifest by\n`npm run docs:derive` (`npm run docs:check` fails when the two drift):\n\n<!--fact:exports.forms-->\n| Import | Kind | Declarations |\n|---|---|---|\n| `@jarenjs/forms` | JavaScript | declared |\n| `@jarenjs/forms/package.json` | metadata | — |\n<!--/fact-->\n\n## Development\n\nUnit tests live in `test/forms/` at the repository root. See the repository [README](../../README.md) for the full Jaren documentation, and the [ROADMAP](../../docs/ROADMAP.md) for planned forms work (rule dependency memoization, hidden-field pruning on submit, computed views through JSLT).\n\n## Form chrome policy\n\n`formChromeLabels(catalog)` supplies `addItem`, `removeItem` and\n`jsonPlaceholder`, with English fallbacks and translations in every\nlocale pack. Pass them to `createFormView({ labels })`; the JSON hint is\nboth an empty-editor placeholder and an accessible description. A label\nbeginning with `$` remains literal text.\n\nThe add/remove glyphs and required marker are decoration, not message\nkeys: customize `addLabel`, `removeLabel` and `requiredMarker` on the\nstylesheet. Required controls carry `aria-required`; the decorative\nmarker stays hidden from assistive technology. JSON syntax and the name\n“JSON” retain their wire spelling; instructions around them are localized.\n","readmeFilename":"README.md"}