scribe-cms 0.0.17 → 0.0.21

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.
Files changed (88) hide show
  1. package/README.md +10 -0
  2. package/dist/cli/index.cjs +4021 -555
  3. package/dist/cli/index.cjs.map +1 -1
  4. package/dist/cli/index.js +4019 -553
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/index.cjs +1514 -229
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.js +1499 -228
  9. package/dist/index.js.map +1 -1
  10. package/dist/runtime.cjs +447 -33
  11. package/dist/runtime.cjs.map +1 -1
  12. package/dist/runtime.js +446 -32
  13. package/dist/runtime.js.map +1 -1
  14. package/dist/src/config/resolve-config.d.ts.map +1 -1
  15. package/dist/src/core/builtin-fields.d.ts +10 -1
  16. package/dist/src/core/builtin-fields.d.ts.map +1 -1
  17. package/dist/src/core/field.d.ts +70 -0
  18. package/dist/src/core/field.d.ts.map +1 -1
  19. package/dist/src/core/introspect-schema.d.ts +31 -1
  20. package/dist/src/core/introspect-schema.d.ts.map +1 -1
  21. package/dist/src/core/managed-roots.d.ts +15 -0
  22. package/dist/src/core/managed-roots.d.ts.map +1 -0
  23. package/dist/src/core/types.d.ts +56 -4
  24. package/dist/src/core/types.d.ts.map +1 -1
  25. package/dist/src/create-project.d.ts +17 -1
  26. package/dist/src/create-project.d.ts.map +1 -1
  27. package/dist/src/create-scribe.d.ts.map +1 -1
  28. package/dist/src/delete/execute.d.ts +21 -0
  29. package/dist/src/delete/execute.d.ts.map +1 -0
  30. package/dist/src/delete/plan.d.ts +85 -0
  31. package/dist/src/delete/plan.d.ts.map +1 -0
  32. package/dist/src/delete/render-text.d.ts +7 -0
  33. package/dist/src/delete/render-text.d.ts.map +1 -0
  34. package/dist/src/hash/page-hash.d.ts +9 -0
  35. package/dist/src/hash/page-hash.d.ts.map +1 -1
  36. package/dist/src/index.d.ts +12 -3
  37. package/dist/src/index.d.ts.map +1 -1
  38. package/dist/src/inline/resolve-tokens.d.ts +39 -0
  39. package/dist/src/inline/resolve-tokens.d.ts.map +1 -0
  40. package/dist/src/inline/tokens.d.ts +95 -0
  41. package/dist/src/inline/tokens.d.ts.map +1 -0
  42. package/dist/src/loader/create-loader.d.ts +7 -1
  43. package/dist/src/loader/create-loader.d.ts.map +1 -1
  44. package/dist/src/loader/resolve-assets.d.ts +16 -0
  45. package/dist/src/loader/resolve-assets.d.ts.map +1 -0
  46. package/dist/src/runtime.d.ts +1 -1
  47. package/dist/src/runtime.d.ts.map +1 -1
  48. package/dist/src/storage/translations.d.ts +8 -0
  49. package/dist/src/storage/translations.d.ts.map +1 -1
  50. package/dist/src/translate/resolve-translate-config.d.ts.map +1 -1
  51. package/dist/src/translate/response-schema.d.ts +7 -1
  52. package/dist/src/translate/response-schema.d.ts.map +1 -1
  53. package/dist/src/translate/translate-core.d.ts +6 -0
  54. package/dist/src/translate/translate-core.d.ts.map +1 -1
  55. package/dist/src/translate/validate-translation.d.ts.map +1 -1
  56. package/dist/src/translate/worklist.d.ts +8 -1
  57. package/dist/src/translate/worklist.d.ts.map +1 -1
  58. package/dist/src/validate/validate-assets.d.ts +26 -2
  59. package/dist/src/validate/validate-assets.d.ts.map +1 -1
  60. package/dist/src/validate/validate-inline-tokens.d.ts +10 -0
  61. package/dist/src/validate/validate-inline-tokens.d.ts.map +1 -0
  62. package/dist/src/validate/validate-project.d.ts.map +1 -1
  63. package/dist/src/validate/validate-relations.d.ts +2 -1
  64. package/dist/src/validate/validate-relations.d.ts.map +1 -1
  65. package/dist/studio/asset-serve.d.ts +39 -0
  66. package/dist/studio/asset-serve.d.ts.map +1 -0
  67. package/dist/studio/asset-views.d.ts +4 -0
  68. package/dist/studio/asset-views.d.ts.map +1 -0
  69. package/dist/studio/content-views.d.ts +85 -0
  70. package/dist/studio/content-views.d.ts.map +1 -0
  71. package/dist/studio/introspect-fields.d.ts +111 -0
  72. package/dist/studio/introspect-fields.d.ts.map +1 -0
  73. package/dist/studio/mdx-preview.d.ts +3 -0
  74. package/dist/studio/mdx-preview.d.ts.map +1 -0
  75. package/dist/studio/preview-tokens.d.ts +16 -0
  76. package/dist/studio/preview-tokens.d.ts.map +1 -0
  77. package/dist/studio/search.d.ts +34 -0
  78. package/dist/studio/search.d.ts.map +1 -0
  79. package/dist/studio/server.cjs +4699 -304
  80. package/dist/studio/server.cjs.map +1 -1
  81. package/dist/studio/server.d.ts.map +1 -1
  82. package/dist/studio/server.js +4697 -302
  83. package/dist/studio/server.js.map +1 -1
  84. package/dist/studio/shared.d.ts +20 -0
  85. package/dist/studio/shared.d.ts.map +1 -0
  86. package/dist/studio/studio-cache.d.ts +93 -0
  87. package/dist/studio/studio-cache.d.ts.map +1 -0
  88. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/i18n/build-url.ts","../src/config/resolve-config.ts","../src/core/field.ts","../src/core/introspect-schema.ts","../src/core/builtin-fields.ts","../src/storage/sqlite.ts","../src/storage/translations.ts","../src/translate/normalize-mdx-body.ts","../src/translate/sanitize-mdx-jsx.ts","../src/translate/validate-mdx-body.ts","../src/loader/normalize-en.ts","../src/loader/create-loader.ts","../src/i18n/resolve-document.ts","../src/create-project.ts","../src/redirects/redirect-schema.ts","../src/redirects/load-type-redirects.ts","../src/redirects/build-redirects.ts","../src/sitemap/join-base-url.ts","../src/sitemap/generate-sitemap.ts","../src/create-scribe.ts"],"names":["path","prefix","z","fs","Database","valStart","unified","remarkParse","remarkMdx","matter"],"mappings":"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","file":"runtime.cjs","sourcesContent":["import type { ContentTypeConfig, LocaleRoutingConfig, ScribeConfig } from \"../core/types.js\";\n\nconst SLUG_PLACEHOLDER = \"{slug}\";\n\n/** Whether a content type has a public URL path template. */\nexport function isRoutableType(type: Pick<ContentTypeConfig, \"path\">): boolean {\n return typeof type.path === \"string\" && type.path.length > 0;\n}\n\n/** Validate path template at project init. */\nexport function assertValidPathTemplate(path: string, typeId: string): void {\n if (!path.startsWith(\"/\")) {\n throw new Error(`Content type \"${typeId}\": path must start with / (got \"${path}\")`);\n }\n const count = (path.match(/\\{slug\\}/g) ?? []).length;\n if (count !== 1) {\n throw new Error(\n `Content type \"${typeId}\": path must contain exactly one {slug} (got \"${path}\")`,\n );\n }\n}\n\n/** Segment before `{slug}` in the template, e.g. `/blog/` from `/blog/{slug}`. */\nexport function pathPrefix(template: string): string {\n const idx = template.indexOf(SLUG_PLACEHOLDER);\n if (idx === -1) throw new Error(`Invalid path template (missing {slug}): ${template}`);\n return template.slice(0, idx);\n}\n\n/** Segment after `{slug}` in the template, e.g. `/advanced` from `/blog/{slug}/advanced`. */\nexport function pathSuffix(template: string): string {\n const idx = template.indexOf(SLUG_PLACEHOLDER);\n if (idx === -1) throw new Error(`Invalid path template (missing {slug}): ${template}`);\n return template.slice(idx + SLUG_PLACEHOLDER.length);\n}\n\nfunction resolveDefaultLocaleRouting(): LocaleRoutingConfig {\n return { strategy: \"path-prefix\", prefixDefaultLocale: false };\n}\n\nfunction splitPathAndSearch(pathname: string): { pathname: string; search: string } {\n const q = pathname.indexOf(\"?\");\n if (q === -1) return { pathname, search: \"\" };\n return { pathname: pathname.slice(0, q), search: pathname.slice(q) };\n}\n\nexport interface UrlBuilder {\n defaultLocale: string;\n locales: readonly string[];\n localeRouting: LocaleRoutingConfig;\n /** Locales that receive a non-default locale marker in generated URLs. */\n prefixedLocales: string[];\n resolvePath: (template: string, slug: string, locale: string) => string;\n extractSlugFromResolvedPath: (template: string, resolvedPath: string) => string | null;\n /** Apply locale routing to an already-resolved pathname (e.g. canonicalPath override). */\n applyLocaleToPath: (pathname: string, locale: string) => string;\n}\n\n/** Create a locale-aware URL builder from a resolved Scribe config. */\nexport function createUrlBuilder(config: Pick<ScribeConfig, \"locales\" | \"defaultLocale\" | \"localeRouting\">): UrlBuilder {\n const localeRouting = config.localeRouting ?? resolveDefaultLocaleRouting();\n const defaultLocale = config.defaultLocale;\n const prefixedLocales =\n localeRouting.strategy === \"path-prefix\"\n ? localeRouting.prefixDefaultLocale\n ? [...config.locales]\n : config.locales.filter((locale) => locale !== defaultLocale)\n : config.locales.filter((locale) => locale !== defaultLocale);\n\n function applyLocaleToPath(pathname: string, locale: string): string {\n if (locale === defaultLocale) {\n if (localeRouting.strategy === \"path-prefix\" && localeRouting.prefixDefaultLocale) {\n return `/${defaultLocale}${pathname}`;\n }\n return pathname;\n }\n\n if (localeRouting.strategy === \"search-param\") {\n const { pathname: base, search } = splitPathAndSearch(pathname);\n const params = new URLSearchParams(search.startsWith(\"?\") ? search.slice(1) : search);\n params.set(localeRouting.param, locale);\n const qs = params.toString();\n return qs ? `${base}?${qs}` : base;\n }\n\n return `/${locale}${pathname}`;\n }\n\n function resolvePath(template: string, slug: string, locale: string): string {\n const relative = template.replace(SLUG_PLACEHOLDER, slug);\n return applyLocaleToPath(relative, locale);\n }\n\n function extractSlugFromResolvedPath(template: string, resolvedPath: string): string | null {\n let pathname = resolvedPath;\n if (localeRouting.strategy === \"search-param\") {\n pathname = splitPathAndSearch(resolvedPath).pathname;\n } else if (localeRouting.strategy === \"path-prefix\") {\n for (const locale of config.locales) {\n if (locale === defaultLocale && !localeRouting.prefixDefaultLocale) continue;\n const prefix = `/${locale}`;\n if (pathname === prefix || pathname.startsWith(`${prefix}/`)) {\n pathname = pathname.slice(prefix.length) || \"/\";\n break;\n }\n }\n }\n\n const prefix = pathPrefix(template);\n const suffix = pathSuffix(template);\n if (!pathname.startsWith(prefix)) return null;\n if (suffix && !pathname.endsWith(suffix)) return null;\n const slugEnd = suffix ? pathname.length - suffix.length : pathname.length;\n const slug = pathname.slice(prefix.length, slugEnd);\n return slug.length > 0 ? slug : null;\n }\n\n return {\n defaultLocale,\n locales: config.locales,\n localeRouting,\n prefixedLocales,\n resolvePath,\n extractSlugFromResolvedPath,\n applyLocaleToPath,\n };\n}\n\n/** Build a locale-aware pathname from a path template and slug. */\nexport function resolvePath(\n template: string,\n slug: string,\n locale: string,\n defaultLocale: string,\n localeRouting?: LocaleRoutingConfig,\n): string {\n const builder = createUrlBuilder({\n locales: [defaultLocale, ...(locale !== defaultLocale ? [locale] : [])],\n defaultLocale,\n localeRouting: localeRouting ?? resolveDefaultLocaleRouting(),\n });\n return builder.resolvePath(template, slug, locale);\n}\n\n/** Extract slug from a resolved path that matches the template. */\nexport function extractSlugFromResolvedPath(\n template: string,\n resolvedPath: string,\n localeRouting?: LocaleRoutingConfig,\n): string | null {\n const builder = createUrlBuilder({\n locales: [],\n defaultLocale: \"en\",\n localeRouting: localeRouting ?? resolveDefaultLocaleRouting(),\n });\n return builder.extractSlugFromResolvedPath(template, resolvedPath);\n}\n","import path from \"node:path\";\nimport type {\n ContentTypeConfig,\n LocaleFallbacks,\n ScribeConfig,\n ScribeConfigInput,\n} from \"../core/types.js\";\nimport { assertValidPathTemplate } from \"../i18n/build-url.js\";\n\nconst RESOLVED = Symbol.for(\"@genlook/scribe/resolvedConfig\");\n\n/** Whether a config object has already been normalized by `resolveConfig()`. */\nexport function isResolvedConfig(config: unknown): config is ScribeConfig {\n return (\n typeof config === \"object\" &&\n config !== null &&\n (config as Record<symbol, unknown>)[RESOLVED] === true\n );\n}\n\n/**\n * Normalize a user config: apply defaults, make paths absolute, and validate\n * invariants. Every entry point (`createScribe`, the CLI's `loadConfigSync`)\n * must pass configs through here so runtimes never see partial configs.\n *\n * @param baseDir directory used to resolve a relative `rootDir`\n * (the config file's directory for the CLI; `process.cwd()` otherwise).\n */\nexport function resolveConfig(\n input: ScribeConfigInput<any> | ScribeConfig,\n baseDir?: string,\n): ScribeConfig {\n if (isResolvedConfig(input)) return input;\n const raw = input as ScribeConfigInput;\n\n if (!raw.rootDir) {\n throw new Error(\"scribe config: rootDir is required\");\n }\n if (!raw.locales || raw.locales.length === 0) {\n throw new Error(\"scribe config: locales must be a non-empty array\");\n }\n const defaultLocale = raw.defaultLocale ?? \"en\";\n if (!raw.locales.includes(defaultLocale)) {\n throw new Error(\n `scribe config: defaultLocale \"${defaultLocale}\" is not in locales [${raw.locales.join(\", \")}]`,\n );\n }\n\n const localeRouting = raw.localeRouting ?? {\n strategy: \"path-prefix\" as const,\n prefixDefaultLocale: false,\n };\n if (localeRouting.strategy === \"search-param\" && !localeRouting.param) {\n throw new Error('scribe config: localeRouting search-param requires a \"param\" name');\n }\n\n const localeFallbacks =\n raw.localeFallbacks === false\n ? {}\n : deriveLocaleFallbacks(raw.locales, defaultLocale);\n\n const projectRoot = path.resolve(baseDir ?? process.cwd(), raw.rootDir);\n const contentRoot = path.resolve(projectRoot, raw.contentDir ?? \"content\");\n const storePath = path.resolve(projectRoot, raw.store ?? \".scribe/store.sqlite\");\n const assetsPath = raw.assetsDir ? path.resolve(projectRoot, raw.assetsDir) : undefined;\n\n const seenIds = new Set<string>();\n const types: ContentTypeConfig[] = raw.types.map((type) => {\n if (seenIds.has(type.id)) {\n throw new Error(`scribe config: duplicate content type id \"${type.id}\"`);\n }\n seenIds.add(type.id);\n if (type.path) {\n assertValidPathTemplate(type.path, type.id);\n }\n return {\n ...type,\n contentDir: type.contentDir ?? type.id,\n label: type.label ?? type.id.charAt(0).toUpperCase() + type.id.slice(1),\n slugStrategy: type.slugStrategy ?? \"fixed\",\n indexFallback: type.indexFallback ?? (type.path ? \"en\" : \"none\"),\n };\n });\n\n const config: ScribeConfig = {\n rootDir: contentRoot,\n storePath,\n assetsPath,\n locales: [...raw.locales],\n defaultLocale,\n localeRouting,\n localePresets: raw.localePresets,\n localeFallbacks,\n translate: raw.translate,\n types,\n };\n Object.defineProperty(config, RESOLVED, {\n value: true,\n enumerable: false,\n });\n return config;\n}\n\n/**\n * Derive fallback chains from locale tags: each locale falls back to its\n * successively shorter tag prefixes (longest first) that are themselves\n * configured, e.g. `\"zh-Hant-TW\"` → `[\"zh-Hant\", \"zh\"]`. Prefix matching is\n * case-insensitive (BCP-47 casing varies); chains store the configured\n * spelling. The default locale is excluded — it stays the implicit final\n * fallback so `indexFallback: \"none\"` keeps its meaning.\n */\nfunction deriveLocaleFallbacks(\n locales: readonly string[],\n defaultLocale: string,\n): LocaleFallbacks {\n const byLowercase = new Map(locales.map((l) => [l.toLowerCase(), l]));\n const fallbacks: LocaleFallbacks = {};\n for (const locale of locales) {\n const subtags = locale.split(\"-\");\n if (subtags.length < 2) continue;\n const chain: string[] = [];\n for (let end = subtags.length - 1; end >= 1; end--) {\n const prefix = byLowercase.get(subtags.slice(0, end).join(\"-\").toLowerCase());\n if (prefix && prefix !== locale && prefix !== defaultLocale) {\n chain.push(prefix);\n }\n }\n if (chain.length > 0) {\n fallbacks[locale] = chain;\n }\n }\n return fallbacks;\n}\n","import { z } from \"zod\";\nimport type { z as Zod } from \"zod\";\n\nconst FIELD_KIND = Symbol.for(\"@genlook/scribe/fieldKind\");\nconst RELATION_META = Symbol.for(\"@genlook/scribe/relationMeta\");\n\nexport type FieldKind = \"translatable\" | \"structural\";\n\nexport interface RelationMeta {\n typeId: string;\n multiple: boolean;\n optional: boolean;\n}\n\n/**\n * Type-level brand carried by `field.relation()` schemas so the target\n * content-type id (and multiplicity/optionality) survive into `related()`.\n * Never exists at runtime.\n */\nexport declare const RELATION_BRAND: unique symbol;\n\nexport interface RelationBrand<\n TTarget extends string = string,\n TMultiple extends boolean = boolean,\n TOptional extends boolean = boolean,\n> {\n target: TTarget;\n multiple: TMultiple;\n optional: TOptional;\n}\n\n/** A Zod schema branded with relation metadata (see `field.relation()`). */\nexport type RelationField<\n TZod extends Zod.ZodTypeAny,\n TBrand extends RelationBrand,\n> = TZod & { [RELATION_BRAND]: TBrand };\n\n/** Return whether a Zod field is translatable or structural. */\nexport function getFieldKind(schema: Zod.ZodTypeAny): FieldKind {\n const tagged = schema as Zod.ZodTypeAny & { [FIELD_KIND]?: FieldKind };\n return tagged[FIELD_KIND] ?? \"structural\";\n}\n\n/** Return relation metadata if the field was created with `field.relation()`. */\nexport function getRelationTarget(schema: Zod.ZodTypeAny): RelationMeta | null {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const tagged = current as Zod.ZodTypeAny & {\n [RELATION_META]?: RelationMeta;\n unwrap?: () => Zod.ZodTypeAny;\n removeDefault?: () => Zod.ZodTypeAny;\n _def?: { innerType?: Zod.ZodTypeAny };\n };\n if (tagged[RELATION_META]) {\n return tagged[RELATION_META];\n }\n if (typeof tagged.unwrap === \"function\") {\n current = tagged.unwrap();\n continue;\n }\n if (typeof tagged.removeDefault === \"function\") {\n current = tagged.removeDefault();\n continue;\n }\n if (tagged._def?.innerType) {\n current = tagged._def.innerType;\n continue;\n }\n break;\n }\n return null;\n}\n\nfunction mark<T extends Zod.ZodTypeAny>(schema: T, kind: FieldKind): T {\n Object.defineProperty(schema, FIELD_KIND, {\n value: kind,\n enumerable: false,\n configurable: true,\n });\n return schema;\n}\n\nfunction markRelation<T extends Zod.ZodTypeAny>(schema: T, meta: RelationMeta): T {\n Object.defineProperty(schema, RELATION_META, {\n value: meta,\n enumerable: false,\n configurable: true,\n });\n return mark(schema, \"structural\");\n}\n\n/**\n * Options for `field.relation()`. Constraints live here (not as chained Zod\n * methods) because chaining clones the schema and would drop the relation\n * metadata.\n */\nexport interface RelationFieldOptions {\n /** The field holds an array of slugs instead of a single slug. */\n multiple?: boolean;\n /** The field may be omitted; `related()` then returns `null` (single) or `[]` (multiple). */\n optional?: boolean;\n /** Minimum item count (`multiple: true` only). */\n min?: number;\n /** Maximum item count (`multiple: true` only). */\n max?: number;\n}\n\ntype Bool<T> = [T] extends [true] ? true : false;\n\ntype RelationZod<TOpts extends RelationFieldOptions> =\n Bool<TOpts[\"optional\"]> extends true\n ? Zod.ZodOptional<\n Bool<TOpts[\"multiple\"]> extends true ? Zod.ZodArray<Zod.ZodString> : Zod.ZodString\n >\n : Bool<TOpts[\"multiple\"]> extends true\n ? Zod.ZodArray<Zod.ZodString>\n : Zod.ZodString;\n\ntype RelationFieldFor<\n TTarget extends string,\n TOpts extends RelationFieldOptions,\n> = RelationField<\n RelationZod<TOpts>,\n RelationBrand<TTarget, Bool<TOpts[\"multiple\"]>, Bool<TOpts[\"optional\"]>>\n>;\n\n/**\n * Mark Zod fields for Scribe:\n * - `translatable(schema)` — sent to the translator per locale.\n * - `structural(schema)` — EN-only; merged from EN into every locale document.\n * - `relation(typeId, options?)` — EN slug reference(s) to another content type,\n * validated by `scribe validate` and dereferenced via `scribe.<type>.related()`.\n */\nexport const field = {\n translatable: <T extends Zod.ZodTypeAny>(schema: T): T => mark(schema, \"translatable\"),\n structural: <T extends Zod.ZodTypeAny>(schema: T): T => mark(schema, \"structural\"),\n relation: <const TTarget extends string, const TOpts extends RelationFieldOptions = {}>(\n typeId: TTarget,\n options?: TOpts,\n ): RelationFieldFor<TTarget, TOpts> => {\n const multiple = options?.multiple ?? false;\n const optional = options?.optional ?? false;\n if ((options?.min !== undefined || options?.max !== undefined) && !multiple) {\n throw new Error(\n `field.relation(\"${typeId}\"): min/max require { multiple: true }`,\n );\n }\n let inner: Zod.ZodTypeAny;\n if (multiple) {\n let arr = z.array(z.string().min(1));\n if (options?.min !== undefined) arr = arr.min(options.min);\n if (options?.max !== undefined) arr = arr.max(options.max);\n inner = arr;\n } else {\n inner = z.string().min(1);\n }\n markRelation(inner, { typeId, multiple, optional });\n const schema = optional ? inner.optional() : inner;\n return schema as RelationFieldFor<TTarget, TOpts>;\n },\n};\n\n/** Strip Zod wrappers (optional, default, etc.) to reach the inner schema. */\nexport function unwrapSchema(schema: Zod.ZodTypeAny): Zod.ZodTypeAny {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const anySchema = current as Zod.ZodTypeAny & {\n unwrap?: () => Zod.ZodTypeAny;\n removeDefault?: () => Zod.ZodTypeAny;\n _def?: { innerType?: Zod.ZodTypeAny; type?: string };\n };\n if (typeof anySchema.unwrap === \"function\") {\n current = anySchema.unwrap();\n continue;\n }\n if (typeof anySchema.removeDefault === \"function\") {\n current = anySchema.removeDefault();\n continue;\n }\n if (anySchema._def?.innerType) {\n current = anySchema._def.innerType;\n continue;\n }\n break;\n }\n return current;\n}\n\n/** Strip optional/default/nullable wrappers only — preserves arrays and objects. */\nexport function peelOptionalWrappers(schema: Zod.ZodTypeAny): Zod.ZodTypeAny {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const type = (current as Zod.ZodTypeAny & { _def?: { type?: string } })._def?.type;\n if (type === \"optional\" || type === \"nullable\") {\n current = (current as Zod.ZodOptional<Zod.ZodTypeAny>).unwrap();\n continue;\n }\n if (type === \"default\") {\n current = (current as Zod.ZodDefault<Zod.ZodTypeAny>).removeDefault();\n continue;\n }\n break;\n }\n return current;\n}\n","import type { z } from \"zod\";\nimport { getFieldKind, getRelationTarget, peelOptionalWrappers } from \"./field.js\";\n\nexport interface SchemaFieldMeta {\n path: string[];\n kind: \"translatable\" | \"structural\" | \"relation\";\n relationTarget?: string;\n relationMultiple?: boolean;\n relationOptional?: boolean;\n}\n\nfunction getArrayElement(schema: z.ZodTypeAny): z.ZodTypeAny | null {\n if (\n schema instanceof Object &&\n \"element\" in schema &&\n (schema as z.ZodTypeAny & { _def?: { type?: string } })._def?.type === \"array\"\n ) {\n return (schema as z.ZodArray<z.ZodTypeAny>).element as z.ZodTypeAny;\n }\n return null;\n}\n\n/**\n * List schema fields with translatable/structural/relation metadata.\n * Array-of-object fields recurse with a `*` path segment (`steps.*.title`) so\n * extraction and merging preserve the array shape. Note: `peelOptionalWrappers`\n * is used (not `unwrapSchema`) because zod v4 arrays expose `unwrap()`, which\n * would silently flatten the array level out of the paths.\n */\nexport function introspectSchema(schema: z.ZodTypeAny, prefix: string[] = []): SchemaFieldMeta[] {\n const relation = getRelationTarget(schema);\n if (relation && prefix.length > 0) {\n return [\n {\n path: prefix,\n kind: \"relation\",\n relationTarget: relation.typeId,\n relationMultiple: relation.multiple,\n relationOptional: relation.optional,\n },\n ];\n }\n\n // An explicit translatable mark makes the whole subtree one translation unit\n // (e.g. field.translatable(z.array(z.string()))).\n if (prefix.length > 0 && getFieldKind(schema) === \"translatable\") {\n return [{ path: prefix, kind: \"translatable\" }];\n }\n\n const base = peelOptionalWrappers(schema);\n if (base instanceof Object && \"shape\" in base) {\n const shape = (base as z.ZodObject<z.ZodRawShape>).shape;\n const fields: SchemaFieldMeta[] = [];\n for (const [key, child] of Object.entries(shape)) {\n fields.push(...introspectSchema(child as z.ZodTypeAny, [...prefix, key]));\n }\n return fields;\n }\n\n const element = getArrayElement(base);\n if (element) {\n const elementBase = peelOptionalWrappers(element);\n if (elementBase instanceof Object && \"shape\" in elementBase) {\n const shape = (elementBase as z.ZodObject<z.ZodRawShape>).shape;\n const fields: SchemaFieldMeta[] = [];\n for (const [key, child] of Object.entries(shape)) {\n fields.push(...introspectSchema(child as z.ZodTypeAny, [...prefix, \"*\", key]));\n }\n return fields;\n }\n }\n\n return [{ path: prefix, kind: getFieldKind(schema) }];\n}\n\ninterface PathTrie {\n leaf: boolean;\n children: Map<string, PathTrie>;\n}\n\nfunction buildPathTrie(paths: string[][]): PathTrie {\n const root: PathTrie = { leaf: false, children: new Map() };\n for (const path of paths) {\n let node = root;\n for (const segment of path) {\n let child = node.children.get(segment);\n if (!child) {\n child = { leaf: false, children: new Map() };\n node.children.set(segment, child);\n }\n node = child;\n }\n node.leaf = true;\n }\n return root;\n}\n\nfunction extractNode(data: unknown, trie: PathTrie): unknown {\n if (trie.leaf) return data;\n\n const star = trie.children.get(\"*\");\n if (star) {\n if (!Array.isArray(data)) return undefined;\n // Preserve array length so structural/translatable halves merge per index.\n return data.map((item) =>\n typeof item === \"object\" && item !== null ? (extractNode(item, star) ?? {}) : {},\n );\n }\n\n if (typeof data !== \"object\" || data === null || Array.isArray(data)) return undefined;\n const record = data as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n let any = false;\n for (const [key, child] of trie.children) {\n const value = extractNode(record[key], child);\n if (value !== undefined) {\n out[key] = value;\n any = true;\n }\n }\n return any ? out : undefined;\n}\n\nexport function extractByPaths(\n data: Record<string, unknown>,\n paths: string[][],\n): Record<string, unknown> {\n if (paths.length === 0) return {};\n const extracted = extractNode(data, buildPathTrie(paths));\n return extracted && typeof extracted === \"object\" && !Array.isArray(extracted)\n ? (extracted as Record<string, unknown>)\n : {};\n}\n\n/** Extract frontmatter fields marked as translatable. */\nexport function pickTranslatable(data: Record<string, unknown>, schema: z.ZodTypeAny): Record<string, unknown> {\n const translatablePaths = introspectSchema(schema)\n .filter((f) => f.kind === \"translatable\")\n .map((f) => f.path);\n return extractByPaths(data, translatablePaths);\n}\n\n/** Extract frontmatter fields marked as structural (EN-only). */\nexport function pickStructural(data: Record<string, unknown>, schema: z.ZodTypeAny): Record<string, unknown> {\n const structuralPaths = introspectSchema(schema)\n .filter((f) => f.kind === \"structural\" || f.kind === \"relation\")\n .map((f) => f.path);\n return extractByPaths(data, structuralPaths);\n}\n\n/** Merge EN structural fields onto a locale document's frontmatter at load time. */\nexport function mergeStructuralOntoLocale(\n localeData: Record<string, unknown>,\n enData: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n const structural = pickStructural(enData, schema);\n const translatable = pickTranslatable(localeData, schema);\n return deepMerge(structural, translatable);\n}\n\nfunction deepMerge(base: Record<string, unknown>, overlay: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(overlay)) {\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n out[key] &&\n typeof out[key] === \"object\" &&\n !Array.isArray(out[key])\n ) {\n out[key] = deepMerge(out[key] as Record<string, unknown>, value as Record<string, unknown>);\n } else if (Array.isArray(value) && Array.isArray(out[key])) {\n out[key] = mergeArrayOverlay(out[key] as unknown[], value as unknown[]);\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\nfunction mergeArrayOverlay(base: unknown[], overlay: unknown[]): unknown[] {\n return base.map((item, index) => {\n const overlayItem = overlay[index];\n if (\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n overlayItem &&\n typeof overlayItem === \"object\" &&\n !Array.isArray(overlayItem)\n ) {\n return deepMerge(item as Record<string, unknown>, overlayItem as Record<string, unknown>);\n }\n return overlayItem ?? item;\n });\n}\n\n/** Collect relation field paths and targets from a content schema. */\nexport function listRelationFields(schema: z.ZodTypeAny): SchemaFieldMeta[] {\n return introspectSchema(schema).filter((f) => f.kind === \"relation\");\n}\n","import { z } from \"zod\";\nimport { createUrlBuilder, pathPrefix, pathSuffix } from \"../i18n/build-url.js\";\nimport type { ContentTypeConfig, LocaleRoutingConfig, ScribeDocument } from \"./types.js\";\n\nexport const SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nexport const slugPatternSchema = z\n .string()\n .regex(SLUG_PATTERN, \"slug must be lowercase-kebab-case\");\n\nexport const isoDateSchema = z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}(T[\\d:.Z+-]*)?$/, \"Use ISO date YYYY-MM-DD or full ISO 8601\");\n\nconst canonicalPathSchema = z.string().regex(/^\\//, \"canonicalPath must start with /\");\n\nexport interface BuiltinEnFields {\n publishedAt?: string;\n updatedAt?: string;\n noindex: boolean;\n /** Set only when explicitly provided in EN frontmatter. */\n canonicalPathOverride?: string;\n}\n\nexport interface BuiltinParseIssue {\n field: string;\n message: string;\n level: \"error\" | \"warning\";\n}\n\nconst LOCALE_BUILTIN_KEYS: Array<[string, string]> = [\n [\"publishedAt\", \"publishedAt is EN-only; inherited from the EN parent at load time\"],\n [\"updatedAt\", \"updatedAt is EN-only; inherited from the EN parent at load time\"],\n [\"noindex\", \"noindex is EN-only; inherited from the EN parent at load time\"],\n [\"canonicalPath\", \"canonicalPath is EN-only; inherited from the EN parent at load time\"],\n [\"aliases\", \"aliases is EN-only; remove from locale translation\"],\n [\"redirect_to\", \"redirect_to is EN-only; remove from locale translation\"],\n [\"translationOf\", \"translationOf is internal; remove from locale translation\"],\n [\"enSlug\", \"enSlug is internal; remove from locale translation\"],\n];\n\nconst DEPRECATED_REDIRECT_FIELDS: Array<[string, string]> = [\n [\n \"aliases\",\n \"aliases frontmatter is removed — add redirects to content/<type>/_redirects.json instead\",\n ],\n [\n \"redirect_to\",\n \"redirect_to frontmatter is removed — add redirects to content/<type>/_redirects.json instead\",\n ],\n];\n\n/** Extract built-in EN frontmatter (dates, SEO) before Zod validation. */\nexport function extractBuiltinEnFields(\n data: Record<string, unknown>,\n _pathTemplate: string | undefined,\n _enSlug: string,\n _defaultLocale: string,\n): {\n builtin: BuiltinEnFields;\n rest: Record<string, unknown>;\n issues: BuiltinParseIssue[];\n} {\n const issues: BuiltinParseIssue[] = [];\n const rest = { ...data };\n\n for (const [field, message] of DEPRECATED_REDIRECT_FIELDS) {\n if (rest[field] !== undefined) {\n issues.push({ field, message, level: \"error\" });\n delete rest[field];\n }\n }\n\n let publishedAt: string | undefined;\n if (rest.publishedAt !== undefined && rest.publishedAt !== null && rest.publishedAt !== \"\") {\n const parsed = isoDateSchema.safeParse(rest.publishedAt);\n if (parsed.success) {\n publishedAt = parsed.data;\n } else {\n for (const issue of parsed.error.issues) {\n issues.push({ field: \"publishedAt\", message: issue.message, level: \"error\" });\n }\n }\n delete rest.publishedAt;\n }\n\n let updatedAt: string | undefined;\n if (rest.updatedAt !== undefined && rest.updatedAt !== null && rest.updatedAt !== \"\") {\n const parsed = isoDateSchema.safeParse(rest.updatedAt);\n if (parsed.success) {\n updatedAt = parsed.data;\n } else {\n for (const issue of parsed.error.issues) {\n issues.push({ field: \"updatedAt\", message: issue.message, level: \"error\" });\n }\n }\n delete rest.updatedAt;\n } else if (publishedAt) {\n updatedAt = publishedAt;\n }\n\n let noindex = false;\n if (rest.noindex !== undefined && rest.noindex !== null && rest.noindex !== \"\") {\n if (typeof rest.noindex === \"boolean\") {\n noindex = rest.noindex;\n } else {\n issues.push({ field: \"noindex\", message: \"noindex must be a boolean\", level: \"error\" });\n }\n delete rest.noindex;\n }\n\n let canonicalPathOverride: string | undefined;\n if (rest.canonicalPath !== undefined && rest.canonicalPath !== null && rest.canonicalPath !== \"\") {\n const parsed = canonicalPathSchema.safeParse(rest.canonicalPath);\n if (parsed.success) {\n canonicalPathOverride = parsed.data;\n } else {\n for (const issue of parsed.error.issues) {\n issues.push({ field: \"canonicalPath\", message: issue.message, level: \"error\" });\n }\n }\n delete rest.canonicalPath;\n }\n\n for (const internalKey of [\"translationOf\", \"enSlug\"] as const) {\n if (rest[internalKey] !== undefined) {\n issues.push({\n field: internalKey,\n message: `${internalKey} is managed internally by Scribe; remove from frontmatter`,\n level: \"warning\",\n });\n delete rest[internalKey];\n }\n }\n\n return {\n builtin: {\n publishedAt,\n updatedAt,\n noindex,\n canonicalPathOverride,\n },\n rest,\n issues,\n };\n}\n\n/** Reject built-in keys on locale translation frontmatter. */\nexport function validateLocaleBuiltinFields(data: Record<string, unknown>): BuiltinParseIssue[] {\n const issues: BuiltinParseIssue[] = [];\n for (const [key, message] of LOCALE_BUILTIN_KEYS) {\n if (data[key] !== undefined) {\n issues.push({ field: key, message, level: \"error\" });\n }\n }\n return issues;\n}\n\n/** ISO date for sitemap lastmod from updatedAt or publishedAt. */\nexport function documentLastModified(doc: {\n updatedAt?: string;\n publishedAt?: string;\n}): string | undefined {\n const raw = doc.updatedAt ?? doc.publishedAt;\n if (!raw) return undefined;\n const date = new Date(raw);\n return Number.isNaN(date.getTime()) ? undefined : date.toISOString();\n}\n\n/** Locale-aware pathname for a document. */\nexport function resolveCanonicalPathname(\n type: Pick<ContentTypeConfig, \"path\">,\n doc: Pick<ScribeDocument, \"slug\" | \"locale\" | \"canonicalPathOverride\">,\n defaultLocale: string,\n localeRouting?: LocaleRoutingConfig,\n): string {\n const urlBuilder = createUrlBuilder({\n locales: [defaultLocale, ...(doc.locale !== defaultLocale ? [doc.locale] : [])],\n defaultLocale,\n localeRouting: localeRouting ?? { strategy: \"path-prefix\", prefixDefaultLocale: false },\n });\n\n if (doc.canonicalPathOverride) {\n return urlBuilder.applyLocaleToPath(doc.canonicalPathOverride, doc.locale);\n }\n if (!type.path) return `/${doc.slug}`;\n return urlBuilder.resolvePath(type.path, doc.slug, doc.locale);\n}\n\n/** Hydrate locale frontmatter with EN-only built-in fields at load time. */\nexport function mergeBuiltinsIntoFrontmatter(\n frontmatter: Record<string, unknown>,\n doc: Pick<\n ScribeDocument,\n \"publishedAt\" | \"updatedAt\" | \"noindex\" | \"canonicalPathOverride\" | \"slug\" | \"locale\"\n >,\n type: Pick<ContentTypeConfig, \"path\">,\n defaultLocale: string,\n localeRouting?: LocaleRoutingConfig,\n): Record<string, unknown> {\n const out = { ...frontmatter };\n if (doc.publishedAt !== undefined) out.publishedAt = doc.publishedAt;\n if (doc.updatedAt !== undefined) out.updatedAt = doc.updatedAt;\n out.noindex = doc.noindex;\n out.canonicalPath = resolveCanonicalPathname(type, doc, defaultLocale, localeRouting);\n return out;\n}\n\nexport function seoFieldsFromEn(enDoc: ScribeDocument): Pick<\n ScribeDocument,\n \"publishedAt\" | \"updatedAt\" | \"noindex\" | \"canonicalPathOverride\"\n> {\n return {\n publishedAt: enDoc.publishedAt,\n updatedAt: enDoc.updatedAt,\n noindex: enDoc.noindex,\n canonicalPathOverride: enDoc.canonicalPathOverride,\n };\n}\n\nexport { pathPrefix, pathSuffix };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport Database from \"better-sqlite3\";\nimport type { ScribeConfig } from \"../core/types.js\";\n\nconst SCHEMA_VERSION = 5;\n\nconst MIGRATIONS: string[] = [\n `CREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n )`,\n `CREATE TABLE IF NOT EXISTS translations (\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n locale TEXT NOT NULL,\n slug TEXT NOT NULL,\n frontmatter_json TEXT NOT NULL,\n body TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n translated_at TEXT NOT NULL,\n model TEXT NOT NULL,\n PRIMARY KEY (content_type, en_slug, locale)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_translations_type_locale\n ON translations(content_type, locale)`,\n `CREATE TABLE IF NOT EXISTS slug_aliases (\n content_type TEXT NOT NULL,\n canonical_en_slug TEXT NOT NULL,\n alias_en_slug TEXT NOT NULL,\n created_at TEXT NOT NULL,\n PRIMARY KEY (content_type, alias_en_slug)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_slug_aliases_canonical\n ON slug_aliases(content_type, canonical_en_slug)`,\n `CREATE TABLE IF NOT EXISTS alias_locale_slugs (\n content_type TEXT NOT NULL,\n alias_en_slug TEXT NOT NULL,\n locale TEXT NOT NULL,\n locale_slug TEXT NOT NULL,\n captured_at TEXT NOT NULL,\n PRIMARY KEY (content_type, alias_en_slug, locale)\n )`,\n `CREATE TABLE IF NOT EXISTS en_snapshots (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n frontmatter_json TEXT NOT NULL,\n body TEXT NOT NULL,\n created_at TEXT NOT NULL,\n UNIQUE (content_type, en_slug, en_hash)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_en_snapshots_lookup\n ON en_snapshots(content_type, en_slug, created_at DESC)`,\n `CREATE TABLE IF NOT EXISTS translation_batch_jobs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n job_name TEXT NOT NULL UNIQUE,\n model TEXT NOT NULL,\n display_model TEXT NOT NULL,\n created_at TEXT NOT NULL,\n state TEXT NOT NULL,\n completed_at TEXT\n )`,\n `CREATE TABLE IF NOT EXISTS translation_batch_items (\n job_id INTEGER NOT NULL,\n request_index INTEGER NOT NULL,\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n locale TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n snapshot_id INTEGER NOT NULL,\n status TEXT NOT NULL,\n error TEXT,\n PRIMARY KEY (job_id, request_index)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_batch_items_status\n ON translation_batch_items(status)`,\n];\n\nexport type SqliteMode = \"readonly\" | \"readwrite\";\n\n/** Absolute path to the SQLite translation store (precomputed by `resolveConfig`). */\nexport function resolveStorePath(config: ScribeConfig): string {\n return config.storePath;\n}\n\n/** Open the SQLite translation store (creates schema if missing). */\nexport function openStore(config: ScribeConfig, mode: SqliteMode = \"readwrite\"): Database.Database {\n const storePath = resolveStorePath(config);\n if (mode === \"readwrite\") {\n fs.mkdirSync(path.dirname(storePath), { recursive: true });\n }\n const db = new Database(storePath, { readonly: mode === \"readonly\" });\n if (mode === \"readwrite\") {\n migrate(db);\n }\n return db;\n}\n\nfunction addColumnIfMissing(\n db: Database.Database,\n table: string,\n column: string,\n ddlType: string,\n): void {\n const columns = db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n if (!columns.some((c) => c.name === column)) {\n db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${ddlType}`);\n }\n}\n\nfunction readSchemaVersion(db: Database.Database): number {\n const metaTable = db\n .prepare(`SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'meta'`)\n .get();\n if (!metaTable) return 0;\n const row = db.prepare(`SELECT value FROM meta WHERE key = 'schema_version'`).get() as\n | { value: string }\n | undefined;\n return row ? Number.parseInt(row.value, 10) || 0 : 0;\n}\n\nfunction migrate(db: Database.Database): void {\n const previousVersion = readSchemaVersion(db);\n\n for (const sql of MIGRATIONS) {\n db.exec(sql);\n }\n\n if (previousVersion < 4) {\n db.exec(`DROP TABLE IF EXISTS revisions`);\n }\n\n addColumnIfMissing(db, \"translations\", \"snapshot_id\", \"INTEGER\");\n\n db.prepare(\n `INSERT INTO meta(key, value) VALUES('schema_version', ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`,\n ).run(String(SCHEMA_VERSION));\n}\n\nexport function closeStore(db: Database.Database): void {\n db.close();\n}\n","import type Database from \"better-sqlite3\";\n\nexport interface TranslationRow {\n content_type: string;\n en_slug: string;\n locale: string;\n slug: string;\n frontmatter_json: string;\n body: string;\n en_hash: string;\n translated_at: string;\n model: string;\n snapshot_id: number | null;\n}\n\nexport interface TranslationInput {\n contentType: string;\n enSlug: string;\n locale: string;\n slug: string;\n frontmatter: Record<string, unknown>;\n body: string;\n enHash: string;\n translatedAt: string;\n model: string;\n snapshotId: number;\n}\n\nexport interface EnSnapshotInput {\n contentType: string;\n enSlug: string;\n enHash: string;\n frontmatter: Record<string, unknown>;\n body: string;\n createdAt: string;\n}\n\nexport interface EnSnapshotRow {\n id: number;\n content_type: string;\n en_slug: string;\n en_hash: string;\n frontmatter_json: string;\n body: string;\n created_at: string;\n}\n\nexport interface EnSnapshotWithLocales extends EnSnapshotRow {\n locales: string;\n}\n\nexport function getOrCreateEnSnapshot(db: Database.Database, input: EnSnapshotInput): number {\n db.prepare(\n `INSERT OR IGNORE INTO en_snapshots (\n content_type, en_slug, en_hash, frontmatter_json, body, created_at\n ) VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n input.contentType,\n input.enSlug,\n input.enHash,\n JSON.stringify(input.frontmatter),\n input.body,\n input.createdAt,\n );\n\n const row = db\n .prepare(\n `SELECT id FROM en_snapshots\n WHERE content_type = ? AND en_slug = ? AND en_hash = ?`,\n )\n .get(input.contentType, input.enSlug, input.enHash) as { id: number };\n\n return row.id;\n}\n\nexport function getEnSnapshot(\n db: Database.Database,\n snapshotId: number,\n): EnSnapshotRow | undefined {\n return db\n .prepare(`SELECT * FROM en_snapshots WHERE id = ?`)\n .get(snapshotId) as EnSnapshotRow | undefined;\n}\n\nexport function listEnSnapshotsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): EnSnapshotWithLocales[] {\n return db\n .prepare(\n `SELECT s.*, GROUP_CONCAT(t.locale) AS locales\n FROM en_snapshots s\n LEFT JOIN translations t ON t.snapshot_id = s.id\n WHERE s.content_type = ? AND s.en_slug = ?\n GROUP BY s.id\n ORDER BY s.created_at DESC, s.id DESC`,\n )\n .all(contentType, enSlug) as EnSnapshotWithLocales[];\n}\n\nexport function upsertTranslation(db: Database.Database, input: TranslationInput): void {\n db.prepare(\n `INSERT INTO translations (\n content_type, en_slug, locale, slug, frontmatter_json, body, en_hash, translated_at, model, snapshot_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(content_type, en_slug, locale) DO UPDATE SET\n slug = excluded.slug,\n frontmatter_json = excluded.frontmatter_json,\n body = excluded.body,\n en_hash = excluded.en_hash,\n translated_at = excluded.translated_at,\n model = excluded.model,\n snapshot_id = excluded.snapshot_id`,\n ).run(\n input.contentType,\n input.enSlug,\n input.locale,\n input.slug,\n JSON.stringify(input.frontmatter),\n input.body,\n input.enHash,\n input.translatedAt,\n input.model,\n input.snapshotId,\n );\n}\n\nexport function getTranslation(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n locale: string,\n): TranslationRow | undefined {\n return db\n .prepare(\n `SELECT * FROM translations WHERE content_type = ? AND en_slug = ? AND locale = ?`,\n )\n .get(contentType, enSlug, locale) as TranslationRow | undefined;\n}\n\nexport function listTranslationsForType(\n db: Database.Database,\n contentType: string,\n): TranslationRow[] {\n return db\n .prepare(`SELECT * FROM translations WHERE content_type = ? ORDER BY en_slug, locale`)\n .all(contentType) as TranslationRow[];\n}\n\nexport function listTranslationsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): TranslationRow[] {\n return db\n .prepare(\n `SELECT * FROM translations WHERE content_type = ? AND en_slug = ? ORDER BY locale`,\n )\n .all(contentType, enSlug) as TranslationRow[];\n}\n\nexport function listTranslationsForLocale(\n db: Database.Database,\n contentType: string,\n locale: string,\n): TranslationRow[] {\n return db\n .prepare(`SELECT * FROM translations WHERE content_type = ? AND locale = ? ORDER BY en_slug`)\n .all(contentType, locale) as TranslationRow[];\n}\n\nexport function bulkLoadTranslations(db: Database.Database): TranslationRow[] {\n return db.prepare(`SELECT * FROM translations ORDER BY content_type, en_slug, locale`).all() as TranslationRow[];\n}\n\nexport function countTranslations(db: Database.Database): number {\n const row = db.prepare(`SELECT COUNT(*) as count FROM translations`).get() as { count: number };\n return row.count;\n}\n\nexport function countTranslationsByLocale(\n db: Database.Database,\n): Array<{ locale: string; count: number }> {\n return db\n .prepare(\n `SELECT locale, COUNT(*) as count FROM translations GROUP BY locale ORDER BY locale`,\n )\n .all() as Array<{ locale: string; count: number }>;\n}\n\nexport function latestTranslationAtByLocale(\n db: Database.Database,\n): Array<{ locale: string; latest: string }> {\n return db\n .prepare(\n `SELECT locale, MAX(translated_at) as latest FROM translations GROUP BY locale`,\n )\n .all() as Array<{ locale: string; latest: string }>;\n}\n\nexport function countStaleTranslations(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n currentEnHash: string,\n): number {\n const row = db\n .prepare(\n `SELECT COUNT(*) as count FROM translations\n WHERE content_type = ? AND en_slug = ? AND en_hash != ?`,\n )\n .get(contentType, enSlug, currentEnHash) as { count: number };\n return row.count;\n}\n","/** Detect Gemini returning JSON-style `\\n` escapes as literal characters in MDX bodies. */\nfunction needsMdxEscapeNormalization(body: string): boolean {\n return /\\\\n[ \\t/>]|<[\\w.-][^>]*\\\\n/.test(body);\n}\n\n/**\n * Gemini sometimes returns MDX body with JSON-style escape sequences as literal\n * characters (e.g. `\\n` instead of a newline), which breaks MDX parsing.\n */\nexport function normalizeTranslatedMdxBody(body: string): {\n body: string;\n adjusted: boolean;\n} {\n if (!needsMdxEscapeNormalization(body)) {\n return { body, adjusted: false };\n }\n\n const normalized = body\n .replace(/\\\\r\\\\n/g, \"\\n\")\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\\\/g, \"\\\\\");\n\n return { body: normalized, adjusted: normalized !== body };\n}\n","/**\n * Fix JSX opening-tag attributes whose double-quoted values contain raw `\"` characters\n * (e.g. Hebrew gereshayim in דוא\"ל), which break MDX parsing.\n */\nexport function sanitizeMdxJsxAttributeQuotes(body: string): {\n body: string;\n adjusted: boolean;\n} {\n let adjusted = false;\n let out = \"\";\n let i = 0;\n\n while (i < body.length) {\n if (body[i] !== \"<\" || !/[\\w.]/.test(body[i + 1] ?? \"\")) {\n out += body[i];\n i += 1;\n continue;\n }\n\n const tagStart = i;\n i += 1;\n while (i < body.length && /[\\w.-]/.test(body[i] ?? \"\")) i += 1;\n const tagName = body.slice(tagStart + 1, i);\n\n let tagOut = `<${tagName}`;\n let tagAdjusted = false;\n\n while (i < body.length && body[i] !== \">\" && body[i] !== \"/\") {\n while (i < body.length && /\\s/.test(body[i] ?? \"\")) {\n tagOut += body[i];\n i += 1;\n }\n if (i >= body.length || body[i] === \">\" || body[i] === \"/\") break;\n\n const attrStart = i;\n while (i < body.length && /[\\w:.-]/.test(body[i] ?? \"\")) i += 1;\n const attrName = body.slice(attrStart, i);\n // Not an attribute name (e.g. `<locale,` in prose or a code fence):\n // this is not a sanitizable tag — bail and copy the text through.\n if (!attrName) break;\n while (i < body.length && /\\s/.test(body[i] ?? \"\")) i += 1;\n if (body[i] !== \"=\") {\n tagOut += body.slice(attrStart, i);\n continue;\n }\n\n tagOut += body.slice(attrStart, i);\n tagOut += \"=\";\n i += 1;\n // Preserve any whitespace between `=` and the value so that inputs we do\n // not rewrite are copied through byte-for-byte.\n const wsStart = i;\n while (i < body.length && /\\s/.test(body[i] ?? \"\")) i += 1;\n tagOut += body.slice(wsStart, i);\n\n const quote = body[i];\n if (quote !== '\"' && quote !== \"'\") {\n // Unquoted or expression value (`href={x}`) — nothing to sanitize;\n // bail so the scan keeps making progress.\n break;\n }\n\n if (quote === \"'\") {\n const valStart = i + 1;\n i += 1;\n while (i < body.length) {\n if (body[i] === \"\\\\\") {\n i += 2;\n continue;\n }\n if (body[i] === \"'\") break;\n i += 1;\n }\n tagOut += body.slice(valStart - 1, i + 1);\n i += 1;\n continue;\n }\n\n const valStart = i + 1;\n i += 1;\n\n let closeIdx = -1;\n for (let scan = valStart; scan < body.length; scan += 1) {\n if (body[scan] !== '\"') continue;\n let j = scan + 1;\n while (j < body.length && /\\s/.test(body[j] ?? \"\")) j += 1;\n if (\n j < body.length &&\n (body[j] === \">\" || body[j] === \"/\" || /[a-zA-Z]/.test(body[j] ?? \"\"))\n ) {\n closeIdx = scan;\n break;\n }\n }\n\n if (closeIdx === -1) {\n tagOut += body.slice(valStart - 1, i);\n break;\n }\n\n const value = body.slice(valStart, closeIdx);\n const hasInternalQuote = value.includes('\"');\n\n if (hasInternalQuote) {\n const escaped = value.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\");\n tagOut += `'${escaped}'`;\n tagAdjusted = true;\n } else {\n tagOut += `\"${value}\"`;\n }\n\n i = closeIdx + 1;\n }\n\n if (tagAdjusted) adjusted = true;\n tagOut += body[i] ?? \"\";\n out += tagOut;\n i += 1;\n }\n\n return { body: out, adjusted };\n}\n","import remarkMdx from \"remark-mdx\";\nimport remarkParse from \"remark-parse\";\nimport { unified } from \"unified\";\nimport { normalizeTranslatedMdxBody } from \"./normalize-mdx-body.js\";\nimport { sanitizeMdxJsxAttributeQuotes } from \"./sanitize-mdx-jsx.js\";\n\nconst parser = unified().use(remarkParse).use(remarkMdx);\n\nexport function prepareTranslatedMdxBody(body: string): {\n body: string;\n adjusted: boolean;\n} {\n const normalized = normalizeTranslatedMdxBody(body);\n const sanitized = sanitizeMdxJsxAttributeQuotes(normalized.body);\n return {\n body: sanitized.body,\n adjusted: normalized.adjusted || sanitized.adjusted,\n };\n}\n\nexport function validateMdxBody(body: string): { ok: true } | { ok: false; error: string } {\n try {\n parser.parse(body);\n return { ok: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, error: message };\n }\n}\n\n/** Normalize, sanitize, and parse-check translated MDX before persistence. */\nexport function assertValidTranslatedMdxBody(body: string): {\n body: string;\n adjusted: boolean;\n} {\n const prepared = prepareTranslatedMdxBody(body);\n const validated = validateMdxBody(prepared.body);\n if (!validated.ok) {\n throw new Error(`MDX validation failed: ${validated.error}`);\n }\n return prepared;\n}\n","export function normalizeEnFrontmatter(data: Record<string, unknown>): Record<string, unknown> {\n const out = { ...data };\n if (!out.publishedAt && typeof out.date === \"string\") {\n out.publishedAt = out.date;\n }\n if (!out.heroImage && typeof out.image === \"string\" && out.image.startsWith(\"/\")) {\n out.heroImage = out.image;\n }\n if (!out.updatedAt && typeof out.publishedAt === \"string\") {\n out.updatedAt = out.publishedAt;\n }\n return out;\n}\n\nexport function isPublishableContentFile(name: string): boolean {\n if (!name.endsWith(\".md\") && !name.endsWith(\".mdx\")) return false;\n const first = name.charAt(0);\n return first === first.toLowerCase() && first !== \"_\";\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport type { z } from \"zod\";\nimport {\n extractBuiltinEnFields,\n mergeBuiltinsIntoFrontmatter,\n seoFieldsFromEn,\n} from \"../core/builtin-fields.js\";\nimport { mergeStructuralOntoLocale, pickTranslatable } from \"../core/introspect-schema.js\";\nimport type {\n AllDocuments,\n ContentTypeConfig,\n LocaleIndex,\n ScribeConfig,\n ScribeDocument,\n} from \"../core/types.js\";\nimport { openStore, resolveStorePath } from \"../storage/sqlite.js\";\nimport { listTranslationsForType } from \"../storage/translations.js\";\nimport { prepareTranslatedMdxBody } from \"../translate/validate-mdx-body.js\";\nimport { isPublishableContentFile, normalizeEnFrontmatter } from \"./normalize-en.js\";\n\nfunction isPostFile(name: string): boolean {\n return isPublishableContentFile(name);\n}\n\nfunction listEnFiles(contentDir: string): string[] {\n if (!fs.existsSync(contentDir)) return [];\n return fs\n .readdirSync(contentDir)\n .filter(isPostFile)\n .map((f) => path.join(contentDir, f));\n}\n\nfunction slugFromPath(filePath: string): string {\n return path.basename(filePath).replace(/\\.(md|mdx)$/, \"\");\n}\n\nexport interface ParseEnResult {\n document: ScribeDocument | null;\n issues: Array<{ field: string; message: string; level: \"error\" | \"warning\" }>;\n}\n\nexport function parseEnMdx(\n filePath: string,\n config: ScribeConfig,\n type: ContentTypeConfig,\n): ParseEnResult {\n const raw = fs.readFileSync(filePath, \"utf8\");\n const parsed = matter(raw);\n const slug = slugFromPath(filePath);\n const normalized = normalizeEnFrontmatter(parsed.data as Record<string, unknown>);\n const { builtin, rest, issues: builtinIssues } = extractBuiltinEnFields(\n normalized,\n type.path,\n slug,\n config.defaultLocale,\n );\n const issues = builtinIssues.map((issue) => ({\n field: issue.field,\n message: issue.message,\n level: issue.level,\n }));\n\n const result = type.schema.safeParse(rest);\n if (!result.success) {\n return {\n document: null,\n issues: [\n ...issues,\n ...result.error.issues.map((issue) => ({\n field: issue.path.join(\".\"),\n message: issue.message,\n level: \"error\" as const,\n })),\n ],\n };\n }\n\n if (issues.some((i) => i.level === \"error\")) {\n return { document: null, issues };\n }\n\n const frontmatter = mergeBuiltinsIntoFrontmatter(\n result.data as Record<string, unknown>,\n {\n publishedAt: builtin.publishedAt,\n updatedAt: builtin.updatedAt,\n noindex: builtin.noindex,\n canonicalPathOverride: builtin.canonicalPathOverride,\n slug,\n locale: config.defaultLocale,\n },\n type,\n config.defaultLocale,\n config.localeRouting,\n );\n\n const crossIssues = type.crossValidate?.(result.data as z.infer<typeof type.schema>, {\n locale: config.defaultLocale,\n defaultLocale: config.defaultLocale,\n slug,\n enSlug: slug,\n knownLocales: config.locales,\n }) ?? [];\n issues.push(...crossIssues);\n\n const document: ScribeDocument = {\n slug,\n enSlug: slug,\n locale: config.defaultLocale,\n publishedAt: builtin.publishedAt,\n updatedAt: builtin.updatedAt,\n noindex: builtin.noindex,\n canonicalPathOverride: builtin.canonicalPathOverride,\n frontmatter,\n content: parsed.content,\n filePath,\n };\n\n return { document, issues };\n}\n\nfunction buildDocumentFromTranslation(\n row: {\n slug: string;\n en_slug: string;\n locale: string;\n frontmatter_json: string;\n body: string;\n },\n enDoc: ScribeDocument,\n type: ContentTypeConfig,\n config: ScribeConfig,\n): ScribeDocument {\n const localeFm = JSON.parse(row.frontmatter_json) as Record<string, unknown>;\n const merged = mergeStructuralOntoLocale(localeFm, enDoc.frontmatter, type.schema);\n const seo = seoFieldsFromEn(enDoc);\n const frontmatter = mergeBuiltinsIntoFrontmatter(\n merged,\n { ...seo, slug: row.slug, locale: row.locale },\n type,\n config.defaultLocale,\n config.localeRouting,\n );\n\n return {\n slug: row.slug,\n enSlug: row.en_slug,\n locale: row.locale,\n publishedAt: seo.publishedAt,\n updatedAt: seo.updatedAt,\n noindex: seo.noindex,\n canonicalPathOverride: seo.canonicalPathOverride,\n frontmatter,\n content: prepareTranslatedMdxBody(row.body).body,\n };\n}\n\nconst DEV_REVALIDATE_MS = 1500;\n\nexport function createContentLoader(config: ScribeConfig, type: ContentTypeConfig): () => AllDocuments {\n let cached: AllDocuments | null = null;\n let signature = \"\";\n let lastCheck = 0;\n const contentDir = path.join(/* turbopackIgnore: true */ config.rootDir, type.contentDir);\n const storePath = resolveStorePath(config);\n const isProd = process.env.NODE_ENV === \"production\";\n\n function computeSignature(): string {\n const files = listEnFiles(contentDir);\n let newest = 0;\n for (const f of files) {\n try {\n newest = Math.max(newest, fs.statSync(f).mtimeMs);\n } catch {\n /* ignore */\n }\n }\n let store = 0;\n try {\n store = fs.statSync(storePath).mtimeMs;\n } catch {\n /* ignore */\n }\n return `${files.length}:${newest}:${store}`;\n }\n\n function build(): AllDocuments {\n const out = new Map<string, LocaleIndex>();\n const englishBySlug = new Map<string, ScribeDocument>();\n\n for (const file of listEnFiles(contentDir)) {\n const { document, issues } = parseEnMdx(file, config, type);\n if (document) {\n englishBySlug.set(document.slug, document);\n if (issues.length > 0) {\n for (const issue of issues) {\n console.warn(\n `[scribe:${type.id}] ${file} ${issue.level}: ${issue.field}: ${issue.message}`,\n );\n }\n }\n } else {\n console.warn(\n `[scribe:${type.id}] Skipping ${file} — validation failed:\\n` +\n issues.map((i) => ` - ${i.field}: ${i.message}`).join(\"\\n\"),\n );\n }\n }\n\n out.set(config.defaultLocale, {\n bySlug: englishBySlug,\n byEnSlug: englishBySlug,\n });\n\n const db = openStore(config, \"readonly\");\n const rows = listTranslationsForType(db, type.id);\n db.close();\n\n const rowsByLocale = new Map<string, typeof rows>();\n for (const row of rows) {\n const list = rowsByLocale.get(row.locale) ?? [];\n list.push(row);\n rowsByLocale.set(row.locale, list);\n }\n\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const bySlug = new Map<string, ScribeDocument>();\n const byEnSlug = new Map<string, ScribeDocument>();\n for (const row of rowsByLocale.get(locale) ?? []) {\n const enDoc = englishBySlug.get(row.en_slug);\n if (!enDoc) continue;\n const doc = buildDocumentFromTranslation(row, enDoc, type, config);\n bySlug.set(doc.slug, doc);\n byEnSlug.set(row.en_slug, doc);\n }\n out.set(locale, { bySlug, byEnSlug });\n }\n\n return out;\n }\n\n return () => {\n if (cached) {\n if (isProd) return cached;\n const now = Date.now();\n if (now - lastCheck < DEV_REVALIDATE_MS) return cached;\n lastCheck = now;\n const sig = computeSignature();\n if (sig === signature) return cached;\n cached = build();\n signature = sig;\n return cached;\n }\n lastCheck = Date.now();\n cached = build();\n signature = isProd ? \"\" : computeSignature();\n return cached;\n };\n}\n\nexport function readEnDocument(\n config: ScribeConfig,\n type: ContentTypeConfig,\n enSlug: string,\n): ScribeDocument | null {\n const contentDir = path.join(/* turbopackIgnore: true */ config.rootDir, type.contentDir);\n for (const ext of [\".mdx\", \".md\"]) {\n const filePath = path.join(contentDir, `${enSlug}${ext}`);\n if (!fs.existsSync(filePath)) continue;\n const { document } = parseEnMdx(filePath, config, type);\n return document;\n }\n return null;\n}\n\nexport function getTranslatablePayload(\n doc: ScribeDocument,\n type: ContentTypeConfig,\n): { frontmatter: Record<string, unknown>; body: string } {\n return {\n frontmatter: pickTranslatable(doc.frontmatter, type.schema),\n body: doc.content,\n };\n}\n","import type { ContentTypeConfig, ScribeDocument, ResolvedDocument } from \"../core/types.js\";\nimport { createUrlBuilder } from \"./build-url.js\";\nimport type { LocaleRoutingConfig } from \"../core/types.js\";\n\n/** Resolve a document by slug and locale (fallback, cross-locale slug correction). */\nexport function resolveLocalizedDocument<TDoc extends ScribeDocument>(\n slug: string,\n locale: string,\n defaultLocale: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n type: ContentTypeConfig,\n localeRouting?: LocaleRoutingConfig,\n fallbackLocales: readonly string[] = [],\n): ResolvedDocument<TDoc> {\n const urlBuilder = createUrlBuilder({\n locales: [defaultLocale, locale],\n defaultLocale,\n localeRouting: localeRouting ?? { strategy: \"path-prefix\", prefixDefaultLocale: false },\n });\n\n const idx = allDocs.get(locale);\n const direct = idx?.bySlug.get(slug);\n if (direct) {\n return { document: direct, actualLocale: locale };\n }\n\n for (const [docLocale, docIdx] of allDocs) {\n const found = docIdx.bySlug.get(slug);\n if (!found) continue;\n\n const enSlug = docLocale === defaultLocale ? found.slug : found.enSlug;\n\n // Which document should canonically serve the requested locale? Try the\n // requested locale first, then its configured fallback chain.\n let target: TDoc | undefined;\n let targetLocale = locale;\n for (const candidateLocale of [locale, ...fallbackLocales]) {\n const cand =\n candidateLocale === defaultLocale\n ? allDocs.get(candidateLocale)?.bySlug.get(enSlug)\n : allDocs.get(candidateLocale)?.byEnSlug.get(enSlug);\n if (cand) {\n target = cand;\n targetLocale = candidateLocale;\n break;\n }\n }\n\n if (target) {\n if (target.slug === slug) {\n return { document: target, actualLocale: targetLocale };\n }\n if (!type.path) {\n return { document: null, actualLocale: locale };\n }\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: urlBuilder.resolvePath(type.path, target.slug, locale),\n };\n }\n\n if (docLocale === defaultLocale) {\n return { document: found as TDoc, actualLocale: defaultLocale };\n }\n\n if (!type.path) {\n return { document: null, actualLocale: locale };\n }\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: urlBuilder.resolvePath(type.path, found.enSlug, locale),\n };\n }\n\n if (locale !== defaultLocale) {\n const enDoc = allDocs.get(defaultLocale)?.bySlug.get(slug);\n if (enDoc && type.indexFallback === \"en\") {\n return { document: enDoc as TDoc, actualLocale: defaultLocale };\n }\n const byEn = idx?.byEnSlug.get(slug);\n if (byEn) {\n return { document: byEn as TDoc, actualLocale: locale };\n }\n const fallback = allDocs.get(defaultLocale)?.bySlug.get(slug);\n if (fallback && type.indexFallback === \"en\") {\n return { document: fallback as TDoc, actualLocale: defaultLocale };\n }\n }\n\n return { document: null, actualLocale: locale };\n}\n\n/** Map a document slug from one locale to another via the EN parent slug. */\nexport function getSlugForLocale<TDoc extends ScribeDocument>(\n document: TDoc,\n sourceLocale: string,\n targetLocale: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n defaultLocale: string,\n): string | null {\n if (sourceLocale === targetLocale) return document.slug;\n\n const englishSlug = sourceLocale === defaultLocale ? document.slug : document.enSlug;\n if (!englishSlug) return null;\n if (targetLocale === defaultLocale) return englishSlug;\n\n return allDocs.get(targetLocale)?.byEnSlug.get(englishSlug)?.slug ?? null;\n}\n","import type {\n ContentTypeConfig,\n ContentTypeRuntime,\n ListOptions,\n OrderBy,\n ScribeConfig,\n ScribeDocument,\n ScribeProject,\n StaticParam,\n} from \"./core/types.js\";\nimport { listRelationFields, type SchemaFieldMeta } from \"./core/introspect-schema.js\";\nimport { createContentLoader } from \"./loader/create-loader.js\";\nimport { resolveLocalizedDocument } from \"./i18n/resolve-document.js\";\nimport { createUrlBuilder, isRoutableType } from \"./i18n/build-url.js\";\n\nfunction comparatorFor(orderBy: OrderBy): (a: ScribeDocument, b: ScribeDocument) => number {\n if (typeof orderBy === \"function\") return orderBy;\n switch (orderBy) {\n case \"publishedAt\":\n return (a, b) => (a.publishedAt ?? \"\").localeCompare(b.publishedAt ?? \"\");\n case \"-publishedAt\":\n return (a, b) => (b.publishedAt ?? \"\").localeCompare(a.publishedAt ?? \"\");\n case \"updatedAt\":\n return (a, b) => (a.updatedAt ?? \"\").localeCompare(b.updatedAt ?? \"\");\n case \"-updatedAt\":\n return (a, b) => (b.updatedAt ?? \"\").localeCompare(a.updatedAt ?? \"\");\n default:\n return (a, b) => a.slug.localeCompare(b.slug);\n }\n}\n\nfunction buildRuntime(\n config: ScribeConfig,\n type: ContentTypeConfig,\n getRuntime: (id: string) => ContentTypeRuntime,\n): ContentTypeRuntime {\n const load = createContentLoader(config, type);\n const relationFields = new Map<string, SchemaFieldMeta>(\n listRelationFields(type.schema)\n .filter((f) => f.path.length === 1)\n .map((f) => [f.path[0]!, f]),\n );\n\n function assertRoutable(method: string): string {\n if (!type.path) {\n throw new Error(\n `Content type \"${type.id}\" has no path template — ${method}() requires one`,\n );\n }\n return type.path;\n }\n\n const urlBuilder = createUrlBuilder(config);\n\n const runtime: ContentTypeRuntime = {\n id: type.id,\n config: type,\n load,\n\n list(locale = config.defaultLocale, options: ListOptions = {}) {\n const idx = load().get(locale);\n if (!idx) return [];\n const docs = Array.from(idx.bySlug.values());\n docs.sort(comparatorFor(options.orderBy ?? type.orderBy ?? \"slug\"));\n return options.limit !== undefined ? docs.slice(0, options.limit) : docs;\n },\n\n get(slug: string, locale = config.defaultLocale) {\n return load().get(locale)?.bySlug.get(slug) ?? null;\n },\n\n resolve(slug: string, locale: string) {\n const result = resolveLocalizedDocument(\n slug,\n locale,\n config.defaultLocale,\n load(),\n type,\n config.localeRouting,\n config.localeFallbacks[locale] ?? [],\n );\n if (result.document && type.path) {\n return {\n ...result,\n canonicalPath: urlBuilder.resolvePath(\n type.path,\n result.document.slug,\n result.actualLocale,\n ),\n };\n }\n return result;\n },\n\n staticParams(options = {}) {\n assertRoutable(\"staticParams\");\n const all = load();\n const enIdx = all.get(config.defaultLocale);\n if (!enIdx) return [];\n const params: StaticParam[] = [];\n for (const locale of options.locales ?? config.locales) {\n const localeIdx = all.get(locale);\n const fallbacks = config.localeFallbacks[locale] ?? [];\n for (const doc of enIdx.bySlug.values()) {\n let slug: string;\n if (locale === config.defaultLocale) {\n slug = doc.slug;\n } else {\n // Prefer the locale's own translated slug, then each fallback\n // locale's translated slug, then the EN slug — matching resolve().\n slug =\n localeIdx?.byEnSlug.get(doc.slug)?.slug ??\n fallbacks\n .map((fb) => all.get(fb)?.byEnSlug.get(doc.slug)?.slug)\n .find((s): s is string => s !== undefined) ??\n doc.slug;\n }\n params.push({ locale, slug });\n }\n }\n return params;\n },\n\n alternates(doc: ScribeDocument) {\n const pathTemplate = assertRoutable(\"alternates\");\n const out: Record<string, string> = {\n [config.defaultLocale]: urlBuilder.resolvePath(\n pathTemplate,\n doc.enSlug,\n config.defaultLocale,\n ),\n };\n const all = load();\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const translated = all.get(locale)?.byEnSlug.get(doc.enSlug);\n if (translated) {\n out[locale] = urlBuilder.resolvePath(pathTemplate, translated.slug, locale);\n }\n }\n return out;\n },\n\n translation(doc: ScribeDocument, targetLocale: string) {\n if (targetLocale === doc.locale) return doc;\n const all = load();\n if (targetLocale === config.defaultLocale) {\n return all.get(config.defaultLocale)?.bySlug.get(doc.enSlug) ?? null;\n }\n return all.get(targetLocale)?.byEnSlug.get(doc.enSlug) ?? null;\n },\n\n url(slug: string, locale: string) {\n const pathTemplate = assertRoutable(\"url\");\n return urlBuilder.resolvePath(pathTemplate, slug, locale);\n },\n\n related(doc: ScribeDocument, fieldName: string, locale?: string) {\n const meta = relationFields.get(fieldName);\n if (!meta) {\n throw new Error(\n `Content type \"${type.id}\" has no top-level relation field \"${fieldName}\"`,\n );\n }\n const target = getRuntime(meta.relationTarget!);\n const lookupLocale = locale ?? doc.locale;\n const value = (doc.frontmatter as Record<string, unknown>)[fieldName];\n\n // Relations always hold EN slugs (structural fields are merged from EN).\n // Deref in the requested locale, falling back to the EN doc unconditionally.\n const deref = (enSlug: string): ScribeDocument | null => {\n const all = target.load();\n return (\n all.get(lookupLocale)?.byEnSlug.get(enSlug) ??\n all.get(config.defaultLocale)?.bySlug.get(enSlug) ??\n null\n );\n };\n\n if (meta.relationMultiple) {\n if (!Array.isArray(value)) return [];\n return value\n .filter((slug): slug is string => typeof slug === \"string\" && slug.length > 0)\n .map(deref)\n .filter((d): d is ScribeDocument => d !== null);\n }\n\n if (typeof value !== \"string\" || value.length === 0) {\n if (meta.relationOptional) return null;\n throw new Error(\n `${type.id} \"${doc.enSlug}\": required relation \"${fieldName}\" is missing`,\n );\n }\n const resolved = deref(value);\n if (!resolved && !meta.relationOptional) {\n throw new Error(\n `${type.id} \"${doc.enSlug}\": relation \"${fieldName}\" references missing ` +\n `${meta.relationTarget} \"${value}\" — run \\`scribe validate\\``,\n );\n }\n return resolved;\n },\n } as ContentTypeRuntime;\n\n return runtime;\n}\n\n/**\n * Create the untyped project engine (CLI, validation, studio).\n * Apps should use `createScribe()` for typed per-type accessors.\n * Expects a resolved config (`resolveConfig` / `loadConfigSync`).\n *\n * @internal\n */\nexport function createProject(config: ScribeConfig): ScribeProject {\n const runtimes = new Map<string, ContentTypeRuntime>();\n const getRuntime = (id: string): ContentTypeRuntime => {\n const runtime = runtimes.get(id);\n if (!runtime) {\n throw new Error(`Unknown content type \"${id}\"`);\n }\n return runtime;\n };\n\n for (const type of config.types) {\n runtimes.set(type.id, buildRuntime(config, type, getRuntime));\n }\n\n return {\n config,\n rootDir: config.rootDir,\n storePath: config.storePath,\n getType: getRuntime,\n listTypes() {\n return Array.from(runtimes.values());\n },\n listRoutableTypes() {\n return Array.from(runtimes.values()).filter((runtime) => isRoutableType(runtime.config));\n },\n };\n}\n","import { z } from \"zod\";\nimport { slugPatternSchema } from \"../core/builtin-fields.js\";\n\nconst redirectFromSchema = z.union([\n slugPatternSchema,\n z.array(slugPatternSchema).min(1).max(20),\n]);\n\nexport const typeRedirectEntrySchema = z\n .object({\n from: redirectFromSchema,\n toSlug: slugPatternSchema.optional(),\n toType: z.string().min(1).optional(),\n toUrl: z.string().min(1).optional(),\n permanent: z.boolean().optional(),\n })\n .superRefine((entry, ctx) => {\n const hasToSlug = entry.toSlug !== undefined;\n const hasToUrl = entry.toUrl !== undefined;\n const hasToType = entry.toType !== undefined;\n const targetCount = Number(hasToSlug) + Number(hasToUrl);\n\n if (targetCount !== 1) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Each redirect must specify exactly one of toSlug/toType+toSlug or toUrl\",\n path: [\"toSlug\"],\n });\n return;\n }\n\n if (hasToUrl && hasToType) {\n ctx.addIssue({\n code: \"custom\",\n message: \"toUrl cannot be combined with toType\",\n path: [\"toUrl\"],\n });\n }\n\n if (hasToType && !hasToSlug) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Cross-type redirects require both toType and toSlug\",\n path: [\"toSlug\"],\n });\n }\n });\n\nexport const typeRedirectsFileSchema = z.object({\n redirects: z.array(typeRedirectEntrySchema).max(500),\n});\n\nexport type TypeRedirectEntry = z.infer<typeof typeRedirectEntrySchema>;\nexport type TypeRedirectsFile = z.infer<typeof typeRedirectsFileSchema>;\n\nexport type RedirectTargetKind = \"same-type\" | \"cross-type\" | \"anywhere\";\n\nexport interface ParsedRedirectEntry {\n fromSlugs: string[];\n kind: RedirectTargetKind;\n toSlug?: string;\n toType?: string;\n toUrl?: string;\n permanent: boolean;\n}\n\nexport function normalizeRedirectFrom(from: string | string[]): string[] {\n return Array.isArray(from) ? from : [from];\n}\n\nexport function parseRedirectEntry(entry: TypeRedirectEntry): ParsedRedirectEntry {\n const fromSlugs = normalizeRedirectFrom(entry.from);\n if (entry.toUrl !== undefined) {\n return {\n fromSlugs,\n kind: \"anywhere\",\n toUrl: entry.toUrl,\n permanent: entry.permanent ?? true,\n };\n }\n if (entry.toType !== undefined) {\n return {\n fromSlugs,\n kind: \"cross-type\",\n toType: entry.toType,\n toSlug: entry.toSlug,\n permanent: entry.permanent ?? true,\n };\n }\n return {\n fromSlugs,\n kind: \"same-type\",\n toSlug: entry.toSlug,\n permanent: entry.permanent ?? true,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ContentTypeConfig, ScribeConfig } from \"../core/types.js\";\nimport {\n parseRedirectEntry,\n type ParsedRedirectEntry,\n typeRedirectsFileSchema,\n} from \"./redirect-schema.js\";\n\nexport const TYPE_REDIRECTS_FILENAME = \"_redirects.json\";\n\nexport interface LoadedTypeRedirects {\n contentTypeId: string;\n contentDir: string;\n filePath: string;\n entries: ParsedRedirectEntry[];\n}\n\nfunction redirectsFilePath(config: ScribeConfig, type: ContentTypeConfig): string {\n return path.join(config.rootDir, type.contentDir, TYPE_REDIRECTS_FILENAME);\n}\n\nexport function loadTypeRedirectsFile(\n config: ScribeConfig,\n type: ContentTypeConfig,\n): LoadedTypeRedirects | null {\n const filePath = redirectsFilePath(config, type);\n if (!fs.existsSync(filePath)) return null;\n\n let raw: unknown;\n try {\n raw = JSON.parse(fs.readFileSync(filePath, \"utf8\"));\n } catch (error) {\n throw new Error(\n `${type.id}: failed to parse ${TYPE_REDIRECTS_FILENAME}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n const parsed = typeRedirectsFileSchema.safeParse(raw);\n if (!parsed.success) {\n const details = parsed.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"root\"}: ${issue.message}`)\n .join(\"; \");\n throw new Error(`${type.id}: invalid ${TYPE_REDIRECTS_FILENAME}: ${details}`);\n }\n\n return {\n contentTypeId: type.id,\n contentDir: type.contentDir,\n filePath,\n entries: parsed.data.redirects.map(parseRedirectEntry),\n };\n}\n\nexport function loadAllTypeRedirects(config: ScribeConfig): LoadedTypeRedirects[] {\n const out: LoadedTypeRedirects[] = [];\n for (const type of config.types) {\n const loaded = loadTypeRedirectsFile(config, type);\n if (loaded) out.push(loaded);\n }\n return out;\n}\n\nexport function collectRedirectSourceSlugs(loaded: LoadedTypeRedirects[]): Set<string> {\n const slugs = new Set<string>();\n for (const file of loaded) {\n for (const entry of file.entries) {\n for (const from of entry.fromSlugs) {\n slugs.add(from);\n }\n }\n }\n return slugs;\n}\n\nexport function collectOutboundRedirectSourcesByType(\n loaded: LoadedTypeRedirects[],\n): Map<string, Set<string>> {\n const out = new Map<string, Set<string>>();\n for (const file of loaded) {\n const set = out.get(file.contentTypeId) ?? new Set<string>();\n for (const entry of file.entries) {\n for (const from of entry.fromSlugs) {\n set.add(from);\n }\n }\n out.set(file.contentTypeId, set);\n }\n return out;\n}\n","import type { ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { createUrlBuilder, isRoutableType } from \"../i18n/build-url.js\";\nimport { buildTranslationIndex } from \"../i18n/translation-index.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\nimport {\n buildJsonRedirects,\n buildLegacyNoBlogPathRedirects,\n buildRedirectSourceSlugSet,\n} from \"./build-json-redirects.js\";\nimport {\n collectOutboundRedirectSourcesByType,\n collectRedirectSourceSlugs,\n loadAllTypeRedirects,\n} from \"./load-type-redirects.js\";\nimport type { NextRedirectRule } from \"./types.js\";\n\nexport interface BuildRedirectsOptions {\n /** Locales that use a URL prefix (excludes default locale). Deprecated: derived from localeRouting when omitted. */\n prefixedLocales?: string[];\n}\n\nfunction buildRedirectTranslationIndex(\n project: ScribeProject,\n typeId: string,\n redirectSourceSlugs: Set<string>,\n): Map<string, Map<string, string>> {\n const runtime = project.getType(typeId);\n const { config } = project;\n const merged = buildTranslationIndex(\n runtime.load(),\n config.locales,\n config.defaultLocale,\n );\n\n const db = openStore(project.config, \"readonly\");\n try {\n for (const alias of redirectSourceSlugs) {\n for (const row of listTranslationsForEnSlug(db, typeId, alias)) {\n const localeMap = merged.get(row.locale) ?? new Map<string, string>();\n if (!localeMap.has(alias)) {\n localeMap.set(alias, row.slug);\n }\n merged.set(row.locale, localeMap);\n }\n }\n } finally {\n db.close();\n }\n\n return merged;\n}\n\nfunction buildCrossLocaleSlugRedirects(\n project: ScribeProject,\n typeId: string,\n redirectSourceSlugs: Set<string>,\n): NextRedirectRule[] {\n const type = project.getType(typeId).config;\n if (!isRoutableType(type)) return [];\n\n const urlBuilder = createUrlBuilder(project.config);\n const translationIndex = buildRedirectTranslationIndex(project, typeId, redirectSourceSlugs);\n const out: NextRedirectRule[] = [];\n const pathTemplate = type.path!;\n\n for (const [locale, localeMap] of translationIndex) {\n for (const [enSlug, translatedSlug] of localeMap) {\n if (enSlug === translatedSlug) continue;\n if (redirectSourceSlugs.has(enSlug)) continue;\n out.push({\n source: urlBuilder.resolvePath(pathTemplate, enSlug, locale),\n destination: urlBuilder.resolvePath(pathTemplate, translatedSlug, locale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildTypeRedirects(project: ScribeProject, typeId: string): NextRedirectRule[] {\n const loaded = loadAllTypeRedirects(project.config).find((file) => file.contentTypeId === typeId);\n const redirectSourceSlugs = new Set<string>();\n if (loaded) {\n for (const entry of loaded.entries) {\n for (const from of entry.fromSlugs) {\n redirectSourceSlugs.add(from);\n }\n }\n }\n\n return [\n ...buildCrossLocaleSlugRedirects(project, typeId, redirectSourceSlugs),\n ];\n}\n\n/** Build Next.js redirect rules from `_redirects.json`, locale slug fixes, and legacy blog paths. */\nexport function buildAllContentRedirects(\n project: ScribeProject,\n _options: BuildRedirectsOptions = {},\n): NextRedirectRule[] {\n const redirectSourceKeys = buildRedirectSourceSlugSet(project);\n const out: NextRedirectRule[] = [\n ...buildJsonRedirects(project),\n ...buildLegacyNoBlogPathRedirects(project, redirectSourceKeys),\n ];\n\n for (const type of project.config.types) {\n if (!isRoutableType(type)) continue;\n out.push(...buildTypeRedirects(project, type.id));\n }\n\n return out;\n}\n\nexport interface RedirectSourceSlugs {\n /** All inbound redirect source slugs — exclude from sitemap. */\n aliasSlugs: Set<string>;\n /** EN canonical slugs with outbound redirects — exclude from sitemap. */\n outboundByType: Map<string, Set<string>>;\n}\n\n/** Slugs excluded from sitemap (redirect sources). */\nexport function getRedirectSourceSlugs(project: ScribeProject): RedirectSourceSlugs {\n const loaded = loadAllTypeRedirects(project.config);\n const aliasSlugs = collectRedirectSourceSlugs(loaded);\n const outboundByType = collectOutboundRedirectSourcesByType(loaded);\n\n for (const type of project.config.types) {\n if (!outboundByType.has(type.id)) {\n outboundByType.set(type.id, new Set());\n }\n }\n\n return {\n aliasSlugs,\n outboundByType,\n };\n}\n\nexport { listEnSlugs };\n","/** Join site origin and pathname without double slashes. */\nexport function joinBaseUrl(baseUrl: string, pathname: string): string {\n const origin = baseUrl.replace(/\\/$/, \"\");\n const path = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return `${origin}${path}`;\n}\n","import { documentLastModified, resolveCanonicalPathname } from \"../core/builtin-fields.js\";\nimport type { AllDocuments, ContentTypeConfig, ScribeConfig, ScribeDocument, ScribeProject } from \"../core/types.js\";\nimport { getRedirectSourceSlugs } from \"../redirects/build-redirects.js\";\nimport { isRoutableType } from \"../i18n/build-url.js\";\nimport { joinBaseUrl } from \"./join-base-url.js\";\nimport type { GenerateSitemapOptions, SitemapEntry } from \"./types.js\";\n\nfunction shouldIncludeEnDoc(\n enDoc: ScribeDocument,\n enSlug: string,\n redirectSources: ReturnType<typeof getRedirectSourceSlugs>,\n contentTypeId: string,\n excludeNoindex: boolean,\n): boolean {\n if (redirectSources.aliasSlugs.has(enSlug)) return false;\n const outbound = redirectSources.outboundByType.get(contentTypeId);\n if (outbound?.has(enSlug)) return false;\n if (excludeNoindex && enDoc.noindex) return false;\n return true;\n}\n\ntype ResolvedSitemapOptions = GenerateSitemapOptions & {\n resolveUrl: (locale: string, pathname: string) => string | Promise<string>;\n};\n\nfunction resolveSitemapOptions(options: GenerateSitemapOptions): ResolvedSitemapOptions {\n return {\n ...options,\n resolveUrl:\n options.resolveUrl ??\n ((_locale, pathname) => joinBaseUrl(options.baseUrl, pathname)),\n };\n}\n\nasync function buildClusterEntry(\n type: ContentTypeConfig,\n enSlug: string,\n enDoc: ScribeDocument,\n allDocs: AllDocuments,\n config: ScribeConfig,\n options: ResolvedSitemapOptions,\n): Promise<SitemapEntry | null> {\n const { defaultLocale, locales } = config;\n const excludeNoindex = options.excludeNoindex !== false;\n const includeXDefault = options.includeXDefault !== false;\n const typeDefaults = options.typeDefaults?.[type.id];\n\n const pathnameFor = (doc: ScribeDocument): string =>\n options.resolvePathname?.(type, doc, defaultLocale) ??\n resolveCanonicalPathname(type, doc, defaultLocale);\n\n const alternates: Record<string, string> = {};\n\n for (const locale of locales) {\n const idx = allDocs.get(locale);\n if (!idx) continue;\n\n const doc =\n locale === defaultLocale\n ? idx.bySlug.get(enSlug)\n : idx.byEnSlug.get(enSlug);\n\n if (!doc) continue;\n if (excludeNoindex && doc.noindex) continue;\n\n const pathname = pathnameFor(doc);\n alternates[locale] = await options.resolveUrl(locale, pathname);\n }\n\n if (Object.keys(alternates).length === 0) return null;\n\n const mainUrl =\n alternates[defaultLocale] ?? alternates[Object.keys(alternates)[0]!]!;\n\n if (includeXDefault && alternates[defaultLocale]) {\n alternates[\"x-default\"] = alternates[defaultLocale];\n }\n\n const lastModified = documentLastModified(enDoc);\n\n return {\n url: mainUrl,\n ...(lastModified ? { lastModified } : {}),\n ...(typeDefaults?.changeFrequency\n ? { changeFrequency: typeDefaults.changeFrequency }\n : {}),\n ...(typeDefaults?.priority !== undefined ? { priority: typeDefaults.priority } : {}),\n alternates: { languages: alternates },\n };\n}\n\n/** Build sitemap entries with hreflang alternates for routable content types. */\nexport async function generateSitemap(\n project: ScribeProject,\n options: GenerateSitemapOptions,\n): Promise<SitemapEntry[]> {\n const resolvedOptions = resolveSitemapOptions(options);\n const { config } = project;\n const redirectSources = getRedirectSourceSlugs(project);\n const excludeNoindex = options.excludeNoindex !== false;\n\n const typeIds =\n options.contentTypes ??\n config.types.filter(isRoutableType).map((t) => t.id);\n\n const entries: SitemapEntry[] = [];\n\n for (const typeId of typeIds) {\n const runtime = project.getType(typeId);\n const type = runtime.config;\n if (!isRoutableType(type)) continue;\n\n const allDocs = runtime.load();\n const enIndex = allDocs.get(config.defaultLocale);\n if (!enIndex) continue;\n\n const processed = new Set<string>();\n\n for (const [enSlug, enDoc] of enIndex.bySlug) {\n if (processed.has(enSlug)) continue;\n processed.add(enSlug);\n\n if (\n !shouldIncludeEnDoc(enDoc, enSlug, redirectSources, typeId, excludeNoindex)\n ) {\n continue;\n }\n\n const entry = await buildClusterEntry(\n type,\n enSlug,\n enDoc,\n allDocs,\n config,\n resolvedOptions,\n );\n if (entry) entries.push(entry);\n }\n }\n\n return entries;\n}\n","import type {\n ContentTypeInput,\n ContentTypeRuntime,\n Scribe,\n ScribeConfigInput,\n} from \"./core/types.js\";\nimport { resolveConfig } from \"./config/resolve-config.js\";\nimport { createProject } from \"./create-project.js\";\nimport { generateSitemap } from \"./sitemap/generate-sitemap.js\";\nimport type { GenerateSitemapOptions } from \"./sitemap/types.js\";\n\n/**\n * Create the typed Scribe client. Each content type id becomes a typed\n * accessor (`scribe.blog.list()`, `scribe.blog.related(doc, \"author\")`, …),\n * plus `scribe.sitemap()`.\n *\n * Pass the object returned by `defineConfig()`; defaults and path resolution\n * are applied here.\n */\nexport function createScribe<const TTypes extends readonly ContentTypeInput<any>[]>(\n input: ScribeConfigInput<TTypes>,\n): Scribe<TTypes> {\n const config = resolveConfig(input);\n const project = createProject(config);\n const scribe = {\n config,\n project,\n getType: project.getType,\n listTypes: project.listTypes,\n listRoutableTypes: project.listRoutableTypes,\n sitemap(options: GenerateSitemapOptions) {\n return generateSitemap(project, options);\n },\n } as unknown as Scribe<TTypes>;\n\n for (const type of config.types) {\n (scribe as unknown as Record<string, ContentTypeRuntime>)[type.id] =\n project.getType(type.id);\n }\n\n return scribe;\n}\n"]}
