{"_id":"@dnssfnv/t12n","_rev":"2-a7b68d88228c482cd8b8daf23773ee60","name":"@dnssfnv/t12n","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@dnssfnv/t12n","version":"0.1.0","keywords":["t12n","typescript","validation","runtime","vite-plugin","webpack","unplugin","react","vue","svelte","solid","types","schema","type-safe","zod-alternative"],"license":"MIT","_id":"@dnssfnv/t12n@0.1.0","maintainers":[{"name":"dnssfnv","email":"denissofonovv@gmail.com"}],"homepage":"https://github.com/denis-sofonov/t12n#readme","bugs":{"url":"https://github.com/denis-sofonov/t12n/issues"},"dist":{"shasum":"e48ab8735bb332fda89012f147b3781e377292dc","tarball":"https://registry.npmjs.org/@dnssfnv/t12n/-/t12n-0.1.0.tgz","fileCount":37,"integrity":"sha512-KoyAw/RTpS+29pHUbEmPRl87Wo7duQux0mS3UgjoC4FdqCuMKqbaWwB1FYKseL662/lfa7zB+tRjM5EIWXzlkQ==","signatures":[{"sig":"MEUCIQDBEXRVlrbZLhZ8gzso+Qia+z8r6F2FFXJ5pb/CGZOecwIgKBO6/gAN34oVZOAsqlGoXXgLQ5CrVXxT5L4ep03oHiQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":169260},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./vite":{"import":{"types":"./dist/vite.d.ts","default":"./dist/vite.js"},"require":{"types":"./dist/vite.d.cts","default":"./dist/vite.cjs"}},"./rollup":{"import":{"types":"./dist/rollup.d.ts","default":"./dist/rollup.js"},"require":{"types":"./dist/rollup.d.cts","default":"./dist/rollup.cjs"}},"./rspack":{"import":{"types":"./dist/rspack.d.ts","default":"./dist/rspack.js"},"require":{"types":"./dist/rspack.d.cts","default":"./dist/rspack.cjs"}},"./esbuild":{"import":{"types":"./dist/esbuild.d.ts","default":"./dist/esbuild.js"},"require":{"types":"./dist/esbuild.d.cts","default":"./dist/esbuild.cjs"}},"./runtime":{"import":{"types":"./dist/runtime.d.ts","default":"./dist/runtime.js"},"require":{"types":"./dist/runtime.d.cts","default":"./dist/runtime.cjs"}},"./webpack":{"import":{"types":"./dist/webpack.d.ts","default":"./dist/webpack.js"},"require":{"types":"./dist/webpack.d.cts","default":"./dist/webpack.cjs"}},"./package.json":"./package.json"},"gitHead":"b6ce9a670d22e58cd07832d2e4010d2cd4585190","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","prepack":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"vitest run && tsc --noEmit"},"_npmUser":{"name":"dnssfnv","email":"denissofonovv@gmail.com"},"repository":{"url":"git+https://github.com/denis-sofonov/t12n.git","type":"git","directory":"packages/t12n"},"_npmVersion":"11.6.2","description":"Type-driven runtime validation (t12n) — turn your TypeScript types into runtime validators.","directories":{},"sideEffects":false,"_nodeVersion":"24.7.0","dependencies":{"ts-morph":"^25.0.0","unplugin":"^2.0.0","magic-string":"^0.30.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"vite":["./dist/vite.d.ts"],"rollup":["./dist/rollup.d.ts"],"rspack":["./dist/rspack.d.ts"],"esbuild":["./dist/esbuild.d.ts"],"runtime":["./dist/runtime.d.ts"],"webpack":["./dist/webpack.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","tsup":"^8.0.0","vite":"^6.0.0","vitest":"^2.0.0","typescript":"^5.7.0","@types/node":"^22.0.0"},"peerDependencies":{"vite":">=5.0.0"},"peerDependenciesMeta":{"vite":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/t12n_0.1.0_1780479476871_0.9747309480229849","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@dnssfnv/t12n","version":"0.1.1","description":"Type-driven runtime validation (t12n) — turn your TypeScript types into runtime validators.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/denis-sofonov/t12n.git","directory":"packages/t12n"},"homepage":"https://t12n.vercel.app","bugs":{"url":"https://github.com/denis-sofonov/t12n/issues"},"keywords":["t12n","typescript","validation","runtime","vite-plugin","webpack","unplugin","react","vue","svelte","solid","types","schema","type-safe","zod-alternative"],"type":"module","sideEffects":false,"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./vite":{"import":{"types":"./dist/vite.d.ts","default":"./dist/vite.js"},"require":{"types":"./dist/vite.d.cts","default":"./dist/vite.cjs"}},"./webpack":{"import":{"types":"./dist/webpack.d.ts","default":"./dist/webpack.js"},"require":{"types":"./dist/webpack.d.cts","default":"./dist/webpack.cjs"}},"./rollup":{"import":{"types":"./dist/rollup.d.ts","default":"./dist/rollup.js"},"require":{"types":"./dist/rollup.d.cts","default":"./dist/rollup.cjs"}},"./esbuild":{"import":{"types":"./dist/esbuild.d.ts","default":"./dist/esbuild.js"},"require":{"types":"./dist/esbuild.d.cts","default":"./dist/esbuild.cjs"}},"./rspack":{"import":{"types":"./dist/rspack.d.ts","default":"./dist/rspack.js"},"require":{"types":"./dist/rspack.d.cts","default":"./dist/rspack.cjs"}},"./runtime":{"import":{"types":"./dist/runtime.d.ts","default":"./dist/runtime.js"},"require":{"types":"./dist/runtime.d.cts","default":"./dist/runtime.cjs"}},"./package.json":"./package.json"},"typesVersions":{"*":{"vite":["./dist/vite.d.ts"],"webpack":["./dist/webpack.d.ts"],"rollup":["./dist/rollup.d.ts"],"esbuild":["./dist/esbuild.d.ts"],"rspack":["./dist/rspack.d.ts"],"runtime":["./dist/runtime.d.ts"]}},"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","test":"vitest run","bench":"pnpm bench:runtime && pnpm bench:codegen","bench:runtime":"tsx bench/runtime.bench.mjs","bench:codegen":"tsx bench/codegen.bench.mjs","prepublishOnly":"vitest run && tsc --noEmit","prepack":"tsup"},"engines":{"node":">=18"},"publishConfig":{"access":"public"},"dependencies":{"magic-string":"^0.30.0","ts-morph":"^25.0.0","unplugin":"^2.0.0"},"peerDependencies":{"vite":">=5.0.0"},"peerDependenciesMeta":{"vite":{"optional":true}},"devDependencies":{"@types/node":"^22.0.0","tsup":"^8.0.0","tsx":"^4.19.0","typescript":"^5.7.0","vite":"^6.0.0","vitest":"^2.0.0"},"gitHead":"68ed632d76163226e5cf740a4cb83722432fac87","_id":"@dnssfnv/t12n@0.1.1","_nodeVersion":"24.7.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-1h2e2s3W/pmWZOMsAolkK8Aq/YmDo8ewUTfMuu+Oelt0HR1fTU+Pmrgm4K010mnX8dP5xNB5bVoeBtmJdi24zw==","shasum":"ebe6d0c0a833b46c5383ceb6cf24175f0fa832c1","tarball":"https://registry.npmjs.org/@dnssfnv/t12n/-/t12n-0.1.1.tgz","fileCount":37,"unpackedSize":170446,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFX+pH64eM22861c7qSTkPo5B2I6BqHZS0Z4YDnRLnWDAiBSXOT2tnKjWHLgZY41E3rnM9gGlt0cGvZihksOxwmkYw=="}]},"_npmUser":{"name":"dnssfnv","email":"denissofonovv@gmail.com"},"directories":{},"maintainers":[{"name":"dnssfnv","email":"denissofonovv@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/t12n_0.1.1_1780482702956_0.00045314415919306406"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-03T09:37:56.706Z","modified":"2026-06-03T10:31:43.209Z","0.1.0":"2026-06-03T09:37:57.015Z","0.1.1":"2026-06-03T10:31:43.088Z"},"bugs":{"url":"https://github.com/denis-sofonov/t12n/issues"},"license":"MIT","homepage":"https://t12n.vercel.app","keywords":["t12n","typescript","validation","runtime","vite-plugin","webpack","unplugin","react","vue","svelte","solid","types","schema","type-safe","zod-alternative"],"repository":{"type":"git","url":"git+https://github.com/denis-sofonov/t12n.git","directory":"packages/t12n"},"description":"Type-driven runtime validation (t12n) — turn your TypeScript types into runtime validators.","maintainers":[{"name":"dnssfnv","email":"denissofonovv@gmail.com"}],"readme":"# t12n\n\n**Type-driven runtime validation.** A build plugin that turns your TypeScript\ntypes into runtime validators — annotate the data that crosses a boundary, and\nthe schemas, checks and errors write themselves.\n\n> On npm as **`@dnssfnv/t12n`**.\n\n- **~3 KB** gzipped runtime · **zero runtime dependencies** · no `z.xxx()` in your code\n- Schemas derived from your TS types at build (via ts-morph) — generics, unions,\n  `Date`/`Map`/`Set`, records, recursive types and all\n- Compiles each type into a dedicated validator, **~8× faster than Zod**\n- Works with Vite, webpack, Rollup, esbuild, Rspack — React, Vue, Svelte, Solid,\n  Next, Nuxt, Astro\n- No `eval` at runtime — CSP-safe; runs in the browser, Node and at the edge\n\n> Status: **v0.1, beta.** APIs may still shift.\n\n## Install\n\n```bash\nnpm install @dnssfnv/t12n\n```\n\n## Setup\n\n```ts\n// vite.config.ts\nimport { defineConfig } from 'vite'\nimport t12n from '@dnssfnv/t12n/vite'\n\nexport default defineConfig({ plugins: [t12n()] }) // 'auto' mode by default\n```\n\n```ts\n// any ambient .d.ts (env.d.ts, t12n.d.ts) — loads the DOM overrides + Check<T>\n/// <reference types=\"@dnssfnv/t12n\" />\n```\n\nPrefer the reference over `\"types\": [\"@dnssfnv/t12n\"]` in tsconfig (the `types` array\ndisables auto-inclusion of every other ambient package). It's optional — runtime\nchecks work without it; it only adds the compile-time pressure.\n\nOther bundlers expose the same plugin: `@dnssfnv/t12n/webpack`, `@dnssfnv/t12n/rollup`,\n`@dnssfnv/t12n/esbuild`, `@dnssfnv/t12n/rspack`. For **Next.js**, add `@dnssfnv/t12n/webpack` in\n`next.config.js` (Turbopack isn't supported yet — use the webpack build).\n\n## Use\n\nAnnotate a boundary; the plugin inserts the check.\n\n```ts\nimport type { User } from './types'\n\nconst user: User = await fetch('/api/me').then(r => r.json())\n// ↑ at build, compiled to a dedicated validator generated from User.\n//   A bad payload throws a ValidationError naming the file, line, path,\n//   the expected type and what actually arrived.\n```\n\nDetected automatically: typed variables, function params/returns, `JSON.parse`,\n`localStorage`/`sessionStorage`, `MessageEvent.data`, `as any`/`as unknown`\ncasts, and framework state — Vue `ref`/`reactive`, React `useState`, Solid\n`createSignal`, Svelte `$state`.\n\n## Modes\n\n| Mode | Detection |\n| :--- | :--- |\n| `auto` (default) | every typed boundary + typed function params/returns |\n| `manual` | only sites annotated with `Check<T>` |\n| `off` | no-op (compile-time types still apply) |\n\n## Live mode + failure policy\n\nOpt into a Proxy guard that keeps the type enforced for the object's whole life\n(catches later off-type mutations too), and decide per stage what a failure does:\n\n```ts\nimport { configure } from '@dnssfnv/t12n'\n\nconfigure({\n  onViolation: import.meta.env.PROD\n    ? ({ error, path }) => report(path, error) // prod: ship it, app lives\n    : ({ error }) => { throw error },          // dev: fail loud\n})\n```\n\n```ts\nt12n({ mode: 'auto', live: true }) // Proxy guard (default: dev server only)\n```\n\nThe `ValidationError` carries `path`, `expected`, `received`, and — when\n`errorLocation` is on (dev by default) — the `source` (`file:line`) and the\n`boundary` that produced the value.\n\n## Docs\n\nFull guide, concepts and an interactive playground: **https://t12n.vercel.app**\n\n## License\n\nMIT © Denis Sofonov\n","readmeFilename":"README.md"}