{"_id":"@airlib/form","_rev":"8-64d39ceef4e69e789a24ea30c75fcda5","name":"@airlib/form","dist-tags":{"latest":"2.1.0"},"versions":{"1.0.0":{"name":"@airlib/form","version":"1.0.0","author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/form@1.0.0","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"2db53e1b6ea8a8cdf051b3d7d047347bf2f45f67","tarball":"https://registry.npmjs.org/@airlib/form/-/form-1.0.0.tgz","fileCount":20,"integrity":"sha512-sgllft4J+9Oko7BlMa2ItI0PTbTrWKwvLMvbrk5j6QmpSI7d16ZefwjalCPn4+mkw1vflz7ieGu8twL+i/j46A==","signatures":[{"sig":"MEUCIQD0zcPEh6ZuLzJgLGOLzfhkuALSs5o7sw7TXGsI+TmklgIgJfgZuHiYdM2cstNtJzrCFlMf52ROWgHIDJ9GmaS+Szk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37446},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"2db53e1b6ea8a8cdf051b3d7d047347bf2f45f67","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","test":"rimraf coverage && vitest --run","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-sgllft4J+9Oko7BlMa2ItI0PTbTrWKwvLMvbrk5j6QmpSI7d16ZefwjalCPn4+mkw1vflz7ieGu8twL+i/j46A==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0"},"peerDependencies":{"zod":"^4.1.5","typescript":"6.0.3","@anchorlib/core":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/form_1.0.0_1780534754690_0.9486126225798324","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@airlib/form","version":"1.0.1","keywords":["form","validation","zod","reactive","state","air-stack","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/form@1.0.1","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"969f3a71e19ec1ddf897deac6503cad587350d50","tarball":"https://registry.npmjs.org/@airlib/form/-/form-1.0.1.tgz","fileCount":20,"integrity":"sha512-DSUZvwyCadBbjE8WD2snRpTMUKPT1NAPM3SaMa3R2o2AAk3AckKmHJlAywVpBvj+8ZZPTrkVWO7YHr/wPMQlSg==","signatures":[{"sig":"MEYCIQCtfNF0hYnQiaVzKEQUyAuznyeXDa+27Flb4JeV8GEHiwIhAMy6hefvaQDgszkW+BPKXaPNuoyE1tMDsxRT+8zdoHnC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37745},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"969f3a71e19ec1ddf897deac6503cad587350d50","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","test":"rimraf coverage && vitest --run","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-DSUZvwyCadBbjE8WD2snRpTMUKPT1NAPM3SaMa3R2o2AAk3AckKmHJlAywVpBvj+8ZZPTrkVWO7YHr/wPMQlSg==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","description":"Reactive and declarative, framework-agnostic form engine powered by Zod schemas. Validation, dirty tracking, cross-field matching, and submission lifecycle built on AIR Stack.","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0"},"peerDependencies":{"zod":"^4.1.5","typescript":"6.0.3","@anchorlib/core":"^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/form_1.0.1_1780534979636_0.5247127887658436","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@airlib/form","version":"1.1.0","keywords":["form","validation","zod","reactive","state","air-stack","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/form@1.1.0","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"05767b62641f226574fbefa178e1c92e5ef679e9","tarball":"https://registry.npmjs.org/@airlib/form/-/form-1.1.0.tgz","fileCount":28,"integrity":"sha512-e4pQ7TOwSh289p+a9HKNvJMMdmC7AAp7LCHS6VdaN0+Cd8C7dJM0Yfp7VK0HlrRtRc3RVzQZvCwRa0JrhrNC6g==","signatures":[{"sig":"MEYCIQDHufQjsyFRQE927a2hgjOjXo47OTHyaR81poRUfrNr+wIhAIQczW56CaFtQWtu5HMz8PSBQw0GlR6JuKaEZjqFv0F/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58644},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"05767b62641f226574fbefa178e1c92e5ef679e9","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","test":"rimraf coverage && vitest --run","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-e4pQ7TOwSh289p+a9HKNvJMMdmC7AAp7LCHS6VdaN0+Cd8C7dJM0Yfp7VK0HlrRtRc3RVzQZvCwRa0JrhrNC6g==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","description":"Reactive and declarative, framework-agnostic form engine powered by Zod schemas. Validation, dirty tracking, cross-field matching, and submission lifecycle built on AIR Stack.","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0"},"peerDependencies":{"zod":"^4.1.5","typescript":"6.0.3","@anchorlib/core":"1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/form_1.1.0_1780843764286_0.9578616517465601","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@airlib/form","version":"1.1.1","keywords":["form","validation","zod","reactive","state","air-stack","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/form@1.1.1","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"7b9a0fad783999684c6f7c2541a1eae151b8e01a","tarball":"https://registry.npmjs.org/@airlib/form/-/form-1.1.1.tgz","fileCount":28,"integrity":"sha512-RjNt94LCp5b2r8FbaELh/sSIU5QpXioWp19/rri4TUOR3CpBqtkLA79l21x1pWHmlH1tQljOP7vAlVD+h8OKdA==","signatures":[{"sig":"MEYCIQClFsQObKe2w70xCJfhBiWylhmOvcJXuO5LBP43bXE9QAIhAKRb0nynBZ5G6mzMyLG7EcqPIQdUVLPfBVNLbrqr22t8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58761},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"7b9a0fad783999684c6f7c2541a1eae151b8e01a","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","test":"rimraf coverage && vitest --run","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-RjNt94LCp5b2r8FbaELh/sSIU5QpXioWp19/rri4TUOR3CpBqtkLA79l21x1pWHmlH1tQljOP7vAlVD+h8OKdA==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","description":"Reactive and declarative, framework-agnostic form engine powered by Zod schemas. Validation, dirty tracking, cross-field matching, and submission lifecycle built on AIR Stack.","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0"},"peerDependencies":{"zod":"^4.1.5","typescript":"6.0.3","@anchorlib/core":"1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/form_1.1.1_1780846506500_0.6790255214691918","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@airlib/form","version":"1.2.0","keywords":["form","validation","zod","reactive","state","air-stack","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/form@1.2.0","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"f254f9251eddaa51e9866c2d27f0ad5ca44136e1","tarball":"https://registry.npmjs.org/@airlib/form/-/form-1.2.0.tgz","fileCount":28,"integrity":"sha512-M7HXJSo//shho3b0LJ6un0DQxDbRV31UF+xBE22HT568jJwgA5aoSTeD7JMnpMyxVysx7WBluwZN7s8tpCkAAg==","signatures":[{"sig":"MEYCIQClZM+2S4KlwqjTKm0GjDaow9S6YWO8P1x//BvMGY2CtwIhALmjHwDcUYtoVpISC8mXAIneguDA/WJ8I43BrWlGCFkb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59666},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"f254f9251eddaa51e9866c2d27f0ad5ca44136e1","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","test":"rimraf coverage && vitest --run","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-M7HXJSo//shho3b0LJ6un0DQxDbRV31UF+xBE22HT568jJwgA5aoSTeD7JMnpMyxVysx7WBluwZN7s8tpCkAAg==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","description":"Reactive and declarative, framework-agnostic form engine powered by Zod schemas. Validation, dirty tracking, cross-field matching, and submission lifecycle built on AIR Stack.","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0"},"peerDependencies":{"zod":"^4.1.5","typescript":"6.0.3","@anchorlib/core":"1.2.0"},"_npmOperationalInternal":{"tmp":"tmp/form_1.2.0_1780954088007_0.21706369553438432","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@airlib/form","version":"1.2.1","keywords":["form","validation","zod","reactive","state","air-stack","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/form@1.2.1","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"0c5c8be66a3bbb6204b393fc4efd085e7ebb13d5","tarball":"https://registry.npmjs.org/@airlib/form/-/form-1.2.1.tgz","fileCount":28,"integrity":"sha512-cv1mz0YD0q6/bylMGJ7buk+J37Y3vD7jPea49Tn3VL4DlTOYAOyHUGBhQX0+9xhn/vLNsd/+TsftfmmJRAe1gw==","signatures":[{"sig":"MEUCIQCym8vA4MvzRnFN4ItX+2FE3NnfFf7sBAL1kYEnflkbdgIgHhSJbbB23hKVqxQI26syIjjmgrAFfSHYG4//IPimy2I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59666},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"0c5c8be66a3bbb6204b393fc4efd085e7ebb13d5","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch","test":"rimraf coverage && vitest --run","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-cv1mz0YD0q6/bylMGJ7buk+J37Y3vD7jPea49Tn3VL4DlTOYAOyHUGBhQX0+9xhn/vLNsd/+TsftfmmJRAe1gw==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","description":"Reactive and declarative, framework-agnostic form engine powered by Zod schemas. Validation, dirty tracking, cross-field matching, and submission lifecycle built on AIR Stack.","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0"},"peerDependencies":{"zod":"^4.1.5","typescript":"6.0.3","@anchorlib/core":"1.2.1"},"_npmOperationalInternal":{"tmp":"tmp/form_1.2.1_1781087272823_0.34834077227231575","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@airlib/form","version":"1.2.2","keywords":["form","validation","zod","reactive","state","air-stack","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","_id":"@airlib/form@1.2.2","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"bugs":{"url":"https://github.com/beerush-id/airlib/issues"},"dist":{"shasum":"8b1e874ff3115bb4740b15e77c43ec45c396a810","tarball":"https://registry.npmjs.org/@airlib/form/-/form-1.2.2.tgz","fileCount":28,"integrity":"sha512-agqZAYlSZLceTb87B7KtxetmGPM5cw7rBdLtP7lIiqK9ph6p6QsCibDY1Uq386QxmfWDAn9PZngUCIfxNt+3jw==","signatures":[{"sig":"MEQCID/Un0OJ+4x4I1WSs+GHv5qCM/loUeGKiGFVx9gmwCYNAiBKPt7maq4mRbZnRFuDfJbX8Xmq7SGsaLiez1y9r5GLJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59706},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"8b1e874ff3115bb4740b15e77c43ec45c396a810","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsdown --watch ./src","build":"bun run clean && tsdown && publint","clean":"rimraf dist","format":"biome format --write","test:run":"rimraf coverage && vitest --run","prepublish":"bun run format && bun run build","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"_integrity":"sha512-agqZAYlSZLceTb87B7KtxetmGPM5cw7rBdLtP7lIiqK9ph6p6QsCibDY1Uq386QxmfWDAn9PZngUCIfxNt+3jw==","repository":{"url":"git+https://github.com/beerush-id/airlib.git","type":"git"},"_npmVersion":"10.8.3","description":"Reactive and declarative, framework-agnostic form engine powered by Zod schemas. Validation, dirty tracking, cross-field matching, and submission lifecycle built on AIR Stack.","directories":{"dist":"dist"},"sideEffects":false,"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.0","jsdom":"^27.0.0","rimraf":"^6.0.0","tsdown":"^0.15.0","vitest":"^3.2.0","publint":"^0.3.0","@types/bun":"^1.3.0","@biomejs/biome":"^2.3.0"},"peerDependencies":{"zod":"^4.1.5","typescript":"6.0.3","@anchorlib/core":"1.2.8"},"_npmOperationalInternal":{"tmp":"tmp/form_1.2.2_1783111759674_0.24397007200809084","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"type":"module","name":"@airlib/form","version":"2.1.0","description":"Reactive and declarative, framework-agnostic form engine powered by Zod schemas. Validation, dirty tracking, cross-field matching, and submission lifecycle built on AirLib.","keywords":["form","validation","zod","reactive","state","airlib","anchor","typescript"],"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","repository":{"type":"git","url":"git+https://github.com/beerush-id/airstack.git"},"bugs":{"url":"https://github.com/beerush-id/airstack/issues"},"sideEffects":false,"types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"directories":{"dist":"dist"},"publishConfig":{"access":"public"},"devDependencies":{"@biomejs/biome":"^2.5.6","@types/bun":"^1.3.1","jsdom":"^27.0.1","publint":"^0.3.15","rimraf":"^6.0.1","tsdown":"^0.15.9","vite":"^8.0.10","vitest":"^4.1.11"},"peerDependencies":{"@airlib/core":"2.1.0","typescript":"^5.9.3","zod":"^4.4.3"},"scripts":{"dev":"tsdown --watch ./src","clean":"rimraf dist","build":"bun run clean && tsdown && publint","prepublish":"bun run format && bun run build","format":"biome format --write","test:run":"rimraf coverage && vitest --run","test:preview":"rimraf coverage && vitest --run && vite preview --outDir coverage"},"license":"MIT","_id":"@airlib/form@2.1.0","_integrity":"sha512-jGjrJSUf/DIjURpJDLy54VbMQuA/MERSFMDYYBtpu+ReWhl05pQNBjkK2Zu2eKtmhnvEP0J7nr8ixrci1QaXHg==","_nodeVersion":"24.3.0","_npmVersion":"10.8.3","shasum":"d427647c7cf4a89da61922b31da2286c3e081bf7","dist":{"integrity":"sha512-jGjrJSUf/DIjURpJDLy54VbMQuA/MERSFMDYYBtpu+ReWhl05pQNBjkK2Zu2eKtmhnvEP0J7nr8ixrci1QaXHg==","shasum":"d427647c7cf4a89da61922b31da2286c3e081bf7","tarball":"https://registry.npmjs.org/@airlib/form/-/form-2.1.0.tgz","fileCount":28,"unpackedSize":60094,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCvLUwzamx/euNvNKp1aRNbYFjEZwl0RSvTZVLaV+hZ7wIhALgbWlx7RqM58SayghivtRVenZu+7SrzBxTYp5tv2cEn"}]},"_npmUser":{"name":"mahdaen","email":"mahdaen@gmail.com"},"maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/form_2.1.0_1788182569525_0.3931661556567805"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-04T00:59:14.510Z","modified":"2026-08-31T13:22:49.871Z","1.0.0":"2026-06-04T00:59:14.832Z","1.0.1":"2026-06-04T01:02:59.784Z","1.1.0":"2026-06-07T14:49:24.426Z","1.1.1":"2026-06-07T15:35:06.644Z","1.2.0":"2026-06-08T21:28:08.156Z","1.2.1":"2026-06-10T10:27:52.992Z","1.2.2":"2026-07-03T20:49:19.808Z","2.1.0":"2026-08-31T13:22:49.667Z"},"bugs":{"url":"https://github.com/beerush-id/airstack/issues"},"author":"Nanang Mahdaen El Agung <mahdaen@gmail.com>","license":"MIT","keywords":["form","validation","zod","reactive","state","airlib","anchor","typescript"],"repository":{"type":"git","url":"git+https://github.com/beerush-id/airstack.git"},"description":"Reactive and declarative, framework-agnostic form engine powered by Zod schemas. Validation, dirty tracking, cross-field matching, and submission lifecycle built on AirLib.","maintainers":[{"name":"mahdaen","email":"mahdaen@gmail.com"}],"readme":"# AirLib Form\n\nAirLib Form is a reactive, framework-agnostic form engine powered by Zod schemas.\n\n## AirLib Integration\n\nTo use AirLib Form inside a reactive component, create a typed form factory outside the component, and initialize the form state within the component's `setup` phase.\n\n```tsx\nimport { setup, render } from '@airlib/react';\nimport { formState } from '@airlib/form';\nimport { z } from 'zod';\n\nconst userSchema = z.object({\n  name: z.string().min(3, 'Name is too short'),\n  age: z.number().min(18, 'Must be an adult'),\n});\n\nexport const UserForm = setup((props) => {\n  const form = formState(userSchema, { \n    value: { name: '', age: 0 } \n  });\n\n  return render(() => (\n    <form>\n      {/* UI logic goes here */}\n    </form>\n  ));\n});\n```\n\nThe `formState` function creates a reactive store typed to the schema and integrated with the reactive rendering cycle.\n\n## Field Selection\n\nTo access a specific field within the form, use the `formField` function or the `.field()` method.\n\n```tsx\nimport { formField } from '@airlib/form';\n\nexport const UserForm = setup((props) => {\n  const form = formState(userSchema, { value: { name: '', age: 0 } });\n  const name = formField('name');\n\n  return render(() => (\n    <div>\n      <input \n        value={name.value} \n        onInput={(e) => { name.value = e.currentTarget.value; }} \n      />\n      {!name.valid && <span>{name.error}</span>}\n    </div>\n  ));\n});\n```\n\nEach field provides reactive access to `value`, `error`, `valid`, `changed`, `touched`, `matched`, and `disabled`.\n\n## Touched Tracking\n\nFields are marked as touched when their value is first mutated. This happens inside the form's setter, requiring no manual `onBlur` handlers.\n\n```tsx\nconst name = formField('name');\n\n// Before any mutation\nname.touched; // false\n\n// After value change\nname.value = 'Alice';\nname.touched; // true — stays true until reset\n```\n\nTouched state persists even if the value reverts to its original. A field can be `changed: false` but `touched: true` — \"you were here.\"\n\n## Cross-Field Matching\n\nTo validate that one field equals another, pass a `match` parameter to `formField`.\n\n```tsx\nconst confirm = formField('confirmPassword', 'password');\n\nconfirm.matched; // true when values are equal\nconfirm.valid;   // schema validation only — independent of matched\n```\n\nFor custom cross-field logic beyond equality, pass a function.\n\n```tsx\nconst endDate = formField('endDate', (form) =>\n  form.fields['endDate'] > form.fields['startDate']\n);\n```\n\nThe function runs inside an `effect`, so Anchor tracks which fields it reads and re-evaluates when any of them change.\n\n`valid` and `matched` are separate signals. `valid` is schema-only. `matched` is match-only. The view layer composes them however it wants.\n\n## Input Controllers\n\nTo bind a field to a UI input, use the `.input()` method to generate an input controller.\n\n```tsx\nexport const UserForm = setup<UserFormProps>((props) => {\n  const form = formState(userSchema, props);\n  \n  const name = form.field('name').input({ type: 'text' });\n  const age = form.field('age').input({ type: 'number' });\n\n  return render(() => (\n    <form>\n      <input \n        type={name.type} \n        name={name.name}\n        value={name.value}\n        disabled={name.disabled}\n        onInput={(e) => { name.value = e.currentTarget.value; }}\n        onBlur={() => { name.settled(); }}\n      />\n      \n      <input \n        type={age.type} \n        name={age.name}\n        value={age.value}\n        disabled={age.disabled}\n        onInput={(e) => { age.value = e.currentTarget.value; }}\n        onBlur={() => { age.settled(); }}\n      />\n    </form>\n  ));\n});\n```\n\nThe input controller handles two-way data binding, string parsing, event synchronization, and inherits the form's `pending` state via the `disabled` property to lock inputs during network submission.\n\n## Form Context\n\nTo build composable input components without passing props, use the `formField` API to inherit the form context.\n\n```tsx\nimport { formField, FormInputType } from '@airlib/form';\nimport { setup, render } from '@airlib/react';\n\nexport const TextInput = setup<{ name: string, label: string, type?: FormInputType }>((props) => {\n  const input = formField<string>(props.name).input(props);\n\n  return render(() => (\n    <div className=\"field-group\">\n      <label>{props.label}</label>\n      <input \n        type={input.type}\n        name={input.name}\n        value={input.value}\n        disabled={input.disabled}\n        onInput={(e) => { input.value = e.currentTarget.value; }}\n        onBlur={() => { input.settled(); }}\n      />\n      {!input.valid && <span className=\"error\">{input.error}</span>}\n    </div>\n  ));\n});\n```\n\nThe `formField` function discovers the closest form provider in the component tree.\n\n## Form Submission\n\nThe `.submit()` method handles the complete submission lifecycle. It executes the provided handler, tracks the network status (`IDLE`, `PENDING`, `SUCCESS`, `ERROR`), prevents concurrent race conditions by locking the form, and maps its `pending` status down to the `disabled` state of all connected input fields. \n\nOn a successful submission, the form cleans up its dirty state (dropping `form.changed` to `false`) making the submitted data the new baseline.\n\n```tsx\nexport const ProfileForm = setup(() => {\n  const form = formState(userSchema, { value: { name: '', age: 0 } });\n\n  const saveProfile = async (data: { name: string, age: number }) => {\n    await fetch('/api/user', { method: 'POST', body: JSON.stringify(data) });\n  };\n\n  return render(() => (\n    <form>\n      {/* ... Form inputs ... */}\n\n      <button \n        disabled={!form.canSubmit}\n        onClick={(e) => {\n          e.preventDefault();\n          form.submit(saveProfile);\n        }}\n      >\n        {form.pending ? 'Saving...' : 'Save Profile'}\n      </button>\n\n      {form.status === 'error' && (\n        <div className=\"error-banner\">{form.error?.message}</div>\n      )}\n    </form>\n  ));\n});\n```\n\nBy relying on `.submit(handler)`, developers avoid boilerplate loading-states, manual network try/catch blocks, and dirty-state reset procedures across the application.\n","readmeFilename":"readme.md"}