@better-seo/core 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/plugins.ts","../src/schema-dedupe.ts","../src/core.ts","../src/schema.ts","../src/serialize.ts","../src/render.ts","../src/validate.ts","../src/adapters/registry.ts","../src/context.ts","../src/singleton.ts","../src/voila.ts","../src/rules.ts","../src/migrate.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/** Stable codes for programmatic handling (enterprise / observability). */\nexport type SEOErrorCode =\n | \"VALIDATION\"\n | \"ADAPTER_NOT_FOUND\"\n | \"MIGRATE_NOT_IMPLEMENTED\"\n | \"USE_SEO_NOT_AVAILABLE\"\n\nconst messages: Record<SEOErrorCode, string> = {\n VALIDATION: \"Invalid or incomplete SEO input.\",\n ADAPTER_NOT_FOUND:\n \"No adapter registered for this framework. Import the adapter package (e.g. @better-seo/next) before calling seoForFramework.\",\n MIGRATE_NOT_IMPLEMENTED:\n \"Migration helpers are not implemented yet. Track Roadmap Wave 12 / FEATURES C15.\",\n USE_SEO_NOT_AVAILABLE:\n \"useSEO is provided by @better-seo/react (Roadmap Wave 5 / FEATURES V3). App Router metadata should use seo() / prepareNextSeo from @better-seo/next.\",\n}\n\nexport class SEOError extends Error {\n readonly code: SEOErrorCode\n override readonly cause?: unknown\n\n constructor(code: SEOErrorCode, message?: string, options?: { cause?: unknown }) {\n const base = message ?? messages[code]\n super(`[@better-seo/core] [${code}]: ${base}`)\n this.name = \"SEOError\"\n this.code = code\n this.cause = options?.cause\n }\n}\n\nexport function isSEOError(e: unknown): e is SEOError {\n return e instanceof SEOError\n}\n","import type { SEO, SEOConfig, SEOInput, SEOPlugin } from \"./types.js\"\n\nexport function defineSEOPlugin(plugin: SEOPlugin): SEOPlugin {\n return plugin\n}\n\nexport function runBeforeMergePlugins(input: SEOInput, config?: SEOConfig): SEOInput {\n const list = config?.plugins ?? []\n let acc = input\n for (const p of list) {\n acc = p.beforeMerge?.(acc, { config }) ?? acc\n }\n return acc\n}\n\nexport function runAfterMergePlugins(seo: SEO, config?: SEOConfig): SEO {\n const list = config?.plugins ?? []\n let acc = seo\n for (const p of list) {\n acc = p.afterMerge?.(acc, { config }) ?? acc\n }\n return acc\n}\n","import type { JSONLD } from \"./types.js\"\n\n/**\n * When the same `@id` + `@type` appears more than once, keep the last occurrence (child-over-parent semantics).\n * Nodes without both `@id` and `@type` string are kept in order.\n */\nexport function dedupeSchemaByIdAndType(schemas: readonly JSONLD[]): JSONLD[] {\n type Key = string\n const lastIndexByKey = new Map<Key, number>()\n for (let i = 0; i < schemas.length; i++) {\n const node = schemas[i]\n if (!node) continue\n const id = node[\"@id\"]\n const type = node[\"@type\"]\n if (typeof id === \"string\" && typeof type === \"string\") {\n lastIndexByKey.set(`${type}::${id}`, i)\n }\n }\n const drop = new Set<number>()\n for (let i = 0; i < schemas.length; i++) {\n const node = schemas[i]\n if (!node) continue\n const id = node[\"@id\"]\n const type = node[\"@type\"]\n if (typeof id === \"string\" && typeof type === \"string\") {\n const k = `${type}::${id}`\n if (lastIndexByKey.get(k) !== i) drop.add(i)\n }\n }\n return schemas.filter((_, i) => !drop.has(i))\n}\n","import { SEOError } from \"./errors.js\"\nimport type { JSONLD, SEO, SEOConfig, SEOInput } from \"./types.js\"\nimport { runAfterMergePlugins, runBeforeMergePlugins } from \"./plugins.js\"\nimport { dedupeSchemaByIdAndType } from \"./schema-dedupe.js\"\n\nfunction applyTitleTemplate(title: string, template: string | undefined): string {\n if (!template) return title\n return template.includes(\"%s\") ? template.replace(/%s/g, title) : `${title} ${template}`.trim()\n}\n\nfunction resolveCanonical(\n canonical: string | undefined,\n baseUrl: string | undefined,\n): string | undefined {\n if (!canonical) return undefined\n if (canonical.startsWith(\"http://\") || canonical.startsWith(\"https://\")) return canonical\n if (!baseUrl) return canonical\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl\n const path = canonical.startsWith(\"/\") ? canonical : `/${canonical}`\n return `${base}${path}`\n}\n\nfunction mergeSchema(parent: readonly JSONLD[], child: readonly JSONLD[]): JSONLD[] {\n return [...parent, ...child]\n}\n\n/** Normalize partial + config into a canonical `SEO` document (Wave 1 baseline). */\nexport function createSEO(input: SEOInput, config?: SEOConfig): SEO {\n const mergedInput = runBeforeMergePlugins(input, config)\n\n const rawTitle = mergedInput.meta?.title ?? mergedInput.title\n const title = typeof rawTitle === \"string\" ? rawTitle.trim() : \"\"\n if (!title) {\n throw new SEOError(\"VALIDATION\", \"title is required (set meta.title or top-level title).\")\n }\n\n const description = mergedInput.meta?.description ?? mergedInput.description\n const canonical = resolveCanonical(\n mergedInput.meta?.canonical ?? mergedInput.canonical,\n config?.baseUrl,\n )\n const robots = mergedInput.meta?.robots ?? mergedInput.robots ?? config?.defaultRobots\n const langMap = mergedInput.meta?.alternates?.languages\n const alternates =\n langMap !== undefined && Object.keys(langMap).length > 0 ? { languages: langMap } : undefined\n\n const meta: SEO[\"meta\"] = {\n title: applyTitleTemplate(title, config?.titleTemplate),\n ...(description !== undefined ? { description } : {}),\n ...(canonical !== undefined ? { canonical } : {}),\n ...(robots !== undefined ? { robots } : {}),\n ...(alternates !== undefined ? { alternates } : {}),\n }\n\n const mergeOg = config?.features?.openGraphMerge !== false\n const ogBase = mergedInput.openGraph ?? {}\n const ogTitle = mergeOg\n ? (mergedInput.openGraph?.title ?? meta.title)\n : mergedInput.openGraph?.title\n const ogDesc = mergeOg\n ? (mergedInput.openGraph?.description ?? meta.description)\n : mergedInput.openGraph?.description\n\n let openGraph: SEO[\"openGraph\"] | undefined\n if (mergeOg) {\n openGraph = {\n ...ogBase,\n title: ogTitle ?? meta.title,\n ...(ogDesc !== undefined ? { description: ogDesc } : {}),\n }\n } else if (Object.keys(ogBase).length > 0 || ogTitle !== undefined || ogDesc !== undefined) {\n openGraph = {\n ...ogBase,\n ...(ogTitle !== undefined ? { title: ogTitle } : {}),\n ...(ogDesc !== undefined ? { description: ogDesc } : {}),\n }\n }\n\n const ogFirstImage = mergedInput.openGraph?.images?.[0]?.url\n const twTitle = mergedInput.twitter?.title ?? meta.title\n const twDesc = mergedInput.twitter?.description ?? meta.description\n const twImage = mergedInput.twitter?.image ?? (mergeOg ? ogFirstImage : undefined)\n const twitter: NonNullable<SEO[\"twitter\"]> = {\n ...(mergedInput.twitter ?? {}),\n card: mergedInput.twitter?.card ?? \"summary_large_image\",\n title: twTitle,\n ...(twDesc !== undefined ? { description: twDesc } : {}),\n ...(twImage !== undefined ? { image: twImage } : {}),\n }\n\n const parentSchema: readonly JSONLD[] = []\n let childSchema = mergedInput.schema ?? []\n if (\n config?.schemaMerge &&\n typeof config.schemaMerge === \"object\" &&\n config.schemaMerge.dedupeByIdAndType === true\n ) {\n childSchema = dedupeSchemaByIdAndType(childSchema)\n }\n const schema = mergeSchema(parentSchema, childSchema)\n\n const doc: SEO = {\n meta,\n ...(openGraph !== undefined ? { openGraph } : {}),\n twitter,\n schema,\n }\n\n let out = runAfterMergePlugins(doc, config)\n if (config?.features?.jsonLd === false) {\n out = { ...out, schema: [] }\n }\n return out\n}\n\n/** Child wins for scalars; schemas concatenate (baseline). */\nfunction mergeLanguageAlternates(\n parent?: Readonly<Record<string, string>>,\n child?: Readonly<Record<string, string>>,\n): Readonly<Record<string, string>> | undefined {\n const merged = { ...parent, ...child }\n return Object.keys(merged).length > 0 ? merged : undefined\n}\n\n/** Merge parent `SEO` with child input (featured as `withSEO` in docs / Next package). */\nexport function withSEO(parent: SEO, child: SEOInput, config?: SEOConfig): SEO {\n return mergeSEO(parent, child, config)\n}\n\nexport function mergeSEO(parent: SEO, child: SEOInput, config?: SEOConfig): SEO {\n const pMeta = parent.meta\n const cMeta = child.meta ?? {}\n const { alternates: pAlt, ...pRest } = pMeta\n const { alternates: cAlt, ...cRest } = cMeta\n const mergedLang = mergeLanguageAlternates(pAlt?.languages, cAlt?.languages)\n const mergedAlternates = mergedLang !== undefined ? { languages: mergedLang } : undefined\n const mergedChild: SEOInput = {\n ...child,\n meta: {\n ...pRest,\n ...cRest,\n title: cRest.title ?? child.title ?? pMeta.title,\n description: cRest.description ?? child.description ?? pMeta.description,\n canonical: cRest.canonical ?? child.canonical ?? pMeta.canonical,\n robots: cRest.robots ?? child.robots ?? pMeta.robots,\n ...(mergedAlternates !== undefined ? { alternates: mergedAlternates } : {}),\n },\n openGraph: { ...(parent.openGraph ?? {}), ...child.openGraph },\n twitter: { ...(parent.twitter ?? {}), ...child.twitter },\n schema: [...parent.schema, ...(child.schema ?? [])],\n }\n return createSEO(mergedChild, config)\n}\n","import type { JSONLD } from \"./types.js\"\n\n/** WebPage helper — ensures `@context` + `@type`. */\nexport function webPage(parts: {\n readonly name: string\n readonly description?: string\n readonly url: string\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"WebPage\",\n name: parts.name,\n ...(parts.description !== undefined ? { description: parts.description } : {}),\n url: parts.url,\n }\n}\n\nexport function article(parts: {\n readonly headline: string\n readonly description?: string\n readonly datePublished?: string\n readonly url: string\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Article\",\n headline: parts.headline,\n ...(parts.description !== undefined ? { description: parts.description } : {}),\n ...(parts.datePublished !== undefined ? { datePublished: parts.datePublished } : {}),\n url: parts.url,\n }\n}\n\nexport function organization(parts: {\n readonly name: string\n readonly url?: string\n readonly logo?: string\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Organization\",\n name: parts.name,\n ...(parts.url !== undefined ? { url: parts.url } : {}),\n ...(parts.logo !== undefined ? { logo: parts.logo } : {}),\n }\n}\n\nexport function person(parts: { readonly name: string; readonly url?: string }): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Person\",\n name: parts.name,\n ...(parts.url !== undefined ? { url: parts.url } : {}),\n }\n}\n\nexport function product(parts: {\n readonly name: string\n readonly description?: string\n readonly sku?: string\n readonly image?: string\n readonly url: string\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Product\",\n name: parts.name,\n url: parts.url,\n ...(parts.description !== undefined ? { description: parts.description } : {}),\n ...(parts.sku !== undefined ? { sku: parts.sku } : {}),\n ...(parts.image !== undefined ? { image: parts.image } : {}),\n }\n}\n\nexport function breadcrumbList(parts: {\n readonly items: ReadonlyArray<{ readonly name: string; readonly url: string }>\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n itemListElement: parts.items.map((item, i) => ({\n \"@type\": \"ListItem\",\n position: i + 1,\n name: item.name,\n item: item.url,\n })),\n }\n}\n\nexport function faqPage(parts: {\n readonly questions: ReadonlyArray<{ readonly question: string; readonly answer: string }>\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"FAQPage\",\n mainEntity: parts.questions.map((q) => ({\n \"@type\": \"Question\",\n name: q.question,\n acceptedAnswer: { \"@type\": \"Answer\", text: q.answer },\n })),\n }\n}\n\n/** Technical / how-to article (docs templates, PRD §2.5). */\nexport function techArticle(parts: {\n readonly headline: string\n readonly description?: string\n readonly datePublished?: string\n readonly url: string\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"TechArticle\",\n headline: parts.headline,\n ...(parts.description !== undefined ? { description: parts.description } : {}),\n ...(parts.datePublished !== undefined ? { datePublished: parts.datePublished } : {}),\n url: parts.url,\n }\n}\n\n/** Escape hatch for custom `@type` graphs (caller owns validity). */\nexport function customSchema(node: JSONLD): JSONLD {\n return node\n}\n","import type { JSONLD } from \"./types.js\"\nimport { SEOError } from \"./errors.js\"\n\n/**\n * Validates JSON-LD node structure before serialization.\n * Prevents prototype pollution and ensures @context safety.\n *\n * @param node - The JSON-LD node to validate\n * @param path - Current path in the object (for error messages)\n * @throws {SEOError} If validation fails\n */\nfunction validateJSONLDNode(node: unknown, path = \"root\"): void {\n if (node === null || node === undefined) {\n throw new SEOError(\"VALIDATION\", `JSON-LD node at ${path} is null or undefined`)\n }\n\n if (typeof node !== \"object\") {\n throw new SEOError(\"VALIDATION\", `JSON-LD node at ${path} must be an object`)\n }\n\n const obj = node as Record<string, unknown>\n\n // Validate @context if present\n if (\"@context\" in obj) {\n const context = obj[\"@context\"]\n if (typeof context === \"string\") {\n // Only allow schema.org context\n if (context !== \"https://schema.org\" && !context.startsWith(\"https://schema.org/\")) {\n console.warn(\n `[@better-seo/core] Non-standard @context at ${path}: ${context}. ` +\n \"Only https://schema.org is recommended for security.\",\n )\n }\n } else if (typeof context !== \"object\" || context === null) {\n throw new SEOError(\"VALIDATION\", `@context at ${path} must be a string or object`)\n }\n }\n\n // Validate @type if present\n if (\"@type\" in obj) {\n const type = obj[\"@type\"]\n if (typeof type !== \"string\" || type.length === 0) {\n throw new SEOError(\"VALIDATION\", `@type at ${path} must be a non-empty string`)\n }\n // Warn on potentially dangerous types with HTML/special chars\n if (type.includes(\"<\") || type.includes(\">\") || type.includes('\"')) {\n throw new SEOError(\"VALIDATION\", `@type at ${path} contains invalid characters: ${type}`)\n }\n }\n\n // Recursively validate nested objects and prevent prototype pollution.\n // Use Reflect.ownKeys so JSON.parse-shaped payloads keep own \"__proto__\" keys\n // (object literal `__proto__:` sets [[Prototype]] and is invisible to Object.entries).\n for (const key of Reflect.ownKeys(obj)) {\n if (typeof key !== \"string\") {\n throw new SEOError(\"VALIDATION\", `JSON-LD keys at ${path} must be strings`)\n }\n const value = obj[key]\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n throw new SEOError(\"VALIDATION\", `Dangerous key \"${key}\" detected at ${path}`)\n }\n if (typeof value === \"object\" && value !== null) {\n validateJSONLDNode(value, `${path}.${key}`)\n }\n }\n}\n\n/**\n * Single JSON-LD serialization path — `JSON.stringify` on the whole graph only (ARCHITECTURE §7).\n * Includes validation to prevent prototype pollution and XSS attacks.\n * For multiple nodes, callers may pass an array; consumers typically emit one script tag per call.\n *\n * @param data - JSON-LD node or array of nodes to serialize\n * @returns JSON string suitable for embedding in <script type=\"application/ld+json\">\n * @throws {SEOError} If validation fails\n *\n * @security Validates against prototype pollution, ensures @context is schema.org,\n * and properly escapes all user content via JSON.stringify\n */\nexport function serializeJSONLD(data: JSONLD | readonly JSONLD[]): string {\n // Validate structure before serialization\n if (Array.isArray(data)) {\n data.forEach((node, index) => validateJSONLDNode(node, `array[${index}]`))\n } else {\n validateJSONLDNode(data, \"root\")\n }\n\n // Deep clone to prevent prototype pollution\n const sanitized = JSON.parse(JSON.stringify(data)) as JSONLD | JSONLD[]\n\n // Final serialization with proper escaping for HTML embedding\n // JSON.stringify escapes </script> as <\\/script> and handles U+2028/U+2029\n return JSON.stringify(sanitized)\n}\n","import type { SEO, TagDescriptor } from \"./types.js\"\nimport { serializeJSONLD } from \"./serialize.js\"\n\n/** Vanilla tag list for snapshots and non-framework hosts (ARCHITECTURE §8). */\nexport function renderTags(seo: SEO): TagDescriptor[] {\n const tags: TagDescriptor[] = []\n tags.push({ kind: \"meta\", name: \"title\", content: seo.meta.title })\n if (seo.meta.description) {\n tags.push({ kind: \"meta\", name: \"description\", content: seo.meta.description })\n }\n if (seo.meta.canonical) {\n tags.push({ kind: \"link\", rel: \"canonical\", href: seo.meta.canonical })\n }\n if (seo.meta.robots) {\n tags.push({ kind: \"meta\", name: \"robots\", content: seo.meta.robots })\n }\n const langs = seo.meta.alternates?.languages\n if (langs) {\n for (const [hreflang, href] of Object.entries(langs)) {\n tags.push({ kind: \"link\", rel: \"alternate\", hreflang, href })\n }\n }\n if (seo.openGraph?.title) {\n tags.push({ kind: \"meta\", property: \"og:title\", content: seo.openGraph.title })\n }\n if (seo.openGraph?.description) {\n tags.push({ kind: \"meta\", property: \"og:description\", content: seo.openGraph.description })\n }\n const ogImages = seo.openGraph?.images\n if (ogImages?.length) {\n const first = ogImages[0]\n if (first?.url) tags.push({ kind: \"meta\", property: \"og:image\", content: first.url })\n if (first?.width !== undefined) {\n tags.push({ kind: \"meta\", property: \"og:image:width\", content: String(first.width) })\n }\n if (first?.height !== undefined) {\n tags.push({ kind: \"meta\", property: \"og:image:height\", content: String(first.height) })\n }\n if (first?.alt) tags.push({ kind: \"meta\", property: \"og:image:alt\", content: first.alt })\n }\n if (seo.twitter?.card) {\n tags.push({ kind: \"meta\", name: \"twitter:card\", content: seo.twitter.card })\n }\n if (seo.twitter?.title) {\n tags.push({ kind: \"meta\", name: \"twitter:title\", content: seo.twitter.title })\n }\n if (seo.twitter?.description) {\n tags.push({ kind: \"meta\", name: \"twitter:description\", content: seo.twitter.description })\n }\n if (seo.twitter?.image) {\n tags.push({ kind: \"meta\", name: \"twitter:image\", content: seo.twitter.image })\n }\n for (const node of seo.schema) {\n tags.push({ kind: \"script-jsonld\", json: serializeJSONLD(node) })\n }\n return tags\n}\n","import type { SEO } from \"./types.js\"\n\nexport type ValidationSeverity = \"warning\" | \"error\"\n\n/** Stable machine-readable codes (PRD §3.5 / observability). */\nexport type ValidationIssueCode =\n | \"TITLE_EMPTY\"\n | \"TITLE_TOO_LONG\"\n | \"DESCRIPTION_MISSING\"\n | \"DESCRIPTION_REQUIRED\"\n | \"DESCRIPTION_TOO_LONG\"\n | \"OG_IMAGE_NARROW\"\n | \"SCHEMA_MISSING_TYPE\"\n\nexport interface ValidationIssue {\n readonly code: ValidationIssueCode\n readonly field: string\n readonly message: string\n readonly severity: ValidationSeverity\n}\n\nexport interface ValidateSEOOptions {\n /** When false, validation is a no-op (production / Edge bundles). */\n readonly enabled?: boolean\n /** When true, missing description is `error` instead of `warning`. */\n readonly requireDescription?: boolean\n /** In non-production only: when not false, log each issue to console.warn (default: true). */\n readonly log?: boolean\n readonly titleMaxLength?: number\n readonly descriptionMaxLength?: number\n}\n\nfunction shouldRun(options?: ValidateSEOOptions): boolean {\n if (options?.enabled === false) return false\n\n // Safe environment check - handles Edge, browser, and bundler polyfills\n const isProduction =\n typeof process !== \"undefined\" &&\n typeof process.env === \"object\" &&\n process.env !== null &&\n process.env.NODE_ENV === \"production\"\n\n if (isProduction) return false\n return true\n}\n\n/**\n * Development-oriented checks — no heavy deps (ARCHITECTURE §12).\n * Returns structured issues; set `log: false` to consume programmatically without console noise.\n */\nexport function validateSEO(seo: SEO, options?: ValidateSEOOptions): readonly ValidationIssue[] {\n if (!shouldRun(options)) return []\n\n const titleMax = options?.titleMaxLength ?? 60\n const descMax = options?.descriptionMaxLength ?? 165\n const log = options?.log !== false\n const requireDesc = options?.requireDescription === true\n const issues: ValidationIssue[] = []\n\n if (!seo.meta.title?.trim()) {\n issues.push({\n code: \"TITLE_EMPTY\",\n field: \"meta.title\",\n message: \"empty title\",\n severity: \"error\",\n })\n } else if (seo.meta.title.length > titleMax) {\n issues.push({\n code: \"TITLE_TOO_LONG\",\n field: \"meta.title\",\n message: `length ${seo.meta.title.length} exceeds recommended ${titleMax}`,\n severity: \"warning\",\n })\n }\n\n if (!seo.meta.description?.trim()) {\n issues.push({\n code: requireDesc ? \"DESCRIPTION_REQUIRED\" : \"DESCRIPTION_MISSING\",\n field: \"meta.description\",\n message: requireDesc ? \"description is required\" : \"missing description\",\n severity: requireDesc ? \"error\" : \"warning\",\n })\n } else if (seo.meta.description.length > descMax) {\n issues.push({\n code: \"DESCRIPTION_TOO_LONG\",\n field: \"meta.description\",\n message: `length ${seo.meta.description.length} exceeds recommended ${descMax}`,\n severity: \"warning\",\n })\n }\n\n const firstOg = seo.openGraph?.images?.[0]\n if (firstOg?.width !== undefined && firstOg.width < 1200) {\n issues.push({\n code: \"OG_IMAGE_NARROW\",\n field: \"openGraph.images[0].width\",\n message: \"OG image width under 1200px\",\n severity: \"warning\",\n })\n }\n\n for (let i = 0; i < seo.schema.length; i++) {\n const node = seo.schema[i]\n if (!node?.[\"@type\"]) {\n issues.push({\n code: \"SCHEMA_MISSING_TYPE\",\n field: `schema[${i}]`,\n message: \"missing @type\",\n severity: \"error\",\n })\n }\n }\n\n if (log) {\n for (const i of issues) {\n console.warn(\n `[@better-seo/core] validateSEO [${i.severity}] ${i.code} ${i.field}: ${i.message}`,\n )\n }\n }\n\n return issues\n}\n","import type { SEOAdapter } from \"../types.js\"\nimport { SEOError } from \"../errors.js\"\n\nconst adapters = new Map<string, SEOAdapter<unknown>>()\n\n/**\n * Validates adapter ID to prevent namespace collisions and malicious overrides.\n *\n * @param id - The adapter ID to validate\n * @throws {SEOError} If adapter ID is invalid\n */\nfunction validateAdapterId(id: string): void {\n if (!id || typeof id !== \"string\") {\n throw new SEOError(\"VALIDATION\", \"Adapter ID must be a non-empty string\")\n }\n\n // Prevent extremely long IDs (DoS prevention)\n if (id.length > 64) {\n throw new SEOError(\"VALIDATION\", `Adapter ID too long: ${id.length} chars (max 64)`)\n }\n\n // Only allow alphanumeric, dash, underscore (prevents path traversal, etc.)\n if (!/^[a-zA-Z0-9_-]+$/.test(id)) {\n throw new SEOError(\"VALIDATION\", `Adapter ID contains invalid characters: ${id}`)\n }\n\n // Warn on overriding existing adapter (supply chain attack detection)\n if (adapters.has(id)) {\n console.warn(\n `[@better-seo/core] Overriding existing adapter: \"${id}\". ` +\n \"This may indicate a dependency conflict or malicious package.\",\n )\n }\n}\n\n/**\n * Register an adapter implementation.\n *\n * ⚠️ **SECURITY**: Only register adapters from trusted sources.\n * Malicious adapters can intercept and modify SEO data.\n *\n * @param adapter - The adapter to register\n * @throws {SEOError} If adapter ID is invalid or adapter is not an object\n *\n * @example\n * ```ts\n * import { registerAdapter } from '@better-seo/core'\n *\n * registerAdapter({\n * id: 'my-framework',\n * toFramework: (seo) => { /* conversion logic *\\/ }\n * })\n * ```\n */\nexport function registerAdapter<T>(adapter: SEOAdapter<T>): void {\n if (!adapter || typeof adapter !== \"object\") {\n throw new SEOError(\"VALIDATION\", \"Adapter must be an object\")\n }\n\n validateAdapterId(adapter.id)\n adapters.set(adapter.id, adapter)\n}\n\nexport function getAdapter<T = unknown>(id: string): SEOAdapter<T> | undefined {\n return adapters.get(id) as SEOAdapter<T> | undefined\n}\n\nexport function listAdapterIds(): string[] {\n return [...adapters.keys()]\n}\n","import { createSEO, mergeSEO } from \"./core.js\"\nimport type { SEO, SEOConfig, SEOInput } from \"./types.js\"\n\nexport interface SEOContext {\n readonly config: SEOConfig\n /** Request-scoped `createSEO` with bound config + plugins. */\n readonly createSEO: (input: SEOInput) => SEO\n readonly mergeSEO: (parent: SEO, child: SEOInput) => SEO\n}\n\n/**\n * Preferred production pattern for multi-tenant / Edge — explicit config, no filesystem inference (ARCHITECTURE §13).\n */\nexport function createSEOContext(config: SEOConfig): SEOContext {\n return {\n config,\n createSEO: (input: SEOInput) => createSEO(input, config),\n mergeSEO: (parent: SEO, child: SEOInput) => mergeSEO(parent, child, config),\n }\n}\n","import type { SEOConfig } from \"./types.js\"\n\nlet globalConfig: SEOConfig | undefined\n\n/**\n * ⚠️ **SECURITY WARNING**: Global state is NOT safe for multi-tenant or serverless environments.\n *\n * This function stores config in module-level global state, which can leak between:\n * - Different users in serverless functions (Vercel, Netlify, Cloudflare Workers)\n * - Concurrent requests in Node.js servers\n * - Different tenants in multi-tenant applications\n *\n * **DO NOT USE** in:\n * - Server-side rendering (SSR) with multiple users\n * - Edge functions or Workers\n * - Multi-tenant SaaS applications\n * - Any environment where config must be isolated per request\n *\n * **SAFE ALTERNATIVE:** Use `createSEOContext()` for request-scoped configuration.\n *\n * @deprecated Use `createSEOContext()` for production applications.\n * Only suitable for single-user, static sites or development.\n *\n * @param config - Global SEO configuration to store\n *\n * @see {@link createSEOContext} for request-scoped configuration\n * @see {@link internal-docs/ARCHITECTURE.md} §10 for runtime matrix\n * @see {@link internal-docs/USAGE.md} for security best practices\n */\nexport function initSEO(config: SEOConfig): void {\n // Security warning in development\n if (typeof process !== \"undefined\" && process.env?.NODE_ENV !== \"production\") {\n console.warn(\n \"[@better-seo/core] ⚠️ initSEO() uses global state and is NOT safe for \" +\n \"multi-tenant or serverless environments. Use createSEOContext() instead. \" +\n \"See: https://github.com/OWNER/better-seo-js/blob/main/internal-docs/ARCHITECTURE.md\",\n )\n }\n\n globalConfig = config\n}\n\n/**\n * Gets the global SEO config.\n *\n * @deprecated Use `createSEOContext()` for production applications.\n *\n * @returns The global SEO config, or undefined if not initialized\n *\n * @see {@link createSEOContext} for request-scoped configuration\n */\nexport function getGlobalSEOConfig(): SEOConfig | undefined {\n return globalConfig\n}\n\n/**\n * Resets the global SEO config.\n *\n * @internal Used for testing only\n */\nexport function resetSEOConfigForTests(): void {\n globalConfig = undefined\n}\n","import { createSEO } from \"./core.js\"\nimport { getAdapter } from \"./adapters/registry.js\"\nimport { SEOError } from \"./errors.js\"\nimport type { SEOConfig, SEOInput } from \"./types.js\"\n\n/**\n * Resolve via registered adapter — prefer `@better-seo/next`’s `seo()` for the Next voilà path.\n * @throws {SEOError} ADAPTER_NOT_FOUND when the adapter id was never registered\n */\nexport function seoForFramework<T>(adapterId: string, input: SEOInput, config?: SEOConfig): T {\n const adapter = getAdapter(adapterId)\n if (!adapter) {\n throw new SEOError(\n \"ADAPTER_NOT_FOUND\",\n `no adapter \"${adapterId}\" registered (import your framework package, e.g. @better-seo/next).`,\n )\n }\n const doc = createSEO(input, config)\n return adapter.toFramework(doc) as T\n}\n\n/**\n * Stub until `@better-seo/react` (Wave 5 / V3). Calling this makes missing peer support obvious in dev.\n * @throws {SEOError} USE_SEO_NOT_AVAILABLE\n */\nexport function useSEO(): never {\n throw new SEOError(\"USE_SEO_NOT_AVAILABLE\")\n}\n","import { createSEO, mergeSEO } from \"./core.js\"\nimport type { SEO, SEOConfig, SEOInput, SEORule } from \"./types.js\"\n\n/** Normalize path for comparison (leading slash, collapse slashes, trim trailing except root). */\nexport function normalizeRoutePath(path: string): string {\n if (!path || path === \"/\") return \"/\"\n const t = path.startsWith(\"/\") ? path : `/${path}`\n const c = t.replace(/\\/+/g, \"/\")\n return c.endsWith(\"/\") && c.length > 1 ? c.slice(0, -1) : c\n}\n\nfunction pathSegments(path: string): string[] {\n const n = normalizeRoutePath(path)\n if (n === \"/\") return []\n return n.slice(1).split(\"/\")\n}\n\nfunction matchSegment(pat: string, seg: string): boolean {\n if (pat === \"*\") return true\n if (pat.endsWith(\"*\") && pat.length > 1) {\n return seg.startsWith(pat.slice(0, -1))\n }\n return pat === seg\n}\n\n/** Segment glob: multi-segment and single-segment wildcards (see rules.test.ts). */\nexport function matchRouteGlob(pattern: string, route: string): boolean {\n const ps = pathSegments(pattern)\n const rs = pathSegments(route)\n const dfs = (pi: number, ri: number): boolean => {\n if (pi === ps.length) return ri === rs.length\n if (ps[pi] === \"**\") {\n if (dfs(pi + 1, ri)) return true\n if (ri < rs.length && dfs(pi, ri + 1)) return true\n return false\n }\n if (ri === rs.length) return false\n if (!matchSegment(ps[pi]!, rs[ri]!)) return false\n return dfs(pi + 1, ri + 1)\n }\n return dfs(0, 0)\n}\n\nfunction matchRouteLegacyStar(pattern: string, route: string): boolean {\n const prefix = pattern.slice(0, -1)\n const r = normalizeRoutePath(route)\n const p = normalizeRoutePath(prefix)\n if (r === p) return true\n return r.startsWith(prefix) || r.startsWith(`${p}/`)\n}\n\n/** One `*` per path segment (not `**`). */\nfunction matchSingleSegmentStars(pattern: string, route: string): boolean {\n const ps = pathSegments(pattern)\n const rs = pathSegments(route)\n if (ps.length !== rs.length) return false\n for (let i = 0; i < ps.length; i++) {\n if (!matchSegment(ps[i]!, rs[i]!)) return false\n }\n return true\n}\n\nexport function matchRoute(pattern: string, route: string): boolean {\n if (pattern === \"*\") return true\n const r = route || \"/\"\n if (pattern.includes(\"**\")) {\n return matchRouteGlob(pattern, r)\n }\n /** Trailing `*` only → legacy full-path prefix (`/blog/*`, `/api*`). */\n if (pattern.endsWith(\"*\") && pattern.indexOf(\"*\") === pattern.length - 1) {\n return matchRouteLegacyStar(pattern, r)\n }\n if (pattern.includes(\"*\")) {\n return matchSingleSegmentStars(pattern, r)\n }\n return normalizeRoutePath(r) === normalizeRoutePath(pattern)\n}\n\n/**\n * Pure rule matcher — `**` segment globs + legacy `prefix*` path match (ARCHITECTURE §11 subset).\n */\nexport function applyRules(route: string, rules: readonly SEORule[]): Partial<SEOInput> {\n /** Lower priority merged first; higher `priority` wins on duplicate keys (ARCHITECTURE §11). */\n const sorted = [...rules].sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0))\n let acc: Partial<SEOInput> = {}\n for (const rule of sorted) {\n if (matchRoute(rule.match, route)) {\n acc = { ...acc, ...rule.seo }\n }\n }\n return acc\n}\n\n/** Merge rule output into a base document (helper for adapters). */\nexport function applyRulesToSEO(\n route: string,\n base: SEO,\n rules: readonly SEORule[],\n config?: SEOConfig,\n): SEO {\n const partial = applyRules(route, rules)\n if (Object.keys(partial).length === 0) return base\n return mergeSEO(base, partial, config)\n}\n\n/** Convenience: rules → `createSEO`. */\nexport function createSEOForRoute(\n route: string,\n input: SEOInput,\n rules: readonly SEORule[],\n config?: SEOConfig,\n): SEO {\n const mergedInput: SEOInput = { ...applyRules(route, rules), ...input }\n return createSEO(mergedInput, config)\n}\n","import { SEOError } from \"./errors.js\"\n\n/**\n * Codemod-oriented helpers — stub until Wave 12 / CLI `migrate` (FEATURES C15).\n * @throws {SEOError} MIGRATE_NOT_IMPLEMENTED\n */\nexport function fromNextSeo(_nextSeoExport: unknown): never {\n void _nextSeoExport\n throw new SEOError(\"MIGRATE_NOT_IMPLEMENTED\")\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/plugins.ts","../src/schema-dedupe.ts","../src/core.ts","../src/schema.ts","../src/serialize.ts","../src/render.ts","../src/validate.ts","../src/adapters/registry.ts","../src/rules.ts","../src/context.ts","../src/singleton.ts","../src/voila.ts","../src/migrate.ts","../src/from-content.ts","../src/define-seo.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/** Stable codes for programmatic handling (enterprise / observability). */\nexport type SEOErrorCode =\n | \"VALIDATION\"\n | \"ADAPTER_NOT_FOUND\"\n | \"USE_SEO_NOT_AVAILABLE\"\n | \"USE_SEO_NO_PROVIDER\"\n\nconst messages: Record<SEOErrorCode, string> = {\n VALIDATION: \"Invalid or incomplete SEO input.\",\n ADAPTER_NOT_FOUND:\n \"No adapter registered for this framework. Import the adapter package (e.g. @better-seo/next) before calling seoForFramework.\",\n USE_SEO_NOT_AVAILABLE:\n \"useSEO is provided by @better-seo/react (Roadmap Wave 5 / FEATURES V3). App Router metadata should use seo() / prepareNextSeo from @better-seo/next.\",\n USE_SEO_NO_PROVIDER: \"useSEO() must be used within <SEOProvider> from @better-seo/react.\",\n}\n\nexport class SEOError extends Error {\n readonly code: SEOErrorCode\n override readonly cause?: unknown\n\n constructor(code: SEOErrorCode, message?: string, options?: { cause?: unknown }) {\n const base = message ?? messages[code]\n super(`[@better-seo/core] [${code}]: ${base}`)\n this.name = \"SEOError\"\n this.code = code\n this.cause = options?.cause\n }\n}\n\nexport function isSEOError(e: unknown): e is SEOError {\n return e instanceof SEOError\n}\n","import type { SEO, SEOConfig, SEOInput, SEOPlugin, TagDescriptor } from \"./types.js\"\n\nexport function defineSEOPlugin(plugin: SEOPlugin): SEOPlugin {\n return plugin\n}\n\nexport function runBeforeMergePlugins(input: SEOInput, config?: SEOConfig): SEOInput {\n const list = config?.plugins ?? []\n let acc = input\n for (const p of list) {\n acc = p.beforeMerge?.(acc, { config }) ?? acc\n }\n return acc\n}\n\nexport function runAfterMergePlugins(seo: SEO, config?: SEOConfig): SEO {\n const list = config?.plugins ?? []\n let acc = seo\n for (const p of list) {\n acc = p.afterMerge?.(acc, { config }) ?? acc\n }\n return acc\n}\n\nexport function runOnRenderTagPlugins(\n tags: readonly TagDescriptor[],\n seo: SEO,\n config?: SEOConfig,\n): TagDescriptor[] {\n const list = config?.plugins ?? []\n let acc: TagDescriptor[] = [...tags]\n for (const p of list) {\n const next = p.onRenderTags?.(acc, { seo, config })\n if (next !== undefined) acc = [...next]\n }\n return acc\n}\n","import type { JSONLD } from \"./types.js\"\n\n/**\n * When the same `@id` + `@type` appears more than once, keep the last occurrence (child-over-parent semantics).\n * Nodes without both `@id` and `@type` string are kept in order.\n */\nexport function dedupeSchemaByIdAndType(schemas: readonly JSONLD[]): JSONLD[] {\n type Key = string\n const lastIndexByKey = new Map<Key, number>()\n for (let i = 0; i < schemas.length; i++) {\n const node = schemas[i]\n if (!node) continue\n const id = node[\"@id\"]\n const type = node[\"@type\"]\n if (typeof id === \"string\" && typeof type === \"string\") {\n lastIndexByKey.set(`${type}::${id}`, i)\n }\n }\n const drop = new Set<number>()\n for (let i = 0; i < schemas.length; i++) {\n const node = schemas[i]\n if (!node) continue\n const id = node[\"@id\"]\n const type = node[\"@type\"]\n if (typeof id === \"string\" && typeof type === \"string\") {\n const k = `${type}::${id}`\n if (lastIndexByKey.get(k) !== i) drop.add(i)\n }\n }\n return schemas.filter((_, i) => !drop.has(i))\n}\n","import { SEOError } from \"./errors.js\"\nimport type { JSONLD, SEO, SEOConfig, SEOInput } from \"./types.js\"\nimport { runAfterMergePlugins, runBeforeMergePlugins } from \"./plugins.js\"\nimport { dedupeSchemaByIdAndType } from \"./schema-dedupe.js\"\n\nfunction applyTitleTemplate(title: string, template: string | undefined): string {\n if (!template) return title\n return template.includes(\"%s\") ? template.replace(/%s/g, title) : `${title} ${template}`.trim()\n}\n\nfunction resolveCanonical(\n canonical: string | undefined,\n baseUrl: string | undefined,\n): string | undefined {\n if (!canonical) return undefined\n if (canonical.startsWith(\"http://\") || canonical.startsWith(\"https://\")) return canonical\n if (!baseUrl) return canonical\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl\n const path = canonical.startsWith(\"/\") ? canonical : `/${canonical}`\n return `${base}${path}`\n}\n\nfunction mergeSchema(parent: readonly JSONLD[], child: readonly JSONLD[]): JSONLD[] {\n return [...parent, ...child]\n}\n\n/** Normalize partial + config into a canonical `SEO` document (Wave 1 baseline). */\nexport function createSEO(input: SEOInput, config?: SEOConfig): SEO {\n const mergedInput = runBeforeMergePlugins(input, config)\n\n const rawTitle = mergedInput.meta?.title ?? mergedInput.title\n const title = typeof rawTitle === \"string\" ? rawTitle.trim() : \"\"\n if (!title) {\n throw new SEOError(\"VALIDATION\", \"title is required (set meta.title or top-level title).\")\n }\n\n const description = mergedInput.meta?.description ?? mergedInput.description\n const canonical = resolveCanonical(\n mergedInput.meta?.canonical ?? mergedInput.canonical,\n config?.baseUrl,\n )\n const robots = mergedInput.meta?.robots ?? mergedInput.robots ?? config?.defaultRobots\n const langMap = mergedInput.meta?.alternates?.languages\n const alternates =\n langMap !== undefined && Object.keys(langMap).length > 0 ? { languages: langMap } : undefined\n\n const verification = mergedInput.meta?.verification\n const hasVer = Boolean(\n verification &&\n (verification.google ||\n verification.yahoo ||\n verification.yandex ||\n verification.me ||\n (verification.other !== undefined && Object.keys(verification.other).length > 0)),\n )\n\n const rawPag = mergedInput.meta?.pagination\n const pagination =\n rawPag?.previous !== undefined || rawPag?.next !== undefined\n ? {\n ...(rawPag.previous !== undefined ? { previous: rawPag.previous } : {}),\n ...(rawPag.next !== undefined ? { next: rawPag.next } : {}),\n }\n : undefined\n\n const meta: SEO[\"meta\"] = {\n title: applyTitleTemplate(title, config?.titleTemplate),\n ...(description !== undefined ? { description } : {}),\n ...(canonical !== undefined ? { canonical } : {}),\n ...(robots !== undefined ? { robots } : {}),\n ...(alternates !== undefined ? { alternates } : {}),\n ...(hasVer ? { verification } : {}),\n ...(pagination !== undefined ? { pagination } : {}),\n }\n\n const mergeOg = config?.features?.openGraphMerge !== false\n const ogBase = mergedInput.openGraph ?? {}\n const ogTitle = mergeOg\n ? (mergedInput.openGraph?.title ?? meta.title)\n : mergedInput.openGraph?.title\n const ogDesc = mergeOg\n ? (mergedInput.openGraph?.description ?? meta.description)\n : mergedInput.openGraph?.description\n\n let openGraph: SEO[\"openGraph\"] | undefined\n if (mergeOg) {\n openGraph = {\n ...ogBase,\n title: ogTitle ?? meta.title,\n ...(ogDesc !== undefined ? { description: ogDesc } : {}),\n }\n } else if (Object.keys(ogBase).length > 0 || ogTitle !== undefined || ogDesc !== undefined) {\n openGraph = {\n ...ogBase,\n ...(ogTitle !== undefined ? { title: ogTitle } : {}),\n ...(ogDesc !== undefined ? { description: ogDesc } : {}),\n }\n }\n\n const ogFirstImage = mergedInput.openGraph?.images?.[0]?.url\n const twTitle = mergedInput.twitter?.title ?? meta.title\n const twDesc = mergedInput.twitter?.description ?? meta.description\n const twImage = mergedInput.twitter?.image ?? (mergeOg ? ogFirstImage : undefined)\n const twitter: NonNullable<SEO[\"twitter\"]> = {\n ...(mergedInput.twitter ?? {}),\n card: mergedInput.twitter?.card ?? \"summary_large_image\",\n title: twTitle,\n ...(twDesc !== undefined ? { description: twDesc } : {}),\n ...(twImage !== undefined ? { image: twImage } : {}),\n }\n\n const parentSchema: readonly JSONLD[] = []\n let childSchema = mergedInput.schema ?? []\n if (\n config?.schemaMerge &&\n typeof config.schemaMerge === \"object\" &&\n config.schemaMerge.dedupeByIdAndType === true\n ) {\n childSchema = dedupeSchemaByIdAndType(childSchema)\n }\n const schema = mergeSchema(parentSchema, childSchema)\n\n const doc: SEO = {\n meta,\n ...(openGraph !== undefined ? { openGraph } : {}),\n twitter,\n schema,\n }\n\n let out = runAfterMergePlugins(doc, config)\n if (config?.features?.jsonLd === false) {\n out = { ...out, schema: [] }\n }\n return out\n}\n\n/** Child wins for scalars; schemas concatenate (baseline). */\nfunction mergeLanguageAlternates(\n parent?: Readonly<Record<string, string>>,\n child?: Readonly<Record<string, string>>,\n): Readonly<Record<string, string>> | undefined {\n const merged = { ...parent, ...child }\n return Object.keys(merged).length > 0 ? merged : undefined\n}\n\n/** Merge parent `SEO` with child input (featured as `withSEO` in docs / Next package). */\nexport function withSEO(parent: SEO, child: SEOInput, config?: SEOConfig): SEO {\n return mergeSEO(parent, child, config)\n}\n\nfunction mergeVerification(\n parent?: SEO[\"meta\"][\"verification\"],\n child?: SEO[\"meta\"][\"verification\"],\n): SEO[\"meta\"][\"verification\"] | undefined {\n if (!parent && !child) return undefined\n const o = {\n ...parent,\n ...child,\n other:\n parent?.other || child?.other\n ? { ...(parent?.other ?? {}), ...(child?.other ?? {}) }\n : undefined,\n }\n const has =\n o.google || o.yahoo || o.yandex || o.me || (o.other && Object.keys(o.other).length > 0)\n return has ? o : undefined\n}\n\nfunction mergePagination(\n parent?: SEO[\"meta\"][\"pagination\"],\n child?: SEO[\"meta\"][\"pagination\"],\n): SEO[\"meta\"][\"pagination\"] | undefined {\n if (!parent && !child) return undefined\n const out = {\n ...parent,\n ...child,\n }\n if (out.previous === undefined && out.next === undefined) return undefined\n return out\n}\n\nexport function mergeSEO(parent: SEO, child: SEOInput, config?: SEOConfig): SEO {\n const pMeta = parent.meta\n const cMeta = child.meta ?? {}\n const { alternates: pAlt, verification: pVer, pagination: pPag, ...pRest } = pMeta\n const { alternates: cAlt, verification: cVer, pagination: cPag, ...cRest } = cMeta\n const mergedLang = mergeLanguageAlternates(pAlt?.languages, cAlt?.languages)\n const mergedAlternates = mergedLang !== undefined ? { languages: mergedLang } : undefined\n const mergedVer = mergeVerification(pVer, cVer)\n const mergedPag = mergePagination(pPag, cPag)\n const mergedChild: SEOInput = {\n ...child,\n meta: {\n ...pRest,\n ...cRest,\n title: cRest.title ?? child.title ?? pMeta.title,\n description: cRest.description ?? child.description ?? pMeta.description,\n canonical: cRest.canonical ?? child.canonical ?? pMeta.canonical,\n robots: cRest.robots ?? child.robots ?? pMeta.robots,\n ...(mergedAlternates !== undefined ? { alternates: mergedAlternates } : {}),\n ...(mergedVer !== undefined ? { verification: mergedVer } : {}),\n ...(mergedPag !== undefined ? { pagination: mergedPag } : {}),\n },\n openGraph: { ...(parent.openGraph ?? {}), ...child.openGraph },\n twitter: { ...(parent.twitter ?? {}), ...child.twitter },\n schema: [...parent.schema, ...(child.schema ?? [])],\n }\n return createSEO(mergedChild, config)\n}\n","import type { JSONLD } from \"./types.js\"\n\n/** WebPage helper — ensures `@context` + `@type`. */\nexport function webPage(parts: {\n readonly name: string\n readonly description?: string\n readonly url: string\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"WebPage\",\n name: parts.name,\n ...(parts.description !== undefined ? { description: parts.description } : {}),\n url: parts.url,\n }\n}\n\nexport function article(parts: {\n readonly headline: string\n readonly description?: string\n readonly datePublished?: string\n readonly url: string\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Article\",\n headline: parts.headline,\n ...(parts.description !== undefined ? { description: parts.description } : {}),\n ...(parts.datePublished !== undefined ? { datePublished: parts.datePublished } : {}),\n url: parts.url,\n }\n}\n\nexport function organization(parts: {\n readonly name: string\n readonly url?: string\n readonly logo?: string\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Organization\",\n name: parts.name,\n ...(parts.url !== undefined ? { url: parts.url } : {}),\n ...(parts.logo !== undefined ? { logo: parts.logo } : {}),\n }\n}\n\nexport function person(parts: { readonly name: string; readonly url?: string }): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Person\",\n name: parts.name,\n ...(parts.url !== undefined ? { url: parts.url } : {}),\n }\n}\n\nexport function product(parts: {\n readonly name: string\n readonly description?: string\n readonly sku?: string\n readonly image?: string\n readonly url: string\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Product\",\n name: parts.name,\n url: parts.url,\n ...(parts.description !== undefined ? { description: parts.description } : {}),\n ...(parts.sku !== undefined ? { sku: parts.sku } : {}),\n ...(parts.image !== undefined ? { image: parts.image } : {}),\n }\n}\n\nexport function breadcrumbList(parts: {\n readonly items: ReadonlyArray<{ readonly name: string; readonly url: string }>\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n itemListElement: parts.items.map((item, i) => ({\n \"@type\": \"ListItem\",\n position: i + 1,\n name: item.name,\n item: item.url,\n })),\n }\n}\n\nexport function faqPage(parts: {\n readonly questions: ReadonlyArray<{ readonly question: string; readonly answer: string }>\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"FAQPage\",\n mainEntity: parts.questions.map((q) => ({\n \"@type\": \"Question\",\n name: q.question,\n acceptedAnswer: { \"@type\": \"Answer\", text: q.answer },\n })),\n }\n}\n\n/** Technical / how-to article (docs templates, PRD §2.5). */\nexport function techArticle(parts: {\n readonly headline: string\n readonly description?: string\n readonly datePublished?: string\n readonly url: string\n}): JSONLD {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"TechArticle\",\n headline: parts.headline,\n ...(parts.description !== undefined ? { description: parts.description } : {}),\n ...(parts.datePublished !== undefined ? { datePublished: parts.datePublished } : {}),\n url: parts.url,\n }\n}\n\n/** Escape hatch for custom `@type` graphs (caller owns validity). */\nexport function customSchema(node: JSONLD): JSONLD {\n return node\n}\n","import type { JSONLD } from \"./types.js\"\nimport { SEOError } from \"./errors.js\"\n\n/**\n * Validates JSON-LD node structure before serialization.\n * Prevents prototype pollution and ensures @context safety.\n *\n * @param node - The JSON-LD node to validate\n * @param path - Current path in the object (for error messages)\n * @throws {SEOError} If validation fails\n */\nfunction validateJSONLDNode(node: unknown, path = \"root\"): void {\n if (node === null || node === undefined) {\n throw new SEOError(\"VALIDATION\", `JSON-LD node at ${path} is null or undefined`)\n }\n\n if (typeof node !== \"object\") {\n throw new SEOError(\"VALIDATION\", `JSON-LD node at ${path} must be an object`)\n }\n\n const obj = node as Record<string, unknown>\n\n // Validate @context if present\n if (\"@context\" in obj) {\n const context = obj[\"@context\"]\n if (typeof context === \"string\") {\n // Only allow schema.org context\n if (context !== \"https://schema.org\" && !context.startsWith(\"https://schema.org/\")) {\n console.warn(\n `[@better-seo/core] Non-standard @context at ${path}: ${context}. ` +\n \"Only https://schema.org is recommended for security.\",\n )\n }\n } else if (typeof context !== \"object\" || context === null) {\n throw new SEOError(\"VALIDATION\", `@context at ${path} must be a string or object`)\n }\n }\n\n // Validate @type if present\n if (\"@type\" in obj) {\n const type = obj[\"@type\"]\n if (typeof type !== \"string\" || type.length === 0) {\n throw new SEOError(\"VALIDATION\", `@type at ${path} must be a non-empty string`)\n }\n // Warn on potentially dangerous types with HTML/special chars\n if (type.includes(\"<\") || type.includes(\">\") || type.includes('\"')) {\n throw new SEOError(\"VALIDATION\", `@type at ${path} contains invalid characters: ${type}`)\n }\n }\n\n // Recursively validate nested objects and prevent prototype pollution.\n // Use Reflect.ownKeys so JSON.parse-shaped payloads keep own \"__proto__\" keys\n // (object literal `__proto__:` sets [[Prototype]] and is invisible to Object.entries).\n for (const key of Reflect.ownKeys(obj)) {\n if (typeof key !== \"string\") {\n throw new SEOError(\"VALIDATION\", `JSON-LD keys at ${path} must be strings`)\n }\n const value = obj[key]\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n throw new SEOError(\"VALIDATION\", `Dangerous key \"${key}\" detected at ${path}`)\n }\n if (typeof value === \"object\" && value !== null) {\n validateJSONLDNode(value, `${path}.${key}`)\n }\n }\n}\n\n/**\n * Single JSON-LD serialization path — `JSON.stringify` on the whole graph only (ARCHITECTURE §7).\n * Includes validation to prevent prototype pollution and XSS attacks.\n * For multiple nodes, callers may pass an array; consumers typically emit one script tag per call.\n *\n * @param data - JSON-LD node or array of nodes to serialize\n * @returns JSON string suitable for embedding in <script type=\"application/ld+json\">\n * @throws {SEOError} If validation fails\n *\n * @security Validates against prototype pollution, ensures @context is schema.org,\n * and properly escapes all user content via JSON.stringify\n */\nexport function serializeJSONLD(data: JSONLD | readonly JSONLD[]): string {\n // Validate structure before serialization\n if (Array.isArray(data)) {\n data.forEach((node, index) => validateJSONLDNode(node, `array[${index}]`))\n } else {\n validateJSONLDNode(data, \"root\")\n }\n\n // Deep clone to prevent prototype pollution\n const sanitized = JSON.parse(JSON.stringify(data)) as JSONLD | JSONLD[]\n\n // Final serialization with proper escaping for HTML embedding\n // JSON.stringify escapes </script> as <\\/script> and handles U+2028/U+2029\n return JSON.stringify(sanitized)\n}\n","import type { SEO, SEOConfig, TagDescriptor } from \"./types.js\"\nimport { serializeJSONLD } from \"./serialize.js\"\nimport { runOnRenderTagPlugins } from \"./plugins.js\"\n\n/** Meta `name` for verification keys — aligned with Next.js output (see `metadata.generate/basic`). */\nfunction verificationMetaName(key: string): string {\n if (key === \"google\") return \"google-site-verification\"\n if (key === \"yahoo\") return \"y_key\"\n if (key === \"yandex\") return \"yandex-verification\"\n if (key === \"me\") return \"me\"\n return key\n}\n\nfunction pushVerificationMeta(\n tags: TagDescriptor[],\n v: NonNullable<SEO[\"meta\"][\"verification\"]>,\n): void {\n const add = (name: string, content: string) => {\n tags.push({ kind: \"meta\", name, content })\n }\n if (v.google) add(verificationMetaName(\"google\"), v.google)\n if (v.yahoo) add(verificationMetaName(\"yahoo\"), v.yahoo)\n if (v.yandex) add(verificationMetaName(\"yandex\"), v.yandex)\n if (v.me) add(verificationMetaName(\"me\"), v.me)\n if (v.other) {\n for (const [k, val] of Object.entries(v.other)) {\n add(verificationMetaName(k), val)\n }\n }\n}\n\n/** Vanilla tag list for snapshots and non-framework hosts (ARCHITECTURE §8). */\nexport function renderTags(seo: SEO, config?: SEOConfig): TagDescriptor[] {\n const tags: TagDescriptor[] = []\n tags.push({ kind: \"meta\", name: \"title\", content: seo.meta.title })\n if (seo.meta.description) {\n tags.push({ kind: \"meta\", name: \"description\", content: seo.meta.description })\n }\n if (seo.meta.canonical) {\n tags.push({ kind: \"link\", rel: \"canonical\", href: seo.meta.canonical })\n }\n if (seo.meta.robots) {\n tags.push({ kind: \"meta\", name: \"robots\", content: seo.meta.robots })\n }\n if (seo.meta.verification) {\n pushVerificationMeta(tags, seo.meta.verification)\n }\n const pag = seo.meta.pagination\n if (pag?.previous) {\n tags.push({ kind: \"link\", rel: \"prev\", href: pag.previous })\n }\n if (pag?.next) {\n tags.push({ kind: \"link\", rel: \"next\", href: pag.next })\n }\n const langs = seo.meta.alternates?.languages\n if (langs) {\n for (const [hreflang, href] of Object.entries(langs)) {\n tags.push({ kind: \"link\", rel: \"alternate\", hreflang, href })\n }\n }\n if (seo.openGraph?.title) {\n tags.push({ kind: \"meta\", property: \"og:title\", content: seo.openGraph.title })\n }\n if (seo.openGraph?.description) {\n tags.push({ kind: \"meta\", property: \"og:description\", content: seo.openGraph.description })\n }\n if (seo.openGraph?.url) {\n tags.push({ kind: \"meta\", property: \"og:url\", content: seo.openGraph.url })\n }\n if (seo.openGraph?.type) {\n tags.push({ kind: \"meta\", property: \"og:type\", content: seo.openGraph.type })\n }\n if (seo.openGraph?.siteName) {\n tags.push({ kind: \"meta\", property: \"og:site_name\", content: seo.openGraph.siteName })\n }\n if (seo.openGraph?.locale) {\n tags.push({ kind: \"meta\", property: \"og:locale\", content: seo.openGraph.locale })\n }\n if (seo.openGraph?.publishedTime) {\n tags.push({\n kind: \"meta\",\n property: \"article:published_time\",\n content: seo.openGraph.publishedTime,\n })\n }\n if (seo.openGraph?.modifiedTime) {\n tags.push({\n kind: \"meta\",\n property: \"article:modified_time\",\n content: seo.openGraph.modifiedTime,\n })\n }\n if (seo.openGraph?.expirationTime) {\n tags.push({\n kind: \"meta\",\n property: \"article:expiration_time\",\n content: seo.openGraph.expirationTime,\n })\n }\n if (seo.openGraph?.section) {\n tags.push({ kind: \"meta\", property: \"article:section\", content: seo.openGraph.section })\n }\n const authors = seo.openGraph?.authors\n if (authors?.length) {\n for (const a of authors) {\n if (a?.trim()) tags.push({ kind: \"meta\", property: \"article:author\", content: a.trim() })\n }\n }\n const ogTags = seo.openGraph?.tags\n if (ogTags?.length) {\n for (const t of ogTags) {\n if (t?.trim()) tags.push({ kind: \"meta\", property: \"article:tag\", content: t.trim() })\n }\n }\n const ogVideos = seo.openGraph?.videos\n if (ogVideos?.length) {\n for (const v of ogVideos) {\n if (!v?.url) continue\n tags.push({ kind: \"meta\", property: \"og:video\", content: v.url })\n if (v.secureUrl) {\n tags.push({ kind: \"meta\", property: \"og:video:secure_url\", content: v.secureUrl })\n }\n if (v.type) tags.push({ kind: \"meta\", property: \"og:video:type\", content: v.type })\n if (v.width !== undefined) {\n tags.push({ kind: \"meta\", property: \"og:video:width\", content: String(v.width) })\n }\n if (v.height !== undefined) {\n tags.push({ kind: \"meta\", property: \"og:video:height\", content: String(v.height) })\n }\n }\n }\n const ogImages = seo.openGraph?.images\n if (ogImages?.length) {\n for (const img of ogImages) {\n if (img?.url) tags.push({ kind: \"meta\", property: \"og:image\", content: img.url })\n if (img?.width !== undefined) {\n tags.push({ kind: \"meta\", property: \"og:image:width\", content: String(img.width) })\n }\n if (img?.height !== undefined) {\n tags.push({ kind: \"meta\", property: \"og:image:height\", content: String(img.height) })\n }\n if (img?.alt) tags.push({ kind: \"meta\", property: \"og:image:alt\", content: img.alt })\n }\n }\n if (seo.twitter?.card) {\n tags.push({ kind: \"meta\", name: \"twitter:card\", content: seo.twitter.card })\n }\n if (seo.twitter?.title) {\n tags.push({ kind: \"meta\", name: \"twitter:title\", content: seo.twitter.title })\n }\n if (seo.twitter?.description) {\n tags.push({ kind: \"meta\", name: \"twitter:description\", content: seo.twitter.description })\n }\n if (seo.twitter?.site) {\n tags.push({ kind: \"meta\", name: \"twitter:site\", content: seo.twitter.site })\n }\n if (seo.twitter?.creator) {\n tags.push({ kind: \"meta\", name: \"twitter:creator\", content: seo.twitter.creator })\n }\n if (seo.twitter?.image) {\n tags.push({ kind: \"meta\", name: \"twitter:image\", content: seo.twitter.image })\n }\n for (const node of seo.schema) {\n tags.push({ kind: \"script-jsonld\", json: serializeJSONLD(node) })\n }\n return runOnRenderTagPlugins(tags, seo, config)\n}\n","import type { SEO } from \"./types.js\"\n\nexport type ValidationSeverity = \"warning\" | \"error\"\n\n/** Stable machine-readable codes (PRD §3.5 / observability). */\nexport type ValidationIssueCode =\n | \"TITLE_EMPTY\"\n | \"TITLE_TOO_LONG\"\n | \"DESCRIPTION_MISSING\"\n | \"DESCRIPTION_REQUIRED\"\n | \"DESCRIPTION_TOO_LONG\"\n | \"OG_IMAGE_NARROW\"\n | \"ARTICLE_PUBLISHED_TIME_RECOMMENDED\"\n | \"SCHEMA_MISSING_TYPE\"\n\nexport interface ValidationIssue {\n readonly code: ValidationIssueCode\n readonly field: string\n readonly message: string\n readonly severity: ValidationSeverity\n}\n\nexport interface ValidateSEOOptions {\n /** When false, validation is a no-op (production / Edge bundles). */\n readonly enabled?: boolean\n /** When true, missing description is `error` instead of `warning`. */\n readonly requireDescription?: boolean\n /** In non-production only: when not false, log each issue to console.warn (default: true). */\n readonly log?: boolean\n readonly titleMaxLength?: number\n readonly descriptionMaxLength?: number\n}\n\nfunction shouldRun(options?: ValidateSEOOptions): boolean {\n if (options?.enabled === false) return false\n\n // Safe environment check - handles Edge, browser, and bundler polyfills\n const isProduction =\n typeof process !== \"undefined\" &&\n typeof process.env === \"object\" &&\n process.env !== null &&\n process.env.NODE_ENV === \"production\"\n\n if (isProduction) return false\n return true\n}\n\n/**\n * Development-oriented checks — no heavy deps (ARCHITECTURE §12).\n * Returns structured issues; set `log: false` to consume programmatically without console noise.\n */\nexport function validateSEO(seo: SEO, options?: ValidateSEOOptions): readonly ValidationIssue[] {\n if (!shouldRun(options)) return []\n\n const titleMax = options?.titleMaxLength ?? 60\n const descMax = options?.descriptionMaxLength ?? 165\n const log = options?.log !== false\n const requireDesc = options?.requireDescription === true\n const issues: ValidationIssue[] = []\n\n if (!seo.meta.title?.trim()) {\n issues.push({\n code: \"TITLE_EMPTY\",\n field: \"meta.title\",\n message: \"empty title\",\n severity: \"error\",\n })\n } else if (seo.meta.title.length > titleMax) {\n issues.push({\n code: \"TITLE_TOO_LONG\",\n field: \"meta.title\",\n message: `length ${seo.meta.title.length} exceeds recommended ${titleMax}`,\n severity: \"warning\",\n })\n }\n\n if (!seo.meta.description?.trim()) {\n issues.push({\n code: requireDesc ? \"DESCRIPTION_REQUIRED\" : \"DESCRIPTION_MISSING\",\n field: \"meta.description\",\n message: requireDesc ? \"description is required\" : \"missing description\",\n severity: requireDesc ? \"error\" : \"warning\",\n })\n } else if (seo.meta.description.length > descMax) {\n issues.push({\n code: \"DESCRIPTION_TOO_LONG\",\n field: \"meta.description\",\n message: `length ${seo.meta.description.length} exceeds recommended ${descMax}`,\n severity: \"warning\",\n })\n }\n\n const firstOg = seo.openGraph?.images?.[0]\n if (firstOg?.width !== undefined && firstOg.width < 1200) {\n issues.push({\n code: \"OG_IMAGE_NARROW\",\n field: \"openGraph.images[0].width\",\n message: \"OG image width under 1200px\",\n severity: \"warning\",\n })\n }\n\n const ogType = seo.openGraph?.type\n if (\n ogType === \"article\" &&\n !(seo.openGraph?.publishedTime && String(seo.openGraph.publishedTime).trim())\n ) {\n issues.push({\n code: \"ARTICLE_PUBLISHED_TIME_RECOMMENDED\",\n field: \"openGraph.publishedTime\",\n message: \"openGraph.type is article; set publishedTime (ISO-8601) for richer crawlers\",\n severity: \"warning\",\n })\n }\n\n for (let i = 0; i < seo.schema.length; i++) {\n const node = seo.schema[i]\n if (!node?.[\"@type\"]) {\n issues.push({\n code: \"SCHEMA_MISSING_TYPE\",\n field: `schema[${i}]`,\n message: \"missing @type\",\n severity: \"error\",\n })\n }\n }\n\n if (log) {\n for (const i of issues) {\n console.warn(\n `[@better-seo/core] validateSEO [${i.severity}] ${i.code} ${i.field}: ${i.message}`,\n )\n }\n }\n\n return issues\n}\n","import type { SEOAdapter } from \"../types.js\"\nimport { SEOError } from \"../errors.js\"\n\nconst adapters = new Map<string, SEOAdapter<unknown>>()\n\n/**\n * Validates adapter ID to prevent namespace collisions and malicious overrides.\n *\n * @param id - The adapter ID to validate\n * @throws {SEOError} If adapter ID is invalid\n */\nfunction validateAdapterId(id: string): void {\n if (!id || typeof id !== \"string\") {\n throw new SEOError(\"VALIDATION\", \"Adapter ID must be a non-empty string\")\n }\n\n // Prevent extremely long IDs (DoS prevention)\n if (id.length > 64) {\n throw new SEOError(\"VALIDATION\", `Adapter ID too long: ${id.length} chars (max 64)`)\n }\n\n // Only allow alphanumeric, dash, underscore (prevents path traversal, etc.)\n if (!/^[a-zA-Z0-9_-]+$/.test(id)) {\n throw new SEOError(\"VALIDATION\", `Adapter ID contains invalid characters: ${id}`)\n }\n\n // Warn on overriding existing adapter (supply chain attack detection)\n if (adapters.has(id)) {\n console.warn(\n `[@better-seo/core] Overriding existing adapter: \"${id}\". ` +\n \"This may indicate a dependency conflict or malicious package.\",\n )\n }\n}\n\n/**\n * Register an adapter implementation.\n *\n * ⚠️ **SECURITY**: Only register adapters from trusted sources.\n * Malicious adapters can intercept and modify SEO data.\n *\n * @param adapter - The adapter to register\n * @throws {SEOError} If adapter ID is invalid or adapter is not an object\n *\n * @example\n * ```ts\n * import { registerAdapter } from '@better-seo/core'\n *\n * registerAdapter({\n * id: 'my-framework',\n * toFramework: (seo) => { /* conversion logic *\\/ }\n * })\n * ```\n */\nexport function registerAdapter<T>(adapter: SEOAdapter<T>): void {\n if (!adapter || typeof adapter !== \"object\") {\n throw new SEOError(\"VALIDATION\", \"Adapter must be an object\")\n }\n\n validateAdapterId(adapter.id)\n adapters.set(adapter.id, adapter)\n}\n\nexport function getAdapter<T = unknown>(id: string): SEOAdapter<T> | undefined {\n return adapters.get(id) as SEOAdapter<T> | undefined\n}\n\nexport function listAdapterIds(): string[] {\n return [...adapters.keys()]\n}\n\n/**\n * Best-effort only (e.g. `NEXT_RUNTIME` under Next). Prefer explicit `registerAdapter` / `@better-seo/<framework>` imports in production.\n */\nexport function detectFramework(): \"next\" | undefined {\n if (typeof process === \"undefined\" || !process.env) return undefined\n if (process.env.NEXT_RUNTIME) return \"next\"\n return undefined\n}\n\nexport function getDefaultAdapter<T = unknown>(): SEOAdapter<T> | undefined {\n const id = detectFramework()\n return id ? getAdapter<T>(id) : undefined\n}\n","import { createSEO, mergeSEO } from \"./core.js\"\nimport type { SEO, SEOConfig, SEOInput, SEORule } from \"./types.js\"\n\n/** Normalize path for comparison (leading slash, collapse slashes, trim trailing except root). */\nexport function normalizeRoutePath(path: string): string {\n if (!path || path === \"/\") return \"/\"\n const t = path.startsWith(\"/\") ? path : `/${path}`\n const c = t.replace(/\\/+/g, \"/\")\n return c.endsWith(\"/\") && c.length > 1 ? c.slice(0, -1) : c\n}\n\nfunction pathSegments(path: string): string[] {\n const n = normalizeRoutePath(path)\n if (n === \"/\") return []\n return n.slice(1).split(\"/\")\n}\n\nfunction matchSegment(pat: string, seg: string): boolean {\n if (pat === \"*\") return true\n if (pat.endsWith(\"*\") && pat.length > 1) {\n return seg.startsWith(pat.slice(0, -1))\n }\n return pat === seg\n}\n\n/** Segment glob: multi-segment and single-segment wildcards (see rules.test.ts). */\nexport function matchRouteGlob(pattern: string, route: string): boolean {\n const ps = pathSegments(pattern)\n const rs = pathSegments(route)\n const dfs = (pi: number, ri: number): boolean => {\n if (pi === ps.length) return ri === rs.length\n if (ps[pi] === \"**\") {\n if (dfs(pi + 1, ri)) return true\n if (ri < rs.length && dfs(pi, ri + 1)) return true\n return false\n }\n if (ri === rs.length) return false\n if (!matchSegment(ps[pi]!, rs[ri]!)) return false\n return dfs(pi + 1, ri + 1)\n }\n return dfs(0, 0)\n}\n\nfunction matchRouteLegacyStar(pattern: string, route: string): boolean {\n const prefix = pattern.slice(0, -1)\n const r = normalizeRoutePath(route)\n const p = normalizeRoutePath(prefix)\n if (r === p) return true\n return r.startsWith(prefix) || r.startsWith(`${p}/`)\n}\n\n/** One `*` per path segment (not `**`). */\nfunction matchSingleSegmentStars(pattern: string, route: string): boolean {\n const ps = pathSegments(pattern)\n const rs = pathSegments(route)\n if (ps.length !== rs.length) return false\n for (let i = 0; i < ps.length; i++) {\n if (!matchSegment(ps[i]!, rs[i]!)) return false\n }\n return true\n}\n\nexport function matchRoute(pattern: string, route: string): boolean {\n if (pattern === \"*\") return true\n const r = route || \"/\"\n if (pattern.includes(\"**\")) {\n return matchRouteGlob(pattern, r)\n }\n /** Trailing `*` only → legacy full-path prefix (`/blog/*`, `/api*`). */\n if (pattern.endsWith(\"*\") && pattern.indexOf(\"*\") === pattern.length - 1) {\n return matchRouteLegacyStar(pattern, r)\n }\n if (pattern.includes(\"*\")) {\n return matchSingleSegmentStars(pattern, r)\n }\n return normalizeRoutePath(r) === normalizeRoutePath(pattern)\n}\n\n/**\n * Pure rule matcher — `**` segment globs + legacy `prefix*` path match (ARCHITECTURE §11 subset).\n */\nexport function applyRules(route: string, rules: readonly SEORule[]): Partial<SEOInput> {\n /** Lower priority merged first; higher `priority` wins on duplicate keys (ARCHITECTURE §11). */\n const sorted = [...rules].sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0))\n let acc: Partial<SEOInput> = {}\n for (const rule of sorted) {\n if (matchRoute(rule.match, route)) {\n acc = { ...acc, ...rule.seo }\n }\n }\n return acc\n}\n\n/** Merge rule output into a base document (helper for adapters). */\nexport function applyRulesToSEO(\n route: string,\n base: SEO,\n rules: readonly SEORule[],\n config?: SEOConfig,\n): SEO {\n const partial = applyRules(route, rules)\n if (Object.keys(partial).length === 0) return base\n return mergeSEO(base, partial, config)\n}\n\n/** Convenience: rules → `createSEO`. */\nexport function createSEOForRoute(\n route: string,\n input: SEOInput,\n rules: readonly SEORule[],\n config?: SEOConfig,\n): SEO {\n const mergedInput: SEOInput = { ...applyRules(route, rules), ...input }\n return createSEO(mergedInput, config)\n}\n","import { createSEO, mergeSEO } from \"./core.js\"\nimport { createSEOForRoute } from \"./rules.js\"\nimport type { SEO, SEOConfig, SEOInput } from \"./types.js\"\n\nexport interface SEOContext {\n readonly config: SEOConfig\n /** Request-scoped `createSEO` with bound config + plugins. */\n readonly createSEO: (input: SEOInput) => SEO\n /** Merges `config.rules` for `route`, then `createSEO` (N9 / Wave 6). */\n readonly createSEOForRoute: (route: string, input: SEOInput) => SEO\n readonly mergeSEO: (parent: SEO, child: SEOInput) => SEO\n}\n\n/**\n * Preferred production pattern for multi-tenant / Edge — explicit config, no filesystem inference (ARCHITECTURE §13).\n */\nexport function createSEOContext(config: SEOConfig): SEOContext {\n const rules = config.rules ?? []\n return {\n config,\n createSEO: (input: SEOInput) => createSEO(input, config),\n createSEOForRoute: (route: string, input: SEOInput) =>\n createSEOForRoute(route, input, rules, config),\n mergeSEO: (parent: SEO, child: SEOInput) => mergeSEO(parent, child, config),\n }\n}\n","import type { SEOConfig } from \"./types.js\"\n\nlet globalConfig: SEOConfig | undefined\n\n/**\n * ⚠️ **SECURITY WARNING**: Global state is NOT safe for multi-tenant or serverless environments.\n *\n * This function stores config in module-level global state, which can leak between:\n * - Different users in serverless functions (Vercel, Netlify, Cloudflare Workers)\n * - Concurrent requests in Node.js servers\n * - Different tenants in multi-tenant applications\n *\n * **DO NOT USE** in:\n * - Server-side rendering (SSR) with multiple users\n * - Edge functions or Workers\n * - Multi-tenant SaaS applications\n * - Any environment where config must be isolated per request\n *\n * **SAFE ALTERNATIVE:** Use `createSEOContext()` for request-scoped configuration.\n *\n * @deprecated Use `createSEOContext()` for production applications.\n * Only suitable for single-user, static sites or development.\n *\n * @param config - Global SEO configuration to store\n *\n * @see {@link createSEOContext} for request-scoped configuration\n * @see {@link internal-docs/ARCHITECTURE.md} §10 for runtime matrix\n * @see {@link internal-docs/USAGE.md} for security best practices\n */\nexport function initSEO(config: SEOConfig): void {\n // Security warning in development\n if (typeof process !== \"undefined\" && process.env?.NODE_ENV !== \"production\") {\n console.warn(\n \"[@better-seo/core] ⚠️ initSEO() uses global state and is NOT safe for \" +\n \"multi-tenant or serverless environments. Use createSEOContext() instead. \" +\n \"See: https://github.com/OWNER/better-seo-js/blob/main/internal-docs/ARCHITECTURE.md\",\n )\n }\n\n globalConfig = config\n}\n\n/**\n * Gets the global SEO config.\n *\n * @deprecated Use `createSEOContext()` for production applications.\n *\n * @returns The global SEO config, or undefined if not initialized\n *\n * @see {@link createSEOContext} for request-scoped configuration\n */\nexport function getGlobalSEOConfig(): SEOConfig | undefined {\n return globalConfig\n}\n\n/**\n * Resets the global SEO config.\n *\n * @internal Used for testing only\n */\nexport function resetSEOConfigForTests(): void {\n globalConfig = undefined\n}\n","import { createSEO } from \"./core.js\"\nimport { getAdapter } from \"./adapters/registry.js\"\nimport { SEOError } from \"./errors.js\"\nimport { createSEOForRoute } from \"./rules.js\"\nimport type { SEO, SEOConfig, SEOInput } from \"./types.js\"\n\n/**\n * Resolve via registered adapter — prefer `@better-seo/next`’s `seo()` for the Next voilà path.\n * @throws {SEOError} ADAPTER_NOT_FOUND when the adapter id was never registered\n */\nexport function seoForFramework<T>(adapterId: string, input: SEOInput, config?: SEOConfig): T {\n const adapter = getAdapter(adapterId)\n if (!adapter) {\n throw new SEOError(\n \"ADAPTER_NOT_FOUND\",\n `no adapter \"${adapterId}\" registered (import your framework package, e.g. @better-seo/next).`,\n )\n }\n const doc = createSEO(input, config)\n return adapter.toFramework(doc) as T\n}\n\n/**\n * Stub until `@better-seo/react` (Wave 5 / V3). Calling this makes missing peer support obvious in dev.\n * @throws {SEOError} USE_SEO_NOT_AVAILABLE\n */\nexport function useSEO(): never {\n throw new SEOError(\"USE_SEO_NOT_AVAILABLE\")\n}\n\n/**\n * V5 — explicit pathname for rules: merges {@link SEOConfig.rules} (via `applyRules`) then {@link createSEO}.\n * Prefer this over “magic” route detection at runtime (FEATURES **V6** — document limits; no stable `seo.auto` in core).\n */\nexport function seoRoute(route: string, input: SEOInput, config?: SEOConfig): SEO {\n return createSEOForRoute(route, input, config?.rules ?? [], config)\n}\n","import { SEOError } from \"./errors.js\"\nimport type { SEOImage, SEOInput } from \"./types.js\"\n\nfunction isObj(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === \"object\" && !Array.isArray(v)\n}\n\nfunction pickStr(v: unknown): string | undefined {\n return typeof v === \"string\" && v.trim() ? v.trim() : undefined\n}\n\nfunction mapOgImages(raw: unknown): readonly SEOImage[] | undefined {\n if (!Array.isArray(raw)) return undefined\n const out: SEOImage[] = []\n for (const item of raw) {\n if (typeof item === \"string\") {\n out.push({ url: item })\n continue\n }\n if (!isObj(item)) continue\n const url = pickStr(item.url)\n if (!url) continue\n out.push({\n url,\n ...(typeof item.width === \"number\" ? { width: item.width } : {}),\n ...(typeof item.height === \"number\" ? { height: item.height } : {}),\n ...(pickStr(item.alt) !== undefined ? { alt: pickStr(item.alt) } : {}),\n })\n }\n return out.length > 0 ? out : undefined\n}\n\n/**\n * Map next-seo **`DefaultSeo`** / **`NextSeo`**-style props → {@link SEOInput}.\n * Covers common `title`, `description`, `canonical`, `openGraph`, `twitter`, `noindex`, `nofollow`.\n * Use `createSEO(fromNextSeo(props), config)` — `titleTemplate` from next-seo is not applied; set `SEOConfig.titleTemplate` yourself.\n */\nexport function fromNextSeo(nextSeoExport: unknown): SEOInput {\n if (!isObj(nextSeoExport)) {\n throw new SEOError(\"VALIDATION\", \"fromNextSeo expects a plain object (e.g. next-seo props).\")\n }\n const o = nextSeoExport\n const og = isObj(o.openGraph) ? o.openGraph : undefined\n const tw = isObj(o.twitter) ? o.twitter : undefined\n\n const title =\n pickStr(o.title) ??\n pickStr(o.defaultTitle) ??\n (og ? pickStr(og.title) : undefined) ??\n (tw ? pickStr(tw.title) : undefined)\n\n const description =\n pickStr(o.description) ??\n (og ? pickStr(og.description) : undefined) ??\n (tw ? pickStr(tw.description) : undefined)\n\n if (!title) {\n throw new SEOError(\n \"VALIDATION\",\n \"fromNextSeo could not infer a title. Set title, defaultTitle, or openGraph.title.\",\n )\n }\n\n const canonical = pickStr(o.canonical) ?? (og ? pickStr(og.url) : undefined)\n\n const noindex = o.noindex === true\n const nofollow = o.nofollow === true\n const robots =\n noindex || nofollow\n ? `${noindex ? \"noindex\" : \"index\"}, ${nofollow ? \"nofollow\" : \"follow\"}`\n : undefined\n\n let openGraph: SEOInput[\"openGraph\"]\n if (og) {\n const images = mapOgImages(og.images)\n const siteName =\n pickStr((og as { siteName?: unknown }).siteName) ??\n pickStr((og as { site_name?: unknown }).site_name)\n openGraph = {\n ...(pickStr(og.title) !== undefined ? { title: pickStr(og.title) } : {}),\n ...(pickStr(og.description) !== undefined ? { description: pickStr(og.description) } : {}),\n ...(pickStr(og.url) !== undefined ? { url: pickStr(og.url) } : {}),\n ...(pickStr(og.type) !== undefined ? { type: pickStr(og.type) } : {}),\n ...(siteName !== undefined ? { siteName } : {}),\n ...(pickStr((og as { locale?: unknown }).locale) !== undefined\n ? { locale: pickStr((og as { locale?: unknown }).locale) }\n : {}),\n ...(images !== undefined ? { images } : {}),\n }\n if (Object.keys(openGraph).length === 0) openGraph = undefined\n }\n\n let twitter: SEOInput[\"twitter\"]\n if (tw) {\n const cardRaw = pickStr(tw.card)\n const card = cardRaw === \"summary\" || cardRaw === \"summary_large_image\" ? cardRaw : undefined\n const twImage = pickStr(tw.image) ?? pickStr((tw as { imageSrc?: unknown }).imageSrc)\n const twSite = pickStr((tw as { site?: unknown }).site)\n const twCreator =\n pickStr((tw as { handle?: unknown }).handle) ?? pickStr((tw as { creator?: unknown }).creator)\n twitter = {\n ...(card !== undefined ? { card } : {}),\n ...(pickStr(tw.title) !== undefined ? { title: pickStr(tw.title) } : {}),\n ...(pickStr(tw.description) !== undefined ? { description: pickStr(tw.description) } : {}),\n ...(twImage !== undefined ? { image: twImage } : {}),\n ...(twSite !== undefined ? { site: twSite } : {}),\n ...(twCreator !== undefined ? { creator: twCreator } : {}),\n }\n if (Object.keys(twitter).length === 0) twitter = undefined\n }\n\n return {\n title,\n ...(description !== undefined ? { description } : {}),\n ...(canonical !== undefined ? { canonical } : {}),\n ...(robots !== undefined ? { robots } : {}),\n ...(openGraph !== undefined ? { openGraph } : {}),\n ...(twitter !== undefined ? { twitter } : {}),\n }\n}\n","import type { SEOInput } from \"./types.js\"\n\nexport interface FromContentOptions {\n /** Truncate generated description (default 300). */\n readonly maxDescriptionLength?: number\n /**\n * When **`false`**, do not derive **title** from `# heading` or the first body line (description-only inference).\n * Use when the caller already has a title (e.g. **gray-matter** frontmatter via **`@better-seo/compiler`**).\n * @default true\n */\n readonly inferTitleFromBody?: boolean\n}\n\nfunction stripHtmlish(s: string): string {\n return s\n .replace(/<[^>]+>/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n}\n\nfunction parseSimpleFrontmatter(raw: string): {\n readonly body: string\n readonly title?: string\n readonly description?: string\n} {\n if (!raw.startsWith(\"---\\n\")) return { body: raw }\n const end = raw.indexOf(\"\\n---\\n\", 4)\n if (end === -1) return { body: raw }\n const fmBlock = raw.slice(4, end)\n const body = raw.slice(end + 5).trim()\n let title: string | undefined\n let description: string | undefined\n for (const line of fmBlock.split(\"\\n\")) {\n const m = /^([A-Za-z0-9_-]+)\\s*:\\s*(.*)$/.exec(line.trim())\n if (!m) continue\n const key = m[1]!.toLowerCase()\n let val = m[2]!.trim()\n if ((val.startsWith('\"') && val.endsWith('\"')) || (val.startsWith(\"'\") && val.endsWith(\"'\"))) {\n val = val.slice(1, -1)\n }\n if (key === \"title\") title = val\n if (key === \"description\") description = val\n }\n return { body, title, description }\n}\n\n/**\n * Wave 7 / **C16** — derive {@link SEOInput} from a string (plain text, Markdown, or MDX-ish).\n * Does **not** compile MDX: treats `import` / JSX as text; use for metadata hints only.\n * Optional YAML frontmatter (`---` … `---`) with `title` / `description` is supported.\n */\nexport function fromContent(markdownOrPlain: string, options?: FromContentOptions): SEOInput {\n const maxD = options?.maxDescriptionLength ?? 300\n const inferTitle = options?.inferTitleFromBody !== false\n const normalized = markdownOrPlain.replace(/\\r\\n/g, \"\\n\")\n const { body: fmBody, title: fmTitle, description: fmDesc } = parseSimpleFrontmatter(normalized)\n let body = fmBody.trim()\n if (!body && !fmTitle) {\n return { title: \"Untitled\" }\n }\n\n let title = fmTitle\n let description = fmDesc\n\n const importStripped = body\n .split(\"\\n\")\n .filter((line) => !/^\\s*import\\s+/.test(line))\n .join(\"\\n\")\n .trim()\n body = importStripped || body\n\n if (inferTitle) {\n const h1 = /^#\\s+(.+)$/m.exec(body)\n if (!title && h1) {\n title = h1[1]!.trim()\n body = body.replace(h1[0], \"\").trim()\n }\n\n if (!title) {\n const lines = body.split(\"\\n\")\n const first = lines.find((l) => l.trim().length > 0) ?? \"\"\n title = stripHtmlish(first).slice(0, 200) || \"Untitled\"\n const idx = body.indexOf(first)\n if (idx >= 0) body = body.slice(idx + first.length).trim()\n }\n }\n\n if (!description) {\n const chunk = body.split(/\\n\\n+/).find((p) => p.trim().length > 0) ?? \"\"\n const plain = stripHtmlish(chunk.replace(/^#+\\s+.*$/m, \"\").trim())\n description = plain.length > 0 ? plain.slice(0, maxD) : undefined\n }\n\n const out: Record<string, unknown> = {}\n if (title !== undefined) out.title = title\n if (description !== undefined) out.description = description\n if (out.title === undefined && out.description === undefined) {\n return { title: \"Untitled\" }\n }\n return out as SEOInput\n}\n\n/**\n * Wave 7 — convenience alias of {@link fromContent} (same zero-dep behavior).\n * For **gray-matter** frontmatter + body merging, use **`fromMdx`** from **`@better-seo/compiler`** (**C17**).\n */\nexport function fromMdxString(source: string, options?: FromContentOptions): SEOInput {\n return fromContent(source, options)\n}\n","import type { SEOInput } from \"./types.js\"\n\n/**\n * **C18** — Preserves a typed {@link SEOInput} literal for templates / config snippets (no runtime transform).\n */\nexport function defineSEO<const T extends SEOInput>(input: T): T {\n return input\n}\n"]}