{"_id":"@ngblocks/form-nodes","_rev":"33-be5e46dce0af0049cf3f259af1e21a3e","name":"@ngblocks/form-nodes","dist-tags":{"latest":"5.5.0"},"versions":{"1.0.0":{"name":"@ngblocks/form-nodes","version":"1.0.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@1.0.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"d95c971cb63ef9f6fafb0dae49fcb01b6eebf6ce","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-1.0.0.tgz","fileCount":8,"integrity":"sha512-j7k4Qqhr0UOPNNLB8Q8+y5beWdt61JxDbwgQDm+aGFY6QKdJfrs93F5adNcg++/ttTcUUAaVLw+zgsDWq/E/Rw==","signatures":[{"sig":"MEQCIEZo1XEL0aXMpfXg3nEH5r0wvb4oPnwErwJ0GJfzQrA/AiA8n9h/ga+O3zYMFzDZIMfoO7pQK7eok3Kd4E9kqzKCmw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1068993},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"eb053642992b1dc2df491430a6708eeb273dde48","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"11.19.0","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"26.7.0","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_1.0.0_1788801236576_0.8764936452954981","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@ngblocks/form-nodes","version":"1.0.1","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@1.0.1","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"0d3d8c513930a00f27640121ebf3f400adf5b15b","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-1.0.1.tgz","fileCount":8,"integrity":"sha512-ZfOgU+edVL7Jp61X+TeTvjCnYNxEcQWyycS8s2PueYcK9AjYrQHhEJj1UofszCuRGxJojgjaBPDglnhVHx6MeQ==","signatures":[{"sig":"MEUCIQD5GN03QkO8/RKJAPAQ/FXZpE6HmTOrA5xhHpjsebuzXwIgAMVxgubQMBbqy6dguRVtP1algi/xS7tT0dJTerZZUII=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1069466},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"a7cfc9f1df8776f59cc112ef34487b67acc3d13c","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"11.19.0","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"26.7.0","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_1.0.1_1788805618545_0.9390587248880728","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@ngblocks/form-nodes","version":"1.1.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@1.1.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"c3d38880152cedc3bf282e8e8d10533f1fa18e47","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-1.1.0.tgz","fileCount":8,"integrity":"sha512-f9Qx0SmHwrdOT3b/c9rys9y7QEeEDKP3rxSpOE1NO6CB8r2v9IzhYCSxi9hnIkvKNkwYjHAKeDAq1vxqm4oAwQ==","signatures":[{"sig":"MEUCIQCYhvU0Oz+RvQJjbyZ+CgRRWxSEdp2QGptXIbgcQtZYUwIgSDh2fQ4jq1b2Y+sihcvc1eJ7OzYUnAs7TwTWgGOOJwk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1078765},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"ac9418aeabc014d41f7068248d06f1b63ed87503","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"11.19.0","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"26.7.0","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_1.1.0_1788809244820_0.6614365105141493","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@ngblocks/form-nodes","version":"2.0.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@2.0.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"511be56e92f59e62c7fe2014a19537d377541a51","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-2.0.0.tgz","fileCount":8,"integrity":"sha512-YWWnkZJXMEr/WRPKYxHwcOjaMYcWAbZAIYrMsKNl6BjfIPYdj2Q1+BXEDuTti5J2M+EDl7+hzUkTUebwupRZPA==","signatures":[{"sig":"MEQCIDtEgPde/QvtDX9tU5rRU0o4g75uQUlMu5HA0WXBb+kvAiB1pf6x1owSf9aEh76I6qp54Yecq75XtuOpvY30qzmtgQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1246053},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"754855698b898604c72d11676529007d9745d837","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_2.0.0_1788895999148_0.17735716034348603","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@ngblocks/form-nodes","version":"3.0.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.0.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"0ad80beea0dab4b80cacdde499747c0d42fc7ae9","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.0.0.tgz","fileCount":8,"integrity":"sha512-DpHdEzAUJFLwEDcrHEOWi/Ho0zz+KEoDgJcpFoxtnJ6RW9CL00s5e3QuidG6kwY4o1W6VksNB3Uhw95gMbQjDg==","signatures":[{"sig":"MEUCIGXA98+reeXTRPEn8gURDrjo8IyPUsFcOaQ9bWgD0jrSAiEAj2rN4VzOglRdqUIOjgVlPBTRSdG8xyjP5QUrAIz3cX8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1259734},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"cc17051e333de5bcafd460a375c85855eb2ef2f8","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.0.0_1788901386925_0.6333388654769074","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@ngblocks/form-nodes","version":"3.0.1","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.0.1","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"5d211ea7ccbf798e30025b34ecca979b597b7117","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.0.1.tgz","fileCount":8,"integrity":"sha512-HsDDzFC/YzObLlt/fbp2xIDwOSFDQ9PuHvDvnhzAhDytpTFRmhirbRS0XqnhciVcDB8lCJq6bID5POMUQrfsfw==","signatures":[{"sig":"MEYCIQDltJ4GJaqZQQYgI5xqnrgvLkO5IyX+6rs6m4B293o7fwIhAOcCld2gYYVusUeotSsxSPJ1+hZqh5WU01oEp88C9t7m","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1260791},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"6392cdc5e392478d1e79484f86a9cbb9eb5f6fe1","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.0.1_1788909971668_0.7457146868391638","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"@ngblocks/form-nodes","version":"3.0.2","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.0.2","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"0161cc6450aca380754f59e1b1fa6b19420e7f34","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.0.2.tgz","fileCount":8,"integrity":"sha512-GqZ8cJLKTxvNKsqOSZ/umxk0lxKuWddeQUYMs+nwgtGL4GYzbucqk/NIx1uEpwJra35zm3cxVCYsXBHrQcq/Tw==","signatures":[{"sig":"MEUCIBYOMAOEH4guY6yHywpbVVs5WQN/VE5LWTp0oeiBKA9bAiEAow7+CY7UrjMrkG0NddJcw0QkYFpAaeaxJuGCvdakiwk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1263949},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"03725af159ee9581b45156874382f6d5a1f3542b","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.0.2_1788912765868_0.12003676240362049","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@ngblocks/form-nodes","version":"3.1.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.1.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"8282c63bb40325f1ff29061c0fc4fd0b4a70483a","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.1.0.tgz","fileCount":8,"integrity":"sha512-WzmYb6N5rl+kAUHY/MRs+rA9RF9Ohg2dSBdS1cy9k5jSuEnFH3r0t29E7VTNeOPyu9Obq4goc6+W5J54qRpYEw==","signatures":[{"sig":"MEUCIEP8AYYHCXDlXnhLEYiyYhxhXU/z/GanP5Qvob3w0ngZAiEAsdGIb6U+ZZrVYA2xuXtIMVBKPNjLocYstNU/l/Jn1Fo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1283164},"type":"module","_from":"file:/private/tmp/ngblocks-form-nodes-3.1.0.tgz","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"_resolved":"/private/tmp/ngblocks-form-nodes-3.1.0.tgz","_integrity":"sha512-WzmYb6N5rl+kAUHY/MRs+rA9RF9Ohg2dSBdS1cy9k5jSuEnFH3r0t29E7VTNeOPyu9Obq4goc6+W5J54qRpYEw==","repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.1.0_1788972753687_0.9728159113074701","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"@ngblocks/form-nodes","version":"3.2.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.2.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"b7219c7452849411c9a9617c5f54d26316fc94af","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.2.0.tgz","fileCount":8,"integrity":"sha512-iJ+lpoWg1sN9W/C/AfneFLZf0n9Y2NcSVs3V5MNf/3ZgIvXHGOskM5ZpmrCPG7PTIsZQHFTcu7AYWFIpH8xM+Q==","signatures":[{"sig":"MEQCIAHe6Z9LZSXk8i5Tq5nE0nl+os7sRpVyN7vZmkP22ePrAiBF6ibnoRIJyxGq64hUQ0wOQCInFyI09bQu7sGAAkIBlg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1303077},"type":"module","_from":"file:/private/tmp/ngblocks-form-nodes-3.2.0.tgz","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"_resolved":"/private/tmp/ngblocks-form-nodes-3.2.0.tgz","_integrity":"sha512-iJ+lpoWg1sN9W/C/AfneFLZf0n9Y2NcSVs3V5MNf/3ZgIvXHGOskM5ZpmrCPG7PTIsZQHFTcu7AYWFIpH8xM+Q==","repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.2.0_1788974587335_0.9892437297244878","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"@ngblocks/form-nodes","version":"3.3.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.3.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"fa2f323820f6506443875cbbf99440de33c332c0","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.3.0.tgz","fileCount":8,"integrity":"sha512-K8+n85Bgs16bRMOewIxY24RTwjBJfKwf8IfGEI+1+pBG6Giln3uLErZETf9f6RgT7+iI0QK4uW1Rk0wipvNKkg==","signatures":[{"sig":"MEUCIQDaWNb7rlME2G2gejd8RDXScfXg8vY20DT/6j+4gGiFyQIgQwL8d0jWvnxBBseFfrGlnpV6Ziu7Nvye0KIdsUVBEG8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1328582},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"b741bae6f4744254a761fa49969d25869ccc839a","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"11.19.0","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"26.7.0","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.3.0_1789001533777_0.30428684484544055","host":"s3://npm-registry-packages-npm-production"}},"3.4.0":{"name":"@ngblocks/form-nodes","version":"3.4.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.4.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"bf8e67a0366ad65df2550e4cc8461f2f05322b83","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.4.0.tgz","fileCount":8,"integrity":"sha512-wo+OrP/ycW2w6eNArLYqMv76Qsq/eYt7JRUGgAzlSSrt0Z0zziSNOAsh8HYOqzGZxGsceuLXeE8BCawbyAZReQ==","signatures":[{"sig":"MEYCIQCaiQSgdd5VE5lfnqjQbDRsbUPlZ0Ap10IgSKV/qolwZgIhAPg3AocOckaNz5YqcaKoEkKEM79VZP5Ht39JEDYoxJae","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1355069},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"9a2d3cf7e13d503ef1b82d033518e032ab219225","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"11.19.0","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.4.0_1789045010172_0.04334456159401867","host":"s3://npm-registry-packages-npm-production"}},"3.5.0":{"name":"@ngblocks/form-nodes","version":"3.5.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.5.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"a34c47d9808fe7e878072cf0c4d292ccc706d34e","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.5.0.tgz","fileCount":8,"integrity":"sha512-ODaZzdLpYtj1rjjm3FsnWTklvPSjTxDbjd1CK0HZ2rcrGj/qcrAU1Sj8gRv9seg5nKb5YzfAlvaR9JMgcfcjyA==","signatures":[{"sig":"MEQCIGyDaFj5nRESST5W2L8Xlw0i45XUcN2OUGpodIK2b7E1AiAkreJ/BYdURcIDHHeqBWqa8UFXlyU4/sQWy0r5Dc/9Hg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1369523},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"d77574019921c35de77016825dca52f0e2fb4c8e","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.5.0_1789052737376_0.48010176302693686","host":"s3://npm-registry-packages-npm-production"}},"3.6.0":{"name":"@ngblocks/form-nodes","version":"3.6.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.6.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"c73dcfae1121c8dfadd9d7e587ab5fa8ba2ef9a4","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.6.0.tgz","fileCount":8,"integrity":"sha512-BywUuRoM1ggkRkKcaF4usPpDe/XjwbIqUxBZTgp8Mv7ezAHII75Zse5F0ik2/k3SEwuDFMJTGOE6qhQaZRnU2w==","signatures":[{"sig":"MEUCIQC89PV9nWxI4YyXQkD8mG+yVz2/2pmvJsyebAaeTE/oSAIgaD/BU1k8+zQvxYtQaNs825pOut3eY4gL4Bce06BGu0U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1383061},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"fa32989fc8f1f15ce948c3b367de4d41273f6ae1","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.6.0_1789056224997_0.24692133127605276","host":"s3://npm-registry-packages-npm-production"}},"3.7.0":{"name":"@ngblocks/form-nodes","version":"3.7.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.7.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"41305761b37fe10705003ac73ce75b618a8a974a","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.7.0.tgz","fileCount":8,"integrity":"sha512-E2M5EJYBx23wNEO7qnNHx/affuOto6jom/gH/gQtiFcrsFoJxU8YwDf5mqYpUDFFciEHK+0y6CORWzDq5Ca8tQ==","signatures":[{"sig":"MEUCIC/uQ1kr9idf51jGal1m5n4/WWk8H8QIjpXey0OD7+DaAiEAgf4+8zcFU4uoL5JuIUZdCjZ30jJXG0Qr5sb4nBXX1kM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1442920},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"10db4cc784efd4cf55596a5c3df8407a0c710094","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.7.0_1789085304541_0.5084216349246748","host":"s3://npm-registry-packages-npm-production"}},"3.8.0":{"name":"@ngblocks/form-nodes","version":"3.8.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.8.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"7bc7ccb673519d9c012f9770f6f68af818550d95","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.8.0.tgz","fileCount":8,"integrity":"sha512-8awTMoklxoJAXrV9zBaPlkjdE4SQgHmagu06bgM4quygwhMePxlbDqikRVJvFD9ltnq5Xg827fNKzWdT+H8HBg==","signatures":[{"sig":"MEYCIQCswTB07cve1Rz/8oSZL2gp0NDpgJ3/8eBk2VzhkLaYSAIhAPCwH9GIQQx/ye4YaKr57ksja9/4lNseMpUIDafVuBZo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1480629},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"39355d69fa59c9481e6db06db707d4861dd2e081","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.8.0_1789097813557_0.6937935832218309","host":"s3://npm-registry-packages-npm-production"}},"3.8.1":{"name":"@ngblocks/form-nodes","version":"3.8.1","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.8.1","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"37612053a19b441e096678f10ca7059470e34907","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.8.1.tgz","fileCount":8,"integrity":"sha512-UWn94IVHbn39cQhdzadOlQtU+0psj5nC/PSLDv6rWQ2zJdOiwUChSUvfBbcQKuVH6shmlADCpyPrQHULc6Us2Q==","signatures":[{"sig":"MEUCIQDTTGI03Dp35W/FJQaLENlfuugvYa4k5DQivobBwd3LBQIgadTa2qaWxiR4sgSZms55nHlkciApIhYpjis//ASZ9lM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1480831},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"1fdb17ce8e19fea95d4941c3092c053bbd1fa158","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.8.1_1789131177947_0.9380327309258596","host":"s3://npm-registry-packages-npm-production"}},"3.9.0":{"name":"@ngblocks/form-nodes","version":"3.9.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.9.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"7fa85657a7c808b9d8a031b85b2ef6f1c20ed483","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.9.0.tgz","fileCount":8,"integrity":"sha512-V6bm/pKtnw3vg1zTDOlPQhx5zFRXANsGoNpP01wTjMqJK4Usa8DojAXFcP6eoCxWTKOp3WWDow0oHCJBZDBpMA==","signatures":[{"sig":"MEQCIGFW1t0Cd7DwbZ630nEkHpwCexITlm2qsdA2YhZCyqFrAiB4LB157Pu1joEPA/cd3ULivR3pWRwENf8Nb3VCL68lZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1499542},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"93be8fbc45cf23ce2ee7a5025be6d5d8b9e18ee3","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.9.0_1789143608452_0.9803390265171561","host":"s3://npm-registry-packages-npm-production"}},"3.9.1":{"name":"@ngblocks/form-nodes","version":"3.9.1","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@3.9.1","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"29f42a27a2bf95fe4c92b97da14b3b12e7d5d2bf","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-3.9.1.tgz","fileCount":8,"integrity":"sha512-t1NxORBs9opi5vor0VZh3aGR8A24lZkAG+lDYuWdaINQJN/BcJYFnpNDy0krCch3mIA00V3a/Di9hqLIgPcFnA==","signatures":[{"sig":"MEUCICZ4nlsA1LgiHvuTCgYb5PU1d6MfMvmN/NC1hbEr4tgRAiEAztRrXKlImn9N+xPm8/kuH01AJ/bv7XPQGxJ/wj5H0Ew=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1501909},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"f0c68b5349c9e977f735a01f72440787f0286e6a","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_3.9.1_1789206045229_0.20523036126336547","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@ngblocks/form-nodes","version":"4.0.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@4.0.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"8d0f2e74c755d0d4ab1aacb96295c47ac656306e","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-4.0.0.tgz","fileCount":8,"integrity":"sha512-STshfw8dc3QFo4at/sxUVhk/O8pByhzzrSxOCYHvk53HV/pvgGh866Pm/rJC/t77rRLOiENyfdP7sQJ+jv6m+g==","signatures":[{"sig":"MEQCIGewC/J2JlEp4LsEJRXECxsOz+bOf021EEQOcauNXtbOAiBXPltdepFC0dtgmjCjLDIUhS5mK2atWOKRIVGtHa5zCg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1515472},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"597b0397d021a8cd947d45a786d24b2b5176125e","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_4.0.0_1789402529837_0.7712152989827974","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"@ngblocks/form-nodes","version":"4.1.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@4.1.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"4f4a7a2545feea39cf60a3c7ae9d2fc1a3d46556","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-4.1.0.tgz","fileCount":8,"integrity":"sha512-MH7O/Ix1whWg+GXfTMeNdHMgZWdUDbcS2NsnJGJENICbhrbWXAmqWDje2kotV51tDyCaxzLC9j1IQE5nBr4XQw==","signatures":[{"sig":"MEUCIAseZN7AfLd+Mt/7g5ZbIh3+KAiQgmbc9RA4wJsmHVshAiEA5QWb3qUIJ/VazO2T1gndb69PHY2xXTVc5ZG+kvvEjt8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1514931},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"b6488c202e7c8f8265e75ee6013790c43f4ab61b","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_4.1.0_1789409640287_0.6034283424848437","host":"s3://npm-registry-packages-npm-production"}},"4.2.0":{"name":"@ngblocks/form-nodes","version":"4.2.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@4.2.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://gastonmesseri.github.io/form-nodes/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"13e8b3348c1b92357d531bb5b5b145916ed312c6","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-4.2.0.tgz","fileCount":9,"integrity":"sha512-IIc3yyJJx88sWp8r2EFbS/9AnCByd8jk89m65VpYcgM7EIXen7KNaYGvySoOyKtDUVqBjt1awkck30/VFsHUig==","signatures":[{"sig":"MEUCIQDNc2BKs+XOhsmimdDTKVKsrRXLszSupeF1+32AypjMvwIgV19dmiMYLnwDujcI0MzUNGW8hePx8xbZfXJnPIMMLVg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1528501},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"2c6920a210d4c7bc0b2f10e9a3a0f2c682999237","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_4.2.0_1789475838551_0.5230465161453299","host":"s3://npm-registry-packages-npm-production"}},"4.2.1":{"name":"@ngblocks/form-nodes","version":"4.2.1","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@4.2.1","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://form-nodes.js.org/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"7c9485f9de4a78384f87270d6b8e1d4143cef94b","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-4.2.1.tgz","fileCount":9,"integrity":"sha512-YV7PYNjUeYWipEpkTbhRfh0Uop0ED9u+ak+HnX7Zn2exk4ZHFrMXV7VplwaYjj1KoLKtDMePOL7Ceb3G/VZWlA==","signatures":[{"sig":"MEUCIQCFtenBMNfv/BoDETXiV9z8D+kw/ICPB2RI7GZfIZXFhQIgBUh07OUXvWomw8GBio3Kw686h3p4ZpxnMX/FzspySYg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1528230},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"50ef51b8b29b488ae611aecca23570037ba87cea","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_4.2.1_1789482269561_0.8172090349635963","host":"s3://npm-registry-packages-npm-production"}},"4.3.0":{"name":"@ngblocks/form-nodes","version":"4.3.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@4.3.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://form-nodes.js.org/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"4ff3e9c0ad2ce0154307b83a615c274eb35d7a89","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-4.3.0.tgz","fileCount":9,"integrity":"sha512-TknCIor6wn54FCEIa2zdPQb4nXg51IleJq7ZOCpEmcD/1fQgx77zIksKS7nuj43ibXxtvmsRWIGYo+VeKRdnpA==","signatures":[{"sig":"MEYCIQCwr2jiqlXxuPcxIFUXzfeB5wDmN5K17Doq9S3Asp9mrAIhAM5ShKXTfoqEiWBRREK+AOpSUGAxLI3nV68g5r8WjGSo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1824255},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"512e3a4ed3257ddffac0420600bdc2dedc958949","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_4.3.0_1789665961769_0.13667567271988834","host":"s3://npm-registry-packages-npm-production"}},"4.4.0":{"name":"@ngblocks/form-nodes","version":"4.4.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@4.4.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://form-nodes.js.org/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"325c3beb67f018ff1ddfc4e9978d4b32214c86ed","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-4.4.0.tgz","fileCount":9,"integrity":"sha512-bIsy+fWJH8/aiSfx5JJEBJpkjjciGzf78OYQX8gAN1Wg9hOoOjdVFt/MTPzGBfUolLnREEYrrujVvmTifN8mlA==","signatures":[{"sig":"MEQCIEyf0duYJz7LZ6np9R1q6C3dPiBl07+tBBm5n+257PLgAiAHWW1/ga22ZeJ35tOU0GHs4cj7+1td2ELjEZ8LQqM85g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD9SYjMlWqSURbBPdNe6fQxwjvB/xniw0Dt9wIixoVJQwIhAL4tNFbOffY78oxBlbyCPqhmpbJcIPFcCWbARAwYmb08","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1829691},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"06ebef468afe9a17be3f71156b66e005c9be45c1","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5"},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_4.4.0_1789672341511_0.23041106314042237","host":"s3://npm-registry-packages-npm-production"}},"4.5.0":{"name":"@ngblocks/form-nodes","version":"4.5.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@4.5.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://form-nodes.js.org/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"92d0ca2457f1aeee0d5c3b10ef1f9852c373e7c4","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-4.5.0.tgz","fileCount":13,"integrity":"sha512-uTOeEDOUabMeXyY0IhU3qKTVI4wQytNB54gEHK8myQSlF1OfIyQwHow2vu4u/5JPl6ccmx6lPEVOhwZav4hr5Q==","signatures":[{"sig":"MEYCIQDLzkgXUu/QZNn+cyjrz7U/XliRTXvSSNO3psDRsmBoYAIhAJ5q9nUGgkKo5pVnVv8THqrdUbkxjkqw2gMcCj9w9I1h","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHKykAdRDzbRvt/Koq18IxVIrQAJ/H9lhgNi9RZtXR3TAiBeRwqrFCbZLLJNrC0W6NckRkf4w61F1qt8B4dt08pcmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1948518},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./router":{"types":"./types/ngblocks-form-nodes-router.d.ts","default":"./fesm2022/ngblocks-form-nodes-router.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"fb2f7a32194c58776de9f3d1ad9c013b5318c2a1","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5","@angular/router":"^21.0.7 || ^22.1.5"},"peerDependenciesMeta":{"@angular/router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_4.5.0_1789933264750_0.6514307009541942","host":"s3://npm-registry-packages-npm-production"}},"4.6.0":{"name":"@ngblocks/form-nodes","version":"4.6.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@4.6.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://form-nodes.js.org/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"3a98578084a5fbfdcb0d4ce51b8870363d58bc1d","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-4.6.0.tgz","fileCount":13,"integrity":"sha512-LzLohP/9kRsDWR7uNECce4A74Z4ualHrFieINFQx77R+KLUkGOrWkfsCM119mqgQE5lwlKMkcvTscybt6wlJag==","signatures":[{"sig":"MEYCIQC+G9KdFyhAIw+2t3PMOY3H5PSbvw32+t5+0e9cRpYJ9QIhALRTCJQZ4glaEv7YA48EqlXT+SNGVolxEfrDM2DeWcGR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC7kRWo1gFHAwzvanJ035L+2hC/eMX6jYcU++bCP3f+/wIgQk1ICjUx390YhwX1VF013/oUkljg4Z+F9pSk9f27+kM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1953674},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./router":{"types":"./types/ngblocks-form-nodes-router.d.ts","default":"./fesm2022/ngblocks-form-nodes-router.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"70a7d9560777ca70daf25a384e765aca784238cd","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5","@angular/router":"^21.0.7 || ^22.1.5"},"peerDependenciesMeta":{"@angular/router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_4.6.0_1789982327233_0.10769743101062268","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"@ngblocks/form-nodes","version":"5.0.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@5.0.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://form-nodes.js.org/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"c89c6dd769a5e1199f0866933db0921f461c4589","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-5.0.0.tgz","fileCount":13,"integrity":"sha512-6BVcUTlJgHUZC3W+8quesOcqBWZJuMlaLdgSbRW1fhcMPg/0ikzSbt/PPAFcx8xjd1P6jAJReQjH4vfpvMFrew==","signatures":[{"sig":"MEUCIQDNUq/ECSoEJPbnmfgdFT2e0ByhwjK6Bh2eN+zNC5xMhwIgIvXCIB+UOw0vLgnI9Hp4VB2F4i1+Ka97ZH35KS+lr1E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEkzcRElLvnraHY7AEXbnEvw4jJJ0pF9O1B6+qHubiSrAiAURNw1cAz8lxAsERwgK1bIrcYCkyJSDybjMGt3LulAoQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1958484},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./router":{"types":"./types/ngblocks-form-nodes-router.d.ts","default":"./fesm2022/ngblocks-form-nodes-router.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"3e5d19f7a644f6ca846b6965486f9adbe9f7ffe9","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5","@angular/router":"^21.0.7 || ^22.1.5"},"peerDependenciesMeta":{"@angular/router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_5.0.0_1789987526766_0.1749141572970716","host":"s3://npm-registry-packages-npm-production"}},"5.1.0":{"name":"@ngblocks/form-nodes","version":"5.1.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@5.1.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://form-nodes.js.org/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"dad0361cc3213b61a84706d73ec10c4deec34291","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-5.1.0.tgz","fileCount":13,"integrity":"sha512-K8ew1s07NxUbhqPwp0EaSCmc/9ByaOY3+xHY13/coVevWdmgPD2esPbkzhJRSyE+kWpPMRpQhlKFGOtZF86AEw==","signatures":[{"sig":"MEUCIQDtllIa7W1SO8GuSQyFl+Z0O20bbErZL+FgoImkL3W1PAIgJRL6U0Tb9fgoSmh6MIxj4E1B8xihFeMRdF1Ifrm9bSA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCSPp9sbOlQxgq+q6yx1+bgaU5kk6xxvLLQOEcruY0flQIgBVa35r71d0JMv0kDzdhtdtvgOJj+xyZpdv1Nlww7834=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1962852},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./router":{"types":"./types/ngblocks-form-nodes-router.d.ts","default":"./fesm2022/ngblocks-form-nodes-router.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"b3ea86b2c043c62748481b304960fc371843e62b","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5","@angular/router":"^21.0.7 || ^22.1.5"},"peerDependenciesMeta":{"@angular/router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_5.1.0_1789997862476_0.7284660497432673","host":"s3://npm-registry-packages-npm-production"}},"5.2.0":{"name":"@ngblocks/form-nodes","version":"5.2.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@5.2.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://form-nodes.js.org/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"417b6aaa76f425266b1a0be2d24e113d39dca674","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-5.2.0.tgz","fileCount":13,"integrity":"sha512-Zuw43DR22Mc1he3duAY+AG5GFTtc4pPqBbY6/txabJctOMWPQyv09YzNmoD5jqIyUn3N7DDyLnNRGVFyXfE13Q==","signatures":[{"sig":"MEUCIQDtH4f3xBSrhoYVLZlAxP4dIsERDCCWEXcZ77CZwnIs1QIgdIb0yUvrrThrAKL8tHOHNLgPKw6RrTG6rmWcnO6KBRo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFCPZ/JPpI/mL8R1MjAQyr10HtrPe/6w6toBJxDu8aIRAiEAr6KGlGbkpNndiYlfU8xeVFizchSO14vZwYvC/9x436I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1969501},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./router":{"types":"./types/ngblocks-form-nodes-router.d.ts","default":"./fesm2022/ngblocks-form-nodes-router.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"780f391b0862f14e7874d48319b196c96600501a","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5","@angular/router":"^21.0.7 || ^22.1.5"},"peerDependenciesMeta":{"@angular/router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_5.2.0_1790000854647_0.34119033208097393","host":"s3://npm-registry-packages-npm-production"}},"5.3.0":{"name":"@ngblocks/form-nodes","version":"5.3.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@5.3.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://form-nodes.js.org/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"a1694d9710e1ef4dcad5c61961f4160bd6d86b4a","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-5.3.0.tgz","fileCount":13,"integrity":"sha512-HqX/f3YnDvVERFRipTOBRbYZ+/UsHZKbO0Fmw59rulFrl/FRa/cAQs8uXULBL1UbWut+fbonA+6hKtLEtu+kmw==","signatures":[{"sig":"MEQCIG+3DazVKlfcFO/u05oYWqd2B9nL0FvsolxH5WZqPG7KAiAnQDghfj+MdFBOjm8whgrDTEbJhIJapye1rYJGb8kAJw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIG9QeyM6mUQ54Yg9te6wUFhtqS15OLmoidLDw+uGkx6JAiAMUAMKbU7G7rUQjM6VY3NbJwLtwum73XdtNxFdMEOwpQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1974686},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./router":{"types":"./types/ngblocks-form-nodes-router.d.ts","default":"./fesm2022/ngblocks-form-nodes-router.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"26e9b311971234edfe0a910bbf5079ec17dfaf3f","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5","@angular/router":"^21.0.7 || ^22.1.5"},"peerDependenciesMeta":{"@angular/router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_5.3.0_1790006398284_0.2506053972050051","host":"s3://npm-registry-packages-npm-production"}},"5.3.1":{"name":"@ngblocks/form-nodes","version":"5.3.1","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@5.3.1","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://form-nodes.js.org/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"58ee78be8a388ea5e49b8a53a9f0c4a3b399f8e6","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-5.3.1.tgz","fileCount":13,"integrity":"sha512-k4/7sxKCmJigeXFqP/lg3uVCvIDyGw13yRibXB0AIS1bINrZS7qFCO3g7qx0fOxsqL5ilCHxRH+B5COX0vbicQ==","signatures":[{"sig":"MEYCIQD61M0MAtpAOdFr8vTCjh4aqK9akqQQgsMVHqYPH4nt2wIhAO0bMJDjJ0avxtdrkpt26AuBd3gx3z4wlyst/DYqZRER","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDCWQ7KeZSXLair4Z5k8shKcwf3b+Kgv2gKjdaej2QeRAiB2AsDp8Z2sktO57kS41fhm1gR8rvSpvkDNQt7zdQ54JA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1990619},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./router":{"types":"./types/ngblocks-form-nodes-router.d.ts","default":"./fesm2022/ngblocks-form-nodes-router.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"ed60bb4280fa3a1276ffba93d4fd0a1d123fc4b2","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5","@angular/router":"^21.0.7 || ^22.1.5"},"peerDependenciesMeta":{"@angular/router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_5.3.1_1790077926263_0.8770072572031511","host":"s3://npm-registry-packages-npm-production"}},"5.4.0":{"name":"@ngblocks/form-nodes","version":"5.4.0","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","_id":"@ngblocks/form-nodes@5.4.0","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"homepage":"https://form-nodes.js.org/","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"f3afd8f9d5ee28b015cb2e7586f581f27636b2dc","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-5.4.0.tgz","fileCount":13,"integrity":"sha512-h/8Bd6huiagOKjqbC3HiRvn9Q5syNPayX6Astzp7wfupyR5T6CIMRMsi5DlPlTuUjV6PrbU64plDBHCr+35aSw==","signatures":[{"sig":"MEUCIHjMc6XgLFowKha8tkWpKYCpVFe52kztH6qErmIWpIquAiEAldNjbWOHGZ3sxYqK3LNqGviaBUk/X9Gn6bvSYJkqy+g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCtv92arHsJKPqt45XHoIWurTfBLf6vnC80HdIlR6/PHAIgfv5krRB67ueLh9jxeTk7xrdGnlOOjsZqArhy+n0tzPg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1996875},"type":"module","module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./router":{"types":"./types/ngblocks-form-nodes-router.d.ts","default":"./fesm2022/ngblocks-form-nodes-router.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"150752e04815fdc7483f3483ddcf10de8027f108","typings":"types/ngblocks-form-nodes.d.ts","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5","@angular/router":"^21.0.7 || ^22.1.5"},"peerDependenciesMeta":{"@angular/router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/form-nodes_5.4.0_1790084641357_0.38687219351011426","host":"s3://npm-registry-packages-npm-production"}},"5.5.0":{"_id":"@ngblocks/form-nodes@5.5.0","bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"dist":{"shasum":"2324bb5c4dcc8c41f5e8c16dd2e547bbcf5f185c","tarball":"https://registry.npmjs.org/@ngblocks/form-nodes/-/form-nodes-5.5.0.tgz","fileCount":13,"integrity":"sha512-x0HKARXIM3fcZn8uaMuq9K90MVA0KxbKUyuSUfFFuYs5tpdc1A9Q5TKfEvcTLdQn22/dW5xsPrSWOb91Edbtjg==","signatures":[{"sig":"MEQCIHsQzcAD+q3JfaiGUnCMfi2lOmD+SucZPNjNBwh1e6ROAiBFEtmbhvs/M6c+6zUAAJNFd9W3B482GT2sCXE5f2s7FQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD7C34Rblhcyo4WhV9vMat6JWTm0VzNDXLf/D43NT6SdAIhAIvkcQQsupTnBc+B3s8BTa7rowj/eqWaTVQRnU0roL+6"}],"unpackedSize":2018520},"name":"@ngblocks/form-nodes","type":"module","author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"module":"fesm2022/ngblocks-form-nodes.mjs","engines":{"node":"^20.19.0 || ^22.12.0 || ^24.0.0 || >=26.0.0"},"exports":{".":{"types":"./types/ngblocks-form-nodes.d.ts","default":"./fesm2022/ngblocks-form-nodes.mjs"},"./router":{"types":"./types/ngblocks-form-nodes-router.d.ts","default":"./fesm2022/ngblocks-form-nodes-router.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"548fd18e8fa108ee1dc7eedee6df0f20fcccf1f2","license":"MIT","typings":"types/ngblocks-form-nodes.d.ts","version":"5.5.0","_npmUser":{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"},"homepage":"https://form-nodes.js.org/","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"_npmVersion":"10.9.8","description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","directories":{},"maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"tslib":"^2.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^21.0.7 || ^22.1.5","@angular/forms":"^21.0.7 || ^22.1.5","@angular/common":"^21.0.7 || ^22.1.5","@angular/router":"^21.0.7 || ^22.1.5"},"peerDependenciesMeta":{"@angular/router":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/form-nodes_5.5.0_1790261268754_0.8288039531147433"}}},"time":{"created":"2026-09-07T17:13:56.432Z","modified":"2026-09-24T14:47:49.022Z","1.0.0":"2026-09-07T17:13:56.714Z","1.0.1":"2026-09-07T18:26:58.749Z","1.1.0":"2026-09-07T19:27:24.961Z","2.0.0":"2026-09-08T19:33:19.301Z","3.0.0":"2026-09-08T21:03:07.175Z","3.0.1":"2026-09-08T23:26:11.842Z","3.0.2":"2026-09-09T00:12:48.026Z","3.1.0":"2026-09-09T16:52:33.825Z","3.2.0":"2026-09-09T17:23:07.463Z","3.3.0":"2026-09-10T00:52:13.925Z","3.4.0":"2026-09-10T12:56:50.332Z","3.5.0":"2026-09-10T15:05:37.519Z","3.6.0":"2026-09-10T16:03:45.230Z","3.7.0":"2026-09-11T00:08:24.719Z","3.8.0":"2026-09-11T03:36:53.727Z","3.8.1":"2026-09-11T12:52:58.103Z","3.9.0":"2026-09-11T16:20:08.607Z","3.9.1":"2026-09-12T09:40:45.353Z","4.0.0":"2026-09-14T16:15:29.980Z","4.1.0":"2026-09-14T18:14:00.446Z","4.2.0":"2026-09-15T12:37:18.698Z","4.2.1":"2026-09-15T14:24:29.745Z","4.3.0":"2026-09-17T17:26:01.922Z","4.4.0":"2026-09-17T19:12:21.611Z","4.5.0":"2026-09-20T19:41:04.842Z","4.6.0":"2026-09-21T09:18:47.318Z","5.0.0":"2026-09-21T10:45:26.849Z","5.1.0":"2026-09-21T13:37:42.623Z","5.2.0":"2026-09-21T14:27:34.765Z","5.3.0":"2026-09-21T15:59:58.390Z","5.3.1":"2026-09-22T11:52:06.371Z","5.4.0":"2026-09-22T13:44:01.514Z","5.5.0":"2026-09-24T14:47:48.849Z"},"bugs":{"url":"https://github.com/gastonmesseri/form-nodes/issues"},"author":{"url":"https://github.com/gastonmesseri","name":"Gaston Meseri"},"license":"MIT","homepage":"https://form-nodes.js.org/","keywords":["angular","angular-forms","angular-signals","signal-forms","forms","form-validation","reactive-validation","async-validation","typed-forms","dynamic-forms","form-array","custom-controls","control-value-accessor","signals","typescript"],"repository":{"url":"git+https://github.com/gastonmesseri/form-nodes.git","type":"git"},"description":"Typed, signal-based forms for Angular with reactive validation, dynamic arrays, and native and custom control integration.","maintainers":[{"name":"gastonmesseri","email":"gastonmesseri@gmail.com"}],"readme":"<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/gastonmesseri/form-nodes/master/website/static/img/form-nodes-logo.png\" alt=\"Form Nodes logo\" width=\"560\" height=\"420\" />\n</p>\n\n<h1 align=\"center\">Easy Signal-based forms for Angular</h1>\n\n<p align=\"center\">A typed forms library for <strong>Angular 21 and 22</strong>.</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/gastonmesseri/form-nodes/actions/workflows/angular-compatibility.yml\">\n    <img src=\"https://github.com/gastonmesseri/form-nodes/actions/workflows/angular-compatibility.yml/badge.svg?branch=master&amp;event=push\" alt=\"Angular compatibility status\" />\n  </a>\n  <a href=\"https://github.com/gastonmesseri/form-nodes/actions/workflows/docs-pages.yml\">\n    <img src=\"https://github.com/gastonmesseri/form-nodes/actions/workflows/docs-pages.yml/badge.svg?branch=master&amp;event=push\" alt=\"Documentation deployment status\" />\n  </a>\n  <a href=\"https://coveralls.io/github/gastonmesseri/form-nodes?branch=master\">\n    <img src=\"https://coveralls.io/repos/github/gastonmesseri/form-nodes/badge.svg?branch=master\" alt=\"Test coverage\" />\n  </a>\n  <a href=\"https://www.npmjs.com/package/@ngblocks/form-nodes\">\n    <img src=\"https://img.shields.io/npm/v/@ngblocks/form-nodes?label=version\" alt=\"npm version\" />\n  </a>\n  <a href=\"https://www.npmjs.com/package/@ngblocks/form-nodes\">\n    <img src=\"https://img.shields.io/npm/dw/@ngblocks/form-nodes?label=downloads\" alt=\"Weekly npm downloads\" />\n  </a>\n  <a href=\"https://www.npmjs.com/package/@ngblocks/form-nodes\">\n    <img src=\"https://img.shields.io/npm/types/@ngblocks/form-nodes\" alt=\"TypeScript declarations included\" />\n  </a>\n  <a href=\"https://github.com/gastonmesseri/form-nodes/blob/master/LICENSE\">\n    <img src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"MIT license\" />\n  </a>\n  <a href=\"https://github.com/gastonmesseri/form-nodes/issues\">\n    <img src=\"https://img.shields.io/github/issues-raw/gastonmesseri/form-nodes\" alt=\"Open GitHub issues\" />\n  </a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://form-nodes.js.org/\"><strong>Documentation</strong></a> ·\n  <a href=\"https://form-nodes.js.org/tutorial\">Step-by-step tutorial</a> ·\n  <a href=\"https://form-nodes.js.org/reference/api-overview\">API reference</a>\n</p>\n\n<p align=\"center\">\n  <picture>\n    <source media=\"(prefers-reduced-motion: reduce)\" srcset=\"https://raw.githubusercontent.com/gastonmesseri/form-nodes/master/website/static/img/form-nodes-typing.png\" />\n    <img src=\"https://raw.githubusercontent.com/gastonmesseri/form-nodes/master/website/static/img/form-nodes-typing.gif\" alt=\"Create a profile form with username and email fields, then bind both inputs with [formNode].\" width=\"532\" height=\"357\" />\n  </picture>\n</p>\n\n<!-- example: quick-start.typecheck.ts -->\n```ts\nimport { Component } from '@angular/core';\nimport { form, field, required, FormNodeDirective } from '@ngblocks/form-nodes';\n\n@Component({\n  selector: 'app-profile-editor',\n  imports: [FormNodeDirective],\n  template: `\n    <input [formNode]=\"form.username\" />\n    <p>Hello {{ form.username() }}</p>\n\n    <input [formNode]=\"form.email\" />\n    <p>Your email is {{ form.email() }}</p>\n  `,\n})\nexport class ProfileEditor {\n  form = form({\n    username: field(''),\n    email: field('', [required]),\n  });\n}\n```\n<!-- /example -->\n\nBuild a form from `form()`, `field()`, `array()`, and nested objects. Read its values by calling the\nnodes, bind them to controls with `[formNode]`, and use Angular signals for validation and state.\nThe same tree describes your data, your controls, and how they behave.\n\nForm nodes use the same read-and-write pattern as Angular signals: call a node to read its value,\nuse `set()` to replace it, or `update()` to derive it from the current value. Every node is a\n`Signal<T>`, so reads are tracked in Angular templates, `computed()`, and `effect()`.\n\n<!-- example: readme-signal-like.example.ts#introduction -->\n```ts\nimport { field, form } from '@ngblocks/form-nodes';\n\nconst profile = form({\n  name: field('Marco'),\n  age: field(18),\n});\n\nprofile.name(); // 'Marco'\nprofile.name.set('Lia');\nprofile.name(); // 'Lia'\nprofile.name.update(name => name?.toUpperCase() ?? '');\nprofile(); // { name: 'LIA', age: 18 }\n```\n<!-- /example -->\n\nFields add validation and interaction state to that familiar API. Calling a form reads the\ncombined values of its children.\n\n## ✨ At a glance\n\n- **Inferred types:** values, nested children, patches, and validator contexts follow your model.\n- **Reactive state:** read `valid()`, `dirty()`, `touched()`, and other signals directly in templates\n  or Angular `computed()` expressions.\n- **Validation:** built-in, custom, cross-field, and asynchronous rules, with configurable messages.\n- **Dynamic collections:** add, remove, and reorder items while keeping their nodes and state.\n- **Angular controls:** bind native inputs, custom controls, and `ControlValueAccessor` components.\n- **Form workflows:** submission, focus, reset, control-value debounce, and inherited state.\n\n## 📑 Contents\n\n- [Install](#-install)\n- [Your first form](#-your-first-form)\n- [The four building blocks](#-the-four-building-blocks)\n- [Read and update values](#-read-and-update-values)\n- [Types and nullability](#-types-and-nullability)\n- [Validation](#-validation)\n- [Reactive rules and state](#-reactive-rules-and-state)\n- [Dynamic arrays](#-dynamic-arrays)\n- [Submission](#-submission)\n- [Control-value debounce](#️-control-value-debounce)\n- [Where to go next](#-where-to-go-next)\n\n## 📦 Install\n\nIn an Angular 21.0.7+ or 22.1.5+ application:\n\n```sh\nnpm install --save @ngblocks/form-nodes\n```\n\nImport from the package entry point:\n\n```ts\nimport { form, field, array } from '@ngblocks/form-nodes';\n```\n\nThe current `3.0.x` development line supports Angular `^21.0.7 || ^22.1.5`. Both `@angular/core` and `@angular/forms` must use\ncompatible Angular versions. See [Compatibility](https://form-nodes.js.org/project/compatibility)\nfor the Node.js and TypeScript requirements.\n\n## 📝 Your first form\n\nThis standalone component includes a model, bound controls, validation messages, and submission.\nThe example records the submitted email locally; an application can replace that action with a\nservice call.\n\n<!-- example: readme-first-form.typecheck.ts -->\n```ts\nimport { Component, signal } from '@angular/core';\nimport { email, field, form, FormNodeDirective, minLength, required } from '@ngblocks/form-nodes';\n\n@Component({\n  selector: 'app-registration',\n  imports: [FormNodeDirective],\n  template: `\n    <form [formNode]=\"form\">\n      <label>\n        Name\n        <input [formNode]=\"form.name\" />\n      </label>\n      @if (form.name.touched()) {\n        @for (error of form.name.errors(); track error.kind) {\n          <p>{{ error.message }}</p>\n        }\n      }\n\n      <label>\n        Email\n        <input type=\"email\" [formNode]=\"form.email\" />\n      </label>\n      @if (form.email.touched()) {\n        @for (error of form.email.errors(); track error.kind) {\n          <p>{{ error.message }}</p>\n        }\n      }\n\n      <button type=\"submit\" [disabled]=\"form.submitting()\">Register</button>\n    </form>\n\n    @if (registeredEmail()) {\n      <p role=\"status\">Registered {{ registeredEmail() }}</p>\n    }\n  `,\n})\nexport class RegistrationComponent {\n  registeredEmail = signal<string | null>(null);\n\n  form = form({\n    name: field('', [required, minLength(2)]),\n    email: field('', [required, email]),\n  }, {\n    onSubmit: value => {\n      this.registeredEmail.set(value.email);\n    },\n    onSubmitBlocked: invalidForm => invalidForm.focus(),\n  });\n}\n```\n<!-- /example -->\n\nA few things to notice:\n\n1. `field()` declares a value and its validators. The form infers the shape of the complete model.\n2. `FormNodeDirective` is the directive imported by the component. `[formNode]` connects each input to its\n   node and connects the native `<form>` to the submission workflow.\n3. State is reactive: Angular tracks calls such as `touched()` and `submitting()` in the template.\n4. Blur marks a control touched. Submit marks the form subtree touched, so an invalid attempt also\n   reveals the relevant validation messages.\n5. A successful submission passes the typed form value to `onSubmit`. `onSubmitBlocked` can focus an invalid\n   rendered control instead.\n\nInside the component, `this.form.name()` reads the name and `this.form()` reads the complete\nobject. You do not need subscriptions to keep those values current.\n\nFor an even smaller introduction, see [Your first form](https://form-nodes.js.org/getting-started/first-form).\nFor NgModule applications, import and optionally re-export `FormNodeDirective` from a shared module.\n\n## 🧱 The four building blocks\n\nA **node** is a part of the form tree. Every node has a value, validation state, interaction state,\nand operations such as `reset()`.\n\n| Building block | Use it for |\n| --- | --- |\n| `field(value)` | One editable value: a string, number, boolean, date, object, or array. |\n| `form({ ... })` | An object of children with a submission workflow. Usually the root. |\n| `group({ ... })` | A nested object of children. Use explicit `group()` when that branch needs validators or options. |\n| `array(template, options?)` | A dynamic collection whose items have their own nodes and state. |\n\nFor example, `address: { city: field('London') }` creates a structural group with an independently\neditable city. `address: field({ city: 'London' })` creates one field containing an object.\n\nLikewise, `field<string[]>([])` is useful for one multi-select control. Use `array()` when each row\nneeds its own controls, validation, or add/remove operations.\n\nA form model can be declared and used outside an Angular injection context. Angular dependency\ninjection is available for integrations that need it; it is not a prerequisite for creating the\nmodel or reading and updating its values.\n\n[Choosing a primitive](https://form-nodes.js.org/guides/choosing-a-primitive)\nexplains the differences with more examples.\n\n## 🔄 Read and update values\n\nThe following examples use a profile model. Import `computed` from `@angular/core` when deriving\nother signals from a node.\n\n<!-- example: readme-basics.example.ts#values -->\n```ts\nconst profile = form({\n  name: field('Ada'),\n  email: field('ada@example.com'),\n  address: {\n    city: field('London'),\n    country: field('UK'),\n  },\n});\n\nprofile.name(); // 'Ada'\nprofile.address.city(); // 'London'\nprofile.address(); // { city: 'London', country: 'UK' }\nprofile();\n// Expected output:\n// { name: 'Ada', email: 'ada@example.com', address: { city: 'London', country: 'UK' } }\n\nconst greeting = computed(() => `Hello, ${profile.name() ?? 'guest'}!`);\ngreeting(); // 'Hello, Ada!'\n```\n<!-- /example -->\n\nCalling a field returns its value. Calling a group, form, or array returns the values of its\nchildren in the same object or array shape. These reads participate in Angular signal tracking.\n\n### 🔸 Set, update, and patch\n\n<!-- example: readme-basics.example.ts#writes -->\n```ts\nprofile.name.set('Grace');\nprofile.name.update(name => name?.toUpperCase() ?? '');\nprofile.address.city.set('Paris');\nprofile.patch({ address: { country: 'France' } });\n\nprofile.name(); // 'GRACE'\nprofile.address(); // { city: 'Paris', country: 'France' }\ngreeting(); // 'Hello, GRACE!'\n```\n<!-- /example -->\n\n- `set(value)` assigns a complete value to a field, form, group, or array.\n- `update(current => next)` derives a complete replacement from the current value.\n- `patch(partial)` updates only the supplied form or group branches.\n\nProgrammatic writes preserve dirty and touched state. Use `markAsDirty()` or `markAsTouched()`\nwhen an application action should explicitly count as interaction.\n\n### 🔸 Reset\n\n**`reset()` clears interaction state and preserves current values.** It does not restore the\noriginal declaration automatically. Pass a complete value when you also want to replace the data.\n\n<!-- example: readme-basics.example.ts#reset -->\n```ts\nprofile.reset();\nprofile.name(); // 'GRACE'\nprofile.dirty(); // false\nprofile.touched(); // false\n\nprofile.reset({\n  name: 'Ada',\n  email: 'ada@example.com',\n  address: { city: 'London', country: 'UK' },\n});\nprofile.name(); // 'Ada'\n```\n<!-- /example -->\n\nResetting a nested node affects only its subtree. Validators stay configured and evaluate the\nresulting value.\n\nSee [Values and state](https://form-nodes.js.org/concepts/values-and-state)\nfor the complete value flow and reset rules.\n\n## 🧩 Types and nullability\n\nFields infer nullability from the generic and initial value. Use `field.nullable()` when null\nshould be accepted even with a non-null initial value:\n\n```ts\nfield('Ada');             // Field<string>\nfield<string>(null);      // Field<string | null>, initially null\nfield<number>(null);      // Field<number | null>, initially null\nfield.nullable('Ada');    // Field<string | null>, initially 'Ada'\nfield.strict<string>(''); // Field<string>\n```\n\nSpecify a generic when the initial value does not describe the intended type. For example,\n`field<string>(null)` is a nullable string field; `field(null)` infers `FieldNode<unknown>`.\nValidators such as `required` affect validity, not the TypeScript nullability of the field.\n\nTo derive an API payload type from an existing model:\n\n```ts\nimport type { FormNodeValue } from '@ngblocks/form-nodes';\n\ntype ProfileValue = FormNodeValue<typeof profile>;\n// { name: string; email: string;\n//   address: { city: string; country: string } }\n```\n\n`FormNodeValue` works with fields, groups, arrays, and forms. Applications that prefer a different\nnullability default can use [`createFormPrimitives()`](https://form-nodes.js.org/reference/create-form-primitives)\nto create a configured set of factories.\n\n## ✅ Validation\n\nPass validators as the second argument to a field, or through its `validators` option.\nCommon built-ins include `required`, `email`, `minLength`, `maxLength`, `min`, `max`, `pattern`,\n`equalTo`, and `uniqueItems`.\n\n<!-- example: readme-basics.example.ts#validation -->\n```ts\nconst account = form({\n  name: field('', [required, minLength(2)]),\n  email: field('', [required, email]),\n});\n\naccount.valid(); // false\naccount.name.getError('required')?.message; // 'This field is required.'\naccount.errors(); // [] — no rules are attached to the form itself\naccount.allErrors().length; // 2 — one required error per field\n\naccount.patch({ name: 'Ada', email: 'ada@example.com' });\naccount.valid(); // true\n```\n<!-- /example -->\n\n`errors()` contains errors owned by the selected node. `allErrors()` also includes descendant\nerrors, so it is useful for a form summary. Each error identifies its `kind` and `targetNode`;\nbuilt-in errors include a message and any relevant constraint data.\n\nUse `valid()`, `invalid()`, and `pending()` to inspect validation state. In a template, a common\npattern is to show a field's errors after `touched()` becomes true, as in the first component.\n\n### 🔸 Custom and cross-field rules\n\nA field validator can read another field directly. For example, keep a password confirmation in\nsync with the password entered elsewhere in the same form:\n\n<!-- example: readme-basics.example.ts#sibling-field -->\n```ts\nconst myForm = form({\n  password: field('', [required]),\n  confirmation: field('', [required, ({ value }) => {\n    if (value() !== myForm.password()) {\n      return { kind: 'passwordMismatch', message: 'Passwords must match.' };\n    }\n  }]),\n});\n```\n<!-- /example -->\n\n`value()` reads the confirmation, while `myForm.password()` reads its sibling. That sibling\nread is a reactive dependency: changing the password revalidates the confirmation even if the\nconfirmation itself has not changed. The mismatch error belongs to `myForm.confirmation`, so it\nappears in that field's `errors()` and in the form's `allErrors()`.\n\nAttach the rule to the form instead when the error should belong to the complete form:\n\n<!-- example: readme-basics.example.ts#cross-field -->\n```ts\nconst passwords = form({\n  password: field('', [required]),\n  confirmation: field('', [required]),\n}, {\n  validators: [({ value }) => {\n    const { password, confirmation } = value();\n    return password === confirmation\n      ? null\n      : { kind: 'passwordMismatch', message: 'Passwords must match.' };\n  }],\n});\n```\n<!-- /example -->\n\nA validator returns `null`, `undefined`, or nothing when valid, and an error or array of errors\nwhen invalid. Destructure `value` to read the value being validated, or `node` for access to the\nvalidated node and its state. Use `validator<TValue>()` when authoring a separately declared,\nreusable validator with an explicit value type.\n\nAsynchronous rules use `asyncValidator()`. They support reactive dependencies, pending state,\nvalidation debounce, cancellation through an `AbortSignal`, and error mapping. Read values and\nother signal dependencies before the first `await`, or declare them with `params`.\nSee [Asynchronous validation](https://form-nodes.js.org/guides/async-validation)\nfor a complete server-check example.\n\n### 🔸 Messages and application defaults\n\nA single validator can override its message:\n\n```ts\nrequired({ message: 'Please enter your name.' });\nminLength(2, { message: 'Use at least two characters.' });\n```\n\nFor shared messages, set `validatorMessages` in `provideFormNodesConfig()` in Angular's `app.config.ts` or\n`AppModule.providers`. This is also the appropriate scope for injected translations or SSR\nrequest-specific messages.\n\nUse `configureGlobalFormNodes()` for a process-wide fallback, including models created\noutside DI. In an Angular application, call it once in `main.ts` before bootstrapping. Keep a larger\ncatalog in a separate file and import it at the configuration point.\n\nSee [Validator messages and i18n](https://form-nodes.js.org/guides/validator-messages)\nand the [Built-in validator reference](https://form-nodes.js.org/reference/built-in-validators).\n\n## ⚡ Reactive rules and state\n\nStart with `requiredIf()`: require a company name only for business accounts. Import `requiredIf`\nfrom `@ngblocks/form-nodes` and `signal` from `@angular/core`:\n\n<!-- example: readme-basics.example.ts#required-if -->\n```ts\nconst businessAccount = signal(false);\n\nconst companyForm = form({\n  companyName: field('', [requiredIf(() => businessAccount())]),\n});\n\ncompanyForm.companyName.required(); // false\ncompanyForm.valid(); // true\n\nbusinessAccount.set(true);\ncompanyForm.companyName.required(); // true\ncompanyForm.valid(); // false — the company name is now required\n```\n<!-- /example -->\n\nThe condition is reactive: changing `businessAccount` updates both validation and the field's\n`required()` state without rebuilding the form.\n\nThe same callback pattern works with other constraints and state options:\n\n<!-- example: readme-basics.example.ts#reactive -->\n```ts\nconst minimumAge = signal(18);\nconst locked = signal(false);\n\nconst application = form({\n  age: field(20, [min(() => minimumAge())]),\n  name: field('Ada', {\n    disabled: () => locked() ? 'This account is locked.' : false,\n  }),\n});\n\napplication.age.valid(); // true\nminimumAge.set(21);\napplication.age.valid(); // false\n\nlocked.set(true);\napplication.name.disabled(); // true\n```\n<!-- /example -->\n\nThe model stays the same; the rules react to the signals read by their callbacks.\n\n| State to read | Related operations |\n| --- | --- |\n| `dirty()` / `pristine()` | `markAsDirty()`, `markAsPristine()` |\n| `touched()` / `untouched()` | `markAsTouched()`, `markAsUntouched()` |\n| `disabled()` / `enabled()` | `disable()`, `enable()` |\n| `readonly()` / `writable()` | `markAsReadonly()`, `markAsWritable()` |\n| `hidden()` / `visible()` | `hide()`, `show()` |\n| `submitting()` | Managed by the form's submission workflow |\n\nA control-originated change marks its bound node dirty; blur marks it touched. Parents aggregate\ninteraction state from descendants. Marking a form touched applies to its subtree by default.\n\nDisabled, readonly, and hidden state propagate to descendants and suppress validation for the\nnon-interactive subtree. They do not remove values from the model or prevent programmatic writes.\nHidden state does not remove DOM elements automatically: use `@if (node.visible())` when that is\nwhat the UI needs.\n\n[Interaction and availability](https://form-nodes.js.org/guides/interaction-and-availability)\ncovers the propagation rules and how configured state interacts with imperative operations.\n\n## 📚 Dynamic arrays\n\nAn object template creates independent item nodes. Iterate the array node directly and track each\nitem node so its controls remain associated with the same item when the collection changes:\n\n<!-- example: readme-dynamic-array.typecheck.ts -->\n```ts\nimport { Component } from '@angular/core';\nimport { array, email, field, form, FormNodeDirective, required } from '@ngblocks/form-nodes';\n\n@Component({\n  selector: 'app-contacts',\n  imports: [FormNodeDirective],\n  template: `\n    @for (contact of form.contacts; track contact; let index = $index) {\n      <fieldset>\n        <legend>Contact {{ index + 1 }}</legend>\n        <label>Name <input [formNode]=\"contact.name\" /></label>\n        <label>\n          Email\n          <input type=\"email\" [formNode]=\"contact.email\" />\n        </label>\n        <button type=\"button\" (click)=\"form.contacts.removeAt(index)\">Remove</button>\n      </fieldset>\n    }\n\n    <button type=\"button\" (click)=\"form.contacts.push()\">Add contact</button>\n    <p>{{ form.contacts.length() }} contacts</p>\n  `,\n})\nexport class ContactsComponent {\n  form = form({\n    contacts: array({\n      name: field('', [required]),\n      email: field('', [required, email]),\n    }, {\n      initialValue: [{ name: 'Ada', email: 'ada@example.com' }],\n    }),\n  });\n}\n```\n<!-- /example -->\n\n`push()` without a value creates an item from the template defaults. You can also pass initial\nvalues to `push()`, insert at a position, move or swap items, and clear the collection.\n`initialValue: 3` creates three items from the same template defaults.\n\nWhen replacing an array with data from a server, use a stable `trackBy` property or callback if\nitems should retain their nodes across reordering. Array `set()` reconciles a complete collection;\narray `patch()` updates existing positions without resizing it.\n\nSee [Dynamic arrays](https://form-nodes.js.org/guides/dynamic-arrays) for templates,\nfactories, keyed reconciliation, and the complete operations API.\n\n## 🚀 Submission\n\nThe first component configures `onSubmit` on `form()`. An action may return a promise, so a real\napplication can replace the local action with a service call:\n\n```ts\nonSubmit: async value => {\n  await this.accounts.register(value);\n},\nonSubmitBlocked: invalidForm => invalidForm.focus(),\nsubmitWhen: 'valid',\n```\n\nThis is an options fragment: `accounts` represents your application's service. Binding\n`<form [formNode]=\"form\">` runs the action on native submit. You can also call\n`await this.form.submit()` programmatically.\n\n- Submission marks the subtree touched and commits pending control values before checking validity.\n- Invalid forms are blocked. `submitWhen: 'valid'` also blocks pending validation; the default,\n  `'pending'`, allows pending-only validation when no error already makes the form invalid.\n- `submitting()` stays true while the action's promise is running. Repeated submits do not start\n  overlapping actions.\n- `submit()` resolves to `true` after a successful action and `false` when blocked or already running.\n  A rejected action rejects the promise and still clears submission state.\n\nSee [Form submission](https://form-nodes.js.org/guides/submission) for validation\npolicies and composing native forms with Angular controls.\n\n## ⏱️ Control-value debounce\n\nTo delay committing user input, add `debounce` to a field declaration:\n\n```ts\nname: field('', [required, minLength(2)], { debounce: 300 }),\n```\n\nThe input displays the pending control value immediately. `this.form.name()` continues to expose the\ncommitted value until the delay ends. Use `value.control()` to inspect the pending display value,\n`debouncing()` to inspect the buffer, and `flush()` to commit it immediately.\n\nUse `debounce: 'blur'` to commit on touch/blur instead. Programmatic `set()`, `update()`, `patch()`,\nand `reset(value)` are never delayed by control-value debounce.\n\nThis is separate from an asynchronous validator's `debounce` option, which delays validation work.\nSee [Value flow and debounce](https://form-nodes.js.org/guides/value-flow-and-debounce).\n\n## 🧭 Where to go next\n\n| I want to… | Start here |\n| --- | --- |\n| Learn by building one form step by step | [Tutorial](https://form-nodes.js.org/tutorial) |\n| See a larger model with real Angular bindings | [Complete form example](https://form-nodes.js.org/examples/complex-form) |\n| Find an API or all its options | [API overview](https://form-nodes.js.org/reference/api-overview) |\n| Solve a focused application problem | [Cookbook](https://form-nodes.js.org/cookbook) |\n| Navigate parents, paths, and child-name collisions | [Tree navigation and API access](https://form-nodes.js.org/concepts/tree-and-api) |\n| Compare values with shallow, deep, or custom equality | [Values and state](https://form-nodes.js.org/concepts/values-and-state) |\n| Extract a value type from any node | [FormNodeValue](https://form-nodes.js.org/reference/form-node-value) |\n| Check an upgrade | [Changelog](https://form-nodes.js.org/project/changelog) and [Migration guides](https://form-nodes.js.org/project/migrations) |\n\n## 🤖 Coding agents\n\nThe npm package includes an `AGENTS.md` guide for agents using Form Nodes in an application.\nAdd this instruction to your application's existing `AGENTS.md` (or your agent's equivalent\nproject instructions):\n\n```markdown\nWhen working with @ngblocks/form-nodes, read\nnode_modules/@ngblocks/form-nodes/AGENTS.md before making changes.\n```\n\nAdjust the path for your workspace's dependency layout. Package installation does not configure\nyour agent automatically. The guide travels with the installed version; use it together with the\npackage's declarations. See [Coding agents](https://form-nodes.js.org/getting-started/ai-agents)\nfor setup and alternatives.\n\n## 🛠️ Development\n\nFor development, use Node.js 22.22.3 from `.nvmrc` (`nvm use`). The package builds with Angular 21.0.7 and TypeScript 5.9.3 and is also tested with Angular 22.1.5.\n\n```sh\nnpm install\nnpm run typecheck\nnpm test\nnpm run build\nnpm run docs:start\n```\n\n`npm run docs:typecheck` compiles documentation examples and executes their behavioral assertions.\nThe complete README examples are generated from those same checked files. After editing them, run\n`node website/scripts/sync-readme-examples.mjs --write` to update the embedded snippets.\n\nSee [Project organization](docs/architecture.md) for repository conventions and the\n[Behavior reference](docs/behavior.md) for the detailed implementation contract.\n\n## 📄 License\n\n[MIT](LICENSE).\n","readmeFilename":"README.md"}