{"_id":"@michaelthielemann/kestrel","_rev":"32-0df140e2acdd17172abd5aab2290e0f6","name":"@michaelthielemann/kestrel","dist-tags":{"latest":"5.8.1"},"versions":{"1.2.1":{"name":"@michaelthielemann/kestrel","version":"1.2.1","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":{"name":"Michael Thielemann","email":"283621694+MichaelThielemann@users.noreply.github.com"},"license":"Apache-2.0","_id":"@michaelthielemann/kestrel@1.2.1","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":{"url":"https://github.com/MichaelThielemann/kestrel/issues"},"dist":{"shasum":"6af6816ed65bbc9fb4ed82faf1bc5a7bf9255324","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-1.2.1.tgz","fileCount":395,"integrity":"sha512-s0YX2gD4kNqntSWpjd0vaPCK29gord1sBDYxwPpou6AAfxQVM53Jqa1Ac/5eKxREmUVD+NTARctG4YM5fVVs7Q==","signatures":[{"sig":"MEUCIQCCQkLnZ5MhYmzQZvaGYjvMeHWovkxYtR21UZ5Qt+A8/gIga11X8GXdQ9KJWZWzzaZL6GgEUyfKRvcAevG5FSanQSg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1318916},"main":"./nuxt.config.ts","type":"module","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"gitHead":"defa20b231bc8b6cd8729c5eaae872fc80ac943e","scripts":{"dev":"nuxt dev","test":"vitest run","build":"nuxt build","preview":"nuxt preview","generate":"nuxt generate","test:e2e":"vitest run --config vitest.e2e.config.ts","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs"},"_npmUser":{"name":"michaelthielemann","email":"michael@thielemann.eu"},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import). `files` ships the entry + sub-layers + operator scripts; the `!**/*.test.ts` globs strip tests. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"_npmVersion":"11.13.0","description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.4.8","sass":"^1.101.0","jsdom":"^29.1.1","sharp":"^0.35.3","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.12","file-type":"^22.0.1","thumbhash":"^0.1.1","@tiptap/pm":"^3.27.3","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@babel/parser":"^7.28.0","@tiptap/vue-3":"^3.27.3","sanitize-html":"^2.17.5","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.27.3","@internationalized/date":"^3.12.2","@tiptap/extension-highlight":"^3.27.3","@tiptap/extension-subscript":"^3.27.3","@tiptap/extension-text-align":"^3.27.3","@tiptap/extension-superscript":"^3.27.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.9.0","devDependencies":{"h3":"^1.15.11","vue":"3.5.35","vitest":"^3.2.7","vue-tsc":"^3.3.7","@nuxt/kit":"^4.4.8","happy-dom":"^20.10.6","vue-router":"^5.1.0","drizzle-kit":"^0.31.10","@types/jsdom":"^28.0.3","@vue/test-utils":"^2.4.11","playwright-core":"^1.61.1","@nuxt/test-utils":"^3.23.0","@vitejs/plugin-vue":"^6.0.7","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.2.1_1785337914415_0.4329727621594459","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@michaelthielemann/kestrel","version":"1.3.0","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":{"name":"Michael Thielemann","email":"283621694+MichaelThielemann@users.noreply.github.com"},"license":"Apache-2.0","_id":"@michaelthielemann/kestrel@1.3.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":{"url":"https://github.com/MichaelThielemann/kestrel/issues"},"bin":{"kestrel":"scripts/kestrel.mjs"},"dist":{"shasum":"80c6090000b579d1347c06af89c5276b26f0c216","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-1.3.0.tgz","fileCount":414,"integrity":"sha512-mn4p9gOLlBT15TQjtyH+mkmGE8hTOiVvOcR2vc603cK4iQvOsKTe/hIcSBH1l0K1lF61B6W6GfmJBOLy4godgA==","signatures":[{"sig":"MEUCIA81DVHglWKldSY4damVwMhRG6/NvNADrze+c6NGjDJQAiEAjcH2jY1fxiHmbtKLrboOeW1Ij+vRxAl6jez+FgTHZBE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1369729},"main":"./nuxt.config.ts","type":"module","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"gitHead":"2094cd22e449dae55628d23fc59234da6cdc6b15","scripts":{"dev":"nuxt dev","test":"vitest run","build":"nuxt build","preview":"nuxt preview","generate":"nuxt generate","test:e2e":"vitest run --config vitest.e2e.config.ts","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"_npmVersion":"12.0.2","description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","nuxt":"^4.4.8","sass":"^1.101.0","jsdom":"^29.1.1","sharp":"^0.35.3","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.12","file-type":"^22.0.1","thumbhash":"^0.1.1","@tiptap/pm":"^3.27.3","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@babel/parser":"^7.28.0","@tiptap/vue-3":"^3.27.3","sanitize-html":"^2.17.5","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.27.3","@internationalized/date":"^3.12.2","@tiptap/extension-highlight":"^3.27.3","@tiptap/extension-subscript":"^3.27.3","@tiptap/extension-text-align":"^3.27.3","@tiptap/extension-superscript":"^3.27.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.9.0","devDependencies":{"h3":"^1.15.11","vue":"3.5.35","vitest":"^3.2.7","vue-tsc":"^3.3.7","@nuxt/kit":"^4.4.8","happy-dom":"^20.10.6","vue-router":"^5.1.0","drizzle-kit":"^0.31.10","@types/jsdom":"^28.0.3","@vue/test-utils":"^2.4.11","playwright-core":"^1.61.1","@nuxt/test-utils":"^3.23.0","@vitejs/plugin-vue":"^6.0.7","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.3.0_1785491286785_0.4041030957607854","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@michaelthielemann/kestrel","version":"1.4.0","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":{"name":"Michael Thielemann","email":"283621694+MichaelThielemann@users.noreply.github.com"},"license":"Apache-2.0","_id":"@michaelthielemann/kestrel@1.4.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":{"url":"https://github.com/MichaelThielemann/kestrel/issues"},"bin":{"kestrel":"scripts/kestrel.mjs"},"dist":{"shasum":"e4e1cf4bf3c32997dd1bc3ff887a70f1abe664fa","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-1.4.0.tgz","fileCount":417,"integrity":"sha512-BMwqDT15sDjJB1rfxpHbADNd7QdNJjFT6P936SQSvQmNdpDbsDohyqLUmEMeFX/4UoWMc4L7rGVT3hc0U89iHQ==","signatures":[{"sig":"MEYCIQCafnkAPsS1YHSdyktYbF5B1WnQqZJARkuwiFf4Sf9fxwIhANd5qP2Mr4nPa/Ci9iTImN08Y51WKEcP+5phfXWGbmBv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1376790},"main":"./nuxt.config.ts","type":"module","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"gitHead":"f3887ac7bf8e245f51b5dbf770350dd86540ab6c","scripts":{"dev":"nuxt dev","test":"vitest run","build":"nuxt build","preview":"nuxt preview","generate":"nuxt generate","test:e2e":"vitest run --config vitest.e2e.config.ts","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"_npmVersion":"12.0.2","description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.4.8","sass":"^1.101.0","jsdom":"^29.1.1","sharp":"^0.35.3","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.12","file-type":"^22.0.1","thumbhash":"^0.1.1","@tiptap/pm":"^3.27.3","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@babel/parser":"^7.28.0","@tiptap/vue-3":"^3.27.3","sanitize-html":"^2.17.5","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.27.3","@internationalized/date":"^3.12.2","@tiptap/extension-highlight":"^3.27.3","@tiptap/extension-subscript":"^3.27.3","@tiptap/extension-text-align":"^3.27.3","@tiptap/extension-superscript":"^3.27.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.9.0","devDependencies":{"h3":"^1.15.11","vue":"3.5.35","vitest":"^3.2.7","vue-tsc":"^3.3.7","@nuxt/kit":"^4.4.8","happy-dom":"^20.10.6","vue-router":"^5.1.0","drizzle-kit":"^0.31.10","@types/jsdom":"^28.0.3","@vue/test-utils":"^2.4.11","playwright-core":"^1.61.1","@nuxt/test-utils":"^3.23.0","@vitejs/plugin-vue":"^6.0.7","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.4.0_1786367273793_0.5777391320400402","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@michaelthielemann/kestrel","version":"1.4.1","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":{"name":"Michael Thielemann","email":"283621694+MichaelThielemann@users.noreply.github.com"},"license":"Apache-2.0","_id":"@michaelthielemann/kestrel@1.4.1","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":{"url":"https://github.com/MichaelThielemann/kestrel/issues"},"bin":{"kestrel":"scripts/kestrel.mjs"},"dist":{"shasum":"5ddf00d42fdbb23bdab2149a2eeb8563d82cbb4e","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-1.4.1.tgz","fileCount":417,"integrity":"sha512-yyLfiLWREH1qRh93W+2Xs/fcsMpcm/vVxB89cmWd1mS0vPmYv+ZbXirwLH5SgPRXjddlPklEI6Kl7Yup204d3Q==","signatures":[{"sig":"MEUCIEKqHYln+DfAeNuk/FEujuBsWasZ4ohBjbFAt9QNF44mAiEA0o7+F4QMj7ddvBJFPkgc9QrWX6hQohh8dAr5iRgJv8A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@1.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1378634},"main":"./nuxt.config.ts","type":"module","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"gitHead":"a4eae2644d7f44c47f58ce2a35dd3ab11b845b9d","scripts":{"dev":"nuxt dev","test":"vitest run","build":"nuxt build","preview":"nuxt preview","generate":"nuxt generate","test:e2e":"vitest run --config vitest.e2e.config.ts","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"_npmVersion":"12.0.2","description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.4.8","sass":"^1.101.0","jsdom":"^29.1.1","sharp":"^0.35.3","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.12","file-type":"^22.0.1","thumbhash":"^0.1.1","@tiptap/pm":"^3.27.3","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@babel/parser":"^7.28.0","@tiptap/vue-3":"^3.27.3","sanitize-html":"^2.17.5","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.27.3","@internationalized/date":"^3.12.2","@tiptap/extension-highlight":"^3.27.3","@tiptap/extension-subscript":"^3.27.3","@tiptap/extension-text-align":"^3.27.3","@tiptap/extension-superscript":"^3.27.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.9.0","devDependencies":{"h3":"^1.15.11","vue":"3.5.35","vitest":"^3.2.7","vue-tsc":"^3.3.7","@nuxt/kit":"^4.4.8","happy-dom":"^20.10.6","vue-router":"^5.1.0","drizzle-kit":"^0.31.10","@types/jsdom":"^28.0.3","@vue/test-utils":"^2.4.11","playwright-core":"^1.61.1","@nuxt/test-utils":"^3.23.0","@vitejs/plugin-vue":"^6.0.7","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.4.1_1786372961688_0.9982807001274823","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@michaelthielemann/kestrel","version":"1.5.0","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":{"name":"Michael Thielemann","email":"283621694+MichaelThielemann@users.noreply.github.com"},"license":"Apache-2.0","_id":"@michaelthielemann/kestrel@1.5.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":{"url":"https://github.com/MichaelThielemann/kestrel/issues"},"bin":{"kestrel":"scripts/kestrel.mjs"},"dist":{"shasum":"f82db0c95a5eaee210f561e4618c5335c02323d3","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-1.5.0.tgz","fileCount":419,"integrity":"sha512-IzujoYC96z5Lxf7lRScVos8SWSd3aNCE5AJ/vto5SMootov56fczxNBj89/8kT47phbwPIRRa3yBs2hhZVOOFQ==","signatures":[{"sig":"MEYCIQCRmOuVElyomntFw6uEmsr7HZ4rYn9mMsJ0/sYtj/DmWAIhAOGKzHMDoetH/2gS3TvC+Vw5TwoBOCaHBs1S7iahn3f+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1383392},"main":"./nuxt.config.ts","type":"module","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"gitHead":"2b8a193b5df135887bcfb4684db578b2f77cfe04","scripts":{"dev":"nuxt dev","test":"vitest run","build":"nuxt build","preview":"nuxt preview","generate":"nuxt generate","test:e2e":"vitest run --config vitest.e2e.config.ts","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"_npmVersion":"12.0.2","description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.4.8","sass":"^1.101.0","jsdom":"^29.1.1","sharp":"^0.35.3","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.12","file-type":"^22.0.1","thumbhash":"^0.1.1","@tiptap/pm":"^3.27.3","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@babel/parser":"^7.28.0","@tiptap/vue-3":"^3.27.3","sanitize-html":"^2.17.5","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.27.3","@internationalized/date":"^3.12.2","@tiptap/extension-highlight":"^3.27.3","@tiptap/extension-subscript":"^3.27.3","@tiptap/extension-text-align":"^3.27.3","@tiptap/extension-superscript":"^3.27.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.9.0","devDependencies":{"h3":"^1.15.11","vue":"3.5.35","vitest":"^3.2.7","vue-tsc":"^3.3.7","@nuxt/kit":"^4.4.8","happy-dom":"^20.10.6","vue-router":"^5.1.0","drizzle-kit":"^0.31.10","@types/jsdom":"^28.0.3","@vue/test-utils":"^2.4.11","playwright-core":"^1.61.1","@nuxt/test-utils":"^3.23.0","@vitejs/plugin-vue":"^6.0.7","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.5.0_1786377581109_0.6369624612845397","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@michaelthielemann/kestrel","version":"1.6.0","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":{"name":"Michael Thielemann","email":"283621694+MichaelThielemann@users.noreply.github.com"},"license":"Apache-2.0","_id":"@michaelthielemann/kestrel@1.6.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":{"url":"https://github.com/MichaelThielemann/kestrel/issues"},"bin":{"kestrel":"scripts/kestrel.mjs"},"dist":{"shasum":"95d1416f1f34261e79f468cd215ad96b6d93a704","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-1.6.0.tgz","fileCount":419,"integrity":"sha512-XnAbT44KH2MM/8ZgEWjt8fngTeRjX2hUNRgi8wXy9MYRV3U565HQgjrSKqxla8A8rGMJm5tBBgu0lWrjI9Y2lw==","signatures":[{"sig":"MEQCIDoSIB+FRjTwz90g42ueQWdagU2Cwtm8jAmttqrjrxseAiA7yaNYeozrqJCewSfEPmuP7Yse6pfqyMgHv4L4w+g8mw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@1.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1383618},"main":"./nuxt.config.ts","type":"module","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"gitHead":"6966765ec270a242600af0843884d63a4799335f","scripts":{"dev":"nuxt dev","test":"vitest run","build":"nuxt build","preview":"nuxt preview","generate":"nuxt generate","test:e2e":"vitest run --config vitest.e2e.config.ts","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"_npmVersion":"12.0.2","description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.5.2","sass":"^1.102.0","jsdom":"^29.1.1","sharp":"^0.35.3","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.13","file-type":"^22.0.1","thumbhash":"^0.1.1","@tiptap/pm":"^3.29.2","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@babel/parser":"^7.29.8","@tiptap/vue-3":"^3.29.2","sanitize-html":"^2.17.6","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.29.2","@internationalized/date":"^3.12.3","@tiptap/extension-highlight":"^3.29.2","@tiptap/extension-subscript":"^3.29.2","@tiptap/extension-text-align":"^3.29.2","@tiptap/extension-superscript":"^3.29.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.9.0","devDependencies":{"h3":"^1.15.11","vue":"3.5.35","vitest":"^4.1.10","vue-tsc":"^3.3.9","@nuxt/kit":"^4.5.2","happy-dom":"^20.11.2","vue-router":"^5.2.0","drizzle-kit":"^0.31.10","@types/jsdom":"^28.0.3","@vue/test-utils":"^2.4.11","playwright-core":"^1.62.1","@nuxt/test-utils":"^4.1.0","@vitejs/plugin-vue":"^6.0.8","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.6.0_1786386994201_0.00451254922570099","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@michaelthielemann/kestrel","version":"1.7.0","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":{"name":"Michael Thielemann","email":"283621694+MichaelThielemann@users.noreply.github.com"},"license":"Apache-2.0","_id":"@michaelthielemann/kestrel@1.7.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":{"url":"https://github.com/MichaelThielemann/kestrel/issues"},"bin":{"kestrel":"scripts/kestrel.mjs"},"dist":{"shasum":"bda8589e87a189a4767b2ebae66254b24a8fa001","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-1.7.0.tgz","fileCount":420,"integrity":"sha512-s/HV7+ld8+fYP8rb09gwFw/U7vrt9C4cCnGHXjqPiDbn4vYTB5uA1iUf1hF1/B1VcQyaHB0mGmDnfedHZtItxg==","signatures":[{"sig":"MEYCIQC4MRNankrG58xkPO0N5f0h6QqZPg/ZbvmvXQ6SxANWrQIhAOLGNlZciY41azhseUTCBUUli4icSWzG2TKf9At4QPTS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@1.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1400350},"main":"./nuxt.config.ts","type":"module","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"gitHead":"0d1a4fcf84347bdfcb3b0f434fd2362e8b9429cc","scripts":{"dev":"nuxt dev","test":"vitest run","build":"nuxt build","preview":"nuxt preview","generate":"nuxt generate","test:e2e":"vitest run --config vitest.e2e.config.ts","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"_npmVersion":"12.0.2","description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.5.2","sass":"^1.102.0","jsdom":"^29.1.1","sharp":"^0.35.3","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.13","file-type":"^22.0.1","thumbhash":"^0.1.1","@tiptap/pm":"^3.29.2","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@types/jsdom":"^28.0.3","@babel/parser":"^7.29.8","@tiptap/vue-3":"^3.29.2","sanitize-html":"^2.17.6","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.29.2","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13","@internationalized/date":"^3.12.3","@tiptap/extension-highlight":"^3.29.2","@tiptap/extension-subscript":"^3.29.2","@tiptap/extension-text-align":"^3.29.2","@tiptap/extension-superscript":"^3.29.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.9.0","devDependencies":{"h3":"^1.15.11","vue":"3.5.35","vitest":"^4.1.10","vue-tsc":"^3.3.9","@nuxt/kit":"^4.5.2","happy-dom":"^20.11.2","vue-router":"^5.2.0","drizzle-kit":"^0.31.10","@vue/test-utils":"^2.4.11","playwright-core":"^1.62.1","@nuxt/test-utils":"^4.1.0","@vitejs/plugin-vue":"^6.0.8"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.7.0_1786406175358_0.40123270070457284","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@michaelthielemann/kestrel","version":"2.0.0","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":{"name":"Michael Thielemann","email":"283621694+MichaelThielemann@users.noreply.github.com"},"license":"Apache-2.0","_id":"@michaelthielemann/kestrel@2.0.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":{"url":"https://github.com/MichaelThielemann/kestrel/issues"},"bin":{"kestrel":"scripts/kestrel.mjs"},"dist":{"shasum":"0f403d04d15de2c60f56dc8a5a8c21512bc35070","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-2.0.0.tgz","fileCount":427,"integrity":"sha512-NmXI46qZiXnYhnEXtFgj6lcuri9zzHp9+cy58ITVlnrrUlv36JrSvUrHWKtRIXS5V5pHoqCnd8vf1SsQaPfGSA==","signatures":[{"sig":"MEYCIQCGa+mKKAJHXi0QfxsSUPiwk/xIn15cP9rywwUj7a5oiQIhALL9JQ+P+Y/NzDJ3QuYYdWM7kmjN5yznpTeQq49ZrYdj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1463235},"main":"./nuxt.config.ts","type":"module","//lint":"The root eslint.config.mjs imports the generated playground/.nuxt/eslint.config.mjs (Nuxt-aware: auto-import globals for every layer + extension) — `nuxt prepare` must run first or that import 404s on a fresh checkout. Cheap on a warm .nuxt cache, so it's chained rather than a separate step.","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"gitHead":"e7b6494b03de0439cd55c5df05734e1c2656d048","scripts":{"dev":"nuxt dev","lint":"nuxt prepare playground && eslint .","test":"vitest run","build":"nuxt build","preview":"nuxt preview","generate":"nuxt generate","test:e2e":"vitest run --config vitest.e2e.config.ts","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"_npmVersion":"12.0.2","description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.5.2","sass":"^1.102.0","jsdom":"^29.1.1","sharp":"^0.35.3","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.13","file-type":"^22.0.1","thumbhash":"^0.1.1","@tiptap/pm":"^3.29.2","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@types/jsdom":"^28.0.3","@babel/parser":"^7.29.8","@tiptap/vue-3":"^3.29.2","sanitize-html":"^2.17.6","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.29.2","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13","@internationalized/date":"^3.12.3","@tiptap/extension-highlight":"^3.29.2","@tiptap/extension-subscript":"^3.29.2","@tiptap/extension-text-align":"^3.29.2","@tiptap/extension-superscript":"^3.29.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.9.0","devDependencies":{"h3":"^1.15.11","vue":"3.5.35","eslint":"^9.39.1","vitest":"^4.1.10","vue-tsc":"^3.3.9","@nuxt/kit":"^4.5.2","happy-dom":"^20.11.2","vue-router":"^5.2.0","drizzle-kit":"^0.31.10","@nuxt/eslint":"^1.9.0","@vue/test-utils":"^2.4.11","playwright-core":"^1.62.1","@nuxt/test-utils":"^4.1.0","@vitejs/plugin-vue":"^6.0.8","eslint-plugin-vuejs-accessibility":"^2.4.1"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_2.0.0_1786688042184_0.4757807209416758","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@michaelthielemann/kestrel","version":"2.1.0","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":{"name":"Michael Thielemann","email":"283621694+MichaelThielemann@users.noreply.github.com"},"license":"Apache-2.0","_id":"@michaelthielemann/kestrel@2.1.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":{"url":"https://github.com/MichaelThielemann/kestrel/issues"},"bin":{"kestrel":"scripts/kestrel.mjs"},"dist":{"shasum":"128fe94c85178dde178407c2fc93e11b957ed639","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-2.1.0.tgz","fileCount":442,"integrity":"sha512-YhIuPGctYnPN15kiMmYHAxoAtD/GOJOztOPhossoq0WqqtvpiogWAvbWI8uebejg65imxABIhG63KmK5eF1jqQ==","signatures":[{"sig":"MEUCID3Gln6WOd9He9Y2fFAnXD467O6lJT8K6nQZ+1P5bh9DAiEAontDVAocA0C8eLhwL2rK5uyqzhgBX2AAOeZSEE/VRMc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1568062},"main":"./nuxt.config.ts","type":"module","//lint":"The root eslint.config.mjs imports the generated playground/.nuxt/eslint.config.mjs (Nuxt-aware: auto-import globals for every layer + extension) — `nuxt prepare` must run first or that import 404s on a fresh checkout. Cheap on a warm .nuxt cache, so it's chained rather than a separate step.","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"gitHead":"bf74f13ba2028b3c80173113f2c799d1a49e1d9b","scripts":{"dev":"nuxt dev","lint":"nuxt prepare playground && eslint .","test":"vitest run","build":"nuxt build","preview":"nuxt preview","generate":"nuxt generate","test:e2e":"vitest run --config vitest.e2e.config.ts","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"_npmVersion":"12.0.2","description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.5.2","sass":"^1.102.0","exifr":"^7.1.3","jsdom":"^29.1.1","sharp":"^0.35.3","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.13","file-type":"^22.0.1","thumbhash":"^0.1.1","@tiptap/pm":"^3.29.2","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@types/jsdom":"^28.0.3","@babel/parser":"^7.29.8","@tiptap/vue-3":"^3.29.2","sanitize-html":"^2.17.6","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.29.2","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13","@internationalized/date":"^3.12.3","@tiptap/extension-highlight":"^3.29.2","@tiptap/extension-subscript":"^3.29.2","@tiptap/extension-text-align":"^3.29.2","@tiptap/extension-superscript":"^3.29.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.9.0","devDependencies":{"h3":"^1.15.11","vue":"3.5.35","eslint":"^9.39.1","vitest":"^4.1.10","vue-tsc":"^3.3.9","@nuxt/kit":"^4.5.2","happy-dom":"^20.11.2","vue-router":"^5.2.0","drizzle-kit":"^0.31.10","@nuxt/eslint":"^1.9.0","@vue/test-utils":"^2.4.11","playwright-core":"^1.62.1","@nuxt/test-utils":"^4.1.0","@vitejs/plugin-vue":"^6.0.8","eslint-plugin-vuejs-accessibility":"^2.4.1"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_2.1.0_1786727939286_0.81640693917804","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@michaelthielemann/kestrel","version":"3.0.0","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":{"name":"Michael Thielemann","email":"283621694+MichaelThielemann@users.noreply.github.com"},"license":"Apache-2.0","_id":"@michaelthielemann/kestrel@3.0.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":{"url":"https://github.com/MichaelThielemann/kestrel/issues"},"bin":{"kestrel":"scripts/kestrel.mjs"},"dist":{"shasum":"0ebb4fa3cf25daec9e8676435ca83b4d6c541dc9","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-3.0.0.tgz","fileCount":455,"integrity":"sha512-1vnMEBlJbrtl8irlCp5iU7WN74VPvyIKYFxtxTUjrn33wHZgEemETLIRRsWqT7FN2ageBU2teJgujdYkj28Eqw==","signatures":[{"sig":"MEQCIF6FmNkAfYZJ0B3uYl/BguXhYfbkVdebiOvENZgiG3IyAiBIQuVzJWqgYz81zrtzFoU6UDbLYSh9UlwGPc9lOCwGAg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1580556},"main":"./nuxt.config.ts","type":"module","//lint":"The root eslint.config.mjs imports the generated playground/.nuxt/eslint.config.mjs (Nuxt-aware: auto-import globals for every layer + extension) — `nuxt prepare` must run first or that import 404s on a fresh checkout. Cheap on a warm .nuxt cache, so it's chained rather than a separate step.","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"gitHead":"77c00ef9b9c7abf43ed6ba98dd6354c66d6a9e9a","scripts":{"dev":"nuxt dev","lint":"nuxt prepare playground && eslint .","test":"vitest run","build":"nuxt build","preview":"nuxt preview","generate":"nuxt generate","test:e2e":"vitest run --config vitest.e2e.config.ts","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"_npmVersion":"12.0.2","description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.5.2","sass":"^1.102.0","exifr":"^7.1.3","jsdom":"^29.1.1","sharp":"^0.35.3","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.13","file-type":"^22.0.1","thumbhash":"^0.1.1","@tiptap/pm":"^3.29.2","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@types/jsdom":"^28.0.3","@babel/parser":"^7.29.8","@tiptap/vue-3":"^3.29.2","sanitize-html":"^2.17.6","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.29.2","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13","@internationalized/date":"^3.12.3","@tiptap/extension-highlight":"^3.29.2","@tiptap/extension-subscript":"^3.29.2","@tiptap/extension-text-align":"^3.29.2","@tiptap/extension-superscript":"^3.29.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.9.0","devDependencies":{"h3":"^1.15.11","vue":"3.5.35","eslint":"^9.39.1","vitest":"^4.1.10","vue-tsc":"^3.3.9","@nuxt/kit":"^4.5.2","happy-dom":"^20.11.2","vue-router":"^5.2.0","drizzle-kit":"^0.31.10","@nuxt/eslint":"^1.9.0","@vue/test-utils":"^2.4.11","playwright-core":"^1.62.1","@nuxt/test-utils":"^4.1.0","@vitejs/plugin-vue":"^6.0.8","eslint-plugin-vuejs-accessibility":"^2.4.1"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_3.0.0_1787131859412_0.22452581585895848","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@michaelthielemann/kestrel","version":"3.0.1","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":{"name":"Michael Thielemann","email":"283621694+MichaelThielemann@users.noreply.github.com"},"license":"Apache-2.0","_id":"@michaelthielemann/kestrel@3.0.1","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":{"url":"https://github.com/MichaelThielemann/kestrel/issues"},"bin":{"kestrel":"scripts/kestrel.mjs"},"dist":{"shasum":"662746e2e37da91a2ccd42e2b2ac825e4c23e7da","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-3.0.1.tgz","fileCount":455,"integrity":"sha512-ba7vQEclOdbbBmfR3OPDFFlUDxJJxG8UD7OIB6umsDi3jf1I2Zbt5k5cfm4woCR/qbu+HhkiepXzOqY8krT4Xw==","signatures":[{"sig":"MEYCIQC3VheSdNAJajeTOsIuJzW7ZD3Q9B1zrci5nRLdkyq5XAIhAP5db9UuGOhIHNvVAHN0bWKO2Vps5ZdtfQgGzilT/WaA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@3.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1580667},"main":"./nuxt.config.ts","type":"module","//lint":"The root eslint.config.mjs imports the generated playground/.nuxt/eslint.config.mjs (Nuxt-aware: auto-import globals for every layer + extension) — `nuxt prepare` must run first or that import 404s on a fresh checkout. Cheap on a warm .nuxt cache, so it's chained rather than a separate step.","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"gitHead":"9273b8cf63c25bd8e8d1c6841bf6380ecd2acd62","scripts":{"dev":"nuxt dev","lint":"nuxt prepare playground && eslint .","test":"vitest run","build":"nuxt build","preview":"nuxt preview","generate":"nuxt generate","test:e2e":"vitest run --config vitest.e2e.config.ts","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"_npmVersion":"12.0.2","description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.5.2","sass":"^1.102.0","exifr":"^7.1.3","jsdom":"^29.1.1","sharp":"^0.35.3","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.13","file-type":"^22.0.1","thumbhash":"^0.1.1","@tiptap/pm":"^3.29.2","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@types/jsdom":"^28.0.3","@babel/parser":"^7.29.8","@tiptap/vue-3":"^3.29.2","sanitize-html":"^2.17.6","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.29.2","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13","@internationalized/date":"^3.12.3","@tiptap/extension-highlight":"^3.29.2","@tiptap/extension-subscript":"^3.29.2","@tiptap/extension-text-align":"^3.29.2","@tiptap/extension-superscript":"^3.29.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.9.0","devDependencies":{"h3":"^1.15.11","vue":"3.5.35","eslint":"^9.39.1","vitest":"^4.1.10","vue-tsc":"^3.3.9","@nuxt/kit":"^4.5.2","happy-dom":"^20.11.2","vue-router":"^5.2.0","drizzle-kit":"^0.31.10","@nuxt/eslint":"^1.9.0","@vue/test-utils":"^2.4.11","playwright-core":"^1.62.1","@nuxt/test-utils":"^4.1.0","@vitejs/plugin-vue":"^6.0.8","eslint-plugin-vuejs-accessibility":"^2.4.1"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_3.0.1_1787149130611_0.5039944192429737","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@michaelthielemann/kestrel","version":"4.0.0","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":"Michael Thielemann <283621694+MichaelThielemann@users.noreply.github.com>","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@4.0.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./scripts/kestrel.mjs"},"dist":{"shasum":"81267129c7df62aa1efcd79e291742993176b56f","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-4.0.0.tgz","fileCount":294,"integrity":"sha512-gveCNsSrEnk6sXaf1Rk3wh4WBO4SESjgWcRcY4ama800su+y7axV/mxCTgBSCsDh28Vp+Z03duxPGer+CclNgQ==","signatures":[{"sig":"MEUCIF5DteLWc2ak2SehTd3O4iaO2jaFwzT/8oWzq/qTfW/MAiEAn8kyeFo/9Yzh164/MYTQQlRW8h9CkpVKODX6JhSqeGA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1018464},"main":"./nuxt.config.ts","type":"module","//lint":"The root eslint.config.mjs imports the generated playground/.nuxt/eslint.config.mjs (Nuxt-aware: auto-import globals for every layer + extension) — `nuxt prepare` must run first or that import 404s on a fresh checkout. Cheap on a warm .nuxt cache, so it's chained rather than a separate step.","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"scripts":{"dev":"nuxt dev","lint":"nuxt prepare playground && eslint .","test":"vitest run","build":"nuxt build","preview":"nuxt preview","docs:api":"nuxt prepare playground && typedoc","generate":"nuxt generate","pkg:lint":"publint . && pnpm -F @michaelthielemann/kestrel-contracts build && publint packages/kestrel-contracts && attw --pack packages/kestrel-contracts --profile esm-only && pnpm -F @michaelthielemann/kestrel-core build && publint packages/kestrel-core && attw --pack packages/kestrel-core --profile esm-only && pnpm -F @michaelthielemann/kestrel-fields build && publint packages/kestrel-fields && attw --pack packages/kestrel-fields --profile esm-only && pnpm -F @michaelthielemann/kestrel-auth build && publint packages/kestrel-auth && attw --pack packages/kestrel-auth --profile esm-only && pnpm -F @michaelthielemann/kestrel-access build && publint packages/kestrel-access && attw --pack packages/kestrel-access --profile esm-only && pnpm -F @michaelthielemann/kestrel-media build && publint packages/kestrel-media && attw --pack packages/kestrel-media --profile esm-only && pnpm -F @michaelthielemann/kestrel-collections build && publint packages/kestrel-collections && attw --pack packages/kestrel-collections --profile esm-only && pnpm -F @michaelthielemann/kestrel-publishing build && publint packages/kestrel-publishing && attw --pack packages/kestrel-publishing --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-live build && publint packages/kestrel-delivery-live && attw --pack packages/kestrel-delivery-live --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-static build && publint packages/kestrel-delivery-static && attw --pack packages/kestrel-delivery-static --profile esm-only","test:e2e":"vitest run --config vitest.e2e.config.ts","api:check":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run -c packages/kestrel-core/api-extractor.json && api-extractor run -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run -c packages/kestrel-fields/api-extractor.json && api-extractor run -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run -c packages/kestrel-delivery-static/api-extractor.json","dashboard":"npx tsx scripts/dashboard.mjs","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","api:update":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run --local -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run --local -c packages/kestrel-core/api-extractor.json && api-extractor run --local -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run --local -c packages/kestrel-fields/api-extractor.json && api-extractor run --local -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run --local -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run --local -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run --local -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run --local -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run --local -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run --local -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run --local -c packages/kestrel-delivery-static/api-extractor.json","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs","test:coverage":"node scripts/coverage-all.mjs","test:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r test","build:packages":"pnpm -F @michaelthielemann/kestrel-contracts build && pnpm -F @michaelthielemann/kestrel-core build && pnpm -F @michaelthielemann/kestrel-fields build && pnpm -F @michaelthielemann/kestrel-auth build && pnpm -F @michaelthielemann/kestrel-access build && pnpm -F @michaelthielemann/kestrel-media build && pnpm -F @michaelthielemann/kestrel-collections build && pnpm -F @michaelthielemann/kestrel-publishing build && pnpm -F @michaelthielemann/kestrel-delivery-live build && pnpm -F @michaelthielemann/kestrel-delivery-static build","typecheck:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r typecheck","ci:consumer-template":"node scripts/consumer-template-ci.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.5.2","sass":"^1.102.0","exifr":"^7.1.3","jsdom":"^29.1.1","sharp":"^0.35.3","effect":"~3.22.1","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.13","file-type":"^22.0.1","nitropack":"^2.13.4","thumbhash":"^0.1.1","@tiptap/pm":"^3.29.2","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@types/jsdom":"^28.0.3","@babel/parser":"^7.29.8","@tiptap/vue-3":"^3.29.2","sanitize-html":"^2.17.6","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.29.2","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13","@internationalized/date":"^3.12.3","@tiptap/extension-highlight":"^3.29.2","@tiptap/extension-subscript":"^3.29.2","@tiptap/extension-text-align":"^3.29.2","@tiptap/extension-superscript":"^3.29.2","@michaelthielemann/kestrel-auth":"0.1.0","@michaelthielemann/kestrel-core":"0.1.0","@michaelthielemann/kestrel-media":"0.1.0","@michaelthielemann/kestrel-access":"0.1.0","@michaelthielemann/kestrel-fields":"0.1.0","@michaelthielemann/kestrel-contracts":"0.1.0","@michaelthielemann/kestrel-publishing":"0.1.0","@michaelthielemann/kestrel-collections":"0.1.0","@michaelthielemann/kestrel-delivery-live":"0.1.0","@michaelthielemann/kestrel-delivery-static":"0.1.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"h3":"^1.15.11","vue":"3.5.35","eslint":"^9.39.1","vitest":"^4.1.10","publint":"^0.3.24","typedoc":"^0.28.20","vue-tsc":"^3.3.9","@nuxt/kit":"^4.5.2","happy-dom":"^20.11.2","fast-check":"^4.9.0","vue-router":"^5.2.0","drizzle-kit":"^0.31.10","@nuxt/eslint":"^1.9.0","vitest-openapi":"^1.0.3","@vue/test-utils":"^2.4.11","playwright-core":"^1.62.1","@nuxt/test-utils":"^4.1.0","@fast-check/vitest":"^0.4.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"4.1.10","eslint-plugin-jsdoc":"^64.2.1","eslint-plugin-tsdoc":"^0.5.2","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^10.0.0","@microsoft/api-extractor":"^7.58.13","eslint-plugin-boundaries":"^7.2.0","@stryker-mutator/vitest-runner":"^10.0.0","eslint-plugin-vuejs-accessibility":"^2.4.1"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_4.0.0_1787764621540_0.6004864992346786","host":"s3://npm-registry-packages-npm-production"}},"4.0.1":{"name":"@michaelthielemann/kestrel","version":"4.0.1","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":"Michael Thielemann <283621694+MichaelThielemann@users.noreply.github.com>","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@4.0.1","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./scripts/kestrel.mjs"},"dist":{"shasum":"a1e7ffe9ca7eb5e56c49149db1e5b6451426abfc","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-4.0.1.tgz","fileCount":294,"integrity":"sha512-bU0gPVI4/NFpR0ekfTAFSpBpAy4NjwPQm/15S8ediw/RG+z9EfiUgqnfOv6Jy3QajnMzuyE2ZMXV7muk08St0g==","signatures":[{"sig":"MEYCIQC2i1jPStf4ZY8XqRtorkp9x/Vu86nWMuZMZyVzNLfa3AIhAOaOOqJb3+z8b2nFQewQY8tS2SzJG3UiMe1RAcS7HhFL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@4.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1019998},"main":"./nuxt.config.ts","type":"module","//lint":"The root eslint.config.mjs imports the generated playground/.nuxt/eslint.config.mjs (Nuxt-aware: auto-import globals for every layer + extension) — `nuxt prepare` must run first or that import 404s on a fresh checkout. Cheap on a warm .nuxt cache, so it's chained rather than a separate step.","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"scripts":{"dev":"nuxt dev","lint":"nuxt prepare playground && eslint .","test":"vitest run","build":"nuxt build","preview":"nuxt preview","docs:api":"nuxt prepare playground && typedoc","generate":"nuxt generate","pkg:lint":"publint . && pnpm -F @michaelthielemann/kestrel-contracts build && publint packages/kestrel-contracts && attw --pack packages/kestrel-contracts --profile esm-only && pnpm -F @michaelthielemann/kestrel-core build && publint packages/kestrel-core && attw --pack packages/kestrel-core --profile esm-only && pnpm -F @michaelthielemann/kestrel-fields build && publint packages/kestrel-fields && attw --pack packages/kestrel-fields --profile esm-only && pnpm -F @michaelthielemann/kestrel-auth build && publint packages/kestrel-auth && attw --pack packages/kestrel-auth --profile esm-only && pnpm -F @michaelthielemann/kestrel-access build && publint packages/kestrel-access && attw --pack packages/kestrel-access --profile esm-only && pnpm -F @michaelthielemann/kestrel-media build && publint packages/kestrel-media && attw --pack packages/kestrel-media --profile esm-only && pnpm -F @michaelthielemann/kestrel-collections build && publint packages/kestrel-collections && attw --pack packages/kestrel-collections --profile esm-only && pnpm -F @michaelthielemann/kestrel-publishing build && publint packages/kestrel-publishing && attw --pack packages/kestrel-publishing --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-live build && publint packages/kestrel-delivery-live && attw --pack packages/kestrel-delivery-live --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-static build && publint packages/kestrel-delivery-static && attw --pack packages/kestrel-delivery-static --profile esm-only","test:e2e":"vitest run --config vitest.e2e.config.ts","api:check":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run -c packages/kestrel-core/api-extractor.json && api-extractor run -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run -c packages/kestrel-fields/api-extractor.json && api-extractor run -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run -c packages/kestrel-delivery-static/api-extractor.json","dashboard":"npx tsx scripts/dashboard.mjs","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","api:update":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run --local -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run --local -c packages/kestrel-core/api-extractor.json && api-extractor run --local -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run --local -c packages/kestrel-fields/api-extractor.json && api-extractor run --local -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run --local -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run --local -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run --local -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run --local -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run --local -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run --local -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run --local -c packages/kestrel-delivery-static/api-extractor.json","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs","test:coverage":"node scripts/coverage-all.mjs","test:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r test","build:packages":"pnpm -F @michaelthielemann/kestrel-contracts build && pnpm -F @michaelthielemann/kestrel-core build && pnpm -F @michaelthielemann/kestrel-fields build && pnpm -F @michaelthielemann/kestrel-auth build && pnpm -F @michaelthielemann/kestrel-access build && pnpm -F @michaelthielemann/kestrel-media build && pnpm -F @michaelthielemann/kestrel-collections build && pnpm -F @michaelthielemann/kestrel-publishing build && pnpm -F @michaelthielemann/kestrel-delivery-live build && pnpm -F @michaelthielemann/kestrel-delivery-static build","typecheck:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r typecheck","ci:consumer-template":"node scripts/consumer-template-ci.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.5.2","sass":"^1.102.0","exifr":"^7.1.3","jsdom":"^29.1.1","sharp":"^0.35.3","effect":"~3.22.1","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.13","file-type":"^22.0.1","nitropack":"^2.13.4","thumbhash":"^0.1.1","@tiptap/pm":"^3.29.2","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@types/jsdom":"^28.0.3","@babel/parser":"^7.29.8","@tiptap/vue-3":"^3.29.2","sanitize-html":"^2.17.6","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.29.2","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13","@internationalized/date":"^3.12.3","@tiptap/extension-highlight":"^3.29.2","@tiptap/extension-subscript":"^3.29.2","@tiptap/extension-text-align":"^3.29.2","@tiptap/extension-superscript":"^3.29.2","@michaelthielemann/kestrel-auth":"0.1.0","@michaelthielemann/kestrel-core":"0.1.0","@michaelthielemann/kestrel-media":"0.1.0","@michaelthielemann/kestrel-access":"0.1.0","@michaelthielemann/kestrel-fields":"0.1.0","@michaelthielemann/kestrel-contracts":"0.1.0","@michaelthielemann/kestrel-publishing":"0.1.0","@michaelthielemann/kestrel-collections":"0.1.0","@michaelthielemann/kestrel-delivery-live":"0.1.0","@michaelthielemann/kestrel-delivery-static":"0.1.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"h3":"^1.15.11","vue":"3.5.35","eslint":"^9.39.1","vitest":"^4.1.10","publint":"^0.3.24","typedoc":"^0.28.20","vue-tsc":"^3.3.9","@nuxt/kit":"^4.5.2","happy-dom":"^20.11.2","fast-check":"^4.9.0","vue-router":"^5.2.0","drizzle-kit":"^0.31.10","@nuxt/eslint":"^1.9.0","vitest-openapi":"^1.0.3","@vue/test-utils":"^2.4.11","playwright-core":"^1.62.1","@nuxt/test-utils":"^4.1.0","@fast-check/vitest":"^0.4.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"4.1.10","eslint-plugin-jsdoc":"^64.2.1","eslint-plugin-tsdoc":"^0.5.2","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^10.0.0","@microsoft/api-extractor":"^7.58.13","eslint-plugin-boundaries":"^7.2.0","@stryker-mutator/vitest-runner":"^10.0.0","eslint-plugin-vuejs-accessibility":"^2.4.1"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_4.0.1_1787767565620_0.5596236644084429","host":"s3://npm-registry-packages-npm-production"}},"4.0.2":{"name":"@michaelthielemann/kestrel","version":"4.0.2","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":"Michael Thielemann <283621694+MichaelThielemann@users.noreply.github.com>","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@4.0.2","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./scripts/kestrel.mjs"},"dist":{"shasum":"b6c8b488e6ba3895ad9f1c6107449dce6a94bfb8","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-4.0.2.tgz","fileCount":294,"integrity":"sha512-x5gObGB7xzpFNqn3CJnfulg3+1lqE0GXnmT4BoLjtnSp0nl3yO7aWPpYCgrPaCg6iqlbvTUoC9NCsmMiboT1rA==","signatures":[{"sig":"MEQCIATp455t7ADt82rTMpHHCoI4/plUv+xr/KG8GhDr8SnKAiA5PifTKt48XJwTJKVEjcnw6MVaR11P2oU8gUE5qSh64g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@4.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1020453},"main":"./nuxt.config.ts","type":"module","//lint":"The root eslint.config.mjs imports the generated playground/.nuxt/eslint.config.mjs (Nuxt-aware: auto-import globals for every layer + extension) — `nuxt prepare` must run first or that import 404s on a fresh checkout. Cheap on a warm .nuxt cache, so it's chained rather than a separate step.","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"scripts":{"dev":"nuxt dev","lint":"nuxt prepare playground && eslint .","test":"vitest run","build":"nuxt build","preview":"nuxt preview","docs:api":"nuxt prepare playground && typedoc","generate":"nuxt generate","pkg:lint":"publint . && pnpm -F @michaelthielemann/kestrel-contracts build && publint packages/kestrel-contracts && attw --pack packages/kestrel-contracts --profile esm-only && pnpm -F @michaelthielemann/kestrel-core build && publint packages/kestrel-core && attw --pack packages/kestrel-core --profile esm-only && pnpm -F @michaelthielemann/kestrel-fields build && publint packages/kestrel-fields && attw --pack packages/kestrel-fields --profile esm-only && pnpm -F @michaelthielemann/kestrel-auth build && publint packages/kestrel-auth && attw --pack packages/kestrel-auth --profile esm-only && pnpm -F @michaelthielemann/kestrel-access build && publint packages/kestrel-access && attw --pack packages/kestrel-access --profile esm-only && pnpm -F @michaelthielemann/kestrel-media build && publint packages/kestrel-media && attw --pack packages/kestrel-media --profile esm-only && pnpm -F @michaelthielemann/kestrel-collections build && publint packages/kestrel-collections && attw --pack packages/kestrel-collections --profile esm-only && pnpm -F @michaelthielemann/kestrel-publishing build && publint packages/kestrel-publishing && attw --pack packages/kestrel-publishing --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-live build && publint packages/kestrel-delivery-live && attw --pack packages/kestrel-delivery-live --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-static build && publint packages/kestrel-delivery-static && attw --pack packages/kestrel-delivery-static --profile esm-only","test:e2e":"vitest run --config vitest.e2e.config.ts","api:check":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run -c packages/kestrel-core/api-extractor.json && api-extractor run -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run -c packages/kestrel-fields/api-extractor.json && api-extractor run -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run -c packages/kestrel-delivery-static/api-extractor.json","dashboard":"npx tsx scripts/dashboard.mjs","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","api:update":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run --local -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run --local -c packages/kestrel-core/api-extractor.json && api-extractor run --local -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run --local -c packages/kestrel-fields/api-extractor.json && api-extractor run --local -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run --local -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run --local -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run --local -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run --local -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run --local -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run --local -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run --local -c packages/kestrel-delivery-static/api-extractor.json","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs","test:coverage":"node scripts/coverage-all.mjs","test:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r test","build:packages":"pnpm -F @michaelthielemann/kestrel-contracts build && pnpm -F @michaelthielemann/kestrel-core build && pnpm -F @michaelthielemann/kestrel-fields build && pnpm -F @michaelthielemann/kestrel-auth build && pnpm -F @michaelthielemann/kestrel-access build && pnpm -F @michaelthielemann/kestrel-media build && pnpm -F @michaelthielemann/kestrel-collections build && pnpm -F @michaelthielemann/kestrel-publishing build && pnpm -F @michaelthielemann/kestrel-delivery-live build && pnpm -F @michaelthielemann/kestrel-delivery-static build","typecheck:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r typecheck","ci:consumer-template":"node scripts/consumer-template-ci.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.5.2","sass":"^1.102.0","exifr":"^7.1.3","jsdom":"^29.1.1","sharp":"^0.35.3","effect":"~3.22.1","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.13","file-type":"^22.0.1","nitropack":"^2.13.4","thumbhash":"^0.1.1","@tiptap/pm":"^3.29.2","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@types/jsdom":"^28.0.3","@babel/parser":"^7.29.8","@tiptap/vue-3":"^3.29.2","sanitize-html":"^2.17.6","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.29.2","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13","@internationalized/date":"^3.12.3","@tiptap/extension-highlight":"^3.29.2","@tiptap/extension-subscript":"^3.29.2","@tiptap/extension-text-align":"^3.29.2","@tiptap/extension-superscript":"^3.29.2","@michaelthielemann/kestrel-auth":"0.1.0","@michaelthielemann/kestrel-core":"0.1.0","@michaelthielemann/kestrel-media":"0.1.0","@michaelthielemann/kestrel-access":"0.1.0","@michaelthielemann/kestrel-fields":"0.1.0","@michaelthielemann/kestrel-contracts":"0.1.0","@michaelthielemann/kestrel-publishing":"0.1.0","@michaelthielemann/kestrel-collections":"0.1.0","@michaelthielemann/kestrel-delivery-live":"0.1.0","@michaelthielemann/kestrel-delivery-static":"0.1.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"h3":"^1.15.11","vue":"3.5.35","eslint":"^9.39.1","vitest":"^4.1.10","publint":"^0.3.24","typedoc":"^0.28.20","vue-tsc":"^3.3.9","@nuxt/kit":"^4.5.2","happy-dom":"^20.11.2","fast-check":"^4.9.0","vue-router":"^5.2.0","drizzle-kit":"^0.31.10","@nuxt/eslint":"^1.9.0","vitest-openapi":"^1.0.3","@vue/test-utils":"^2.4.11","playwright-core":"^1.62.1","@nuxt/test-utils":"^4.1.0","@fast-check/vitest":"^0.4.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"4.1.10","eslint-plugin-jsdoc":"^64.2.1","eslint-plugin-tsdoc":"^0.5.2","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^10.0.0","@microsoft/api-extractor":"^7.58.13","eslint-plugin-boundaries":"^7.2.0","@stryker-mutator/vitest-runner":"^10.0.0","eslint-plugin-vuejs-accessibility":"^2.4.1"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_4.0.2_1787813140209_0.46778254070130965","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"@michaelthielemann/kestrel","version":"4.1.0","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":"Michael Thielemann <283621694+MichaelThielemann@users.noreply.github.com>","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@4.1.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./scripts/kestrel.mjs"},"dist":{"shasum":"5f91c8daa547808c389706be311b017f4cf8bcec","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-4.1.0.tgz","fileCount":295,"integrity":"sha512-XfHvs6uiJbkXJ+Se9Jy1Z42f3CyGn3X0jQ97tf80QX7P9aF+t3I2zJyUD47Fq8qvZHkMnwMHTV6oUexgI11KFA==","signatures":[{"sig":"MEYCIQDvFM6U1EvVOxNQRDrhrg4QP2bgYEF6K/3DsBdSQiG+vgIhAMZhWvJOOssdcutvhg1Wl8brUkHtCLe7+Vu7Fepm1A+9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@4.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1022321},"main":"./nuxt.config.ts","type":"module","//lint":"The root eslint.config.mjs imports the generated playground/.nuxt/eslint.config.mjs (Nuxt-aware: auto-import globals for every layer + extension) — `nuxt prepare` must run first or that import 404s on a fresh checkout. Cheap on a warm .nuxt cache, so it's chained rather than a separate step.","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"scripts":{"dev":"nuxt dev","lint":"nuxt prepare playground && eslint .","test":"vitest run","build":"nuxt build","preview":"nuxt preview","docs:api":"nuxt prepare playground && typedoc","generate":"nuxt generate","pkg:lint":"publint . && pnpm -F @michaelthielemann/kestrel-contracts build && publint packages/kestrel-contracts && attw --pack packages/kestrel-contracts --profile esm-only && pnpm -F @michaelthielemann/kestrel-core build && publint packages/kestrel-core && attw --pack packages/kestrel-core --profile esm-only && pnpm -F @michaelthielemann/kestrel-fields build && publint packages/kestrel-fields && attw --pack packages/kestrel-fields --profile esm-only && pnpm -F @michaelthielemann/kestrel-auth build && publint packages/kestrel-auth && attw --pack packages/kestrel-auth --profile esm-only && pnpm -F @michaelthielemann/kestrel-access build && publint packages/kestrel-access && attw --pack packages/kestrel-access --profile esm-only && pnpm -F @michaelthielemann/kestrel-media build && publint packages/kestrel-media && attw --pack packages/kestrel-media --profile esm-only && pnpm -F @michaelthielemann/kestrel-collections build && publint packages/kestrel-collections && attw --pack packages/kestrel-collections --profile esm-only && pnpm -F @michaelthielemann/kestrel-publishing build && publint packages/kestrel-publishing && attw --pack packages/kestrel-publishing --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-live build && publint packages/kestrel-delivery-live && attw --pack packages/kestrel-delivery-live --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-static build && publint packages/kestrel-delivery-static && attw --pack packages/kestrel-delivery-static --profile esm-only","test:e2e":"vitest run --config vitest.e2e.config.ts","api:check":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run -c packages/kestrel-core/api-extractor.json && api-extractor run -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run -c packages/kestrel-fields/api-extractor.json && api-extractor run -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run -c packages/kestrel-delivery-static/api-extractor.json","dashboard":"npx tsx scripts/dashboard.mjs","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","api:update":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run --local -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run --local -c packages/kestrel-core/api-extractor.json && api-extractor run --local -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run --local -c packages/kestrel-fields/api-extractor.json && api-extractor run --local -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run --local -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run --local -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run --local -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run --local -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run --local -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run --local -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run --local -c packages/kestrel-delivery-static/api-extractor.json","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs","test:coverage":"node scripts/coverage-all.mjs","test:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r test","build:packages":"pnpm -F @michaelthielemann/kestrel-contracts build && pnpm -F @michaelthielemann/kestrel-core build && pnpm -F @michaelthielemann/kestrel-fields build && pnpm -F @michaelthielemann/kestrel-auth build && pnpm -F @michaelthielemann/kestrel-access build && pnpm -F @michaelthielemann/kestrel-media build && pnpm -F @michaelthielemann/kestrel-collections build && pnpm -F @michaelthielemann/kestrel-publishing build && pnpm -F @michaelthielemann/kestrel-delivery-live build && pnpm -F @michaelthielemann/kestrel-delivery-static build","typecheck:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r typecheck","ci:consumer-template":"node scripts/consumer-template-ci.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.5.2","sass":"^1.102.0","exifr":"^7.1.3","jsdom":"^29.1.1","sharp":"^0.35.3","effect":"~3.22.1","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.13","file-type":"^22.0.1","nitropack":"^2.13.4","thumbhash":"^0.1.1","@tiptap/pm":"^3.29.2","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@types/jsdom":"^28.0.3","@babel/parser":"^7.29.8","@tiptap/vue-3":"^3.29.2","sanitize-html":"^2.17.6","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.29.2","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13","@internationalized/date":"^3.12.3","@tiptap/extension-highlight":"^3.29.2","@tiptap/extension-subscript":"^3.29.2","@tiptap/extension-text-align":"^3.29.2","@tiptap/extension-superscript":"^3.29.2","@michaelthielemann/kestrel-auth":"0.1.0","@michaelthielemann/kestrel-core":"0.1.0","@michaelthielemann/kestrel-media":"0.1.0","@michaelthielemann/kestrel-access":"0.1.0","@michaelthielemann/kestrel-fields":"0.1.0","@michaelthielemann/kestrel-contracts":"0.1.0","@michaelthielemann/kestrel-publishing":"0.1.0","@michaelthielemann/kestrel-collections":"0.1.0","@michaelthielemann/kestrel-delivery-live":"0.1.0","@michaelthielemann/kestrel-delivery-static":"0.1.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"h3":"^1.15.11","vue":"3.5.35","eslint":"^9.39.1","vitest":"^4.1.10","publint":"^0.3.24","typedoc":"^0.28.20","vue-tsc":"^3.3.9","@nuxt/kit":"^4.5.2","happy-dom":"^20.11.2","fast-check":"^4.9.0","vue-router":"^5.2.0","drizzle-kit":"^0.31.10","@nuxt/eslint":"^1.9.0","vitest-openapi":"^1.0.3","@vue/test-utils":"^2.4.11","playwright-core":"^1.62.1","@nuxt/test-utils":"^4.1.0","@fast-check/vitest":"^0.4.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"4.1.10","eslint-plugin-jsdoc":"^64.2.1","eslint-plugin-tsdoc":"^0.5.2","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^10.0.0","@microsoft/api-extractor":"^7.58.13","eslint-plugin-boundaries":"^7.2.0","@stryker-mutator/vitest-runner":"^10.0.0","eslint-plugin-vuejs-accessibility":"^2.4.1"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_4.1.0_1787823564181_0.12083395122477536","host":"s3://npm-registry-packages-npm-production"}},"4.1.1":{"name":"@michaelthielemann/kestrel","version":"4.1.1","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":"Michael Thielemann <283621694+MichaelThielemann@users.noreply.github.com>","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@4.1.1","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./scripts/kestrel.mjs"},"dist":{"shasum":"b6e0b4aae036c752309083167fd88477a08cb4fa","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-4.1.1.tgz","fileCount":295,"integrity":"sha512-qeEDVT1exqgrCnqzn5eEVX+IEiy9ncLt1T5QJ3MN8N04bjTX6k61mye1nlMAvQ8EO7qOAshLe4+QJR5lrccIZQ==","signatures":[{"sig":"MEUCIQD63tzSDVl9JhELDhZJKmMCvwOgOLad6F/4utZ638/rqgIgZaWNcoCdPsxtRADORzd8UG2cWWLc6ZTVPINS0w8Slho=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@4.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1022321},"main":"./nuxt.config.ts","type":"module","//lint":"The root eslint.config.mjs imports the generated playground/.nuxt/eslint.config.mjs (Nuxt-aware: auto-import globals for every layer + extension) — `nuxt prepare` must run first or that import 404s on a fresh checkout. Cheap on a warm .nuxt cache, so it's chained rather than a separate step.","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"scripts":{"dev":"nuxt dev","lint":"nuxt prepare playground && eslint .","test":"vitest run","build":"nuxt build","preview":"nuxt preview","docs:api":"nuxt prepare playground && typedoc","generate":"nuxt generate","pkg:lint":"publint . && pnpm -F @michaelthielemann/kestrel-contracts build && publint packages/kestrel-contracts && attw --pack packages/kestrel-contracts --profile esm-only && pnpm -F @michaelthielemann/kestrel-core build && publint packages/kestrel-core && attw --pack packages/kestrel-core --profile esm-only && pnpm -F @michaelthielemann/kestrel-fields build && publint packages/kestrel-fields && attw --pack packages/kestrel-fields --profile esm-only && pnpm -F @michaelthielemann/kestrel-auth build && publint packages/kestrel-auth && attw --pack packages/kestrel-auth --profile esm-only && pnpm -F @michaelthielemann/kestrel-access build && publint packages/kestrel-access && attw --pack packages/kestrel-access --profile esm-only && pnpm -F @michaelthielemann/kestrel-media build && publint packages/kestrel-media && attw --pack packages/kestrel-media --profile esm-only && pnpm -F @michaelthielemann/kestrel-collections build && publint packages/kestrel-collections && attw --pack packages/kestrel-collections --profile esm-only && pnpm -F @michaelthielemann/kestrel-publishing build && publint packages/kestrel-publishing && attw --pack packages/kestrel-publishing --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-live build && publint packages/kestrel-delivery-live && attw --pack packages/kestrel-delivery-live --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-static build && publint packages/kestrel-delivery-static && attw --pack packages/kestrel-delivery-static --profile esm-only","test:e2e":"vitest run --config vitest.e2e.config.ts","api:check":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run -c packages/kestrel-core/api-extractor.json && api-extractor run -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run -c packages/kestrel-fields/api-extractor.json && api-extractor run -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run -c packages/kestrel-delivery-static/api-extractor.json","dashboard":"npx tsx scripts/dashboard.mjs","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","api:update":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run --local -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run --local -c packages/kestrel-core/api-extractor.json && api-extractor run --local -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run --local -c packages/kestrel-fields/api-extractor.json && api-extractor run --local -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run --local -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run --local -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run --local -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run --local -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run --local -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run --local -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run --local -c packages/kestrel-delivery-static/api-extractor.json","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs","test:coverage":"node scripts/coverage-all.mjs","test:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r test","build:packages":"pnpm -F @michaelthielemann/kestrel-contracts build && pnpm -F @michaelthielemann/kestrel-core build && pnpm -F @michaelthielemann/kestrel-fields build && pnpm -F @michaelthielemann/kestrel-auth build && pnpm -F @michaelthielemann/kestrel-access build && pnpm -F @michaelthielemann/kestrel-media build && pnpm -F @michaelthielemann/kestrel-collections build && pnpm -F @michaelthielemann/kestrel-publishing build && pnpm -F @michaelthielemann/kestrel-delivery-live build && pnpm -F @michaelthielemann/kestrel-delivery-static build","typecheck:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r typecheck","ci:consumer-template":"node scripts/consumer-template-ci.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.5.2","sass":"^1.102.0","exifr":"^7.1.3","jsdom":"^29.1.1","sharp":"^0.35.3","effect":"~3.22.1","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.13","file-type":"^22.0.1","nitropack":"^2.13.4","thumbhash":"^0.1.1","@tiptap/pm":"^3.29.2","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@types/jsdom":"^28.0.3","@babel/parser":"^7.29.8","@tiptap/vue-3":"^3.29.2","sanitize-html":"^2.17.6","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.29.2","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13","@internationalized/date":"^3.12.3","@tiptap/extension-highlight":"^3.29.2","@tiptap/extension-subscript":"^3.29.2","@tiptap/extension-text-align":"^3.29.2","@tiptap/extension-superscript":"^3.29.2","@michaelthielemann/kestrel-auth":"0.1.0","@michaelthielemann/kestrel-core":"0.1.0","@michaelthielemann/kestrel-media":"0.1.0","@michaelthielemann/kestrel-access":"0.1.0","@michaelthielemann/kestrel-fields":"0.1.0","@michaelthielemann/kestrel-contracts":"0.1.0","@michaelthielemann/kestrel-publishing":"0.1.0","@michaelthielemann/kestrel-collections":"0.1.0","@michaelthielemann/kestrel-delivery-live":"0.1.0","@michaelthielemann/kestrel-delivery-static":"0.1.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"h3":"^1.15.11","vue":"3.5.35","eslint":"^9.39.1","vitest":"^4.1.10","publint":"^0.3.24","typedoc":"^0.28.20","vue-tsc":"^3.3.9","@nuxt/kit":"^4.5.2","happy-dom":"^20.11.2","fast-check":"^4.9.0","vue-router":"^5.2.0","drizzle-kit":"^0.31.10","@nuxt/eslint":"^1.9.0","vitest-openapi":"^1.0.3","@vue/test-utils":"^2.4.11","playwright-core":"^1.62.1","@nuxt/test-utils":"^4.1.0","@fast-check/vitest":"^0.4.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"4.1.10","eslint-plugin-jsdoc":"^64.2.1","eslint-plugin-tsdoc":"^0.5.2","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^10.0.0","@microsoft/api-extractor":"^7.58.13","eslint-plugin-boundaries":"^7.2.0","@stryker-mutator/vitest-runner":"^10.0.0","eslint-plugin-vuejs-accessibility":"^2.4.1"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_4.1.1_1787830355511_0.7659229900268016","host":"s3://npm-registry-packages-npm-production"}},"4.1.2":{"name":"@michaelthielemann/kestrel","version":"4.1.2","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":"Michael Thielemann <283621694+MichaelThielemann@users.noreply.github.com>","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@4.1.2","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./scripts/kestrel.mjs"},"dist":{"shasum":"0ba77e9096fee909becdd3d935fd8d3bd2280c5c","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-4.1.2.tgz","fileCount":295,"integrity":"sha512-IAi01h/XflRWUVZtpay4OWpvnRJZSlQOSjSlb0PjAt6qqqgZK7rwD99B03SnzfUZRYZAF7xNCRnqSABhUBDmJg==","signatures":[{"sig":"MEYCIQDja3AbRC06KR9rvNuggD4svQVS4XK6iN0Nb89e6dxFJQIhAMV3xgLi4NhGk/D6BxzN/z758kpWJphYdPglqESG0+zM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@4.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1024098},"main":"./nuxt.config.ts","type":"module","//lint":"The root eslint.config.mjs imports the generated playground/.nuxt/eslint.config.mjs (Nuxt-aware: auto-import globals for every layer + extension) — `nuxt prepare` must run first or that import 404s on a fresh checkout. Cheap on a warm .nuxt cache, so it's chained rather than a separate step.","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"scripts":{"dev":"nuxt dev","lint":"nuxt prepare playground && eslint .","test":"vitest run","build":"nuxt build","preview":"nuxt preview","docs:api":"nuxt prepare playground && typedoc","generate":"nuxt generate","pkg:lint":"publint . && pnpm -F @michaelthielemann/kestrel-contracts build && publint packages/kestrel-contracts && attw --pack packages/kestrel-contracts --profile esm-only && pnpm -F @michaelthielemann/kestrel-core build && publint packages/kestrel-core && attw --pack packages/kestrel-core --profile esm-only && pnpm -F @michaelthielemann/kestrel-fields build && publint packages/kestrel-fields && attw --pack packages/kestrel-fields --profile esm-only && pnpm -F @michaelthielemann/kestrel-auth build && publint packages/kestrel-auth && attw --pack packages/kestrel-auth --profile esm-only && pnpm -F @michaelthielemann/kestrel-access build && publint packages/kestrel-access && attw --pack packages/kestrel-access --profile esm-only && pnpm -F @michaelthielemann/kestrel-media build && publint packages/kestrel-media && attw --pack packages/kestrel-media --profile esm-only && pnpm -F @michaelthielemann/kestrel-collections build && publint packages/kestrel-collections && attw --pack packages/kestrel-collections --profile esm-only && pnpm -F @michaelthielemann/kestrel-publishing build && publint packages/kestrel-publishing && attw --pack packages/kestrel-publishing --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-live build && publint packages/kestrel-delivery-live && attw --pack packages/kestrel-delivery-live --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-static build && publint packages/kestrel-delivery-static && attw --pack packages/kestrel-delivery-static --profile esm-only","test:e2e":"vitest run --config vitest.e2e.config.ts","api:check":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run -c packages/kestrel-core/api-extractor.json && api-extractor run -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run -c packages/kestrel-fields/api-extractor.json && api-extractor run -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run -c packages/kestrel-delivery-static/api-extractor.json","dashboard":"npx tsx scripts/dashboard.mjs","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","api:update":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run --local -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run --local -c packages/kestrel-core/api-extractor.json && api-extractor run --local -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run --local -c packages/kestrel-fields/api-extractor.json && api-extractor run --local -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run --local -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run --local -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run --local -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run --local -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run --local -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run --local -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run --local -c packages/kestrel-delivery-static/api-extractor.json","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs","test:coverage":"node scripts/coverage-all.mjs","test:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r test","build:packages":"pnpm -F @michaelthielemann/kestrel-contracts build && pnpm -F @michaelthielemann/kestrel-core build && pnpm -F @michaelthielemann/kestrel-fields build && pnpm -F @michaelthielemann/kestrel-auth build && pnpm -F @michaelthielemann/kestrel-access build && pnpm -F @michaelthielemann/kestrel-media build && pnpm -F @michaelthielemann/kestrel-collections build && pnpm -F @michaelthielemann/kestrel-publishing build && pnpm -F @michaelthielemann/kestrel-delivery-live build && pnpm -F @michaelthielemann/kestrel-delivery-static build","typecheck:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r typecheck","ci:consumer-template":"node scripts/consumer-template-ci.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.5.2","sass":"^1.102.0","exifr":"^7.1.3","jsdom":"^29.1.1","sharp":"^0.35.3","effect":"~3.22.1","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.13","file-type":"^22.0.1","nitropack":"^2.13.4","thumbhash":"^0.1.1","@tiptap/pm":"^3.29.2","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@types/jsdom":"^28.0.3","@babel/parser":"^7.29.8","@tiptap/vue-3":"^3.29.2","sanitize-html":"^2.17.6","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.29.2","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13","@internationalized/date":"^3.12.3","@tiptap/extension-highlight":"^3.29.2","@tiptap/extension-subscript":"^3.29.2","@tiptap/extension-text-align":"^3.29.2","@tiptap/extension-superscript":"^3.29.2","@michaelthielemann/kestrel-auth":"0.1.0","@michaelthielemann/kestrel-core":"0.1.0","@michaelthielemann/kestrel-media":"0.1.0","@michaelthielemann/kestrel-access":"0.1.0","@michaelthielemann/kestrel-fields":"0.1.0","@michaelthielemann/kestrel-contracts":"0.1.0","@michaelthielemann/kestrel-publishing":"0.1.0","@michaelthielemann/kestrel-collections":"0.1.0","@michaelthielemann/kestrel-delivery-live":"0.1.0","@michaelthielemann/kestrel-delivery-static":"0.1.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"h3":"^1.15.11","vue":"3.5.35","eslint":"^9.39.1","vitest":"^4.1.10","publint":"^0.3.24","typedoc":"^0.28.20","vue-tsc":"^3.3.9","@nuxt/kit":"^4.5.2","happy-dom":"^20.11.2","fast-check":"^4.9.0","vue-router":"^5.2.0","drizzle-kit":"^0.31.10","@nuxt/eslint":"^1.9.0","vitest-openapi":"^1.0.3","@vue/test-utils":"^2.4.11","playwright-core":"^1.62.1","@nuxt/test-utils":"^4.1.0","@fast-check/vitest":"^0.4.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"4.1.10","eslint-plugin-jsdoc":"^64.2.1","eslint-plugin-tsdoc":"^0.5.2","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^10.0.0","@microsoft/api-extractor":"^7.58.13","eslint-plugin-boundaries":"^7.2.0","@stryker-mutator/vitest-runner":"^10.0.0","eslint-plugin-vuejs-accessibility":"^2.4.1"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_4.1.2_1787834071335_0.639229276915622","host":"s3://npm-registry-packages-npm-production"}},"4.1.3":{"name":"@michaelthielemann/kestrel","version":"4.1.3","keywords":["cms","nuxt","nuxt-layer","static-site-generator","drizzle","sqlite","headless-cms"],"author":"Michael Thielemann <283621694+MichaelThielemann@users.noreply.github.com>","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@4.1.3","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./scripts/kestrel.mjs"},"dist":{"shasum":"e88deb98181750ad30993fec3ed3403588167a8b","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-4.1.3.tgz","fileCount":295,"integrity":"sha512-JvfMjvJHITDKDH4Zp3FVoX1MkPGo/okIzZIQGBRCDV2PjXNbT3wlmjlZf6xndGYWK2x0EyDcBecT/DqsyAc13Q==","signatures":[{"sig":"MEQCICoyFmpc50WTOC7ziwD8Z2OG41DL1Zf6DIXkCCZbfQMpAiBgx5wG7Fjp/L/oxyz85vq55j6IhXPoxN27O3sg077K3w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@4.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1024062},"main":"./nuxt.config.ts","type":"module","//lint":"The root eslint.config.mjs imports the generated playground/.nuxt/eslint.config.mjs (Nuxt-aware: auto-import globals for every layer + extension) — `nuxt prepare` must run first or that import 404s on a fresh checkout. Cheap on a warm .nuxt cache, so it's chained rather than a separate step.","//peers":"Framework singletons the layer sources import by bare specifier. Peers, not dependencies: a second copy breaks identity (two Vue instances; an h3 v1 `createError` handed to an h3 v2 error handler, which surfaces our 400/404/409 as bare 500s). All optional, because kestrel's own `nuxt` dependency already supplies them transitively — the entry pins identity where a copy exists rather than demanding one, and a required peer would ERESOLVE-fail npm installs on any Nuxt whose bundled range we did not anticipate. Each is also a devDependency so this repo resolves it without auto-install-peers writing a phantom root dependency into the lockfile.","engines":{"node":">=22.12.0"},"scripts":{"dev":"nuxt dev","lint":"nuxt prepare playground && eslint .","test":"vitest run","build":"nuxt build","preview":"nuxt preview","docs:api":"nuxt prepare playground && typedoc","generate":"nuxt generate","pkg:lint":"publint . && pnpm -F @michaelthielemann/kestrel-contracts build && publint packages/kestrel-contracts && attw --pack packages/kestrel-contracts --profile esm-only && pnpm -F @michaelthielemann/kestrel-core build && publint packages/kestrel-core && attw --pack packages/kestrel-core --profile esm-only && pnpm -F @michaelthielemann/kestrel-fields build && publint packages/kestrel-fields && attw --pack packages/kestrel-fields --profile esm-only && pnpm -F @michaelthielemann/kestrel-auth build && publint packages/kestrel-auth && attw --pack packages/kestrel-auth --profile esm-only && pnpm -F @michaelthielemann/kestrel-access build && publint packages/kestrel-access && attw --pack packages/kestrel-access --profile esm-only && pnpm -F @michaelthielemann/kestrel-media build && publint packages/kestrel-media && attw --pack packages/kestrel-media --profile esm-only && pnpm -F @michaelthielemann/kestrel-collections build && publint packages/kestrel-collections && attw --pack packages/kestrel-collections --profile esm-only && pnpm -F @michaelthielemann/kestrel-publishing build && publint packages/kestrel-publishing && attw --pack packages/kestrel-publishing --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-live build && publint packages/kestrel-delivery-live && attw --pack packages/kestrel-delivery-live --profile esm-only && pnpm -F @michaelthielemann/kestrel-delivery-static build && publint packages/kestrel-delivery-static && attw --pack packages/kestrel-delivery-static --profile esm-only","test:e2e":"vitest run --config vitest.e2e.config.ts","api:check":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run -c packages/kestrel-core/api-extractor.json && api-extractor run -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run -c packages/kestrel-fields/api-extractor.json && api-extractor run -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run -c packages/kestrel-delivery-static/api-extractor.json","dashboard":"npx tsx scripts/dashboard.mjs","test:nuxt":"vitest run --config vitest.nuxt.config.ts","typecheck":"node scripts/typecheck.mjs","api:update":"pnpm -F @michaelthielemann/kestrel-contracts build && api-extractor run --local -c packages/kestrel-contracts/api-extractor.json && pnpm -F @michaelthielemann/kestrel-core build && api-extractor run --local -c packages/kestrel-core/api-extractor.json && api-extractor run --local -c packages/kestrel-core/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-fields build && api-extractor run --local -c packages/kestrel-fields/api-extractor.json && api-extractor run --local -c packages/kestrel-fields/api-extractor.client.json && pnpm -F @michaelthielemann/kestrel-auth build && api-extractor run --local -c packages/kestrel-auth/api-extractor.json && pnpm -F @michaelthielemann/kestrel-access build && api-extractor run --local -c packages/kestrel-access/api-extractor.json && pnpm -F @michaelthielemann/kestrel-media build && api-extractor run --local -c packages/kestrel-media/api-extractor.json && pnpm -F @michaelthielemann/kestrel-collections build && api-extractor run --local -c packages/kestrel-collections/api-extractor.json && pnpm -F @michaelthielemann/kestrel-publishing build && api-extractor run --local -c packages/kestrel-publishing/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-live build && api-extractor run --local -c packages/kestrel-delivery-live/api-extractor.json && pnpm -F @michaelthielemann/kestrel-delivery-static build && api-extractor run --local -c packages/kestrel-delivery-static/api-extractor.json","db:migrate":"drizzle-kit migrate","test:watch":"vitest","db:generate":"drizzle-kit generate","hash-password":"node scripts/hash-password.mjs","test:coverage":"node scripts/coverage-all.mjs","test:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r test","build:packages":"pnpm -F @michaelthielemann/kestrel-contracts build && pnpm -F @michaelthielemann/kestrel-core build && pnpm -F @michaelthielemann/kestrel-fields build && pnpm -F @michaelthielemann/kestrel-auth build && pnpm -F @michaelthielemann/kestrel-access build && pnpm -F @michaelthielemann/kestrel-media build && pnpm -F @michaelthielemann/kestrel-collections build && pnpm -F @michaelthielemann/kestrel-publishing build && pnpm -F @michaelthielemann/kestrel-delivery-live build && pnpm -F @michaelthielemann/kestrel-delivery-static build","typecheck:packages":"pnpm --filter \"@michaelthielemann/kestrel-*\" -r typecheck","ci:consumer-template":"node scripts/consumer-template-ci.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"//publish":"Consumed as a meta-layer: `extends: ['@michaelthielemann/kestrel']`. `main` points at the layer's nuxt.config so the BARE specifier resolves — without it c12 can't resolve the package, silently drops the whole layer (\"Cannot extend config from …\"), and every auto-import/component vanishes. Use `main`, NOT `exports` (exports would gate subpaths like `@michaelthielemann/kestrel/scripts/hash-password.mjs` + the deep config-type import); `bin` resolves by path from the package root, so it coexists with `main` untouched. `files` ships the entry + sub-layers + operator scripts + the `kestrel init` templates; the `!**/*.test.ts` globs strip tests — they are GLOBAL, so nothing under `templates/` may be named `*.test.ts` or it vanishes from the tarball. Template dotfiles are `_`-prefixed for the same class of reason: npm strips a literal `.gitignore` from a tarball and then applies it, taking its listed siblings with it. Releases run from the tag workflow via npm trusted publishing (OIDC), so no npm token exists anywhere.","deprecated":"Not maintained. Use the current 5.x release.","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git"},"description":"A slim, collection-driven Nuxt 4 CMS meta-layer with a runtime schema engine. Add `extends: ['@michaelthielemann/kestrel']`, define collections, and the database migrates itself.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","nuxt":"^4.5.2","sass":"^1.102.0","exifr":"^7.1.3","jsdom":"^29.1.1","sharp":"^0.35.3","effect":"~3.22.1","nanoid":"^5.1.16","reka-ui":"^2.10.1","aws4fetch":"^1.0.20","dompurify":"^3.4.13","file-type":"^22.0.1","nitropack":"^2.13.4","thumbhash":"^0.1.1","@tiptap/pm":"^3.29.2","typescript":"^6.0.3","drizzle-orm":"^0.45.2","drizzle-zod":"^0.8.3","@types/jsdom":"^28.0.3","@babel/parser":"^7.29.8","@tiptap/vue-3":"^3.29.2","sanitize-html":"^2.17.6","better-sqlite3":"^12.11.1","@tiptap/starter-kit":"^3.29.2","@types/sanitize-html":"^2.16.1","@types/better-sqlite3":"^7.6.13","@internationalized/date":"^3.12.3","@tiptap/extension-highlight":"^3.29.2","@tiptap/extension-subscript":"^3.29.2","@tiptap/extension-text-align":"^3.29.2","@tiptap/extension-superscript":"^3.29.2","@michaelthielemann/kestrel-auth":"0.1.0","@michaelthielemann/kestrel-core":"0.1.0","@michaelthielemann/kestrel-media":"0.1.0","@michaelthielemann/kestrel-access":"0.1.0","@michaelthielemann/kestrel-fields":"0.1.0","@michaelthielemann/kestrel-contracts":"0.1.0","@michaelthielemann/kestrel-publishing":"0.1.0","@michaelthielemann/kestrel-collections":"0.1.0","@michaelthielemann/kestrel-delivery-live":"0.1.0","@michaelthielemann/kestrel-delivery-static":"0.1.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"h3":"^1.15.11","vue":"3.5.35","eslint":"^9.39.1","vitest":"^4.1.10","publint":"^0.3.24","typedoc":"^0.28.20","vue-tsc":"^3.3.9","@nuxt/kit":"^4.5.2","happy-dom":"^20.11.2","fast-check":"^4.9.0","vue-router":"^5.2.0","drizzle-kit":"^0.31.10","@nuxt/eslint":"^1.9.0","vitest-openapi":"^1.0.3","@vue/test-utils":"^2.4.11","playwright-core":"^1.62.1","@nuxt/test-utils":"^4.1.0","@fast-check/vitest":"^0.4.1","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"4.1.10","eslint-plugin-jsdoc":"^64.2.1","eslint-plugin-tsdoc":"^0.5.2","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^10.0.0","@microsoft/api-extractor":"^7.58.13","eslint-plugin-boundaries":"^7.2.0","@stryker-mutator/vitest-runner":"^10.0.0","eslint-plugin-vuejs-accessibility":"^2.4.1"},"peerDependencies":{"h3":"^1.15.0 || ^2.0.0","vue":"^3.5.0","@nuxt/kit":"^4.4.0","vue-router":"^4.5.0 || ^5.0.0"},"peerDependenciesMeta":{"h3":{"optional":true},"vue":{"optional":true},"@nuxt/kit":{"optional":true},"vue-router":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/kestrel_4.1.3_1787835605427_0.017497231689519888","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"@michaelthielemann/kestrel","version":"5.0.0","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@5.0.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./dist/cli.js"},"dist":{"shasum":"4ed57ac43b89355e9dcf8486a4abeff4bf9431a5","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-5.0.0.tgz","fileCount":49,"integrity":"sha512-PTNq3PjW2ZhI2ulPACsgSeLgRX8AF5AfwQuVaBSqWxtdLU1mNgqO7FX7cgn+jMtTDK+P1xkSWvembcYbHv9/Ug==","signatures":[{"sig":"MEUCIQCO9VF8lbIqt1TYx0/+yFyBK2X93jyCN+slaVzWQOLsmgIgPuRDKMpBxVElROfnk3uIc6bho8AnjUfciO8ysiS1DDs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDoUY4XoeQuOeQSWR0WjSMREhplCF+lJ6HExkibElYnwQIgFgjzZAuuwfKhHQHH9V9x+7HIFCRosxpM/bxW4cwHTgk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108293},"type":"module","engines":{"node":">=22.13.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./*":{"types":"./dist/*.d.ts","default":"./dist/*.js"}},"scripts":{"build":"tsc -b tsconfig.json"},"_npmUser":{"name":"michaelthielemann","email":"michael@thielemann.eu"},"repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git","directory":"packages/core"},"description":"Kestrel core: contract registry, boot check and pipeline runner. Ships no contracts and no modules.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"zod":"^3.23.8"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/kestrel_5.0.0_1788783305867_0.46934900928701984","host":"s3://npm-registry-packages-npm-production"}},"5.0.2":{"name":"@michaelthielemann/kestrel","version":"5.0.2","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@5.0.2","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./dist/cli.js"},"dist":{"shasum":"b734184706a4575e637e72dbbf49b3bb5d8ce752","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-5.0.2.tgz","fileCount":51,"integrity":"sha512-SdhhN16r5ZfKhiteKMWklq62FznOsbF6XkNwaYpLuL8iQiAZh8gvXTU3+eja0a75ypRgkpuYTAF8hNDZtP2Nkw==","signatures":[{"sig":"MEYCIQCRX9VHrNGTlYiFwO+jXSsYyhmQNCtMXMSUcrXKlnWe+AIhALfFlMf3ss1+Jhve6aeDX0VecNoBiUfTCUBGccq1ft5e","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIG0kEEb0alNeFhUTBWriM6QfLHwIZc/OwIX7aypMT8ZZAiEAy1O6BqwDmfHQxc8X8q1+3sqWuY9iQXdVx8vvJX6/aac=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111803},"type":"module","engines":{"node":">=22.13.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./*":{"types":"./dist/*.d.ts","default":"./dist/*.js"}},"scripts":{"build":"tsc -b tsconfig.json"},"_npmUser":{"name":"michaelthielemann","email":"michael@thielemann.eu"},"repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git","directory":"packages/core"},"description":"Kestrel core: contract registry, boot check and pipeline runner. Ships no contracts and no modules.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"zod":"^3.23.8"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/kestrel_5.0.2_1788800816177_0.30228701901879074","host":"s3://npm-registry-packages-npm-production"}},"5.0.3":{"name":"@michaelthielemann/kestrel","version":"5.0.3","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@5.0.3","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./dist/cli.js"},"dist":{"shasum":"35dde3bf1ff6e6f75ee7fe000991c0d6af65b1e5","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-5.0.3.tgz","fileCount":51,"integrity":"sha512-2do4JRXNapk3ZLkwlD98lX2tmCFX2pydOuuIaDYasmABH/YXTZ2qEnh01UZIsUZo/gQnyEr2OGNRjqzyd9IxDg==","signatures":[{"sig":"MEUCIBKiSGS0Ar+OWBy03q3mBpzDxksFNBh+oMtSefmxWDHDAiEA/wW1VrUd5/rrDaqGO4BZj3tLzXE96bDllF0HJ/hQ2LM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCewo2DalMbyT+RdiFKyzOwJCZj4ctqbyztGeqh+tOt2QIgBVm3K5mRpFkeZx5/ZqnMK7jJzjKtRFp/OGp80ZqXZNg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":113378},"type":"module","engines":{"node":">=22.13.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./*":{"types":"./dist/*.d.ts","default":"./dist/*.js"}},"scripts":{"build":"tsc -b tsconfig.json"},"_npmUser":{"name":"michaelthielemann","email":"michael@thielemann.eu"},"repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git","directory":"packages/core"},"description":"Kestrel core: contract registry, boot check and pipeline runner. Ships no contracts and no modules.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"zod":"^3.23.8"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/kestrel_5.0.3_1788815079779_0.9564491171387153","host":"s3://npm-registry-packages-npm-production"}},"5.1.0":{"name":"@michaelthielemann/kestrel","version":"5.1.0","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@5.1.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./dist/cli.js"},"dist":{"shasum":"4bad55f2aa3303d440d40a742462bbc13ff43a5d","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-5.1.0.tgz","fileCount":51,"integrity":"sha512-92rRcSyHzm79YoF+sIJbUaMBK6RAVLBAq6dtUashkGdka4Mvloa+at4F+onRelENF+XnfJ9VsZ8GhE4pQkWAWw==","signatures":[{"sig":"MEYCIQDO7JSC7FQgnEvE1NHGZLONJfWf+9yA8gFRJ4SGofpsZAIhAMbEOX9JeaSJTvGbD3uLL6PFjwOmg85c5173vjo/RJ4R","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCVkEI5oOuZOsp7Qd2p0Vaslgd5EQK15vpweJ49VRqFpwIgfB7T4zFQQ6FAFAxzp7/6c57a+IAK2TtCQqtYBiPD06g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":113378},"type":"module","engines":{"node":">=22.13.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./*":{"types":"./dist/*.d.ts","default":"./dist/*.js"}},"scripts":{"build":"tsc -b tsconfig.json"},"_npmUser":{"name":"michaelthielemann","email":"michael@thielemann.eu"},"repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git","directory":"packages/core"},"description":"Kestrel core: contract registry, boot check and pipeline runner. Ships no contracts and no modules.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"zod":"^3.23.8"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/kestrel_5.1.0_1788858224402_0.25722249418579834","host":"s3://npm-registry-packages-npm-production"}},"5.2.0":{"name":"@michaelthielemann/kestrel","version":"5.2.0","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@5.2.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./dist/cli.js"},"dist":{"shasum":"873bd56da0decb192dbdee3cc887d6b03542dd60","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-5.2.0.tgz","fileCount":51,"integrity":"sha512-XBn7LOez5vJdFJhXB9Ltl/btlnWQtF/+NiPxxPHCOs7X3quP84GFAFUr0rcbVpkSbYEBulsHp9UHK6g+y9Xtkg==","signatures":[{"sig":"MEUCIQCm3lG8wttfLqZN43egVeDuBJL/sM0qbyVee44UZTsbfQIgHBUgr6VDlSNK7jJ9OjpRppfwejWBo+QbwjDYmpAvJ2c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEMCHEodPeFzxgDNvDPdEgIpEmG2xjE63no2DnhBvUDWAiBbfbmnNRqajZpYKrn5l1kziiB67qb1hawkJJnZtc+N6g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118513},"type":"module","engines":{"node":">=22.13.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cast":{"types":"./dist/cast.d.ts","default":"./dist/cast.js"},"./load":{"types":"./dist/load.d.ts","default":"./dist/load.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./logger":{"types":"./dist/logger.d.ts","default":"./dist/logger.js"},"./result":{"types":"./dist/result.d.ts","default":"./dist/result.js"},"./runner":{"types":"./dist/runner.d.ts","default":"./dist/runner.js"},"./schema":{"types":"./dist/schema.d.ts","default":"./dist/schema.js"},"./context":{"types":"./dist/context.d.ts","default":"./dist/context.js"},"./dataflow":{"types":"./dist/dataflow.d.ts","default":"./dist/dataflow.js"},"./catalogue":{"types":"./dist/catalogue.d.ts","default":"./dist/catalogue.js"},"./defineConfig":{"types":"./dist/defineConfig.d.ts","default":"./dist/defineConfig.js"},"./defineModule":{"types":"./dist/defineModule.d.ts","default":"./dist/defineModule.js"},"./defineContract":{"types":"./dist/defineContract.d.ts","default":"./dist/defineContract.js"},"./definePipeline":{"types":"./dist/definePipeline.d.ts","default":"./dist/definePipeline.js"},"./testing/runPipeline":{"types":"./dist/testing/runPipeline.d.ts","default":"./dist/testing/runPipeline.js"}},"scripts":{"build":"tsc -b tsconfig.json"},"_npmUser":{"name":"michaelthielemann","email":"michael@thielemann.eu"},"repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git","directory":"packages/core"},"description":"Kestrel core: contract registry, boot check and pipeline runner. Ships no contracts and no modules.","directories":{},"_nodeVersion":"26.0.0","dependencies":{"zod":"^3.23.8"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/kestrel_5.2.0_1788976528450_0.703748676768708","host":"s3://npm-registry-packages-npm-production"}},"5.3.0":{"name":"@michaelthielemann/kestrel","version":"5.3.0","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@5.3.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./dist/cli.js"},"dist":{"shasum":"5938f92aac77b75980af33b3e3d96579d1399d71","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-5.3.0.tgz","fileCount":59,"integrity":"sha512-JMOuAoqk/x20hjbKCnc5nd8T2sIeidGWfGlA7Fr3Ig4b/YENOlTbjyqcZ8FdocXOPvrqpYMwegDu72QD4zX7vw==","signatures":[{"sig":"MEUCIFvkWEh8mvMF1bBDBhiEnb6UIEweyeBRsvDESfmJ3qDlAiEAjGp9JqV9VY97fYnq4fGopxYnCrTgAYI2CF05CZ3RI5c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFCVFHZDYZ9TQsYPzNxoZrtFhpID2AXk+QQw7aYJls0+AiEAnkKI3Doe0lNp9Sm12DJgbEfQydNL5p7bv+WdP4kFi0M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@5.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":140851},"type":"module","engines":{"node":">=22.13.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cast":{"types":"./dist/cast.d.ts","default":"./dist/cast.js"},"./load":{"types":"./dist/load.d.ts","default":"./dist/load.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./logger":{"types":"./dist/logger.d.ts","default":"./dist/logger.js"},"./result":{"types":"./dist/result.d.ts","default":"./dist/result.js"},"./runner":{"types":"./dist/runner.d.ts","default":"./dist/runner.js"},"./schema":{"types":"./dist/schema.d.ts","default":"./dist/schema.js"},"./context":{"types":"./dist/context.d.ts","default":"./dist/context.js"},"./dataflow":{"types":"./dist/dataflow.d.ts","default":"./dist/dataflow.js"},"./catalogue":{"types":"./dist/catalogue.d.ts","default":"./dist/catalogue.js"},"./defineConfig":{"types":"./dist/defineConfig.d.ts","default":"./dist/defineConfig.js"},"./defineModule":{"types":"./dist/defineModule.d.ts","default":"./dist/defineModule.js"},"./defineContract":{"types":"./dist/defineContract.d.ts","default":"./dist/defineContract.js"},"./definePipeline":{"types":"./dist/definePipeline.d.ts","default":"./dist/definePipeline.js"},"./testing/runPipeline":{"types":"./dist/testing/runPipeline.d.ts","default":"./dist/testing/runPipeline.js"}},"scripts":{"build":"tsc -b tsconfig.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git","directory":"packages/core"},"description":"Kestrel core: contract registry, boot check and pipeline runner. Ships no contracts and no modules.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.23.8"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/kestrel_5.3.0_1789570608412_0.6947863083402046","host":"s3://npm-registry-packages-npm-production"}},"5.4.0":{"name":"@michaelthielemann/kestrel","version":"5.4.0","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@5.4.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./dist/cli.js"},"dist":{"shasum":"14be8f0c36f84d2316c258946d45585a29c77c70","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-5.4.0.tgz","fileCount":61,"integrity":"sha512-JYIkdeBO1anLrE1/u/4FnmfIoMRbvXlZITGQPgV+EhyctWb2kJna89eClfk4zNxxd5c/NOui1OrXrL4tAr/kxw==","signatures":[{"sig":"MEQCIDL9dUpxqC9AWFNwmSNNJ9+9GsTIuWnKTa6OaVghIN+gAiA2lOy0NIs9l6WyOtZnqsfEQaGd2J4O8HcpbqRqnCrqjQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEhH49UlOow3hVD5RJfJEK8lrDa2MZgzA6svR02bO21KAiEA4GL7XRQZrSd48Ii2VO1eYyUZ+UOTNGLNrsh220vCjE8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@5.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":146022},"type":"module","engines":{"node":">=22.13.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cast":{"types":"./dist/cast.d.ts","default":"./dist/cast.js"},"./load":{"types":"./dist/load.d.ts","default":"./dist/load.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./logger":{"types":"./dist/logger.d.ts","default":"./dist/logger.js"},"./result":{"types":"./dist/result.d.ts","default":"./dist/result.js"},"./runner":{"types":"./dist/runner.d.ts","default":"./dist/runner.js"},"./schema":{"types":"./dist/schema.d.ts","default":"./dist/schema.js"},"./context":{"types":"./dist/context.d.ts","default":"./dist/context.js"},"./dataflow":{"types":"./dist/dataflow.d.ts","default":"./dist/dataflow.js"},"./catalogue":{"types":"./dist/catalogue.d.ts","default":"./dist/catalogue.js"},"./defineConfig":{"types":"./dist/defineConfig.d.ts","default":"./dist/defineConfig.js"},"./defineModule":{"types":"./dist/defineModule.d.ts","default":"./dist/defineModule.js"},"./defineContract":{"types":"./dist/defineContract.d.ts","default":"./dist/defineContract.js"},"./definePipeline":{"types":"./dist/definePipeline.d.ts","default":"./dist/definePipeline.js"},"./testing/runPipeline":{"types":"./dist/testing/runPipeline.d.ts","default":"./dist/testing/runPipeline.js"}},"scripts":{"build":"tsc -b tsconfig.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git","directory":"packages/core"},"description":"Kestrel core: contract registry, boot check, pipeline runner and triggers. Ships no contracts and no modules.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.23.8"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/kestrel_5.4.0_1789752040215_0.5715089047942923","host":"s3://npm-registry-packages-npm-production"}},"5.5.0":{"name":"@michaelthielemann/kestrel","version":"5.5.0","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@5.5.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./dist/cli.js"},"dist":{"shasum":"1944bf8da73382a8b9418df3d7e3786c6fd89a8d","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-5.5.0.tgz","fileCount":61,"integrity":"sha512-k3Q8op6T6X0XOek1AZ8TueLnm6TVKNzszd/+sWiNyW3V8la5/286kB1sahdImv4pmmXJ4Nj/SiKR/KS85aZkfg==","signatures":[{"sig":"MEYCIQDrjoWV823aya2ZuxPQxR1a4fQT2Jxfz0h7bdWCnvTjqQIhAJxmhuaq87Cd15kXzMBeLzCCKToiF1ZsfLdwrOvY0ICj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEOf7qZlfrT4+3sV5E8/Bn/1/6HfUpkauJBjmsi3X+c/AiAs7F11keYfSjN5fKNrskikO2V9HVEbSrkte5io5zgZ1g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@5.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":146638},"type":"module","engines":{"node":">=22.13.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cast":{"types":"./dist/cast.d.ts","default":"./dist/cast.js"},"./load":{"types":"./dist/load.d.ts","default":"./dist/load.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./logger":{"types":"./dist/logger.d.ts","default":"./dist/logger.js"},"./result":{"types":"./dist/result.d.ts","default":"./dist/result.js"},"./runner":{"types":"./dist/runner.d.ts","default":"./dist/runner.js"},"./schema":{"types":"./dist/schema.d.ts","default":"./dist/schema.js"},"./context":{"types":"./dist/context.d.ts","default":"./dist/context.js"},"./dataflow":{"types":"./dist/dataflow.d.ts","default":"./dist/dataflow.js"},"./catalogue":{"types":"./dist/catalogue.d.ts","default":"./dist/catalogue.js"},"./defineConfig":{"types":"./dist/defineConfig.d.ts","default":"./dist/defineConfig.js"},"./defineModule":{"types":"./dist/defineModule.d.ts","default":"./dist/defineModule.js"},"./defineContract":{"types":"./dist/defineContract.d.ts","default":"./dist/defineContract.js"},"./definePipeline":{"types":"./dist/definePipeline.d.ts","default":"./dist/definePipeline.js"},"./testing/runPipeline":{"types":"./dist/testing/runPipeline.d.ts","default":"./dist/testing/runPipeline.js"}},"scripts":{"build":"tsc -b tsconfig.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git","directory":"packages/core"},"description":"Kestrel core: contract registry, boot check, pipeline runner and triggers. Ships no contracts and no modules.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.23.8"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/kestrel_5.5.0_1789771976191_0.6197253548712418","host":"s3://npm-registry-packages-npm-production"}},"5.6.0":{"name":"@michaelthielemann/kestrel","version":"5.6.0","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@5.6.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./dist/cli.js"},"dist":{"shasum":"f39aa477d289b32b8cd759e0d86d3d938241ac3f","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-5.6.0.tgz","fileCount":63,"integrity":"sha512-tOVbLysv4gcZPKVgEpv+PnTf6n06Ho/+U+AYmiHm93s/gVIw1jmM7YJQmYKV41SpiQnZhCRo5joItpRJTooIPA==","signatures":[{"sig":"MEUCIQD6n+Zkm9D3JIV9VlbkJpj27W9/iF+PMAoQKHpeqlHi7gIgAwapF5KA/aDdRy1N3uxSDGG/Dxv7h2KYr1eaOaySmGk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCZ+vikVBeGY7dnakzhHhkSdX2l7cL7UpsSM9oIy309OQIgQtJD7mgCHWKZfcdQW2GE5yeIb+jc7IatjdjT/hhxOfo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@5.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":155050},"type":"module","engines":{"node":">=22.13.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cast":{"types":"./dist/cast.d.ts","default":"./dist/cast.js"},"./load":{"types":"./dist/load.d.ts","default":"./dist/load.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./logger":{"types":"./dist/logger.d.ts","default":"./dist/logger.js"},"./result":{"types":"./dist/result.d.ts","default":"./dist/result.js"},"./runner":{"types":"./dist/runner.d.ts","default":"./dist/runner.js"},"./schema":{"types":"./dist/schema.d.ts","default":"./dist/schema.js"},"./context":{"types":"./dist/context.d.ts","default":"./dist/context.js"},"./dataflow":{"types":"./dist/dataflow.d.ts","default":"./dist/dataflow.js"},"./catalogue":{"types":"./dist/catalogue.d.ts","default":"./dist/catalogue.js"},"./defineConfig":{"types":"./dist/defineConfig.d.ts","default":"./dist/defineConfig.js"},"./defineModule":{"types":"./dist/defineModule.d.ts","default":"./dist/defineModule.js"},"./defineContract":{"types":"./dist/defineContract.d.ts","default":"./dist/defineContract.js"},"./definePipeline":{"types":"./dist/definePipeline.d.ts","default":"./dist/definePipeline.js"},"./testing/runPipeline":{"types":"./dist/testing/runPipeline.d.ts","default":"./dist/testing/runPipeline.js"}},"scripts":{"build":"tsc -b tsconfig.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git","directory":"packages/core"},"description":"Kestrel core: contract registry, boot check, pipeline runner and triggers. Ships no contracts and no modules.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.23.8"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/kestrel_5.6.0_1789812849665_0.5818845572679614","host":"s3://npm-registry-packages-npm-production"}},"5.7.0":{"name":"@michaelthielemann/kestrel","version":"5.7.0","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@5.7.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./dist/cli.js"},"dist":{"shasum":"7d2e38c897eea1df1723d0e821989eab203b9f8a","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-5.7.0.tgz","fileCount":63,"integrity":"sha512-bGDbLN3zJViRIFn2nEN3ziY8BE6o3R+3DhhR0Wa8To2dD0kmB4IIGaPE9FtzoYnW2Dc+t8F4BT71a4g708SEqw==","signatures":[{"sig":"MEUCIQCdstvhwQnHiLmCV0VRnc6FyHWtQtOR/HcGUP4HCNXzYgIgD5RLsNSfyGeLYULznWJr7v2J7LqAmcrEs61KPliZvzQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCpSkekri0WKPjtwuTZRT+b8t4JZ9GznWgrbcPxn1T0OwIgB4ZpvU4h8vfem1W0XXZT+GN6cms3kGqWDFbn0Yr6tA8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@5.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":155050},"type":"module","engines":{"node":">=22.13.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cast":{"types":"./dist/cast.d.ts","default":"./dist/cast.js"},"./load":{"types":"./dist/load.d.ts","default":"./dist/load.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./logger":{"types":"./dist/logger.d.ts","default":"./dist/logger.js"},"./result":{"types":"./dist/result.d.ts","default":"./dist/result.js"},"./runner":{"types":"./dist/runner.d.ts","default":"./dist/runner.js"},"./schema":{"types":"./dist/schema.d.ts","default":"./dist/schema.js"},"./context":{"types":"./dist/context.d.ts","default":"./dist/context.js"},"./dataflow":{"types":"./dist/dataflow.d.ts","default":"./dist/dataflow.js"},"./catalogue":{"types":"./dist/catalogue.d.ts","default":"./dist/catalogue.js"},"./defineConfig":{"types":"./dist/defineConfig.d.ts","default":"./dist/defineConfig.js"},"./defineModule":{"types":"./dist/defineModule.d.ts","default":"./dist/defineModule.js"},"./defineContract":{"types":"./dist/defineContract.d.ts","default":"./dist/defineContract.js"},"./definePipeline":{"types":"./dist/definePipeline.d.ts","default":"./dist/definePipeline.js"},"./testing/runPipeline":{"types":"./dist/testing/runPipeline.d.ts","default":"./dist/testing/runPipeline.js"}},"scripts":{"build":"tsc -b tsconfig.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git","directory":"packages/core"},"description":"Kestrel core: contract registry, boot check, pipeline runner and triggers. Ships no contracts and no modules.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.23.8"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/kestrel_5.7.0_1789821484914_0.9672957018150774","host":"s3://npm-registry-packages-npm-production"}},"5.8.0":{"name":"@michaelthielemann/kestrel","version":"5.8.0","license":"Apache-2.0","_id":"@michaelthielemann/kestrel@5.8.0","maintainers":[{"name":"michaelthielemann","email":"michael@thielemann.eu"}],"homepage":"https://github.com/MichaelThielemann/kestrel#readme","bugs":"https://github.com/MichaelThielemann/kestrel/issues","bin":{"kestrel":"./dist/cli.js"},"dist":{"shasum":"d1d54392887a183b2e81fa55b3b80229a4ea9110","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-5.8.0.tgz","fileCount":63,"integrity":"sha512-ffCEDWn14NcrpJmjamrRPAu8fLSdW0F4zYvqC9GYcVR4uqJ4oU24mJR2/0Qtta9y5lHBUYyhmPHVchHNAV40Xw==","signatures":[{"sig":"MEUCIF58sB0HacfyoVVoROezw7bVsHvu1qEWoVisllM7lUTwAiEAiQRV9+i1zH7HpEu2z2PydDaP+uEHIHOvXyFjOEIwW9s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDkkQPWdiGdflPTE0vhsxXx7XJQ2vM88mLIr4vQ+6AB8gIgY34dVb1Az02zlPHsPqG0D406NmttAo/ukviMRDCaMyM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@5.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":152380},"type":"module","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cast":{"types":"./dist/cast.d.ts","default":"./dist/cast.js"},"./load":{"types":"./dist/load.d.ts","default":"./dist/load.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./logger":{"types":"./dist/logger.d.ts","default":"./dist/logger.js"},"./result":{"types":"./dist/result.d.ts","default":"./dist/result.js"},"./runner":{"types":"./dist/runner.d.ts","default":"./dist/runner.js"},"./schema":{"types":"./dist/schema.d.ts","default":"./dist/schema.js"},"./context":{"types":"./dist/context.d.ts","default":"./dist/context.js"},"./dataflow":{"types":"./dist/dataflow.d.ts","default":"./dist/dataflow.js"},"./catalogue":{"types":"./dist/catalogue.d.ts","default":"./dist/catalogue.js"},"./defineConfig":{"types":"./dist/defineConfig.d.ts","default":"./dist/defineConfig.js"},"./defineModule":{"types":"./dist/defineModule.d.ts","default":"./dist/defineModule.js"},"./defineContract":{"types":"./dist/defineContract.d.ts","default":"./dist/defineContract.js"},"./definePipeline":{"types":"./dist/definePipeline.d.ts","default":"./dist/definePipeline.js"},"./testing/runPipeline":{"types":"./dist/testing/runPipeline.d.ts","default":"./dist/testing/runPipeline.js"}},"scripts":{"build":"tsc -b tsconfig.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:dcce183e-54ee-4fb0-8375-3615ac6be13d"}},"repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git","directory":"packages/core"},"description":"Kestrel core: contract registry, boot check, pipeline runner and triggers. Ships no contracts and no modules.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.23.8"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/kestrel_5.8.0_1789844135812_0.30754056815843844","host":"s3://npm-registry-packages-npm-production"}},"5.8.1":{"_id":"@michaelthielemann/kestrel@5.8.1","bin":{"kestrel":"./dist/cli.js"},"bugs":"https://github.com/MichaelThielemann/kestrel/issues","dist":{"shasum":"cf3b541fd4a41e4ec202b5d295c8ae645c082f45","tarball":"https://registry.npmjs.org/@michaelthielemann/kestrel/-/kestrel-5.8.1.tgz","fileCount":63,"integrity":"sha512-6LCxyUvOF55S1VyKSiRpwjY9qXTOYGUKQKy1Uk9wGTYE3Wsqvkfz/vl0ANw6gLhB6V2JFVLpuBbZTi9cmxYN5g==","signatures":[{"sig":"MEYCIQDIuzOIU/7IQhcLYfVXW5P437iWmc7x1rmACkHgew/xaAIhANABidfq8mau+G5x6kWKvdnZTBeQRo94HeS89wgF1kiC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBtuIqV7pV2OCZHwGqrbcnoNI4OQtcmYmExhQnpKZDcdAiEA1DhNkzwQE2iVD32ev+oAJ5ri2LE0OF50rel4cWh/He8="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@michaelthielemann%2fkestrel@5.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":152380},"name":"@michaelthielemann/kestrel","type":"module","engines":{"node":">=22.18.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./cast":{"types":"./dist/cast.d.ts","default":"./dist/cast.js"},"./load":{"types":"./dist/load.d.ts","default":"./dist/load.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./logger":{"types":"./dist/logger.d.ts","default":"./dist/logger.js"},"./result":{"types":"./dist/result.d.ts","default":"./dist/result.js"},"./runner":{"types":"./dist/runner.d.ts","default":"./dist/runner.js"},"./schema":{"types":"./dist/schema.d.ts","default":"./dist/schema.js"},"./context":{"types":"./dist/context.d.ts","default":"./dist/context.js"},"./dataflow":{"types":"./dist/dataflow.d.ts","default":"./dist/dataflow.js"},"./catalogue":{"types":"./dist/catalogue.d.ts","default":"./dist/catalogue.js"},"./defineConfig":{"types":"./dist/defineConfig.d.ts","default":"./dist/defineConfig.js"},"./defineModule":{"types":"./dist/defineModule.d.ts","default":"./dist/defineModule.js"},"./defineContract":{"types":"./dist/defineContract.d.ts","default":"./dist/defineContract.js"},"./definePipeline":{"types":"./dist/definePipeline.d.ts","default":"./dist/definePipeline.js"},"./testing/runPipeline":{"types":"./dist/testing/runPipeline.d.ts","default":"./dist/testing/runPipeline.js"}},"license":"Apache-2.0","scripts":{"build":"tsc -b tsconfig.json"},"version":"5.8.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:26fc74c6-103e-4e42-a6c1-0f19a5f7a578"}},"homepage":"https://github.com/MichaelThielemann/kestrel#readme","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git","directory":"packages/core"},"description":"Kestrel core: contract registry, boot check, pipeline runner and triggers. Ships no contracts and no modules.","directories":{},"maintainers":[{"name":"michaelthielemann","email":"npm@thielemann.eu"}],"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.23.8"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/kestrel_5.8.1_1790102925596_0.8611985499682961"}}},"time":{"created":"2026-07-29T15:11:54.244Z","modified":"2026-09-22T18:48:46.043Z","1.2.1":"2026-07-29T15:11:54.591Z","1.3.0":"2026-07-31T09:48:06.994Z","1.4.0":"2026-08-10T13:07:53.954Z","1.4.1":"2026-08-10T14:42:41.848Z","1.5.0":"2026-08-10T15:59:41.253Z","1.6.0":"2026-08-10T18:36:34.432Z","1.7.0":"2026-08-10T23:56:15.583Z","2.0.0":"2026-08-14T06:14:02.361Z","2.1.0":"2026-08-14T17:18:59.466Z","3.0.0":"2026-08-19T09:30:59.567Z","3.0.1":"2026-08-19T14:18:50.801Z","4.0.0":"2026-08-26T17:17:01.699Z","4.0.1":"2026-08-26T18:06:05.791Z","4.0.2":"2026-08-27T06:45:40.350Z","4.1.0":"2026-08-27T09:39:24.317Z","4.1.1":"2026-08-27T11:32:35.677Z","4.1.2":"2026-08-27T12:34:31.464Z","4.1.3":"2026-08-27T13:00:05.582Z","5.0.0":"2026-09-07T12:15:05.966Z","5.0.2":"2026-09-07T17:06:56.261Z","5.0.3":"2026-09-07T21:04:39.864Z","5.1.0":"2026-09-08T09:03:44.486Z","5.2.0":"2026-09-09T17:55:28.532Z","5.3.0":"2026-09-16T14:56:48.501Z","5.4.0":"2026-09-18T17:20:40.291Z","5.5.0":"2026-09-18T22:52:56.260Z","5.6.0":"2026-09-19T10:14:09.759Z","5.7.0":"2026-09-19T12:38:05.005Z","5.8.0":"2026-09-19T18:55:35.904Z","5.8.1":"2026-09-22T18:48:45.690Z"},"bugs":"https://github.com/MichaelThielemann/kestrel/issues","license":"Apache-2.0","homepage":"https://github.com/MichaelThielemann/kestrel#readme","repository":{"url":"git+https://github.com/MichaelThielemann/kestrel.git","type":"git","directory":"packages/core"},"description":"Kestrel core: contract registry, boot check, pipeline runner and triggers. Ships no contracts and no modules.","maintainers":[{"name":"michaelthielemann","email":"npm@thielemann.eu"}],"readme":"# @michaelthielemann/kestrel\nThe core: `defineContract`, `defineModule`, `definePipeline`, `defineConfig`, the boot check and\nthe pipeline runner with HTTP, event and cron triggers. It ships no contracts and no modules;\na config without modules boots as an empty shell. `boot()` reads the config, sorts modules by\n`requires`, runs `setup()`, checks every provided contract's methods, registers steps, resolves\npipelines and validates triggers; any problem throws `KestrelBootError { module, reason }`.\nThe `kestrel` binary loads `kestrel.config.ts`, the modules named in `use` and `pipelines/*.ts`\nfrom the current directory. `testing/runPipeline` runs a pipeline against fake steps or, with\n`modules: [{ module, instance }]`, against a module's real steps and schemas. Before every step\nthe runner validates the body against the step's `describe().input` and the declared query\nparameters against `describe().query` (coerced from strings), answering `VALIDATION` 400 with\n`details.problems` on a mismatch — in every environment.\n\n## Introspection\n`kestrel.describe()` is the static manifest of the booted instance, computed once: every module\nwith `use`, package version, contracts, config schema (JSON Schema from the Zod schema) and config\nvariables (path, type, required, default, secret, set — never a value; fields marked\n`.describe(\"secret\")` show no default), every step with owner and description, every pipeline with\nits resolved steps, every trigger. `kestrel.observe(observer)` registers a `RunObserver`\n(`runStart`, `runEnd`, `stepStart`, `stepEnd`) fed by the runner independently of the logger and\nreturns the unsubscribe. A module reaches both through its `attach(instance, { describe, observe })`\nhook, called at the end of boot; a returned function runs on `stop()`.\n\n## Entry points\nThe package exports a fixed list of subpaths; everything else (boot internals, registry, sorting,\ntrigger implementations, tests) is private and not importable. `@michaelthielemann/kestrel` (the\nroot: `boot`, `defineContract`, `defineModule`, `definePipeline`, `defineConfig`, the HTTP helpers\nan adapter needs, the error and result vocabulary) and `@michaelthielemann/kestrel/<name>` for\n`cast`, `catalogue`, `context`, `dataflow`, `defineConfig`, `defineContract`, `defineModule`,\n`definePipeline`, `errors`, `load`, `logger`, `result`, `runner`, `schema` and\n`testing/runPipeline`. The core imports no contract, no module and no host framework; ESLint\nenforces that for `core`, `contracts` (only the core) and the `h3` adapter (only `h3` and the core).\nBinary results are served `inline` for a built-in safe set of content types plus any listed in `http.inlineTypes`.\n`http.inlineTypes` with `image/svg+xml` needs a module registering the step `sanitize.svg`\n(`sanitize-svg`), otherwise boot fails.\n\n## HTTP config\n`http` takes `port`, `host`, `corsOrigin`, `maxBodyBytes`, `trustProxy`, `healthPath`, `inlineTypes`\nand `timeouts: { requestMs, headersMs, keepAliveMs }` (defaults 30000 / 10000 / 5000), which map to\n`server.requestTimeout`, `server.headersTimeout` and `server.keepAliveTimeout`. An incoming\n`x-request-id` header of short printable ASCII becomes `ctx.requestId`, appears in the `http` log\nline and is echoed as the `x-request-id` response header next to `x-kestrel-run-id`.\n\n## Logging\n`consoleLogger` stamps every line with ISO 8601 and the local UTC offset rather than `Z`: it runs on\none machine, and the offset keeps the line readable in local time without losing the absolute point.\n\n## Shutdown\n`stop()` closes the listener, waits for the in-flight runs and for connections still sending a\nrequest or receiving a response, then drops the remaining connections, stops the cron and event\ntriggers and tears the modules down in reverse boot order. The deadline is `stop({ timeoutMs })`\nor the top-level config `shutdownTimeoutMs` (default 30000); the returned `{ drained }` says whether\neverything finished inside it. The `kestrel` binary wires SIGINT/SIGTERM to `stop()` (exit 1 when the\ndeadline is hit) and logs `unhandledRejection`/`uncaughtException` before stopping and exiting 1.\n","readmeFilename":""}