{"_id":"@active-record-ts/active-model","_rev":"2-5c781671365dc61c00575a880148174d","name":"@active-record-ts/active-model","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@active-record-ts/active-model","version":"1.0.0","author":{"url":"github.com/stathis-alexander","name":"Alexander Stathis","email":"stathis.alexanderj@gmail.com"},"license":"MIT","_id":"@active-record-ts/active-model@1.0.0","maintainers":[{"name":"astathis","email":"stathis.alexanderj@gmail.com"}],"homepage":"https://github.com/stathis-alexander/active-record-ts/tree/main/packages/active-model#readme","bugs":{"url":"https://github.com/stathis-alexander/active-record-ts/issues"},"dist":{"shasum":"24d79652ac10118051a2faa801cdc43dd3029aa7","tarball":"https://registry.npmjs.org/@active-record-ts/active-model/-/active-model-1.0.0.tgz","fileCount":12,"integrity":"sha512-xGUg1Pk3CMt9LclAfu8wCTpSxmBRUUStLQeFfl0izIlCJYJW5rcToQ1fvwzYXz0lIMIeRyNT0ZynPGGK6a3TRA==","signatures":[{"sig":"MEUCIBWRYFkuhhfTj80u3l8kXdwnO/DRuE8zaSgSlbV0gbEOAiEA1PZm+KegBT05U2K/QALoUIHdscEs5VwLOdQUZEjyw/E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88836},"type":"module","module":"src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts","default":"./src/index.ts"}},"gitHead":"016a142f49ecdfd9cb32ce8954abac3445a28676","scripts":{"test":"bun test","typecheck":"bun tsc --noEmit"},"_npmUser":{"name":"astathis","email":"stathis.alexanderj@gmail.com"},"repository":{"url":"git+https://github.com/stathis-alexander/active-record-ts.git","type":"git","directory":"packages/active-model"},"_npmVersion":"11.12.1","description":"Rails-style ActiveModel for TypeScript — typed attributes, dirty tracking, validations, callbacks.","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/active-model_1.0.0_1779230258092_0.592453539926409","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@active-record-ts/active-model","version":"1.1.0","description":"Rails-style ActiveModel for TypeScript — typed attributes, dirty tracking, validations, callbacks.","author":{"name":"Alexander Stathis","email":"stathis.alexanderj@gmail.com","url":"github.com/stathis-alexander"},"license":"MIT","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","repository":{"type":"git","url":"git+https://github.com/stathis-alexander/active-record-ts.git","directory":"packages/active-model"},"bugs":{"url":"https://github.com/stathis-alexander/active-record-ts/issues"},"homepage":"https://github.com/stathis-alexander/active-record-ts/tree/main/packages/active-model#readme","publishConfig":{"access":"public","provenance":true},"exports":{".":{"bun":"./src/index.ts","types":"./dist/index.d.ts","import":"./dist/index.js"}},"peerDependencies":{"typescript":"^5"},"scripts":{"build":"tsup","prepack":"tsup","test":"bun test","typecheck":"bun tsc --noEmit"},"gitHead":"395b20f425235a16b0bf0319b77e45b31db1c1e1","_id":"@active-record-ts/active-model@1.1.0","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-F63/BBFlL4LfBs5JKqD/mncNJxMYfR0jUkrl+ZP+7t7Aqk7ulPVHt0D5C/YA03UoaOaRov/OuvFwjLmnJrtu6A==","shasum":"2aa09d904aba90542096d5f21726c1056ca091c3","tarball":"https://registry.npmjs.org/@active-record-ts/active-model/-/active-model-1.1.0.tgz","fileCount":6,"unpackedSize":227753,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@active-record-ts%2factive-model@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCA6g/YerbbpATOPGo2cYWGGfuib0r5L45IF1zfB5tDpgIgLS9nbpLXaEcYFjDRdLOFnN6YKEwYcKNR+AKbGDBDUjY="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1a1ba7b9-12b4-408c-8886-cb801a139714"}},"directories":{},"maintainers":[{"name":"astathis","email":"stathis.alexanderj@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/active-model_1.1.0_1779234786402_0.8168349011978691"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-19T22:37:38.002Z","modified":"2026-05-19T23:53:06.826Z","1.0.0":"2026-05-19T22:37:38.233Z","1.1.0":"2026-05-19T23:53:06.551Z"},"bugs":{"url":"https://github.com/stathis-alexander/active-record-ts/issues"},"author":{"name":"Alexander Stathis","email":"stathis.alexanderj@gmail.com","url":"github.com/stathis-alexander"},"license":"MIT","homepage":"https://github.com/stathis-alexander/active-record-ts/tree/main/packages/active-model#readme","repository":{"type":"git","url":"git+https://github.com/stathis-alexander/active-record-ts.git","directory":"packages/active-model"},"description":"Rails-style ActiveModel for TypeScript — typed attributes, dirty tracking, validations, callbacks.","maintainers":[{"name":"astathis","email":"stathis.alexanderj@gmail.com"}],"readme":"# `@active-record-ts/active-model`\n\nTyped attributes, dirty tracking, validations, and callbacks for plain TypeScript classes — no database. A port of Rails' [`ActiveModel`](https://github.com/rails/rails/tree/main/activemodel).\n\nUsed by [`@active-record-ts/active-record`](../active-record) for persistence; usable on its own for form objects, API payloads, etc.\n\n## Usage\n\n```ts\nimport { Model } from '@active-record-ts/active-model';\n\nclass Signup extends Model {\n  declare email: string;\n  declare age: number;\n}\n\nSignup.attribute('email', 'string');\nSignup.attribute('age', 'integer');\nSignup.validates('email', { presence: true, format: { with: /@/ } });\nSignup.validates('age', { numericality: { greaterThanOrEqualTo: 13 } });\n\nconst s = new Signup({ email: 'a@b.c', age: 12 });\nawait s.validate();          // false\ns.errors.fullMessages;       // [\"Age must be greater than or equal to 13\"]\n```\n\n## Features\n\n- **Typed attributes** — `attribute(name, type)`. Built-ins: `string`, `integer`, `bigint`, `float`, `decimal`, `boolean`, `date`, `datetime`, `binary`, `json`. Register your own with `registerType`.\n- **Dirty tracking** — `record.changed()`, `record.changes()`, `record.wasChanged(attr)`, `record.savedChanges()`.\n- **Validations** — `presence`, `absence`, `format`, `length`, `numericality`, `inclusion`, `exclusion`, `acceptance`, `confirmation`.\n- **Callbacks** — `beforeValidation`, `afterValidation`, `beforeSave`, `afterSave`, `aroundSave`. Throw `HaltError` (or call `throwAbort()`) inside a `before*` callback to halt the chain.\n- **Errors** — `record.errors` exposes Rails-style `add`, `on`, `fullMessages`, etc.\n- **Inflector** — `camelize`, `underscore`, `pluralize`, `tableize`.\n\n## Test\n\n```bash\nbun run test:active-model\n```\n","readmeFilename":"README.md"}