1
+ {"version":3,"sources":["../src/i18n/build-url.ts","../src/config/resolve-config.ts","../src/core/field.ts","../src/core/introspect-schema.ts","../src/core/builtin-fields.ts","../src/storage/sqlite.ts","../src/storage/translations.ts","../src/translate/normalize-mdx-body.ts","../src/translate/sanitize-mdx-jsx.ts","../src/translate/validate-mdx-body.ts","../src/loader/resolve-assets.ts","../src/inline/tokens.ts","../src/inline/resolve-tokens.ts","../src/loader/normalize-en.ts","../src/loader/create-loader.ts","../src/i18n/resolve-document.ts","../src/create-project.ts","../src/redirects/redirect-schema.ts","../src/redirects/load-type-redirects.ts","../src/redirects/build-redirects.ts","../src/sitemap/join-base-url.ts","../src/sitemap/generate-sitemap.ts","../src/create-scribe.ts"],"names":["path","prefix","z","fs","Database","valStart","unified","remarkParse","remarkMdx","matter","options"],"mappings":"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","file":"runtime.cjs","sourcesContent":["import type { ContentTypeConfig, LocaleRoutingConfig, ScribeConfig } from \"../core/types.js\";\n\nconst SLUG_PLACEHOLDER = \"{slug}\";\n\n/** Whether a content type has a public URL path template. */\nexport function isRoutableType(type: Pick<ContentTypeConfig, \"path\">): boolean {\n return typeof type.path === \"string\" && type.path.length > 0;\n}\n\n/** Validate path template at project init. */\nexport function assertValidPathTemplate(path: string, typeId: string): void {\n if (!path.startsWith(\"/\")) {\n throw new Error(`Content type \"${typeId}\": path must start with / (got \"${path}\")`);\n }\n const count = (path.match(/\\{slug\\}/g) ?? []).length;\n if (count !== 1) {\n throw new Error(\n `Content type \"${typeId}\": path must contain exactly one {slug} (got \"${path}\")`,\n );\n }\n}\n\n/** Segment before `{slug}` in the template, e.g. `/blog/` from `/blog/{slug}`. */\nexport function pathPrefix(template: string): string {\n const idx = template.indexOf(SLUG_PLACEHOLDER);\n if (idx === -1) throw new Error(`Invalid path template (missing {slug}): ${template}`);\n return template.slice(0, idx);\n}\n\n/** Segment after `{slug}` in the template, e.g. `/advanced` from `/blog/{slug}/advanced`. */\nexport function pathSuffix(template: string): string {\n const idx = template.indexOf(SLUG_PLACEHOLDER);\n if (idx === -1) throw new Error(`Invalid path template (missing {slug}): ${template}`);\n return template.slice(idx + SLUG_PLACEHOLDER.length);\n}\n\nfunction resolveDefaultLocaleRouting(): LocaleRoutingConfig {\n return { strategy: \"path-prefix\", prefixDefaultLocale: false };\n}\n\nfunction splitPathAndSearch(pathname: string): { pathname: string; search: string } {\n const q = pathname.indexOf(\"?\");\n if (q === -1) return { pathname, search: \"\" };\n return { pathname: pathname.slice(0, q), search: pathname.slice(q) };\n}\n\nexport interface UrlBuilder {\n defaultLocale: string;\n locales: readonly string[];\n localeRouting: LocaleRoutingConfig;\n /** Locales that receive a non-default locale marker in generated URLs. */\n prefixedLocales: string[];\n resolvePath: (template: string, slug: string, locale: string) => string;\n extractSlugFromResolvedPath: (template: string, resolvedPath: string) => string | null;\n /** Apply locale routing to an already-resolved pathname (e.g. canonicalPath override). */\n applyLocaleToPath: (pathname: string, locale: string) => string;\n}\n\n/** Create a locale-aware URL builder from a resolved Scribe config. */\nexport function createUrlBuilder(config: Pick<ScribeConfig, \"locales\" | \"defaultLocale\" | \"localeRouting\">): UrlBuilder {\n const localeRouting = config.localeRouting ?? resolveDefaultLocaleRouting();\n const defaultLocale = config.defaultLocale;\n const prefixedLocales =\n localeRouting.strategy === \"path-prefix\"\n ? localeRouting.prefixDefaultLocale\n ? [...config.locales]\n : config.locales.filter((locale) => locale !== defaultLocale)\n : config.locales.filter((locale) => locale !== defaultLocale);\n\n function applyLocaleToPath(pathname: string, locale: string): string {\n if (locale === defaultLocale) {\n if (localeRouting.strategy === \"path-prefix\" && localeRouting.prefixDefaultLocale) {\n return `/${defaultLocale}${pathname}`;\n }\n return pathname;\n }\n\n if (localeRouting.strategy === \"search-param\") {\n const { pathname: base, search } = splitPathAndSearch(pathname);\n const params = new URLSearchParams(search.startsWith(\"?\") ? search.slice(1) : search);\n params.set(localeRouting.param, locale);\n const qs = params.toString();\n return qs ? `${base}?${qs}` : base;\n }\n\n return `/${locale}${pathname}`;\n }\n\n function resolvePath(template: string, slug: string, locale: string): string {\n const relative = template.replace(SLUG_PLACEHOLDER, slug);\n return applyLocaleToPath(relative, locale);\n }\n\n function extractSlugFromResolvedPath(template: string, resolvedPath: string): string | null {\n let pathname = resolvedPath;\n if (localeRouting.strategy === \"search-param\") {\n pathname = splitPathAndSearch(resolvedPath).pathname;\n } else if (localeRouting.strategy === \"path-prefix\") {\n for (const locale of config.locales) {\n if (locale === defaultLocale && !localeRouting.prefixDefaultLocale) continue;\n const prefix = `/${locale}`;\n if (pathname === prefix || pathname.startsWith(`${prefix}/`)) {\n pathname = pathname.slice(prefix.length) || \"/\";\n break;\n }\n }\n }\n\n const prefix = pathPrefix(template);\n const suffix = pathSuffix(template);\n if (!pathname.startsWith(prefix)) return null;\n if (suffix && !pathname.endsWith(suffix)) return null;\n const slugEnd = suffix ? pathname.length - suffix.length : pathname.length;\n const slug = pathname.slice(prefix.length, slugEnd);\n return slug.length > 0 ? slug : null;\n }\n\n return {\n defaultLocale,\n locales: config.locales,\n localeRouting,\n prefixedLocales,\n resolvePath,\n extractSlugFromResolvedPath,\n applyLocaleToPath,\n };\n}\n\n/** Build a locale-aware pathname from a path template and slug. */\nexport function resolvePath(\n template: string,\n slug: string,\n locale: string,\n defaultLocale: string,\n localeRouting?: LocaleRoutingConfig,\n): string {\n const builder = createUrlBuilder({\n locales: [defaultLocale, ...(locale !== defaultLocale ? [locale] : [])],\n defaultLocale,\n localeRouting: localeRouting ?? resolveDefaultLocaleRouting(),\n });\n return builder.resolvePath(template, slug, locale);\n}\n\n/** Extract slug from a resolved path that matches the template. */\nexport function extractSlugFromResolvedPath(\n template: string,\n resolvedPath: string,\n localeRouting?: LocaleRoutingConfig,\n): string | null {\n const builder = createUrlBuilder({\n locales: [],\n defaultLocale: \"en\",\n localeRouting: localeRouting ?? resolveDefaultLocaleRouting(),\n });\n return builder.extractSlugFromResolvedPath(template, resolvedPath);\n}\n","import path from \"node:path\";\nimport type {\n ContentTypeConfig,\n LocaleFallbacks,\n ResolvedAssetsConfig,\n ScribeConfig,\n ScribeConfigInput,\n} from \"../core/types.js\";\nimport { assertValidPathTemplate } from \"../i18n/build-url.js\";\n\nconst RESOLVED = Symbol.for(\"@genlook/scribe/resolvedConfig\");\n\n/** Whether a config object has already been normalized by `resolveConfig()`. */\nexport function isResolvedConfig(config: unknown): config is ScribeConfig {\n return (\n typeof config === \"object\" &&\n config !== null &&\n (config as Record<symbol, unknown>)[RESOLVED] === true\n );\n}\n\n/**\n * Normalize a user config: apply defaults, make paths absolute, and validate\n * invariants. Every entry point (`createScribe`, the CLI's `loadConfigSync`)\n * must pass configs through here so runtimes never see partial configs.\n *\n * @param baseDir directory used to resolve a relative `rootDir`\n * (the config file's directory for the CLI; `process.cwd()` otherwise).\n */\nexport function resolveConfig(\n input: ScribeConfigInput<any> | ScribeConfig,\n baseDir?: string,\n): ScribeConfig {\n if (isResolvedConfig(input)) return input;\n const raw = input as ScribeConfigInput;\n\n if (!raw.rootDir) {\n throw new Error(\"scribe config: rootDir is required\");\n }\n if (!raw.locales || raw.locales.length === 0) {\n throw new Error(\"scribe config: locales must be a non-empty array\");\n }\n const defaultLocale = raw.defaultLocale ?? \"en\";\n if (!raw.locales.includes(defaultLocale)) {\n throw new Error(\n `scribe config: defaultLocale \"${defaultLocale}\" is not in locales [${raw.locales.join(\", \")}]`,\n );\n }\n\n const localeRouting = raw.localeRouting ?? {\n strategy: \"path-prefix\" as const,\n prefixDefaultLocale: false,\n };\n if (localeRouting.strategy === \"search-param\" && !localeRouting.param) {\n throw new Error('scribe config: localeRouting search-param requires a \"param\" name');\n }\n\n const localeFallbacks =\n raw.localeFallbacks === false\n ? {}\n : deriveLocaleFallbacks(raw.locales, defaultLocale);\n\n const projectRoot = path.resolve(baseDir ?? process.cwd(), raw.rootDir);\n const contentRoot = path.resolve(projectRoot, raw.contentDir ?? \"content\");\n const storePath = path.resolve(projectRoot, raw.store ?? \".scribe/store.sqlite\");\n\n // The asset system is opt-in: enabled only when `assets` or the deprecated\n // `assetsDir` is set. When enabled, `assets` wins over `assetsDir`, and dir /\n // publicPath / managedDirs default to \"public\" / \"/\" / []. Left off entirely,\n // both `assetsPath` and `assets` stay undefined so no asset validation runs.\n let assetsPath: string | undefined;\n let assets: ResolvedAssetsConfig | undefined;\n if (raw.assets !== undefined || raw.assetsDir !== undefined) {\n const dir = raw.assets?.dir ?? raw.assetsDir ?? \"public\";\n const publicPath = raw.assets?.publicPath ?? \"/\";\n const managedDirs = raw.assets?.managedDirs ?? [];\n assetsPath = path.resolve(projectRoot, dir);\n assets = { assetsPath, publicPath, managedDirs };\n }\n\n const seenIds = new Set<string>();\n const types: ContentTypeConfig[] = raw.types.map((type) => {\n if (seenIds.has(type.id)) {\n throw new Error(`scribe config: duplicate content type id \"${type.id}\"`);\n }\n seenIds.add(type.id);\n if (type.path) {\n assertValidPathTemplate(type.path, type.id);\n }\n return {\n ...type,\n contentDir: type.contentDir ?? type.id,\n label: type.label ?? type.id.charAt(0).toUpperCase() + type.id.slice(1),\n slugStrategy: type.slugStrategy ?? \"fixed\",\n indexFallback: type.indexFallback ?? (type.path ? \"en\" : \"none\"),\n // `body` defaults to true (fully backwards compatible). A resolved type\n // always carries an explicit boolean so consumers read one source of truth.\n body: type.body ?? true,\n };\n });\n\n const config: ScribeConfig = {\n rootDir: contentRoot,\n storePath,\n assetsPath,\n assets,\n locales: [...raw.locales],\n defaultLocale,\n localeRouting,\n localePresets: raw.localePresets,\n localeFallbacks,\n translate: raw.translate,\n types,\n };\n Object.defineProperty(config, RESOLVED, {\n value: true,\n enumerable: false,\n });\n return config;\n}\n\n/**\n * Derive fallback chains from locale tags: each locale falls back to its\n * successively shorter tag prefixes (longest first) that are themselves\n * configured, e.g. `\"zh-Hant-TW\"` → `[\"zh-Hant\", \"zh\"]`. Prefix matching is\n * case-insensitive (BCP-47 casing varies); chains store the configured\n * spelling. The default locale is excluded — it stays the implicit final\n * fallback so `indexFallback: \"none\"` keeps its meaning.\n */\nfunction deriveLocaleFallbacks(\n locales: readonly string[],\n defaultLocale: string,\n): LocaleFallbacks {\n const byLowercase = new Map(locales.map((l) => [l.toLowerCase(), l]));\n const fallbacks: LocaleFallbacks = {};\n for (const locale of locales) {\n const subtags = locale.split(\"-\");\n if (subtags.length < 2) continue;\n const chain: string[] = [];\n for (let end = subtags.length - 1; end >= 1; end--) {\n const prefix = byLowercase.get(subtags.slice(0, end).join(\"-\").toLowerCase());\n if (prefix && prefix !== locale && prefix !== defaultLocale) {\n chain.push(prefix);\n }\n }\n if (chain.length > 0) {\n fallbacks[locale] = chain;\n }\n }\n return fallbacks;\n}\n","import { z } from \"zod\";\nimport type { z as Zod } from \"zod\";\n\nconst FIELD_KIND = Symbol.for(\"@genlook/scribe/fieldKind\");\nconst RELATION_META = Symbol.for(\"@genlook/scribe/relationMeta\");\nconst ASSET_META = Symbol.for(\"@genlook/scribe/assetMeta\");\n\nexport type FieldKind = \"translatable\" | \"structural\";\n\n/**\n * What happens to a document that references a target when that target is\n * deleted (see `docs/deletion.md`).\n * - `\"restrict\"` (default) — deletion of the target is blocked.\n * - `\"detach\"` — the reference is removed (dropped from arrays, optional single\n * relations cleared). A required single relation can never be detached.\n * - `\"cascade\"` — the referencing document is deleted too, recursively.\n */\nexport type OnTargetDelete = \"restrict\" | \"detach\" | \"cascade\";\n\n/** What happens to an asset file when its own document is deleted. Default `\"delete\"`. */\nexport type AssetOnDelete = \"delete\" | \"keep\";\n\nexport interface RelationMeta {\n typeId: string;\n multiple: boolean;\n optional: boolean;\n /** Cascade behavior applied when the referenced target is deleted. */\n onTargetDelete: OnTargetDelete;\n}\n\n/** Constraints carried by a `field.asset()` schema (see `docs/assets.md`). */\nexport interface AssetMeta {\n dir?: string;\n template?: string;\n formats?: string[];\n maxKB?: number;\n optional: boolean;\n /** Whether the file is removed when its document is deleted. Default `\"delete\"`. */\n onDelete: AssetOnDelete;\n}\n\n/**\n * Type-level brand carried by `field.relation()` schemas so the target\n * content-type id (and multiplicity/optionality) survive into `related()`.\n * Never exists at runtime.\n */\nexport declare const RELATION_BRAND: unique symbol;\n\nexport interface RelationBrand<\n TTarget extends string = string,\n TMultiple extends boolean = boolean,\n TOptional extends boolean = boolean,\n> {\n target: TTarget;\n multiple: TMultiple;\n optional: TOptional;\n}\n\n/** A Zod schema branded with relation metadata (see `field.relation()`). */\nexport type RelationField<\n TZod extends Zod.ZodTypeAny,\n TBrand extends RelationBrand,\n> = TZod & { [RELATION_BRAND]: TBrand };\n\n/** Return whether a Zod field is translatable or structural. */\nexport function getFieldKind(schema: Zod.ZodTypeAny): FieldKind {\n const tagged = schema as Zod.ZodTypeAny & { [FIELD_KIND]?: FieldKind };\n return tagged[FIELD_KIND] ?? \"structural\";\n}\n\n/** Return relation metadata if the field was created with `field.relation()`. */\nexport function getRelationTarget(schema: Zod.ZodTypeAny): RelationMeta | null {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const tagged = current as Zod.ZodTypeAny & {\n [RELATION_META]?: RelationMeta;\n unwrap?: () => Zod.ZodTypeAny;\n removeDefault?: () => Zod.ZodTypeAny;\n _def?: { innerType?: Zod.ZodTypeAny };\n };\n if (tagged[RELATION_META]) {\n return tagged[RELATION_META];\n }\n if (typeof tagged.unwrap === \"function\") {\n current = tagged.unwrap();\n continue;\n }\n if (typeof tagged.removeDefault === \"function\") {\n current = tagged.removeDefault();\n continue;\n }\n if (tagged._def?.innerType) {\n current = tagged._def.innerType;\n continue;\n }\n break;\n }\n return null;\n}\n\n/** Return asset metadata if the field was created with `field.asset()`. */\nexport function getAssetMeta(schema: Zod.ZodTypeAny): AssetMeta | null {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const tagged = current as Zod.ZodTypeAny & {\n [ASSET_META]?: AssetMeta;\n unwrap?: () => Zod.ZodTypeAny;\n removeDefault?: () => Zod.ZodTypeAny;\n _def?: { innerType?: Zod.ZodTypeAny };\n };\n if (tagged[ASSET_META]) {\n return tagged[ASSET_META];\n }\n if (typeof tagged.unwrap === \"function\") {\n current = tagged.unwrap();\n continue;\n }\n if (typeof tagged.removeDefault === \"function\") {\n current = tagged.removeDefault();\n continue;\n }\n if (tagged._def?.innerType) {\n current = tagged._def.innerType;\n continue;\n }\n break;\n }\n return null;\n}\n\nfunction mark<T extends Zod.ZodTypeAny>(schema: T, kind: FieldKind): T {\n Object.defineProperty(schema, FIELD_KIND, {\n value: kind,\n enumerable: false,\n configurable: true,\n });\n return schema;\n}\n\nfunction markRelation<T extends Zod.ZodTypeAny>(schema: T, meta: RelationMeta): T {\n Object.defineProperty(schema, RELATION_META, {\n value: meta,\n enumerable: false,\n configurable: true,\n });\n return mark(schema, \"structural\");\n}\n\nfunction markAsset<T extends Zod.ZodTypeAny>(schema: T, meta: AssetMeta): T {\n Object.defineProperty(schema, ASSET_META, {\n value: meta,\n enumerable: false,\n configurable: true,\n });\n return mark(schema, \"structural\");\n}\n\n/**\n * Options for `field.relation()`. Constraints live here (not as chained Zod\n * methods) because chaining clones the schema and would drop the relation\n * metadata.\n */\nexport interface RelationFieldOptions {\n /** The field holds an array of slugs instead of a single slug. */\n multiple?: boolean;\n /** The field may be omitted; `related()` then returns `null` (single) or `[]` (multiple). */\n optional?: boolean;\n /** Minimum item count (`multiple: true` only). */\n min?: number;\n /** Maximum item count (`multiple: true` only). */\n max?: number;\n /**\n * What happens to THIS document when the referenced target is deleted:\n * `\"restrict\"` (default), `\"detach\"`, or `\"cascade\"`. See `docs/deletion.md`.\n */\n onTargetDelete?: OnTargetDelete;\n}\n\n/**\n * Options for `field.asset()`. Constraints live here (not as chained Zod\n * methods) because chaining clones the schema and would drop the asset\n * metadata. See `docs/assets.md` for the full design.\n */\nexport interface AssetFieldOptions {\n /** Web-path prefix the value must live under (e.g. `\"/try-on/garments\"`). Also declares a managed root. */\n dir?: string;\n /**\n * Derived-path template, e.g. `\"/try-on/garments/{slug}/product.webp\"` —\n * `{slug}` is the entry's EN slug. When set, the frontmatter field may be\n * omitted entirely; the loader fills it. An explicit frontmatter value\n * overrides the template. Its static prefix counts as a managed root.\n */\n template?: string;\n /** Allowed extensions (lowercase, no dot). Violation = validation warning. */\n formats?: string[];\n /** File-size budget in kilobytes. Violation = validation warning. */\n maxKB?: number;\n /** The field may be absent (only meaningful without `template`). A present value whose file is missing is still an error. */\n optional?: boolean;\n /**\n * What happens to the file when its own document is deleted: `\"delete\"`\n * (default) or `\"keep\"`. A shared (non-templated) path is only removed when no\n * document outside the deletion set still references it. See `docs/deletion.md`.\n */\n onDelete?: AssetOnDelete;\n}\n\ntype Bool<T> = [T] extends [true] ? true : false;\n\n/**\n * Zod shape of a `field.asset()` schema: optional only when `optional` is set.\n *\n * A non-optional `template` field types as `ZodString` even though the runtime\n * schema tolerates an absent frontmatter value: the loader materializes the\n * templated path onto every document it serves (`resolveDocumentAssets` runs on\n * both EN and locale docs), so consumers always observe a `string`.\n */\nexport type AssetField<TOpts extends AssetFieldOptions = AssetFieldOptions> =\n Bool<TOpts[\"optional\"]> extends true ? Zod.ZodOptional<Zod.ZodString> : Zod.ZodString;\n\ntype RelationZod<TOpts extends RelationFieldOptions> =\n Bool<TOpts[\"optional\"]> extends true\n ? Zod.ZodOptional<\n Bool<TOpts[\"multiple\"]> extends true ? Zod.ZodArray<Zod.ZodString> : Zod.ZodString\n >\n : Bool<TOpts[\"multiple\"]> extends true\n ? Zod.ZodArray<Zod.ZodString>\n : Zod.ZodString;\n\ntype RelationFieldFor<\n TTarget extends string,\n TOpts extends RelationFieldOptions,\n> = RelationField<\n RelationZod<TOpts>,\n RelationBrand<TTarget, Bool<TOpts[\"multiple\"]>, Bool<TOpts[\"optional\"]>>\n>;\n\n/**\n * Mark Zod fields for Scribe:\n * - `translatable(schema)` — sent to the translator per locale.\n * - `structural(schema)` — EN-only; merged from EN into every locale document.\n * - `relation(typeId, options?)` — EN slug reference(s) to another content type,\n * validated by `scribe validate` and dereferenced via `scribe.<type>.related()`.\n * - `asset(options?)` — root-relative web path to a file under `assets.dir`,\n * validated by `scribe validate` and resolved to a served URL at load time.\n */\nexport const field = {\n translatable: <T extends Zod.ZodTypeAny>(schema: T): T => mark(schema, \"translatable\"),\n structural: <T extends Zod.ZodTypeAny>(schema: T): T => mark(schema, \"structural\"),\n relation: <const TTarget extends string, const TOpts extends RelationFieldOptions = {}>(\n typeId: TTarget,\n options?: TOpts,\n ): RelationFieldFor<TTarget, TOpts> => {\n const multiple = options?.multiple ?? false;\n const optional = options?.optional ?? false;\n if ((options?.min !== undefined || options?.max !== undefined) && !multiple) {\n throw new Error(\n `field.relation(\"${typeId}\"): min/max require { multiple: true }`,\n );\n }\n let inner: Zod.ZodTypeAny;\n if (multiple) {\n let arr = z.array(z.string().min(1));\n if (options?.min !== undefined) arr = arr.min(options.min);\n if (options?.max !== undefined) arr = arr.max(options.max);\n inner = arr;\n } else {\n inner = z.string().min(1);\n }\n const onTargetDelete = options?.onTargetDelete ?? \"restrict\";\n markRelation(inner, { typeId, multiple, optional, onTargetDelete });\n const schema = optional ? inner.optional() : inner;\n return schema as RelationFieldFor<TTarget, TOpts>;\n },\n asset: <const TOpts extends AssetFieldOptions = {}>(options?: TOpts): AssetField<TOpts> => {\n const optional = options?.optional ?? false;\n const inner = z.string().min(1);\n markAsset(inner, {\n dir: options?.dir,\n template: options?.template,\n formats: options?.formats,\n maxKB: options?.maxKB,\n optional,\n onDelete: options?.onDelete ?? \"delete\",\n });\n // A templated field may be omitted in frontmatter — the loader materializes it.\n const schema = optional || options?.template !== undefined ? inner.optional() : inner;\n return schema as AssetField<TOpts>;\n },\n};\n\n/** Strip Zod wrappers (optional, default, etc.) to reach the inner schema. */\nexport function unwrapSchema(schema: Zod.ZodTypeAny): Zod.ZodTypeAny {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const anySchema = current as Zod.ZodTypeAny & {\n unwrap?: () => Zod.ZodTypeAny;\n removeDefault?: () => Zod.ZodTypeAny;\n _def?: { innerType?: Zod.ZodTypeAny; type?: string };\n };\n if (typeof anySchema.unwrap === \"function\") {\n current = anySchema.unwrap();\n continue;\n }\n if (typeof anySchema.removeDefault === \"function\") {\n current = anySchema.removeDefault();\n continue;\n }\n if (anySchema._def?.innerType) {\n current = anySchema._def.innerType;\n continue;\n }\n break;\n }\n return current;\n}\n\n/** Strip optional/default/nullable wrappers only — preserves arrays and objects. */\nexport function peelOptionalWrappers(schema: Zod.ZodTypeAny): Zod.ZodTypeAny {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const type = (current as Zod.ZodTypeAny & { _def?: { type?: string } })._def?.type;\n if (type === \"optional\" || type === \"nullable\") {\n current = (current as Zod.ZodOptional<Zod.ZodTypeAny>).unwrap();\n continue;\n }\n if (type === \"default\") {\n current = (current as Zod.ZodDefault<Zod.ZodTypeAny>).removeDefault();\n continue;\n }\n break;\n }\n return current;\n}\n","import type { z } from \"zod\";\nimport {\n getAssetMeta,\n getFieldKind,\n getRelationTarget,\n peelOptionalWrappers,\n type AssetOnDelete,\n type OnTargetDelete,\n} from \"./field.js\";\nimport type { ContentTypeInput } from \"./types.js\";\n\nexport interface SchemaFieldMeta {\n path: string[];\n kind: \"translatable\" | \"structural\" | \"relation\" | \"asset\";\n relationTarget?: string;\n relationMultiple?: boolean;\n relationOptional?: boolean;\n /** Cascade behavior when the referenced target is deleted (relation fields). */\n relationOnTargetDelete?: OnTargetDelete;\n assetDir?: string;\n assetTemplate?: string;\n assetFormats?: string[];\n assetMaxKB?: number;\n assetOptional?: boolean;\n /** Whether the asset file is deleted with its document (asset fields). */\n assetOnDelete?: AssetOnDelete;\n}\n\nfunction getArrayElement(schema: z.ZodTypeAny): z.ZodTypeAny | null {\n if (\n schema instanceof Object &&\n \"element\" in schema &&\n (schema as z.ZodTypeAny & { _def?: { type?: string } })._def?.type === \"array\"\n ) {\n return (schema as z.ZodArray<z.ZodTypeAny>).element as z.ZodTypeAny;\n }\n return null;\n}\n\n/**\n * List schema fields with translatable/structural/relation metadata.\n * Array-of-object fields recurse with a `*` path segment (`steps.*.title`) so\n * extraction and merging preserve the array shape. Note: `peelOptionalWrappers`\n * is used (not `unwrapSchema`) because zod v4 arrays expose `unwrap()`, which\n * would silently flatten the array level out of the paths.\n */\nexport function introspectSchema(schema: z.ZodTypeAny, prefix: string[] = []): SchemaFieldMeta[] {\n const relation = getRelationTarget(schema);\n if (relation && prefix.length > 0) {\n return [\n {\n path: prefix,\n kind: \"relation\",\n relationTarget: relation.typeId,\n relationMultiple: relation.multiple,\n relationOptional: relation.optional,\n relationOnTargetDelete: relation.onTargetDelete,\n },\n ];\n }\n\n const asset = getAssetMeta(schema);\n if (asset && prefix.length > 0) {\n return [\n {\n path: prefix,\n kind: \"asset\",\n assetDir: asset.dir,\n assetTemplate: asset.template,\n assetFormats: asset.formats,\n assetMaxKB: asset.maxKB,\n assetOptional: asset.optional,\n assetOnDelete: asset.onDelete,\n },\n ];\n }\n\n // An explicit translatable mark makes the whole subtree one translation unit\n // (e.g. field.translatable(z.array(z.string()))).\n if (prefix.length > 0 && getFieldKind(schema) === \"translatable\") {\n return [{ path: prefix, kind: \"translatable\" }];\n }\n\n const base = peelOptionalWrappers(schema);\n if (base instanceof Object && \"shape\" in base) {\n const shape = (base as z.ZodObject<z.ZodRawShape>).shape;\n const fields: SchemaFieldMeta[] = [];\n for (const [key, child] of Object.entries(shape)) {\n fields.push(...introspectSchema(child as z.ZodTypeAny, [...prefix, key]));\n }\n return fields;\n }\n\n const element = getArrayElement(base);\n if (element) {\n const elementBase = peelOptionalWrappers(element);\n if (elementBase instanceof Object && \"shape\" in elementBase) {\n const shape = (elementBase as z.ZodObject<z.ZodRawShape>).shape;\n const fields: SchemaFieldMeta[] = [];\n for (const [key, child] of Object.entries(shape)) {\n fields.push(...introspectSchema(child as z.ZodTypeAny, [...prefix, \"*\", key]));\n }\n return fields;\n }\n }\n\n return [{ path: prefix, kind: getFieldKind(schema) }];\n}\n\ninterface PathTrie {\n leaf: boolean;\n children: Map<string, PathTrie>;\n}\n\nfunction buildPathTrie(paths: string[][]): PathTrie {\n const root: PathTrie = { leaf: false, children: new Map() };\n for (const path of paths) {\n let node = root;\n for (const segment of path) {\n let child = node.children.get(segment);\n if (!child) {\n child = { leaf: false, children: new Map() };\n node.children.set(segment, child);\n }\n node = child;\n }\n node.leaf = true;\n }\n return root;\n}\n\nfunction extractNode(data: unknown, trie: PathTrie): unknown {\n if (trie.leaf) return data;\n\n const star = trie.children.get(\"*\");\n if (star) {\n if (!Array.isArray(data)) return undefined;\n // Preserve array length so structural/translatable halves merge per index.\n return data.map((item) =>\n typeof item === \"object\" && item !== null ? (extractNode(item, star) ?? {}) : {},\n );\n }\n\n if (typeof data !== \"object\" || data === null || Array.isArray(data)) return undefined;\n const record = data as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n let any = false;\n for (const [key, child] of trie.children) {\n const value = extractNode(record[key], child);\n if (value !== undefined) {\n out[key] = value;\n any = true;\n }\n }\n return any ? out : undefined;\n}\n\nexport function extractByPaths(\n data: Record<string, unknown>,\n paths: string[][],\n): Record<string, unknown> {\n if (paths.length === 0) return {};\n const extracted = extractNode(data, buildPathTrie(paths));\n return extracted && typeof extracted === \"object\" && !Array.isArray(extracted)\n ? (extracted as Record<string, unknown>)\n : {};\n}\n\n/** Extract frontmatter fields marked as translatable. */\nexport function pickTranslatable(data: Record<string, unknown>, schema: z.ZodTypeAny): Record<string, unknown> {\n const translatablePaths = introspectSchema(schema)\n .filter((f) => f.kind === \"translatable\")\n .map((f) => f.path);\n return extractByPaths(data, translatablePaths);\n}\n\n/**\n * Drop nested translatable output when the EN document has no matching structural\n * parent (e.g. model-hallucinated blog `itemList` on posts with no ItemList SEO).\n */\nexport function pruneOrphanNestedTranslations(\n localeData: Record<string, unknown>,\n enData: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n const out = { ...localeData };\n const structuralParentsWithNested = new Set<string>();\n for (const meta of introspectSchema(schema)) {\n if (meta.kind !== \"translatable\" || meta.path.length < 3 || meta.path[1] !== \"*\") continue;\n structuralParentsWithNested.add(meta.path[0]!);\n }\n for (const parent of structuralParentsWithNested) {\n const enParent = enData[parent];\n if (enParent === undefined || enParent === null) {\n delete out[parent];\n }\n }\n return out;\n}\n\n/** Extract frontmatter fields marked as structural (EN-only). */\nexport function pickStructural(data: Record<string, unknown>, schema: z.ZodTypeAny): Record<string, unknown> {\n const structuralPaths = introspectSchema(schema)\n .filter((f) => f.kind === \"structural\" || f.kind === \"relation\" || f.kind === \"asset\")\n .map((f) => f.path);\n return extractByPaths(data, structuralPaths);\n}\n\n/** Merge EN structural fields onto a locale document's frontmatter at load time. */\nexport function mergeStructuralOntoLocale(\n localeData: Record<string, unknown>,\n enData: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n const structural = pickStructural(enData, schema);\n const translatable = pickTranslatable(localeData, schema);\n return deepMerge(structural, translatable);\n}\n\nfunction deepMerge(base: Record<string, unknown>, overlay: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(overlay)) {\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n out[key] &&\n typeof out[key] === \"object\" &&\n !Array.isArray(out[key])\n ) {\n out[key] = deepMerge(out[key] as Record<string, unknown>, value as Record<string, unknown>);\n } else if (Array.isArray(value) && Array.isArray(out[key])) {\n out[key] = mergeArrayOverlay(out[key] as unknown[], value as unknown[]);\n } else if (value !== undefined) {\n out[key] = value;\n }\n }\n return out;\n}\n\nfunction mergeArrayOverlay(base: unknown[], overlay: unknown[]): unknown[] {\n return base.map((item, index) => {\n const overlayItem = overlay[index];\n if (\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n overlayItem &&\n typeof overlayItem === \"object\" &&\n !Array.isArray(overlayItem)\n ) {\n return deepMerge(item as Record<string, unknown>, overlayItem as Record<string, unknown>);\n }\n return overlayItem ?? item;\n });\n}\n\n/** Collect the schema fields marked `field.translatable()`. */\nexport function listTranslatableFields(schema: z.ZodTypeAny): SchemaFieldMeta[] {\n return introspectSchema(schema).filter((f) => f.kind === \"translatable\");\n}\n\n/**\n * Whether a content type has anything to translate. A type with a body is\n * always potentially translatable; a bodyless type (`body: false`) is\n * translatable only when at least one schema field is `field.translatable()`.\n *\n * The single source of truth for every translation workflow (worklist, staleness,\n * status counts, studio dashboards, store writes): a type for which this returns\n * `false` disappears from all of them.\n */\nexport function isTypeTranslatable(type: Pick<ContentTypeInput, \"schema\" | \"body\">): boolean {\n return listTranslatableFields(type.schema).length > 0 || type.body !== false;\n}\n\n/** Collect relation field paths and targets from a content schema. */\nexport function listRelationFields(schema: z.ZodTypeAny): SchemaFieldMeta[] {\n return introspectSchema(schema).filter((f) => f.kind === \"relation\");\n}\n\n/** Collect asset field paths and constraints from a content schema. */\nexport function listAssetFields(schema: z.ZodTypeAny): SchemaFieldMeta[] {\n return introspectSchema(schema).filter((f) => f.kind === \"asset\");\n}\n","import { z } from \"zod\";\nimport { createUrlBuilder, pathPrefix, pathSuffix } from \"../i18n/build-url.js\";\nimport type { ContentTypeConfig, LocaleRoutingConfig, ScribeDocument } from \"./types.js\";\n\nexport const SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nexport const slugPatternSchema = z\n .string()\n .regex(SLUG_PATTERN, \"slug must be lowercase-kebab-case\");\n\nexport const isoDateSchema = z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}(T[\\d:.Z+-]*)?$/, \"Use ISO date YYYY-MM-DD or full ISO 8601\");\n\nconst canonicalPathSchema = z.string().regex(/^\\//, \"canonicalPath must start with /\");\n\nexport interface BuiltinEnFields {\n publishedAt?: string;\n updatedAt?: string;\n noindex: boolean;\n /** Set only when explicitly provided in EN frontmatter. */\n canonicalPathOverride?: string;\n /**\n * Reserved `vars` map: an optional `Record<string, string>` any entry may\n * carry WITHOUT declaring it in the type schema. Read by `${{var:key}}` inline\n * tokens; never translated (it is not a schema field). Kept verbatim (even\n * when malformed) so `scribe validate` can flag a non-string-record shape.\n */\n vars?: Record<string, string>;\n}\n\nexport interface BuiltinParseIssue {\n field: string;\n message: string;\n level: \"error\" | \"warning\";\n}\n\nconst LOCALE_BUILTIN_KEYS: Array<[string, string]> = [\n [\"publishedAt\", \"publishedAt is EN-only; inherited from the EN parent at load time\"],\n [\"updatedAt\", \"updatedAt is EN-only; inherited from the EN parent at load time\"],\n [\"noindex\", \"noindex is EN-only; inherited from the EN parent at load time\"],\n [\"canonicalPath\", \"canonicalPath is EN-only; inherited from the EN parent at load time\"],\n [\"aliases\", \"aliases is EN-only; remove from locale translation\"],\n [\"redirect_to\", \"redirect_to is EN-only; remove from locale translation\"],\n [\"translationOf\", \"translationOf is internal; remove from locale translation\"],\n [\"enSlug\", \"enSlug is internal; remove from locale translation\"],\n];\n\nconst DEPRECATED_REDIRECT_FIELDS: Array<[string, string]> = [\n [\n \"aliases\",\n \"aliases frontmatter is removed — add redirects to content/<type>/_redirects.json instead\",\n ],\n [\n \"redirect_to\",\n \"redirect_to frontmatter is removed — add redirects to content/<type>/_redirects.json instead\",\n ],\n];\n\n/** Extract built-in EN frontmatter (dates, SEO) before Zod validation. */\nexport function extractBuiltinEnFields(\n data: Record<string, unknown>,\n _pathTemplate: string | undefined,\n _enSlug: string,\n _defaultLocale: string,\n): {\n builtin: BuiltinEnFields;\n rest: Record<string, unknown>;\n issues: BuiltinParseIssue[];\n} {\n const issues: BuiltinParseIssue[] = [];\n const rest = { ...data };\n\n for (const [field, message] of DEPRECATED_REDIRECT_FIELDS) {\n if (rest[field] !== undefined) {\n issues.push({ field, message, level: \"error\" });\n delete rest[field];\n }\n }\n\n let publishedAt: string | undefined;\n if (rest.publishedAt !== undefined && rest.publishedAt !== null && rest.publishedAt !== \"\") {\n const parsed = isoDateSchema.safeParse(rest.publishedAt);\n if (parsed.success) {\n publishedAt = parsed.data;\n } else {\n for (const issue of parsed.error.issues) {\n issues.push({ field: \"publishedAt\", message: issue.message, level: \"error\" });\n }\n }\n delete rest.publishedAt;\n }\n\n let updatedAt: string | undefined;\n if (rest.updatedAt !== undefined && rest.updatedAt !== null && rest.updatedAt !== \"\") {\n const parsed = isoDateSchema.safeParse(rest.updatedAt);\n if (parsed.success) {\n updatedAt = parsed.data;\n } else {\n for (const issue of parsed.error.issues) {\n issues.push({ field: \"updatedAt\", message: issue.message, level: \"error\" });\n }\n }\n delete rest.updatedAt;\n } else if (publishedAt) {\n updatedAt = publishedAt;\n }\n\n let noindex = false;\n if (rest.noindex !== undefined && rest.noindex !== null && rest.noindex !== \"\") {\n if (typeof rest.noindex === \"boolean\") {\n noindex = rest.noindex;\n } else {\n issues.push({ field: \"noindex\", message: \"noindex must be a boolean\", level: \"error\" });\n }\n delete rest.noindex;\n }\n\n let canonicalPathOverride: string | undefined;\n if (rest.canonicalPath !== undefined && rest.canonicalPath !== null && rest.canonicalPath !== \"\") {\n const parsed = canonicalPathSchema.safeParse(rest.canonicalPath);\n if (parsed.success) {\n canonicalPathOverride = parsed.data;\n } else {\n for (const issue of parsed.error.issues) {\n issues.push({ field: \"canonicalPath\", message: issue.message, level: \"error\" });\n }\n }\n delete rest.canonicalPath;\n }\n\n for (const internalKey of [\"translationOf\", \"enSlug\"] as const) {\n if (rest[internalKey] !== undefined) {\n issues.push({\n field: internalKey,\n message: `${internalKey} is managed internally by Scribe; remove from frontmatter`,\n level: \"warning\",\n });\n delete rest[internalKey];\n }\n }\n\n // Reserved `vars` map: pulled out before Zod validation so a schema (strict or\n // not) never rejects or strips it. Kept verbatim — even a malformed value —\n // so the inline-token validation pass can report a bad shape.\n let vars: Record<string, string> | undefined;\n if (rest.vars !== undefined) {\n vars = rest.vars as Record<string, string>;\n delete rest.vars;\n }\n\n return {\n builtin: {\n publishedAt,\n updatedAt,\n noindex,\n canonicalPathOverride,\n vars,\n },\n rest,\n issues,\n };\n}\n\n/** Reject built-in keys on locale translation frontmatter. */\nexport function validateLocaleBuiltinFields(data: Record<string, unknown>): BuiltinParseIssue[] {\n const issues: BuiltinParseIssue[] = [];\n for (const [key, message] of LOCALE_BUILTIN_KEYS) {\n if (data[key] !== undefined) {\n issues.push({ field: key, message, level: \"error\" });\n }\n }\n return issues;\n}\n\n/** ISO date for sitemap lastmod from updatedAt or publishedAt. */\nexport function documentLastModified(doc: {\n updatedAt?: string;\n publishedAt?: string;\n}): string | undefined {\n const raw = doc.updatedAt ?? doc.publishedAt;\n if (!raw) return undefined;\n const date = new Date(raw);\n return Number.isNaN(date.getTime()) ? undefined : date.toISOString();\n}\n\n/** Locale-aware pathname for a document. */\nexport function resolveCanonicalPathname(\n type: Pick<ContentTypeConfig, \"path\">,\n doc: Pick<ScribeDocument, \"slug\" | \"locale\" | \"canonicalPathOverride\">,\n defaultLocale: string,\n localeRouting?: LocaleRoutingConfig,\n): string {\n const urlBuilder = createUrlBuilder({\n locales: [defaultLocale, ...(doc.locale !== defaultLocale ? [doc.locale] : [])],\n defaultLocale,\n localeRouting: localeRouting ?? { strategy: \"path-prefix\", prefixDefaultLocale: false },\n });\n\n if (doc.canonicalPathOverride) {\n return urlBuilder.applyLocaleToPath(doc.canonicalPathOverride, doc.locale);\n }\n if (!type.path) return `/${doc.slug}`;\n return urlBuilder.resolvePath(type.path, doc.slug, doc.locale);\n}\n\n/** Hydrate locale frontmatter with EN-only built-in fields at load time. */\nexport function mergeBuiltinsIntoFrontmatter(\n frontmatter: Record<string, unknown>,\n doc: Pick<\n ScribeDocument,\n \"publishedAt\" | \"updatedAt\" | \"noindex\" | \"canonicalPathOverride\" | \"slug\" | \"locale\"\n > & { vars?: Record<string, string> },\n type: Pick<ContentTypeConfig, \"path\">,\n defaultLocale: string,\n localeRouting?: LocaleRoutingConfig,\n): Record<string, unknown> {\n const out = { ...frontmatter };\n if (doc.publishedAt !== undefined) out.publishedAt = doc.publishedAt;\n if (doc.updatedAt !== undefined) out.updatedAt = doc.updatedAt;\n out.noindex = doc.noindex;\n out.canonicalPath = resolveCanonicalPathname(type, doc, defaultLocale, localeRouting);\n // The reserved `vars` map rides only on EN documents (its single source of\n // truth); locale documents read it from their EN parent at token-fill time.\n if (doc.vars !== undefined) out.vars = doc.vars;\n return out;\n}\n\nexport function seoFieldsFromEn(enDoc: ScribeDocument): Pick<\n ScribeDocument,\n \"publishedAt\" | \"updatedAt\" | \"noindex\" | \"canonicalPathOverride\"\n> {\n return {\n publishedAt: enDoc.publishedAt,\n updatedAt: enDoc.updatedAt,\n noindex: enDoc.noindex,\n canonicalPathOverride: enDoc.canonicalPathOverride,\n };\n}\n\nexport { pathPrefix, pathSuffix };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport Database from \"better-sqlite3\";\nimport type { ScribeConfig } from \"../core/types.js\";\n\nconst SCHEMA_VERSION = 5;\n\nconst MIGRATIONS: string[] = [\n `CREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n )`,\n `CREATE TABLE IF NOT EXISTS translations (\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n locale TEXT NOT NULL,\n slug TEXT NOT NULL,\n frontmatter_json TEXT NOT NULL,\n body TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n translated_at TEXT NOT NULL,\n model TEXT NOT NULL,\n PRIMARY KEY (content_type, en_slug, locale)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_translations_type_locale\n ON translations(content_type, locale)`,\n `CREATE TABLE IF NOT EXISTS slug_aliases (\n content_type TEXT NOT NULL,\n canonical_en_slug TEXT NOT NULL,\n alias_en_slug TEXT NOT NULL,\n created_at TEXT NOT NULL,\n PRIMARY KEY (content_type, alias_en_slug)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_slug_aliases_canonical\n ON slug_aliases(content_type, canonical_en_slug)`,\n `CREATE TABLE IF NOT EXISTS alias_locale_slugs (\n content_type TEXT NOT NULL,\n alias_en_slug TEXT NOT NULL,\n locale TEXT NOT NULL,\n locale_slug TEXT NOT NULL,\n captured_at TEXT NOT NULL,\n PRIMARY KEY (content_type, alias_en_slug, locale)\n )`,\n `CREATE TABLE IF NOT EXISTS en_snapshots (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n frontmatter_json TEXT NOT NULL,\n body TEXT NOT NULL,\n created_at TEXT NOT NULL,\n UNIQUE (content_type, en_slug, en_hash)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_en_snapshots_lookup\n ON en_snapshots(content_type, en_slug, created_at DESC)`,\n `CREATE TABLE IF NOT EXISTS translation_batch_jobs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n job_name TEXT NOT NULL UNIQUE,\n model TEXT NOT NULL,\n display_model TEXT NOT NULL,\n created_at TEXT NOT NULL,\n state TEXT NOT NULL,\n completed_at TEXT\n )`,\n `CREATE TABLE IF NOT EXISTS translation_batch_items (\n job_id INTEGER NOT NULL,\n request_index INTEGER NOT NULL,\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n locale TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n snapshot_id INTEGER NOT NULL,\n status TEXT NOT NULL,\n error TEXT,\n PRIMARY KEY (job_id, request_index)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_batch_items_status\n ON translation_batch_items(status)`,\n];\n\nexport type SqliteMode = \"readonly\" | \"readwrite\";\n\n/** Absolute path to the SQLite translation store (precomputed by `resolveConfig`). */\nexport function resolveStorePath(config: ScribeConfig): string {\n return config.storePath;\n}\n\n/** Open the SQLite translation store (creates schema if missing). */\nexport function openStore(config: ScribeConfig, mode: SqliteMode = \"readwrite\"): Database.Database {\n const storePath = resolveStorePath(config);\n if (mode === \"readwrite\") {\n fs.mkdirSync(path.dirname(storePath), { recursive: true });\n }\n const db = new Database(storePath, { readonly: mode === \"readonly\" });\n if (mode === \"readwrite\") {\n migrate(db);\n }\n return db;\n}\n\nfunction addColumnIfMissing(\n db: Database.Database,\n table: string,\n column: string,\n ddlType: string,\n): void {\n const columns = db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n if (!columns.some((c) => c.name === column)) {\n db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${ddlType}`);\n }\n}\n\nfunction readSchemaVersion(db: Database.Database): number {\n const metaTable = db\n .prepare(`SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'meta'`)\n .get();\n if (!metaTable) return 0;\n const row = db.prepare(`SELECT value FROM meta WHERE key = 'schema_version'`).get() as\n | { value: string }\n | undefined;\n return row ? Number.parseInt(row.value, 10) || 0 : 0;\n}\n\nfunction migrate(db: Database.Database): void {\n const previousVersion = readSchemaVersion(db);\n\n for (const sql of MIGRATIONS) {\n db.exec(sql);\n }\n\n if (previousVersion < 4) {\n db.exec(`DROP TABLE IF EXISTS revisions`);\n }\n\n addColumnIfMissing(db, \"translations\", \"snapshot_id\", \"INTEGER\");\n\n db.prepare(\n `INSERT INTO meta(key, value) VALUES('schema_version', ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`,\n ).run(String(SCHEMA_VERSION));\n}\n\nexport function closeStore(db: Database.Database): void {\n db.close();\n}\n","import type Database from \"better-sqlite3\";\n\nexport interface TranslationRow {\n content_type: string;\n en_slug: string;\n locale: string;\n slug: string;\n frontmatter_json: string;\n body: string;\n en_hash: string;\n translated_at: string;\n model: string;\n snapshot_id: number | null;\n}\n\nexport interface TranslationInput {\n contentType: string;\n enSlug: string;\n locale: string;\n slug: string;\n frontmatter: Record<string, unknown>;\n body: string;\n enHash: string;\n translatedAt: string;\n model: string;\n snapshotId: number;\n}\n\nexport interface EnSnapshotInput {\n contentType: string;\n enSlug: string;\n enHash: string;\n frontmatter: Record<string, unknown>;\n body: string;\n createdAt: string;\n}\n\nexport interface EnSnapshotRow {\n id: number;\n content_type: string;\n en_slug: string;\n en_hash: string;\n frontmatter_json: string;\n body: string;\n created_at: string;\n}\n\nexport interface EnSnapshotWithLocales extends EnSnapshotRow {\n locales: string;\n}\n\nexport function getOrCreateEnSnapshot(db: Database.Database, input: EnSnapshotInput): number {\n db.prepare(\n `INSERT OR IGNORE INTO en_snapshots (\n content_type, en_slug, en_hash, frontmatter_json, body, created_at\n ) VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n input.contentType,\n input.enSlug,\n input.enHash,\n JSON.stringify(input.frontmatter),\n input.body,\n input.createdAt,\n );\n\n const row = db\n .prepare(\n `SELECT id FROM en_snapshots\n WHERE content_type = ? AND en_slug = ? AND en_hash = ?`,\n )\n .get(input.contentType, input.enSlug, input.enHash) as { id: number };\n\n return row.id;\n}\n\nexport function getEnSnapshot(\n db: Database.Database,\n snapshotId: number,\n): EnSnapshotRow | undefined {\n return db\n .prepare(`SELECT * FROM en_snapshots WHERE id = ?`)\n .get(snapshotId) as EnSnapshotRow | undefined;\n}\n\nexport function listEnSnapshotsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): EnSnapshotWithLocales[] {\n return db\n .prepare(\n `SELECT s.*, GROUP_CONCAT(t.locale) AS locales\n FROM en_snapshots s\n LEFT JOIN translations t ON t.snapshot_id = s.id\n WHERE s.content_type = ? AND s.en_slug = ?\n GROUP BY s.id\n ORDER BY s.created_at DESC, s.id DESC`,\n )\n .all(contentType, enSlug) as EnSnapshotWithLocales[];\n}\n\nexport function upsertTranslation(db: Database.Database, input: TranslationInput): void {\n db.prepare(\n `INSERT INTO translations (\n content_type, en_slug, locale, slug, frontmatter_json, body, en_hash, translated_at, model, snapshot_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(content_type, en_slug, locale) DO UPDATE SET\n slug = excluded.slug,\n frontmatter_json = excluded.frontmatter_json,\n body = excluded.body,\n en_hash = excluded.en_hash,\n translated_at = excluded.translated_at,\n model = excluded.model,\n snapshot_id = excluded.snapshot_id`,\n ).run(\n input.contentType,\n input.enSlug,\n input.locale,\n input.slug,\n JSON.stringify(input.frontmatter),\n input.body,\n input.enHash,\n input.translatedAt,\n input.model,\n input.snapshotId,\n );\n}\n\nexport function getTranslation(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n locale: string,\n): TranslationRow | undefined {\n return db\n .prepare(\n `SELECT * FROM translations WHERE content_type = ? AND en_slug = ? AND locale = ?`,\n )\n .get(contentType, enSlug, locale) as TranslationRow | undefined;\n}\n\nexport function listTranslationsForType(\n db: Database.Database,\n contentType: string,\n): TranslationRow[] {\n return db\n .prepare(`SELECT * FROM translations WHERE content_type = ? ORDER BY en_slug, locale`)\n .all(contentType) as TranslationRow[];\n}\n\nexport function listTranslationsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): TranslationRow[] {\n return db\n .prepare(\n `SELECT * FROM translations WHERE content_type = ? AND en_slug = ? ORDER BY locale`,\n )\n .all(contentType, enSlug) as TranslationRow[];\n}\n\nexport function listTranslationsForLocale(\n db: Database.Database,\n contentType: string,\n locale: string,\n): TranslationRow[] {\n return db\n .prepare(`SELECT * FROM translations WHERE content_type = ? AND locale = ? ORDER BY en_slug`)\n .all(contentType, locale) as TranslationRow[];\n}\n\nexport function bulkLoadTranslations(db: Database.Database): TranslationRow[] {\n return db.prepare(`SELECT * FROM translations ORDER BY content_type, en_slug, locale`).all() as TranslationRow[];\n}\n\nexport function countTranslations(db: Database.Database): number {\n const row = db.prepare(`SELECT COUNT(*) as count FROM translations`).get() as { count: number };\n return row.count;\n}\n\nexport function countTranslationsByLocale(\n db: Database.Database,\n): Array<{ locale: string; count: number }> {\n return db\n .prepare(\n `SELECT locale, COUNT(*) as count FROM translations GROUP BY locale ORDER BY locale`,\n )\n .all() as Array<{ locale: string; count: number }>;\n}\n\nexport function latestTranslationAtByLocale(\n db: Database.Database,\n): Array<{ locale: string; latest: string }> {\n return db\n .prepare(\n `SELECT locale, MAX(translated_at) as latest FROM translations GROUP BY locale`,\n )\n .all() as Array<{ locale: string; latest: string }>;\n}\n\n/** Count translation rows for a single EN document (across every locale). */\nexport function countTranslationsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): number {\n const row = db\n .prepare(\n `SELECT COUNT(*) as count FROM translations WHERE content_type = ? AND en_slug = ?`,\n )\n .get(contentType, enSlug) as { count: number };\n return row.count;\n}\n\n/** Count EN snapshot rows for a single EN document. */\nexport function countEnSnapshotsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): number {\n const row = db\n .prepare(\n `SELECT COUNT(*) as count FROM en_snapshots WHERE content_type = ? AND en_slug = ?`,\n )\n .get(contentType, enSlug) as { count: number };\n return row.count;\n}\n\n/** Delete every translation row for an EN document. Returns the number removed. */\nexport function deleteTranslationsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): number {\n const info = db\n .prepare(`DELETE FROM translations WHERE content_type = ? AND en_slug = ?`)\n .run(contentType, enSlug);\n return info.changes;\n}\n\n/** Delete every EN snapshot row for an EN document. Returns the number removed. */\nexport function deleteEnSnapshotsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): number {\n const info = db\n .prepare(`DELETE FROM en_snapshots WHERE content_type = ? AND en_slug = ?`)\n .run(contentType, enSlug);\n return info.changes;\n}\n\nexport function countStaleTranslations(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n currentEnHash: string,\n): number {\n const row = db\n .prepare(\n `SELECT COUNT(*) as count FROM translations\n WHERE content_type = ? AND en_slug = ? AND en_hash != ?`,\n )\n .get(contentType, enSlug, currentEnHash) as { count: number };\n return row.count;\n}\n","/** Detect Gemini returning JSON-style `\\n` escapes as literal characters in MDX bodies. */\nfunction needsMdxEscapeNormalization(body: string): boolean {\n return /\\\\n[ \\t/>]|<[\\w.-][^>]*\\\\n/.test(body);\n}\n\n/**\n * Gemini sometimes returns MDX body with JSON-style escape sequences as literal\n * characters (e.g. `\\n` instead of a newline), which breaks MDX parsing.\n */\nexport function normalizeTranslatedMdxBody(body: string): {\n body: string;\n adjusted: boolean;\n} {\n if (!needsMdxEscapeNormalization(body)) {\n return { body, adjusted: false };\n }\n\n const normalized = body\n .replace(/\\\\r\\\\n/g, \"\\n\")\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\\\/g, \"\\\\\");\n\n return { body: normalized, adjusted: normalized !== body };\n}\n","/**\n * Fix JSX opening-tag attributes whose double-quoted values contain raw `\"` characters\n * (e.g. Hebrew gereshayim in דוא\"ל), which break MDX parsing.\n */\nexport function sanitizeMdxJsxAttributeQuotes(body: string): {\n body: string;\n adjusted: boolean;\n} {\n let adjusted = false;\n let out = \"\";\n let i = 0;\n\n while (i < body.length) {\n if (body[i] !== \"<\" || !/[\\w.]/.test(body[i + 1] ?? \"\")) {\n out += body[i];\n i += 1;\n continue;\n }\n\n const tagStart = i;\n i += 1;\n while (i < body.length && /[\\w.-]/.test(body[i] ?? \"\")) i += 1;\n const tagName = body.slice(tagStart + 1, i);\n\n let tagOut = `<${tagName}`;\n let tagAdjusted = false;\n\n while (i < body.length && body[i] !== \">\" && body[i] !== \"/\") {\n while (i < body.length && /\\s/.test(body[i] ?? \"\")) {\n tagOut += body[i];\n i += 1;\n }\n if (i >= body.length || body[i] === \">\" || body[i] === \"/\") break;\n\n const attrStart = i;\n while (i < body.length && /[\\w:.-]/.test(body[i] ?? \"\")) i += 1;\n const attrName = body.slice(attrStart, i);\n // Not an attribute name (e.g. `<locale,` in prose or a code fence):\n // this is not a sanitizable tag — bail and copy the text through.\n if (!attrName) break;\n while (i < body.length && /\\s/.test(body[i] ?? \"\")) i += 1;\n if (body[i] !== \"=\") {\n tagOut += body.slice(attrStart, i);\n continue;\n }\n\n tagOut += body.slice(attrStart, i);\n tagOut += \"=\";\n i += 1;\n // Preserve any whitespace between `=` and the value so that inputs we do\n // not rewrite are copied through byte-for-byte.\n const wsStart = i;\n while (i < body.length && /\\s/.test(body[i] ?? \"\")) i += 1;\n tagOut += body.slice(wsStart, i);\n\n const quote = body[i];\n if (quote !== '\"' && quote !== \"'\") {\n // Unquoted or expression value (`href={x}`) — nothing to sanitize;\n // bail so the scan keeps making progress.\n break;\n }\n\n if (quote === \"'\") {\n const valStart = i + 1;\n i += 1;\n while (i < body.length) {\n if (body[i] === \"\\\\\") {\n i += 2;\n continue;\n }\n if (body[i] === \"'\") break;\n i += 1;\n }\n tagOut += body.slice(valStart - 1, i + 1);\n i += 1;\n continue;\n }\n\n const valStart = i + 1;\n i += 1;\n\n let closeIdx = -1;\n for (let scan = valStart; scan < body.length; scan += 1) {\n if (body[scan] !== '\"') continue;\n let j = scan + 1;\n while (j < body.length && /\\s/.test(body[j] ?? \"\")) j += 1;\n if (\n j < body.length &&\n (body[j] === \">\" || body[j] === \"/\" || /[a-zA-Z]/.test(body[j] ?? \"\"))\n ) {\n closeIdx = scan;\n break;\n }\n }\n\n if (closeIdx === -1) {\n tagOut += body.slice(valStart - 1, i);\n break;\n }\n\n const value = body.slice(valStart, closeIdx);\n const hasInternalQuote = value.includes('\"');\n\n if (hasInternalQuote) {\n const escaped = value.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\");\n tagOut += `'${escaped}'`;\n tagAdjusted = true;\n } else {\n tagOut += `\"${value}\"`;\n }\n\n i = closeIdx + 1;\n }\n\n if (tagAdjusted) adjusted = true;\n tagOut += body[i] ?? \"\";\n out += tagOut;\n i += 1;\n }\n\n return { body: out, adjusted };\n}\n","import remarkMdx from \"remark-mdx\";\nimport remarkParse from \"remark-parse\";\nimport { unified } from \"unified\";\nimport { normalizeTranslatedMdxBody } from \"./normalize-mdx-body.js\";\nimport { sanitizeMdxJsxAttributeQuotes } from \"./sanitize-mdx-jsx.js\";\n\nconst parser = unified().use(remarkParse).use(remarkMdx);\n\nexport function prepareTranslatedMdxBody(body: string): {\n body: string;\n adjusted: boolean;\n} {\n const normalized = normalizeTranslatedMdxBody(body);\n const sanitized = sanitizeMdxJsxAttributeQuotes(normalized.body);\n return {\n body: sanitized.body,\n adjusted: normalized.adjusted || sanitized.adjusted,\n };\n}\n\nexport function validateMdxBody(body: string): { ok: true } | { ok: false; error: string } {\n try {\n parser.parse(body);\n return { ok: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, error: message };\n }\n}\n\n/** Normalize, sanitize, and parse-check translated MDX before persistence. */\nexport function assertValidTranslatedMdxBody(body: string): {\n body: string;\n adjusted: boolean;\n} {\n const prepared = prepareTranslatedMdxBody(body);\n const validated = validateMdxBody(prepared.body);\n if (!validated.ok) {\n throw new Error(`MDX validation failed: ${validated.error}`);\n }\n return prepared;\n}\n","import type { SchemaFieldMeta } from \"../core/introspect-schema.js\";\nimport type { ResolvedAssetsConfig, ScribeDocument } from \"../core/types.js\";\n\n/**\n * Join `publicPath` in front of a root-relative web path, avoiding double\n * slashes. Handles the `\"/\"` identity case, absolute origins\n * (`https://cdn.example.com/`), and path prefixes (`/static/`).\n */\nexport function joinPublicPath(publicPath: string, webPath: string): string {\n if (publicPath === \"\" || publicPath === \"/\") return webPath;\n const suffix = webPath.startsWith(\"/\") ? webPath : `/${webPath}`;\n return publicPath.replace(/\\/+$/, \"\") + suffix;\n}\n\nfunction materializeTemplate(template: string, enSlug: string): string {\n return template.split(\"{slug}\").join(enSlug);\n}\n\n/**\n * Navigate to each concrete location of an asset field path (arrays at `*`\n * segments) and replace the leaf via `transform`. A `template`-backed field\n * whose value is absent is materialized at the leaf when the immediate parent\n * container exists; a top-level absent leaf is set directly on the frontmatter.\n */\nfunction setAssetAtPath(\n container: Record<string, unknown>,\n path: string[],\n transform: (current: string | undefined) => string | undefined,\n): void {\n const [head, ...rest] = path;\n if (head === undefined) return;\n\n if (rest.length === 0) {\n const current = container[head];\n const next = transform(typeof current === \"string\" ? current : undefined);\n if (next !== undefined) container[head] = next;\n return;\n }\n\n if (rest[0] === \"*\") {\n const arr = container[head];\n if (!Array.isArray(arr)) return;\n for (const item of arr) {\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n setAssetAtPath(item as Record<string, unknown>, rest.slice(1), transform);\n }\n }\n return;\n }\n\n const child = container[head];\n if (child && typeof child === \"object\" && !Array.isArray(child)) {\n setAssetAtPath(child as Record<string, unknown>, rest, transform);\n }\n}\n\n/**\n * Resolve declared asset fields on a freshly-built document's frontmatter,\n * in place: materialize templated paths (`{slug}` → EN slug) and prefix\n * `assets.publicPath`. Runs after `mergeStructuralOntoLocale`, so locale\n * documents resolve from the merged EN source values.\n */\nexport function resolveDocumentAssets(\n doc: ScribeDocument,\n assetFields: SchemaFieldMeta[],\n assets: ResolvedAssetsConfig,\n): void {\n const frontmatter = doc.frontmatter as Record<string, unknown>;\n for (const f of assetFields) {\n setAssetAtPath(frontmatter, f.path, (current) => {\n let value = current;\n if (value === undefined) {\n if (!f.assetTemplate) return undefined;\n value = materializeTemplate(f.assetTemplate, doc.enSlug);\n }\n return joinPublicPath(assets.publicPath, value);\n });\n }\n}\n","/**\n * Inline tokens: `${{...}}` markers embedded in MDX bodies. Four kinds — static\n * literals, relation URLs/slugs, asset URLs, and per-document vars. See\n * `docs/inline-tokens.md`.\n *\n * This module is the shared, dependency-light heart of the feature: a tokenizer\n * that turns a raw body into a `placeholderBody` (tokens swapped for inert\n * `%%n%%` markers) plus the parsed token list, and the fill/mask helpers used by\n * the loader, translator, validator, and studio.\n *\n * Why `%%n%%` and not `{{n}}`: `{{...}}` is a JSX expression to remark-mdx and\n * would break MDX validation of stored translated bodies. `%%n%%` is inert text.\n */\n\n/** Opening delimiter of an inline token. */\nconst TOKEN_OPEN = \"${{\";\n/** Escape sequence: `$\\{{` renders as a literal `${{` and is never a token. */\nconst ESCAPE_SEQUENCE = \"$\\\\{{\";\nconst ESCAPE_RESULT = \"${{\";\n\nexport type InlineTokenKind = \"static\" | \"relation\" | \"asset\" | \"var\";\n\nexport interface StaticInlineToken {\n kind: \"static\";\n /** Verbatim literal (decoded from the token's JSON string). */\n text: string;\n /** The full `${{...}}` source span. */\n raw: string;\n}\n\nexport interface RelationInlineToken {\n kind: \"relation\";\n targetTypeId: string;\n enSlug: string;\n /** `\"href\"` resolves to a link path; `\"slug\"` resolves to the EN slug. */\n mode: \"href\" | \"slug\";\n raw: string;\n}\n\nexport interface AssetInlineToken {\n kind: \"asset\";\n /** Root-relative web path, e.g. `/web/path.webp`. */\n webPath: string;\n raw: string;\n}\n\nexport interface VarInlineToken {\n kind: \"var\";\n key: string;\n raw: string;\n}\n\nexport type InlineToken =\n | StaticInlineToken\n | RelationInlineToken\n | AssetInlineToken\n | VarInlineToken;\n\n/** A `${{...}}` span that failed to parse. Reported by validation, left as-is. */\nexport interface MalformedInlineToken {\n raw: string;\n reason: string;\n /** Byte offset of the token's `$` in the source body. */\n index: number;\n}\n\nexport interface ExtractInlineTokensResult {\n /** Body with each well-formed token replaced by `%%n%%` (1-based). */\n placeholderBody: string;\n /** Parsed well-formed tokens, in order of appearance. */\n tokens: InlineToken[];\n /** Spans that look like tokens but failed to parse. */\n malformed: MalformedInlineToken[];\n}\n\n/** The inert marker for the n-th (1-based) extracted token. */\nexport function placeholderMarker(n: number): string {\n return `%%${n}%%`;\n}\n\n/**\n * Find the index of the closing `}}` of a token whose content starts at\n * `start`. JSON-string aware so a static literal like `${{static:\"a}}b\"}}`\n * terminates at the correct `}}`. Returns the index of the first closing brace,\n * or -1 when the token is unterminated (also bails on a newline: tokens never\n * span lines).\n */\nfunction findTokenEnd(body: string, start: number): number {\n let i = start;\n let inString = false;\n while (i < body.length) {\n const ch = body[i]!;\n if (ch === \"\\n\") return -1;\n if (inString) {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === '\"') inString = false;\n i += 1;\n continue;\n }\n if (ch === '\"') {\n inString = true;\n i += 1;\n continue;\n }\n if (ch === \"}\" && body[i + 1] === \"}\") return i;\n i += 1;\n }\n return -1;\n}\n\n/** Omit that distributes over a union (unlike the built-in `Omit`). */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\ntype ParseResult =\n | { ok: true; token: DistributiveOmit<InlineToken, \"raw\"> }\n | { ok: false; reason: string };\n\n/** Parse the inner content of a token (everything between `${{` and `}}`). */\nfunction parseTokenInner(inner: string): ParseResult {\n const colon = inner.indexOf(\":\");\n if (colon === -1) {\n return { ok: false, reason: `missing kind separator \":\"` };\n }\n const kind = inner.slice(0, colon);\n const rest = inner.slice(colon + 1);\n\n switch (kind) {\n case \"static\": {\n let text: unknown;\n try {\n text = JSON.parse(rest);\n } catch {\n return { ok: false, reason: `static value is not a valid JSON string` };\n }\n if (typeof text !== \"string\") {\n return { ok: false, reason: `static value must be a JSON string` };\n }\n return { ok: true, token: { kind: \"static\", text } };\n }\n case \"relation\": {\n // Slugs cannot contain \":\" so splitting is unambiguous.\n const parts = rest.split(\":\");\n if (parts.length !== 3) {\n return {\n ok: false,\n reason: `relation must be relation:<typeId>:<enSlug>:href or relation:<typeId>:<enSlug>:slug`,\n };\n }\n const [targetTypeId, enSlug, mode] = parts;\n if (!targetTypeId || !enSlug) {\n return { ok: false, reason: `relation is missing a typeId or enSlug` };\n }\n if (mode !== \"href\" && mode !== \"slug\") {\n return { ok: false, reason: `relation mode must be \"href\" or \"slug\" (got \"${mode}\")` };\n }\n return {\n ok: true,\n token: {\n kind: \"relation\",\n targetTypeId,\n enSlug,\n mode,\n },\n };\n }\n case \"asset\": {\n if (!rest.startsWith(\"/\")) {\n return { ok: false, reason: `asset path must start with \"/\" (got \"${rest}\")` };\n }\n return { ok: true, token: { kind: \"asset\", webPath: rest } };\n }\n case \"var\": {\n if (!rest) return { ok: false, reason: `var is missing a key` };\n return { ok: true, token: { kind: \"var\", key: rest } };\n }\n default:\n return { ok: false, reason: `unknown token kind \"${kind}\"` };\n }\n}\n\n/**\n * Replace every well-formed token with an inert `%%n%%` marker and return the\n * parsed token list. Malformed spans are left verbatim (validation reports them)\n * and do NOT consume a marker index. Escape sequences (`$\\{{`) are not tokens\n * and pass through untouched — so a body with zero tokens yields\n * `placeholderBody === body` byte-for-byte.\n */\nexport function extractInlineTokens(body: string): ExtractInlineTokensResult {\n const tokens: InlineToken[] = [];\n const malformed: MalformedInlineToken[] = [];\n let out = \"\";\n let i = 0;\n\n while (i < body.length) {\n const open = body.indexOf(TOKEN_OPEN, i);\n if (open === -1) {\n out += body.slice(i);\n break;\n }\n out += body.slice(i, open);\n\n const contentStart = open + TOKEN_OPEN.length;\n const end = findTokenEnd(body, contentStart);\n if (end === -1) {\n // Unterminated: leave the rest verbatim; report it.\n malformed.push({\n raw: body.slice(open),\n reason: `unterminated token (missing \"}}\")`,\n index: open,\n });\n out += body.slice(open);\n break;\n }\n\n const raw = body.slice(open, end + 2);\n const inner = body.slice(contentStart, end);\n const parsed = parseTokenInner(inner);\n if (parsed.ok) {\n tokens.push({ ...parsed.token, raw } as InlineToken);\n out += placeholderMarker(tokens.length);\n } else {\n malformed.push({ raw, reason: parsed.reason, index: open });\n out += raw;\n }\n i = end + 2;\n }\n\n return { placeholderBody: out, tokens, malformed };\n}\n\n/**\n * Fill `%%n%%` markers with resolved values (1-based). A marker with no\n * corresponding value (a stale translation whose EN body lost tokens) is left\n * verbatim rather than blanked, so no meaningful text is silently dropped.\n */\nexport function fillPlaceholders(body: string, resolvedValues: string[]): string {\n return body.replace(/%%(\\d+)%%/g, (match, n: string) => {\n const idx = Number(n) - 1;\n return idx >= 0 && idx < resolvedValues.length ? resolvedValues[idx]! : match;\n });\n}\n\n/** Convert `$\\{{` escape sequences back to a literal `${{`. Render-time only. */\nexport function unescapeInlineTokens(body: string): string {\n return body.split(ESCAPE_SEQUENCE).join(ESCAPE_RESULT);\n}\n\n/**\n * Count the markers `%%1%%..%%N%%` in a body. Used by the post-receive\n * verification: each must appear exactly once in a translated body.\n */\nexport function countMarkerOccurrences(body: string, n: number): number {\n return body.split(placeholderMarker(n)).length - 1;\n}\n\n/**\n * Walk a body replacing every token span (valid OR malformed) and every escape\n * sequence via the provided callbacks. Used where the raw `${{` / `$\\{{` braces\n * must never reach a downstream MDX parser or preview renderer.\n */\nexport function replaceInlineSpans(\n body: string,\n opts: {\n token: (raw: string, inner: string) => string;\n escape: () => string;\n },\n): string {\n let out = \"\";\n let i = 0;\n while (i < body.length) {\n if (body.startsWith(ESCAPE_SEQUENCE, i)) {\n out += opts.escape();\n i += ESCAPE_SEQUENCE.length;\n continue;\n }\n if (body.startsWith(TOKEN_OPEN, i)) {\n const end = findTokenEnd(body, i + TOKEN_OPEN.length);\n if (end !== -1) {\n const raw = body.slice(i, end + 2);\n const inner = body.slice(i + TOKEN_OPEN.length, end);\n out += opts.token(raw, inner);\n i = end + 2;\n continue;\n }\n }\n out += body[i]!;\n i += 1;\n }\n return out;\n}\n\n/**\n * Neutralize inline tokens and escapes so a body can be handed to remark-mdx for\n * a structural parse check without the `${{`/`{{` braces producing false MDX\n * errors. Local to validation/preview: never used for hashing or storage.\n */\nexport function maskInlineTokensForMdx(body: string): string {\n return replaceInlineSpans(body, {\n token: () => \"inline\",\n escape: () => \"$\",\n });\n}\n","import fs from \"node:fs\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { createUrlBuilder, isRoutableType, type UrlBuilder } from \"../i18n/build-url.js\";\nimport { joinPublicPath } from \"../loader/resolve-assets.js\";\nimport { openStore, resolveStorePath } from \"../storage/sqlite.js\";\nimport { bulkLoadTranslations } from \"../storage/translations.js\";\nimport {\n extractInlineTokens,\n fillPlaceholders,\n unescapeInlineTokens,\n type InlineToken,\n} from \"./tokens.js\";\n\n/**\n * Read-time token resolver. Maps a single inline token to its string value given\n * the EN source document's frontmatter and a target locale.\n *\n * Relations resolve to a locale-aware URL via the existing `resolvePath`\n * machinery, using the target document's *localized* slug. Localized slugs live\n * in the translation store; the resolver reads them once per store revision\n * (keyed on the store file's mtime), never through another type's loader, so\n * there is no cross-loader recursion.\n */\nexport interface InlineResolver {\n resolve(\n token: InlineToken,\n enFrontmatter: Record<string, unknown>,\n locale: string,\n ): string;\n}\n\n/** How `:href` relation tokens resolve (see `docs/inline-tokens.md`). */\nexport type InlineLinkStyle = \"app\" | \"export\";\n\nexport interface CreateInlineResolverOptions {\n /** Default `\"app\"` — locale-free pathnames for framework routers. */\n linkStyle?: InlineLinkStyle;\n /** File extension appended to localized slugs in `\"export\"` mode. Default `.md`. */\n exportExtension?: `.${string}`;\n}\n\nfunction slugKey(typeId: string, enSlug: string, locale: string): string {\n return `${typeId}\\u0000${enSlug}\\u0000${locale}`;\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n return Object.values(value as Record<string, unknown>).every((v) => typeof v === \"string\");\n}\n\nexport function createInlineResolver(\n config: ScribeConfig,\n options: CreateInlineResolverOptions = {},\n): InlineResolver {\n const linkStyle = options.linkStyle ?? \"app\";\n const exportExtension = options.exportExtension ?? \".md\";\n const urlBuilder: UrlBuilder = createUrlBuilder(config);\n const typeById = new Map(config.types.map((t) => [t.id, t]));\n const storePath = resolveStorePath(config);\n\n let slugCache: { mtime: number; index: Map<string, string> } | null = null;\n\n const localizedSlugIndex = (): Map<string, string> => {\n let mtime = 0;\n try {\n mtime = fs.statSync(storePath).mtimeMs;\n } catch {\n mtime = 0;\n }\n if (slugCache && slugCache.mtime === mtime) return slugCache.index;\n\n const index = new Map<string, string>();\n try {\n const db = openStore(config, \"readonly\");\n try {\n for (const row of bulkLoadTranslations(db)) {\n index.set(slugKey(row.content_type, row.en_slug, row.locale), row.slug);\n }\n } finally {\n db.close();\n }\n } catch {\n /* store missing or unreadable: fall back to EN slugs */\n }\n slugCache = { mtime, index };\n return index;\n };\n\n const localizedSlug = (typeId: string, enSlug: string, locale: string): string => {\n if (locale === config.defaultLocale) return enSlug;\n const index = localizedSlugIndex();\n const direct = index.get(slugKey(typeId, enSlug, locale));\n if (direct) return direct;\n for (const fb of config.localeFallbacks?.[locale] ?? []) {\n const hit = index.get(slugKey(typeId, enSlug, fb));\n if (hit) return hit;\n }\n return enSlug;\n };\n\n return {\n resolve(token, enFrontmatter, locale): string {\n switch (token.kind) {\n case \"static\":\n return token.text;\n\n case \"var\": {\n const vars = enFrontmatter.vars;\n if (isStringRecord(vars) && typeof vars[token.key] === \"string\") {\n return vars[token.key]!;\n }\n return \"\";\n }\n\n case \"asset\": {\n const assets = config.assets;\n return assets ? joinPublicPath(assets.publicPath, token.webPath) : token.webPath;\n }\n\n case \"relation\": {\n const type = typeById.get(token.targetTypeId);\n if (!type) return \"\";\n if (token.mode === \"slug\") return token.enSlug;\n if (!isRoutableType(type)) return \"\";\n const slug = localizedSlug(token.targetTypeId, token.enSlug, locale);\n if (linkStyle === \"export\") {\n return urlBuilder.resolvePath(type.path!, `${slug}${exportExtension}`, locale);\n }\n return type.path!.replace(\"{slug}\", slug);\n }\n }\n },\n };\n}\n\n/**\n * Substitute inline tokens in an EN body at read time: extract tokens, resolve\n * each for the default locale, fill the placeholder markers, and unescape any\n * `$\\{{` sequences. A body with no tokens is returned unchanged (aside from\n * unescaping).\n */\nexport function substituteEnInlineBody(\n rawBody: string,\n enFrontmatter: Record<string, unknown>,\n defaultLocale: string,\n resolver: InlineResolver,\n): string {\n const { placeholderBody, tokens } = extractInlineTokens(rawBody);\n if (tokens.length === 0) return unescapeInlineTokens(placeholderBody);\n const values = tokens.map((t) => resolver.resolve(t, enFrontmatter, defaultLocale));\n return unescapeInlineTokens(fillPlaceholders(placeholderBody, values));\n}\n\n/**\n * Fill a stored translated body's `%%n%%` markers at read time. Tokens are\n * extracted from the CURRENT raw EN body and resolved for the document's locale,\n * so token VALUES (relation targets, asset paths, var values) always reflect the\n * live EN source even when the translation itself is older.\n */\nexport function fillTranslatedInlineBody(\n translatedBody: string,\n enRawBody: string,\n enFrontmatter: Record<string, unknown>,\n locale: string,\n resolver: InlineResolver,\n): string {\n const { tokens } = extractInlineTokens(enRawBody);\n if (tokens.length === 0) return unescapeInlineTokens(translatedBody);\n const values = tokens.map((t) => resolver.resolve(t, enFrontmatter, locale));\n return unescapeInlineTokens(fillPlaceholders(translatedBody, values));\n}\n","export function normalizeEnFrontmatter(data: Record<string, unknown>): Record<string, unknown> {\n const out = { ...data };\n if (!out.publishedAt && typeof out.date === \"string\") {\n out.publishedAt = out.date;\n }\n if (!out.heroImage && typeof out.image === \"string\" && out.image.startsWith(\"/\")) {\n out.heroImage = out.image;\n }\n if (!out.updatedAt && typeof out.publishedAt === \"string\") {\n out.updatedAt = out.publishedAt;\n }\n return out;\n}\n\nexport function isPublishableContentFile(name: string): boolean {\n if (!name.endsWith(\".md\") && !name.endsWith(\".mdx\")) return false;\n const first = name.charAt(0);\n return first === first.toLowerCase() && first !== \"_\";\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport type { z } from \"zod\";\nimport {\n extractBuiltinEnFields,\n mergeBuiltinsIntoFrontmatter,\n seoFieldsFromEn,\n} from \"../core/builtin-fields.js\";\nimport {\n listAssetFields,\n mergeStructuralOntoLocale,\n pickTranslatable,\n type SchemaFieldMeta,\n} from \"../core/introspect-schema.js\";\nimport type {\n AllDocuments,\n ContentTypeConfig,\n LocaleIndex,\n ScribeConfig,\n ScribeDocument,\n} from \"../core/types.js\";\nimport { openStore, resolveStorePath } from \"../storage/sqlite.js\";\nimport { listTranslationsForType } from \"../storage/translations.js\";\nimport { prepareTranslatedMdxBody } from \"../translate/validate-mdx-body.js\";\nimport {\n fillTranslatedInlineBody,\n substituteEnInlineBody,\n type InlineResolver,\n} from \"../inline/resolve-tokens.js\";\nimport { isPublishableContentFile, normalizeEnFrontmatter } from \"./normalize-en.js\";\nimport { resolveDocumentAssets } from \"./resolve-assets.js\";\n\nfunction isPostFile(name: string): boolean {\n return isPublishableContentFile(name);\n}\n\nfunction listEnFiles(contentDir: string): string[] {\n if (!fs.existsSync(contentDir)) return [];\n return fs\n .readdirSync(contentDir)\n .filter(isPostFile)\n .map((f) => path.join(contentDir, f));\n}\n\nfunction slugFromPath(filePath: string): string {\n return path.basename(filePath).replace(/\\.(md|mdx)$/, \"\");\n}\n\nexport interface ParseEnResult {\n document: ScribeDocument | null;\n issues: Array<{ field: string; message: string; level: \"error\" | \"warning\" }>;\n}\n\nexport function parseEnMdx(\n filePath: string,\n config: ScribeConfig,\n type: ContentTypeConfig,\n): ParseEnResult {\n const raw = fs.readFileSync(filePath, \"utf8\");\n const parsed = matter(raw);\n const slug = slugFromPath(filePath);\n const normalized = normalizeEnFrontmatter(parsed.data as Record<string, unknown>);\n const { builtin, rest, issues: builtinIssues } = extractBuiltinEnFields(\n normalized,\n type.path,\n slug,\n config.defaultLocale,\n );\n const issues = builtinIssues.map((issue) => ({\n field: issue.field,\n message: issue.message,\n level: issue.level,\n }));\n\n const result = type.schema.safeParse(rest);\n if (!result.success) {\n return {\n document: null,\n issues: [\n ...issues,\n ...result.error.issues.map((issue) => ({\n field: issue.path.join(\".\"),\n message: issue.message,\n level: \"error\" as const,\n })),\n ],\n };\n }\n\n if (issues.some((i) => i.level === \"error\")) {\n return { document: null, issues };\n }\n\n const frontmatter = mergeBuiltinsIntoFrontmatter(\n result.data as Record<string, unknown>,\n {\n publishedAt: builtin.publishedAt,\n updatedAt: builtin.updatedAt,\n noindex: builtin.noindex,\n canonicalPathOverride: builtin.canonicalPathOverride,\n vars: builtin.vars,\n slug,\n locale: config.defaultLocale,\n },\n type,\n config.defaultLocale,\n config.localeRouting,\n );\n\n const crossIssues = type.crossValidate?.(result.data as z.infer<typeof type.schema>, {\n locale: config.defaultLocale,\n defaultLocale: config.defaultLocale,\n slug,\n enSlug: slug,\n knownLocales: config.locales,\n }) ?? [];\n issues.push(...crossIssues);\n\n const document: ScribeDocument = {\n slug,\n enSlug: slug,\n locale: config.defaultLocale,\n publishedAt: builtin.publishedAt,\n updatedAt: builtin.updatedAt,\n noindex: builtin.noindex,\n canonicalPathOverride: builtin.canonicalPathOverride,\n frontmatter,\n // Bodyless types (`body: false`) never carry a body: the loader skips the\n // MDX body entirely so runtimes, exports, and hashing all see an empty body.\n // A stray body is reported separately by `scribe validate`.\n content: type.body === false ? \"\" : parsed.content,\n filePath,\n };\n\n return { document, issues };\n}\n\nfunction buildDocumentFromTranslation(\n row: {\n slug: string;\n en_slug: string;\n locale: string;\n frontmatter_json: string;\n body: string;\n },\n enDoc: ScribeDocument,\n type: ContentTypeConfig,\n config: ScribeConfig,\n inlineResolver?: InlineResolver,\n): ScribeDocument {\n const localeFm = JSON.parse(row.frontmatter_json) as Record<string, unknown>;\n const merged = mergeStructuralOntoLocale(localeFm, enDoc.frontmatter, type.schema);\n const seo = seoFieldsFromEn(enDoc);\n const frontmatter = mergeBuiltinsIntoFrontmatter(\n merged,\n { ...seo, slug: row.slug, locale: row.locale },\n type,\n config.defaultLocale,\n config.localeRouting,\n );\n\n // The stored body carries `%%n%%` markers. When token substitution is enabled\n // (runtime read path only) fill them from the CURRENT EN body's tokens,\n // resolved for this locale; otherwise leave the raw markers in place.\n const preparedBody = prepareTranslatedMdxBody(row.body).body;\n const content = inlineResolver\n ? fillTranslatedInlineBody(\n preparedBody,\n enDoc.content,\n enDoc.frontmatter as Record<string, unknown>,\n row.locale,\n inlineResolver,\n )\n : preparedBody;\n\n return {\n slug: row.slug,\n enSlug: row.en_slug,\n locale: row.locale,\n publishedAt: seo.publishedAt,\n updatedAt: seo.updatedAt,\n noindex: seo.noindex,\n canonicalPathOverride: seo.canonicalPathOverride,\n frontmatter,\n content,\n };\n}\n\nconst DEV_REVALIDATE_MS = 1500;\n\n/**\n * Package-internal monotonic content version. A mutation that writes/removes\n * content files (currently only entry deletion) bumps this so every loader\n * treats its cached document list as stale immediately, bypassing the dev\n * revalidation window. Not exported from the package's public entrypoint.\n */\nlet contentVersion = 0;\n\n/** Invalidate every content loader's cache after an in-process content mutation. */\nexport function bumpContentVersion(): void {\n contentVersion++;\n}\n\nexport function createContentLoader(\n config: ScribeConfig,\n type: ContentTypeConfig,\n options: { resolveAssets?: boolean; inlineResolver?: InlineResolver } = {},\n): () => AllDocuments {\n let cached: AllDocuments | null = null;\n let signature = \"\";\n let lastCheck = 0;\n let builtVersion = contentVersion;\n const contentDir = path.join(/* turbopackIgnore: true */ config.rootDir, type.contentDir);\n const storePath = resolveStorePath(config);\n const isProd = process.env.NODE_ENV === \"production\";\n\n // Asset resolution is a runtime read-path concern (createScribe only); the CLI,\n // validation, and static exports build the project without it and see source values.\n const assets = config.assets;\n const assetFields: SchemaFieldMeta[] =\n assets && options.resolveAssets ? listAssetFields(type.schema) : [];\n const resolveAssets = (doc: ScribeDocument): void => {\n if (assetFields.length > 0 && assets) resolveDocumentAssets(doc, assetFields, assets);\n };\n\n // Inline-token substitution is a runtime read-path concern (createScribe only),\n // gated exactly like asset resolution: the CLI, validation, and studio keep raw\n // token syntax so they can introspect and re-hash source bodies.\n const inlineResolver = options.inlineResolver;\n const resolveEnInline = (doc: ScribeDocument): void => {\n if (inlineResolver) {\n doc.content = substituteEnInlineBody(\n doc.content,\n doc.frontmatter as Record<string, unknown>,\n config.defaultLocale,\n inlineResolver,\n );\n }\n };\n\n function computeSignature(): string {\n const files = listEnFiles(contentDir);\n let newest = 0;\n for (const f of files) {\n try {\n newest = Math.max(newest, fs.statSync(f).mtimeMs);\n } catch {\n /* ignore */\n }\n }\n let store = 0;\n try {\n store = fs.statSync(storePath).mtimeMs;\n } catch {\n /* ignore */\n }\n return `${files.length}:${newest}:${store}`;\n }\n\n function build(): AllDocuments {\n const out = new Map<string, LocaleIndex>();\n const englishBySlug = new Map<string, ScribeDocument>();\n\n for (const file of listEnFiles(contentDir)) {\n const { document, issues } = parseEnMdx(file, config, type);\n if (document) {\n englishBySlug.set(document.slug, document);\n if (issues.length > 0) {\n for (const issue of issues) {\n console.warn(\n `[scribe:${type.id}] ${file} ${issue.level}: ${issue.field}: ${issue.message}`,\n );\n }\n }\n } else {\n console.warn(\n `[scribe:${type.id}] Skipping ${file} — validation failed:\\n` +\n issues.map((i) => ` - ${i.field}: ${i.message}`).join(\"\\n\"),\n );\n }\n }\n\n out.set(config.defaultLocale, {\n bySlug: englishBySlug,\n byEnSlug: englishBySlug,\n });\n\n const db = openStore(config, \"readonly\");\n const rows = listTranslationsForType(db, type.id);\n db.close();\n\n const rowsByLocale = new Map<string, typeof rows>();\n for (const row of rows) {\n const list = rowsByLocale.get(row.locale) ?? [];\n list.push(row);\n rowsByLocale.set(row.locale, list);\n }\n\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const bySlug = new Map<string, ScribeDocument>();\n const byEnSlug = new Map<string, ScribeDocument>();\n for (const row of rowsByLocale.get(locale) ?? []) {\n const enDoc = englishBySlug.get(row.en_slug);\n if (!enDoc) continue;\n // Merge structural (incl. asset) fields from the *unresolved* EN source,\n // then resolve the locale doc's own fresh frontmatter.\n const doc = buildDocumentFromTranslation(row, enDoc, type, config, inlineResolver);\n resolveAssets(doc);\n bySlug.set(doc.slug, doc);\n byEnSlug.set(row.en_slug, doc);\n }\n out.set(locale, { bySlug, byEnSlug });\n }\n\n // Resolve EN docs last: locale docs merged from their unresolved frontmatter\n // above, and translated bodies extract tokens from the still-raw EN content.\n for (const doc of englishBySlug.values()) {\n resolveAssets(doc);\n resolveEnInline(doc);\n }\n\n return out;\n }\n\n return () => {\n if (cached) {\n // An in-process content mutation (e.g. entry deletion) forces an\n // unconditional rebuild regardless of prod mode or the dev window.\n if (contentVersion !== builtVersion) {\n cached = build();\n builtVersion = contentVersion;\n lastCheck = Date.now();\n signature = isProd ? \"\" : computeSignature();\n return cached;\n }\n if (isProd) return cached;\n const now = Date.now();\n if (now - lastCheck < DEV_REVALIDATE_MS) return cached;\n lastCheck = now;\n const sig = computeSignature();\n if (sig === signature) return cached;\n cached = build();\n signature = sig;\n return cached;\n }\n lastCheck = Date.now();\n cached = build();\n builtVersion = contentVersion;\n signature = isProd ? \"\" : computeSignature();\n return cached;\n };\n}\n\nexport function readEnDocument(\n config: ScribeConfig,\n type: ContentTypeConfig,\n enSlug: string,\n): ScribeDocument | null {\n const contentDir = path.join(/* turbopackIgnore: true */ config.rootDir, type.contentDir);\n for (const ext of [\".mdx\", \".md\"]) {\n const filePath = path.join(contentDir, `${enSlug}${ext}`);\n if (!fs.existsSync(filePath)) continue;\n const { document } = parseEnMdx(filePath, config, type);\n return document;\n }\n return null;\n}\n\nexport function getTranslatablePayload(\n doc: ScribeDocument,\n type: ContentTypeConfig,\n): { frontmatter: Record<string, unknown>; body: string } {\n return {\n frontmatter: pickTranslatable(doc.frontmatter, type.schema),\n // Bodyless types never contribute a body to any translation payload, hash,\n // or snapshot — regardless of what a document's `content` happens to hold.\n body: type.body === false ? \"\" : doc.content,\n };\n}\n","import type { ContentTypeConfig, ScribeDocument, ResolvedDocument } from \"../core/types.js\";\nimport { createUrlBuilder } from \"./build-url.js\";\nimport type { LocaleRoutingConfig } from \"../core/types.js\";\n\n/** Resolve a document by slug and locale (fallback, cross-locale slug correction). */\nexport function resolveLocalizedDocument<TDoc extends ScribeDocument>(\n slug: string,\n locale: string,\n defaultLocale: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n type: ContentTypeConfig,\n localeRouting?: LocaleRoutingConfig,\n fallbackLocales: readonly string[] = [],\n): ResolvedDocument<TDoc> {\n const urlBuilder = createUrlBuilder({\n locales: [defaultLocale, locale],\n defaultLocale,\n localeRouting: localeRouting ?? { strategy: \"path-prefix\", prefixDefaultLocale: false },\n });\n\n const idx = allDocs.get(locale);\n const direct = idx?.bySlug.get(slug);\n if (direct) {\n return { document: direct, actualLocale: locale };\n }\n\n for (const [docLocale, docIdx] of allDocs) {\n const found = docIdx.bySlug.get(slug);\n if (!found) continue;\n\n const enSlug = docLocale === defaultLocale ? found.slug : found.enSlug;\n\n // Which document should canonically serve the requested locale? Try the\n // requested locale first, then its configured fallback chain.\n let target: TDoc | undefined;\n let targetLocale = locale;\n for (const candidateLocale of [locale, ...fallbackLocales]) {\n const cand =\n candidateLocale === defaultLocale\n ? allDocs.get(candidateLocale)?.bySlug.get(enSlug)\n : allDocs.get(candidateLocale)?.byEnSlug.get(enSlug);\n if (cand) {\n target = cand;\n targetLocale = candidateLocale;\n break;\n }\n }\n\n if (target) {\n if (target.slug === slug) {\n return { document: target, actualLocale: targetLocale };\n }\n if (!type.path) {\n return { document: null, actualLocale: locale };\n }\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: urlBuilder.resolvePath(type.path, target.slug, locale),\n };\n }\n\n if (docLocale === defaultLocale) {\n return { document: found as TDoc, actualLocale: defaultLocale };\n }\n\n if (!type.path) {\n return { document: null, actualLocale: locale };\n }\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: urlBuilder.resolvePath(type.path, found.enSlug, locale),\n };\n }\n\n if (locale !== defaultLocale) {\n const enDoc = allDocs.get(defaultLocale)?.bySlug.get(slug);\n if (enDoc && type.indexFallback === \"en\") {\n return { document: enDoc as TDoc, actualLocale: defaultLocale };\n }\n const byEn = idx?.byEnSlug.get(slug);\n if (byEn) {\n return { document: byEn as TDoc, actualLocale: locale };\n }\n const fallback = allDocs.get(defaultLocale)?.bySlug.get(slug);\n if (fallback && type.indexFallback === \"en\") {\n return { document: fallback as TDoc, actualLocale: defaultLocale };\n }\n }\n\n return { document: null, actualLocale: locale };\n}\n\n/** Map a document slug from one locale to another via the EN parent slug. */\nexport function getSlugForLocale<TDoc extends ScribeDocument>(\n document: TDoc,\n sourceLocale: string,\n targetLocale: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n defaultLocale: string,\n): string | null {\n if (sourceLocale === targetLocale) return document.slug;\n\n const englishSlug = sourceLocale === defaultLocale ? document.slug : document.enSlug;\n if (!englishSlug) return null;\n if (targetLocale === defaultLocale) return englishSlug;\n\n return allDocs.get(targetLocale)?.byEnSlug.get(englishSlug)?.slug ?? null;\n}\n","import type {\n ContentTypeConfig,\n ContentTypeRuntime,\n ListOptions,\n OrderBy,\n ScribeConfig,\n ScribeDocument,\n ScribeProject,\n StaticParam,\n} from \"./core/types.js\";\nimport { listRelationFields, type SchemaFieldMeta } from \"./core/introspect-schema.js\";\nimport { createContentLoader } from \"./loader/create-loader.js\";\nimport {\n createInlineResolver,\n type InlineLinkStyle,\n type InlineResolver,\n} from \"./inline/resolve-tokens.js\";\nimport { resolveLocalizedDocument } from \"./i18n/resolve-document.js\";\nimport { createUrlBuilder, isRoutableType } from \"./i18n/build-url.js\";\n\nfunction comparatorFor(orderBy: OrderBy): (a: ScribeDocument, b: ScribeDocument) => number {\n if (typeof orderBy === \"function\") return orderBy;\n switch (orderBy) {\n case \"publishedAt\":\n return (a, b) => (a.publishedAt ?? \"\").localeCompare(b.publishedAt ?? \"\");\n case \"-publishedAt\":\n return (a, b) => (b.publishedAt ?? \"\").localeCompare(a.publishedAt ?? \"\");\n case \"updatedAt\":\n return (a, b) => (a.updatedAt ?? \"\").localeCompare(b.updatedAt ?? \"\");\n case \"-updatedAt\":\n return (a, b) => (b.updatedAt ?? \"\").localeCompare(a.updatedAt ?? \"\");\n default:\n return (a, b) => a.slug.localeCompare(b.slug);\n }\n}\n\nfunction buildRuntime(\n config: ScribeConfig,\n type: ContentTypeConfig,\n getRuntime: (id: string) => ContentTypeRuntime,\n options: { resolveAssets?: boolean; inlineResolver?: InlineResolver } = {},\n): ContentTypeRuntime {\n const load = createContentLoader(config, type, {\n resolveAssets: options.resolveAssets,\n inlineResolver: options.inlineResolver,\n });\n const relationFields = new Map<string, SchemaFieldMeta>(\n listRelationFields(type.schema)\n .filter((f) => f.path.length === 1)\n .map((f) => [f.path[0]!, f]),\n );\n\n function assertRoutable(method: string): string {\n if (!type.path) {\n throw new Error(\n `Content type \"${type.id}\" has no path template — ${method}() requires one`,\n );\n }\n return type.path;\n }\n\n const urlBuilder = createUrlBuilder(config);\n\n const runtime: ContentTypeRuntime = {\n id: type.id,\n config: type,\n load,\n\n list(locale = config.defaultLocale, options: ListOptions = {}) {\n const idx = load().get(locale);\n if (!idx) return [];\n const docs = Array.from(idx.bySlug.values());\n docs.sort(comparatorFor(options.orderBy ?? type.orderBy ?? \"slug\"));\n return options.limit !== undefined ? docs.slice(0, options.limit) : docs;\n },\n\n get(slug: string, locale = config.defaultLocale) {\n return load().get(locale)?.bySlug.get(slug) ?? null;\n },\n\n resolve(slug: string, locale: string) {\n const result = resolveLocalizedDocument(\n slug,\n locale,\n config.defaultLocale,\n load(),\n type,\n config.localeRouting,\n config.localeFallbacks?.[locale] ?? [],\n );\n if (result.document && type.path) {\n return {\n ...result,\n canonicalPath: urlBuilder.resolvePath(\n type.path,\n result.document.slug,\n result.actualLocale,\n ),\n };\n }\n return result;\n },\n\n staticParams(options = {}) {\n assertRoutable(\"staticParams\");\n const all = load();\n const enIdx = all.get(config.defaultLocale);\n if (!enIdx) return [];\n const params: StaticParam[] = [];\n for (const locale of options.locales ?? config.locales) {\n const localeIdx = all.get(locale);\n const fallbacks = config.localeFallbacks?.[locale] ?? [];\n for (const doc of enIdx.bySlug.values()) {\n let slug: string;\n if (locale === config.defaultLocale) {\n slug = doc.slug;\n } else {\n // Prefer the locale's own translated slug, then each fallback\n // locale's translated slug, then the EN slug — matching resolve().\n slug =\n localeIdx?.byEnSlug.get(doc.slug)?.slug ??\n fallbacks\n .map((fb) => all.get(fb)?.byEnSlug.get(doc.slug)?.slug)\n .find((s): s is string => s !== undefined) ??\n doc.slug;\n }\n params.push({ locale, slug });\n }\n }\n return params;\n },\n\n alternates(doc: ScribeDocument) {\n const pathTemplate = assertRoutable(\"alternates\");\n const out: Record<string, string> = {\n [config.defaultLocale]: urlBuilder.resolvePath(\n pathTemplate,\n doc.enSlug,\n config.defaultLocale,\n ),\n };\n const all = load();\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const translated = all.get(locale)?.byEnSlug.get(doc.enSlug);\n if (translated) {\n out[locale] = urlBuilder.resolvePath(pathTemplate, translated.slug, locale);\n }\n }\n return out;\n },\n\n translation(doc: ScribeDocument, targetLocale: string) {\n if (targetLocale === doc.locale) return doc;\n const all = load();\n if (targetLocale === config.defaultLocale) {\n return all.get(config.defaultLocale)?.bySlug.get(doc.enSlug) ?? null;\n }\n return all.get(targetLocale)?.byEnSlug.get(doc.enSlug) ?? null;\n },\n\n url(slug: string, locale: string) {\n const pathTemplate = assertRoutable(\"url\");\n return urlBuilder.resolvePath(pathTemplate, slug, locale);\n },\n\n related(doc: ScribeDocument, fieldName: string, locale?: string) {\n const meta = relationFields.get(fieldName);\n if (!meta) {\n throw new Error(\n `Content type \"${type.id}\" has no top-level relation field \"${fieldName}\"`,\n );\n }\n const target = getRuntime(meta.relationTarget!);\n const lookupLocale = locale ?? doc.locale;\n const value = (doc.frontmatter as Record<string, unknown>)[fieldName];\n\n // Relations always hold EN slugs (structural fields are merged from EN).\n // Deref in the requested locale, falling back to the EN doc unconditionally.\n const deref = (enSlug: string): ScribeDocument | null => {\n const all = target.load();\n return (\n all.get(lookupLocale)?.byEnSlug.get(enSlug) ??\n all.get(config.defaultLocale)?.bySlug.get(enSlug) ??\n null\n );\n };\n\n if (meta.relationMultiple) {\n if (!Array.isArray(value)) return [];\n return value\n .filter((slug): slug is string => typeof slug === \"string\" && slug.length > 0)\n .map(deref)\n .filter((d): d is ScribeDocument => d !== null);\n }\n\n if (typeof value !== \"string\" || value.length === 0) {\n if (meta.relationOptional) return null;\n throw new Error(\n `${type.id} \"${doc.enSlug}\": required relation \"${fieldName}\" is missing`,\n );\n }\n const resolved = deref(value);\n if (!resolved && !meta.relationOptional) {\n throw new Error(\n `${type.id} \"${doc.enSlug}\": relation \"${fieldName}\" references missing ` +\n `${meta.relationTarget} \"${value}\" — run \\`scribe validate\\``,\n );\n }\n return resolved;\n },\n } as ContentTypeRuntime;\n\n return runtime;\n}\n\n/**\n * Create the untyped project engine (CLI, validation, studio).\n * Apps should use `createScribe()` for typed per-type accessors.\n * Expects a resolved config (`resolveConfig` / `loadConfigSync`).\n *\n * @param options.resolveAssets resolve declared asset fields to served URLs on\n * read (publicPath applied, templates materialized). Only `createScribe` sets\n * this; the CLI, validation, and static exports keep source values.\n * @param options.resolveInlineTokens substitute `${{...}}` inline tokens in\n * document bodies on read (EN tokens filled in place, translated `%%n%%`\n * markers filled from the current EN tokens). Only `createScribe` sets this;\n * the CLI, validation, and studio keep raw token syntax.\n * @internal\n */\nexport interface CreateProjectOptions {\n resolveAssets?: boolean;\n resolveInlineTokens?: boolean;\n /** How `:href` relation tokens resolve. Default `\"app\"`. */\n inlineLinkStyle?: InlineLinkStyle;\n /** Extension for `:href` in `\"export\"` mode. Default `.md`. */\n exportLinkExtension?: `.${string}`;\n}\n\nexport function createProject(\n config: ScribeConfig,\n options: CreateProjectOptions = {},\n): ScribeProject {\n const runtimes = new Map<string, ContentTypeRuntime>();\n const getRuntime = (id: string): ContentTypeRuntime => {\n const runtime = runtimes.get(id);\n if (!runtime) {\n throw new Error(`Unknown content type \"${id}\"`);\n }\n return runtime;\n };\n\n // One resolver instance shared across every type's loader. It reads localized\n // slugs straight from the store (never through another loader), so building it\n // here cannot recurse into the runtimes it lives alongside.\n const inlineResolver = options.resolveInlineTokens\n ? createInlineResolver(config, {\n linkStyle: options.inlineLinkStyle,\n exportExtension: options.exportLinkExtension,\n })\n : undefined;\n\n for (const type of config.types) {\n runtimes.set(\n type.id,\n buildRuntime(config, type, getRuntime, {\n resolveAssets: options.resolveAssets,\n inlineResolver,\n }),\n );\n }\n\n return {\n config,\n rootDir: config.rootDir,\n storePath: config.storePath,\n getType: getRuntime,\n listTypes() {\n return Array.from(runtimes.values());\n },\n listRoutableTypes() {\n return Array.from(runtimes.values()).filter((runtime) => isRoutableType(runtime.config));\n },\n };\n}\n","import { z } from \"zod\";\nimport { slugPatternSchema } from \"../core/builtin-fields.js\";\n\nconst redirectFromSchema = z.union([\n slugPatternSchema,\n z.array(slugPatternSchema).min(1).max(20),\n]);\n\nexport const typeRedirectEntrySchema = z\n .object({\n from: redirectFromSchema,\n toSlug: slugPatternSchema.optional(),\n toType: z.string().min(1).optional(),\n toUrl: z.string().min(1).optional(),\n permanent: z.boolean().optional(),\n })\n .superRefine((entry, ctx) => {\n const hasToSlug = entry.toSlug !== undefined;\n const hasToUrl = entry.toUrl !== undefined;\n const hasToType = entry.toType !== undefined;\n const targetCount = Number(hasToSlug) + Number(hasToUrl);\n\n if (targetCount !== 1) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Each redirect must specify exactly one of toSlug/toType+toSlug or toUrl\",\n path: [\"toSlug\"],\n });\n return;\n }\n\n if (hasToUrl && hasToType) {\n ctx.addIssue({\n code: \"custom\",\n message: \"toUrl cannot be combined with toType\",\n path: [\"toUrl\"],\n });\n }\n\n if (hasToType && !hasToSlug) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Cross-type redirects require both toType and toSlug\",\n path: [\"toSlug\"],\n });\n }\n });\n\nexport const typeRedirectsFileSchema = z.object({\n redirects: z.array(typeRedirectEntrySchema).max(500),\n});\n\nexport type TypeRedirectEntry = z.infer<typeof typeRedirectEntrySchema>;\nexport type TypeRedirectsFile = z.infer<typeof typeRedirectsFileSchema>;\n\nexport type RedirectTargetKind = \"same-type\" | \"cross-type\" | \"anywhere\";\n\nexport interface ParsedRedirectEntry {\n fromSlugs: string[];\n kind: RedirectTargetKind;\n toSlug?: string;\n toType?: string;\n toUrl?: string;\n permanent: boolean;\n}\n\nexport function normalizeRedirectFrom(from: string | string[]): string[] {\n return Array.isArray(from) ? from : [from];\n}\n\nexport function parseRedirectEntry(entry: TypeRedirectEntry): ParsedRedirectEntry {\n const fromSlugs = normalizeRedirectFrom(entry.from);\n if (entry.toUrl !== undefined) {\n return {\n fromSlugs,\n kind: \"anywhere\",\n toUrl: entry.toUrl,\n permanent: entry.permanent ?? true,\n };\n }\n if (entry.toType !== undefined) {\n return {\n fromSlugs,\n kind: \"cross-type\",\n toType: entry.toType,\n toSlug: entry.toSlug,\n permanent: entry.permanent ?? true,\n };\n }\n return {\n fromSlugs,\n kind: \"same-type\",\n toSlug: entry.toSlug,\n permanent: entry.permanent ?? true,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ContentTypeConfig, ScribeConfig } from \"../core/types.js\";\nimport {\n parseRedirectEntry,\n type ParsedRedirectEntry,\n typeRedirectsFileSchema,\n} from \"./redirect-schema.js\";\n\nexport const TYPE_REDIRECTS_FILENAME = \"_redirects.json\";\n\nexport interface LoadedTypeRedirects {\n contentTypeId: string;\n contentDir: string;\n filePath: string;\n entries: ParsedRedirectEntry[];\n}\n\nfunction redirectsFilePath(config: ScribeConfig, type: ContentTypeConfig): string {\n return path.join(config.rootDir, type.contentDir, TYPE_REDIRECTS_FILENAME);\n}\n\nexport function loadTypeRedirectsFile(\n config: ScribeConfig,\n type: ContentTypeConfig,\n): LoadedTypeRedirects | null {\n const filePath = redirectsFilePath(config, type);\n if (!fs.existsSync(filePath)) return null;\n\n let raw: unknown;\n try {\n raw = JSON.parse(fs.readFileSync(filePath, \"utf8\"));\n } catch (error) {\n throw new Error(\n `${type.id}: failed to parse ${TYPE_REDIRECTS_FILENAME}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n const parsed = typeRedirectsFileSchema.safeParse(raw);\n if (!parsed.success) {\n const details = parsed.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"root\"}: ${issue.message}`)\n .join(\"; \");\n throw new Error(`${type.id}: invalid ${TYPE_REDIRECTS_FILENAME}: ${details}`);\n }\n\n return {\n contentTypeId: type.id,\n contentDir: type.contentDir,\n filePath,\n entries: parsed.data.redirects.map(parseRedirectEntry),\n };\n}\n\nexport function loadAllTypeRedirects(config: ScribeConfig): LoadedTypeRedirects[] {\n const out: LoadedTypeRedirects[] = [];\n for (const type of config.types) {\n const loaded = loadTypeRedirectsFile(config, type);\n if (loaded) out.push(loaded);\n }\n return out;\n}\n\nexport function collectRedirectSourceSlugs(loaded: LoadedTypeRedirects[]): Set<string> {\n const slugs = new Set<string>();\n for (const file of loaded) {\n for (const entry of file.entries) {\n for (const from of entry.fromSlugs) {\n slugs.add(from);\n }\n }\n }\n return slugs;\n}\n\nexport function collectOutboundRedirectSourcesByType(\n loaded: LoadedTypeRedirects[],\n): Map<string, Set<string>> {\n const out = new Map<string, Set<string>>();\n for (const file of loaded) {\n const set = out.get(file.contentTypeId) ?? new Set<string>();\n for (const entry of file.entries) {\n for (const from of entry.fromSlugs) {\n set.add(from);\n }\n }\n out.set(file.contentTypeId, set);\n }\n return out;\n}\n","import type { ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { createUrlBuilder, isRoutableType } from \"../i18n/build-url.js\";\nimport { buildTranslationIndex } from \"../i18n/translation-index.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\nimport {\n buildJsonRedirects,\n buildLegacyNoBlogPathRedirects,\n buildRedirectSourceSlugSet,\n} from \"./build-json-redirects.js\";\nimport {\n collectOutboundRedirectSourcesByType,\n collectRedirectSourceSlugs,\n loadAllTypeRedirects,\n} from \"./load-type-redirects.js\";\nimport type { NextRedirectRule } from \"./types.js\";\n\nexport interface BuildRedirectsOptions {\n /** Locales that use a URL prefix (excludes default locale). Deprecated: derived from localeRouting when omitted. */\n prefixedLocales?: string[];\n}\n\nfunction buildRedirectTranslationIndex(\n project: ScribeProject,\n typeId: string,\n redirectSourceSlugs: Set<string>,\n): Map<string, Map<string, string>> {\n const runtime = project.getType(typeId);\n const { config } = project;\n const merged = buildTranslationIndex(\n runtime.load(),\n config.locales,\n config.defaultLocale,\n );\n\n const db = openStore(project.config, \"readonly\");\n try {\n for (const alias of redirectSourceSlugs) {\n for (const row of listTranslationsForEnSlug(db, typeId, alias)) {\n const localeMap = merged.get(row.locale) ?? new Map<string, string>();\n if (!localeMap.has(alias)) {\n localeMap.set(alias, row.slug);\n }\n merged.set(row.locale, localeMap);\n }\n }\n } finally {\n db.close();\n }\n\n return merged;\n}\n\nfunction buildCrossLocaleSlugRedirects(\n project: ScribeProject,\n typeId: string,\n redirectSourceSlugs: Set<string>,\n): NextRedirectRule[] {\n const type = project.getType(typeId).config;\n if (!isRoutableType(type)) return [];\n\n const urlBuilder = createUrlBuilder(project.config);\n const translationIndex = buildRedirectTranslationIndex(project, typeId, redirectSourceSlugs);\n const out: NextRedirectRule[] = [];\n const pathTemplate = type.path!;\n\n for (const [locale, localeMap] of translationIndex) {\n for (const [enSlug, translatedSlug] of localeMap) {\n if (enSlug === translatedSlug) continue;\n if (redirectSourceSlugs.has(enSlug)) continue;\n out.push({\n source: urlBuilder.resolvePath(pathTemplate, enSlug, locale),\n destination: urlBuilder.resolvePath(pathTemplate, translatedSlug, locale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildTypeRedirects(project: ScribeProject, typeId: string): NextRedirectRule[] {\n const loaded = loadAllTypeRedirects(project.config).find((file) => file.contentTypeId === typeId);\n const redirectSourceSlugs = new Set<string>();\n if (loaded) {\n for (const entry of loaded.entries) {\n for (const from of entry.fromSlugs) {\n redirectSourceSlugs.add(from);\n }\n }\n }\n\n return [\n ...buildCrossLocaleSlugRedirects(project, typeId, redirectSourceSlugs),\n ];\n}\n\n/** Build Next.js redirect rules from `_redirects.json`, locale slug fixes, and legacy blog paths. */\nexport function buildAllContentRedirects(\n project: ScribeProject,\n _options: BuildRedirectsOptions = {},\n): NextRedirectRule[] {\n const redirectSourceKeys = buildRedirectSourceSlugSet(project);\n const out: NextRedirectRule[] = [\n ...buildJsonRedirects(project),\n ...buildLegacyNoBlogPathRedirects(project, redirectSourceKeys),\n ];\n\n for (const type of project.config.types) {\n if (!isRoutableType(type)) continue;\n out.push(...buildTypeRedirects(project, type.id));\n }\n\n return out;\n}\n\nexport interface RedirectSourceSlugs {\n /** All inbound redirect source slugs — exclude from sitemap. */\n aliasSlugs: Set<string>;\n /** EN canonical slugs with outbound redirects — exclude from sitemap. */\n outboundByType: Map<string, Set<string>>;\n}\n\n/** Slugs excluded from sitemap (redirect sources). */\nexport function getRedirectSourceSlugs(project: ScribeProject): RedirectSourceSlugs {\n const loaded = loadAllTypeRedirects(project.config);\n const aliasSlugs = collectRedirectSourceSlugs(loaded);\n const outboundByType = collectOutboundRedirectSourcesByType(loaded);\n\n for (const type of project.config.types) {\n if (!outboundByType.has(type.id)) {\n outboundByType.set(type.id, new Set());\n }\n }\n\n return {\n aliasSlugs,\n outboundByType,\n };\n}\n\nexport { listEnSlugs };\n","/** Join site origin and pathname without double slashes. */\nexport function joinBaseUrl(baseUrl: string, pathname: string): string {\n const origin = baseUrl.replace(/\\/$/, \"\");\n const path = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return `${origin}${path}`;\n}\n","import { documentLastModified, resolveCanonicalPathname } from \"../core/builtin-fields.js\";\nimport type { AllDocuments, ContentTypeConfig, ScribeConfig, ScribeDocument, ScribeProject } from \"../core/types.js\";\nimport { getRedirectSourceSlugs } from \"../redirects/build-redirects.js\";\nimport { isRoutableType } from \"../i18n/build-url.js\";\nimport { joinBaseUrl } from \"./join-base-url.js\";\nimport type { GenerateSitemapOptions, SitemapEntry } from \"./types.js\";\n\nfunction shouldIncludeEnDoc(\n enDoc: ScribeDocument,\n enSlug: string,\n redirectSources: ReturnType<typeof getRedirectSourceSlugs>,\n contentTypeId: string,\n excludeNoindex: boolean,\n): boolean {\n if (redirectSources.aliasSlugs.has(enSlug)) return false;\n const outbound = redirectSources.outboundByType.get(contentTypeId);\n if (outbound?.has(enSlug)) return false;\n if (excludeNoindex && enDoc.noindex) return false;\n return true;\n}\n\ntype ResolvedSitemapOptions = GenerateSitemapOptions & {\n resolveUrl: (locale: string, pathname: string) => string | Promise<string>;\n};\n\nfunction resolveSitemapOptions(options: GenerateSitemapOptions): ResolvedSitemapOptions {\n return {\n ...options,\n resolveUrl:\n options.resolveUrl ??\n ((_locale, pathname) => joinBaseUrl(options.baseUrl, pathname)),\n };\n}\n\nasync function buildClusterEntry(\n type: ContentTypeConfig,\n enSlug: string,\n enDoc: ScribeDocument,\n allDocs: AllDocuments,\n config: ScribeConfig,\n options: ResolvedSitemapOptions,\n): Promise<SitemapEntry | null> {\n const { defaultLocale, locales } = config;\n const excludeNoindex = options.excludeNoindex !== false;\n const includeXDefault = options.includeXDefault !== false;\n const typeDefaults = options.typeDefaults?.[type.id];\n\n const pathnameFor = (doc: ScribeDocument): string =>\n options.resolvePathname?.(type, doc, defaultLocale) ??\n resolveCanonicalPathname(type, doc, defaultLocale);\n\n const alternates: Record<string, string> = {};\n\n for (const locale of locales) {\n const idx = allDocs.get(locale);\n if (!idx) continue;\n\n const doc =\n locale === defaultLocale\n ? idx.bySlug.get(enSlug)\n : idx.byEnSlug.get(enSlug);\n\n if (!doc) continue;\n if (excludeNoindex && doc.noindex) continue;\n\n const pathname = pathnameFor(doc);\n alternates[locale] = await options.resolveUrl(locale, pathname);\n }\n\n if (Object.keys(alternates).length === 0) return null;\n\n const mainUrl =\n alternates[defaultLocale] ?? alternates[Object.keys(alternates)[0]!]!;\n\n if (includeXDefault && alternates[defaultLocale]) {\n alternates[\"x-default\"] = alternates[defaultLocale];\n }\n\n const lastModified = documentLastModified(enDoc);\n\n return {\n url: mainUrl,\n ...(lastModified ? { lastModified } : {}),\n ...(typeDefaults?.changeFrequency\n ? { changeFrequency: typeDefaults.changeFrequency }\n : {}),\n ...(typeDefaults?.priority !== undefined ? { priority: typeDefaults.priority } : {}),\n alternates: { languages: alternates },\n };\n}\n\n/** Build sitemap entries with hreflang alternates for routable content types. */\nexport async function generateSitemap(\n project: ScribeProject,\n options: GenerateSitemapOptions,\n): Promise<SitemapEntry[]> {\n const resolvedOptions = resolveSitemapOptions(options);\n const { config } = project;\n const redirectSources = getRedirectSourceSlugs(project);\n const excludeNoindex = options.excludeNoindex !== false;\n\n const typeIds =\n options.contentTypes ??\n config.types.filter(isRoutableType).map((t) => t.id);\n\n const entries: SitemapEntry[] = [];\n\n for (const typeId of typeIds) {\n const runtime = project.getType(typeId);\n const type = runtime.config;\n if (!isRoutableType(type)) continue;\n\n const allDocs = runtime.load();\n const enIndex = allDocs.get(config.defaultLocale);\n if (!enIndex) continue;\n\n const processed = new Set<string>();\n\n for (const [enSlug, enDoc] of enIndex.bySlug) {\n if (processed.has(enSlug)) continue;\n processed.add(enSlug);\n\n if (\n !shouldIncludeEnDoc(enDoc, enSlug, redirectSources, typeId, excludeNoindex)\n ) {\n continue;\n }\n\n const entry = await buildClusterEntry(\n type,\n enSlug,\n enDoc,\n allDocs,\n config,\n resolvedOptions,\n );\n if (entry) entries.push(entry);\n }\n }\n\n return entries;\n}\n","import type {\n AssetUrlOptions,\n ContentTypeInput,\n ContentTypeRuntime,\n Scribe,\n ScribeConfigInput,\n} from \"./core/types.js\";\nimport { resolveConfig } from \"./config/resolve-config.js\";\nimport { createProject } from \"./create-project.js\";\nimport { joinPublicPath } from \"./loader/resolve-assets.js\";\nimport { generateSitemap } from \"./sitemap/generate-sitemap.js\";\nimport type { GenerateSitemapOptions } from \"./sitemap/types.js\";\n\n/**\n * Create the typed Scribe client. Each content type id becomes a typed\n * accessor (`scribe.blog.list()`, `scribe.blog.related(doc, \"author\")`, …),\n * plus `scribe.sitemap()`.\n *\n * Pass the object returned by `defineConfig()`; defaults and path resolution\n * are applied here.\n */\nexport function createScribe<const TTypes extends readonly ContentTypeInput<any>[]>(\n input: ScribeConfigInput<TTypes>,\n): Scribe<TTypes> {\n const config = resolveConfig(input);\n const project = createProject(config, {\n resolveAssets: true,\n resolveInlineTokens: true,\n inlineLinkStyle: \"app\",\n });\n const scribe = {\n config,\n project,\n getType: project.getType,\n listTypes: project.listTypes,\n listRoutableTypes: project.listRoutableTypes,\n sitemap(options: GenerateSitemapOptions) {\n return generateSitemap(project, options);\n },\n assets: {\n url(ref: string, opts?: AssetUrlOptions) {\n if (opts && Object.keys(opts).length > 0) {\n throw new Error(\n `scribe.assets.url: options are reserved for a future pipeline; got ${Object.keys(opts).join(\", \")}`,\n );\n }\n const assetsConfig = config.assets;\n return assetsConfig ? joinPublicPath(assetsConfig.publicPath, ref) : ref;\n },\n },\n } as unknown as Scribe<TTypes>;\n\n for (const type of config.types) {\n (scribe as unknown as Record<string, ContentTypeRuntime>)[type.id] =\n project.getType(type.id);\n }\n\n return scribe;\n}\n"]}