{"_id":"@alufie/seo","_rev":"8-2c3f59b5177b75cc9dd9f245e177f6b0","name":"@alufie/seo","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"@alufie/seo","version":"0.1.0","keywords":["seo","svelte","sveltekit","json-ld","schema-org","drizzle","metadata","open-graph"],"author":{"name":"Alufie"},"license":"MIT","_id":"@alufie/seo@0.1.0","maintainers":[{"name":"alufie","email":"dev@alufie.com"}],"homepage":"https://github.com/jmyt8/seo#readme","bugs":{"url":"https://github.com/jmyt8/seo/issues"},"dist":{"shasum":"bb4cb149114e4ab9f38bc782bb7a330cd0d3930b","tarball":"https://registry.npmjs.org/@alufie/seo/-/seo-0.1.0.tgz","fileCount":40,"integrity":"sha512-V6sXoWGUEk9FhTdSR1GrRCVVFVtEkKJOj0jmnRUe3nUdiAE4xGRde+0h73eOW7hE6Nxolp11gZGxL8nk0ruVWA==","signatures":[{"sig":"MEUCIQCZJVsu9NISINMe0iFPWqCikpb9JzRVZrOWhSbVAUCw8QIgDBaX3bHOBalVuP0Fmo8tmAyywTy+abu+pVFxUvEXeXc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92905},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js","default":"./dist/index.js"},"./editor":{"types":"./dist/editor.d.ts","default":"./dist/editor.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","default":"./dist/svelte/index.js"},"./drizzle":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.js"},"./resolve":{"types":"./dist/resolve.d.ts","default":"./dist/resolve.js"},"./schemas":{"types":"./dist/schemas.d.ts","default":"./dist/schemas.js"},"./defaults":{"types":"./dist/defaults.d.ts","default":"./dist/defaults.js"},"./validate":{"types":"./dist/validate.d.ts","default":"./dist/validate.js"}},"gitHead":"f7955813e370fa88c48444a842c636b766b4f62e","scripts":{"test":"vitest run","build":"svelte-package --input src/lib --output dist --tsconfig ./tsconfig.json","check":"svelte-check --tsconfig ./tsconfig.json","prepublishOnly":"pnpm test && pnpm check && pnpm build"},"_npmUser":{"name":"alufie","email":"dev@alufie.com"},"repository":{"url":"git+https://github.com/jmyt8/seo.git","type":"git"},"_npmVersion":"11.8.0","description":"Modular SEO helpers, schema builders, Svelte components, and Drizzle storage for SvelteKit.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.32.1","devDependencies":{"vite":"^7.1.9","svelte":"^5.54.1","vitest":"^3.2.4","typescript":"^5.9.3","@types/node":"^24.6.1","svelte-check":"^4.4.5","@tsconfig/svelte":"^5.0.4","@sveltejs/package":"^2.3.7","@sveltejs/vite-plugin-svelte":"^6.2.1"},"peerDependencies":{"svelte":"^5.0.0","drizzle-orm":"^0.45.1"},"peerDependenciesMeta":{"drizzle-orm":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/seo_0.1.0_1774612527207_0.34536919024273094","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@alufie/seo","version":"0.1.1","keywords":["seo","svelte","sveltekit","json-ld","schema-org","drizzle","metadata","open-graph"],"author":{"name":"Alufie"},"license":"MIT","_id":"@alufie/seo@0.1.1","maintainers":[{"name":"alufie","email":"dev@alufie.com"}],"homepage":"https://github.com/jmyt8/seo#readme","bugs":{"url":"https://github.com/jmyt8/seo/issues"},"dist":{"shasum":"d83e279d0fe77b5c55ad0e44aaf4b5b470771547","tarball":"https://registry.npmjs.org/@alufie/seo/-/seo-0.1.1.tgz","fileCount":40,"integrity":"sha512-n+10lJO97m3FfhpUU/JdGmHu8AVuNRGDSTT+iPSQFI8mLb0eOb/8IAyy5SQSXqtIWCrjbW6qiSIbGSG+owXzwg==","signatures":[{"sig":"MEUCID+cblSB+AoXO+SoYSsSTjKQamfRA2H66sZDHLTio1TqAiEApNHvpo9DZzIXeMQkVmRJ/2LBDGt7NvCn8JoifQWJqyc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91075},"type":"module","exports":{"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./editor":{"types":"./dist/editor.d.ts","default":"./dist/editor.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"},"./drizzle":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.js"},"./resolve":{"types":"./dist/resolve.d.ts","default":"./dist/resolve.js"},"./schemas":{"types":"./dist/schemas.d.ts","default":"./dist/schemas.js"},"./defaults":{"types":"./dist/defaults.d.ts","default":"./dist/defaults.js"},"./validate":{"types":"./dist/validate.d.ts","default":"./dist/validate.js"}},"gitHead":"1ebf0c5bb1cef4280709544189c784e9068f53b7","scripts":{"test":"vitest run","build":"svelte-package --input src/lib --output dist --tsconfig ./tsconfig.json","check":"svelte-check --tsconfig ./tsconfig.json","prepublishOnly":"pnpm test && pnpm check && pnpm build"},"_npmUser":{"name":"alufie","email":"dev@alufie.com"},"repository":{"url":"git+https://github.com/jmyt8/seo.git","type":"git"},"_npmVersion":"11.8.0","description":"Modular SEO helpers, schema builders, Svelte components, and Drizzle storage for SvelteKit.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.32.1","devDependencies":{"vite":"^7.1.9","svelte":"^5.54.1","vitest":"^3.2.4","typescript":"^5.9.3","@types/node":"^24.6.1","drizzle-orm":"^0.45.2","svelte-check":"^4.4.5","@tsconfig/svelte":"^5.0.4","@sveltejs/package":"^2.3.7","@sveltejs/vite-plugin-svelte":"^6.2.1"},"peerDependencies":{"svelte":"^5.0.0","drizzle-orm":"^0.45.2"},"peerDependenciesMeta":{"drizzle-orm":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/seo_0.1.1_1776830112255_0.7202754496915611","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@alufie/seo","version":"0.1.2","keywords":["seo","svelte","sveltekit","json-ld","schema-org","drizzle","metadata","open-graph"],"author":{"name":"Alufie"},"license":"MIT","_id":"@alufie/seo@0.1.2","maintainers":[{"name":"alufie","email":"dev@alufie.com"}],"homepage":"https://github.com/jmyt8/seo#readme","bugs":{"url":"https://github.com/jmyt8/seo/issues"},"dist":{"shasum":"09389b2889648445d299111b3190a1d6865e8425","tarball":"https://registry.npmjs.org/@alufie/seo/-/seo-0.1.2.tgz","fileCount":42,"integrity":"sha512-H+poP0UesKvQUTL3pqwEIEeEmIirtyxQkftySOzC5Agp72L1U/huH6Z5X6xmBCyi0rUKEziH5cl75Yoa9/q/tw==","signatures":[{"sig":"MEUCIQCjIesa0wfIr7WXELZUhi+rUDlnJD6NVQCr5H2uFpHblQIgBz8LSGqR3lldEmD9JwNc1UgjNAUuwILE8aiccQm9vwA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91248},"type":"module","exports":{"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./editor":{"types":"./dist/editor.d.ts","default":"./dist/editor.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"},"./drizzle":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.js"},"./resolve":{"types":"./dist/resolve.d.ts","default":"./dist/resolve.js"},"./schemas":{"types":"./dist/schemas.d.ts","default":"./dist/schemas.js"},"./defaults":{"types":"./dist/defaults.d.ts","default":"./dist/defaults.js"},"./validate":{"types":"./dist/validate.d.ts","default":"./dist/validate.js"}},"gitHead":"1ebf0c5bb1cef4280709544189c784e9068f53b7","scripts":{"test":"vitest run","build":"svelte-package --input src/lib --output dist --tsconfig ./tsconfig.json","check":"svelte-check --tsconfig ./tsconfig.json","prepublishOnly":"pnpm test && pnpm check && pnpm build"},"_npmUser":{"name":"alufie","email":"dev@alufie.com"},"repository":{"url":"git+https://github.com/jmyt8/seo.git","type":"git"},"_npmVersion":"11.8.0","description":"Modular SEO helpers, schema builders, Svelte components, and Drizzle storage for SvelteKit.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.32.1","devDependencies":{"vite":"^7.1.9","svelte":"^5.54.1","vitest":"^3.2.4","typescript":"^5.9.3","@types/node":"^24.6.1","drizzle-orm":"^0.45.2","svelte-check":"^4.4.5","@tsconfig/svelte":"^5.0.4","@sveltejs/package":"^2.3.7","@sveltejs/vite-plugin-svelte":"^6.2.1"},"peerDependencies":{"svelte":"^5.0.0","drizzle-orm":"^0.45.2"},"peerDependenciesMeta":{"drizzle-orm":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/seo_0.1.2_1776856649141_0.9829671948708938","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@alufie/seo","version":"0.1.3","keywords":["seo","svelte","sveltekit","json-ld","schema-org","drizzle","metadata","open-graph"],"author":{"name":"Alufie"},"license":"MIT","_id":"@alufie/seo@0.1.3","maintainers":[{"name":"alufie","email":"dev@alufie.com"}],"homepage":"https://github.com/jmyt8/seo#readme","bugs":{"url":"https://github.com/jmyt8/seo/issues"},"dist":{"shasum":"6a0e5d5e776d809118c24b3e6354e68e4ee1309a","tarball":"https://registry.npmjs.org/@alufie/seo/-/seo-0.1.3.tgz","fileCount":42,"integrity":"sha512-HSvK2JLmqdFayZH/eIxWXgkXxJrGEdDf1pRxozARoAZOv7YDfnTEaTPftKHfgvyc1iYTZ5La3o5LJtZc6L194A==","signatures":[{"sig":"MEQCIAQCXD7hhktMhKdINpeHmVJ2OM4fSr34fiGObWRwHlC/AiAiz6NAvr7WgKdOc8oxOzD+5g9aT1ifDc7WUORyOcB91g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93571},"type":"module","exports":{"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./editor":{"types":"./dist/editor.d.ts","default":"./dist/editor.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"},"./drizzle":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.js"},"./resolve":{"types":"./dist/resolve.d.ts","default":"./dist/resolve.js"},"./schemas":{"types":"./dist/schemas.d.ts","default":"./dist/schemas.js"},"./defaults":{"types":"./dist/defaults.d.ts","default":"./dist/defaults.js"},"./validate":{"types":"./dist/validate.d.ts","default":"./dist/validate.js"}},"gitHead":"4c92f1c1353798e552e12c1485b5d22599b0f190","scripts":{"test":"vitest run","build":"svelte-package --input src/lib --output dist --tsconfig ./tsconfig.json","check":"svelte-check --tsconfig ./tsconfig.json","prepublishOnly":"pnpm test && pnpm check && pnpm build"},"_npmUser":{"name":"alufie","email":"dev@alufie.com"},"repository":{"url":"git+https://github.com/jmyt8/seo.git","type":"git"},"_npmVersion":"11.8.0","description":"Modular SEO helpers, schema builders, Svelte components, and Drizzle storage for SvelteKit.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.32.1","devDependencies":{"vite":"^7.1.9","svelte":"^5.54.1","vitest":"^3.2.4","typescript":"^5.9.3","@types/node":"^24.6.1","drizzle-orm":"^0.45.2","svelte-check":"^4.4.5","@tsconfig/svelte":"^5.0.4","@sveltejs/package":"^2.3.7","@sveltejs/vite-plugin-svelte":"^6.2.1"},"peerDependencies":{"svelte":"^5.0.0","drizzle-orm":"^0.45.2"},"peerDependenciesMeta":{"drizzle-orm":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/seo_0.1.3_1778465594712_0.7054868093305557","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@alufie/seo","version":"0.1.4","keywords":["seo","svelte","sveltekit","json-ld","schema-org","drizzle","metadata","open-graph"],"author":{"name":"Alufie"},"license":"MIT","_id":"@alufie/seo@0.1.4","maintainers":[{"name":"alufie","email":"dev@alufie.com"}],"homepage":"https://github.com/jmyt8/seo#readme","bugs":{"url":"https://github.com/jmyt8/seo/issues"},"dist":{"shasum":"845a2f1718d9d8e93628142cc1caf9deedb3ae94","tarball":"https://registry.npmjs.org/@alufie/seo/-/seo-0.1.4.tgz","fileCount":40,"integrity":"sha512-W/B38PE4mxtuE+2G+Hq3QODyAy8VIXg4ydPl5sezt/Mac/qTSaVE/zY78Tt5OI8Z24fJZZE4PMs4Rif7ZQozzw==","signatures":[{"sig":"MEUCIQDFv3An1BXaiNWW+adCgG/RR3TLHwGT8e40dbjeh1AsjgIgU9ueE+C0g5KDpDjQ+AV8AMfD83gSjE+4eCUMnWXOlwg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104485},"type":"module","exports":{"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./editor":{"types":"./dist/editor.d.ts","default":"./dist/editor.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"},"./drizzle":{"types":"./dist/drizzle.d.ts","default":"./dist/drizzle.js"},"./resolve":{"types":"./dist/resolve.d.ts","default":"./dist/resolve.js"},"./schemas":{"types":"./dist/schemas.d.ts","default":"./dist/schemas.js"},"./defaults":{"types":"./dist/defaults.d.ts","default":"./dist/defaults.js"},"./validate":{"types":"./dist/validate.d.ts","default":"./dist/validate.js"}},"gitHead":"f3c919862765868c83a11cc7609535f9687c3109","scripts":{"test":"vitest run","build":"svelte-package --input src/lib --output dist --tsconfig ./tsconfig.json","check":"svelte-check --tsconfig ./tsconfig.json","prepublishOnly":"pnpm test && pnpm check && pnpm build"},"_npmUser":{"name":"alufie","email":"dev@alufie.com"},"repository":{"url":"git+https://github.com/jmyt8/seo.git","type":"git"},"_npmVersion":"11.8.0","description":"Modular SEO helpers, schema builders, Svelte components, and Drizzle storage for SvelteKit.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.32.1","devDependencies":{"vite":"^7.1.9","svelte":"^5.54.1","vitest":"^3.2.4","typescript":"^5.9.3","@types/node":"^24.6.1","drizzle-orm":"^0.45.2","svelte-check":"^4.4.5","@tsconfig/svelte":"^5.0.4","@sveltejs/package":"^2.3.7","@sveltejs/vite-plugin-svelte":"^6.2.1"},"peerDependencies":{"svelte":"^5.0.0","drizzle-orm":"^0.45.2"},"peerDependenciesMeta":{"drizzle-orm":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/seo_0.1.4_1778571234031_0.48550845793169217","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alufie/seo","version":"0.2.0","keywords":["seo","svelte","sveltekit","headless","json-ld","schema-org","metadata","open-graph","robots"],"author":{"name":"Alufie"},"license":"MIT","_id":"@alufie/seo@0.2.0","maintainers":[{"name":"alufie","email":"dev@alufie.com"}],"homepage":"https://github.com/jmyt8/seo#readme","bugs":{"url":"https://github.com/jmyt8/seo/issues"},"dist":{"shasum":"17ffbab0dec21bbbe399dbc1f65e5a47f059bdeb","tarball":"https://registry.npmjs.org/@alufie/seo/-/seo-0.2.0.tgz","fileCount":22,"integrity":"sha512-5hN06SmoN/2roLhRjm1639qukUOMTDlNFXwcmTTV/612dn1FodfG2UXBwXIEvrIg+r22wSyWp5ABF/NvUo2Gxw==","signatures":[{"sig":"MEYCIQCTq7ZWBSAgTI8axTetJJGhWtwNsMmconUeZ1ibCFZDSwIhANanGWeWFz2J8HHkbHXZ0BUCkXt+thZG0HKc1mJmPZW5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72501},"type":"module","exports":{"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./robots":{"types":"./dist/robots.d.ts","default":"./dist/robots.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"},"./resolve":{"types":"./dist/resolve.d.ts","default":"./dist/resolve.js"},"./schemas":{"types":"./dist/schemas.d.ts","default":"./dist/schemas.js"},"./defaults":{"types":"./dist/defaults.d.ts","default":"./dist/defaults.js"},"./validate":{"types":"./dist/validate.d.ts","default":"./dist/validate.js"}},"gitHead":"f3c919862765868c83a11cc7609535f9687c3109","scripts":{"test":"vitest run","build":"svelte-package --input src/lib --output dist --tsconfig ./tsconfig.json","check":"svelte-check --tsconfig ./tsconfig.json","prepublishOnly":"pnpm test && pnpm check && pnpm build"},"_npmUser":{"name":"alufie","email":"dev@alufie.com"},"repository":{"url":"git+https://github.com/jmyt8/seo.git","type":"git"},"_npmVersion":"11.16.0","description":"Headless SEO resolution, robots, validation, and JSON-LD helpers with optional Svelte head rendering.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.32.1","devDependencies":{"vite":"^7.1.9","svelte":"^5.56.8","vitest":"^3.2.4","typescript":"^5.9.3","@types/node":"^24.13.3","svelte-check":"^4.7.5","@tsconfig/svelte":"^5.0.4","@sveltejs/package":"^2.5.8","@sveltejs/vite-plugin-svelte":"^6.2.1"},"peerDependencies":{"svelte":"^5.0.0"},"peerDependenciesMeta":{"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/seo_0.2.0_1786553969933_0.7858854222785212","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@alufie/seo","version":"0.2.1","keywords":["seo","svelte","sveltekit","headless","json-ld","schema-org","metadata","open-graph","robots"],"author":{"name":"Alufie"},"license":"MIT","_id":"@alufie/seo@0.2.1","maintainers":[{"name":"alufie","email":"dev@alufie.com"}],"homepage":"https://github.com/jmyt8/seo#readme","bugs":{"url":"https://github.com/jmyt8/seo/issues"},"dist":{"shasum":"4c2d8b589967d4a2c00b1bc142a83784e55c0b4b","tarball":"https://registry.npmjs.org/@alufie/seo/-/seo-0.2.1.tgz","fileCount":22,"integrity":"sha512-RMm0A2CKthUFdwVj+HahKu9Z+MR1HXRROk3rlTvuvUweCb3htOzFESKoBfg359SU6oC0vu5Mh9wlQUkGAewEgg==","signatures":[{"sig":"MEUCIQDKNGLCJobI19use72Xm6IWRQMP7zm5BnpUXbzUj6vg4wIgSJ9YR9b4gkcgIzIWVmWHQFQCQJFt4IeRnH7NpYacUkI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86629},"type":"module","exports":{"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./robots":{"types":"./dist/robots.d.ts","default":"./dist/robots.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"},"./resolve":{"types":"./dist/resolve.d.ts","default":"./dist/resolve.js"},"./schemas":{"types":"./dist/schemas.d.ts","default":"./dist/schemas.js"},"./defaults":{"types":"./dist/defaults.d.ts","default":"./dist/defaults.js"},"./validate":{"types":"./dist/validate.d.ts","default":"./dist/validate.js"}},"gitHead":"c85688b6aa1866fe0b525af572f5b7c65f26f2f7","scripts":{"test":"vitest run","build":"svelte-package --input src/lib --output dist --tsconfig ./tsconfig.json","check":"svelte-check --tsconfig ./tsconfig.json","prepublishOnly":"pnpm test && pnpm check && pnpm build"},"_npmUser":{"name":"alufie","email":"dev@alufie.com"},"repository":{"url":"git+https://github.com/jmyt8/seo.git","type":"git"},"_npmVersion":"11.16.0","description":"Headless SEO resolution, robots, validation, and JSON-LD helpers with optional Svelte head rendering.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.32.1","devDependencies":{"vite":"^7.1.9","svelte":"^5.56.8","vitest":"^3.2.4","typescript":"^5.9.3","@types/node":"^24.13.3","svelte-check":"^4.7.5","@tsconfig/svelte":"^5.0.4","@sveltejs/package":"^2.5.8","@sveltejs/vite-plugin-svelte":"^6.2.1"},"peerDependencies":{"svelte":"^5.0.0"},"peerDependenciesMeta":{"svelte":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/seo_0.2.1_1786952472633_0.8834518672276179","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@alufie/seo","version":"0.2.2","description":"Headless SEO resolution, robots, validation, and JSON-LD helpers with optional Svelte head rendering.","license":"MIT","author":{"name":"Alufie"},"type":"module","sideEffects":false,"homepage":"https://github.com/jmyt8/seo#readme","repository":{"type":"git","url":"git+https://github.com/jmyt8/seo.git"},"bugs":{"url":"https://github.com/jmyt8/seo/issues"},"keywords":["seo","svelte","sveltekit","headless","json-ld","schema-org","metadata","open-graph","robots"],"publishConfig":{"access":"public"},"exports":{"./defaults":{"types":"./dist/defaults.d.ts","default":"./dist/defaults.js"},"./resolve":{"types":"./dist/resolve.d.ts","default":"./dist/resolve.js"},"./robots":{"types":"./dist/robots.d.ts","default":"./dist/robots.js"},"./schemas":{"types":"./dist/schemas.d.ts","default":"./dist/schemas.js"},"./validate":{"types":"./dist/validate.d.ts","default":"./dist/validate.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./svelte":{"types":"./dist/svelte/index.d.ts","svelte":"./dist/svelte/index.js","default":"./dist/svelte/index.js"}},"scripts":{"build":"svelte-package --input src/lib --output dist --tsconfig ./tsconfig.json","check":"svelte-check --tsconfig ./tsconfig.json","test":"vitest run","prepublishOnly":"pnpm test && pnpm check && pnpm build"},"peerDependencies":{"svelte":"^5.0.0"},"peerDependenciesMeta":{"svelte":{"optional":true}},"devDependencies":{"@sveltejs/package":"^2.5.8","@sveltejs/vite-plugin-svelte":"^6.2.1","@tsconfig/svelte":"^5.0.4","@types/node":"^24.13.3","svelte":"^5.56.8","svelte-check":"^4.7.5","typescript":"^5.9.3","vite":"^7.3.6","vitest":"^3.2.7"},"packageManager":"pnpm@10.32.1","gitHead":"e420437b58977e569a6845cee4dd8c28f7624030","_id":"@alufie/seo@0.2.2","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-lIisI3/a82JzLilWEfEw6aEuhskP5zTrOFZkJLSaqByA+m1DgnfdYfR9iPQk/rVYr+XmmWOMmYZq31sMd+oC7w==","shasum":"c80d8a9177599e0fe9158113d11e172714fb90f8","tarball":"https://registry.npmjs.org/@alufie/seo/-/seo-0.2.2.tgz","fileCount":22,"unpackedSize":88698,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDGcCFsESCSf+DlPx6BPkFPwlhhlgBz7UGBs5hqB04A1gIhAKPSSBAsRX1jveIlkl3zzad8CF9N6/m93HNCm0R2a3ia"}]},"_npmUser":{"name":"alufie","email":"dev@alufie.com"},"directories":{},"maintainers":[{"name":"alufie","email":"dev@alufie.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/seo_0.2.2_1787188653171_0.6968024711384344"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-27T11:55:27.089Z","modified":"2026-08-20T01:17:33.515Z","0.1.0":"2026-03-27T11:55:27.348Z","0.1.1":"2026-04-22T03:55:12.397Z","0.1.2":"2026-04-22T11:17:29.275Z","0.1.3":"2026-05-11T02:13:14.850Z","0.1.4":"2026-05-12T07:33:54.178Z","0.2.0":"2026-08-12T16:59:30.073Z","0.2.1":"2026-08-17T07:41:12.791Z","0.2.2":"2026-08-20T01:17:33.320Z"},"bugs":{"url":"https://github.com/jmyt8/seo/issues"},"author":{"name":"Alufie"},"license":"MIT","homepage":"https://github.com/jmyt8/seo#readme","keywords":["seo","svelte","sveltekit","headless","json-ld","schema-org","metadata","open-graph","robots"],"repository":{"type":"git","url":"git+https://github.com/jmyt8/seo.git"},"description":"Headless SEO resolution, robots, validation, and JSON-LD helpers with optional Svelte head rendering.","maintainers":[{"name":"alufie","email":"dev@alufie.com"}],"readme":"# `@alufie/seo`\n\nHeadless SEO resolution, robots controls, validation, and JSON-LD helpers with an optional\nSvelte head-rendering adapter.\n\nThe package owns no database, CMS, editor, routes, hostname, or application-specific schema.\nApplications own their metadata sources and pass plain objects into deterministic functions.\n\n## Install\n\n```bash\npnpm add @alufie/seo\n```\n\nInstall Svelte only when using `@alufie/seo/svelte`:\n\n```bash\npnpm add svelte\n```\n\n## Package surface\n\nThe package is subpath-only:\n\n- `@alufie/seo/defaults` — typed site/page definitions and title composition\n- `@alufie/seo/resolve` — ordered metadata composition, canonical resolution, tags, JSON-LD\n- `@alufie/seo/robots` — robots meta, `robots.txt`, and purpose-specific crawler policies\n- `@alufie/seo/schemas` — safe and strict schema.org builders\n- `@alufie/seo/validate` — input normalization and validation\n- `@alufie/seo/types` — shared public types\n- `@alufie/seo/svelte` — optional `SeoHead` and `SeoJsonLd` renderers\n\nThere is no root `@alufie/seo` barrel. Explicit subpaths keep runtime intent and dependency\nboundaries visible.\n\n## Quick start\n\n```ts\nimport { defineSeoPage, defineSeoSite } from '@alufie/seo/defaults';\nimport { resolveSeoPage } from '@alufie/seo/resolve';\nimport { buildArticleSchema, buildOrgSchema, buildSiteSchema } from '@alufie/seo/schemas';\n\nconst site = defineSeoSite({\n\tsiteName: 'Example',\n\tsiteUrl: 'https://example.com',\n\tdescription: 'Example site',\n\tschemas: [\n\t\tbuildOrgSchema({\n\t\t\tname: 'Example',\n\t\t\turl: 'https://example.com'\n\t\t}),\n\t\tbuildSiteSchema({\n\t\t\tname: 'Example',\n\t\t\turl: 'https://example.com'\n\t\t})\n\t]\n});\n\nconst routeSeo = defineSeoPage({\n\ttitle: 'Guide',\n\tdescription: 'A practical guide.',\n\tschemas: [\n\t\tbuildArticleSchema({\n\t\t\theadline: 'Guide',\n\t\t\tdescription: 'A practical guide.',\n\t\t\turl: 'https://example.com/guides/example'\n\t\t})\n\t]\n});\n\nconst seo = resolveSeoPage({\n\tsite,\n\tlayers: [routeSeo],\n\troutePath: '/guides/example',\n\tpageUrl: 'https://www.example.com/guides/example?preview=1',\n\tcanonicalMode: 'site-origin'\n});\n```\n\nThe result contains the final title, canonical, robots value, Open Graph and Twitter inputs,\nalternates, and composed schemas.\n\n## Ordered metadata layers\n\n`layers` is an ordered list of plain `SeoInput` objects. Later values override earlier scalar\nvalues. Schema arrays compose instead of replacing one another; a later schema with the same\n`@id` replaces the earlier entity while unrelated entities remain.\n\nUse `image: null` in a later layer to clear an inherited site or section image explicitly.\n\n```ts\nconst seo = resolveSeoPage({\n\tsite,\n\tlayers: [sectionDefaults, generatedMetadata, routeOverrides],\n\tpageUrl: url,\n\tcanonicalMode: 'site-origin'\n});\n```\n\nThe package does not assign meaning to a layer. It can come from code, content, a CMS, a database,\nor any other application-owned source.\n\n## Canonical policies\n\n`resolveSeoPage()` supports:\n\n- `strip-query` — default; removes query and fragment from the selected URL\n- `full-url` — keeps query and fragment and resolves relative values against a valid `siteUrl`\n- `path-only` — returns the path, query, and fragment without an origin\n- `site-origin` — forces the pathname onto the configured HTTP(S) `site.siteUrl` origin\n\n`site-origin` accepts same-origin absolute canonicals and relative canonicals. Foreign or\nmalformed explicit values are ignored. If `siteUrl` is missing or invalid, resolution fails\nclosed to a relative current-page or route path rather than returning an unverified origin.\n\n`full-url` emits only an absolute HTTP(S) canonical. When a selected value is relative, `siteUrl`\nmust provide a valid origin; otherwise the resolver omits the canonical.\n\nThis policy is generic: applications choose the canonical origin through `siteUrl`; the package\ncontains no consumer-specific hostname logic.\n\n## JSON-LD and schemas\n\n`buildSeoJsonLd()`:\n\n- emits an empty string when there are no schemas\n- removes structurally duplicate schemas regardless of object key order\n- preserves composed entities\n- serializes one entity as an object and multiple entities as an array\n- escapes `<` as `\\u003c` for safe embedding in a script element\n\nSchema builders default to safe mode. Safe mode trims strings and URLs, removes empty optional\nvalues, filters unusable collection entries, and supplies a fallback for missing required names.\n\n```ts\nconst breadcrumb = buildBreadcrumbSchema({\n\titemListElement: [\n\t\t{ name: ' Home ', item: ' https://example.com ' },\n\t\t{ name: page.title, item: canonical, fallbackName: 'Page' }\n\t]\n});\n```\n\nUse strict mode in tests, CI, or authoring workflows where incomplete required data, malformed\nHTTP(S) URL fields, empty entity references, or non-finite numbers must fail. Supply `id` to any\nfirst-party builder when the entity needs a stable replacement key across metadata layers:\n\n```ts\nconst article = buildArticleSchema(\n\t{\n\t\theadline: page.title,\n\t\turl: canonical\n\t},\n\t{ mode: 'strict', id: '#article' }\n);\n```\n\nProduct helpers cover identifiers, categories, aggregate ratings, offers, and variant relationships.\nUse `buildProductGroupSchema()` with `productGroupID`, `variesBy`, and `hasVariant`; variants can\nreference the group through `isVariantOf` or `inProductGroupWithID`.\n\n`buildCustomSchema()` remains the explicit escape hatch for unsupported schema.org shapes.\n`validateSchemaStructure()` reports structural errors, including missing `@type`, missing or invalid\n`@context`, malformed nested URLs, non-finite numbers, and non-serializable values.\n`validateSchemas()` returns those errors plus search-feature eligibility warnings.\nFAQPage, HowTo, and SearchAction can remain valid schema.org markup even when a search engine no\nlonger displays their former rich result.\n\n## Robots controls\n\nBuild page-level directives:\n\n```ts\nimport { buildRobotsMeta } from '@alufie/seo/robots';\n\nconst robots = buildRobotsMeta({\n\tindex: true,\n\tfollow: true,\n\tmaxImagePreview: 'large'\n});\n```\n\nBuild `robots.txt`:\n\n```ts\nimport { buildAiCrawlerRules, buildRobotsTxt } from '@alufie/seo/robots';\n\nconst body = buildRobotsTxt({\n\trules: [\n\t\t{ userAgent: '*', allow: '/', disallow: ['/admin/'] },\n\t\t...buildAiCrawlerRules({\n\t\t\topenAi: { search: 'allow', training: 'disallow', userFetch: 'allow' },\n\t\t\tanthropic: { search: 'allow', training: 'disallow', userFetch: 'allow' }\n\t\t})\n\t],\n\tsitemaps: 'https://example.com/sitemap.xml'\n});\n```\n\nSearch discovery, model training, and user-directed retrieval are separate controls. Configure\neach purpose explicitly; do not treat one crawler token as a universal AI switch.\n`buildRobotsTxt()` rejects CR/LF characters in user-agent, path, and sitemap values.\n\n## Validation\n\n```ts\nimport { validateSeoInput } from '@alufie/seo/validate';\n\nconst result = validateSeoInput(routeSeo, {\n\tcanonicalMode: 'site-origin',\n\tsiteUrl: site.siteUrl\n});\n\nif (!result.valid) {\n\tconsole.error(result.errors);\n}\n\nconsole.warn(result.warnings);\n```\n\nRelative canonicals are accepted only when a valid `site-origin` policy supplies the resolution\norigin. Images and alternate URLs remain absolute HTTP(S) URLs. Schema structure participates in\n`valid`; search-feature eligibility remains available separately through `warnings`.\n\n## Optional Svelte rendering\n\n```svelte\n<script lang=\"ts\">\n\timport { SeoHead } from '@alufie/seo/svelte';\n\timport type { SeoResult } from '@alufie/seo/types';\n\n\tinterface Props {\n\t\tseo: SeoResult;\n\t}\n\n\tlet { seo }: Props = $props();\n</script>\n\n<SeoHead {seo} />\n```\n\n`SeoHead` renders the title, canonical, alternates, robots, description, Open Graph, Twitter,\narticle metadata, and JSON-LD. It never emits the obsolete meta keywords tag.\n\nApplications that use another framework can render `SeoResult`, `buildSeoTags()`, and\n`buildSeoJsonLd()` directly without installing Svelte.\n\n## Migrating from 0.1\n\nVersion 0.2 is intentionally breaking:\n\n- replace `db` and `file` resolver properties with ordered `layers`\n- replace `createSeoConfig({ site })` with `defineSeoSite(site)`\n- remove `@alufie/seo/drizzle`, `@alufie/seo/editor`, editor components, and form presets\n- keep persistence and administrative metadata workflows in the consuming application\n- install Svelte only when importing `@alufie/seo/svelte`\n\n## Development\n\n```bash\npnpm test\npnpm check\npnpm build\n```\n\nThe publish gate runs all three commands. The package contents are restricted by the `files`\nlist in `package.json`.\n\nPrimary references:\n\n- [Svelte package authoring](https://svelte.dev/docs/kit/packaging)\n- [Schema.org](https://schema.org/)\n- [Google Product variant structured data](https://developers.google.com/search/docs/appearance/structured-data/product-variants)\n- [Google robots meta documentation](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag)\n- [OpenAI crawler documentation](https://developers.openai.com/api/docs/bots)\n- [Anthropic crawler documentation](https://privacy.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler)\n","readmeFilename":"README.md"}