scribe-cms 0.0.2 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/bin/scribe.js +2 -11
- package/dist/cli/index.cjs +1437 -225
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +1437 -226
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/prompt-translate.d.ts +16 -0
- package/dist/cli/prompt-translate.d.ts.map +1 -0
- package/dist/cli/translate-progress.d.ts +11 -0
- package/dist/cli/translate-progress.d.ts.map +1 -0
- package/dist/index.cjs +591 -147
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +587 -148
- package/dist/index.js.map +1 -1
- package/dist/runtime.cjs +14 -2
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.js +14 -2
- package/dist/runtime.js.map +1 -1
- package/dist/src/config/resolve-config.d.ts.map +1 -1
- package/dist/src/core/field.d.ts +2 -0
- package/dist/src/core/field.d.ts.map +1 -1
- package/dist/src/core/types.d.ts +5 -1
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/export/build-static-raw-exports.d.ts +37 -0
- package/dist/src/export/build-static-raw-exports.d.ts.map +1 -0
- package/dist/src/export/write-static-raw-exports.d.ts +12 -0
- package/dist/src/export/write-static-raw-exports.d.ts.map +1 -0
- package/dist/src/history/record-revision.d.ts +2 -0
- package/dist/src/history/record-revision.d.ts.map +1 -1
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/storage/sqlite.d.ts.map +1 -1
- package/dist/src/storage/translations.d.ts +6 -0
- package/dist/src/storage/translations.d.ts.map +1 -1
- package/dist/src/translate/gemini-client.d.ts +7 -0
- package/dist/src/translate/gemini-client.d.ts.map +1 -1
- package/dist/src/translate/gemini-models.d.ts +8 -0
- package/dist/src/translate/gemini-models.d.ts.map +1 -0
- package/dist/src/translate/gemini-pricing.d.ts +11 -0
- package/dist/src/translate/gemini-pricing.d.ts.map +1 -0
- package/dist/src/translate/page-translator.d.ts +38 -1
- package/dist/src/translate/page-translator.d.ts.map +1 -1
- package/dist/src/translate/prompts/translation-prompt.d.ts +1 -2
- package/dist/src/translate/prompts/translation-prompt.d.ts.map +1 -1
- package/dist/src/translate/response-schema.d.ts +7 -0
- package/dist/src/translate/response-schema.d.ts.map +1 -0
- package/dist/src/translate/validate-translation.d.ts +14 -0
- package/dist/src/translate/validate-translation.d.ts.map +1 -0
- package/dist/src/translate/worklist.d.ts +3 -0
- package/dist/src/translate/worklist.d.ts.map +1 -1
- package/dist/src/validate/validate-assets.d.ts +20 -0
- package/dist/src/validate/validate-assets.d.ts.map +1 -0
- package/dist/src/validate/validate-project.d.ts +1 -1
- package/dist/src/validate/validate-project.d.ts.map +1 -1
- package/dist/src/version.d.ts +4 -0
- package/dist/src/version.d.ts.map +1 -0
- package/dist/studio/server.cjs +611 -194
- package/dist/studio/server.cjs.map +1 -1
- package/dist/studio/server.d.ts +1 -1
- package/dist/studio/server.d.ts.map +1 -1
- package/dist/studio/server.js +611 -194
- package/dist/studio/server.js.map +1 -1
- package/package.json +16 -5
- package/bin/ensure-built.mjs +0 -31
package/dist/cli/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../node_modules/tsup/assets/cjs_shims.js","../../src/storage/sqlite.ts","../../cli/index.ts","../../src/index.ts","../../src/core/field.ts","../../src/core/types.ts","../../src/create-scribe.ts","../../src/config/resolve-config.ts","../../src/i18n/build-url.ts","../../src/create-project.ts","../../src/core/introspect-schema.ts","../../src/loader/create-loader.ts","../../src/core/builtin-fields.ts","../../src/storage/translations.ts","../../src/loader/normalize-en.ts","../../src/i18n/resolve-document.ts","../../src/sitemap/generate-sitemap.ts","../../src/redirects/build-redirects.ts","../../src/core/slug-aliases.ts","../../src/core/alias-helpers.ts","../../src/redirects/translation-index.ts","../../src/i18n/translation-index.ts","../../src/sitemap/join-base-url.ts","../../src/config/load-config.ts","../../src/validate/validate-project.ts","../../src/hash/page-hash.ts","../../src/history/record-revision.ts","../../src/validate/validate-relations.ts","../../src/validate/validate-slug-suffix.ts","../../src/translate/worklist.ts","../../src/translate/page-translator.ts","../../src/translate/gemini-client.ts","../../src/translate/prompts/translation-prompt.ts","../../src/translate/resolve-translate-config.ts","../../src/config/load-env.ts","../../studio/server.ts"],"names":["fs","path","Database","z","matter","document","jiti","createJiti","createHash","getAtPath","listEnSlugs","GoogleGenAI","dotenv","Hono","serve","openStore"],"mappings":"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","file":"index.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\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 = 2;\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 revisions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n locale TEXT,\n revision_kind TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n body_hash TEXT NOT NULL,\n created_at TEXT NOT NULL,\n model TEXT,\n body_preview TEXT\n )`,\n `CREATE INDEX IF NOT EXISTS idx_revisions_lookup\n ON revisions(content_type, en_slug, locale, created_at DESC)`,\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];\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 fs.mkdirSync(path.dirname(storePath), { recursive: true });\n const db = new Database(storePath, { readonly: mode === \"readonly\" });\n if (mode === \"readwrite\") {\n migrate(db);\n }\n return db;\n}\n\nfunction migrate(db: Database.Database): void {\n for (const sql of MIGRATIONS) {\n db.exec(sql);\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","#!/usr/bin/env node\nimport { createProject, loadConfigSync, translateWorklist, validateProject } from \"../src/index.js\";\nimport { listRevisions } from \"../src/storage/translations.js\";\nimport { loadEnvFromCwd } from \"../src/config/load-env.js\";\nimport { buildWorklist, resolveLocalesFromPreset } from \"../src/translate/worklist.js\";\nimport { startStudio } from \"../studio/server.js\";\n\ninterface CliOptions {\n config?: string;\n cwd: string;\n locale?: string[];\n preset?: string;\n type?: string;\n slug?: string;\n model?: string;\n dryRun?: boolean;\n force?: boolean;\n port?: number;\n}\n\nfunction parseArgs(argv: string[]): { command: string; options: CliOptions; rest: string[] } {\n const options: CliOptions = { cwd: process.cwd() };\n const positional: string[] = [];\n let i = 0;\n while (i < argv.length) {\n const arg = argv[i]!;\n if (arg === \"--config\") {\n options.config = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--locale\") {\n const locales: string[] = [];\n while (argv[i + 1] && !argv[i + 1]!.startsWith(\"--\")) {\n locales.push(argv[++i]!);\n }\n options.locale = locales;\n i++;\n continue;\n }\n if (arg === \"--preset\") {\n options.preset = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--type\") {\n options.type = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--slug\") {\n options.slug = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--model\") {\n options.model = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--port\") {\n options.port = Number(argv[++i]);\n i++;\n continue;\n }\n if (arg === \"--dry-run\") {\n options.dryRun = true;\n i++;\n continue;\n }\n if (arg === \"--force\") {\n options.force = true;\n i++;\n continue;\n }\n if (arg.startsWith(\"--\")) {\n throw new Error(`Unknown flag: ${arg}`);\n }\n positional.push(arg);\n i++;\n }\n const [command = \"help\", ...rest] = positional;\n return { command, options, rest };\n}\n\nfunction loadProject(options: CliOptions) {\n const config = loadConfigSync({\n cwd: options.cwd,\n configPath: options.config,\n });\n return createProject(config);\n}\n\nasync function main(): Promise<void> {\n const { command, options, rest } = parseArgs(process.argv.slice(2));\n loadEnvFromCwd(options.cwd);\n\n if (command === \"help\" || command === \"--help\") {\n console.log(`Usage: scribe <command>\n\nCommands:\n status Show EN docs + translation counts\n validate Validate EN files and sqlite consistency\n translate Translate stale/missing locale pages\n history <type> <slug> Show revision timeline\n studio Start read-only local studio\n`);\n return;\n }\n\n const project = loadProject(options);\n const config = project.config;\n\n switch (command) {\n case \"status\": {\n for (const type of project.listTypes()) {\n const enCount = type.list().length;\n console.log(`${type.id}: ${enCount} EN docs`);\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const count = type.load().get(locale)?.bySlug.size ?? 0;\n console.log(` ${locale}: ${count}`);\n }\n }\n console.log(`store: ${project.storePath}`);\n break;\n }\n case \"validate\": {\n const result = validateProject(config);\n for (const issue of result.issues) {\n console.log(\n `[${issue.level}] ${issue.contentType ?? \"\"} ${issue.enSlug ?? \"\"} ${issue.locale ?? \"\"} ${issue.message}`,\n );\n }\n if (!result.ok) process.exitCode = 1;\n break;\n }\n case \"translate\": {\n const locales = resolveLocalesFromPreset(config, options.preset, options.locale);\n const worklist = buildWorklist(config, {\n contentType: options.type,\n locales,\n enSlug: options.slug,\n });\n console.log(`Translating ${worklist.length} page(s)...`);\n const results = await translateWorklist(config, worklist, {\n model: options.model,\n dryRun: options.dryRun,\n force: options.force,\n });\n for (const result of results) {\n console.log(\n `${result.contentType}/${result.enSlug}@${result.locale}: ${result.skipped ? \"skipped\" : \"translated\"}${result.model ? ` (${result.model})` : \"\"}`,\n );\n }\n break;\n }\n case \"history\": {\n const [typeId, enSlug, locale] = rest;\n if (!typeId || !enSlug) {\n throw new Error(\"Usage: scribe history <type> <en-slug> [locale]\");\n }\n const { openStore } = await import(\"../src/storage/sqlite.js\");\n const db = openStore(config, \"readonly\");\n const rows = listRevisions(db, typeId, enSlug, locale);\n db.close();\n for (const row of rows) {\n console.log(\n `${row.created_at} ${row.revision_kind} locale=${row.locale ?? \"en\"} en_hash=${row.en_hash.slice(0, 8)} body_hash=${row.body_hash.slice(0, 8)}`,\n );\n }\n break;\n }\n case \"studio\": {\n await startStudio(project, { port: options.port ?? 3600 });\n break;\n }\n default:\n throw new Error(`Unknown command: ${command}`);\n }\n}\n\nmain().catch((error) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n});\n","export { field, getRelationTarget, getFieldKind, unwrapSchema } from \"./core/field.js\";\nexport type {\n RelationBrand,\n RelationField,\n RelationFieldOptions,\n RelationMeta,\n} from \"./core/field.js\";\nexport { defineConfig, defineContentType } from \"./core/types.js\";\nexport type {\n ScribeConfigInput,\n ScribeConfig,\n ScribeProject,\n ScribeDocument,\n ContentTypeInput,\n ContentTypeConfig,\n ContentTypeRuntime,\n ListOptions,\n OrderBy,\n StaticParam,\n LocaleIndex,\n AllDocuments,\n ResolvedDocument,\n CrossValidateContext,\n CrossValidateIssue,\n TranslateConfig,\n ScribeTranslateDefaults,\n LocalePresets,\n SlugStrategy,\n IndexFallback,\n Scribe,\n InferDocMap,\n InferDocFromTypeConfig,\n RelationFieldsOf,\n RelatedMapFor,\n ScribeClient,\n ScribeDocs,\n ScribeDocOf,\n} from \"./core/types.js\";\nexport { createScribe } from \"./create-scribe.js\";\nexport { createProject } from \"./create-project.js\";\nexport { resolveConfig, isResolvedConfig } from \"./config/resolve-config.js\";\nexport { loadConfigSync, findConfigPath } from \"./config/load-config.js\";\nexport { validateProject } from \"./validate/validate-project.js\";\nexport type { ValidateIssue, ValidateResult } from \"./validate/validate-project.js\";\nexport {\n buildAllContentRedirects,\n getRedirectSourceSlugs,\n} from \"./redirects/build-redirects.js\";\nexport type { NextRedirectRule } from \"./redirects/types.js\";\nexport type { RedirectSourceSlugs } from \"./redirects/build-redirects.js\";\nexport { buildWorklist, resolveLocalesFromPreset } from \"./translate/worklist.js\";\nexport { translatePage, translateWorklist } from \"./translate/page-translator.js\";\nexport { generateSitemap } from \"./sitemap/generate-sitemap.js\";\nexport type {\n GenerateSitemapOptions,\n SitemapAlternateLanguages,\n SitemapChangeFrequency,\n SitemapEntry,\n SitemapTypeDefaults,\n} from \"./sitemap/types.js\";\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","import type { z } from \"zod\";\nimport type { RELATION_BRAND, RelationBrand } from \"./field.js\";\n\n/**\n * How document slugs behave across locales.\n * - `\"fixed\"` — the EN slug is used for every locale.\n * - `\"localized\"` — each locale gets its own translated slug.\n */\nexport type SlugStrategy = \"localized\" | \"fixed\";\n\n/**\n * What `resolve()` returns when a locale has no translation for a slug.\n * - `\"en\"` — fall back to the default-locale document.\n * - `\"none\"` — return no document.\n */\nexport type IndexFallback = \"en\" | \"none\";\n\n/** Sort order for `list()`. Built-in keys sort by document metadata; pass a comparator for anything else. */\nexport type OrderBy<TDoc = ScribeDocument> =\n | \"slug\"\n | \"publishedAt\"\n | \"-publishedAt\"\n | \"updatedAt\"\n | \"-updatedAt\"\n | ((a: TDoc, b: TDoc) => number);\n\nexport interface CrossValidateContext {\n locale: string;\n defaultLocale: string;\n slug: string;\n enSlug: string;\n knownLocales: readonly string[];\n englishSlugs?: ReadonlySet<string>;\n}\n\nexport interface CrossValidateIssue {\n field: string;\n message: string;\n level: \"error\" | \"warning\";\n}\n\n/** Named locale groups usable with `scribe translate --preset <name>`. */\nexport interface LocalePresets {\n active?: string[];\n ultraLight?: string[];\n [name: string]: string[] | undefined;\n}\n\n/** Per-content-type translation settings (merged over the project-level defaults). */\nexport interface TranslateConfig {\n /** Replace the default system prompt entirely. */\n prompt?: string;\n /** Brand/domain context prepended to every translation request. */\n context?: string;\n /** Extra rules appended to the default rules. */\n rules?: string[];\n /** Model override for this content type. */\n model?: string;\n}\n\n/** Project-level translation defaults. */\nexport interface ScribeTranslateDefaults {\n defaultModel?: string;\n prompt?: string;\n context?: string;\n rules?: string[];\n /** Lowercase terms preserved verbatim in localized slugs */\n slugPreserveTerms?: string[];\n}\n\n/**\n * A content type declaration as written in `scribe.config.ts`.\n * Most fields are optional with sensible defaults — see each field's doc.\n */\nexport interface ContentTypeInput<TSchema extends z.ZodTypeAny = z.ZodTypeAny> {\n /** Unique id. Becomes the typed accessor (`scribe.<id>`) and the default `contentDir`. */\n id: string;\n /** Zod schema for the EN frontmatter. Mark fields with `field.translatable()/structural()/relation()`. */\n schema: TSchema;\n /** Directory under the project content dir holding this type's `.mdx` files. Default: the type `id`. */\n contentDir?: string;\n /** URL template for routable types, e.g. `/blog/{slug}`. Must contain exactly one `{slug}`. Omit for reference-only types. */\n path?: string;\n /** Human label (studio UI). Default: capitalized `id`. */\n label?: string;\n /** Default: `\"fixed\"`. */\n slugStrategy?: SlugStrategy;\n /** Default: `\"en\"` when the type has a `path`, otherwise `\"none\"`. */\n indexFallback?: IndexFallback;\n /** Default sort for `list()`. Default: `\"slug\"`. */\n orderBy?: OrderBy<ScribeDocument<z.infer<TSchema>>>;\n /** Custom validation across fields, run by `scribe validate`. */\n crossValidate?: (\n data: z.infer<TSchema>,\n ctx: CrossValidateContext,\n ) => CrossValidateIssue[];\n translate?: TranslateConfig;\n}\n\n/** A content type with all defaults applied (what runtimes and the CLI consume). */\nexport interface ContentTypeConfig<TSchema extends z.ZodTypeAny = z.ZodTypeAny>\n extends ContentTypeInput<TSchema> {\n contentDir: string;\n label: string;\n slugStrategy: SlugStrategy;\n indexFallback: IndexFallback;\n}\n\n/**\n * The shape accepted by `defineConfig()` / `createScribe()`.\n * Relative paths (`contentDir`, `store`) resolve against `rootDir`.\n */\nexport interface ScribeConfigInput<\n TTypes extends readonly ContentTypeInput<any>[] = readonly ContentTypeInput[],\n> {\n /** Absolute project root (the directory holding `scribe.config.ts`). */\n rootDir: string;\n /** Directory containing the per-type content folders. Default: `\"content\"`. */\n contentDir?: string;\n /** Path to the SQLite translation store. Default: `\".scribe/store.sqlite\"`. */\n store?: string;\n /** All locales, including the default one. */\n locales: string[];\n /** Canonical source locale. Must be in `locales`. Default: `\"en\"`. */\n defaultLocale?: string;\n localePresets?: LocalePresets;\n translate?: ScribeTranslateDefaults;\n types: TTypes;\n}\n\n/**\n * A fully resolved Scribe config (all defaults applied, paths absolute).\n * Note: `rootDir` here is the absolute **content** root, not the project root.\n */\nexport interface ScribeConfig {\n /** Absolute content root (project `rootDir` + `contentDir`). */\n rootDir: string;\n /** Absolute path to the SQLite translation store. */\n storePath: string;\n locales: string[];\n defaultLocale: string;\n localePresets?: LocalePresets;\n translate?: ScribeTranslateDefaults;\n types: ContentTypeConfig[];\n}\n\n/** A loaded document (EN file or stored translation). */\nexport interface ScribeDocument<TFrontmatter = Record<string, unknown>> {\n /** Slug in this document's locale (differs from `enSlug` for localized slugs). */\n slug: string;\n /** Slug of the EN (default-locale) parent. Equal to `slug` for EN documents. */\n enSlug: string;\n locale: string;\n /** Inbound slug aliases (EN canonical docs only). */\n aliases: string[];\n /** Outbound retirement redirect, e.g. `/blog/successor-slug`. */\n redirectTo?: string;\n publishedAt?: string;\n updatedAt?: string;\n noindex: boolean;\n /** Explicit EN frontmatter override for canonical URL path. */\n canonicalPathOverride?: string;\n frontmatter: TFrontmatter;\n content: string;\n filePath?: string;\n}\n\nexport interface LocaleIndex<TDoc = ScribeDocument> {\n bySlug: ReadonlyMap<string, TDoc>;\n byEnSlug: ReadonlyMap<string, TDoc>;\n}\n\nexport type AllDocuments<TDoc = ScribeDocument> = ReadonlyMap<string, LocaleIndex<TDoc>>;\n\n/** Result of `resolve()`: the document plus redirect/canonical routing data. */\nexport interface ResolvedDocument<TDoc = ScribeDocument> {\n document: TDoc | null;\n /** Locale actually served (differs from the requested locale on EN fallback). */\n actualLocale: string;\n /** 301 target when the slug is an alias or belongs to another locale. */\n shouldRedirectTo?: string;\n /** Locale-aware pathname when the type has `path` and a document was found. */\n canonicalPath?: string;\n}\n\n/** `{ locale, slug }` pairs for Next.js `generateStaticParams()`. */\nexport interface StaticParam {\n locale: string;\n slug: string;\n}\n\nexport interface ListOptions<TDoc = ScribeDocument> {\n /** Override the type's configured `orderBy` for this call. */\n orderBy?: OrderBy<TDoc>;\n limit?: number;\n}\n\n/** Untyped default for the `related()` field map. */\nexport type AnyRelatedMap = Record<string, ScribeDocument | ScribeDocument[] | null>;\n\n/**\n * Per-content-type runtime API.\n *\n * Reads: `list`, `get`, `resolve`. Routing: `staticParams`, `alternates`,\n * `translation`, `url`. Relations: `related`. Low-level escape hatch: `load`.\n */\nexport interface ContentTypeRuntime<\n TDoc extends ScribeDocument = ScribeDocument,\n TRelated extends Record<string, unknown> = AnyRelatedMap,\n> {\n id: string;\n config: ContentTypeConfig;\n\n /** All documents for a locale (default: the default locale), sorted by the type's `orderBy`. */\n list: (locale?: string, options?: ListOptions<TDoc>) => TDoc[];\n /** Exact slug lookup in one locale (default: the default locale). No fallback, no redirects. */\n get: (slug: string, locale?: string) => TDoc | null;\n /** Full resolution: aliases, cross-locale slug correction, EN fallback, redirects, canonical path. */\n resolve: (slug: string, locale: string) => ResolvedDocument<TDoc>;\n\n /** Every `{ locale, slug }` pair to prerender — one call in `generateStaticParams()`. */\n staticParams: (options?: { locales?: readonly string[] }) => StaticParam[];\n /** hreflang map: locale → relative path, for every locale with a translation (default locale always included). */\n alternates: (doc: TDoc) => Record<string, string>;\n /** The same document in another locale, or null when untranslated (callers typically do `?? doc`). */\n translation: (doc: TDoc, targetLocale: string) => TDoc | null;\n /** Pathname for a slug + locale from the type's `path` template. */\n url: (slug: string, locale: string) => string;\n\n /** Dereference a `field.relation()` frontmatter field into the target type's document(s). */\n related: <K extends keyof TRelated & string>(\n doc: TDoc,\n field: K,\n locale?: string,\n ) => TRelated[K];\n\n /** Low-level access to the full locale → index map. Prefer `list`/`get`/`resolve`. */\n load: () => AllDocuments<TDoc>;\n}\n\n/** Infer the document type from a content type declaration. */\nexport type InferDocFromTypeConfig<T extends ContentTypeInput<any>> = ScribeDocument<\n z.infer<T[\"schema\"]>\n>;\n\n/** Map content type id → document type from a config types tuple. */\nexport type InferDocMap<TTypes extends readonly ContentTypeInput<any>[]> = {\n [T in TTypes[number] as T[\"id\"]]: InferDocFromTypeConfig<T>;\n};\n\n/** Document map (id → ScribeDocument) from a config object type. */\nexport type ScribeDocs<C extends { types: readonly ContentTypeInput<any>[] }> = InferDocMap<\n C[\"types\"]\n>;\n\n/** Single doc type by content-type id. */\nexport type ScribeDocOf<\n C extends { types: readonly ContentTypeInput<any>[] },\n Id extends keyof ScribeDocs<C> & string,\n> = ScribeDocs<C>[Id];\n\ntype RelationBrandOf<TField> = TField extends {\n [RELATION_BRAND]: infer B extends RelationBrand<string, boolean, boolean>;\n}\n ? B\n : never;\n\n/** Top-level `field.relation()` fields of a schema, keyed by field name. */\nexport type RelationFieldsOf<TSchema extends z.ZodTypeAny> =\n TSchema extends z.ZodObject<infer Shape>\n ? {\n [K in keyof Shape as [RelationBrandOf<Shape[K]>] extends [never]\n ? never\n : K]: RelationBrandOf<Shape[K]>;\n }\n : {};\n\ntype RelatedDoc<B, TDocMap> = B extends RelationBrand<\n infer TTarget,\n infer TMultiple,\n infer TOptional\n>\n ? TTarget extends keyof TDocMap\n ? TMultiple extends true\n ? Array<TDocMap[TTarget]>\n : TOptional extends true\n ? TDocMap[TTarget] | null\n : TDocMap[TTarget]\n : never\n : never;\n\n/** `related()` return types for a content type, derived from its schema's relation fields. */\nexport type RelatedMapFor<\n T extends ContentTypeInput<any>,\n TTypes extends readonly ContentTypeInput<any>[],\n> = {\n [K in keyof RelationFieldsOf<T[\"schema\"]> & string]: RelatedDoc<\n RelationFieldsOf<T[\"schema\"]>[K],\n InferDocMap<TTypes>\n >;\n};\n\n/**\n * The typed Scribe client returned by `createScribe()`.\n * Each content type id becomes a typed accessor: `scribe.blog.list()`, `scribe.blog.related(doc, \"author\")`, …\n */\nexport type Scribe<TTypes extends readonly ContentTypeInput<any>[]> = {\n readonly [T in TTypes[number] as T[\"id\"]]: ContentTypeRuntime<\n InferDocFromTypeConfig<T>,\n RelatedMapFor<T, TTypes>\n >;\n} & {\n /** Sitemap entries (with hreflang alternates) for all routable types. */\n sitemap(\n options: import(\"../sitemap/types.js\").GenerateSitemapOptions,\n ): Promise<import(\"../sitemap/types.js\").SitemapEntry[]>;\n /** The resolved config (defaults applied, paths absolute). */\n config: ScribeConfig;\n project: ScribeProject;\n getType: ScribeProject[\"getType\"];\n listTypes: ScribeProject[\"listTypes\"];\n};\n\n/** Typed client type from a config object type (for app-side type aliases). */\nexport type ScribeClient<C extends { types: readonly ContentTypeInput<any>[] }> = Scribe<\n C[\"types\"]\n>;\n\n/** Untyped project engine (CLI, validation, studio). Prefer `createScribe()` in apps. */\nexport interface ScribeProject {\n config: ScribeConfig;\n rootDir: string;\n storePath: string;\n getType: (id: string) => ContentTypeRuntime;\n listTypes: () => ContentTypeRuntime[];\n}\n\n/** Identity helper that preserves content-type id and schema inference. */\nexport function defineConfig<const TTypes extends readonly ContentTypeInput<any>[]>(\n config: ScribeConfigInput<TTypes>,\n): ScribeConfigInput<TTypes> {\n return config;\n}\n\n/** Identity helper for a single content type entry. */\nexport function defineContentType<\n const TId extends string,\n TSchema extends z.ZodTypeAny,\n>(\n config: ContentTypeInput<TSchema> & { id: TId },\n): ContentTypeInput<TSchema> & { id: TId } {\n return config;\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 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","import path from \"node:path\";\nimport type {\n ContentTypeConfig,\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 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 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 locales: [...raw.locales],\n defaultLocale,\n localePresets: raw.localePresets,\n translate: raw.translate,\n types,\n };\n Object.defineProperty(config, RESOLVED, {\n value: true,\n enumerable: false,\n });\n return config;\n}\n","import type { ContentTypeConfig } 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\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): string {\n const relative = template.replace(SLUG_PLACEHOLDER, slug);\n if (locale === defaultLocale) return relative;\n return `/${locale}${relative}`;\n}\n\n/** Extract slug from a resolved path that matches the template. */\nexport function extractSlugFromResolvedPath(template: string, resolvedPath: string): string | null {\n const prefix = pathPrefix(template);\n const suffix = pathSuffix(template);\n if (!resolvedPath.startsWith(prefix)) return null;\n if (suffix && !resolvedPath.endsWith(suffix)) return null;\n const slugEnd = suffix ? resolvedPath.length - suffix.length : resolvedPath.length;\n const slug = resolvedPath.slice(prefix.length, slugEnd);\n return slug.length > 0 ? 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 { resolvePath } 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 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(slug, locale, config.defaultLocale, load(), type);\n if (result.document && type.path) {\n return {\n ...result,\n canonicalPath: resolvePath(\n type.path,\n result.document.slug,\n result.actualLocale,\n config.defaultLocale,\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 for (const doc of enIdx.bySlug.values()) {\n const slug =\n locale === config.defaultLocale\n ? doc.slug\n : (localeIdx?.byEnSlug.get(doc.slug)?.slug ?? doc.slug);\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]: resolvePath(\n pathTemplate,\n doc.enSlug,\n config.defaultLocale,\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] = resolvePath(pathTemplate, translated.slug, locale, config.defaultLocale);\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 resolvePath(pathTemplate, slug, locale, config.defaultLocale);\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 };\n}\n","import type { z } from \"zod\";\nimport { getFieldKind, getRelationTarget, unwrapSchema } 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\n/** List schema fields with translatable/structural/relation metadata. */\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 const base = unwrapSchema(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 if (base instanceof Object && \"element\" in base) {\n const element = (base as z.ZodArray<z.ZodTypeAny>).element;\n const elementBase = unwrapSchema(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\nexport function extractByPaths(\n data: Record<string, unknown>,\n paths: string[][],\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const path of paths) {\n const value = getAtPath(data, path);\n if (value !== undefined) {\n setAtPath(out, path.filter((p) => p !== \"*\"), value);\n }\n }\n return out;\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 getAtPath(obj: Record<string, unknown>, path: string[]): unknown {\n let current: unknown = obj;\n for (const segment of path) {\n if (segment === \"*\") {\n if (!Array.isArray(current)) return undefined;\n return current.map((item) =>\n typeof item === \"object\" && item !== null\n ? getAtPath(item as Record<string, unknown>, path.slice(path.indexOf(\"*\") + 1))\n : undefined,\n );\n }\n if (typeof current !== \"object\" || current === null || Array.isArray(current)) return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nfunction setAtPath(obj: Record<string, unknown>, path: string[], value: unknown): void {\n if (path.length === 0) return;\n if (path.length === 1) {\n obj[path[0]!] = value;\n return;\n }\n const [head, ...rest] = path;\n if (!(head! in obj) || typeof obj[head!] !== \"object\" || obj[head!] === null) {\n obj[head!] = {};\n }\n setAtPath(obj[head!] as Record<string, unknown>, rest, value);\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 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 { 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 );\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 aliases: builtin.aliases,\n redirectTo: builtin.redirectTo,\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): 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 enDoc.locale,\n );\n\n return {\n slug: row.slug,\n enSlug: row.en_slug,\n locale: row.locale,\n aliases: [],\n redirectTo: seo.redirectTo,\n publishedAt: seo.publishedAt,\n updatedAt: seo.updatedAt,\n noindex: seo.noindex,\n canonicalPathOverride: seo.canonicalPathOverride,\n frontmatter,\n content: row.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);\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 { z } from \"zod\";\nimport { extractSlugFromResolvedPath, pathPrefix, pathSuffix, resolvePath } from \"../i18n/build-url.js\";\nimport type { ContentTypeConfig, 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 aliases: string[];\n redirectTo?: string;\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\n/** Extract built-in EN frontmatter (aliases, 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 const aliasesResult = z.array(slugPatternSchema).max(20).optional().default([]).safeParse(rest.aliases ?? []);\n delete rest.aliases;\n\n const redirectRaw = rest.redirect_to;\n delete rest.redirect_to;\n\n let redirectTo: string | undefined;\n if (redirectRaw !== undefined && redirectRaw !== null && redirectRaw !== \"\") {\n if (typeof redirectRaw !== \"string\") {\n issues.push({\n field: \"redirect_to\",\n message: \"redirect_to must be a string path\",\n level: \"error\",\n });\n } else if (!pathTemplate) {\n issues.push({\n field: \"redirect_to\",\n message: \"redirect_to is not allowed on reference-only content types\",\n level: \"error\",\n });\n } else if (!extractSlugFromResolvedPath(pathTemplate, redirectRaw)) {\n issues.push({\n field: \"redirect_to\",\n message: `redirect_to must match path template \"${pathTemplate}\" (prefix \"${pathPrefix(pathTemplate)}\"${pathSuffix(pathTemplate) ? `, suffix \"${pathSuffix(pathTemplate)}\"` : \"\"})`,\n level: \"error\",\n });\n } else {\n redirectTo = redirectRaw;\n }\n }\n\n const aliases = aliasesResult.success ? aliasesResult.data : [];\n if (!aliasesResult.success) {\n for (const issue of aliasesResult.error.issues) {\n issues.push({\n field: `aliases.${issue.path.join(\".\")}`,\n message: issue.message,\n level: \"error\",\n });\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 aliases,\n redirectTo,\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): string {\n if (doc.canonicalPathOverride) {\n if (doc.locale === defaultLocale) return doc.canonicalPathOverride;\n return `/${doc.locale}${doc.canonicalPathOverride}`;\n }\n if (!type.path) return `/${doc.slug}`;\n return resolvePath(type.path, doc.slug, doc.locale, defaultLocale);\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): 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);\n return out;\n}\n\nexport function seoFieldsFromEn(enDoc: ScribeDocument): Pick<\n ScribeDocument,\n \"publishedAt\" | \"updatedAt\" | \"noindex\" | \"canonicalPathOverride\" | \"redirectTo\"\n> {\n return {\n publishedAt: enDoc.publishedAt,\n updatedAt: enDoc.updatedAt,\n noindex: enDoc.noindex,\n canonicalPathOverride: enDoc.canonicalPathOverride,\n redirectTo: enDoc.redirectTo,\n };\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}\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}\n\nexport interface RevisionInput {\n contentType: string;\n enSlug: string;\n locale: string | null;\n revisionKind: \"translation\" | \"en_edit_detected\" | \"snapshot\";\n enHash: string;\n bodyHash: string;\n createdAt: string;\n model?: string;\n bodyPreview?: string;\n}\n\nexport interface RevisionRow {\n id: number;\n content_type: string;\n en_slug: string;\n locale: string | null;\n revision_kind: string;\n en_hash: string;\n body_hash: string;\n created_at: string;\n model: string | null;\n body_preview: string | null;\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\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 ).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 );\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 appendRevision(db: Database.Database, input: RevisionInput): number {\n const result = db\n .prepare(\n `INSERT INTO revisions (\n content_type, en_slug, locale, revision_kind, en_hash, body_hash, created_at, model, body_preview\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n input.contentType,\n input.enSlug,\n input.locale,\n input.revisionKind,\n input.enHash,\n input.bodyHash,\n input.createdAt,\n input.model ?? null,\n input.bodyPreview ?? null,\n );\n return Number(result.lastInsertRowid);\n}\n\n/** List revision history for an EN slug, optionally filtered by locale. */\nexport function listRevisions(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n locale?: string,\n): RevisionRow[] {\n if (locale) {\n return db\n .prepare(\n `SELECT * FROM revisions\n WHERE content_type = ? AND en_slug = ? AND locale = ?\n ORDER BY created_at DESC, id DESC`,\n )\n .all(contentType, enSlug, locale) as RevisionRow[];\n }\n return db\n .prepare(\n `SELECT * FROM revisions\n WHERE content_type = ? AND en_slug = ?\n ORDER BY created_at DESC, id DESC`,\n )\n .all(contentType, enSlug) as RevisionRow[];\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 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","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 type { ContentTypeConfig, ScribeDocument, ResolvedDocument } from \"../core/types.js\";\nimport { extractSlugFromResolvedPath, resolvePath } from \"./build-url.js\";\n\nfunction findEnDocByAlias<TDoc extends ScribeDocument>(\n slug: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n defaultLocale: string,\n): TDoc | null {\n const enIdx = allDocs.get(defaultLocale);\n if (!enIdx) return null;\n for (const doc of enIdx.bySlug.values()) {\n if (doc.aliases.includes(slug)) return doc;\n }\n return null;\n}\n\nfunction enCanonicalDoc<TDoc extends ScribeDocument>(\n doc: TDoc,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n defaultLocale: string,\n): TDoc {\n if (doc.locale === defaultLocale) return doc;\n return (allDocs.get(defaultLocale)?.bySlug.get(doc.enSlug) as TDoc | undefined) ?? doc;\n}\n\nfunction redirectPathForDocument<TDoc extends ScribeDocument>(\n doc: TDoc,\n locale: string,\n defaultLocale: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n type: ContentTypeConfig,\n): string | undefined {\n if (!type.path) return undefined;\n const enDoc = enCanonicalDoc(doc, allDocs, defaultLocale);\n if (!enDoc.redirectTo) return undefined;\n\n const targetEnSlug = extractSlugFromResolvedPath(type.path, enDoc.redirectTo);\n if (!targetEnSlug) return undefined;\n\n const targetEnDoc = allDocs.get(defaultLocale)?.bySlug.get(targetEnSlug);\n const targetSlug = targetEnDoc\n ? (getSlugForLocale(targetEnDoc, defaultLocale, locale, allDocs, defaultLocale) ?? targetEnSlug)\n : targetEnSlug;\n\n return resolvePath(type.path, targetSlug, locale, defaultLocale);\n}\n\nfunction withRedirectTo<TDoc extends ScribeDocument>(\n result: ResolvedDocument<TDoc>,\n locale: string,\n defaultLocale: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n type: ContentTypeConfig,\n): ResolvedDocument<TDoc> {\n if (result.shouldRedirectTo || !result.document) return result;\n const redirect = redirectPathForDocument(result.document, locale, defaultLocale, allDocs, type);\n if (!redirect) return result;\n return {\n document: null,\n actualLocale: result.actualLocale,\n shouldRedirectTo: redirect,\n };\n}\n\n/** Resolve a document by slug and locale (fallback, aliases, redirects). */\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): ResolvedDocument<TDoc> {\n const idx = allDocs.get(locale);\n const direct = idx?.bySlug.get(slug);\n if (direct) {\n return withRedirectTo({ document: direct, actualLocale: locale }, locale, defaultLocale, allDocs, type);\n }\n\n const aliasDoc = findEnDocByAlias(slug, allDocs, defaultLocale);\n if (aliasDoc && type.path) {\n const canonicalSlug = aliasDoc.slug;\n const localizedSlug = getSlugForLocale(aliasDoc, defaultLocale, locale, allDocs, defaultLocale);\n const targetSlug = localizedSlug ?? canonicalSlug;\n if (targetSlug !== slug) {\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: resolvePath(type.path, targetSlug, locale, defaultLocale),\n };\n }\n }\n\n for (const [docLocale, docIdx] of allDocs) {\n const found = docIdx.bySlug.get(slug);\n if (!found) continue;\n\n const correctSlug = getSlugForLocale(found, docLocale, locale, allDocs, defaultLocale);\n if (correctSlug && correctSlug !== slug) {\n if (!type.path) {\n return { document: null, actualLocale: locale };\n }\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: resolvePath(type.path, correctSlug, locale, defaultLocale),\n };\n }\n\n if (docLocale === defaultLocale) {\n return withRedirectTo(\n { document: found as TDoc, actualLocale: defaultLocale },\n locale,\n defaultLocale,\n allDocs,\n type,\n );\n }\n\n if (!type.path) {\n return { document: null, actualLocale: locale };\n }\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: resolvePath(type.path, found.enSlug, locale, defaultLocale),\n };\n }\n\n if (locale !== defaultLocale) {\n const enDoc = allDocs.get(defaultLocale)?.bySlug.get(slug);\n if (enDoc && type.indexFallback === \"en\") {\n return withRedirectTo(\n { document: enDoc as TDoc, actualLocale: defaultLocale },\n locale,\n defaultLocale,\n allDocs,\n type,\n );\n }\n const byEn = idx?.byEnSlug.get(slug);\n if (byEn) {\n return withRedirectTo(\n { document: byEn as TDoc, actualLocale: locale },\n locale,\n defaultLocale,\n allDocs,\n type,\n );\n }\n const fallback = allDocs.get(defaultLocale)?.bySlug.get(slug);\n if (fallback && type.indexFallback === \"en\") {\n return withRedirectTo(\n { document: fallback as TDoc, actualLocale: defaultLocale },\n locale,\n defaultLocale,\n allDocs,\n type,\n );\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 { 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 (enDoc.redirectTo) return false;\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 { ContentTypeConfig, ScribeProject } from \"../core/types.js\";\nimport { buildGlobalAliasIndex } from \"../core/slug-aliases.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { buildRedirectTranslationIndex } from \"./translation-index.js\";\nimport type { NextRedirectRule } from \"./types.js\";\nimport { extractSlugFromResolvedPath, isRoutableType, resolvePath } from \"../i18n/build-url.js\";\n\nexport interface BuildRedirectsOptions {\n /** Locales that use a URL prefix (excludes default locale). */\n prefixedLocales: string[];\n}\n\nfunction buildAliasRedirects(\n type: ContentTypeConfig,\n aliasIndex: ReturnType<typeof buildGlobalAliasIndex>,\n translationIndex: Map<string, Map<string, string>>,\n prefixedLocales: string[],\n defaultLocale: string,\n): NextRedirectRule[] {\n const out: NextRedirectRule[] = [];\n const { aliasToTarget } = aliasIndex;\n const pathTemplate = type.path!;\n\n for (const [alias, target] of aliasToTarget) {\n if (target.contentTypeId !== type.id) continue;\n\n const canonical = target.canonicalSlug;\n\n out.push({\n source: resolvePath(pathTemplate, alias, defaultLocale, defaultLocale),\n destination: resolvePath(pathTemplate, canonical, defaultLocale, defaultLocale),\n permanent: true,\n });\n\n for (const locale of prefixedLocales) {\n const localeMap = translationIndex.get(locale);\n const toLocale = localeMap?.get(canonical) ?? canonical;\n const fromLocale = localeMap?.get(alias);\n\n if (fromLocale) {\n out.push({\n source: resolvePath(pathTemplate, fromLocale, locale, defaultLocale),\n destination: resolvePath(pathTemplate, toLocale, locale, defaultLocale),\n permanent: true,\n });\n }\n\n out.push({\n source: resolvePath(pathTemplate, alias, locale, defaultLocale),\n destination: resolvePath(pathTemplate, toLocale, locale, defaultLocale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildAliasLegacyNoBlogPathRedirects(\n type: ContentTypeConfig,\n aliasIndex: ReturnType<typeof buildGlobalAliasIndex>,\n translationIndex: Map<string, Map<string, string>>,\n prefixedLocales: string[],\n defaultLocale: string,\n): NextRedirectRule[] {\n if (type.id !== \"blog\") return [];\n\n const out: NextRedirectRule[] = [];\n\n for (const [alias, target] of aliasIndex.aliasToTarget) {\n if (target.contentTypeId !== type.id) continue;\n\n for (const locale of prefixedLocales) {\n const localeMap = translationIndex.get(locale);\n const toLocale = localeMap?.get(target.canonicalSlug) ?? target.canonicalSlug;\n out.push({\n source: `/${locale}/${alias}`,\n destination: resolvePath(type.path!, toLocale, locale, defaultLocale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildRedirectToRules(\n type: ContentTypeConfig,\n config: ScribeProject[\"config\"],\n translationIndex: Map<string, Map<string, string>>,\n prefixedLocales: string[],\n defaultLocale: string,\n): NextRedirectRule[] {\n const out: NextRedirectRule[] = [];\n const pathTemplate = type.path!;\n\n for (const enSlug of listEnSlugs(config.rootDir, type.contentDir)) {\n const doc = readEnDocument(config, type, enSlug);\n if (!doc?.redirectTo) continue;\n\n out.push({\n source: resolvePath(pathTemplate, enSlug, defaultLocale, defaultLocale),\n destination: doc.redirectTo,\n permanent: true,\n });\n\n for (const locale of prefixedLocales) {\n const localeMap = translationIndex.get(locale);\n const fromLocale = localeMap?.get(enSlug);\n if (!fromLocale) continue;\n\n const targetEnSlug = extractSlugFromResolvedPath(pathTemplate, doc.redirectTo);\n if (!targetEnSlug) continue;\n const toLocale = localeMap?.get(targetEnSlug) ?? targetEnSlug;\n out.push({\n source: resolvePath(pathTemplate, fromLocale, locale, defaultLocale),\n destination: resolvePath(pathTemplate, toLocale, locale, defaultLocale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildCrossLocaleSlugRedirects(\n type: ContentTypeConfig,\n translationIndex: Map<string, Map<string, string>>,\n aliasSourceSlugs: Set<string>,\n defaultLocale: string,\n): NextRedirectRule[] {\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 (aliasSourceSlugs.has(enSlug)) continue;\n out.push({\n source: resolvePath(pathTemplate, enSlug, locale, defaultLocale),\n destination: resolvePath(pathTemplate, translatedSlug, locale, defaultLocale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\n/** Legacy inbound links that omit `/blog/` (blog-only). */\nfunction buildLegacyNoBlogPathRedirects(\n type: ContentTypeConfig,\n config: ScribeProject[\"config\"],\n translationIndex: Map<string, Map<string, string>>,\n prefixedLocales: string[],\n defaultLocale: string,\n): NextRedirectRule[] {\n if (type.id !== \"blog\") return [];\n\n const out: NextRedirectRule[] = [];\n const enSlugs = listEnSlugs(config.rootDir, type.contentDir);\n const pathTemplate = type.path!;\n\n for (const enSlug of enSlugs) {\n out.push({\n source: `/${enSlug}`,\n destination: resolvePath(pathTemplate, enSlug, defaultLocale, defaultLocale),\n permanent: true,\n });\n\n for (const locale of prefixedLocales) {\n const translatedSlug = translationIndex.get(locale)?.get(enSlug);\n const canonicalSlug = translatedSlug ?? enSlug;\n out.push({\n source: `/${locale}/${enSlug}`,\n destination: resolvePath(pathTemplate, canonicalSlug, locale, defaultLocale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildTypeRedirects(\n project: ScribeProject,\n typeId: string,\n aliasIndex: ReturnType<typeof buildGlobalAliasIndex>,\n options: BuildRedirectsOptions,\n): NextRedirectRule[] {\n const type = project.getType(typeId).config;\n if (!isRoutableType(type)) return [];\n\n const { defaultLocale } = project.config;\n const translationIndex = buildRedirectTranslationIndex(project, typeId);\n const aliasSourceSlugs = new Set<string>();\n for (const [alias, target] of aliasIndex.aliasToTarget) {\n if (target.contentTypeId === typeId) aliasSourceSlugs.add(alias);\n }\n\n return [\n ...buildAliasRedirects(type, aliasIndex, translationIndex, options.prefixedLocales, defaultLocale),\n ...buildAliasLegacyNoBlogPathRedirects(\n type,\n aliasIndex,\n translationIndex,\n options.prefixedLocales,\n defaultLocale,\n ),\n ...buildRedirectToRules(type, project.config, translationIndex, options.prefixedLocales, defaultLocale),\n ...buildCrossLocaleSlugRedirects(type, translationIndex, aliasSourceSlugs, defaultLocale),\n ...buildLegacyNoBlogPathRedirects(type, project.config, translationIndex, options.prefixedLocales, defaultLocale),\n ];\n}\n\n/** Build Next.js redirect rules from aliases, redirect_to, and locale slug fixes. */\nexport function buildAllContentRedirects(\n project: ScribeProject,\n options: BuildRedirectsOptions,\n): NextRedirectRule[] {\n const aliasIndex = buildGlobalAliasIndex(project);\n const out: NextRedirectRule[] = [];\n\n for (const type of project.config.types) {\n if (!isRoutableType(type)) continue;\n out.push(...buildTypeRedirects(project, type.id, aliasIndex, options));\n }\n\n return out;\n}\n\nexport interface RedirectSourceSlugs {\n /** All alias slugs (inbound old slugs) — exclude from sitemap. */\n aliasSlugs: Set<string>;\n /** EN canonical slugs with outbound redirect_to — exclude from sitemap. */\n outboundByType: Map<string, Set<string>>;\n}\n\n/** Slugs excluded from sitemap (aliases and outbound redirect_to sources). */\nexport function getRedirectSourceSlugs(project: ScribeProject): RedirectSourceSlugs {\n const aliasIndex = buildGlobalAliasIndex(project);\n const outboundByType = new Map<string, Set<string>>();\n\n for (const type of project.config.types) {\n const outbound = new Set<string>();\n for (const enSlug of listEnSlugs(project.config.rootDir, type.contentDir)) {\n const doc = readEnDocument(project.config, type, enSlug);\n if (doc?.redirectTo) outbound.add(enSlug);\n }\n outboundByType.set(type.id, outbound);\n }\n\n return {\n aliasSlugs: aliasIndex.allAliasSlugs,\n outboundByType,\n };\n}\n","import { extractSlugFromResolvedPath } from \"../i18n/build-url.js\";\nimport type { ScribeProject } from \"./types.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { enFileExists, isAliasKnown, listEnSlugs } from \"./alias-helpers.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\n\nexport interface AliasTarget {\n contentTypeId: string;\n canonicalSlug: string;\n path: string;\n}\n\nexport interface AliasIndexIssue {\n contentTypeId: string;\n enSlug: string;\n field: string;\n message: string;\n level: \"error\" | \"warning\" | \"info\";\n}\n\nexport interface GlobalAliasIndex {\n aliasToTarget: Map<string, AliasTarget>;\n allAliasSlugs: Set<string>;\n issues: AliasIndexIssue[];\n}\n\n/**\n * Build a global alias → canonical map across every registered content type.\n */\nexport function buildGlobalAliasIndex(project: ScribeProject): GlobalAliasIndex {\n const { config } = project;\n const aliasToTarget = new Map<string, AliasTarget>();\n const allAliasSlugs = new Set<string>();\n const issues: AliasIndexIssue[] = [];\n\n const canonicalSlugsByType = new Map<string, Set<string>>();\n\n for (const type of config.types) {\n const slugs = listEnSlugs(config.rootDir, type.contentDir);\n canonicalSlugsByType.set(type.id, new Set(slugs));\n }\n\n for (const type of config.types) {\n if (!type.path) continue;\n const canonicalSlugs = canonicalSlugsByType.get(type.id) ?? new Set<string>();\n\n for (const enSlug of canonicalSlugs) {\n const doc = readEnDocument(config, type, enSlug);\n if (!doc) continue;\n\n for (const alias of doc.aliases) {\n if (alias === enSlug) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" must not equal the canonical slug`,\n level: \"error\",\n });\n continue;\n }\n\n if (canonicalSlugs.has(alias)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" collides with another document's canonical slug`,\n level: \"error\",\n });\n continue;\n }\n\n const existing = aliasToTarget.get(alias);\n if (existing) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" is already claimed by ${existing.contentTypeId}/${existing.canonicalSlug}`,\n level: \"error\",\n });\n continue;\n }\n\n aliasToTarget.set(alias, {\n contentTypeId: type.id,\n canonicalSlug: enSlug,\n path: type.path!,\n });\n allAliasSlugs.add(alias);\n }\n }\n }\n\n return { aliasToTarget, allAliasSlugs, issues };\n}\n\n/** Warnings and info for registered aliases (unknown, orphan EN files, sqlite history, locale gaps). */\nexport function validateAliasCoverage(project: ScribeProject): AliasIndexIssue[] {\n const { config } = project;\n const { aliasToTarget } = buildGlobalAliasIndex(project);\n const issues: AliasIndexIssue[] = [];\n const db = openStore(config, \"readonly\");\n\n try {\n for (const [alias, target] of aliasToTarget) {\n const type = config.types.find((t) => t.id === target.contentTypeId);\n if (!type) continue;\n\n const known = isAliasKnown(config, type, alias, db);\n\n if (!known) {\n issues.push({\n contentTypeId: type.id,\n enSlug: target.canonicalSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" is unknown (no EN file or sqlite translations) — only EN redirect will work`,\n level: \"warning\",\n });\n }\n\n if (enFileExists(config, type, alias)) {\n issues.push({\n contentTypeId: type.id,\n enSlug: target.canonicalSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" still has an EN file on disk — delete it manually`,\n level: \"warning\",\n });\n }\n\n const sqliteRows = listTranslationsForEnSlug(db, type.id, alias);\n if (sqliteRows.length > 0) {\n issues.push({\n contentTypeId: type.id,\n enSlug: target.canonicalSlug,\n field: \"aliases\",\n message: `${sqliteRows.length} sqlite translation(s) for alias \"${alias}\" retained for locale redirects and history`,\n level: \"info\",\n });\n }\n\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n\n const canonicalRow = listTranslationsForEnSlug(db, type.id, target.canonicalSlug).find(\n (r) => r.locale === locale,\n );\n if (!canonicalRow) continue;\n\n const aliasRow = sqliteRows.find((r) => r.locale === locale);\n\n if (!aliasRow && known) {\n issues.push({\n contentTypeId: type.id,\n enSlug: target.canonicalSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" has no locale slug mapping for ${locale} — old localized URL may miss redirect`,\n level: \"warning\",\n });\n }\n }\n }\n } finally {\n db.close();\n }\n\n return issues;\n}\n\n/** Detect redirect chains involving aliases or redirect_to. */\nexport function validateAliasRedirectChains(project: ScribeProject): AliasIndexIssue[] {\n const { config } = project;\n const { aliasToTarget, allAliasSlugs } = buildGlobalAliasIndex(project);\n const issues: AliasIndexIssue[] = [];\n\n for (const [alias, target] of aliasToTarget) {\n const doc = readEnDocument(\n config,\n project.getType(target.contentTypeId).config,\n target.canonicalSlug,\n );\n if (doc?.redirectTo) {\n issues.push({\n contentTypeId: target.contentTypeId,\n enSlug: target.canonicalSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" points at \"${target.canonicalSlug}\" which has redirect_to — resolve to the final canonical slug`,\n level: \"error\",\n });\n }\n }\n\n for (const type of config.types) {\n if (!type.path) continue;\n for (const enSlug of listEnSlugs(config.rootDir, type.contentDir)) {\n const doc = readEnDocument(config, type, enSlug);\n if (!doc?.redirectTo) continue;\n\n const targetSlug = extractSlugFromResolvedPath(type.path, doc.redirectTo);\n if (targetSlug && allAliasSlugs.has(targetSlug)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: \"redirect_to\",\n message: `redirect_to target \"${targetSlug}\" is an alias slug — chain detected`,\n level: \"error\",\n });\n }\n\n const targetDoc = targetSlug ? readEnDocument(config, type, targetSlug) : null;\n if (targetDoc?.redirectTo) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: \"redirect_to\",\n message: `redirect_to chain detected: \"${enSlug}\" → \"${targetSlug}\" → \"${targetDoc.redirectTo}\"`,\n level: \"error\",\n });\n }\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type Database from \"better-sqlite3\";\nimport type { ContentTypeConfig, ScribeConfig } from \"./types.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\n\nexport function enFileExists(\n config: ScribeConfig,\n type: ContentTypeConfig,\n enSlug: string,\n): boolean {\n const dir = path.join(config.rootDir, type.contentDir);\n return (\n fs.existsSync(path.join(dir, `${enSlug}.mdx`)) ||\n fs.existsSync(path.join(dir, `${enSlug}.md`))\n );\n}\n\nexport function sqliteHasTranslations(\n db: Database.Database,\n contentTypeId: string,\n enSlug: string,\n): boolean {\n return listTranslationsForEnSlug(db, contentTypeId, enSlug).length > 0;\n}\n\nexport function isAliasKnown(\n config: ScribeConfig,\n type: ContentTypeConfig,\n aliasEnSlug: string,\n db: Database.Database,\n): boolean {\n return enFileExists(config, type, aliasEnSlug) || sqliteHasTranslations(db, type.id, aliasEnSlug);\n}\n\nexport function listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n","import type { ScribeProject } from \"../core/types.js\";\nimport { buildGlobalAliasIndex } from \"../core/slug-aliases.js\";\nimport { buildTranslationIndex } from \"../i18n/translation-index.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\n\n/** Merged en_slug → locale slug map for redirect expansion (loader + orphan sqlite alias rows). */\nexport function buildRedirectTranslationIndex(\n project: ScribeProject,\n typeId: 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 { aliasToTarget } = buildGlobalAliasIndex(project);\n const db = openStore(project.config, \"readonly\");\n\n try {\n for (const [alias, target] of aliasToTarget) {\n if (target.contentTypeId !== typeId) continue;\n\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","import type { AllDocuments } from \"../core/types.js\";\n\n/**\n * Internal: locale → (en_slug → locale slug) map for all non-default locales.\n * Consumed by `staticParams()`, `alternates()`, and redirect expansion.\n */\nexport function buildTranslationIndex(\n allDocs: AllDocuments,\n locales: readonly string[],\n defaultLocale: string,\n): Map<string, Map<string, string>> {\n const index = new Map<string, Map<string, string>>();\n for (const locale of locales) {\n if (locale === defaultLocale) continue;\n const idx = allDocs.get(locale);\n if (!idx) continue;\n const localeMap = new Map<string, string>();\n for (const [enSlug, doc] of idx.byEnSlug) {\n localeMap.set(enSlug, doc.slug);\n }\n index.set(locale, localeMap);\n }\n return index;\n}\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 fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport type { ScribeConfig, ScribeConfigInput } from \"../core/types.js\";\nimport { resolveConfig } from \"./resolve-config.js\";\n\nexport interface LoadConfigOptions {\n configPath?: string;\n cwd?: string;\n}\n\n/** Find scribe.config.ts/mts/js in a directory. */\nexport function findConfigPath(cwd: string): string | null {\n const candidates = [\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.ts\"),\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.mts\"),\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.js\"),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {\n return candidate;\n }\n }\n return null;\n}\n\n/** Load and resolve scribe.config.ts synchronously (CLI). */\nexport function loadConfigSync(options: LoadConfigOptions = {}): ScribeConfig {\n const cwd = options.cwd ?? /* turbopackIgnore: true */ process.cwd();\n const configPath = options.configPath ?? findConfigPath(cwd);\n if (!configPath) {\n throw new Error(`No scribe.config.ts found in ${cwd} (pass --config)`);\n }\n\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n moduleCache: false,\n });\n\n const loaded = jiti(configPath) as ScribeConfigInput | { default: ScribeConfigInput };\n const config = \"default\" in loaded ? loaded.default : loaded;\n if (!config?.rootDir) {\n throw new Error(`Invalid scribe config at ${configPath}: missing rootDir`);\n }\n return resolveConfig(config, path.dirname(configPath));\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { createProject } from \"../create-project.js\";\nimport {\n buildGlobalAliasIndex,\n validateAliasCoverage,\n validateAliasRedirectChains,\n} from \"../core/slug-aliases.js\";\nimport { validateLocaleBuiltinFields } from \"../core/builtin-fields.js\";\nimport { computePageEnHash } from \"../hash/page-hash.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../loader/create-loader.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { recordRevision } from \"../history/record-revision.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { isRoutableType } from \"../i18n/build-url.js\";\nimport { getTranslation } from \"../storage/translations.js\";\nimport { validateRelations } from \"./validate-relations.js\";\nimport { validateTranslationSlugSuffixes } from \"./validate-slug-suffix.js\";\n\nexport interface ValidateIssue {\n level: \"error\" | \"warning\" | \"info\";\n contentType?: string;\n enSlug?: string;\n locale?: string;\n field?: string;\n message: string;\n}\n\nexport interface ValidateResult {\n ok: boolean;\n issues: ValidateIssue[];\n}\n\nfunction listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\n/** Validate EN files, SQLite consistency, relations, aliases, and slug rules. */\nexport function validateProject(config: ScribeConfig): ValidateResult {\n const issues: ValidateIssue[] = [];\n const project = createProject(config);\n const storePath = project.storePath;\n\n if (!fs.existsSync(storePath)) {\n issues.push({\n level: \"error\",\n message: `Missing store.sqlite at ${storePath}`,\n });\n return { ok: false, issues };\n }\n\n const db = openStore(config, \"readonly\");\n\n for (const type of config.types) {\n const enSlugs = listEnSlugs(config.rootDir, type.contentDir);\n const englishSlugs = new Set(enSlugs);\n\n if (!type.translate && isRoutableType(type)) {\n issues.push({\n level: \"warning\",\n contentType: type.id,\n message: `No translate config on content type \"${type.id}\" — using Scribe defaults`,\n });\n }\n\n for (const enSlug of enSlugs) {\n const enDoc = readEnDocument(config, type, enSlug);\n if (!enDoc) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n message: \"Failed to parse EN document\",\n });\n continue;\n }\n\n const payload = getTranslatablePayload(enDoc, type);\n const currentEnHash = computePageEnHash(payload.frontmatter, payload.body);\n const crossIssues =\n type.crossValidate?.(enDoc.frontmatter as never, {\n locale: config.defaultLocale,\n defaultLocale: config.defaultLocale,\n slug: enSlug,\n enSlug,\n knownLocales: config.locales,\n englishSlugs,\n }) ?? [];\n for (const issue of crossIssues) {\n issues.push({\n level: issue.level,\n contentType: type.id,\n enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const row = getTranslation(db, type.id, enSlug, locale);\n if (!row) continue;\n if (row.en_hash !== currentEnHash) {\n issues.push({\n level: \"warning\",\n contentType: type.id,\n enSlug,\n locale,\n field: \"en_hash\",\n message: \"Translation is stale (en_hash mismatch)\",\n });\n recordRevision(config, {\n contentType: type.id,\n enSlug,\n locale,\n revisionKind: \"en_edit_detected\",\n enHash: currentEnHash,\n body: row.body,\n });\n }\n\n const localeFm = JSON.parse(row.frontmatter_json) as Record<string, unknown>;\n for (const issue of validateLocaleBuiltinFields(localeFm)) {\n issues.push({\n level: issue.level,\n contentType: type.id,\n enSlug,\n locale,\n field: issue.field,\n message: issue.message,\n });\n }\n }\n }\n\n try {\n project.getType(type.id).load();\n } catch (error) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n db.close();\n\n const aliasIndex = buildGlobalAliasIndex(project);\n for (const issue of aliasIndex.issues) {\n issues.push({\n level: issue.level,\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n for (const issue of validateAliasRedirectChains(project)) {\n issues.push({\n level: issue.level,\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n for (const issue of validateAliasCoverage(project)) {\n issues.push({\n level: issue.level,\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n for (const issue of validateRelations(project)) {\n issues.push({\n level: issue.level,\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n const dbForSuffix = openStore(config, \"readonly\");\n try {\n for (const issue of validateTranslationSlugSuffixes(config, dbForSuffix)) {\n issues.push({\n level: \"error\",\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n locale: issue.locale,\n field: \"slug\",\n message: issue.message,\n });\n }\n } finally {\n dbForSuffix.close();\n }\n\n return { ok: issues.every((i) => i.level !== \"error\"), issues };\n}\n","import { createHash } from \"node:crypto\";\n\n/** SHA-256 hex digest of a UTF-8 string. */\nexport function sha256(input: string): string {\n return createHash(\"sha256\").update(input, \"utf8\").digest(\"hex\");\n}\n\n/** Hash translatable frontmatter + body for translation staleness detection. */\nexport function computePageEnHash(\n translatableFrontmatter: Record<string, unknown>,\n body: string,\n): string {\n const payload = JSON.stringify({ frontmatter: translatableFrontmatter, body });\n return sha256(payload);\n}\n\n/** Hash MDX body content for revision tracking. */\nexport function computeBodyHash(body: string): string {\n return sha256(body);\n}\n","import type { ScribeConfig } from \"../core/types.js\";\nimport { computeBodyHash } from \"../hash/page-hash.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { appendRevision } from \"../storage/translations.js\";\n\n/** Append a revision row to the SQLite store. */\nexport function recordRevision(\n config: ScribeConfig,\n input: {\n contentType: string;\n enSlug: string;\n locale: string | null;\n revisionKind: \"translation\" | \"en_edit_detected\" | \"snapshot\";\n enHash: string;\n body: string;\n model?: string;\n },\n): number {\n const db = openStore(config, \"readwrite\");\n const id = appendRevision(db, {\n contentType: input.contentType,\n enSlug: input.enSlug,\n locale: input.locale,\n revisionKind: input.revisionKind,\n enHash: input.enHash,\n bodyHash: computeBodyHash(input.body),\n createdAt: new Date().toISOString(),\n model: input.model,\n bodyPreview: input.body.slice(0, 200),\n });\n db.close();\n return id;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig, ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { listRelationFields } from \"../core/introspect-schema.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\n\nexport interface RelationValidateIssue {\n contentTypeId: string;\n enSlug: string;\n locale?: string;\n field: string;\n message: string;\n /**\n * Dangling required single relations are errors (`related()` would throw at\n * render); dangling optional/multiple relations degrade gracefully to\n * null/dropped items, so they only warn.\n */\n level: \"error\" | \"warning\";\n}\n\nfunction getAtPath(obj: Record<string, unknown>, fieldPath: string[]): unknown {\n let current: unknown = obj;\n for (const segment of fieldPath) {\n if (typeof current !== \"object\" || current === null || Array.isArray(current)) return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nfunction buildEnSlugIndex(config: ScribeConfig): Map<string, Set<string>> {\n const index = new Map<string, Set<string>>();\n for (const type of config.types) {\n const slugs = new Set(listEnSlugs(config.rootDir, type.contentDir));\n index.set(type.id, slugs);\n }\n return index;\n}\n\nfunction listEnSlugsForType(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\n/**\n * Warn when a relation field references a slug that does not exist in the target type.\n */\nexport function validateRelations(project: ScribeProject): RelationValidateIssue[] {\n const { config } = project;\n const slugIndex = buildEnSlugIndex(config);\n const issues: RelationValidateIssue[] = [];\n\n const typeIds = new Set(config.types.map((t) => t.id));\n\n for (const type of config.types) {\n const relationFields = listRelationFields(type.schema);\n if (relationFields.length === 0) continue;\n\n for (const enSlug of listEnSlugsForType(config.rootDir, type.contentDir)) {\n const doc = readEnDocument(config, type, enSlug);\n if (!doc) continue;\n\n for (const fieldMeta of relationFields) {\n const targetTypeId = fieldMeta.relationTarget!;\n const danglingLevel =\n fieldMeta.relationOptional || fieldMeta.relationMultiple ? \"warning\" : \"error\";\n if (!typeIds.has(targetTypeId)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: fieldMeta.path.join(\".\"),\n message: `Relation target type \"${targetTypeId}\" is not registered`,\n level: \"error\",\n });\n continue;\n }\n\n const value = getAtPath(doc.frontmatter as Record<string, unknown>, fieldMeta.path);\n if (value === undefined || value === null || value === \"\") continue;\n\n const targetSlugs = slugIndex.get(targetTypeId) ?? new Set<string>();\n const fieldLabel = fieldMeta.path.join(\".\");\n\n if (fieldMeta.relationMultiple) {\n if (!Array.isArray(value)) continue;\n for (const slug of value) {\n if (typeof slug !== \"string\" || !slug) continue;\n if (!targetSlugs.has(slug)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: fieldLabel,\n message: `${fieldLabel} references \"${slug}\" — no ${targetTypeId} doc with that slug`,\n level: danglingLevel,\n });\n }\n }\n } else if (typeof value === \"string\") {\n if (!targetSlugs.has(value)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: fieldLabel,\n message: `${fieldLabel} references \"${value}\" — no ${targetTypeId} doc with slug \"${value}\"`,\n level: danglingLevel,\n });\n }\n }\n }\n }\n }\n\n return issues;\n}\n","import type Database from \"better-sqlite3\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { bulkLoadTranslations } from \"../storage/translations.js\";\n\nexport interface SlugSuffixIssue {\n contentTypeId: string;\n enSlug: string;\n locale: string;\n slug: string;\n message: string;\n}\n\n/** GEN-241: translated slugs must not end with a locale code suffix. */\nexport function validateTranslationSlugSuffixes(\n config: ScribeConfig,\n db: Database.Database,\n): SlugSuffixIssue[] {\n const issues: SlugSuffixIssue[] = [];\n const localeCodes = config.locales.filter((l) => l !== config.defaultLocale);\n\n for (const row of bulkLoadTranslations(db)) {\n if (row.locale === config.defaultLocale) continue;\n\n for (const code of localeCodes) {\n if (row.slug.endsWith(`-${code}`)) {\n issues.push({\n contentTypeId: row.content_type,\n enSlug: row.en_slug,\n locale: row.locale,\n slug: row.slug,\n message: `Translation slug \"${row.slug}\" ends with locale code \"-${code}\"`,\n });\n break;\n }\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { computePageEnHash } from \"../hash/page-hash.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../loader/create-loader.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getTranslation } from \"../storage/translations.js\";\n\nexport interface TranslationWorkItem {\n contentType: string;\n enSlug: string;\n locale: string;\n reason: \"missing\" | \"stale\";\n currentEnHash: string;\n storedEnHash?: string;\n}\n\nexport interface WorklistOptions {\n contentType?: string;\n locales?: string[];\n enSlug?: string;\n}\n\nfunction listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\n/** List locale pages that are missing or stale vs current EN content. */\nexport function buildWorklist(config: ScribeConfig, options: WorklistOptions = {}): TranslationWorkItem[] {\n const db = openStore(config, \"readonly\");\n const items: TranslationWorkItem[] = [];\n const locales =\n options.locales ??\n config.locales.filter((locale) => locale !== config.defaultLocale);\n\n for (const type of config.types) {\n if (options.contentType && type.id !== options.contentType) continue;\n const enSlugs = options.enSlug ? [options.enSlug] : listEnSlugs(config.rootDir, type.contentDir);\n\n for (const enSlug of enSlugs) {\n const enDoc = readEnDocument(config, type, enSlug);\n if (!enDoc) continue;\n const payload = getTranslatablePayload(enDoc, type);\n const currentEnHash = computePageEnHash(payload.frontmatter, payload.body);\n\n for (const locale of locales) {\n if (locale === config.defaultLocale) continue;\n const existing = getTranslation(db, type.id, enSlug, locale);\n if (!existing) {\n items.push({\n contentType: type.id,\n enSlug,\n locale,\n reason: \"missing\",\n currentEnHash,\n });\n continue;\n }\n if (existing.en_hash !== currentEnHash) {\n items.push({\n contentType: type.id,\n enSlug,\n locale,\n reason: \"stale\",\n currentEnHash,\n storedEnHash: existing.en_hash,\n });\n }\n }\n }\n }\n\n db.close();\n return items;\n}\n\n/** Resolve target locales from CLI flags or a named preset. */\nexport function resolveLocalesFromPreset(\n config: ScribeConfig,\n preset?: string,\n explicitLocales?: string[],\n): string[] {\n if (explicitLocales?.length) return explicitLocales;\n if (preset && config.localePresets?.[preset]) {\n return config.localePresets[preset]!.filter((l) => l !== config.defaultLocale);\n }\n return config.locales.filter((l) => l !== config.defaultLocale);\n}\n","import type { ScribeConfig } from \"../core/types.js\";\nimport { computePageEnHash } from \"../hash/page-hash.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../loader/create-loader.js\";\nimport { recordRevision } from \"../history/record-revision.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getTranslation, upsertTranslation } from \"../storage/translations.js\";\nimport { translatePageWithGemini } from \"./gemini-client.js\";\nimport { buildPageTranslationPrompt } from \"./prompts/translation-prompt.js\";\nimport { resolveTranslateConfig } from \"./resolve-translate-config.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\nexport interface TranslatePageResult {\n contentType: string;\n enSlug: string;\n locale: string;\n skipped: boolean;\n reason?: \"fresh\";\n model?: string;\n}\n\n/** Translate one locale page via Gemini and upsert into SQLite. */\nexport async function translatePage(\n config: ScribeConfig,\n item: TranslationWorkItem,\n options: { model?: string; dryRun?: boolean; force?: boolean } = {},\n): Promise<TranslatePageResult> {\n const type = config.types.find((t) => t.id === item.contentType);\n if (!type) throw new Error(`Unknown content type ${item.contentType}`);\n\n const enDoc = readEnDocument(config, type, item.enSlug);\n if (!enDoc) throw new Error(`EN document not found: ${item.enSlug}`);\n\n const payload = getTranslatablePayload(enDoc, type);\n const currentEnHash = computePageEnHash(payload.frontmatter, payload.body);\n\n const db = openStore(config, \"readonly\");\n const existing = getTranslation(db, type.id, item.enSlug, item.locale);\n db.close();\n\n if (!options.force && existing && existing.en_hash === currentEnHash) {\n return {\n contentType: item.contentType,\n enSlug: item.enSlug,\n locale: item.locale,\n skipped: true,\n reason: \"fresh\",\n };\n }\n\n const resolvedTranslate = resolveTranslateConfig(config, type);\n\n const prompt = buildPageTranslationPrompt({\n resolved: resolvedTranslate,\n targetLocale: item.locale,\n enTitle: String(enDoc.frontmatter.title ?? item.enSlug),\n enDescription: String(enDoc.frontmatter.description ?? \"\"),\n translatableFrontmatter: payload.frontmatter,\n enBody: payload.body,\n slugStrategy: type.slugStrategy,\n });\n\n if (options.dryRun) {\n return {\n contentType: item.contentType,\n enSlug: item.enSlug,\n locale: item.locale,\n skipped: false,\n model: options.model,\n };\n }\n\n const result = await translatePageWithGemini({\n prompt,\n model: options.model ?? resolvedTranslate.model,\n });\n const slug =\n type.slugStrategy === \"localized\"\n ? (result.parsed.slug ?? existing?.slug ?? item.enSlug)\n : item.enSlug;\n\n const writeDb = openStore(config, \"readwrite\");\n upsertTranslation(writeDb, {\n contentType: type.id,\n enSlug: item.enSlug,\n locale: item.locale,\n slug,\n frontmatter: result.parsed.frontmatter,\n body: result.parsed.body,\n enHash: currentEnHash,\n translatedAt: new Date().toISOString(),\n model: result.model,\n });\n writeDb.close();\n\n recordRevision(config, {\n contentType: type.id,\n enSlug: item.enSlug,\n locale: item.locale,\n revisionKind: \"translation\",\n enHash: currentEnHash,\n body: result.parsed.body,\n model: result.model,\n });\n\n return {\n contentType: item.contentType,\n enSlug: item.enSlug,\n locale: item.locale,\n skipped: false,\n model: result.model,\n };\n}\n\n/** Translate a batch of worklist items sequentially. */\nexport async function translateWorklist(\n config: ScribeConfig,\n items: TranslationWorkItem[],\n options: { model?: string; dryRun?: boolean; force?: boolean; concurrency?: number } = {},\n): Promise<TranslatePageResult[]> {\n const results: TranslatePageResult[] = [];\n for (const item of items) {\n results.push(await translatePage(config, item, options));\n }\n return results;\n}\n","import { GoogleGenAI } from \"@google/genai\";\n\nconst DEFAULT_MODEL = \"gemini-2.5-pro\";\n\nexport interface GeminiTranslationResult {\n model: string;\n raw: string;\n parsed: {\n frontmatter: Record<string, unknown>;\n body: string;\n slug?: string;\n };\n}\n\nfunction extractJson(text: string): string {\n const fenced = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (fenced?.[1]) return fenced[1].trim();\n const start = text.indexOf(\"{\");\n const end = text.lastIndexOf(\"}\");\n if (start >= 0 && end > start) return text.slice(start, end + 1);\n return text.trim();\n}\n\nexport async function translatePageWithGemini(input: {\n prompt: string;\n model?: string;\n apiKey?: string;\n}): Promise<GeminiTranslationResult> {\n const apiKey = input.apiKey ?? process.env.GEMINI_API_KEY;\n if (!apiKey) {\n throw new Error(\"GEMINI_API_KEY is required for scribe translate\");\n }\n\n const model = input.model ?? process.env.PROSE_GEMINI_MODEL ?? DEFAULT_MODEL;\n const ai = new GoogleGenAI({ apiKey });\n const response = await ai.models.generateContent({\n model,\n contents: input.prompt,\n config: {\n responseMimeType: \"application/json\",\n },\n });\n\n const raw = response.text ?? \"\";\n const parsed = JSON.parse(extractJson(raw)) as {\n frontmatter: Record<string, unknown>;\n body: string;\n slug?: string;\n };\n\n if (!parsed.frontmatter || typeof parsed.body !== \"string\") {\n throw new Error(\"Gemini response missing frontmatter/body\");\n }\n\n return { model, raw, parsed };\n}\n","import type { ResolvedTranslateConfig } from \"../resolve-translate-config.js\";\nimport type { SlugStrategy } from \"../../core/types.js\";\n\nexport const LOCALE_NAMES: Record<string, string> = {\n fr: \"French\",\n es: \"Spanish\",\n de: \"German\",\n nl: \"Dutch\",\n uk: \"Ukrainian\",\n tr: \"Turkish\",\n da: \"Danish\",\n he: \"Hebrew\",\n \"zh-CN\": \"Simplified Chinese\",\n \"zh-TW\": \"Traditional Chinese\",\n pt: \"Portuguese\",\n ja: \"Japanese\",\n ru: \"Russian\",\n it: \"Italian\",\n ar: \"Arabic\",\n};\n\nexport function defaultLocalizationPrompt(localeName: string, locale: string): string {\n return [\n `Localize the content below into natural ${localeName} (${locale}).`,\n \"Do not translate word-for-word.\",\n \"Preserve the source tone and brand voice.\",\n \"Write as if a native speaker authored it for the target market.\",\n ].join(\" \");\n}\n\nexport function buildPageTranslationPrompt(input: {\n resolved: ResolvedTranslateConfig;\n targetLocale: string;\n enTitle: string;\n enDescription: string;\n translatableFrontmatter: Record<string, unknown>;\n enBody: string;\n slugStrategy: SlugStrategy;\n}): string {\n const localeName = LOCALE_NAMES[input.targetLocale] ?? input.targetLocale;\n const prompt =\n input.resolved.promptOverride ??\n defaultLocalizationPrompt(localeName, input.targetLocale);\n\n const lines = [\n prompt,\n \"\",\n ...(input.resolved.context ? [\"## Context\", input.resolved.context, \"\"] : []),\n \"## Rules\",\n ...input.resolved.rules.map((rule) => `- ${rule}`),\n \"\",\n \"## Output format\",\n \"Return ONLY valid JSON with keys:\",\n input.slugStrategy === \"localized\"\n ? '`frontmatter` (object with translated frontmatter fields), `body` (string, full MDX body), `slug` (string).'\n : \"`frontmatter` (object), `body` (string).\",\n \"\",\n \"## EN metadata\",\n `title: ${input.enTitle}`,\n `description: ${input.enDescription}`,\n \"\",\n \"## EN translatable frontmatter (JSON)\",\n JSON.stringify(input.translatableFrontmatter, null, 2),\n \"\",\n \"## EN body (MDX)\",\n input.enBody,\n ];\n\n return lines.join(\"\\n\");\n}\n","import type {\n ContentTypeConfig,\n ScribeConfig,\n ScribeTranslateDefaults,\n SlugStrategy,\n TranslateConfig,\n} from \"../core/types.js\";\n\nexport interface ResolvedTranslateConfig {\n promptOverride?: string;\n context?: string;\n rules: string[];\n model?: string;\n}\n\nfunction slugStrategyRules(\n slugStrategy: SlugStrategy,\n preserveTerms?: string[],\n): string[] {\n if (slugStrategy === \"localized\") {\n const rules = [\n \"Provide a localized URL slug in JSON field `slug`.\",\n \"Slug MUST be ASCII only: a-z, 0-9, hyphens. No uppercase, accents, underscores, or spaces.\",\n \"For non-Latin locales, transliterate into Latin script.\",\n ];\n if (preserveTerms?.length) {\n rules.push(\n `Preserve these terms verbatim in slugs (lowercase): ${preserveTerms.join(\", \")}.`,\n );\n } else {\n rules.push(\"Preserve 4-digit years and proper nouns in slugs.\");\n }\n return rules;\n }\n return [\"Do NOT output a slug — slugStrategy is fixed.\"];\n}\n\nfunction mergeContext(\n project: ScribeTranslateDefaults | undefined,\n type: TranslateConfig | undefined,\n): string | undefined {\n const parts = [project?.context, type?.context].filter(Boolean);\n return parts.length > 0 ? parts.join(\"\\n\\n\") : undefined;\n}\n\nfunction mergeTranslateConfig(\n project: ScribeTranslateDefaults | undefined,\n type: TranslateConfig | undefined,\n slugStrategy: SlugStrategy,\n): ResolvedTranslateConfig {\n return {\n promptOverride: type?.prompt ?? project?.prompt,\n context: mergeContext(project, type),\n rules: [\n ...(project?.rules ?? []),\n ...(type?.rules ?? []),\n ...slugStrategyRules(slugStrategy, project?.slugPreserveTerms),\n ],\n model: type?.model ?? project?.defaultModel,\n };\n}\n\n/** Merge project and content-type translation settings. */\nexport function resolveTranslateConfig(\n config: ScribeConfig,\n type: ContentTypeConfig,\n): ResolvedTranslateConfig {\n return mergeTranslateConfig(config.translate, type.translate, type.slugStrategy);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport dotenv from \"dotenv\";\n\nconst ENV_FILES = [\".env\", \".env.local\"] as const;\n\n/** Load `.env` then `.env.local` from cwd; existing process env wins. */\nexport function loadEnvFromCwd(cwd: string): void {\n for (const file of ENV_FILES) {\n const envPath = path.join(/* turbopackIgnore: true */ cwd, file);\n if (!fs.existsSync(envPath)) continue;\n dotenv.config({ path: envPath, override: false });\n }\n}\n","import { serve } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport type { ScribeProject } from \"../src/core/types.js\";\nimport { computePageEnHash } from \"../src/hash/page-hash.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../src/loader/create-loader.js\";\nimport { openStore } from \"../src/storage/sqlite.js\";\nimport { listRevisions, listTranslationsForType } from \"../src/storage/translations.js\";\nimport { buildWorklist } from \"../src/translate/worklist.js\";\n\nfunction renderLayout(title: string, body: string): string {\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${title} — Scribe Studio</title>\n <style>\n body { font-family: ui-sans-serif, system-ui, sans-serif; margin: 0; background: #0b0d10; color: #e8eaed; }\n header { padding: 16px 24px; border-bottom: 1px solid #222; display: flex; gap: 16px; }\n header a { color: #9ecbff; text-decoration: none; }\n main { padding: 24px; }\n table { border-collapse: collapse; width: 100%; }\n th, td { border: 1px solid #333; padding: 8px 10px; text-align: left; vertical-align: top; }\n th { background: #151922; }\n .muted { color: #9aa0a6; }\n .stale { color: #ffb4a2; }\n .ok { color: #8ce99a; }\n .card { background: #151922; border: 1px solid #333; border-radius: 8px; padding: 16px; margin-bottom: 16px; }\n </style>\n</head>\n<body>\n <header>\n <strong>Scribe Studio</strong>\n <a href=\"/\">Browser</a>\n <a href=\"/staleness\">Staleness</a>\n <a href=\"/history\">History</a>\n </header>\n <main>${body}</main>\n</body>\n</html>`;\n}\n\n/** Start a local read-only Scribe studio (browser, staleness, history). */\nexport async function startStudio(\n project: ScribeProject,\n options: { port?: number; host?: string } = {},\n): Promise<void> {\n const app = new Hono();\n const config = project.config;\n\n app.get(\"/\", (c) => {\n const cards = project.listTypes().map((type) => {\n const localeRows = config.locales\n .map((locale) => {\n const count = type.load().get(locale)?.bySlug.size ?? 0;\n return `<li>${locale}: ${count}</li>`;\n })\n .join(\"\");\n return `<div class=\"card\"><h2>${type.config.label}</h2><ul>${localeRows}</ul></div>`;\n });\n return c.html(renderLayout(\"Browser\", cards.join(\"\")));\n });\n\n app.get(\"/staleness\", (c) => {\n const worklist = buildWorklist(config);\n const rows = worklist\n .slice(0, 500)\n .map(\n (item) =>\n `<tr><td>${item.contentType}</td><td>${item.enSlug}</td><td>${item.locale}</td><td class=\"stale\">${item.reason}</td></tr>`,\n )\n .join(\"\");\n const html = `<h1>Translation staleness</h1><p class=\"muted\">${worklist.length} stale/missing entries (showing up to 500)</p>\n <table><thead><tr><th>Type</th><th>EN slug</th><th>Locale</th><th>Status</th></tr></thead><tbody>${rows}</tbody></table>`;\n return c.html(renderLayout(\"Staleness\", html));\n });\n\n app.get(\"/history\", (c) => {\n const typeId = c.req.query(\"type\") ?? project.listTypes()[0]?.id;\n const enSlug = c.req.query(\"slug\");\n if (!typeId) return c.html(renderLayout(\"History\", \"<p>No content types.</p>\"));\n\n const db = openStore(config, \"readonly\");\n let body = `<h1>History</h1><form><label>Type <select name=\"type\">${project\n .listTypes()\n .map((t) => `<option value=\"${t.id}\" ${t.id === typeId ? \"selected\" : \"\"}>${t.id}</option>`)\n .join(\"\")}</select></label> <label>EN slug <input name=\"slug\" value=\"${enSlug ?? \"\"}\" /></label> <button>View</button></form>`;\n\n if (enSlug) {\n const rows = listRevisions(db, typeId, enSlug)\n .slice(0, 100)\n .map(\n (row) =>\n `<tr><td>${row.created_at}</td><td>${row.revision_kind}</td><td>${row.locale ?? \"en\"}</td><td>${row.en_hash.slice(0, 8)}</td><td class=\"muted\">${row.body_preview ?? \"\"}</td></tr>`,\n )\n .join(\"\");\n body += `<table><thead><tr><th>When</th><th>Kind</th><th>Locale</th><th>EN hash</th><th>Preview</th></tr></thead><tbody>${rows}</tbody></table>`;\n } else {\n const translations = listTranslationsForType(db, typeId).slice(0, 100);\n body += `<ul>${translations\n .map((row) => `<li><a href=\"/history?type=${typeId}&slug=${row.en_slug}\">${row.en_slug}</a> (${row.locale})</li>`)\n .join(\"\")}</ul>`;\n }\n db.close();\n return c.html(renderLayout(\"History\", body));\n });\n\n app.get(\"/api/staleness-matrix\", (c) => {\n const matrix: Record<string, Record<string, number>> = {};\n for (const type of project.listTypes()) {\n matrix[type.id] = {};\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const enSlugs = type.list().map((doc) => doc.slug);\n let stale = 0;\n for (const enSlug of enSlugs) {\n const enDoc = readEnDocument(config, type.config, enSlug);\n if (!enDoc) continue;\n const payload = getTranslatablePayload(enDoc, type.config);\n const hash = computePageEnHash(payload.frontmatter, payload.body);\n const db = openStore(config, \"readonly\");\n const row = db\n .prepare(\n `SELECT en_hash FROM translations WHERE content_type = ? AND en_slug = ? AND locale = ?`,\n )\n .get(type.id, enSlug, locale) as { en_hash: string } | undefined;\n db.close();\n if (!row || row.en_hash !== hash) stale++;\n }\n matrix[type.id]![locale] = stale;\n }\n }\n return c.json(matrix);\n });\n\n const port = options.port ?? 3600;\n const host = options.host ?? \"127.0.0.1\";\n serve({ fetch: app.fetch, port, hostname: host }, () => {\n console.log(`Scribe studio listening on http://${host}:${port}`);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/tsup/assets/cjs_shims.js","../../src/storage/sqlite.ts","../../cli/index.ts","../../src/index.ts","../../src/core/field.ts","../../src/core/types.ts","../../src/create-scribe.ts","../../src/config/resolve-config.ts","../../src/i18n/build-url.ts","../../src/create-project.ts","../../src/core/introspect-schema.ts","../../src/loader/create-loader.ts","../../src/core/builtin-fields.ts","../../src/storage/translations.ts","../../src/loader/normalize-en.ts","../../src/i18n/resolve-document.ts","../../src/sitemap/generate-sitemap.ts","../../src/redirects/build-redirects.ts","../../src/core/slug-aliases.ts","../../src/core/alias-helpers.ts","../../src/redirects/translation-index.ts","../../src/i18n/translation-index.ts","../../src/sitemap/join-base-url.ts","../../src/config/load-config.ts","../../src/validate/validate-project.ts","../../src/validate/validate-relations.ts","../../src/validate/validate-assets.ts","../../src/validate/validate-slug-suffix.ts","../../src/translate/worklist.ts","../../src/hash/page-hash.ts","../../src/translate/page-translator.ts","../../src/history/record-revision.ts","../../src/translate/gemini-client.ts","../../src/translate/gemini-models.ts","../../src/translate/gemini-pricing.ts","../../src/translate/prompts/translation-prompt.ts","../../src/translate/response-schema.ts","../../src/translate/resolve-translate-config.ts","../../src/translate/validate-translation.ts","../../src/export/build-static-raw-exports.ts","../../src/loader/parse-mdx.ts","../../src/export/write-static-raw-exports.ts","../../src/config/load-env.ts","../../studio/server.ts","../../cli/prompt-translate.ts","../../../../node_modules/@inquirer/core/dist/lib/errors.js","../../cli/translate-progress.ts","../../src/version.ts"],"names":["fs","path","Database","z","matter","document","jiti","createJiti","getAtPath","listEnSlugs","createHash","GoogleGenAI","dotenv","field","Hono","serve","select","checkbox","isInteractive","fileURLToPath","openStore"],"mappings":"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","file":"index.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\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 = 3;\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 revisions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n locale TEXT,\n revision_kind TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n body_hash TEXT NOT NULL,\n created_at TEXT NOT NULL,\n model TEXT,\n body_preview TEXT\n )`,\n `CREATE INDEX IF NOT EXISTS idx_revisions_lookup\n ON revisions(content_type, en_slug, locale, created_at DESC)`,\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];\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 migrate(db: Database.Database): void {\n for (const sql of MIGRATIONS) {\n db.exec(sql);\n }\n // v3: store a full content snapshot (translated frontmatter + body) on each\n // revision so history can show — and diff — past versions, not just a preview.\n addColumnIfMissing(db, \"revisions\", \"frontmatter_json\", \"TEXT\");\n addColumnIfMissing(db, \"revisions\", \"body\", \"TEXT\");\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","#!/usr/bin/env node\nimport {\n createProject,\n loadConfigSync,\n translateWorklist,\n validateProject,\n writeStaticRawExports,\n} from \"../src/index.js\";\nimport { listRevisions } from \"../src/storage/translations.js\";\nimport { loadEnvFromCwd } from \"../src/config/load-env.js\";\nimport { buildWorklist, resolveLocalesFromPreset, type TranslationWorklistStrategy } from \"../src/translate/worklist.js\";\nimport { startStudio } from \"../studio/server.js\";\nimport { promptTranslateSelection } from \"./prompt-translate.js\";\nimport { createTranslateProgressReporter } from \"./translate-progress.js\";\nimport { SCRIBE_VERSION } from \"../src/version.js\";\n\ninterface CliOptions {\n config?: string;\n cwd: string;\n locale?: string[];\n preset?: string;\n type?: string;\n slug?: string;\n model?: string;\n dryRun?: boolean;\n force?: boolean;\n port?: number;\n concurrency?: number;\n noProgress?: boolean;\n strategy?: TranslationWorklistStrategy;\n out?: string;\n extension?: string;\n}\n\nfunction parseArgs(argv: string[]): { command: string; options: CliOptions; rest: string[] } {\n const options: CliOptions = { cwd: process.cwd() };\n const positional: string[] = [];\n let i = 0;\n while (i < argv.length) {\n const arg = argv[i]!;\n if (arg === \"--config\") {\n options.config = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--locale\") {\n const locales: string[] = [];\n while (argv[i + 1] && !argv[i + 1]!.startsWith(\"--\")) {\n locales.push(argv[++i]!);\n }\n options.locale = locales;\n i++;\n continue;\n }\n if (arg === \"--preset\") {\n options.preset = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--type\") {\n options.type = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--slug\") {\n options.slug = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--model\") {\n options.model = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--port\") {\n options.port = Number(argv[++i]);\n i++;\n continue;\n }\n if (arg === \"--dry-run\") {\n options.dryRun = true;\n i++;\n continue;\n }\n if (arg === \"--force\") {\n options.force = true;\n i++;\n continue;\n }\n if (arg === \"--concurrency\") {\n options.concurrency = Number(argv[++i]);\n i++;\n continue;\n }\n if (arg === \"--no-progress\") {\n options.noProgress = true;\n i++;\n continue;\n }\n if (arg === \"--strategy\") {\n const value = argv[++i];\n if (value !== \"all\" && value !== \"missing-only\") {\n throw new Error(`Unknown strategy: ${value} (expected all or missing-only)`);\n }\n options.strategy = value;\n i++;\n continue;\n }\n if (arg === \"--out\") {\n options.out = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--extension\") {\n options.extension = argv[++i];\n i++;\n continue;\n }\n if (arg.startsWith(\"--\")) {\n throw new Error(`Unknown flag: ${arg}`);\n }\n positional.push(arg);\n i++;\n }\n const [command = \"help\", ...rest] = positional;\n return { command, options, rest };\n}\n\nfunction loadProject(options: CliOptions) {\n const config = loadConfigSync({\n cwd: options.cwd,\n configPath: options.config,\n });\n return createProject(config);\n}\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n const first = argv[0];\n if (first === \"--version\" || first === \"-V\" || first === \"version\") {\n console.log(SCRIBE_VERSION);\n return;\n }\n\n const { command, options, rest } = parseArgs(argv);\n loadEnvFromCwd(options.cwd);\n\n if (command === \"help\" || command === \"--help\") {\n console.log(`Usage: scribe <command>\n\nCommands:\n status Show EN docs + translation counts\n validate Validate EN files and sqlite consistency\n export-static Write raw MDX files for static hosting\n translate Translate stale/missing locale pages\n history <type> <slug> Show revision timeline\n studio Start read-only local studio\n version Print scribe-cms version\n\nExport-static flags:\n --out <dir> Output directory (default: public)\n --extension <ext> File extension (default: mdx)\n --type <id> Comma-separated content types (default: all routable)\n --locale <code>... Locales to export (default: all configured)\n\nTranslate flags:\n --type <id> Content type (interactive picker in a TTY when omitted)\n --preset <name> Locale preset from config (interactive picker in a TTY)\n --locale <code>... Target locale(s); overrides --preset\n --slug <en-slug> Single English document\n --model <id> Gemini model override\n --concurrency <n> Parallel translations (default: 3)\n --dry-run List work without writing\n --force Re-translate even when hashes match\n --strategy <mode> all (default) or missing-only\n --no-progress Plain line logging instead of live progress\n`);\n return;\n }\n\n if (command === \"version\") {\n console.log(SCRIBE_VERSION);\n return;\n }\n\n const project = loadProject(options);\n const config = project.config;\n\n switch (command) {\n case \"status\": {\n for (const type of project.listTypes()) {\n const enCount = type.list().length;\n console.log(`${type.id}: ${enCount} EN docs`);\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const count = type.load().get(locale)?.bySlug.size ?? 0;\n console.log(` ${locale}: ${count}`);\n }\n }\n console.log(`store: ${project.storePath}`);\n break;\n }\n case \"validate\": {\n const result = validateProject(config);\n for (const issue of result.issues) {\n console.log(\n `[${issue.level}] ${issue.contentType ?? \"\"} ${issue.enSlug ?? \"\"} ${issue.locale ?? \"\"} ${issue.message}`,\n );\n }\n if (!result.ok) process.exitCode = 1;\n break;\n }\n case \"export-static\": {\n const types = options.type?.split(\",\").map((t) => t.trim()).filter(Boolean);\n const { written } = writeStaticRawExports(project, {\n outDir: options.out,\n extension: options.extension ? (`.${options.extension.replace(/^\\./, \"\")}` as `.${string}`) : undefined,\n types,\n locales: options.locale,\n });\n console.log(`Wrote ${written} static raw exports to ${options.out ?? \"public\"}`);\n break;\n }\n case \"translate\": {\n const selection = await promptTranslateSelection(config, {\n type: options.type,\n preset: options.preset,\n locale: options.locale,\n strategy: options.strategy,\n });\n const locales = resolveLocalesFromPreset(config, selection.preset, selection.locale);\n const worklist = buildWorklist(config, {\n contentType: selection.contentType,\n locales,\n enSlug: options.slug,\n strategy: selection.strategy ?? \"all\",\n });\n if (worklist.length === 0) {\n console.log(\"Nothing to translate.\");\n break;\n }\n\n const reporter = createTranslateProgressReporter({\n enabled: !options.noProgress,\n dryRun: options.dryRun,\n });\n\n const results = await translateWorklist(config, worklist, {\n model: options.model,\n dryRun: options.dryRun,\n force: options.force,\n concurrency: options.concurrency,\n onProgress: reporter.onEvent,\n });\n reporter.finish();\n\n const failed = results.filter((result) => result.failed);\n if (failed.length > 0) process.exitCode = 1;\n break;\n }\n case \"history\": {\n const [typeId, enSlug, locale] = rest;\n if (!typeId || !enSlug) {\n throw new Error(\"Usage: scribe history <type> <en-slug> [locale]\");\n }\n const { openStore } = await import(\"../src/storage/sqlite.js\");\n const db = openStore(config, \"readonly\");\n const rows = listRevisions(db, typeId, enSlug, locale);\n db.close();\n for (const row of rows) {\n console.log(\n `${row.created_at} ${row.revision_kind} locale=${row.locale ?? \"en\"} en_hash=${row.en_hash.slice(0, 8)} body_hash=${row.body_hash.slice(0, 8)}`,\n );\n }\n break;\n }\n case \"studio\": {\n await startStudio(project, { port: options.port ?? 3600 });\n break;\n }\n default:\n throw new Error(`Unknown command: ${command}`);\n }\n}\n\nmain().catch((error) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n});\n","export { field, getRelationTarget, getFieldKind, unwrapSchema } from \"./core/field.js\";\nexport type {\n RelationBrand,\n RelationField,\n RelationFieldOptions,\n RelationMeta,\n} from \"./core/field.js\";\nexport { defineConfig, defineContentType } from \"./core/types.js\";\nexport type {\n ScribeConfigInput,\n ScribeConfig,\n ScribeProject,\n ScribeDocument,\n ContentTypeInput,\n ContentTypeConfig,\n ContentTypeRuntime,\n ListOptions,\n OrderBy,\n StaticParam,\n LocaleIndex,\n AllDocuments,\n ResolvedDocument,\n CrossValidateContext,\n CrossValidateIssue,\n TranslateConfig,\n ScribeTranslateDefaults,\n LocalePresets,\n SlugStrategy,\n IndexFallback,\n Scribe,\n InferDocMap,\n InferDocFromTypeConfig,\n RelationFieldsOf,\n RelatedMapFor,\n ScribeClient,\n ScribeDocs,\n ScribeDocOf,\n} from \"./core/types.js\";\nexport { createScribe } from \"./create-scribe.js\";\nexport { createProject } from \"./create-project.js\";\nexport { resolveConfig, isResolvedConfig } from \"./config/resolve-config.js\";\nexport { loadConfigSync, findConfigPath } from \"./config/load-config.js\";\nexport { validateProject } from \"./validate/validate-project.js\";\nexport type { ValidateIssue, ValidateResult } from \"./validate/validate-project.js\";\nexport {\n buildAllContentRedirects,\n getRedirectSourceSlugs,\n} from \"./redirects/build-redirects.js\";\nexport type { NextRedirectRule } from \"./redirects/types.js\";\nexport type { RedirectSourceSlugs } from \"./redirects/build-redirects.js\";\nexport { buildWorklist, resolveLocalesFromPreset } from \"./translate/worklist.js\";\nexport type { TranslationWorklistStrategy, TranslationWorkItem, WorklistOptions } from \"./translate/worklist.js\";\nexport { translatePage, translateWorklist } from \"./translate/page-translator.js\";\nexport type {\n TranslatePageResult,\n TranslateProgressEvent,\n TranslateWorklistTotals,\n} from \"./translate/page-translator.js\";\nexport { generateSitemap } from \"./sitemap/generate-sitemap.js\";\nexport type {\n GenerateSitemapOptions,\n SitemapAlternateLanguages,\n SitemapChangeFrequency,\n SitemapEntry,\n SitemapTypeDefaults,\n} from \"./sitemap/types.js\";\nexport {\n buildStaticRawExports,\n exportDirSegment,\n getStaticExportRoots,\n} from \"./export/build-static-raw-exports.js\";\nexport type {\n BuildStaticRawExportsOptions,\n StaticRawExport,\n} from \"./export/build-static-raw-exports.js\";\nexport { writeStaticRawExports } from \"./export/write-static-raw-exports.js\";\nexport type { WriteStaticRawExportsOptions } from \"./export/write-static-raw-exports.js\";\nexport { serializeMdx } from \"./loader/parse-mdx.js\";\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 type { RELATION_BRAND, RelationBrand } from \"./field.js\";\n\n/**\n * How document slugs behave across locales.\n * - `\"fixed\"` — the EN slug is used for every locale.\n * - `\"localized\"` — each locale gets its own translated slug.\n */\nexport type SlugStrategy = \"localized\" | \"fixed\";\n\n/**\n * What `resolve()` returns when a locale has no translation for a slug.\n * - `\"en\"` — fall back to the default-locale document.\n * - `\"none\"` — return no document.\n */\nexport type IndexFallback = \"en\" | \"none\";\n\n/** Sort order for `list()`. Built-in keys sort by document metadata; pass a comparator for anything else. */\nexport type OrderBy<TDoc = ScribeDocument> =\n | \"slug\"\n | \"publishedAt\"\n | \"-publishedAt\"\n | \"updatedAt\"\n | \"-updatedAt\"\n | ((a: TDoc, b: TDoc) => number);\n\nexport interface CrossValidateContext {\n locale: string;\n defaultLocale: string;\n slug: string;\n enSlug: string;\n knownLocales: readonly string[];\n englishSlugs?: ReadonlySet<string>;\n}\n\nexport interface CrossValidateIssue {\n field: string;\n message: string;\n level: \"error\" | \"warning\";\n}\n\n/** Named locale groups usable with `scribe translate --preset <name>`. */\nexport interface LocalePresets {\n active?: string[];\n ultraLight?: string[];\n [name: string]: string[] | undefined;\n}\n\n/** Per-content-type translation settings (merged over the project-level defaults). */\nexport interface TranslateConfig {\n /** Replace the default system prompt entirely. */\n prompt?: string;\n /** Brand/domain context prepended to every translation request. */\n context?: string;\n /** Extra rules appended to the default rules. */\n rules?: string[];\n /** Model override for this content type. */\n model?: string;\n}\n\n/** Project-level translation defaults. */\nexport interface ScribeTranslateDefaults {\n defaultModel?: string;\n prompt?: string;\n context?: string;\n rules?: string[];\n /** Lowercase terms preserved verbatim in localized slugs */\n slugPreserveTerms?: string[];\n}\n\n/**\n * A content type declaration as written in `scribe.config.ts`.\n * Most fields are optional with sensible defaults — see each field's doc.\n */\nexport interface ContentTypeInput<TSchema extends z.ZodTypeAny = z.ZodTypeAny> {\n /** Unique id. Becomes the typed accessor (`scribe.<id>`) and the default `contentDir`. */\n id: string;\n /** Zod schema for the EN frontmatter. Mark fields with `field.translatable()/structural()/relation()`. */\n schema: TSchema;\n /** Directory under the project content dir holding this type's `.mdx` files. Default: the type `id`. */\n contentDir?: string;\n /** URL template for routable types, e.g. `/blog/{slug}`. Must contain exactly one `{slug}`. Omit for reference-only types. */\n path?: string;\n /** Human label (studio UI). Default: capitalized `id`. */\n label?: string;\n /** Default: `\"fixed\"`. */\n slugStrategy?: SlugStrategy;\n /** Default: `\"en\"` when the type has a `path`, otherwise `\"none\"`. */\n indexFallback?: IndexFallback;\n /** Default sort for `list()`. Default: `\"slug\"`. */\n orderBy?: OrderBy<ScribeDocument<z.infer<TSchema>>>;\n /** Custom validation across fields, run by `scribe validate`. */\n crossValidate?: (\n data: z.infer<TSchema>,\n ctx: CrossValidateContext,\n ) => CrossValidateIssue[];\n translate?: TranslateConfig;\n}\n\n/** A content type with all defaults applied (what runtimes and the CLI consume). */\nexport interface ContentTypeConfig<TSchema extends z.ZodTypeAny = z.ZodTypeAny>\n extends ContentTypeInput<TSchema> {\n contentDir: string;\n label: string;\n slugStrategy: SlugStrategy;\n indexFallback: IndexFallback;\n}\n\n/**\n * The shape accepted by `defineConfig()` / `createScribe()`.\n * Relative paths (`contentDir`, `store`) resolve against `rootDir`.\n */\nexport interface ScribeConfigInput<\n TTypes extends readonly ContentTypeInput<any>[] = readonly ContentTypeInput[],\n> {\n /** Absolute project root (the directory holding `scribe.config.ts`). */\n rootDir: string;\n /** Directory containing the per-type content folders. Default: `\"content\"`. */\n contentDir?: string;\n /** Path to the SQLite translation store. Default: `\".scribe/store.sqlite\"`. Commit this file; do not gitignore `.scribe/`. */\n store?: string;\n /** Path to the static assets folder (e.g. Next.js `public`). Relative to project `rootDir`. When set, `scribe validate` warns on missing image files. */\n assetsDir?: string;\n /** All locales, including the default one. */\n locales: string[];\n /** Canonical source locale. Must be in `locales`. Default: `\"en\"`. */\n defaultLocale?: string;\n localePresets?: LocalePresets;\n translate?: ScribeTranslateDefaults;\n types: TTypes;\n}\n\n/**\n * A fully resolved Scribe config (all defaults applied, paths absolute).\n * Note: `rootDir` here is the absolute **content** root, not the project root.\n */\nexport interface ScribeConfig {\n /** Absolute content root (project `rootDir` + `contentDir`). */\n rootDir: string;\n /** Absolute path to the SQLite translation store. */\n storePath: string;\n /** Absolute path to the static assets folder, when `assetsDir` is configured. */\n assetsPath?: string;\n locales: string[];\n defaultLocale: string;\n localePresets?: LocalePresets;\n translate?: ScribeTranslateDefaults;\n types: ContentTypeConfig[];\n}\n\n/** A loaded document (EN file or stored translation). */\nexport interface ScribeDocument<TFrontmatter = Record<string, unknown>> {\n /** Slug in this document's locale (differs from `enSlug` for localized slugs). */\n slug: string;\n /** Slug of the EN (default-locale) parent. Equal to `slug` for EN documents. */\n enSlug: string;\n locale: string;\n /** Inbound slug aliases (EN canonical docs only). */\n aliases: string[];\n /** Outbound retirement redirect, e.g. `/blog/successor-slug`. */\n redirectTo?: string;\n publishedAt?: string;\n updatedAt?: string;\n noindex: boolean;\n /** Explicit EN frontmatter override for canonical URL path. */\n canonicalPathOverride?: string;\n frontmatter: TFrontmatter;\n content: string;\n filePath?: string;\n}\n\nexport interface LocaleIndex<TDoc = ScribeDocument> {\n bySlug: ReadonlyMap<string, TDoc>;\n byEnSlug: ReadonlyMap<string, TDoc>;\n}\n\nexport type AllDocuments<TDoc = ScribeDocument> = ReadonlyMap<string, LocaleIndex<TDoc>>;\n\n/** Result of `resolve()`: the document plus redirect/canonical routing data. */\nexport interface ResolvedDocument<TDoc = ScribeDocument> {\n document: TDoc | null;\n /** Locale actually served (differs from the requested locale on EN fallback). */\n actualLocale: string;\n /** 301 target when the slug is an alias or belongs to another locale. */\n shouldRedirectTo?: string;\n /** Locale-aware pathname when the type has `path` and a document was found. */\n canonicalPath?: string;\n}\n\n/** `{ locale, slug }` pairs for Next.js `generateStaticParams()`. */\nexport interface StaticParam {\n locale: string;\n slug: string;\n}\n\nexport interface ListOptions<TDoc = ScribeDocument> {\n /** Override the type's configured `orderBy` for this call. */\n orderBy?: OrderBy<TDoc>;\n limit?: number;\n}\n\n/** Untyped default for the `related()` field map. */\nexport type AnyRelatedMap = Record<string, ScribeDocument | ScribeDocument[] | null>;\n\n/**\n * Per-content-type runtime API.\n *\n * Reads: `list`, `get`, `resolve`. Routing: `staticParams`, `alternates`,\n * `translation`, `url`. Relations: `related`. Low-level escape hatch: `load`.\n */\nexport interface ContentTypeRuntime<\n TDoc extends ScribeDocument = ScribeDocument,\n TRelated extends Record<string, unknown> = AnyRelatedMap,\n> {\n id: string;\n config: ContentTypeConfig;\n\n /** All documents for a locale (default: the default locale), sorted by the type's `orderBy`. */\n list: (locale?: string, options?: ListOptions<TDoc>) => TDoc[];\n /** Exact slug lookup in one locale (default: the default locale). No fallback, no redirects. */\n get: (slug: string, locale?: string) => TDoc | null;\n /** Full resolution: aliases, cross-locale slug correction, EN fallback, redirects, canonical path. */\n resolve: (slug: string, locale: string) => ResolvedDocument<TDoc>;\n\n /** Every `{ locale, slug }` pair to prerender — one call in `generateStaticParams()`. */\n staticParams: (options?: { locales?: readonly string[] }) => StaticParam[];\n /** hreflang map: locale → relative path, for every locale with a translation (default locale always included). */\n alternates: (doc: TDoc) => Record<string, string>;\n /** The same document in another locale, or null when untranslated (callers typically do `?? doc`). */\n translation: (doc: TDoc, targetLocale: string) => TDoc | null;\n /** Pathname for a slug + locale from the type's `path` template. */\n url: (slug: string, locale: string) => string;\n\n /** Dereference a `field.relation()` frontmatter field into the target type's document(s). */\n related: <K extends keyof TRelated & string>(\n doc: TDoc,\n field: K,\n locale?: string,\n ) => TRelated[K];\n\n /** Low-level access to the full locale → index map. Prefer `list`/`get`/`resolve`. */\n load: () => AllDocuments<TDoc>;\n}\n\n/** Infer the document type from a content type declaration. */\nexport type InferDocFromTypeConfig<T extends ContentTypeInput<any>> = ScribeDocument<\n z.infer<T[\"schema\"]>\n>;\n\n/** Map content type id → document type from a config types tuple. */\nexport type InferDocMap<TTypes extends readonly ContentTypeInput<any>[]> = {\n [T in TTypes[number] as T[\"id\"]]: InferDocFromTypeConfig<T>;\n};\n\n/** Document map (id → ScribeDocument) from a config object type. */\nexport type ScribeDocs<C extends { types: readonly ContentTypeInput<any>[] }> = InferDocMap<\n C[\"types\"]\n>;\n\n/** Single doc type by content-type id. */\nexport type ScribeDocOf<\n C extends { types: readonly ContentTypeInput<any>[] },\n Id extends keyof ScribeDocs<C> & string,\n> = ScribeDocs<C>[Id];\n\ntype RelationBrandOf<TField> = TField extends {\n [RELATION_BRAND]: infer B extends RelationBrand<string, boolean, boolean>;\n}\n ? B\n : never;\n\n/** Top-level `field.relation()` fields of a schema, keyed by field name. */\nexport type RelationFieldsOf<TSchema extends z.ZodTypeAny> =\n TSchema extends z.ZodObject<infer Shape>\n ? {\n [K in keyof Shape as [RelationBrandOf<Shape[K]>] extends [never]\n ? never\n : K]: RelationBrandOf<Shape[K]>;\n }\n : {};\n\ntype RelatedDoc<B, TDocMap> = B extends RelationBrand<\n infer TTarget,\n infer TMultiple,\n infer TOptional\n>\n ? TTarget extends keyof TDocMap\n ? TMultiple extends true\n ? Array<TDocMap[TTarget]>\n : TOptional extends true\n ? TDocMap[TTarget] | null\n : TDocMap[TTarget]\n : never\n : never;\n\n/** `related()` return types for a content type, derived from its schema's relation fields. */\nexport type RelatedMapFor<\n T extends ContentTypeInput<any>,\n TTypes extends readonly ContentTypeInput<any>[],\n> = {\n [K in keyof RelationFieldsOf<T[\"schema\"]> & string]: RelatedDoc<\n RelationFieldsOf<T[\"schema\"]>[K],\n InferDocMap<TTypes>\n >;\n};\n\n/**\n * The typed Scribe client returned by `createScribe()`.\n * Each content type id becomes a typed accessor: `scribe.blog.list()`, `scribe.blog.related(doc, \"author\")`, …\n */\nexport type Scribe<TTypes extends readonly ContentTypeInput<any>[]> = {\n readonly [T in TTypes[number] as T[\"id\"]]: ContentTypeRuntime<\n InferDocFromTypeConfig<T>,\n RelatedMapFor<T, TTypes>\n >;\n} & {\n /** Sitemap entries (with hreflang alternates) for all routable types. */\n sitemap(\n options: import(\"../sitemap/types.js\").GenerateSitemapOptions,\n ): Promise<import(\"../sitemap/types.js\").SitemapEntry[]>;\n /** The resolved config (defaults applied, paths absolute). */\n config: ScribeConfig;\n project: ScribeProject;\n getType: ScribeProject[\"getType\"];\n listTypes: ScribeProject[\"listTypes\"];\n};\n\n/** Typed client type from a config object type (for app-side type aliases). */\nexport type ScribeClient<C extends { types: readonly ContentTypeInput<any>[] }> = Scribe<\n C[\"types\"]\n>;\n\n/** Untyped project engine (CLI, validation, studio). Prefer `createScribe()` in apps. */\nexport interface ScribeProject {\n config: ScribeConfig;\n rootDir: string;\n storePath: string;\n getType: (id: string) => ContentTypeRuntime;\n listTypes: () => ContentTypeRuntime[];\n}\n\n/** Identity helper that preserves content-type id and schema inference. */\nexport function defineConfig<const TTypes extends readonly ContentTypeInput<any>[]>(\n config: ScribeConfigInput<TTypes>,\n): ScribeConfigInput<TTypes> {\n return config;\n}\n\n/** Identity helper for a single content type entry. */\nexport function defineContentType<\n const TId extends string,\n TSchema extends z.ZodTypeAny,\n>(\n config: ContentTypeInput<TSchema> & { id: TId },\n): ContentTypeInput<TSchema> & { id: TId } {\n return config;\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 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","import path from \"node:path\";\nimport type {\n ContentTypeConfig,\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 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 localePresets: raw.localePresets,\n translate: raw.translate,\n types,\n };\n Object.defineProperty(config, RESOLVED, {\n value: true,\n enumerable: false,\n });\n return config;\n}\n","import type { ContentTypeConfig } 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\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): string {\n const relative = template.replace(SLUG_PLACEHOLDER, slug);\n if (locale === defaultLocale) return relative;\n return `/${locale}${relative}`;\n}\n\n/** Extract slug from a resolved path that matches the template. */\nexport function extractSlugFromResolvedPath(template: string, resolvedPath: string): string | null {\n const prefix = pathPrefix(template);\n const suffix = pathSuffix(template);\n if (!resolvedPath.startsWith(prefix)) return null;\n if (suffix && !resolvedPath.endsWith(suffix)) return null;\n const slugEnd = suffix ? resolvedPath.length - suffix.length : resolvedPath.length;\n const slug = resolvedPath.slice(prefix.length, slugEnd);\n return slug.length > 0 ? 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 { resolvePath } 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 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(slug, locale, config.defaultLocale, load(), type);\n if (result.document && type.path) {\n return {\n ...result,\n canonicalPath: resolvePath(\n type.path,\n result.document.slug,\n result.actualLocale,\n config.defaultLocale,\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 for (const doc of enIdx.bySlug.values()) {\n const slug =\n locale === config.defaultLocale\n ? doc.slug\n : (localeIdx?.byEnSlug.get(doc.slug)?.slug ?? doc.slug);\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]: resolvePath(\n pathTemplate,\n doc.enSlug,\n config.defaultLocale,\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] = resolvePath(pathTemplate, translated.slug, locale, config.defaultLocale);\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 resolvePath(pathTemplate, slug, locale, config.defaultLocale);\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 };\n}\n","import type { z } from \"zod\";\nimport { getFieldKind, getRelationTarget, unwrapSchema } 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\n/** List schema fields with translatable/structural/relation metadata. */\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 const base = unwrapSchema(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 if (base instanceof Object && \"element\" in base) {\n const element = (base as z.ZodArray<z.ZodTypeAny>).element;\n const elementBase = unwrapSchema(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\nexport function extractByPaths(\n data: Record<string, unknown>,\n paths: string[][],\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const path of paths) {\n const value = getAtPath(data, path);\n if (value !== undefined) {\n setAtPath(out, path.filter((p) => p !== \"*\"), value);\n }\n }\n return out;\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 getAtPath(obj: Record<string, unknown>, path: string[]): unknown {\n let current: unknown = obj;\n for (const segment of path) {\n if (segment === \"*\") {\n if (!Array.isArray(current)) return undefined;\n return current.map((item) =>\n typeof item === \"object\" && item !== null\n ? getAtPath(item as Record<string, unknown>, path.slice(path.indexOf(\"*\") + 1))\n : undefined,\n );\n }\n if (typeof current !== \"object\" || current === null || Array.isArray(current)) return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nfunction setAtPath(obj: Record<string, unknown>, path: string[], value: unknown): void {\n if (path.length === 0) return;\n if (path.length === 1) {\n obj[path[0]!] = value;\n return;\n }\n const [head, ...rest] = path;\n if (!(head! in obj) || typeof obj[head!] !== \"object\" || obj[head!] === null) {\n obj[head!] = {};\n }\n setAtPath(obj[head!] as Record<string, unknown>, rest, value);\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 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 { 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 );\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 aliases: builtin.aliases,\n redirectTo: builtin.redirectTo,\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): 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 enDoc.locale,\n );\n\n return {\n slug: row.slug,\n enSlug: row.en_slug,\n locale: row.locale,\n aliases: [],\n redirectTo: seo.redirectTo,\n publishedAt: seo.publishedAt,\n updatedAt: seo.updatedAt,\n noindex: seo.noindex,\n canonicalPathOverride: seo.canonicalPathOverride,\n frontmatter,\n content: row.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);\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 { z } from \"zod\";\nimport { extractSlugFromResolvedPath, pathPrefix, pathSuffix, resolvePath } from \"../i18n/build-url.js\";\nimport type { ContentTypeConfig, 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 aliases: string[];\n redirectTo?: string;\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\n/** Extract built-in EN frontmatter (aliases, 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 const aliasesResult = z.array(slugPatternSchema).max(20).optional().default([]).safeParse(rest.aliases ?? []);\n delete rest.aliases;\n\n const redirectRaw = rest.redirect_to;\n delete rest.redirect_to;\n\n let redirectTo: string | undefined;\n if (redirectRaw !== undefined && redirectRaw !== null && redirectRaw !== \"\") {\n if (typeof redirectRaw !== \"string\") {\n issues.push({\n field: \"redirect_to\",\n message: \"redirect_to must be a string path\",\n level: \"error\",\n });\n } else if (!pathTemplate) {\n issues.push({\n field: \"redirect_to\",\n message: \"redirect_to is not allowed on reference-only content types\",\n level: \"error\",\n });\n } else if (!extractSlugFromResolvedPath(pathTemplate, redirectRaw)) {\n issues.push({\n field: \"redirect_to\",\n message: `redirect_to must match path template \"${pathTemplate}\" (prefix \"${pathPrefix(pathTemplate)}\"${pathSuffix(pathTemplate) ? `, suffix \"${pathSuffix(pathTemplate)}\"` : \"\"})`,\n level: \"error\",\n });\n } else {\n redirectTo = redirectRaw;\n }\n }\n\n const aliases = aliasesResult.success ? aliasesResult.data : [];\n if (!aliasesResult.success) {\n for (const issue of aliasesResult.error.issues) {\n issues.push({\n field: `aliases.${issue.path.join(\".\")}`,\n message: issue.message,\n level: \"error\",\n });\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 aliases,\n redirectTo,\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): string {\n if (doc.canonicalPathOverride) {\n if (doc.locale === defaultLocale) return doc.canonicalPathOverride;\n return `/${doc.locale}${doc.canonicalPathOverride}`;\n }\n if (!type.path) return `/${doc.slug}`;\n return resolvePath(type.path, doc.slug, doc.locale, defaultLocale);\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): 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);\n return out;\n}\n\nexport function seoFieldsFromEn(enDoc: ScribeDocument): Pick<\n ScribeDocument,\n \"publishedAt\" | \"updatedAt\" | \"noindex\" | \"canonicalPathOverride\" | \"redirectTo\"\n> {\n return {\n publishedAt: enDoc.publishedAt,\n updatedAt: enDoc.updatedAt,\n noindex: enDoc.noindex,\n canonicalPathOverride: enDoc.canonicalPathOverride,\n redirectTo: enDoc.redirectTo,\n };\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}\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}\n\nexport interface RevisionInput {\n contentType: string;\n enSlug: string;\n locale: string | null;\n revisionKind: \"translation\" | \"en_edit_detected\" | \"snapshot\";\n enHash: string;\n bodyHash: string;\n createdAt: string;\n model?: string;\n bodyPreview?: string;\n /** Full translated frontmatter snapshot (JSON) at revision time. */\n frontmatterJson?: string | null;\n /** Full translated body snapshot at revision time. */\n body?: string | null;\n}\n\nexport interface RevisionRow {\n id: number;\n content_type: string;\n en_slug: string;\n locale: string | null;\n revision_kind: string;\n en_hash: string;\n body_hash: string;\n created_at: string;\n model: string | null;\n body_preview: string | null;\n frontmatter_json: string | null;\n body: string | null;\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\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 ).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 );\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 appendRevision(db: Database.Database, input: RevisionInput): number {\n const result = db\n .prepare(\n `INSERT INTO revisions (\n content_type, en_slug, locale, revision_kind, en_hash, body_hash, created_at,\n model, body_preview, frontmatter_json, body\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n input.contentType,\n input.enSlug,\n input.locale,\n input.revisionKind,\n input.enHash,\n input.bodyHash,\n input.createdAt,\n input.model ?? null,\n input.bodyPreview ?? null,\n input.frontmatterJson ?? null,\n input.body ?? null,\n );\n return Number(result.lastInsertRowid);\n}\n\n/** List revision history for an EN slug, optionally filtered by locale. */\nexport function listRevisions(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n locale?: string,\n): RevisionRow[] {\n if (locale) {\n return db\n .prepare(\n `SELECT * FROM revisions\n WHERE content_type = ? AND en_slug = ? AND locale = ?\n ORDER BY created_at DESC, id DESC`,\n )\n .all(contentType, enSlug, locale) as RevisionRow[];\n }\n return db\n .prepare(\n `SELECT * FROM revisions\n WHERE content_type = ? AND en_slug = ?\n ORDER BY created_at DESC, id DESC`,\n )\n .all(contentType, enSlug) as RevisionRow[];\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 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","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 type { ContentTypeConfig, ScribeDocument, ResolvedDocument } from \"../core/types.js\";\nimport { extractSlugFromResolvedPath, resolvePath } from \"./build-url.js\";\n\nfunction findEnDocByAlias<TDoc extends ScribeDocument>(\n slug: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n defaultLocale: string,\n): TDoc | null {\n const enIdx = allDocs.get(defaultLocale);\n if (!enIdx) return null;\n for (const doc of enIdx.bySlug.values()) {\n if (doc.aliases.includes(slug)) return doc;\n }\n return null;\n}\n\nfunction enCanonicalDoc<TDoc extends ScribeDocument>(\n doc: TDoc,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n defaultLocale: string,\n): TDoc {\n if (doc.locale === defaultLocale) return doc;\n return (allDocs.get(defaultLocale)?.bySlug.get(doc.enSlug) as TDoc | undefined) ?? doc;\n}\n\nfunction redirectPathForDocument<TDoc extends ScribeDocument>(\n doc: TDoc,\n locale: string,\n defaultLocale: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n type: ContentTypeConfig,\n): string | undefined {\n if (!type.path) return undefined;\n const enDoc = enCanonicalDoc(doc, allDocs, defaultLocale);\n if (!enDoc.redirectTo) return undefined;\n\n const targetEnSlug = extractSlugFromResolvedPath(type.path, enDoc.redirectTo);\n if (!targetEnSlug) return undefined;\n\n const targetEnDoc = allDocs.get(defaultLocale)?.bySlug.get(targetEnSlug);\n const targetSlug = targetEnDoc\n ? (getSlugForLocale(targetEnDoc, defaultLocale, locale, allDocs, defaultLocale) ?? targetEnSlug)\n : targetEnSlug;\n\n return resolvePath(type.path, targetSlug, locale, defaultLocale);\n}\n\nfunction withRedirectTo<TDoc extends ScribeDocument>(\n result: ResolvedDocument<TDoc>,\n locale: string,\n defaultLocale: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n type: ContentTypeConfig,\n): ResolvedDocument<TDoc> {\n if (result.shouldRedirectTo || !result.document) return result;\n const redirect = redirectPathForDocument(result.document, locale, defaultLocale, allDocs, type);\n if (!redirect) return result;\n return {\n document: null,\n actualLocale: result.actualLocale,\n shouldRedirectTo: redirect,\n };\n}\n\n/** Resolve a document by slug and locale (fallback, aliases, redirects). */\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): ResolvedDocument<TDoc> {\n const idx = allDocs.get(locale);\n const direct = idx?.bySlug.get(slug);\n if (direct) {\n return withRedirectTo({ document: direct, actualLocale: locale }, locale, defaultLocale, allDocs, type);\n }\n\n const aliasDoc = findEnDocByAlias(slug, allDocs, defaultLocale);\n if (aliasDoc && type.path) {\n const canonicalSlug = aliasDoc.slug;\n const localizedSlug = getSlugForLocale(aliasDoc, defaultLocale, locale, allDocs, defaultLocale);\n const targetSlug = localizedSlug ?? canonicalSlug;\n if (targetSlug !== slug) {\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: resolvePath(type.path, targetSlug, locale, defaultLocale),\n };\n }\n }\n\n for (const [docLocale, docIdx] of allDocs) {\n const found = docIdx.bySlug.get(slug);\n if (!found) continue;\n\n const correctSlug = getSlugForLocale(found, docLocale, locale, allDocs, defaultLocale);\n if (correctSlug && correctSlug !== slug) {\n if (!type.path) {\n return { document: null, actualLocale: locale };\n }\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: resolvePath(type.path, correctSlug, locale, defaultLocale),\n };\n }\n\n if (docLocale === defaultLocale) {\n return withRedirectTo(\n { document: found as TDoc, actualLocale: defaultLocale },\n locale,\n defaultLocale,\n allDocs,\n type,\n );\n }\n\n if (!type.path) {\n return { document: null, actualLocale: locale };\n }\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: resolvePath(type.path, found.enSlug, locale, defaultLocale),\n };\n }\n\n if (locale !== defaultLocale) {\n const enDoc = allDocs.get(defaultLocale)?.bySlug.get(slug);\n if (enDoc && type.indexFallback === \"en\") {\n return withRedirectTo(\n { document: enDoc as TDoc, actualLocale: defaultLocale },\n locale,\n defaultLocale,\n allDocs,\n type,\n );\n }\n const byEn = idx?.byEnSlug.get(slug);\n if (byEn) {\n return withRedirectTo(\n { document: byEn as TDoc, actualLocale: locale },\n locale,\n defaultLocale,\n allDocs,\n type,\n );\n }\n const fallback = allDocs.get(defaultLocale)?.bySlug.get(slug);\n if (fallback && type.indexFallback === \"en\") {\n return withRedirectTo(\n { document: fallback as TDoc, actualLocale: defaultLocale },\n locale,\n defaultLocale,\n allDocs,\n type,\n );\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 { 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 (enDoc.redirectTo) return false;\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 { ContentTypeConfig, ScribeProject } from \"../core/types.js\";\nimport { buildGlobalAliasIndex } from \"../core/slug-aliases.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { buildRedirectTranslationIndex } from \"./translation-index.js\";\nimport type { NextRedirectRule } from \"./types.js\";\nimport { extractSlugFromResolvedPath, isRoutableType, resolvePath } from \"../i18n/build-url.js\";\n\nexport interface BuildRedirectsOptions {\n /** Locales that use a URL prefix (excludes default locale). */\n prefixedLocales: string[];\n}\n\nfunction buildAliasRedirects(\n type: ContentTypeConfig,\n aliasIndex: ReturnType<typeof buildGlobalAliasIndex>,\n translationIndex: Map<string, Map<string, string>>,\n prefixedLocales: string[],\n defaultLocale: string,\n): NextRedirectRule[] {\n const out: NextRedirectRule[] = [];\n const { aliasToTarget } = aliasIndex;\n const pathTemplate = type.path!;\n\n for (const [alias, target] of aliasToTarget) {\n if (target.contentTypeId !== type.id) continue;\n\n const canonical = target.canonicalSlug;\n\n out.push({\n source: resolvePath(pathTemplate, alias, defaultLocale, defaultLocale),\n destination: resolvePath(pathTemplate, canonical, defaultLocale, defaultLocale),\n permanent: true,\n });\n\n for (const locale of prefixedLocales) {\n const localeMap = translationIndex.get(locale);\n const toLocale = localeMap?.get(canonical) ?? canonical;\n const fromLocale = localeMap?.get(alias);\n\n if (fromLocale) {\n out.push({\n source: resolvePath(pathTemplate, fromLocale, locale, defaultLocale),\n destination: resolvePath(pathTemplate, toLocale, locale, defaultLocale),\n permanent: true,\n });\n }\n\n out.push({\n source: resolvePath(pathTemplate, alias, locale, defaultLocale),\n destination: resolvePath(pathTemplate, toLocale, locale, defaultLocale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildAliasLegacyNoBlogPathRedirects(\n type: ContentTypeConfig,\n aliasIndex: ReturnType<typeof buildGlobalAliasIndex>,\n translationIndex: Map<string, Map<string, string>>,\n prefixedLocales: string[],\n defaultLocale: string,\n): NextRedirectRule[] {\n if (type.id !== \"blog\") return [];\n\n const out: NextRedirectRule[] = [];\n\n for (const [alias, target] of aliasIndex.aliasToTarget) {\n if (target.contentTypeId !== type.id) continue;\n\n for (const locale of prefixedLocales) {\n const localeMap = translationIndex.get(locale);\n const toLocale = localeMap?.get(target.canonicalSlug) ?? target.canonicalSlug;\n out.push({\n source: `/${locale}/${alias}`,\n destination: resolvePath(type.path!, toLocale, locale, defaultLocale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildRedirectToRules(\n type: ContentTypeConfig,\n config: ScribeProject[\"config\"],\n translationIndex: Map<string, Map<string, string>>,\n prefixedLocales: string[],\n defaultLocale: string,\n): NextRedirectRule[] {\n const out: NextRedirectRule[] = [];\n const pathTemplate = type.path!;\n\n for (const enSlug of listEnSlugs(config.rootDir, type.contentDir)) {\n const doc = readEnDocument(config, type, enSlug);\n if (!doc?.redirectTo) continue;\n\n out.push({\n source: resolvePath(pathTemplate, enSlug, defaultLocale, defaultLocale),\n destination: doc.redirectTo,\n permanent: true,\n });\n\n for (const locale of prefixedLocales) {\n const localeMap = translationIndex.get(locale);\n const fromLocale = localeMap?.get(enSlug);\n if (!fromLocale) continue;\n\n const targetEnSlug = extractSlugFromResolvedPath(pathTemplate, doc.redirectTo);\n if (!targetEnSlug) continue;\n const toLocale = localeMap?.get(targetEnSlug) ?? targetEnSlug;\n out.push({\n source: resolvePath(pathTemplate, fromLocale, locale, defaultLocale),\n destination: resolvePath(pathTemplate, toLocale, locale, defaultLocale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildCrossLocaleSlugRedirects(\n type: ContentTypeConfig,\n translationIndex: Map<string, Map<string, string>>,\n aliasSourceSlugs: Set<string>,\n defaultLocale: string,\n): NextRedirectRule[] {\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 (aliasSourceSlugs.has(enSlug)) continue;\n out.push({\n source: resolvePath(pathTemplate, enSlug, locale, defaultLocale),\n destination: resolvePath(pathTemplate, translatedSlug, locale, defaultLocale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\n/** Legacy inbound links that omit `/blog/` (blog-only). */\nfunction buildLegacyNoBlogPathRedirects(\n type: ContentTypeConfig,\n config: ScribeProject[\"config\"],\n translationIndex: Map<string, Map<string, string>>,\n prefixedLocales: string[],\n defaultLocale: string,\n): NextRedirectRule[] {\n if (type.id !== \"blog\") return [];\n\n const out: NextRedirectRule[] = [];\n const enSlugs = listEnSlugs(config.rootDir, type.contentDir);\n const pathTemplate = type.path!;\n\n for (const enSlug of enSlugs) {\n out.push({\n source: `/${enSlug}`,\n destination: resolvePath(pathTemplate, enSlug, defaultLocale, defaultLocale),\n permanent: true,\n });\n\n for (const locale of prefixedLocales) {\n const translatedSlug = translationIndex.get(locale)?.get(enSlug);\n const canonicalSlug = translatedSlug ?? enSlug;\n out.push({\n source: `/${locale}/${enSlug}`,\n destination: resolvePath(pathTemplate, canonicalSlug, locale, defaultLocale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildTypeRedirects(\n project: ScribeProject,\n typeId: string,\n aliasIndex: ReturnType<typeof buildGlobalAliasIndex>,\n options: BuildRedirectsOptions,\n): NextRedirectRule[] {\n const type = project.getType(typeId).config;\n if (!isRoutableType(type)) return [];\n\n const { defaultLocale } = project.config;\n const translationIndex = buildRedirectTranslationIndex(project, typeId);\n const aliasSourceSlugs = new Set<string>();\n for (const [alias, target] of aliasIndex.aliasToTarget) {\n if (target.contentTypeId === typeId) aliasSourceSlugs.add(alias);\n }\n\n return [\n ...buildAliasRedirects(type, aliasIndex, translationIndex, options.prefixedLocales, defaultLocale),\n ...buildAliasLegacyNoBlogPathRedirects(\n type,\n aliasIndex,\n translationIndex,\n options.prefixedLocales,\n defaultLocale,\n ),\n ...buildRedirectToRules(type, project.config, translationIndex, options.prefixedLocales, defaultLocale),\n ...buildCrossLocaleSlugRedirects(type, translationIndex, aliasSourceSlugs, defaultLocale),\n ...buildLegacyNoBlogPathRedirects(type, project.config, translationIndex, options.prefixedLocales, defaultLocale),\n ];\n}\n\n/** Build Next.js redirect rules from aliases, redirect_to, and locale slug fixes. */\nexport function buildAllContentRedirects(\n project: ScribeProject,\n options: BuildRedirectsOptions,\n): NextRedirectRule[] {\n const aliasIndex = buildGlobalAliasIndex(project);\n const out: NextRedirectRule[] = [];\n\n for (const type of project.config.types) {\n if (!isRoutableType(type)) continue;\n out.push(...buildTypeRedirects(project, type.id, aliasIndex, options));\n }\n\n return out;\n}\n\nexport interface RedirectSourceSlugs {\n /** All alias slugs (inbound old slugs) — exclude from sitemap. */\n aliasSlugs: Set<string>;\n /** EN canonical slugs with outbound redirect_to — exclude from sitemap. */\n outboundByType: Map<string, Set<string>>;\n}\n\n/** Slugs excluded from sitemap (aliases and outbound redirect_to sources). */\nexport function getRedirectSourceSlugs(project: ScribeProject): RedirectSourceSlugs {\n const aliasIndex = buildGlobalAliasIndex(project);\n const outboundByType = new Map<string, Set<string>>();\n\n for (const type of project.config.types) {\n const outbound = new Set<string>();\n for (const enSlug of listEnSlugs(project.config.rootDir, type.contentDir)) {\n const doc = readEnDocument(project.config, type, enSlug);\n if (doc?.redirectTo) outbound.add(enSlug);\n }\n outboundByType.set(type.id, outbound);\n }\n\n return {\n aliasSlugs: aliasIndex.allAliasSlugs,\n outboundByType,\n };\n}\n","import { extractSlugFromResolvedPath } from \"../i18n/build-url.js\";\nimport type { ScribeProject } from \"./types.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { enFileExists, isAliasKnown, listEnSlugs } from \"./alias-helpers.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\n\nexport interface AliasTarget {\n contentTypeId: string;\n canonicalSlug: string;\n path: string;\n}\n\nexport interface AliasIndexIssue {\n contentTypeId: string;\n enSlug: string;\n field: string;\n message: string;\n level: \"error\" | \"warning\" | \"info\";\n}\n\nexport interface GlobalAliasIndex {\n aliasToTarget: Map<string, AliasTarget>;\n allAliasSlugs: Set<string>;\n issues: AliasIndexIssue[];\n}\n\n/**\n * Build a global alias → canonical map across every registered content type.\n */\nexport function buildGlobalAliasIndex(project: ScribeProject): GlobalAliasIndex {\n const { config } = project;\n const aliasToTarget = new Map<string, AliasTarget>();\n const allAliasSlugs = new Set<string>();\n const issues: AliasIndexIssue[] = [];\n\n const canonicalSlugsByType = new Map<string, Set<string>>();\n\n for (const type of config.types) {\n const slugs = listEnSlugs(config.rootDir, type.contentDir);\n canonicalSlugsByType.set(type.id, new Set(slugs));\n }\n\n for (const type of config.types) {\n if (!type.path) continue;\n const canonicalSlugs = canonicalSlugsByType.get(type.id) ?? new Set<string>();\n\n for (const enSlug of canonicalSlugs) {\n const doc = readEnDocument(config, type, enSlug);\n if (!doc) continue;\n\n for (const alias of doc.aliases) {\n if (alias === enSlug) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" must not equal the canonical slug`,\n level: \"error\",\n });\n continue;\n }\n\n if (canonicalSlugs.has(alias)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" collides with another document's canonical slug`,\n level: \"error\",\n });\n continue;\n }\n\n const existing = aliasToTarget.get(alias);\n if (existing) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" is already claimed by ${existing.contentTypeId}/${existing.canonicalSlug}`,\n level: \"error\",\n });\n continue;\n }\n\n aliasToTarget.set(alias, {\n contentTypeId: type.id,\n canonicalSlug: enSlug,\n path: type.path!,\n });\n allAliasSlugs.add(alias);\n }\n }\n }\n\n return { aliasToTarget, allAliasSlugs, issues };\n}\n\n/** Warnings and info for registered aliases (unknown, orphan EN files, sqlite history, locale gaps). */\nexport function validateAliasCoverage(project: ScribeProject): AliasIndexIssue[] {\n const { config } = project;\n const { aliasToTarget } = buildGlobalAliasIndex(project);\n const issues: AliasIndexIssue[] = [];\n const db = openStore(config, \"readonly\");\n\n try {\n for (const [alias, target] of aliasToTarget) {\n const type = config.types.find((t) => t.id === target.contentTypeId);\n if (!type) continue;\n\n const known = isAliasKnown(config, type, alias, db);\n\n if (!known) {\n issues.push({\n contentTypeId: type.id,\n enSlug: target.canonicalSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" is unknown (no EN file or sqlite translations) — only EN redirect will work`,\n level: \"warning\",\n });\n }\n\n if (enFileExists(config, type, alias)) {\n issues.push({\n contentTypeId: type.id,\n enSlug: target.canonicalSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" still has an EN file on disk — delete it manually`,\n level: \"warning\",\n });\n }\n\n const sqliteRows = listTranslationsForEnSlug(db, type.id, alias);\n if (sqliteRows.length > 0) {\n issues.push({\n contentTypeId: type.id,\n enSlug: target.canonicalSlug,\n field: \"aliases\",\n message: `${sqliteRows.length} sqlite translation(s) for alias \"${alias}\" retained for locale redirects and history`,\n level: \"info\",\n });\n }\n\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n\n const canonicalRow = listTranslationsForEnSlug(db, type.id, target.canonicalSlug).find(\n (r) => r.locale === locale,\n );\n if (!canonicalRow) continue;\n\n const aliasRow = sqliteRows.find((r) => r.locale === locale);\n\n if (!aliasRow && known) {\n issues.push({\n contentTypeId: type.id,\n enSlug: target.canonicalSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" has no locale slug mapping for ${locale} — old localized URL may miss redirect`,\n level: \"warning\",\n });\n }\n }\n }\n } finally {\n db.close();\n }\n\n return issues;\n}\n\n/** Detect redirect chains involving aliases or redirect_to. */\nexport function validateAliasRedirectChains(project: ScribeProject): AliasIndexIssue[] {\n const { config } = project;\n const { aliasToTarget, allAliasSlugs } = buildGlobalAliasIndex(project);\n const issues: AliasIndexIssue[] = [];\n\n for (const [alias, target] of aliasToTarget) {\n const doc = readEnDocument(\n config,\n project.getType(target.contentTypeId).config,\n target.canonicalSlug,\n );\n if (doc?.redirectTo) {\n issues.push({\n contentTypeId: target.contentTypeId,\n enSlug: target.canonicalSlug,\n field: \"aliases\",\n message: `Alias \"${alias}\" points at \"${target.canonicalSlug}\" which has redirect_to — resolve to the final canonical slug`,\n level: \"error\",\n });\n }\n }\n\n for (const type of config.types) {\n if (!type.path) continue;\n for (const enSlug of listEnSlugs(config.rootDir, type.contentDir)) {\n const doc = readEnDocument(config, type, enSlug);\n if (!doc?.redirectTo) continue;\n\n const targetSlug = extractSlugFromResolvedPath(type.path, doc.redirectTo);\n if (targetSlug && allAliasSlugs.has(targetSlug)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: \"redirect_to\",\n message: `redirect_to target \"${targetSlug}\" is an alias slug — chain detected`,\n level: \"error\",\n });\n }\n\n const targetDoc = targetSlug ? readEnDocument(config, type, targetSlug) : null;\n if (targetDoc?.redirectTo) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: \"redirect_to\",\n message: `redirect_to chain detected: \"${enSlug}\" → \"${targetSlug}\" → \"${targetDoc.redirectTo}\"`,\n level: \"error\",\n });\n }\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type Database from \"better-sqlite3\";\nimport type { ContentTypeConfig, ScribeConfig } from \"./types.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\n\nexport function enFileExists(\n config: ScribeConfig,\n type: ContentTypeConfig,\n enSlug: string,\n): boolean {\n const dir = path.join(config.rootDir, type.contentDir);\n return (\n fs.existsSync(path.join(dir, `${enSlug}.mdx`)) ||\n fs.existsSync(path.join(dir, `${enSlug}.md`))\n );\n}\n\nexport function sqliteHasTranslations(\n db: Database.Database,\n contentTypeId: string,\n enSlug: string,\n): boolean {\n return listTranslationsForEnSlug(db, contentTypeId, enSlug).length > 0;\n}\n\nexport function isAliasKnown(\n config: ScribeConfig,\n type: ContentTypeConfig,\n aliasEnSlug: string,\n db: Database.Database,\n): boolean {\n return enFileExists(config, type, aliasEnSlug) || sqliteHasTranslations(db, type.id, aliasEnSlug);\n}\n\nexport function listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n","import type { ScribeProject } from \"../core/types.js\";\nimport { buildGlobalAliasIndex } from \"../core/slug-aliases.js\";\nimport { buildTranslationIndex } from \"../i18n/translation-index.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\n\n/** Merged en_slug → locale slug map for redirect expansion (loader + orphan sqlite alias rows). */\nexport function buildRedirectTranslationIndex(\n project: ScribeProject,\n typeId: 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 { aliasToTarget } = buildGlobalAliasIndex(project);\n const db = openStore(project.config, \"readonly\");\n\n try {\n for (const [alias, target] of aliasToTarget) {\n if (target.contentTypeId !== typeId) continue;\n\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","import type { AllDocuments } from \"../core/types.js\";\n\n/**\n * Internal: locale → (en_slug → locale slug) map for all non-default locales.\n * Consumed by `staticParams()`, `alternates()`, and redirect expansion.\n */\nexport function buildTranslationIndex(\n allDocs: AllDocuments,\n locales: readonly string[],\n defaultLocale: string,\n): Map<string, Map<string, string>> {\n const index = new Map<string, Map<string, string>>();\n for (const locale of locales) {\n if (locale === defaultLocale) continue;\n const idx = allDocs.get(locale);\n if (!idx) continue;\n const localeMap = new Map<string, string>();\n for (const [enSlug, doc] of idx.byEnSlug) {\n localeMap.set(enSlug, doc.slug);\n }\n index.set(locale, localeMap);\n }\n return index;\n}\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 fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport type { ScribeConfig, ScribeConfigInput } from \"../core/types.js\";\nimport { resolveConfig } from \"./resolve-config.js\";\n\nexport interface LoadConfigOptions {\n configPath?: string;\n cwd?: string;\n}\n\n/** Find scribe.config.ts/mts/js in a directory. */\nexport function findConfigPath(cwd: string): string | null {\n const candidates = [\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.ts\"),\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.mts\"),\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.js\"),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {\n return candidate;\n }\n }\n return null;\n}\n\n/** Load and resolve scribe.config.ts synchronously (CLI). */\nexport function loadConfigSync(options: LoadConfigOptions = {}): ScribeConfig {\n const cwd = options.cwd ?? /* turbopackIgnore: true */ process.cwd();\n const configPath = options.configPath ?? findConfigPath(cwd);\n if (!configPath) {\n throw new Error(`No scribe.config.ts found in ${cwd} (pass --config)`);\n }\n\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n moduleCache: false,\n });\n\n const loaded = jiti(configPath) as ScribeConfigInput | { default: ScribeConfigInput };\n const config = \"default\" in loaded ? loaded.default : loaded;\n if (!config?.rootDir) {\n throw new Error(`Invalid scribe config at ${configPath}: missing rootDir`);\n }\n return resolveConfig(config, path.dirname(configPath));\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { createProject } from \"../create-project.js\";\nimport {\n buildGlobalAliasIndex,\n validateAliasCoverage,\n validateAliasRedirectChains,\n} from \"../core/slug-aliases.js\";\nimport { validateLocaleBuiltinFields } from \"../core/builtin-fields.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { isRoutableType } from \"../i18n/build-url.js\";\nimport { getTranslation } from \"../storage/translations.js\";\nimport { validateRelations } from \"./validate-relations.js\";\nimport { validateDocumentAssets } from \"./validate-assets.js\";\nimport { validateTranslationSlugSuffixes } from \"./validate-slug-suffix.js\";\n\nexport interface ValidateIssue {\n level: \"error\" | \"warning\" | \"info\";\n contentType?: string;\n enSlug?: string;\n locale?: string;\n field?: string;\n message: string;\n}\n\nexport interface ValidateResult {\n ok: boolean;\n issues: ValidateIssue[];\n}\n\nfunction listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\n/** Validate EN files, SQLite consistency, relations, aliases, slug rules, and assets. */\nexport function validateProject(config: ScribeConfig): ValidateResult {\n const issues: ValidateIssue[] = [];\n const project = createProject(config);\n const storePath = project.storePath;\n\n if (!fs.existsSync(storePath)) {\n issues.push({\n level: \"error\",\n message: `Missing store.sqlite at ${storePath}`,\n });\n return { ok: false, issues };\n }\n\n const db = openStore(config, \"readonly\");\n\n for (const type of config.types) {\n const enSlugs = listEnSlugs(config.rootDir, type.contentDir);\n const englishSlugs = new Set(enSlugs);\n\n if (!type.translate && isRoutableType(type)) {\n issues.push({\n level: \"warning\",\n contentType: type.id,\n message: `No translate config on content type \"${type.id}\" — using Scribe defaults`,\n });\n }\n\n for (const enSlug of enSlugs) {\n const enDoc = readEnDocument(config, type, enSlug);\n if (!enDoc) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n message: \"Failed to parse EN document\",\n });\n continue;\n }\n\n const crossIssues =\n type.crossValidate?.(enDoc.frontmatter as never, {\n locale: config.defaultLocale,\n defaultLocale: config.defaultLocale,\n slug: enSlug,\n enSlug,\n knownLocales: config.locales,\n englishSlugs,\n }) ?? [];\n for (const issue of crossIssues) {\n issues.push({\n level: issue.level,\n contentType: type.id,\n enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n for (const issue of validateDocumentAssets(config, {\n contentType: type.id,\n enSlug,\n frontmatter: enDoc.frontmatter,\n body: enDoc.content,\n })) {\n issues.push(issue);\n }\n\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const row = getTranslation(db, type.id, enSlug, locale);\n if (!row) continue;\n\n const localeFm = JSON.parse(row.frontmatter_json) as Record<string, unknown>;\n for (const issue of validateLocaleBuiltinFields(localeFm)) {\n issues.push({\n level: issue.level,\n contentType: type.id,\n enSlug,\n locale,\n field: issue.field,\n message: issue.message,\n });\n }\n\n for (const issue of validateDocumentAssets(config, {\n contentType: type.id,\n enSlug,\n locale,\n frontmatter: localeFm,\n body: row.body,\n })) {\n issues.push(issue);\n }\n }\n }\n\n try {\n project.getType(type.id).load();\n } catch (error) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n db.close();\n\n const aliasIndex = buildGlobalAliasIndex(project);\n for (const issue of aliasIndex.issues) {\n issues.push({\n level: issue.level,\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n for (const issue of validateAliasRedirectChains(project)) {\n issues.push({\n level: issue.level,\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n for (const issue of validateAliasCoverage(project)) {\n issues.push({\n level: issue.level,\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n for (const issue of validateRelations(project)) {\n issues.push({\n level: issue.level,\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n const dbForSuffix = openStore(config, \"readonly\");\n try {\n for (const issue of validateTranslationSlugSuffixes(config, dbForSuffix)) {\n issues.push({\n level: \"error\",\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n locale: issue.locale,\n field: \"slug\",\n message: issue.message,\n });\n }\n } finally {\n dbForSuffix.close();\n }\n\n return { ok: issues.every((i) => i.level !== \"error\"), issues };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig, ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { listRelationFields } from \"../core/introspect-schema.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\n\nexport interface RelationValidateIssue {\n contentTypeId: string;\n enSlug: string;\n locale?: string;\n field: string;\n message: string;\n /**\n * Dangling required single relations are errors (`related()` would throw at\n * render); dangling optional/multiple relations degrade gracefully to\n * null/dropped items, so they only warn.\n */\n level: \"error\" | \"warning\";\n}\n\nfunction getAtPath(obj: Record<string, unknown>, fieldPath: string[]): unknown {\n let current: unknown = obj;\n for (const segment of fieldPath) {\n if (typeof current !== \"object\" || current === null || Array.isArray(current)) return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nfunction buildEnSlugIndex(config: ScribeConfig): Map<string, Set<string>> {\n const index = new Map<string, Set<string>>();\n for (const type of config.types) {\n const slugs = new Set(listEnSlugs(config.rootDir, type.contentDir));\n index.set(type.id, slugs);\n }\n return index;\n}\n\nfunction listEnSlugsForType(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\n/**\n * Warn when a relation field references a slug that does not exist in the target type.\n */\nexport function validateRelations(project: ScribeProject): RelationValidateIssue[] {\n const { config } = project;\n const slugIndex = buildEnSlugIndex(config);\n const issues: RelationValidateIssue[] = [];\n\n const typeIds = new Set(config.types.map((t) => t.id));\n\n for (const type of config.types) {\n const relationFields = listRelationFields(type.schema);\n if (relationFields.length === 0) continue;\n\n for (const enSlug of listEnSlugsForType(config.rootDir, type.contentDir)) {\n const doc = readEnDocument(config, type, enSlug);\n if (!doc) continue;\n\n for (const fieldMeta of relationFields) {\n const targetTypeId = fieldMeta.relationTarget!;\n const danglingLevel =\n fieldMeta.relationOptional || fieldMeta.relationMultiple ? \"warning\" : \"error\";\n if (!typeIds.has(targetTypeId)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: fieldMeta.path.join(\".\"),\n message: `Relation target type \"${targetTypeId}\" is not registered`,\n level: \"error\",\n });\n continue;\n }\n\n const value = getAtPath(doc.frontmatter as Record<string, unknown>, fieldMeta.path);\n if (value === undefined || value === null || value === \"\") continue;\n\n const targetSlugs = slugIndex.get(targetTypeId) ?? new Set<string>();\n const fieldLabel = fieldMeta.path.join(\".\");\n\n if (fieldMeta.relationMultiple) {\n if (!Array.isArray(value)) continue;\n for (const slug of value) {\n if (typeof slug !== \"string\" || !slug) continue;\n if (!targetSlugs.has(slug)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: fieldLabel,\n message: `${fieldLabel} references \"${slug}\" — no ${targetTypeId} doc with that slug`,\n level: danglingLevel,\n });\n }\n }\n } else if (typeof value === \"string\") {\n if (!targetSlugs.has(value)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: fieldLabel,\n message: `${fieldLabel} references \"${value}\" — no ${targetTypeId} doc with slug \"${value}\"`,\n level: danglingLevel,\n });\n }\n }\n }\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig } from \"../core/types.js\";\n\nconst IMAGE_EXT = String.raw`(?:png|jpe?g|webp|gif|svg)`;\nconst IMAGE_WEB_PATH = String.raw`\\/[\\w\\-./]+\\.${IMAGE_EXT}`;\nconst MARKDOWN_IMAGE_RE = new RegExp(\n String.raw`!\\[[^\\]]*\\]\\((${IMAGE_WEB_PATH})\\)`,\n \"gi\",\n);\nconst HTML_SRC_RE = new RegExp(String.raw`src=[\"'](${IMAGE_WEB_PATH})[\"']`, \"gi\");\n\nfunction isImageWebPath(value: string): boolean {\n return new RegExp(String.raw`^${IMAGE_WEB_PATH}$`, \"i\").test(value);\n}\n\nfunction isSiteAssetPath(webPath: string): boolean {\n const segment = webPath.split(\"/\")[1];\n return Boolean(segment && !segment.includes(\".\"));\n}\n\nfunction addImagePath(webPath: string, out: Set<string>): void {\n if (isSiteAssetPath(webPath)) out.add(webPath);\n}\n\nfunction collectBodyImagePaths(body: string, out: Set<string>): void {\n for (const re of [MARKDOWN_IMAGE_RE, HTML_SRC_RE]) {\n for (const match of body.matchAll(re)) {\n addImagePath(match[1]!, out);\n }\n }\n}\n\nfunction collectFrontmatterImagePaths(value: unknown, out: Set<string>): void {\n if (typeof value === \"string\") {\n if (isImageWebPath(value)) addImagePath(value, out);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) collectFrontmatterImagePaths(item, out);\n return;\n }\n if (value && typeof value === \"object\") {\n for (const nested of Object.values(value as Record<string, unknown>)) {\n collectFrontmatterImagePaths(nested, out);\n }\n }\n}\n\n/** Collect absolute web paths to image assets from frontmatter values and MDX body. */\nexport function collectImagePaths(frontmatter: unknown, body: string): string[] {\n const paths = new Set<string>();\n collectFrontmatterImagePaths(frontmatter, paths);\n collectBodyImagePaths(body, paths);\n return [...paths].sort();\n}\n\nfunction assetFilePath(assetsPath: string, webPath: string): string {\n return path.join(assetsPath, webPath.replace(/^\\//, \"\"));\n}\n\nexport interface AssetValidateIssue {\n level: \"warning\";\n contentType?: string;\n enSlug?: string;\n locale?: string;\n field?: string;\n message: string;\n}\n\n/** Warn when referenced image paths are missing from the configured assets folder. */\nexport function validateDocumentAssets(\n config: ScribeConfig,\n input: {\n contentType: string;\n enSlug: string;\n locale?: string;\n frontmatter: unknown;\n body: string;\n },\n): AssetValidateIssue[] {\n const assetsPath = config.assetsPath;\n if (!assetsPath) return [];\n\n const issues: AssetValidateIssue[] = [];\n for (const webPath of collectImagePaths(input.frontmatter, input.body)) {\n const filePath = assetFilePath(assetsPath, webPath);\n if (fs.existsSync(filePath)) continue;\n issues.push({\n level: \"warning\",\n contentType: input.contentType,\n enSlug: input.enSlug,\n locale: input.locale,\n field: \"asset\",\n message: `Missing image asset ${webPath} (expected ${filePath})`,\n });\n }\n return issues;\n}\n","import type Database from \"better-sqlite3\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { bulkLoadTranslations } from \"../storage/translations.js\";\n\nexport interface SlugSuffixIssue {\n contentTypeId: string;\n enSlug: string;\n locale: string;\n slug: string;\n message: string;\n}\n\n/** GEN-241: translated slugs must not end with a locale code suffix. */\nexport function validateTranslationSlugSuffixes(\n config: ScribeConfig,\n db: Database.Database,\n): SlugSuffixIssue[] {\n const issues: SlugSuffixIssue[] = [];\n const localeCodes = config.locales.filter((l) => l !== config.defaultLocale);\n\n for (const row of bulkLoadTranslations(db)) {\n if (row.locale === config.defaultLocale) continue;\n\n for (const code of localeCodes) {\n if (row.slug.endsWith(`-${code}`)) {\n issues.push({\n contentTypeId: row.content_type,\n enSlug: row.en_slug,\n locale: row.locale,\n slug: row.slug,\n message: `Translation slug \"${row.slug}\" ends with locale code \"-${code}\"`,\n });\n break;\n }\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { computePageEnHash } from \"../hash/page-hash.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../loader/create-loader.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getTranslation } from \"../storage/translations.js\";\n\nexport interface TranslationWorkItem {\n contentType: string;\n enSlug: string;\n locale: string;\n reason: \"missing\" | \"stale\";\n currentEnHash: string;\n storedEnHash?: string;\n}\n\nexport type TranslationWorklistStrategy = \"all\" | \"missing-only\";\n\nexport interface WorklistOptions {\n contentType?: string;\n locales?: string[];\n enSlug?: string;\n /** Which pages to include: all stale/missing (default) or missing only. */\n strategy?: TranslationWorklistStrategy;\n}\n\nfunction listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\n/** List locale pages that are missing or stale vs current EN content. */\nexport function buildWorklist(config: ScribeConfig, options: WorklistOptions = {}): TranslationWorkItem[] {\n const db = openStore(config, \"readonly\");\n const items: TranslationWorkItem[] = [];\n const locales =\n options.locales ??\n config.locales.filter((locale) => locale !== config.defaultLocale);\n\n for (const type of config.types) {\n if (options.contentType && type.id !== options.contentType) continue;\n const enSlugs = options.enSlug ? [options.enSlug] : listEnSlugs(config.rootDir, type.contentDir);\n\n for (const enSlug of enSlugs) {\n const enDoc = readEnDocument(config, type, enSlug);\n if (!enDoc) continue;\n const payload = getTranslatablePayload(enDoc, type);\n const currentEnHash = computePageEnHash(payload.frontmatter, payload.body);\n\n for (const locale of locales) {\n if (locale === config.defaultLocale) continue;\n const existing = getTranslation(db, type.id, enSlug, locale);\n if (!existing) {\n items.push({\n contentType: type.id,\n enSlug,\n locale,\n reason: \"missing\",\n currentEnHash,\n });\n continue;\n }\n if (existing.en_hash !== currentEnHash) {\n items.push({\n contentType: type.id,\n enSlug,\n locale,\n reason: \"stale\",\n currentEnHash,\n storedEnHash: existing.en_hash,\n });\n }\n }\n }\n }\n\n db.close();\n const strategy = options.strategy ?? \"all\";\n if (strategy === \"missing-only\") {\n return items.filter((item) => item.reason === \"missing\");\n }\n return items;\n}\n\n/** Resolve target locales from CLI flags or a named preset. */\nexport function resolveLocalesFromPreset(\n config: ScribeConfig,\n preset?: string,\n explicitLocales?: string[],\n): string[] {\n if (explicitLocales?.length) return explicitLocales;\n if (preset && config.localePresets?.[preset]) {\n return config.localePresets[preset]!.filter((l) => l !== config.defaultLocale);\n }\n return config.locales.filter((l) => l !== config.defaultLocale);\n}\n","import { createHash } from \"node:crypto\";\n\n/** SHA-256 hex digest of a UTF-8 string. */\nexport function sha256(input: string): string {\n return createHash(\"sha256\").update(input, \"utf8\").digest(\"hex\");\n}\n\n/** Hash translatable frontmatter + body for translation staleness detection. */\nexport function computePageEnHash(\n translatableFrontmatter: Record<string, unknown>,\n body: string,\n): string {\n const payload = JSON.stringify({ frontmatter: translatableFrontmatter, body });\n return sha256(payload);\n}\n\n/** Hash MDX body content for revision tracking. */\nexport function computeBodyHash(body: string): string {\n return sha256(body);\n}\n","import type { ScribeConfig, ScribeDocument } from \"../core/types.js\";\nimport { computePageEnHash } from \"../hash/page-hash.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../loader/create-loader.js\";\nimport { recordRevision } from \"../history/record-revision.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getTranslation, upsertTranslation } from \"../storage/translations.js\";\nimport { translatePageWithGemini } from \"./gemini-client.js\";\nimport { estimateTranslationCostUsd } from \"./gemini-pricing.js\";\nimport { normalizeGeminiDisplayName } from \"./gemini-models.js\";\nimport { buildPageTranslationPrompt } from \"./prompts/translation-prompt.js\";\nimport { buildGeminiResponseSchema } from \"./response-schema.js\";\nimport { resolveTranslateConfig } from \"./resolve-translate-config.js\";\nimport { validateTranslatedFrontmatter } from \"./validate-translation.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\nexport interface TranslatePageResult {\n contentType: string;\n enSlug: string;\n locale: string;\n skipped: boolean;\n failed?: boolean;\n reason?: \"fresh\";\n model?: string;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n };\n estimatedCostUsd?: number;\n durationMs?: number;\n error?: string;\n}\n\nexport interface TranslateWorklistTotals {\n translated: number;\n skipped: number;\n failed: number;\n inputTokens: number;\n outputTokens: number;\n estimatedCostUsd: number;\n durationMs: number;\n}\n\nexport type TranslateProgressEvent =\n | { type: \"start\"; total: number; concurrency: number; dryRun: boolean; model?: string }\n | { type: \"item-start\"; item: TranslationWorkItem; active: string[] }\n | { type: \"item-done\"; result: TranslatePageResult }\n | { type: \"done\"; results: TranslatePageResult[]; totals: TranslateWorklistTotals };\n\nfunction summarizeResults(results: TranslatePageResult[], durationMs: number): TranslateWorklistTotals {\n return results.reduce<TranslateWorklistTotals>(\n (totals, result) => {\n if (result.failed) totals.failed += 1;\n else if (result.skipped) totals.skipped += 1;\n else totals.translated += 1;\n\n totals.inputTokens += result.usage?.inputTokens ?? 0;\n totals.outputTokens += result.usage?.outputTokens ?? 0;\n totals.estimatedCostUsd += result.estimatedCostUsd ?? 0;\n return totals;\n },\n {\n translated: 0,\n skipped: 0,\n failed: 0,\n inputTokens: 0,\n outputTokens: 0,\n estimatedCostUsd: 0,\n durationMs,\n },\n );\n}\n\nfunction formatTranslateError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n try {\n const parsed = JSON.parse(message) as { error?: { message?: string } };\n if (parsed.error?.message) return parsed.error.message;\n } catch {\n // not JSON\n }\n const embedded = message.match(/\"message\"\\s*:\\s*\"((?:\\\\.|[^\"\\\\])*)\"/);\n if (embedded?.[1]) {\n return embedded[1].replace(/\\\\\"/g, '\"').replace(/\\\\n/g, \"\\n\");\n }\n return message.length > 160 ? `${message.slice(0, 157)}…` : message;\n}\n\nasync function runPool<T>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<void>,\n): Promise<void> {\n if (items.length === 0) return;\n let nextIndex = 0;\n const runners = Array.from({ length: Math.min(concurrency, items.length) }, async () => {\n while (nextIndex < items.length) {\n const index = nextIndex++;\n await worker(items[index]!, index);\n }\n });\n await Promise.all(runners);\n}\n\nfunction resolveContextLabel(enDoc: ScribeDocument, enSlug: string): string {\n const fm = enDoc.frontmatter as Record<string, unknown>;\n for (const key of [\"title\", \"name\", \"h1\"]) {\n const value = fm[key];\n if (typeof value === \"string\" && value.trim()) return value;\n }\n return enSlug;\n}\n\n/** Translate one locale page via Gemini and upsert into SQLite. */\nexport async function translatePage(\n config: ScribeConfig,\n item: TranslationWorkItem,\n options: { model?: string; dryRun?: boolean; force?: boolean } = {},\n): Promise<TranslatePageResult> {\n const startedAt = Date.now();\n const base = {\n contentType: item.contentType,\n enSlug: item.enSlug,\n locale: item.locale,\n };\n\n try {\n const type = config.types.find((t) => t.id === item.contentType);\n if (!type) throw new Error(`Unknown content type ${item.contentType}`);\n\n const enDoc = readEnDocument(config, type, item.enSlug);\n if (!enDoc) throw new Error(`EN document not found: ${item.enSlug}`);\n\n const payload = getTranslatablePayload(enDoc, type);\n const currentEnHash = computePageEnHash(payload.frontmatter, payload.body);\n\n const db = openStore(config, \"readonly\");\n const existing = getTranslation(db, type.id, item.enSlug, item.locale);\n db.close();\n\n if (!options.force && existing && existing.en_hash === currentEnHash) {\n return {\n ...base,\n skipped: true,\n reason: \"fresh\",\n durationMs: Date.now() - startedAt,\n };\n }\n\n const resolvedTranslate = resolveTranslateConfig(config, type);\n const model = options.model ?? resolvedTranslate.model;\n\n const prompt = buildPageTranslationPrompt({\n resolved: resolvedTranslate,\n targetLocale: item.locale,\n contextLabel: resolveContextLabel(enDoc, item.enSlug),\n translatableFrontmatter: payload.frontmatter,\n enBody: payload.body,\n slugStrategy: type.slugStrategy,\n });\n\n if (options.dryRun) {\n return {\n ...base,\n skipped: false,\n model,\n durationMs: Date.now() - startedAt,\n };\n }\n\n const responseSchema = buildGeminiResponseSchema(type.schema, type.slugStrategy);\n\n const result = await translatePageWithGemini({\n prompt,\n model,\n responseSchema: responseSchema ?? undefined,\n });\n const slug =\n type.slugStrategy === \"localized\"\n ? (result.parsed.slug ?? existing?.slug ?? item.enSlug)\n : item.enSlug;\n\n const validated = validateTranslatedFrontmatter(enDoc, result.parsed.frontmatter, type.schema);\n if (!validated.ok) {\n throw new Error(`Translation validation failed: ${validated.error}`);\n }\n\n const writeDb = openStore(config, \"readwrite\");\n upsertTranslation(writeDb, {\n contentType: type.id,\n enSlug: item.enSlug,\n locale: item.locale,\n slug,\n frontmatter: validated.frontmatter,\n body: result.parsed.body,\n enHash: currentEnHash,\n translatedAt: new Date().toISOString(),\n model: result.model,\n });\n writeDb.close();\n\n recordRevision(config, {\n contentType: type.id,\n enSlug: item.enSlug,\n locale: item.locale,\n revisionKind: \"translation\",\n enHash: currentEnHash,\n body: result.parsed.body,\n frontmatter: validated.frontmatter,\n model: result.model,\n });\n\n const estimatedCostUsd = estimateTranslationCostUsd(\n normalizeGeminiDisplayName(result.model),\n result.usage.inputTokens,\n result.usage.outputTokens,\n );\n\n return {\n ...base,\n skipped: false,\n model: result.model,\n usage: result.usage,\n estimatedCostUsd,\n durationMs: Date.now() - startedAt,\n };\n } catch (error) {\n return {\n ...base,\n skipped: false,\n failed: true,\n error: formatTranslateError(error),\n durationMs: Date.now() - startedAt,\n };\n }\n}\n\nfunction labelForItem(item: TranslationWorkItem): string {\n return `${item.contentType}/${item.enSlug}@${item.locale}`;\n}\n\n/** Translate a batch of worklist items with bounded concurrency. */\nexport async function translateWorklist(\n config: ScribeConfig,\n items: TranslationWorkItem[],\n options: {\n model?: string;\n dryRun?: boolean;\n force?: boolean;\n concurrency?: number;\n onProgress?: (event: TranslateProgressEvent) => void;\n } = {},\n): Promise<TranslatePageResult[]> {\n const concurrency = Math.max(1, options.concurrency ?? 3);\n const startedAt = Date.now();\n const results: TranslatePageResult[] = new Array(items.length);\n const active = new Set<string>();\n\n options.onProgress?.({\n type: \"start\",\n total: items.length,\n concurrency,\n dryRun: Boolean(options.dryRun),\n model: options.model,\n });\n\n await runPool(items, concurrency, async (item, index) => {\n const label = labelForItem(item);\n active.add(label);\n options.onProgress?.({ type: \"item-start\", item, active: [...active] });\n\n const result = await translatePage(config, item, options);\n results[index] = result;\n\n active.delete(label);\n options.onProgress?.({ type: \"item-done\", result });\n });\n\n const totals = summarizeResults(results, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results, totals });\n return results;\n}\n","import type { ScribeConfig } from \"../core/types.js\";\nimport { computeBodyHash } from \"../hash/page-hash.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { appendRevision } from \"../storage/translations.js\";\n\n/** Append a revision row to the SQLite store. */\nexport function recordRevision(\n config: ScribeConfig,\n input: {\n contentType: string;\n enSlug: string;\n locale: string | null;\n revisionKind: \"translation\" | \"en_edit_detected\" | \"snapshot\";\n enHash: string;\n body: string;\n model?: string;\n /** Translated frontmatter to snapshot alongside the body. */\n frontmatter?: Record<string, unknown>;\n },\n): number {\n const db = openStore(config, \"readwrite\");\n const id = appendRevision(db, {\n contentType: input.contentType,\n enSlug: input.enSlug,\n locale: input.locale,\n revisionKind: input.revisionKind,\n enHash: input.enHash,\n bodyHash: computeBodyHash(input.body),\n createdAt: new Date().toISOString(),\n model: input.model,\n bodyPreview: input.body.slice(0, 200),\n frontmatterJson: input.frontmatter ? JSON.stringify(input.frontmatter) : null,\n body: input.body,\n });\n db.close();\n return id;\n}\n","import { GoogleGenAI } from \"@google/genai\";\nimport {\n DEFAULT_GEMINI_MODEL,\n normalizeGeminiDisplayName,\n resolveGeminiModelId,\n} from \"./gemini-models.js\";\n\nconst DEFAULT_MODEL = DEFAULT_GEMINI_MODEL;\n\nexport interface GeminiTokenUsage {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n}\n\nexport interface GeminiTranslationResult {\n model: string;\n raw: string;\n parsed: {\n frontmatter: Record<string, unknown>;\n body: string;\n slug?: string;\n };\n usage: GeminiTokenUsage;\n}\n\nfunction extractJson(text: string): string {\n const fenced = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (fenced?.[1]) return fenced[1].trim();\n const start = text.indexOf(\"{\");\n const end = text.lastIndexOf(\"}\");\n if (start >= 0 && end > start) return text.slice(start, end + 1);\n return text.trim();\n}\n\nexport async function translatePageWithGemini(input: {\n prompt: string;\n model?: string;\n apiKey?: string;\n responseSchema?: Record<string, unknown>;\n}): Promise<GeminiTranslationResult> {\n const apiKey = input.apiKey ?? process.env.GEMINI_API_KEY;\n if (!apiKey) {\n throw new Error(\"GEMINI_API_KEY is required for scribe translate\");\n }\n\n const displayModel = normalizeGeminiDisplayName(\n input.model ?? process.env.PROSE_GEMINI_MODEL ?? DEFAULT_MODEL,\n );\n const apiModel = resolveGeminiModelId(displayModel);\n const ai = new GoogleGenAI({ apiKey });\n const response = await ai.models.generateContent({\n model: apiModel,\n contents: input.prompt,\n config: {\n responseMimeType: \"application/json\",\n ...(input.responseSchema ? { responseSchema: input.responseSchema } : {}),\n },\n });\n\n const raw = response.text ?? \"\";\n const parsed = JSON.parse(extractJson(raw)) as {\n frontmatter: Record<string, unknown>;\n body: string;\n slug?: string;\n };\n\n if (!parsed.frontmatter || typeof parsed.body !== \"string\") {\n throw new Error(\"Gemini response missing frontmatter/body\");\n }\n\n const usageMetadata = response.usageMetadata;\n const usage: GeminiTokenUsage = {\n inputTokens: usageMetadata?.promptTokenCount ?? 0,\n outputTokens: usageMetadata?.candidatesTokenCount ?? 0,\n totalTokens: usageMetadata?.totalTokenCount ?? 0,\n };\n\n return { model: displayModel, raw, parsed, usage };\n}\n","/** Display name -> Gemini API model id. Pricing and logs use the display name. */\nexport const GEMINI_MODEL_IDS: Record<string, string> = {\n \"gemini-2.5-pro\": \"gemini-2.5-pro\",\n \"gemini-3.1-pro\": \"gemini-3.1-pro-preview\",\n};\n\nexport const DEFAULT_GEMINI_MODEL = \"gemini-3.1-pro\";\n\nfunction stripModelsPrefix(model: string): string {\n return model.replace(/^models\\//, \"\");\n}\n\n/** Map a display name (or passthrough id) to the API model id. */\nexport function resolveGeminiModelId(model: string): string {\n const name = stripModelsPrefix(model);\n return GEMINI_MODEL_IDS[name] ?? name;\n}\n\n/** Normalize any model id/alias to the display name used for pricing. */\nexport function normalizeGeminiDisplayName(model: string): string {\n const name = stripModelsPrefix(model);\n if (name in GEMINI_MODEL_IDS) return name;\n\n const alias = Object.entries(GEMINI_MODEL_IDS).find(([, apiId]) => apiId === name);\n if (alias) return alias[0];\n\n return name;\n}\n","const CONTEXT_TIER_TOKENS = 200_000;\n\nexport interface TieredModelPricing {\n input: readonly [le200kUsdPerMillion: number, gt200kUsdPerMillion: number];\n output: readonly [le200kUsdPerMillion: number, gt200kUsdPerMillion: number];\n}\n\n/** display_name -> { input: (le_200k, gt_200k), output: (le_200k, gt_200k) } in USD per 1M tokens */\nexport const GEMINI_PRICING_USD: Record<string, TieredModelPricing> = {\n \"gemini-3.1-pro\": { input: [2.0, 4.0], output: [12.0, 18.0] },\n};\n\nfunction normalizeModelId(model: string): string {\n return model.replace(/^models\\//, \"\").toLowerCase();\n}\n\nfunction tierRate(tokens: number, tiers: readonly [number, number]): number {\n return tokens <= CONTEXT_TIER_TOKENS ? tiers[0] : tiers[1];\n}\n\nexport function resolveModelPricing(model: string): TieredModelPricing | undefined {\n const id = normalizeModelId(model);\n if (GEMINI_PRICING_USD[id]) return GEMINI_PRICING_USD[id];\n\n const match = Object.entries(GEMINI_PRICING_USD).find(([key]) => id.includes(key));\n return match?.[1];\n}\n\nexport function estimateTranslationCostUsd(\n model: string,\n inputTokens: number,\n outputTokens: number,\n): number | undefined {\n const pricing = resolveModelPricing(model);\n if (!pricing) return undefined;\n\n const inputRate = tierRate(inputTokens, pricing.input);\n const outputRate = tierRate(outputTokens, pricing.output);\n\n return (\n (inputTokens / 1_000_000) * inputRate +\n (outputTokens / 1_000_000) * outputRate\n );\n}\n\nexport function formatTokenCount(tokens: number): string {\n if (tokens >= 1_000_000) return `${(tokens / 1_000_000).toFixed(2)}M`;\n if (tokens >= 1_000) return `${(tokens / 1_000).toFixed(1)}k`;\n return String(tokens);\n}\n\nexport function formatUsd(amount: number | undefined): string {\n if (amount === undefined) return \"n/a\";\n if (amount >= 1) return `$${amount.toFixed(2)}`;\n if (amount >= 0.01) return `$${amount.toFixed(3)}`;\n return `$${amount.toFixed(4)}`;\n}\n","import type { ResolvedTranslateConfig } from \"../resolve-translate-config.js\";\nimport type { SlugStrategy } from \"../../core/types.js\";\n\nexport const LOCALE_NAMES: Record<string, string> = {\n fr: \"French\",\n es: \"Spanish\",\n de: \"German\",\n nl: \"Dutch\",\n uk: \"Ukrainian\",\n tr: \"Turkish\",\n da: \"Danish\",\n he: \"Hebrew\",\n \"zh-CN\": \"Simplified Chinese\",\n \"zh-TW\": \"Traditional Chinese\",\n pt: \"Portuguese\",\n ja: \"Japanese\",\n ru: \"Russian\",\n it: \"Italian\",\n ar: \"Arabic\",\n};\n\nexport function defaultLocalizationPrompt(localeName: string, locale: string): string {\n return [\n `Localize the content below into natural ${localeName} (${locale}).`,\n \"Do not translate word-for-word.\",\n \"Preserve the source tone and brand voice.\",\n \"Write as if a native speaker authored it for the target market.\",\n ].join(\" \");\n}\n\nexport function buildPageTranslationPrompt(input: {\n resolved: ResolvedTranslateConfig;\n targetLocale: string;\n contextLabel?: string;\n translatableFrontmatter: Record<string, unknown>;\n enBody: string;\n slugStrategy: SlugStrategy;\n}): string {\n const localeName = LOCALE_NAMES[input.targetLocale] ?? input.targetLocale;\n const prompt =\n input.resolved.promptOverride ??\n defaultLocalizationPrompt(localeName, input.targetLocale);\n\n const lines = [\n prompt,\n \"\",\n ...(input.resolved.context ? [\"## Context\", input.resolved.context, \"\"] : []),\n ...(input.contextLabel ? [`Document: ${input.contextLabel}`, \"\"] : []),\n \"## Rules\",\n ...input.resolved.rules.map((rule) => `- ${rule}`),\n \"\",\n \"## Output format\",\n \"Return ONLY valid JSON with keys:\",\n input.slugStrategy === \"localized\"\n ? '`frontmatter` (object with translated frontmatter fields), `body` (string, full MDX body), `slug` (string).'\n : \"`frontmatter` (object), `body` (string).\",\n \"\",\n \"## EN translatable frontmatter (JSON)\",\n JSON.stringify(input.translatableFrontmatter, null, 2),\n \"\",\n \"## EN body (MDX)\",\n input.enBody,\n ];\n\n return lines.join(\"\\n\");\n}\n","import { z } from \"zod\";\nimport { getFieldKind, peelOptionalWrappers } from \"../core/field.js\";\nimport type { SlugStrategy } from \"../core/types.js\";\n\nfunction getObjectShape(schema: z.ZodTypeAny): z.ZodRawShape | null {\n const base = peelOptionalWrappers(schema);\n if (base instanceof Object && \"shape\" in base) {\n return (base as z.ZodObject<z.ZodRawShape>).shape;\n }\n return null;\n}\n\nfunction getArraySchema(schema: z.ZodTypeAny): z.ZodArray | null {\n const base = peelOptionalWrappers(schema);\n if (\n base instanceof Object &&\n \"element\" in base &&\n (base as z.ZodTypeAny & { _def?: { type?: string } })._def?.type === \"array\"\n ) {\n return base as z.ZodArray;\n }\n return null;\n}\n\nfunction extractTranslatableFromStructural(schema: z.ZodTypeAny): z.ZodTypeAny | null {\n const arraySchema = getArraySchema(schema);\n if (arraySchema) {\n const inner = buildTranslatableSubschema(arraySchema.element as z.ZodTypeAny);\n if (inner) return z.array(inner);\n return null;\n }\n if (getObjectShape(schema)) {\n return buildTranslatableSubschema(schema);\n }\n return null;\n}\n\n/** Build a Zod object schema containing only translatable fields (including nested in structural arrays). */\nexport function buildTranslatableSubschema(schema: z.ZodTypeAny): z.ZodObject | null {\n const shape = getObjectShape(schema);\n if (!shape) return null;\n\n const out: Record<string, z.ZodTypeAny> = {};\n for (const [key, child] of Object.entries(shape)) {\n const childSchema = child as z.ZodTypeAny;\n const kind = getFieldKind(childSchema);\n if (kind === \"translatable\") {\n out[key] = peelOptionalWrappers(childSchema);\n } else if (kind === \"structural\") {\n const nested = extractTranslatableFromStructural(childSchema);\n if (nested) out[key] = nested;\n }\n }\n\n if (Object.keys(out).length === 0) return null;\n return z.object(out);\n}\n\n/** JSON Schema for Gemini structured output: `{ frontmatter, body, slug? }`. */\nexport function buildGeminiResponseSchema(\n schema: z.ZodTypeAny,\n slugStrategy: SlugStrategy,\n): Record<string, unknown> | null {\n try {\n const translatable = buildTranslatableSubschema(schema);\n if (!translatable) return null;\n\n const responseShape: Record<string, z.ZodTypeAny> = {\n frontmatter: translatable,\n body: z.string(),\n };\n if (slugStrategy === \"localized\") {\n responseShape.slug = z.string();\n }\n\n const jsonSchema = z.toJSONSchema(z.object(responseShape), {\n target: \"draft-2020-12\",\n unrepresentable: \"any\",\n io: \"output\",\n }) as Record<string, unknown>;\n delete jsonSchema.$schema;\n return jsonSchema;\n } catch {\n return null;\n }\n}\n","import type {\n ContentTypeConfig,\n ScribeConfig,\n ScribeTranslateDefaults,\n SlugStrategy,\n TranslateConfig,\n} from \"../core/types.js\";\n\nexport interface ResolvedTranslateConfig {\n promptOverride?: string;\n context?: string;\n rules: string[];\n model?: string;\n}\n\nfunction slugStrategyRules(\n slugStrategy: SlugStrategy,\n preserveTerms?: string[],\n): string[] {\n if (slugStrategy === \"localized\") {\n const rules = [\n \"Provide a localized URL slug in JSON field `slug`.\",\n \"Slug MUST be ASCII only: a-z, 0-9, hyphens. No uppercase, accents, underscores, or spaces.\",\n \"For non-Latin locales, transliterate into Latin script.\",\n ];\n if (preserveTerms?.length) {\n rules.push(\n `Preserve these terms verbatim in slugs (lowercase): ${preserveTerms.join(\", \")}.`,\n );\n } else {\n rules.push(\"Preserve 4-digit years and proper nouns in slugs.\");\n }\n return rules;\n }\n return [\"Do NOT output a slug — slugStrategy is fixed.\"];\n}\n\nfunction mergeContext(\n project: ScribeTranslateDefaults | undefined,\n type: TranslateConfig | undefined,\n): string | undefined {\n const parts = [project?.context, type?.context].filter(Boolean);\n return parts.length > 0 ? parts.join(\"\\n\\n\") : undefined;\n}\n\nfunction mergeTranslateConfig(\n project: ScribeTranslateDefaults | undefined,\n type: TranslateConfig | undefined,\n slugStrategy: SlugStrategy,\n): ResolvedTranslateConfig {\n return {\n promptOverride: type?.prompt ?? project?.prompt,\n context: mergeContext(project, type),\n rules: [\n ...(project?.rules ?? []),\n ...(type?.rules ?? []),\n ...slugStrategyRules(slugStrategy, project?.slugPreserveTerms),\n ],\n model: type?.model ?? project?.defaultModel,\n };\n}\n\n/** Merge project and content-type translation settings. */\nexport function resolveTranslateConfig(\n config: ScribeConfig,\n type: ContentTypeConfig,\n): ResolvedTranslateConfig {\n return mergeTranslateConfig(config.translate, type.translate, type.slugStrategy);\n}\n","import type { z } from \"zod\";\nimport type { ScribeDocument } from \"../core/types.js\";\nimport { mergeStructuralOntoLocale, pickTranslatable } from \"../core/introspect-schema.js\";\n\nexport function formatZodIssues(error: z.ZodError): string {\n return error.issues\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n}\n\n/** Strip non-translatable keys from Gemini frontmatter output. */\nexport function sanitizeTranslatedFrontmatter(\n rawFrontmatter: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n return pickTranslatable(rawFrontmatter, schema);\n}\n\n/** Validate locale frontmatter against the full content schema (merged with EN structural fields). */\nexport function validateTranslatedFrontmatter(\n enDoc: ScribeDocument,\n localeFrontmatter: Record<string, unknown>,\n typeSchema: z.ZodTypeAny,\n): { ok: true; frontmatter: Record<string, unknown> } | { ok: false; error: string } {\n const frontmatter = sanitizeTranslatedFrontmatter(localeFrontmatter, typeSchema);\n const merged = mergeStructuralOntoLocale(\n frontmatter,\n enDoc.frontmatter as Record<string, unknown>,\n typeSchema,\n );\n const parsed = typeSchema.safeParse(merged);\n if (!parsed.success) {\n return { ok: false, error: formatZodIssues(parsed.error) };\n }\n return { ok: true, frontmatter };\n}\n","import type { ScribeProject } from \"../core/types.js\";\nimport { isRoutableType, pathPrefix, resolvePath } from \"../i18n/build-url.js\";\nimport { serializeMdx } from \"../loader/parse-mdx.js\";\n\nexport interface StaticRawExport {\n /** Path relative to the output root (e.g. `blog/foo.mdx`, `fr/glossary/bar.mdx`). */\n relativePath: string;\n /** Public URL pathname (e.g. `/blog/foo.mdx`, `/fr/glossary/bar.mdx`). */\n urlPath: string;\n locale: string;\n typeId: string;\n enSlug: string;\n /** Full MDX source (YAML frontmatter + body). */\n source: string;\n}\n\nexport interface BuildStaticRawExportsOptions {\n /** File extension including the dot. Default `.mdx`. */\n extension?: `.${string}`;\n /** Content type ids to export. Default: all routable types. */\n types?: string[];\n /** Locales to export. Default: `config.locales`. */\n locales?: readonly string[];\n /** Skip documents where `resolve()` sets `shouldRedirectTo`. Default `true`. */\n excludeRedirected?: boolean;\n /** Skip documents with `noindex: true`. Default `false`. */\n excludeNoindex?: boolean;\n}\n\nfunction normalizeExtension(ext: string): `.${string}` {\n return (ext.startsWith(\".\") ? ext : `.${ext}`) as `.${string}`;\n}\n\n/** Segment name for export directories, e.g. `blog` from `/blog/{slug}`. */\nexport function exportDirSegment(pathTemplate: string): string {\n const prefix = pathPrefix(pathTemplate);\n return prefix.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Relative directory roots to clean before writing static exports.\n * EN: `{segment}/` (e.g. `blog/`). Prefixed locales: `{locale}/{segment}/`.\n */\nexport function getStaticExportRoots(\n project: ScribeProject,\n options: { types?: string[]; locales?: readonly string[] } = {},\n): string[] {\n const { config } = project;\n const locales = options.locales ?? config.locales;\n const typeFilter = options.types ? new Set(options.types) : null;\n const roots = new Set<string>();\n\n for (const type of project.listTypes()) {\n if (!isRoutableType(type.config)) continue;\n if (typeFilter && !typeFilter.has(type.id)) continue;\n const segment = exportDirSegment(type.config.path!);\n roots.add(`${segment}/`);\n for (const locale of locales) {\n if (locale === config.defaultLocale) continue;\n roots.add(`${locale}/${segment}/`);\n }\n }\n\n return [...roots].sort();\n}\n\n/** Build static raw MDX exports for all routable content types. */\nexport function buildStaticRawExports(\n project: ScribeProject,\n options: BuildStaticRawExportsOptions = {},\n): StaticRawExport[] {\n const { config } = project;\n const extension = normalizeExtension(options.extension ?? \".mdx\");\n const locales = options.locales ?? config.locales;\n const excludeRedirected = options.excludeRedirected ?? true;\n const excludeNoindex = options.excludeNoindex ?? false;\n const typeFilter = options.types ? new Set(options.types) : null;\n\n const out: StaticRawExport[] = [];\n\n for (const type of project.listTypes()) {\n if (!isRoutableType(type.config)) continue;\n if (typeFilter && !typeFilter.has(type.id)) continue;\n\n const pathTemplate = type.config.path!;\n const all = type.load();\n const enIdx = all.get(config.defaultLocale);\n if (!enIdx) continue;\n\n for (const locale of locales) {\n for (const enDoc of enIdx.bySlug.values()) {\n const resolved = type.resolve(enDoc.slug, locale);\n if (!resolved.document) continue;\n if (excludeRedirected && resolved.shouldRedirectTo) continue;\n if (excludeNoindex && resolved.document.noindex) continue;\n\n const doc = resolved.document;\n const slugWithExt = `${doc.slug}${extension}`;\n const urlPath = resolvePath(pathTemplate, slugWithExt, locale, config.defaultLocale);\n\n out.push({\n relativePath: urlPath.slice(1),\n urlPath,\n locale,\n typeId: type.id,\n enSlug: doc.enSlug,\n source: serializeMdx(doc.frontmatter, doc.content),\n });\n }\n }\n }\n\n return out;\n}\n","import matter from \"gray-matter\";\n\nexport interface ParsedMdx {\n frontmatter: Record<string, unknown>;\n content: string;\n}\n\nexport function parseMdx(raw: string): ParsedMdx {\n const parsed = matter(raw);\n return {\n frontmatter: parsed.data as Record<string, unknown>,\n content: parsed.content,\n };\n}\n\nexport function serializeMdx(frontmatter: Record<string, unknown>, content: string): string {\n return matter.stringify(content, frontmatter);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeProject } from \"../core/types.js\";\nimport {\n buildStaticRawExports,\n getStaticExportRoots,\n type BuildStaticRawExportsOptions,\n} from \"./build-static-raw-exports.js\";\n\nexport interface WriteStaticRawExportsOptions extends BuildStaticRawExportsOptions {\n /** Output directory (typically `public`). Default `public`. */\n outDir?: string;\n}\n\nfunction rmDirIfExists(dir: string): void {\n if (fs.existsSync(dir)) {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n}\n\n/** Remove managed export roots, write fresh static raw MDX files, return exports written. */\nexport function writeStaticRawExports(\n project: ScribeProject,\n options: WriteStaticRawExportsOptions = {},\n): { exports: ReturnType<typeof buildStaticRawExports>; written: number } {\n const outDir = path.resolve(options.outDir ?? \"public\");\n const typeFilter = options.types;\n\n for (const root of getStaticExportRoots(project, {\n types: typeFilter,\n locales: options.locales,\n })) {\n rmDirIfExists(path.join(outDir, root));\n }\n\n const exports = buildStaticRawExports(project, options);\n const counts = new Map<string, number>();\n\n for (const item of exports) {\n const filePath = path.join(outDir, item.relativePath);\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, item.source, \"utf8\");\n const key = `${item.typeId}/${item.locale}`;\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n\n for (const [key, count] of [...counts.entries()].sort()) {\n console.log(` ${key}: ${count}`);\n }\n\n return { exports, written: exports.length };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport dotenv from \"dotenv\";\n\nconst ENV_FILES = [\".env\", \".env.local\"] as const;\n\n/** Load `.env` then `.env.local` from cwd; existing process env wins. */\nexport function loadEnvFromCwd(cwd: string): void {\n for (const file of ENV_FILES) {\n const envPath = path.join(/* turbopackIgnore: true */ cwd, file);\n if (!fs.existsSync(envPath)) continue;\n dotenv.config({ path: envPath, override: false });\n }\n}\n","import { serve } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport type { ContentTypeRuntime, ScribeConfig, ScribeProject } from \"../src/core/types.js\";\nimport { introspectSchema, mergeStructuralOntoLocale } from \"../src/core/introspect-schema.js\";\nimport { computePageEnHash } from \"../src/hash/page-hash.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../src/loader/create-loader.js\";\nimport { openStore } from \"../src/storage/sqlite.js\";\nimport {\n getTranslation,\n listRevisions,\n listTranslationsForLocale,\n type RevisionRow,\n} from \"../src/storage/translations.js\";\nimport { buildWorklist } from \"../src/translate/worklist.js\";\n\ntype DocStatus = \"source\" | \"up-to-date\" | \"stale\" | \"missing\";\n\ninterface DocumentStatusResult {\n status: DocStatus;\n currentEnHash?: string;\n storedEnHash?: string;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction encodePathSegment(value: string): string {\n return encodeURIComponent(value);\n}\n\nfunction statusDot(status: DocStatus): string {\n const labels: Record<DocStatus, string> = {\n source: \"en\",\n \"up-to-date\": \"ok\",\n stale: \"stale\",\n missing: \"—\",\n };\n return `<span class=\"status\" title=\"${status}\"><span class=\"dot dot-${status}\"></span>${labels[status]}</span>`;\n}\n\nfunction documentStatus(\n config: ScribeConfig,\n db: ReturnType<typeof openStore>,\n type: ContentTypeRuntime,\n enSlug: string,\n locale: string,\n): DocumentStatusResult {\n if (locale === config.defaultLocale) {\n return { status: \"source\" };\n }\n const enDoc = readEnDocument(config, type.config, enSlug);\n if (!enDoc) {\n return { status: \"missing\" };\n }\n const payload = getTranslatablePayload(enDoc, type.config);\n const currentEnHash = computePageEnHash(payload.frontmatter, payload.body);\n const row = getTranslation(db, type.id, enSlug, locale);\n if (!row) {\n return { status: \"missing\", currentEnHash };\n }\n if (row.en_hash !== currentEnHash) {\n return { status: \"stale\", currentEnHash, storedEnHash: row.en_hash };\n }\n return { status: \"up-to-date\", currentEnHash, storedEnHash: row.en_hash };\n}\n\nfunction flattenFrontmatter(\n data: Record<string, unknown>,\n prefix = \"\",\n): Array<{ key: string; value: string }> {\n const rows: Array<{ key: string; value: string }> = [];\n for (const [key, value] of Object.entries(data)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n rows.push(...flattenFrontmatter(value as Record<string, unknown>, fullKey));\n } else {\n const display =\n typeof value === \"string\"\n ? value\n : value === undefined\n ? \"\"\n : JSON.stringify(value, null, 2);\n rows.push({ key: fullKey, value: display });\n }\n }\n return rows;\n}\n\nfunction translatableKeySet(schema: ContentTypeRuntime[\"config\"][\"schema\"]): Set<string> {\n return new Set(\n introspectSchema(schema)\n .filter((field) => field.kind === \"translatable\")\n .map((field) => field.path.join(\".\")),\n );\n}\n\nfunction renderFrontmatterTable(\n frontmatter: Record<string, unknown>,\n schema: ContentTypeRuntime[\"config\"][\"schema\"],\n): string {\n const translatable = translatableKeySet(schema);\n const rows = flattenFrontmatter(frontmatter)\n .map((row) => {\n const flag = translatable.has(row.key)\n ? `<span class=\"flag t\" title=\"Translatable\">T</span>`\n : `<span class=\"flag s\" title=\"Structural\">S</span>`;\n return `<tr>\n <td class=\"k\">${flag}${escapeHtml(row.key)}</td>\n <td class=\"v\">${escapeHtml(row.value)}</td>\n </tr>`;\n })\n .join(\"\");\n return `<table class=\"kv\">\n <tbody>${rows || `<tr><td colspan=\"2\" class=\"dim\">—</td></tr>`}</tbody>\n </table>`;\n}\n\nfunction renderRevisionSnapshot(revision: RevisionRow): string {\n if (revision.frontmatter_json && revision.body) {\n let frontmatter: Record<string, unknown> = {};\n try {\n frontmatter = JSON.parse(revision.frontmatter_json) as Record<string, unknown>;\n } catch {\n frontmatter = {};\n }\n const fmRows = flattenFrontmatter(frontmatter)\n .map(\n (row) =>\n `<tr><td class=\"k\">${escapeHtml(row.key)}</td><td class=\"v\">${escapeHtml(row.value)}</td></tr>`,\n )\n .join(\"\");\n return `<table class=\"kv\"><tbody>${fmRows}</tbody></table>\n <pre class=\"code\">${escapeHtml(revision.body)}</pre>`;\n }\n return `<p class=\"dim\">${escapeHtml(revision.body_preview ?? \"(no snapshot)\")}</p>`;\n}\n\nfunction renderRevisionTimeline(revisions: RevisionRow[]): string {\n if (revisions.length === 0) {\n return `<p class=\"dim\">No history.</p>`;\n }\n const items = revisions\n .map(\n (row) => `<tr>\n <td class=\"dim\">${escapeHtml(row.created_at.slice(0, 19))}</td>\n <td>${escapeHtml(row.revision_kind)}</td>\n <td class=\"dim\">${row.model ? escapeHtml(row.model) : \"—\"}</td>\n <td class=\"dim mono\">${escapeHtml(row.en_hash.slice(0, 8))}</td>\n <td><details><summary>view</summary>${renderRevisionSnapshot(row)}</details></td>\n </tr>`,\n )\n .join(\"\");\n return `<table class=\"data\"><thead><tr>\n <th>When</th><th>Kind</th><th>Model</th><th>Hash</th><th></th>\n </tr></thead><tbody>${items}</tbody></table>`;\n}\n\nfunction renderLayout(\n title: string,\n body: string,\n project: ScribeProject,\n options: { activeTypeId?: string } = {},\n): string {\n const typeLinks = project\n .listTypes()\n .map((type) => {\n const active = type.id === options.activeTypeId ? \" active\" : \"\";\n return `<a class=\"tree-item${active}\" href=\"/type/${encodePathSegment(type.id)}\">\n <span class=\"tree-label\">${escapeHtml(type.config.label)}</span>\n <span class=\"tree-meta\">${escapeHtml(type.id)}</span>\n </a>`;\n })\n .join(\"\");\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(title)} — Scribe</title>\n <style>\n :root {\n --bg: #1e1e1e;\n --sidebar: #252526;\n --bar: #333333;\n --panel: #1e1e1e;\n --border: #3c3c3c;\n --text: #cccccc;\n --dim: #858585;\n --accent: #3794ff;\n --hover: #2a2d2e;\n --active: #37373d;\n --ok: #89d185;\n --stale: #cca700;\n --missing: #f48771;\n --source: #75beff;\n --mono: ui-monospace, \"Cascadia Code\", \"SF Mono\", Menlo, monospace;\n --ui: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n --fs: 13px;\n --fs-sm: 11px;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body { font: var(--fs)/1.4 var(--ui); background: var(--bg); color: var(--text); }\n a { color: var(--accent); text-decoration: none; }\n a:hover { text-decoration: underline; }\n .app { display: flex; height: 100vh; overflow: hidden; }\n\n /* activity bar */\n .actbar {\n width: 48px; flex-shrink: 0; background: var(--bar);\n display: flex; flex-direction: column; align-items: center;\n padding: 8px 0; gap: 4px; border-right: 1px solid var(--border);\n }\n .actbar a {\n width: 48px; height: 48px; display: flex; align-items: center; justify-content: center;\n color: var(--dim); font-size: 18px; text-decoration: none; position: relative;\n }\n .actbar a:hover { color: var(--text); }\n .actbar a.active { color: var(--text); }\n .actbar a.active::before {\n content: \"\"; position: absolute; left: 0; top: 8px; bottom: 8px;\n width: 2px; background: var(--accent);\n }\n\n /* sidebar */\n .sidebar {\n width: 200px; flex-shrink: 0; background: var(--sidebar);\n border-right: 1px solid var(--border); display: flex; flex-direction: column;\n overflow: hidden;\n }\n .sidebar-head {\n padding: 8px 12px; font-size: var(--fs-sm); font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.04em; color: var(--dim);\n }\n .sidebar-body { flex: 1; overflow-y: auto; padding: 2px 0; }\n .tree-item {\n display: flex; flex-direction: column; padding: 3px 12px 3px 20px;\n color: var(--text); text-decoration: none; line-height: 1.3;\n }\n .tree-item:hover { background: var(--hover); text-decoration: none; }\n .tree-item.active { background: var(--active); }\n .tree-label { font-size: var(--fs); }\n .tree-meta { font-size: var(--fs-sm); color: var(--dim); }\n\n /* main */\n .main { flex: 1; display: flex; flex-direction: column; overflow: hidden; }\n .toolbar {\n display: flex; align-items: center; gap: 6px; padding: 0 12px;\n height: 35px; background: var(--sidebar); border-bottom: 1px solid var(--border);\n font-size: var(--fs-sm); color: var(--dim); flex-shrink: 0; overflow: hidden;\n }\n .toolbar a { color: var(--dim); }\n .toolbar a:hover { color: var(--text); }\n .toolbar .sep { color: var(--border); }\n .content { flex: 1; overflow-y: auto; padding: 0; }\n\n /* tabs (locale switcher) */\n .tabs {\n display: flex; background: var(--sidebar); border-bottom: 1px solid var(--border);\n overflow-x: auto; flex-shrink: 0;\n }\n .tab {\n display: flex; align-items: center; gap: 6px; padding: 6px 12px;\n font-size: var(--fs-sm); color: var(--dim); border-right: 1px solid var(--border);\n text-decoration: none; white-space: nowrap;\n }\n .tab:hover { background: var(--hover); color: var(--text); text-decoration: none; }\n .tab.active {\n background: var(--bg); color: var(--text);\n border-bottom: 1px solid var(--bg); margin-bottom: -1px;\n }\n\n /* status dots */\n .status { display: inline-flex; align-items: center; gap: 4px; font-size: var(--fs-sm); color: var(--dim); }\n .dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }\n .dot-source { background: var(--source); }\n .dot-up-to-date { background: var(--ok); }\n .dot-stale { background: var(--stale); }\n .dot-missing { background: var(--missing); opacity: 0.7; }\n\n /* sections */\n .section { border-bottom: 1px solid var(--border); }\n .section-head {\n padding: 4px 12px; font-size: var(--fs-sm); font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.04em; color: var(--dim);\n background: var(--sidebar);\n }\n .section-body { padding: 0; }\n\n /* tables */\n table { border-collapse: collapse; width: 100%; font-size: var(--fs); }\n .data th, .data td { padding: 2px 12px; text-align: left; border-bottom: 1px solid var(--border); vertical-align: top; }\n .data th { font-size: var(--fs-sm); font-weight: 600; color: var(--dim); background: var(--sidebar); height: 22px; }\n .data tr:hover td { background: var(--hover); }\n .data .mono { font-family: var(--mono); font-size: var(--fs-sm); }\n\n /* key-value (frontmatter) */\n .kv td { padding: 1px 12px; font-family: var(--mono); font-size: var(--fs-sm); vertical-align: top; border-bottom: 1px solid var(--border); }\n .kv .k { width: 160px; color: #9cdcfe; white-space: nowrap; }\n .kv .v { color: #ce9178; white-space: pre-wrap; word-break: break-word; }\n .flag { font-size: 9px; font-weight: 700; margin-right: 4px; opacity: 0.5; }\n .flag.t { color: var(--ok); }\n .flag.s { color: var(--dim); }\n\n /* code block */\n .code {\n margin: 0; padding: 8px 12px; font: var(--fs-sm)/1.5 var(--mono);\n white-space: pre-wrap; word-break: break-word; color: var(--text);\n background: var(--bg); border: none;\n }\n\n /* meta row */\n .meta { display: flex; flex-wrap: wrap; font-size: var(--fs-sm); border-bottom: 1px solid var(--border); padding: 4px 0; }\n .meta dt { padding: 0 4px 0 12px; color: var(--dim); }\n .meta dt::after { content: \":\"; }\n .meta dd { padding: 0 12px 0 0; font-family: var(--mono); }\n\n /* misc */\n .dim { color: var(--dim); }\n .page-title { padding: 8px 12px 4px; font-size: 14px; font-weight: 400; }\n .page-sub { padding: 0 12px 8px; font-size: var(--fs-sm); color: var(--dim); }\n details summary { cursor: pointer; color: var(--accent); font-size: var(--fs-sm); }\n details[open] summary { margin-bottom: 4px; }\n .tag { font-size: var(--fs-sm); color: var(--dim); margin-left: 6px; }\n .tag-warn { color: var(--stale); }\n .tag-err { color: var(--missing); }\n </style>\n</head>\n<body>\n <div class=\"app\">\n <nav class=\"actbar\">\n <a href=\"/\" title=\"Overview\">⌂</a>\n <a href=\"/staleness\" title=\"Staleness\">⚠</a>\n </nav>\n <aside class=\"sidebar\">\n <div class=\"sidebar-head\">Types</div>\n <div class=\"sidebar-body\">${typeLinks || `<span class=\"dim\" style=\"padding:8px 12px\">—</span>`}</div>\n </aside>\n <div class=\"main\">\n <div class=\"content\">${body}</div>\n </div>\n </div>\n</body>\n</html>`;\n}\n\nfunction docTitleFromFrontmatter(frontmatter: Record<string, unknown>, enSlug: string): string {\n const title = frontmatter.title;\n if (typeof title === \"string\" && title.trim()) return title;\n return enSlug;\n}\n\n/** Start a local read-only Scribe studio (browser, staleness, document detail). */\nexport async function startStudio(\n project: ScribeProject,\n options: { port?: number; host?: string } = {},\n): Promise<void> {\n const app = new Hono();\n const config = project.config;\n\n app.get(\"/\", (c) => {\n const db = openStore(config, \"readonly\");\n const worklist = buildWorklist(config);\n const rows = project.listTypes().map((type) => {\n const enCount = type.list().length;\n const localeCells = config.locales\n .filter((locale) => locale !== config.defaultLocale)\n .map((locale) => {\n const translated = listTranslationsForLocale(db, type.id, locale).length;\n const stale = worklist.filter(\n (item) =>\n item.contentType === type.id && item.locale === locale && item.reason === \"stale\",\n ).length;\n const missing = worklist.filter(\n (item) =>\n item.contentType === type.id && item.locale === locale && item.reason === \"missing\",\n ).length;\n const tags = [\n stale ? `<span class=\"tag tag-warn\">${stale}s</span>` : \"\",\n missing ? `<span class=\"tag tag-err\">${missing}m</span>` : \"\",\n ].join(\"\");\n return `<td>${translated}${tags}</td>`;\n })\n .join(\"\");\n return `<tr>\n <td><a href=\"/type/${encodePathSegment(type.id)}\">${escapeHtml(type.config.label)}</a></td>\n <td class=\"dim\">${escapeHtml(type.id)}</td>\n <td>${enCount}</td>\n ${localeCells}\n </tr>`;\n });\n db.close();\n const localeHeaders = config.locales\n .filter((l) => l !== config.defaultLocale)\n .map((l) => `<th>${escapeHtml(l)}</th>`)\n .join(\"\");\n const html = `<div class=\"toolbar\">Overview</div>\n <table class=\"data\">\n <thead><tr><th>Type</th><th>ID</th><th>EN</th>${localeHeaders}</tr></thead>\n <tbody>${rows.join(\"\")}</tbody>\n </table>`;\n return c.html(renderLayout(\"Overview\", html, project));\n });\n\n app.get(\"/type/:id\", (c) => {\n const typeId = c.req.param(\"id\");\n const type = project.getType(typeId);\n if (!type) {\n return c.html(renderLayout(\"Not found\", `<div class=\"toolbar\">Unknown type</div>`, project), 404);\n }\n\n const db = openStore(config, \"readonly\");\n const locales = config.locales;\n const headerCells = locales\n .map((locale) => `<th>${escapeHtml(locale)}</th>`)\n .join(\"\");\n const rows = type\n .list()\n .map((doc) => {\n const title = docTitleFromFrontmatter(doc.frontmatter as Record<string, unknown>, doc.slug);\n const statusCells = locales\n .map((locale) => {\n const { status } = documentStatus(config, db, type, doc.slug, locale);\n return `<td>${statusDot(status)}</td>`;\n })\n .join(\"\");\n return `<tr>\n <td class=\"mono\"><a href=\"/type/${encodePathSegment(typeId)}/doc/${encodePathSegment(doc.slug)}\">${escapeHtml(doc.slug)}</a></td>\n <td>${escapeHtml(title)}</td>\n ${statusCells}\n </tr>`;\n })\n .join(\"\");\n db.close();\n\n const html = `<div class=\"toolbar\">\n <a href=\"/\">Overview</a><span class=\"sep\">›</span>${escapeHtml(type.config.label)}\n </div>\n <table class=\"data\">\n <thead><tr><th>Slug</th><th>Title</th>${headerCells}</tr></thead>\n <tbody>${rows || `<tr><td colspan=\"${2 + locales.length}\" class=\"dim\">No documents</td></tr>`}</tbody>\n </table>`;\n return c.html(renderLayout(type.config.label, html, project, { activeTypeId: typeId }));\n });\n\n app.get(\"/type/:id/doc/:enSlug\", (c) => {\n const typeId = c.req.param(\"id\");\n const enSlug = c.req.param(\"enSlug\");\n const locale = c.req.query(\"locale\") ?? config.defaultLocale;\n const showRaw = c.req.query(\"raw\") === \"1\";\n const type = project.getType(typeId);\n if (!type) {\n return c.html(renderLayout(\"Not found\", `<div class=\"toolbar\">Unknown type</div>`, project), 404);\n }\n\n const db = openStore(config, \"readonly\");\n const enDoc = readEnDocument(config, type.config, enSlug);\n if (!enDoc) {\n db.close();\n return c.html(\n renderLayout(\"Not found\", `<div class=\"toolbar\">Not found</div><p class=\"dim\" style=\"padding:12px\">${escapeHtml(enSlug)}</p>`, project, {\n activeTypeId: typeId,\n }),\n 404,\n );\n }\n\n const localeTabs = config.locales\n .map((loc) => {\n const { status } = documentStatus(config, db, type, enSlug, loc);\n const active = loc === locale ? \" active\" : \"\";\n const href = `/type/${encodePathSegment(typeId)}/doc/${encodePathSegment(enSlug)}?locale=${encodePathSegment(loc)}`;\n return `<a class=\"tab${active}\" href=\"${href}\">${escapeHtml(loc)} ${statusDot(status)}</a>`;\n })\n .join(\"\");\n\n let contentPanel = \"\";\n let metaPanel = \"\";\n let historyPanel = \"\";\n\n if (locale === config.defaultLocale) {\n contentPanel = `<div class=\"section\">\n <div class=\"section-head\">Frontmatter</div>\n <div class=\"section-body\">${renderFrontmatterTable(enDoc.frontmatter as Record<string, unknown>, type.config.schema)}</div>\n <div class=\"section-head\">Body</div>\n <pre class=\"code\">${escapeHtml(enDoc.content)}</pre>\n </div>`;\n } else {\n const translation = getTranslation(db, typeId, enSlug, locale);\n const { status, currentEnHash, storedEnHash } = documentStatus(config, db, type, enSlug, locale);\n\n if (translation) {\n const rawFrontmatter = JSON.parse(translation.frontmatter_json) as Record<string, unknown>;\n const displayFrontmatter = showRaw\n ? rawFrontmatter\n : mergeStructuralOntoLocale(rawFrontmatter, enDoc.frontmatter as Record<string, unknown>, type.config.schema);\n const rawToggle = showRaw\n ? `<span class=\"dim\"> · <a href=\"?locale=${encodePathSegment(locale)}\">merged</a></span>`\n : `<span class=\"dim\"> · <a href=\"?locale=${encodePathSegment(locale)}&raw=1\">raw</a></span>`;\n contentPanel = `<div class=\"section\">\n <div class=\"section-head\">Frontmatter${rawToggle}</div>\n <div class=\"section-body\">${renderFrontmatterTable(displayFrontmatter, type.config.schema)}</div>\n <div class=\"section-head\">Body</div>\n <pre class=\"code\">${escapeHtml(translation.body)}</pre>\n </div>`;\n metaPanel = `<dl class=\"meta\">\n <dt>status</dt><dd>${statusDot(status)}</dd>\n <dt>model</dt><dd>${escapeHtml(translation.model)}</dd>\n <dt>translated</dt><dd>${escapeHtml(translation.translated_at.slice(0, 19))}</dd>\n <dt>slug</dt><dd>${escapeHtml(translation.slug)}</dd>\n <dt>en_hash</dt><dd>${escapeHtml(currentEnHash?.slice(0, 12) ?? \"—\")} / ${escapeHtml(storedEnHash?.slice(0, 12) ?? \"—\")}</dd>\n </dl>`;\n const revisions = listRevisions(db, typeId, enSlug, locale);\n historyPanel = `<div class=\"section\">\n <div class=\"section-head\">History</div>\n <div class=\"section-body\">${renderRevisionTimeline(revisions)}</div>\n </div>`;\n } else {\n contentPanel = `<p class=\"dim\" style=\"padding:12px\">No translation for ${escapeHtml(locale)}.</p>`;\n metaPanel = `<dl class=\"meta\"><dt>status</dt><dd>${statusDot(status)}</dd></dl>`;\n }\n }\n\n db.close();\n\n const title = docTitleFromFrontmatter(enDoc.frontmatter as Record<string, unknown>, enSlug);\n const html = `<div class=\"toolbar\">\n <a href=\"/\">Overview</a><span class=\"sep\">›</span>\n <a href=\"/type/${encodePathSegment(typeId)}\">${escapeHtml(type.config.label)}</a><span class=\"sep\">›</span>\n <span>${escapeHtml(enSlug)}</span>\n </div>\n <div class=\"tabs\">${localeTabs}</div>\n ${metaPanel}\n ${contentPanel}\n ${historyPanel}`;\n\n return c.html(renderLayout(title, html, project, { activeTypeId: typeId }));\n });\n\n app.get(\"/staleness\", (c) => {\n const worklist = buildWorklist(config);\n const rows = worklist\n .slice(0, 500)\n .map((item) => {\n const href = `/type/${encodePathSegment(item.contentType)}/doc/${encodePathSegment(item.enSlug)}?locale=${encodePathSegment(item.locale)}`;\n return `<tr>\n <td>${escapeHtml(item.contentType)}</td>\n <td class=\"mono\"><a href=\"${href}\">${escapeHtml(item.enSlug)}</a></td>\n <td>${escapeHtml(item.locale)}</td>\n <td>${statusDot(item.reason === \"stale\" ? \"stale\" : \"missing\")}</td>\n </tr>`;\n })\n .join(\"\");\n const html = `<div class=\"toolbar\">Staleness <span class=\"dim\">· ${worklist.length} entries</span></div>\n <table class=\"data\">\n <thead><tr><th>Type</th><th>Slug</th><th>Locale</th><th>Status</th></tr></thead>\n <tbody>${rows || `<tr><td colspan=\"4\" class=\"dim\">All up to date</td></tr>`}</tbody>\n </table>`;\n return c.html(renderLayout(\"Staleness\", html, project));\n });\n\n app.get(\"/api/staleness-matrix\", (c) => {\n const worklist = buildWorklist(config);\n const matrix: Record<string, Record<string, number>> = {};\n for (const type of project.listTypes()) {\n matrix[type.id] = {};\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n matrix[type.id]![locale] = worklist.filter(\n (item) => item.contentType === type.id && item.locale === locale,\n ).length;\n }\n }\n return c.json(matrix);\n });\n\n const port = options.port ?? 3600;\n const host = options.host ?? \"127.0.0.1\";\n serve({ fetch: app.fetch, port, hostname: host }, () => {\n console.log(`Scribe studio listening on http://${host}:${port}`);\n });\n}\n","import { CancelPromptError } from \"@inquirer/core\";\nimport { checkbox, select } from \"@inquirer/prompts\";\nimport type { ScribeConfig } from \"../src/core/types.js\";\n\nimport type { TranslationWorklistStrategy } from \"../src/translate/worklist.js\";\n\nexport interface TranslateSelection {\n contentType?: string;\n preset?: string;\n locale?: string[];\n strategy?: TranslationWorklistStrategy;\n}\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nfunction nonDefaultLocales(config: ScribeConfig): string[] {\n return config.locales.filter((locale) => locale !== config.defaultLocale);\n}\n\nasync function runPrompt<T>(prompt: Promise<T>): Promise<T> {\n try {\n return await prompt;\n } catch (error) {\n if (error instanceof CancelPromptError) process.exit(0);\n throw error;\n }\n}\n\nasync function promptContentType(config: ScribeConfig): Promise<string | undefined> {\n return runPrompt(\n select<string | undefined>({\n message: \"Content type to translate\",\n choices: [\n { name: \"All content types\", value: undefined },\n ...config.types.map((type) => ({ name: type.id, value: type.id })),\n ],\n }),\n );\n}\n\nasync function promptLocalePreset(config: ScribeConfig): Promise<Pick<TranslateSelection, \"preset\" | \"locale\">> {\n const presets = Object.entries(config.localePresets ?? {}).filter(\n (entry): entry is [string, string[]] => Array.isArray(entry[1]),\n );\n\n if (presets.length === 0) {\n const locales = nonDefaultLocales(config);\n if (locales.length <= 1) return {};\n\n const picked = await runPrompt(\n checkbox({\n message: \"Locales to translate\",\n choices: locales.map((locale) => ({ name: locale, value: locale, checked: true })),\n validate: (values) => values.length > 0 || \"Pick at least one locale\",\n }),\n );\n return picked.length === locales.length ? {} : { locale: picked };\n }\n\n const choice = await runPrompt(\n select<string | undefined>({\n message: \"Locale preset\",\n choices: [\n { name: \"All locales\", value: undefined },\n ...presets.map(([name, locales]) => ({\n name: `${name} (${locales.join(\", \")})`,\n value: name,\n })),\n ],\n }),\n );\n return choice ? { preset: choice } : {};\n}\n\nasync function promptStrategy(): Promise<TranslationWorklistStrategy> {\n return runPrompt(\n select<TranslationWorklistStrategy>({\n message: \"Translation strategy\",\n choices: [\n { name: \"Stale and missing\", value: \"all\" },\n { name: \"Missing only (skip stale)\", value: \"missing-only\" },\n ],\n default: \"all\",\n }),\n );\n}\n\n/** Prompt for content type and locale preset when flags are omitted in a TTY. */\nexport async function promptTranslateSelection(\n config: ScribeConfig,\n flags: {\n type?: string;\n preset?: string;\n locale?: string[];\n strategy?: TranslationWorklistStrategy;\n },\n): Promise<TranslateSelection> {\n const selection: TranslateSelection = {\n contentType: flags.type,\n preset: flags.preset,\n locale: flags.locale,\n strategy: flags.strategy,\n };\n\n if (!isInteractive()) return selection;\n\n if (!selection.contentType) {\n selection.contentType = await promptContentType(config);\n }\n\n if (!selection.preset && !selection.locale?.length) {\n Object.assign(selection, await promptLocalePreset(config));\n }\n\n if (!selection.strategy) {\n selection.strategy = await promptStrategy();\n }\n\n return selection;\n}\n","export class AbortPromptError extends Error {\n name = 'AbortPromptError';\n message = 'Prompt was aborted';\n constructor(options) {\n super();\n this.cause = options?.cause;\n }\n}\nexport class CancelPromptError extends Error {\n name = 'CancelPromptError';\n message = 'Prompt was canceled';\n}\nexport class ExitPromptError extends Error {\n name = 'ExitPromptError';\n}\nexport class HookError extends Error {\n name = 'HookError';\n}\nexport class ValidationError extends Error {\n name = 'ValidationError';\n}\n","import type {\n TranslatePageResult,\n TranslateProgressEvent,\n TranslateWorklistTotals,\n} from \"../src/translate/page-translator.js\";\nimport { formatTokenCount, formatUsd } from \"../src/translate/gemini-pricing.js\";\n\nconst dim = (text: string) => `\\x1b[2m${text}\\x1b[0m`;\nconst green = (text: string) => `\\x1b[32m${text}\\x1b[0m`;\nconst yellow = (text: string) => `\\x1b[33m${text}\\x1b[0m`;\nconst red = (text: string) => `\\x1b[31m${text}\\x1b[0m`;\nconst cyan = (text: string) => `\\x1b[36m${text}\\x1b[0m`;\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nfunction progressBar(ratio: number, width = 28): string {\n const clamped = Math.max(0, Math.min(1, ratio));\n const filled = Math.round(clamped * width);\n return `${\"█\".repeat(filled)}${\"░\".repeat(width - filled)}`;\n}\n\nfunction labelForResult(result: TranslatePageResult): string {\n return `${result.contentType}/${result.enSlug}@${result.locale}`;\n}\n\nfunction statusForResult(result: TranslatePageResult, dryRun: boolean): string {\n if (result.failed) return red(\"failed\");\n if (result.skipped) return dim(\"skipped\");\n if (dryRun) return yellow(\"would translate\");\n return green(\"translated\");\n}\n\nfunction detailForResult(result: TranslatePageResult): string {\n const parts: string[] = [];\n if (result.durationMs !== undefined) parts.push(`${(result.durationMs / 1000).toFixed(1)}s`);\n if (result.usage) {\n parts.push(`${formatTokenCount(result.usage.inputTokens)} in`);\n parts.push(`${formatTokenCount(result.usage.outputTokens)} out`);\n }\n if (result.estimatedCostUsd !== undefined) parts.push(formatUsd(result.estimatedCostUsd));\n if (result.error) parts.push(red(result.error));\n return parts.length > 0 ? dim(parts.join(\" · \")) : \"\";\n}\n\nfunction formatSummaryLine(totals: TranslateWorklistTotals, dryRun: boolean): string {\n const action = dryRun ? \"Would translate\" : \"Translated\";\n const parts = [\n `${action} ${totals.translated}`,\n `skipped ${totals.skipped}`,\n ];\n if (totals.failed > 0) parts.push(red(`failed ${totals.failed}`));\n parts.push(`${formatTokenCount(totals.inputTokens)} in / ${formatTokenCount(totals.outputTokens)} out`);\n parts.push(`${formatUsd(totals.estimatedCostUsd)} est.`);\n parts.push(`${(totals.durationMs / 1000).toFixed(1)}s`);\n return parts.join(\" · \");\n}\n\nexport interface TranslateProgressReporter {\n onEvent: (event: TranslateProgressEvent) => void;\n finish: () => void;\n}\n\nexport function createTranslateProgressReporter(options: {\n enabled?: boolean;\n dryRun?: boolean;\n recentLimit?: number;\n} = {}): TranslateProgressReporter {\n const enabled = options.enabled ?? isInteractive();\n const dryRun = Boolean(options.dryRun);\n const recentLimit = options.recentLimit ?? 6;\n\n if (!enabled) {\n return {\n onEvent(event) {\n if (event.type === \"item-done\") {\n const label = labelForResult(event.result);\n const status = statusForResult(event.result, dryRun);\n const detail = detailForResult(event.result);\n console.log(`${label}: ${status}${detail ? ` (${detail.replace(/\\x1b\\[[0-9;]*m/g, \"\")})` : \"\"}`);\n if (event.result.failed && event.result.error) {\n console.error(event.result.error);\n }\n return;\n }\n if (event.type === \"done\") {\n console.log(formatSummaryLine(event.totals, dryRun));\n }\n },\n finish() {},\n };\n }\n\n let total = 0;\n let concurrency = 1;\n let model: string | undefined;\n let done = 0;\n let inputTokens = 0;\n let outputTokens = 0;\n let estimatedCostUsd = 0;\n let active: string[] = [];\n const recent: TranslatePageResult[] = [];\n let renderedLines = 0;\n let cursorHidden = false;\n\n function hideCursor(): void {\n if (!cursorHidden) {\n process.stdout.write(\"\\x1b[?25l\");\n cursorHidden = true;\n }\n }\n\n function showCursor(): void {\n if (cursorHidden) {\n process.stdout.write(\"\\x1b[?25h\");\n cursorHidden = false;\n }\n }\n\n function render(): void {\n hideCursor();\n if (renderedLines > 0) {\n process.stdout.write(`\\x1b[${renderedLines}A`);\n }\n\n const lines: string[] = [];\n const title = dryRun ? \"Dry run\" : \"Translating\";\n lines.push(cyan(`${title} ${done}/${total}`) + dim(` · ${concurrency} parallel`) + (model ? dim(` · ${model}`) : \"\"));\n lines.push(progressBar(total === 0 ? 0 : done / total) + dim(` ${Math.round(total === 0 ? 0 : (done / total) * 100)}%`));\n lines.push(\n dim(\"Tokens \") +\n `${formatTokenCount(inputTokens)} in · ${formatTokenCount(outputTokens)} out` +\n dim(\" · Cost \") +\n formatUsd(estimatedCostUsd) +\n dim(\" est.\"),\n );\n\n if (active.length > 0) {\n lines.push(dim(\"Active \") + active.slice(0, 3).join(\", \") + (active.length > 3 ? dim(` +${active.length - 3}`) : \"\"));\n } else if (done < total) {\n lines.push(dim(\"Active \") + \"starting…\");\n } else {\n lines.push(\"\");\n }\n\n lines.push(\"\");\n if (recent.length === 0) {\n lines.push(dim(\"Waiting for first page…\"));\n } else {\n for (const result of recent) {\n const detail = detailForResult(result);\n lines.push(`${statusForResult(result, dryRun)} ${labelForResult(result)}${detail ? ` ${detail}` : \"\"}`);\n }\n }\n\n for (const line of lines) {\n process.stdout.write(\"\\x1b[2K\" + line + \"\\n\");\n }\n renderedLines = lines.length;\n }\n\n return {\n onEvent(event) {\n switch (event.type) {\n case \"start\":\n total = event.total;\n concurrency = event.concurrency;\n model = event.model;\n render();\n break;\n case \"item-start\":\n active = event.active;\n render();\n break;\n case \"item-done\": {\n done += 1;\n active = active.filter((label) => label !== labelForResult(event.result));\n inputTokens += event.result.usage?.inputTokens ?? 0;\n outputTokens += event.result.usage?.outputTokens ?? 0;\n estimatedCostUsd += event.result.estimatedCostUsd ?? 0;\n recent.unshift(event.result);\n recent.splice(recentLimit);\n render();\n break;\n }\n case \"done\":\n showCursor();\n if (renderedLines > 0) {\n process.stdout.write(`\\x1b[${renderedLines}A`);\n }\n process.stdout.write(\"\\x1b[2K\" + green(\"Done\") + \" · \" + formatSummaryLine(event.totals, dryRun) + \"\\n\");\n renderedLines = 0;\n for (const result of event.results.filter((entry) => entry.failed)) {\n process.stdout.write(\"\\x1b[2K\" + red(`${labelForResult(result)}: ${result.error ?? \"failed\"}`) + \"\\n\");\n }\n break;\n }\n },\n finish() {\n showCursor();\n },\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/** Package version from the nearest `scribe-cms` package.json (works from source or dist). */\nexport function readScribeVersion(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n for (;;) {\n const candidate = path.join(dir, \"package.json\");\n if (fs.existsSync(candidate)) {\n const pkg = JSON.parse(fs.readFileSync(candidate, \"utf8\")) as {\n name?: string;\n version?: string;\n };\n if (pkg.name === \"scribe-cms\" && pkg.version) return pkg.version;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return \"unknown\";\n}\n\nexport const SCRIBE_VERSION = readScribeVersion();\n"]}
|