@_linked/translation 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +15 -16
  2. package/lib/esm/archive.d.ts +2 -2
  3. package/lib/esm/archive.js +2 -2
  4. package/lib/esm/archive.js.map +1 -1
  5. package/lib/esm/authorization.d.ts +1 -1
  6. package/lib/esm/authorization.js +1 -1
  7. package/lib/esm/authorization.js.map +1 -1
  8. package/lib/esm/cdn-loader.d.ts +1 -1
  9. package/lib/esm/cdn-loader.js.map +1 -1
  10. package/lib/esm/core/messages.d.ts +14 -1
  11. package/lib/esm/core/messages.js +33 -2
  12. package/lib/esm/core/messages.js.map +1 -1
  13. package/lib/esm/exchange.d.ts +1 -1
  14. package/lib/esm/exchange.js +1 -1
  15. package/lib/esm/exchange.js.map +1 -1
  16. package/lib/esm/export.js +4 -1
  17. package/lib/esm/export.js.map +1 -1
  18. package/lib/esm/formats/xliff.js +1 -1
  19. package/lib/esm/formats/xliff.js.map +1 -1
  20. package/lib/esm/key-sync.d.ts +12 -0
  21. package/lib/esm/key-sync.js +32 -7
  22. package/lib/esm/key-sync.js.map +1 -1
  23. package/lib/esm/mt.js +1 -1
  24. package/lib/esm/mt.js.map +1 -1
  25. package/lib/esm/ontologies/translation.d.ts +3 -1
  26. package/lib/esm/ontologies/translation.js +4 -2
  27. package/lib/esm/ontologies/translation.js.map +1 -1
  28. package/lib/esm/react.d.ts +38 -2
  29. package/lib/esm/react.js +98 -15
  30. package/lib/esm/react.js.map +1 -1
  31. package/lib/esm/records.d.ts +2 -1
  32. package/lib/esm/records.js.map +1 -1
  33. package/lib/esm/release.d.ts +3 -1
  34. package/lib/esm/release.js +21 -4
  35. package/lib/esm/release.js.map +1 -1
  36. package/lib/esm/shape-catalog.d.ts +1 -1
  37. package/lib/esm/shape-catalog.js.map +1 -1
  38. package/lib/esm/shapes/TranslationKey.d.ts +10 -5
  39. package/lib/esm/shapes/TranslationKey.js +16 -5
  40. package/lib/esm/shapes/TranslationKey.js.map +1 -1
  41. package/lib/esm/shapes/TranslationProvider.d.ts +25 -8
  42. package/lib/esm/shapes/TranslationProvider.js +50 -19
  43. package/lib/esm/shapes/TranslationProvider.js.map +1 -1
  44. package/package.json +3 -3
  45. package/src/archive.ts +2 -2
  46. package/src/authorization.ts +1 -1
  47. package/src/cdn-loader.ts +1 -1
  48. package/src/core/messages.ts +35 -2
  49. package/src/exchange.ts +1 -1
  50. package/src/export.ts +4 -1
  51. package/src/formats/xliff.ts +1 -1
  52. package/src/key-sync.ts +46 -6
  53. package/src/mt.ts +1 -1
  54. package/src/ontologies/translation.ts +4 -2
  55. package/src/react.tsx +158 -35
  56. package/src/records.ts +2 -1
  57. package/src/release.ts +31 -3
  58. package/src/shape-catalog.ts +1 -1
  59. package/src/shapes/TranslationKey.ts +14 -5
  60. package/src/shapes/TranslationProvider.ts +73 -13
@@ -1 +1 @@
1
- {"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../src/exchange.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MessageFormat } from './core/messages.js';\nimport { canonicalLanguageTag } from './key-version.js';\nimport type { TranslationState } from './records.js';\n\nexport type TranslationExchangeKind = 'ui' | 'semantic';\nexport type TranslationDeclarationKind =\n | TranslationExchangeKind\n | 'content';\nexport type TranslationDeclarationStatus = 'confirmed' | 'pending';\n\n/**\n * The build-facing subset of the later multi-source discovery contract.\n * Static extraction omits the optional fields and retains its existing\n * confirmed/simple behavior.\n */\nexport interface TranslationBuildDeclaration {\n key: string;\n sourceText: string;\n format?: MessageFormat;\n kind?: TranslationDeclarationKind;\n status?: TranslationDeclarationStatus;\n authoritative?: boolean;\n namespace?: string;\n file?: string;\n line?: number;\n}\n\nexport interface TranslationExchangeValue {\n text: string;\n state?: TranslationState;\n note?: string;\n}\n\nexport interface TranslationExchangeEntry {\n key: string;\n namespace?: string;\n kind: TranslationExchangeKind;\n sourceText: string;\n keyVersionId: string;\n sourceHash: string;\n contractHash: string;\n argumentSignature: string;\n description?: string;\n format: MessageFormat;\n translations: Record<string, TranslationExchangeValue>;\n}\n\nexport interface TranslationExchangeDocument {\n schemaVersion: 1;\n appId?: string;\n branchId?: string;\n sourceLanguage: string;\n targetLanguages: string[];\n exportedAt?: string;\n revisionWatermark?: string;\n contractSetHash?: string;\n entries: TranslationExchangeEntry[];\n}\n\nexport type ParsedTranslationExchangeEntry = Omit<\n TranslationExchangeEntry,\n | 'sourceText'\n | 'keyVersionId'\n | 'sourceHash'\n | 'contractHash'\n | 'argumentSignature'\n> & {\n sourceText?: string;\n keyVersionId?: string;\n sourceHash?: string;\n contractHash?: string;\n argumentSignature?: string;\n};\n\nexport interface ParsedTranslationExchangeDocument\n extends Omit<TranslationExchangeDocument, 'entries'> {\n entries: ParsedTranslationExchangeEntry[];\n}\n\nexport type TranslationFormat =\n | 'xliff-1.2'\n | 'xliff-2.0'\n | 'csv'\n | 'json';\n\nexport interface SerializedTranslationDocument {\n fileName: string;\n mediaType: string;\n body: Uint8Array;\n}\n\nexport interface TranslationFormatAdapter {\n readonly format: TranslationFormat;\n sniff(input: Uint8Array, fileName?: string): boolean;\n parse(\n input: Uint8Array,\n options?: unknown,\n ): Promise<ParsedTranslationExchangeDocument>;\n serialize(\n document: TranslationExchangeDocument,\n options?: unknown,\n ): Promise<SerializedTranslationDocument>;\n}\n\nexport type TranslationImportDisposition =\n | 'import'\n | 'carry-forward'\n | 'unverified-source'\n | 'conflict'\n | 'skip';\n\nexport interface TranslationImportDryRunEntry {\n key: string;\n language: string;\n disposition: TranslationImportDisposition;\n expectedKeyVersionId?: string;\n expectedUnitContentHash?: string;\n}\n\nexport interface TranslationImportDryRun {\n sessionId: string;\n documentHash: string;\n revisionWatermark: string;\n expiresAt: string;\n entries: TranslationImportDryRunEntry[];\n}\n\nconst EXCHANGE_STATES = new Set<TranslationState>([\n 'untranslated',\n 'machine',\n 'reviewed',\n 'stale',\n]);\nconst adapters = new Map<TranslationFormat, TranslationFormatAdapter>();\n\nfunction record(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} must be an object.`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction requiredString(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) {\n throw new Error(`${label} is required.`);\n }\n return value.trim();\n}\n\nfunction optionalString(value: unknown, label: string): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== 'string' || !value.trim()) {\n throw new Error(`${label} must be a non-empty string when supplied.`);\n }\n return value.trim();\n}\n\nfunction messageFormat(value: unknown, label: string): MessageFormat {\n if (value !== 'simple' && value !== 'icu') {\n throw new Error(`${label} must be \"simple\" or \"icu\".`);\n }\n return value;\n}\n\nfunction exchangeKind(value: unknown, label: string): TranslationExchangeKind {\n if (value !== 'ui' && value !== 'semantic') {\n throw new Error(`${label} must be \"ui\" or \"semantic\".`);\n }\n return value;\n}\n\nfunction canonicalLanguages(value: unknown, label: string): string[] {\n if (!Array.isArray(value)) throw new Error(`${label} must be an array.`);\n const canonical: string[] = [];\n const seen = new Set<string>();\n for (const item of value) {\n if (typeof item !== 'string') {\n throw new Error(`${label} must contain only BCP-47 strings.`);\n }\n const language = canonicalLanguageTag(item);\n if (!seen.has(language)) {\n seen.add(language);\n canonical.push(language);\n }\n }\n return canonical;\n}\n\nfunction normalizeTranslations(\n value: unknown,\n label: string,\n): Record<string, TranslationExchangeValue> {\n const input = record(value, label);\n const translations: Record<string, TranslationExchangeValue> = {};\n for (const [rawLanguage, rawValue] of Object.entries(input)) {\n const language = canonicalLanguageTag(rawLanguage);\n if (translations[language]) {\n throw new Error(\n `${label} contains duplicate canonical language \"${language}\".`,\n );\n }\n const item = record(rawValue, `${label}.${rawLanguage}`);\n if (typeof item.text !== 'string') {\n throw new Error(`${label}.${rawLanguage}.text must be a string.`);\n }\n const state = item.state;\n if (state !== undefined && !EXCHANGE_STATES.has(state as TranslationState)) {\n throw new Error(`${label}.${rawLanguage}.state is invalid.`);\n }\n translations[language] = {\n text: item.text,\n ...(state ? { state: state as TranslationState } : {}),\n ...(item.note === undefined\n ? {}\n : {\n note: requiredString(\n item.note,\n `${label}.${rawLanguage}.note`,\n ),\n }),\n };\n }\n return translations;\n}\n\nfunction normalizeEntry(\n value: unknown,\n index: number,\n): ParsedTranslationExchangeEntry {\n const item = record(value, `entries[${index}]`);\n const key = requiredString(item.key, `entries[${index}].key`);\n return {\n key,\n ...(item.namespace === undefined\n ? {}\n : {\n namespace: requiredString(\n item.namespace,\n `entries[${index}].namespace`,\n ),\n }),\n kind: exchangeKind(item.kind, `entries[${index}].kind`),\n format: messageFormat(item.format, `entries[${index}].format`),\n ...(item.sourceText === undefined\n ? {}\n : {\n sourceText:\n typeof item.sourceText === 'string'\n ? item.sourceText\n : requiredString(item.sourceText, `entries[${index}].sourceText`),\n }),\n ...(item.keyVersionId === undefined\n ? {}\n : {\n keyVersionId: requiredString(\n item.keyVersionId,\n `entries[${index}].keyVersionId`,\n ),\n }),\n ...(item.sourceHash === undefined\n ? {}\n : {\n sourceHash: requiredString(\n item.sourceHash,\n `entries[${index}].sourceHash`,\n ),\n }),\n ...(item.contractHash === undefined\n ? {}\n : {\n contractHash: requiredString(\n item.contractHash,\n `entries[${index}].contractHash`,\n ),\n }),\n ...(item.argumentSignature === undefined\n ? {}\n : {\n argumentSignature: requiredString(\n item.argumentSignature,\n `entries[${index}].argumentSignature`,\n ),\n }),\n ...(item.description === undefined\n ? {}\n : {\n description: requiredString(\n item.description,\n `entries[${index}].description`,\n ),\n }),\n translations: normalizeTranslations(\n item.translations,\n `entries[${index}].translations`,\n ),\n };\n}\n\n/**\n * Normalize adapter output without inventing evidence missing from a foreign\n * file. Import disposition handles those entries as unverified later.\n */\nexport function normalizeParsedTranslationExchangeDocument(\n value: unknown,\n): ParsedTranslationExchangeDocument {\n const input = record(value, 'Translation exchange document');\n if (input.schemaVersion !== 1) {\n throw new Error('Translation exchange schemaVersion must be 1.');\n }\n const sourceLanguage = canonicalLanguageTag(\n requiredString(input.sourceLanguage, 'sourceLanguage'),\n );\n const targetLanguages = canonicalLanguages(\n input.targetLanguages,\n 'targetLanguages',\n );\n if (!Array.isArray(input.entries)) {\n throw new Error('entries must be an array.');\n }\n const entries = input.entries.map(normalizeEntry);\n const identities = new Set<string>();\n for (const entry of entries) {\n for (const language of Object.keys(entry.translations)) {\n const identity = `${entry.namespace ?? ''}\\u0000${entry.key}\\u0000${language}`;\n if (identities.has(identity)) {\n throw new Error(\n `Duplicate translation entry for \"${entry.key}\" in ${language}.`,\n );\n }\n identities.add(identity);\n }\n }\n return {\n schemaVersion: 1,\n ...(input.appId === undefined\n ? {}\n : { appId: requiredString(input.appId, 'appId') }),\n ...(input.branchId === undefined\n ? {}\n : { branchId: requiredString(input.branchId, 'branchId') }),\n sourceLanguage,\n targetLanguages,\n ...(input.exportedAt === undefined\n ? {}\n : { exportedAt: requiredString(input.exportedAt, 'exportedAt') }),\n ...(input.revisionWatermark === undefined\n ? {}\n : {\n revisionWatermark: requiredString(\n input.revisionWatermark,\n 'revisionWatermark',\n ),\n }),\n ...(input.contractSetHash === undefined\n ? {}\n : {\n contractSetHash: requiredString(\n input.contractSetHash,\n 'contractSetHash',\n ),\n }),\n entries,\n };\n}\n\n/** Validate the stronger, version-evidenced document required for CN exports. */\nexport function validateTranslationExchangeDocument(\n value: unknown,\n): TranslationExchangeDocument {\n const parsed = normalizeParsedTranslationExchangeDocument(value);\n const entries = parsed.entries.map((entry, index): TranslationExchangeEntry => ({\n ...entry,\n sourceText:\n entry.sourceText ??\n requiredString(undefined, `entries[${index}].sourceText`),\n keyVersionId:\n entry.keyVersionId ??\n requiredString(undefined, `entries[${index}].keyVersionId`),\n sourceHash:\n entry.sourceHash ??\n requiredString(undefined, `entries[${index}].sourceHash`),\n contractHash:\n entry.contractHash ??\n requiredString(undefined, `entries[${index}].contractHash`),\n argumentSignature:\n entry.argumentSignature ??\n requiredString(undefined, `entries[${index}].argumentSignature`),\n }));\n return { ...parsed, entries };\n}\n\nexport function isConfirmedBuildDeclaration(\n declaration: TranslationBuildDeclaration,\n): boolean {\n return (\n (declaration.kind ?? 'ui') !== 'content' &&\n (declaration.status ?? 'confirmed') === 'confirmed' &&\n declaration.authoritative !== false\n );\n}\n\nexport function registerTranslationFormatAdapter(\n adapter: TranslationFormatAdapter,\n): void {\n if (adapters.has(adapter.format)) {\n throw new Error(\n `Translation format adapter \"${adapter.format}\" is already registered.`,\n );\n }\n adapters.set(adapter.format, adapter);\n}\n\nexport function getTranslationFormatAdapter(\n format: TranslationFormat,\n): TranslationFormatAdapter | undefined {\n return adapters.get(format);\n}\n\nexport function listTranslationFormatAdapters(): TranslationFormatAdapter[] {\n return [...adapters.values()].sort((left, right) =>\n left.format.localeCompare(right.format),\n );\n}\n\n/** Test/host reset hook; adapters are registered explicitly by the host. */\nexport function clearTranslationFormatAdapters(): void {\n adapters.clear();\n}\n"]}
1
+ {"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../src/exchange.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MessageFormat } from './core/messages.js';\nimport { canonicalLanguageTag } from './key-version.js';\nimport type { TranslationState } from './records.js';\n\nexport type TranslationExchangeKind = 'ui' | 'semantic';\nexport type TranslationDeclarationKind =\n | TranslationExchangeKind\n | 'content';\nexport type TranslationDeclarationStatus = 'confirmed' | 'pending';\n\n/**\n * The build-facing subset of the later multi-source discovery contract.\n * Static extraction omits the optional fields and retains its existing\n * confirmed/simple behavior.\n */\nexport interface TranslationBuildDeclaration {\n key: string;\n sourceText: string;\n format?: MessageFormat;\n kind?: TranslationDeclarationKind;\n status?: TranslationDeclarationStatus;\n authoritative?: boolean;\n namespace?: string;\n file?: string;\n line?: number;\n}\n\nexport interface TranslationExchangeValue {\n text: string;\n state?: TranslationState;\n note?: string;\n}\n\nexport interface TranslationExchangeEntry {\n key: string;\n namespace?: string;\n kind: TranslationExchangeKind;\n sourceText: string;\n keyVersionId: string;\n sourceHash: string;\n contractHash: string;\n argumentSignature: string;\n description?: string;\n format: MessageFormat;\n translations: Record<string, TranslationExchangeValue>;\n}\n\nexport interface TranslationExchangeDocument {\n schemaVersion: 1;\n appId?: string;\n branchId?: string;\n sourceLanguage: string;\n targetLanguages: string[];\n exportedAt?: string;\n revisionWatermark?: string;\n contractSetHash?: string;\n entries: TranslationExchangeEntry[];\n}\n\nexport type ParsedTranslationExchangeEntry = Omit<\n TranslationExchangeEntry,\n | 'sourceText'\n | 'keyVersionId'\n | 'sourceHash'\n | 'contractHash'\n | 'argumentSignature'\n> & {\n sourceText?: string;\n keyVersionId?: string;\n sourceHash?: string;\n contractHash?: string;\n argumentSignature?: string;\n};\n\nexport interface ParsedTranslationExchangeDocument\n extends Omit<TranslationExchangeDocument, 'entries'> {\n entries: ParsedTranslationExchangeEntry[];\n}\n\nexport type TranslationFormat =\n | 'xliff-1.2'\n | 'xliff-2.0'\n | 'csv'\n | 'json';\n\nexport interface SerializedTranslationDocument {\n fileName: string;\n mediaType: string;\n body: Uint8Array;\n}\n\nexport interface TranslationFormatAdapter {\n readonly format: TranslationFormat;\n sniff(input: Uint8Array, fileName?: string): boolean;\n parse(\n input: Uint8Array,\n options?: unknown,\n ): Promise<ParsedTranslationExchangeDocument>;\n serialize(\n document: TranslationExchangeDocument,\n options?: unknown,\n ): Promise<SerializedTranslationDocument>;\n}\n\nexport type TranslationImportDisposition =\n | 'import'\n | 'carry-forward'\n | 'unverified-source'\n | 'conflict'\n | 'skip';\n\nexport interface TranslationImportDryRunEntry {\n key: string;\n language: string;\n disposition: TranslationImportDisposition;\n expectedKeyVersionId?: string;\n expectedUnitContentHash?: string;\n}\n\nexport interface TranslationImportDryRun {\n sessionId: string;\n documentHash: string;\n revisionWatermark: string;\n expiresAt: string;\n entries: TranslationImportDryRunEntry[];\n}\n\nconst EXCHANGE_STATES = new Set<TranslationState>([\n 'untranslated',\n 'machine',\n 'reviewed',\n 'stale',\n]);\nconst adapters = new Map<TranslationFormat, TranslationFormatAdapter>();\n\nfunction record(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} must be an object.`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction requiredString(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) {\n throw new Error(`${label} is required.`);\n }\n return value.trim();\n}\n\nfunction optionalString(value: unknown, label: string): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== 'string' || !value.trim()) {\n throw new Error(`${label} must be a non-empty string when supplied.`);\n }\n return value.trim();\n}\n\nfunction messageFormat(value: unknown, label: string): MessageFormat {\n if (value !== 'simple' && value !== 'icu') {\n throw new Error(`${label} must be \"simple\" or \"icu\".`);\n }\n return value;\n}\n\nfunction exchangeKind(value: unknown, label: string): TranslationExchangeKind {\n if (value !== 'ui' && value !== 'semantic') {\n throw new Error(`${label} must be \"ui\" or \"semantic\".`);\n }\n return value;\n}\n\nfunction canonicalLanguages(value: unknown, label: string): string[] {\n if (!Array.isArray(value)) throw new Error(`${label} must be an array.`);\n const canonical: string[] = [];\n const seen = new Set<string>();\n for (const item of value) {\n if (typeof item !== 'string') {\n throw new Error(`${label} must contain only BCP-47 strings.`);\n }\n const language = canonicalLanguageTag(item);\n if (!seen.has(language)) {\n seen.add(language);\n canonical.push(language);\n }\n }\n return canonical;\n}\n\nfunction normalizeTranslations(\n value: unknown,\n label: string,\n): Record<string, TranslationExchangeValue> {\n const input = record(value, label);\n const translations: Record<string, TranslationExchangeValue> = {};\n for (const [rawLanguage, rawValue] of Object.entries(input)) {\n const language = canonicalLanguageTag(rawLanguage);\n if (translations[language]) {\n throw new Error(\n `${label} contains duplicate canonical language \"${language}\".`,\n );\n }\n const item = record(rawValue, `${label}.${rawLanguage}`);\n if (typeof item.text !== 'string') {\n throw new Error(`${label}.${rawLanguage}.text must be a string.`);\n }\n const state = item.state;\n if (state !== undefined && !EXCHANGE_STATES.has(state as TranslationState)) {\n throw new Error(`${label}.${rawLanguage}.state is invalid.`);\n }\n translations[language] = {\n text: item.text,\n ...(state ? { state: state as TranslationState } : {}),\n ...(item.note === undefined\n ? {}\n : {\n note: requiredString(\n item.note,\n `${label}.${rawLanguage}.note`,\n ),\n }),\n };\n }\n return translations;\n}\n\nfunction normalizeEntry(\n value: unknown,\n index: number,\n): ParsedTranslationExchangeEntry {\n const item = record(value, `entries[${index}]`);\n const key = requiredString(item.key, `entries[${index}].key`);\n return {\n key,\n ...(item.namespace === undefined\n ? {}\n : {\n namespace: requiredString(\n item.namespace,\n `entries[${index}].namespace`,\n ),\n }),\n kind: exchangeKind(item.kind, `entries[${index}].kind`),\n format: messageFormat(item.format, `entries[${index}].format`),\n ...(item.sourceText === undefined\n ? {}\n : {\n sourceText:\n typeof item.sourceText === 'string'\n ? item.sourceText\n : requiredString(item.sourceText, `entries[${index}].sourceText`),\n }),\n ...(item.keyVersionId === undefined\n ? {}\n : {\n keyVersionId: requiredString(\n item.keyVersionId,\n `entries[${index}].keyVersionId`,\n ),\n }),\n ...(item.sourceHash === undefined\n ? {}\n : {\n sourceHash: requiredString(\n item.sourceHash,\n `entries[${index}].sourceHash`,\n ),\n }),\n ...(item.contractHash === undefined\n ? {}\n : {\n contractHash: requiredString(\n item.contractHash,\n `entries[${index}].contractHash`,\n ),\n }),\n ...(item.argumentSignature === undefined\n ? {}\n : {\n argumentSignature: requiredString(\n item.argumentSignature,\n `entries[${index}].argumentSignature`,\n ),\n }),\n ...(item.description === undefined\n ? {}\n : {\n description: requiredString(\n item.description,\n `entries[${index}].description`,\n ),\n }),\n translations: normalizeTranslations(\n item.translations,\n `entries[${index}].translations`,\n ),\n };\n}\n\n/**\n * Normalize adapter output without inventing evidence missing from a foreign\n * file. Import disposition handles those entries as unverified later.\n */\nexport function normalizeParsedTranslationExchangeDocument(\n value: unknown,\n): ParsedTranslationExchangeDocument {\n const input = record(value, 'Translation exchange document');\n if (input.schemaVersion !== 1) {\n throw new Error('Translation exchange schemaVersion must be 1.');\n }\n const sourceLanguage = canonicalLanguageTag(\n requiredString(input.sourceLanguage, 'sourceLanguage'),\n );\n const targetLanguages = canonicalLanguages(\n input.targetLanguages,\n 'targetLanguages',\n );\n if (!Array.isArray(input.entries)) {\n throw new Error('entries must be an array.');\n }\n const entries = input.entries.map(normalizeEntry);\n const identities = new Set<string>();\n for (const entry of entries) {\n for (const language of Object.keys(entry.translations)) {\n const identity = `${entry.namespace ?? ''}\\u0000${entry.key}\\u0000${language}`;\n if (identities.has(identity)) {\n throw new Error(\n `Duplicate translation entry for \"${entry.key}\" in ${language}.`,\n );\n }\n identities.add(identity);\n }\n }\n return {\n schemaVersion: 1,\n ...(input.appId === undefined\n ? {}\n : { appId: requiredString(input.appId, 'appId') }),\n ...(input.branchId === undefined\n ? {}\n : { branchId: requiredString(input.branchId, 'branchId') }),\n sourceLanguage,\n targetLanguages,\n ...(input.exportedAt === undefined\n ? {}\n : { exportedAt: requiredString(input.exportedAt, 'exportedAt') }),\n ...(input.revisionWatermark === undefined\n ? {}\n : {\n revisionWatermark: requiredString(\n input.revisionWatermark,\n 'revisionWatermark',\n ),\n }),\n ...(input.contractSetHash === undefined\n ? {}\n : {\n contractSetHash: requiredString(\n input.contractSetHash,\n 'contractSetHash',\n ),\n }),\n entries,\n };\n}\n\n/** Validate the stronger, version-evidenced document this package's own exports carry. */\nexport function validateTranslationExchangeDocument(\n value: unknown,\n): TranslationExchangeDocument {\n const parsed = normalizeParsedTranslationExchangeDocument(value);\n const entries = parsed.entries.map((entry, index): TranslationExchangeEntry => ({\n ...entry,\n sourceText:\n entry.sourceText ??\n requiredString(undefined, `entries[${index}].sourceText`),\n keyVersionId:\n entry.keyVersionId ??\n requiredString(undefined, `entries[${index}].keyVersionId`),\n sourceHash:\n entry.sourceHash ??\n requiredString(undefined, `entries[${index}].sourceHash`),\n contractHash:\n entry.contractHash ??\n requiredString(undefined, `entries[${index}].contractHash`),\n argumentSignature:\n entry.argumentSignature ??\n requiredString(undefined, `entries[${index}].argumentSignature`),\n }));\n return { ...parsed, entries };\n}\n\nexport function isConfirmedBuildDeclaration(\n declaration: TranslationBuildDeclaration,\n): boolean {\n return (\n (declaration.kind ?? 'ui') !== 'content' &&\n (declaration.status ?? 'confirmed') === 'confirmed' &&\n declaration.authoritative !== false\n );\n}\n\nexport function registerTranslationFormatAdapter(\n adapter: TranslationFormatAdapter,\n): void {\n if (adapters.has(adapter.format)) {\n throw new Error(\n `Translation format adapter \"${adapter.format}\" is already registered.`,\n );\n }\n adapters.set(adapter.format, adapter);\n}\n\nexport function getTranslationFormatAdapter(\n format: TranslationFormat,\n): TranslationFormatAdapter | undefined {\n return adapters.get(format);\n}\n\nexport function listTranslationFormatAdapters(): TranslationFormatAdapter[] {\n return [...adapters.values()].sort((left, right) =>\n left.format.localeCompare(right.format),\n );\n}\n\n/** Test/host reset hook; adapters are registered explicitly by the host. */\nexport function clearTranslationFormatAdapters(): void {\n adapters.clear();\n}\n"]}
package/lib/esm/export.js CHANGED
@@ -56,7 +56,10 @@ export async function createTranslationExchangeDocument(entries, options) {
56
56
  exportEntries.push({
57
57
  key: entry.key,
58
58
  namespace: entry.namespace,
59
- kind: entry.ofShape || entry.ofProperty || entry.fromPackage
59
+ kind: entry.ofShape ||
60
+ entry.ofProperty ||
61
+ entry.ofResource ||
62
+ entry.fromPackage
60
63
  ? 'semantic'
61
64
  : 'ui',
62
65
  sourceText: version.sourceText,
@@ -1 +1 @@
1
- {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/export.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n validateTranslationExchangeDocument,\n type TranslationExchangeDocument,\n type TranslationExchangeEntry,\n} from './exchange.js';\nimport { canonicalLanguageTag, sha256Hex } from './key-version.js';\nimport { canonicalJson, translationContractSetHash } from './release.js';\nimport type {\n TranslationEntryRecord,\n TranslationState,\n} from './records.js';\n\nexport interface TranslationExportOptions {\n appId?: string;\n branchId?: string;\n sourceLanguage: string;\n revisionWatermark: string;\n exportedAt?: string;\n languages?: readonly string[];\n namespaces?: readonly string[];\n keys?: readonly string[];\n states?: readonly TranslationState[];\n}\n\nexport interface TranslationExportFinding {\n key: string;\n code: 'content-key-unsupported' | 'missing-current-version';\n message: string;\n}\n\nexport interface TranslationExportResult {\n document: TranslationExchangeDocument;\n documentHash: string;\n findings: TranslationExportFinding[];\n}\n\n/**\n * Build one deterministic, version-evidenced exchange snapshot. Content keys\n * and versionless keys are reported rather than silently losing metadata.\n */\nexport async function createTranslationExchangeDocument(\n entries: readonly TranslationEntryRecord[],\n options: TranslationExportOptions,\n): Promise<TranslationExportResult> {\n const sourceLanguage = canonicalLanguageTag(options.sourceLanguage);\n const languageFilter = options.languages\n ? new Set(options.languages.map(canonicalLanguageTag))\n : undefined;\n const namespaceFilter = options.namespaces\n ? new Set(options.namespaces)\n : undefined;\n const keyFilter = options.keys ? new Set(options.keys) : undefined;\n const stateFilter = options.states ? new Set(options.states) : undefined;\n const findings: TranslationExportFinding[] = [];\n const exportEntries: TranslationExchangeEntry[] = [];\n\n for (const entry of [...entries].sort((left, right) =>\n `${left.namespace}\\u0000${left.key}`.localeCompare(\n `${right.namespace}\\u0000${right.key}`,\n ),\n )) {\n if (namespaceFilter && !namespaceFilter.has(entry.namespace)) continue;\n if (keyFilter && !keyFilter.has(entry.key)) continue;\n if (entry.kind === 'content') {\n findings.push({\n key: entry.key,\n code: 'content-key-unsupported',\n message: 'Content translations are not part of the UI exchange format.',\n });\n continue;\n }\n const version = entry.currentVersion;\n if (!version) {\n findings.push({\n key: entry.key,\n code: 'missing-current-version',\n message: 'The key has no current immutable version.',\n });\n continue;\n }\n const translations: TranslationExchangeEntry['translations'] = {};\n for (const [rawLanguage, unit] of Object.entries(entry.units).sort(\n ([left], [right]) => left.localeCompare(right),\n )) {\n const language = canonicalLanguageTag(rawLanguage);\n if (language === sourceLanguage) continue;\n if (languageFilter && !languageFilter.has(language)) continue;\n if (stateFilter && !stateFilter.has(unit.state)) continue;\n translations[language] = {\n text: unit.text,\n state: unit.state,\n };\n }\n exportEntries.push({\n key: entry.key,\n namespace: entry.namespace,\n kind:\n entry.ofShape || entry.ofProperty || entry.fromPackage\n ? 'semantic'\n : 'ui',\n sourceText: version.sourceText,\n keyVersionId: version.id,\n sourceHash: version.sourceHash,\n contractHash: version.contractHash,\n argumentSignature: version.argumentSignature,\n description: entry.description,\n format: version.format,\n translations,\n });\n }\n\n const targetLanguages = [\n ...new Set(\n exportEntries.flatMap((entry) => Object.keys(entry.translations)),\n ),\n ].sort();\n const document = validateTranslationExchangeDocument({\n schemaVersion: 1,\n appId: options.appId,\n branchId: options.branchId,\n sourceLanguage,\n targetLanguages,\n exportedAt: options.exportedAt,\n revisionWatermark: options.revisionWatermark,\n contractSetHash: await translationContractSetHash(\n entries.filter((entry) => entry.kind === 'ui') as TranslationEntryRecord[],\n ),\n entries: exportEntries,\n });\n return {\n document,\n documentHash: await sha256Hex(canonicalJson(document)),\n findings,\n };\n}\n"]}
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/export.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n validateTranslationExchangeDocument,\n type TranslationExchangeDocument,\n type TranslationExchangeEntry,\n} from './exchange.js';\nimport { canonicalLanguageTag, sha256Hex } from './key-version.js';\nimport { canonicalJson, translationContractSetHash } from './release.js';\nimport type {\n TranslationEntryRecord,\n TranslationState,\n} from './records.js';\n\nexport interface TranslationExportOptions {\n appId?: string;\n branchId?: string;\n sourceLanguage: string;\n revisionWatermark: string;\n exportedAt?: string;\n languages?: readonly string[];\n namespaces?: readonly string[];\n keys?: readonly string[];\n states?: readonly TranslationState[];\n}\n\nexport interface TranslationExportFinding {\n key: string;\n code: 'content-key-unsupported' | 'missing-current-version';\n message: string;\n}\n\nexport interface TranslationExportResult {\n document: TranslationExchangeDocument;\n documentHash: string;\n findings: TranslationExportFinding[];\n}\n\n/**\n * Build one deterministic, version-evidenced exchange snapshot. Content keys\n * and versionless keys are reported rather than silently losing metadata.\n */\nexport async function createTranslationExchangeDocument(\n entries: readonly TranslationEntryRecord[],\n options: TranslationExportOptions,\n): Promise<TranslationExportResult> {\n const sourceLanguage = canonicalLanguageTag(options.sourceLanguage);\n const languageFilter = options.languages\n ? new Set(options.languages.map(canonicalLanguageTag))\n : undefined;\n const namespaceFilter = options.namespaces\n ? new Set(options.namespaces)\n : undefined;\n const keyFilter = options.keys ? new Set(options.keys) : undefined;\n const stateFilter = options.states ? new Set(options.states) : undefined;\n const findings: TranslationExportFinding[] = [];\n const exportEntries: TranslationExchangeEntry[] = [];\n\n for (const entry of [...entries].sort((left, right) =>\n `${left.namespace}\\u0000${left.key}`.localeCompare(\n `${right.namespace}\\u0000${right.key}`,\n ),\n )) {\n if (namespaceFilter && !namespaceFilter.has(entry.namespace)) continue;\n if (keyFilter && !keyFilter.has(entry.key)) continue;\n if (entry.kind === 'content') {\n findings.push({\n key: entry.key,\n code: 'content-key-unsupported',\n message: 'Content translations are not part of the UI exchange format.',\n });\n continue;\n }\n const version = entry.currentVersion;\n if (!version) {\n findings.push({\n key: entry.key,\n code: 'missing-current-version',\n message: 'The key has no current immutable version.',\n });\n continue;\n }\n const translations: TranslationExchangeEntry['translations'] = {};\n for (const [rawLanguage, unit] of Object.entries(entry.units).sort(\n ([left], [right]) => left.localeCompare(right),\n )) {\n const language = canonicalLanguageTag(rawLanguage);\n if (language === sourceLanguage) continue;\n if (languageFilter && !languageFilter.has(language)) continue;\n if (stateFilter && !stateFilter.has(unit.state)) continue;\n translations[language] = {\n text: unit.text,\n state: unit.state,\n };\n }\n exportEntries.push({\n key: entry.key,\n namespace: entry.namespace,\n kind:\n entry.ofShape ||\n entry.ofProperty ||\n entry.ofResource ||\n entry.fromPackage\n ? 'semantic'\n : 'ui',\n sourceText: version.sourceText,\n keyVersionId: version.id,\n sourceHash: version.sourceHash,\n contractHash: version.contractHash,\n argumentSignature: version.argumentSignature,\n description: entry.description,\n format: version.format,\n translations,\n });\n }\n\n const targetLanguages = [\n ...new Set(\n exportEntries.flatMap((entry) => Object.keys(entry.translations)),\n ),\n ].sort();\n const document = validateTranslationExchangeDocument({\n schemaVersion: 1,\n appId: options.appId,\n branchId: options.branchId,\n sourceLanguage,\n targetLanguages,\n exportedAt: options.exportedAt,\n revisionWatermark: options.revisionWatermark,\n contractSetHash: await translationContractSetHash(\n entries.filter((entry) => entry.kind === 'ui') as TranslationEntryRecord[],\n ),\n entries: exportEntries,\n });\n return {\n document,\n documentHash: await sha256Hex(canonicalJson(document)),\n findings,\n };\n}\n"]}
@@ -4,7 +4,7 @@ const UTF8 = new TextEncoder();
4
4
  * Our own XML metadata namespace for exchange files. It is a file-format
5
5
  * identifier written into exported documents, not the translation ontology
6
6
  * (which lives at `https://linked.cm/ont/translation/`). Files exported before 0.3.0
7
- * used a Create Now URI and a `cn:` prefix; the reader below still accepts
7
+ * used the pre-0.3.0 namespace URI and prefix; the reader below still accepts
8
8
  * both, so those files keep importing.
9
9
  */
10
10
  const EXCHANGE_NAMESPACE = 'https://id.linked.cm/translation/exchange/1';
@@ -1 +1 @@
1
- {"version":3,"file":"xliff.js","sourceRoot":"","sources":["../../../src/formats/xliff.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n normalizeParsedTranslationExchangeDocument,\n type ParsedTranslationExchangeDocument,\n type ParsedTranslationExchangeEntry,\n type TranslationExchangeDocument,\n type TranslationExchangeEntry,\n type TranslationExchangeValue,\n type TranslationFormatAdapter,\n} from '../exchange.js';\nimport type { TranslationState } from '../records.js';\n\nconst UTF8 = new TextEncoder();\n/**\n * Our own XML metadata namespace for exchange files. It is a file-format\n * identifier written into exported documents, not the translation ontology\n * (which lives at `https://linked.cm/ont/translation/`). Files exported before 0.3.0\n * used a Create Now URI and a `cn:` prefix; the reader below still accepts\n * both, so those files keep importing.\n */\nconst EXCHANGE_NAMESPACE = 'https://id.linked.cm/translation/exchange/1';\nconst PREFIX = 'lt';\nconst LEGACY_PREFIX = 'cn';\n/** `from`/`category` on a `<note>`, in current and pre-0.3.0 spelling. */\nconst NOTE_ROLES = {\n description: ['linked-description', 'create-now-description'],\n target: ['linked-target', 'create-now-target'],\n} as const;\n\nfunction isNoteRole(\n value: string | undefined,\n role: keyof typeof NOTE_ROLES,\n): boolean {\n return value !== undefined && (NOTE_ROLES[role] as readonly string[]).includes(value);\n}\nconst XLIFF_12_NAMESPACE = 'urn:oasis:names:tc:xliff:document:1.2';\nconst XLIFF_20_NAMESPACE = 'urn:oasis:names:tc:xliff:document:2.0';\nconst XML_MEDIA_TYPE = 'application/xliff+xml';\n\nconst INLINE_12 = new Set([\n 'bpt',\n 'bx',\n 'ept',\n 'ex',\n 'g',\n 'it',\n 'mrk',\n 'ph',\n 'sub',\n 'x',\n]);\nconst INLINE_20 = new Set(['ec', 'em', 'mrk', 'pc', 'ph', 'sc', 'sm']);\n\ntype XmlChild = XmlNode | string;\n\ninterface XmlNode {\n name: string;\n attributes: Record<string, string>;\n children: XmlChild[];\n}\n\nexport interface XliffFinding {\n code: 'unsupported-inline';\n message: string;\n element: string;\n unitId?: string;\n}\n\nexport interface XliffParseOptions {\n onFinding?: (finding: XliffFinding) => void;\n}\n\ninterface MutableParsedEntry extends ParsedTranslationExchangeEntry {\n translations: Record<string, TranslationExchangeValue>;\n}\n\nfunction text(input: Uint8Array): string {\n return new TextDecoder('utf-8', { fatal: true }).decode(input);\n}\n\nfunction localName(name: string): string {\n const separator = name.indexOf(':');\n return separator === -1 ? name : name.slice(separator + 1);\n}\n\nfunction escapeText(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;');\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value)\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&apos;');\n}\n\nfunction decodeEntities(value: string): string {\n const decoded = value.replace(\n /&(#x[0-9a-fA-F]+|#[0-9]+|amp|lt|gt|quot|apos);/g,\n (entity, body: string) => {\n if (body === 'amp') return '&';\n if (body === 'lt') return '<';\n if (body === 'gt') return '>';\n if (body === 'quot') return '\"';\n if (body === 'apos') return \"'\";\n const point = Number.parseInt(body.slice(body[1] === 'x' ? 2 : 1), body[1] === 'x' ? 16 : 10);\n if (!Number.isFinite(point) || point > 0x10ffff) {\n throw new Error(`Invalid XML character reference \"&${body};\".`);\n }\n return String.fromCodePoint(point);\n },\n );\n const unresolved = /&([A-Za-z_:][\\w.:-]*);/.exec(decoded);\n if (unresolved) {\n throw new Error(`Unsupported XML entity reference \"&${unresolved[1]};\".`);\n }\n return decoded;\n}\n\nfunction readTagEnd(xml: string, start: number): number {\n let quote = '';\n for (let index = start; index < xml.length; index += 1) {\n const character = xml[index];\n if (quote) {\n if (character === quote) quote = '';\n } else if (character === '\"' || character === \"'\") {\n quote = character;\n } else if (character === '>') {\n return index;\n }\n }\n throw new Error('Malformed XML: unterminated tag.');\n}\n\nfunction parseAttributes(input: string): {\n name: string;\n attributes: Record<string, string>;\n selfClosing: boolean;\n} {\n let content = input.trim();\n const selfClosing = content.endsWith('/');\n if (selfClosing) content = content.slice(0, -1).trimEnd();\n const nameMatch = /^([^\\s/>]+)/.exec(content);\n if (!nameMatch) throw new Error('Malformed XML: element name is missing.');\n const name = nameMatch[1];\n const attributes: Record<string, string> = {};\n let remainder = content.slice(name.length);\n const attributePattern = /^\\s+([^\\s=/>]+)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/;\n while (remainder.trim()) {\n const match = attributePattern.exec(remainder);\n if (!match) {\n throw new Error(`Malformed XML attributes on <${name}>.`);\n }\n if (attributes[match[1]] !== undefined) {\n throw new Error(`Duplicate XML attribute \"${match[1]}\".`);\n }\n attributes[match[1]] = decodeEntities(match[3] ?? match[4] ?? '');\n remainder = remainder.slice(match[0].length);\n }\n return { name, attributes, selfClosing };\n}\n\n/**\n * Small, non-validating XML parser for the deliberately narrow XLIFF surface.\n * DTDs and entity declarations are rejected before tokenization, so parsing\n * never performs filesystem or network resolution.\n */\nfunction parseXml(xml: string): XmlNode {\n if (/<!DOCTYPE\\b/i.test(xml) || /<!ENTITY\\b/i.test(xml)) {\n throw new Error('XLIFF containing a DTD or entity declaration is not allowed.');\n }\n const root: XmlNode = {\n name: '#document',\n attributes: {},\n children: [],\n };\n const stack = [root];\n let cursor = 0;\n while (cursor < xml.length) {\n const opening = xml.indexOf('<', cursor);\n if (opening === -1) {\n const trailing = xml.slice(cursor);\n if (trailing) stack.at(-1)!.children.push(decodeEntities(trailing));\n break;\n }\n if (opening > cursor) {\n stack.at(-1)!.children.push(decodeEntities(xml.slice(cursor, opening)));\n }\n if (xml.startsWith('<!--', opening)) {\n const closing = xml.indexOf('-->', opening + 4);\n if (closing === -1) throw new Error('Malformed XML comment.');\n cursor = closing + 3;\n continue;\n }\n if (xml.startsWith('<?', opening)) {\n const closing = xml.indexOf('?>', opening + 2);\n if (closing === -1) throw new Error('Malformed XML processing instruction.');\n cursor = closing + 2;\n continue;\n }\n if (xml.startsWith('<![CDATA[', opening)) {\n const closing = xml.indexOf(']]>', opening + 9);\n if (closing === -1) throw new Error('Malformed XML CDATA section.');\n stack.at(-1)!.children.push(xml.slice(opening + 9, closing));\n cursor = closing + 3;\n continue;\n }\n if (xml.startsWith('</', opening)) {\n const closing = readTagEnd(xml, opening + 2);\n const name = xml.slice(opening + 2, closing).trim();\n const current = stack.pop();\n if (!current || current === root || current.name !== name) {\n throw new Error(`Malformed XML closing tag </${name}>.`);\n }\n cursor = closing + 1;\n continue;\n }\n if (xml.startsWith('<!', opening)) {\n throw new Error('Unsupported XML declaration.');\n }\n const closing = readTagEnd(xml, opening + 1);\n const parsed = parseAttributes(xml.slice(opening + 1, closing));\n const node: XmlNode = {\n name: parsed.name,\n attributes: parsed.attributes,\n children: [],\n };\n stack.at(-1)!.children.push(node);\n if (!parsed.selfClosing) stack.push(node);\n cursor = closing + 1;\n }\n if (stack.length !== 1) {\n throw new Error(`Malformed XML: unclosed <${stack.at(-1)!.name}> element.`);\n }\n const documentElements = root.children.filter(\n (child): child is XmlNode => typeof child !== 'string',\n );\n if (documentElements.length !== 1) {\n throw new Error('XLIFF must contain exactly one document element.');\n }\n return documentElements[0];\n}\n\nfunction children(node: XmlNode, name: string): XmlNode[] {\n return node.children.filter(\n (child): child is XmlNode =>\n typeof child !== 'string' && localName(child.name) === name,\n );\n}\n\nfunction descendants(node: XmlNode, name: string): XmlNode[] {\n const found: XmlNode[] = [];\n for (const child of node.children) {\n if (typeof child === 'string') continue;\n if (localName(child.name) === name) found.push(child);\n found.push(...descendants(child, name));\n }\n return found;\n}\n\nfunction first(node: XmlNode, name: string): XmlNode | undefined {\n return children(node, name)[0];\n}\n\nfunction attribute(node: XmlNode, name: string): string | undefined {\n const direct = node.attributes[name];\n if (direct !== undefined) return direct;\n const entry = Object.entries(node.attributes).find(\n ([qualified]) => localName(qualified) === name,\n );\n return entry?.[1];\n}\n\nfunction serializeNode(node: XmlNode): string {\n const attributes = Object.entries(node.attributes)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n if (node.children.length === 0) return `<${node.name}${attributes}/>`;\n return `<${node.name}${attributes}>${node.children\n .map((child) =>\n typeof child === 'string' ? escapeText(child) : serializeNode(child),\n )\n .join('')}</${node.name}>`;\n}\n\nfunction innerXml(\n node: XmlNode | undefined,\n supportedInline: Set<string>,\n options: XliffParseOptions,\n unitId?: string,\n): string | undefined {\n if (!node) return undefined;\n const visit = (parent: XmlNode): void => {\n for (const child of parent.children) {\n if (typeof child === 'string') continue;\n const name = localName(child.name);\n if (!supportedInline.has(name)) {\n options.onFinding?.({\n code: 'unsupported-inline',\n message: `Unsupported inline XLIFF element <${child.name}> was preserved.`,\n element: child.name,\n unitId,\n });\n }\n visit(child);\n }\n };\n visit(node);\n return node.children\n .map((child) =>\n typeof child === 'string' ? child : serializeNode(child),\n )\n .join('');\n}\n\nfunction plainText(node: XmlNode | undefined): string | undefined {\n if (!node) return undefined;\n return node.children\n .map((child) => (typeof child === 'string' ? child : plainText(child) ?? ''))\n .join('');\n}\n\nfunction metadata(node: XmlNode, name: string): string | undefined {\n return (\n node.attributes[`${PREFIX}:${name}`] ??\n node.attributes[`${LEGACY_PREFIX}:${name}`] ??\n attribute(node, name)\n );\n}\n\nfunction recognizedState(value: string | undefined): TranslationState | undefined {\n if (\n value === 'untranslated' ||\n value === 'machine' ||\n value === 'reviewed' ||\n value === 'stale'\n ) {\n return value;\n }\n if (value === 'final' || value === 'reviewed' || value === 'signed-off') {\n return 'reviewed';\n }\n if (value === 'translated') return 'machine';\n if (value === 'needs-review-translation') return 'stale';\n if (value === 'new' || value === 'initial') return 'untranslated';\n return undefined;\n}\n\nfunction commonDocument(root: XmlNode): Omit<\n ParsedTranslationExchangeDocument,\n 'sourceLanguage' | 'targetLanguages' | 'entries'\n> {\n return {\n schemaVersion: 1,\n ...(metadata(root, 'app-id') ? { appId: metadata(root, 'app-id') } : {}),\n ...(metadata(root, 'branch-id')\n ? { branchId: metadata(root, 'branch-id') }\n : {}),\n ...(metadata(root, 'exported-at')\n ? { exportedAt: metadata(root, 'exported-at') }\n : {}),\n ...(metadata(root, 'revision-watermark')\n ? { revisionWatermark: metadata(root, 'revision-watermark') }\n : {}),\n ...(metadata(root, 'contract-set-hash')\n ? { contractSetHash: metadata(root, 'contract-set-hash') }\n : {}),\n };\n}\n\nfunction mergeUnit(\n entries: Map<string, MutableParsedEntry>,\n unit: XmlNode,\n sourceText: string | undefined,\n targetText: string | undefined,\n targetLanguage: string | undefined,\n targetState: TranslationState | undefined,\n targetNote: string | undefined,\n description: string | undefined,\n): void {\n const key = metadata(unit, 'key') ?? attribute(unit, 'resname') ?? attribute(unit, 'name') ?? attribute(unit, 'id');\n if (!key) throw new Error('XLIFF unit is missing an id/key.');\n const namespace = metadata(unit, 'namespace');\n const identity = `${namespace ?? ''}\\u0000${key}`;\n let entry = entries.get(identity);\n if (!entry) {\n entry = {\n key,\n ...(namespace ? { namespace } : {}),\n kind: metadata(unit, 'kind') === 'semantic' ? 'semantic' : 'ui',\n format: metadata(unit, 'format') === 'icu' ? 'icu' : 'simple',\n ...(sourceText !== undefined ? { sourceText } : {}),\n ...(metadata(unit, 'key-version-id')\n ? { keyVersionId: metadata(unit, 'key-version-id') }\n : {}),\n ...(metadata(unit, 'source-hash')\n ? { sourceHash: metadata(unit, 'source-hash') }\n : {}),\n ...(metadata(unit, 'contract-hash')\n ? { contractHash: metadata(unit, 'contract-hash') }\n : {}),\n ...(metadata(unit, 'argument-signature')\n ? { argumentSignature: metadata(unit, 'argument-signature') }\n : {}),\n ...(description ? { description } : {}),\n translations: {},\n };\n entries.set(identity, entry);\n } else if (sourceText !== undefined && entry.sourceText !== sourceText) {\n throw new Error(`XLIFF source text conflicts for key \"${key}\".`);\n }\n if (targetLanguage && targetText !== undefined) {\n if (entry.translations[targetLanguage]) {\n throw new Error(\n `Duplicate XLIFF target for key \"${key}\" in ${targetLanguage}.`,\n );\n }\n entry.translations[targetLanguage] = {\n text: targetText,\n ...(targetState ? { state: targetState } : {}),\n ...(targetNote ? { note: targetNote } : {}),\n };\n }\n}\n\nfunction parse12(\n root: XmlNode,\n options: XliffParseOptions,\n): ParsedTranslationExchangeDocument {\n const entries = new Map<string, MutableParsedEntry>();\n let sourceLanguage = attribute(root, 'source-language');\n const targetLanguages = new Set<string>();\n for (const file of descendants(root, 'file')) {\n sourceLanguage ??= attribute(file, 'source-language');\n const targetLanguage = attribute(file, 'target-language');\n if (targetLanguage) targetLanguages.add(targetLanguage);\n for (const unit of descendants(file, 'trans-unit')) {\n const id = attribute(unit, 'id');\n const sourceText = innerXml(first(unit, 'source'), INLINE_12, options, id);\n const target = first(unit, 'target');\n const language =\n attribute(target ?? unit, 'lang') ?? targetLanguage;\n if (language) targetLanguages.add(language);\n const notes = children(unit, 'note');\n const description = plainText(\n notes.find((note) => isNoteRole(attribute(note, 'from'), 'description')),\n );\n const targetNote = plainText(\n notes.find(\n (note) =>\n isNoteRole(attribute(note, 'from'), 'target') &&\n (!language || !attribute(note, 'lang') || attribute(note, 'lang') === language),\n ),\n );\n mergeUnit(\n entries,\n unit,\n sourceText,\n innerXml(target, INLINE_12, options, id),\n language,\n recognizedState(metadata(target ?? unit, 'state') ?? attribute(target ?? unit, 'state')),\n targetNote,\n description ?? plainText(notes[0]),\n );\n }\n }\n if (!sourceLanguage) throw new Error('XLIFF 1.2 source language is missing.');\n return normalizeParsedTranslationExchangeDocument({\n ...commonDocument(root),\n sourceLanguage,\n targetLanguages: [...targetLanguages],\n entries: [...entries.values()],\n });\n}\n\nfunction parse20(\n root: XmlNode,\n options: XliffParseOptions,\n): ParsedTranslationExchangeDocument {\n const entries = new Map<string, MutableParsedEntry>();\n const sourceLanguage = attribute(root, 'srcLang');\n if (!sourceLanguage) throw new Error('XLIFF 2.0 srcLang is missing.');\n const targetLanguages = new Set<string>();\n const rootTargetLanguage = attribute(root, 'trgLang');\n if (rootTargetLanguage) targetLanguages.add(rootTargetLanguage);\n for (const file of descendants(root, 'file')) {\n const fileTargetLanguage =\n attribute(file, 'trgLang') ??\n metadata(file, 'target-language') ??\n rootTargetLanguage;\n if (fileTargetLanguage) targetLanguages.add(fileTargetLanguage);\n for (const unit of descendants(file, 'unit')) {\n const segment = first(unit, 'segment') ?? descendants(unit, 'segment')[0];\n if (!segment) continue;\n const target = first(segment, 'target');\n const language = attribute(target ?? unit, 'lang') ?? fileTargetLanguage;\n if (language) targetLanguages.add(language);\n const notesContainer = first(unit, 'notes');\n const notes = notesContainer ? children(notesContainer, 'note') : [];\n const description = plainText(\n notes.find(\n (note) => isNoteRole(attribute(note, 'category'), 'description'),\n ),\n );\n const targetNote = plainText(\n notes.find(\n (note) =>\n isNoteRole(attribute(note, 'category'), 'target') &&\n (!language || !attribute(note, 'lang') || attribute(note, 'lang') === language),\n ),\n );\n const id = attribute(unit, 'id');\n mergeUnit(\n entries,\n unit,\n innerXml(first(segment, 'source'), INLINE_20, options, id),\n innerXml(target, INLINE_20, options, id),\n language,\n recognizedState(metadata(segment, 'state') ?? attribute(segment, 'state')),\n targetNote,\n description ?? plainText(notes[0]),\n );\n }\n }\n return normalizeParsedTranslationExchangeDocument({\n ...commonDocument(root),\n sourceLanguage,\n targetLanguages: [...targetLanguages],\n entries: [...entries.values()],\n });\n}\n\nfunction parseXliff(\n input: Uint8Array,\n expectedVersion: '1.2' | '2.0',\n options: XliffParseOptions = {},\n): ParsedTranslationExchangeDocument {\n const root = parseXml(text(input));\n if (localName(root.name) !== 'xliff') {\n throw new Error('Document is not XLIFF.');\n }\n const version = attribute(root, 'version');\n if (version !== expectedVersion) {\n throw new Error(\n `Expected XLIFF ${expectedVersion}, received ${version ?? 'an unknown version'}.`,\n );\n }\n return version === '1.2' ? parse12(root, options) : parse20(root, options);\n}\n\nfunction deterministicId(entry: TranslationExchangeEntry, index: number): string {\n const identity = `${entry.namespace ?? 'default'}:${entry.key}`;\n return `u${index + 1}-${encodeURIComponent(identity).replaceAll('%', '_')}`;\n}\n\nfunction state12(state: TranslationState | undefined): string {\n if (state === 'reviewed') return 'final';\n if (state === 'stale') return 'needs-review-translation';\n if (state === 'machine') return 'translated';\n return 'new';\n}\n\nfunction state20(state: TranslationState | undefined): string {\n if (state === 'reviewed') return 'final';\n if (state === 'stale') return 'translated';\n if (state === 'machine') return 'translated';\n return 'initial';\n}\n\nfunction metadataAttributes(entry: TranslationExchangeEntry): string {\n return [\n [`${PREFIX}:key`, entry.key],\n [`${PREFIX}:namespace`, entry.namespace],\n [`${PREFIX}:kind`, entry.kind],\n [`${PREFIX}:format`, entry.format],\n [`${PREFIX}:key-version-id`, entry.keyVersionId],\n [`${PREFIX}:source-hash`, entry.sourceHash],\n [`${PREFIX}:contract-hash`, entry.contractHash],\n [`${PREFIX}:argument-signature`, entry.argumentSignature],\n ]\n .filter((pair): pair is [string, string] => pair[1] !== undefined)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n}\n\nfunction rootMetadata(document: TranslationExchangeDocument): string {\n return [\n [`${PREFIX}:schema-version`, String(document.schemaVersion)],\n [`${PREFIX}:app-id`, document.appId],\n [`${PREFIX}:branch-id`, document.branchId],\n [`${PREFIX}:exported-at`, document.exportedAt],\n [`${PREFIX}:revision-watermark`, document.revisionWatermark],\n [`${PREFIX}:contract-set-hash`, document.contractSetHash],\n ]\n .filter((pair): pair is [string, string] => pair[1] !== undefined)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n}\n\nfunction validatedMixedContent(value: string, inline: Set<string>): string {\n if (!value.includes('<')) return escapeText(value);\n try {\n const wrapper = parseXml(`<cn-wrapper>${value}</cn-wrapper>`);\n const nodes = wrapper.children.filter(\n (child): child is XmlNode => typeof child !== 'string',\n );\n if (\n nodes.length === 0 ||\n nodes.some((node) => !inline.has(localName(node.name)))\n ) {\n return escapeText(value);\n }\n return wrapper.children\n .map((child) =>\n typeof child === 'string' ? escapeText(child) : serializeNode(child),\n )\n .join('');\n } catch {\n return escapeText(value);\n }\n}\n\nfunction targets(document: TranslationExchangeDocument): Array<string | undefined> {\n return document.targetLanguages.length > 0\n ? document.targetLanguages\n : [undefined];\n}\n\nfunction serialize12(document: TranslationExchangeDocument): string {\n const files = targets(document)\n .map((language, fileIndex) => {\n const units = document.entries\n .map((entry, index) => {\n const target = language ? entry.translations[language] : undefined;\n const id = deterministicId(entry, index);\n const notes = [\n entry.description\n ? `<note from=\"${NOTE_ROLES.description[0]}\">${escapeText(entry.description)}</note>`\n : '',\n target?.note\n ? `<note from=\"${NOTE_ROLES.target[0]}\" xml:lang=\"${escapeAttribute(language!)}\">${escapeText(target.note)}</note>`\n : '',\n ].join('');\n return `<trans-unit id=\"${escapeAttribute(id)}\" resname=\"${escapeAttribute(entry.key)}\"${metadataAttributes(entry)}><source>${validatedMixedContent(entry.sourceText, INLINE_12)}</source>${\n language && target\n ? `<target xml:lang=\"${escapeAttribute(language)}\" state=\"${state12(target?.state)}\" ${PREFIX}:state=\"${escapeAttribute(target?.state ?? 'untranslated')}\">${validatedMixedContent(target?.text ?? '', INLINE_12)}</target>`\n : ''\n }${notes}</trans-unit>`;\n })\n .join('');\n return `<file id=\"f${fileIndex + 1}\" original=\"linked\" datatype=\"plaintext\" source-language=\"${escapeAttribute(document.sourceLanguage)}\"${\n language ? ` target-language=\"${escapeAttribute(language)}\"` : ''\n }><body>${units}</body></file>`;\n })\n .join('');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<xliff xmlns=\"${XLIFF_12_NAMESPACE}\" xmlns:${PREFIX}=\"${EXCHANGE_NAMESPACE}\" version=\"1.2\"${rootMetadata(document)}>${files}</xliff>\\n`;\n}\n\nfunction serialize20(document: TranslationExchangeDocument): string {\n const files = targets(document)\n .map((language, fileIndex) => {\n const units = document.entries\n .map((entry, index) => {\n const target = language ? entry.translations[language] : undefined;\n const id = deterministicId(entry, index);\n const notes =\n entry.description || target?.note\n ? `<notes>${\n entry.description\n ? `<note category=\"${NOTE_ROLES.description[0]}\">${escapeText(entry.description)}</note>`\n : ''\n }${\n target?.note\n ? `<note category=\"${NOTE_ROLES.target[0]}\" xml:lang=\"${escapeAttribute(language!)}\">${escapeText(target.note)}</note>`\n : ''\n }</notes>`\n : '';\n return `<unit id=\"${escapeAttribute(id)}\" name=\"${escapeAttribute(entry.key)}\"${metadataAttributes(entry)}>${notes}<segment id=\"s1\" state=\"${state20(target?.state)}\" ${PREFIX}:state=\"${escapeAttribute(target?.state ?? 'untranslated')}\"><source>${validatedMixedContent(entry.sourceText, INLINE_20)}</source>${\n language && target\n ? `<target xml:lang=\"${escapeAttribute(language)}\">${validatedMixedContent(target?.text ?? '', INLINE_20)}</target>`\n : ''\n }</segment></unit>`;\n })\n .join('');\n return `<file id=\"f${fileIndex + 1}\"${\n language ? ` ${PREFIX}:target-language=\"${escapeAttribute(language)}\"` : ''\n }>${units}</file>`;\n })\n .join('');\n const singleTarget =\n document.targetLanguages.length === 1\n ? ` trgLang=\"${escapeAttribute(document.targetLanguages[0])}\"`\n : '';\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<xliff xmlns=\"${XLIFF_20_NAMESPACE}\" xmlns:${PREFIX}=\"${EXCHANGE_NAMESPACE}\" version=\"2.0\" srcLang=\"${escapeAttribute(document.sourceLanguage)}\"${singleTarget}${rootMetadata(document)}>${files}</xliff>\\n`;\n}\n\nfunction sniffVersion(\n input: Uint8Array,\n expectedVersion: '1.2' | '2.0',\n fileName?: string,\n): boolean {\n if (fileName && !/\\.xlf(f)?$/i.test(fileName)) return false;\n const prefix = text(input.slice(0, Math.min(input.length, 4096)));\n return (\n /<(?:(?:[\\w.-]+):)?xliff\\b/i.test(prefix) &&\n new RegExp(`\\\\bversion\\\\s*=\\\\s*[\"']${expectedVersion.replace('.', '\\\\.')}[\"']`).test(prefix)\n );\n}\n\nexport const xliff12Adapter: TranslationFormatAdapter = {\n format: 'xliff-1.2',\n sniff: (input, fileName) => sniffVersion(input, '1.2', fileName),\n parse: async (input, options) =>\n parseXliff(input, '1.2', (options ?? {}) as XliffParseOptions),\n serialize: async (document) => ({\n fileName: 'translations.xlf',\n mediaType: XML_MEDIA_TYPE,\n body: UTF8.encode(serialize12(document)),\n }),\n};\n\nexport const xliff20Adapter: TranslationFormatAdapter = {\n format: 'xliff-2.0',\n sniff: (input, fileName) => sniffVersion(input, '2.0', fileName),\n parse: async (input, options) =>\n parseXliff(input, '2.0', (options ?? {}) as XliffParseOptions),\n serialize: async (document) => ({\n fileName: 'translations.xlf',\n mediaType: XML_MEDIA_TYPE,\n body: UTF8.encode(serialize20(document)),\n }),\n};\n"]}
1
+ {"version":3,"file":"xliff.js","sourceRoot":"","sources":["../../../src/formats/xliff.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n normalizeParsedTranslationExchangeDocument,\n type ParsedTranslationExchangeDocument,\n type ParsedTranslationExchangeEntry,\n type TranslationExchangeDocument,\n type TranslationExchangeEntry,\n type TranslationExchangeValue,\n type TranslationFormatAdapter,\n} from '../exchange.js';\nimport type { TranslationState } from '../records.js';\n\nconst UTF8 = new TextEncoder();\n/**\n * Our own XML metadata namespace for exchange files. It is a file-format\n * identifier written into exported documents, not the translation ontology\n * (which lives at `https://linked.cm/ont/translation/`). Files exported before 0.3.0\n * used the pre-0.3.0 namespace URI and prefix; the reader below still accepts\n * both, so those files keep importing.\n */\nconst EXCHANGE_NAMESPACE = 'https://id.linked.cm/translation/exchange/1';\nconst PREFIX = 'lt';\nconst LEGACY_PREFIX = 'cn';\n/** `from`/`category` on a `<note>`, in current and pre-0.3.0 spelling. */\nconst NOTE_ROLES = {\n description: ['linked-description', 'create-now-description'],\n target: ['linked-target', 'create-now-target'],\n} as const;\n\nfunction isNoteRole(\n value: string | undefined,\n role: keyof typeof NOTE_ROLES,\n): boolean {\n return value !== undefined && (NOTE_ROLES[role] as readonly string[]).includes(value);\n}\nconst XLIFF_12_NAMESPACE = 'urn:oasis:names:tc:xliff:document:1.2';\nconst XLIFF_20_NAMESPACE = 'urn:oasis:names:tc:xliff:document:2.0';\nconst XML_MEDIA_TYPE = 'application/xliff+xml';\n\nconst INLINE_12 = new Set([\n 'bpt',\n 'bx',\n 'ept',\n 'ex',\n 'g',\n 'it',\n 'mrk',\n 'ph',\n 'sub',\n 'x',\n]);\nconst INLINE_20 = new Set(['ec', 'em', 'mrk', 'pc', 'ph', 'sc', 'sm']);\n\ntype XmlChild = XmlNode | string;\n\ninterface XmlNode {\n name: string;\n attributes: Record<string, string>;\n children: XmlChild[];\n}\n\nexport interface XliffFinding {\n code: 'unsupported-inline';\n message: string;\n element: string;\n unitId?: string;\n}\n\nexport interface XliffParseOptions {\n onFinding?: (finding: XliffFinding) => void;\n}\n\ninterface MutableParsedEntry extends ParsedTranslationExchangeEntry {\n translations: Record<string, TranslationExchangeValue>;\n}\n\nfunction text(input: Uint8Array): string {\n return new TextDecoder('utf-8', { fatal: true }).decode(input);\n}\n\nfunction localName(name: string): string {\n const separator = name.indexOf(':');\n return separator === -1 ? name : name.slice(separator + 1);\n}\n\nfunction escapeText(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;');\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value)\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&apos;');\n}\n\nfunction decodeEntities(value: string): string {\n const decoded = value.replace(\n /&(#x[0-9a-fA-F]+|#[0-9]+|amp|lt|gt|quot|apos);/g,\n (entity, body: string) => {\n if (body === 'amp') return '&';\n if (body === 'lt') return '<';\n if (body === 'gt') return '>';\n if (body === 'quot') return '\"';\n if (body === 'apos') return \"'\";\n const point = Number.parseInt(body.slice(body[1] === 'x' ? 2 : 1), body[1] === 'x' ? 16 : 10);\n if (!Number.isFinite(point) || point > 0x10ffff) {\n throw new Error(`Invalid XML character reference \"&${body};\".`);\n }\n return String.fromCodePoint(point);\n },\n );\n const unresolved = /&([A-Za-z_:][\\w.:-]*);/.exec(decoded);\n if (unresolved) {\n throw new Error(`Unsupported XML entity reference \"&${unresolved[1]};\".`);\n }\n return decoded;\n}\n\nfunction readTagEnd(xml: string, start: number): number {\n let quote = '';\n for (let index = start; index < xml.length; index += 1) {\n const character = xml[index];\n if (quote) {\n if (character === quote) quote = '';\n } else if (character === '\"' || character === \"'\") {\n quote = character;\n } else if (character === '>') {\n return index;\n }\n }\n throw new Error('Malformed XML: unterminated tag.');\n}\n\nfunction parseAttributes(input: string): {\n name: string;\n attributes: Record<string, string>;\n selfClosing: boolean;\n} {\n let content = input.trim();\n const selfClosing = content.endsWith('/');\n if (selfClosing) content = content.slice(0, -1).trimEnd();\n const nameMatch = /^([^\\s/>]+)/.exec(content);\n if (!nameMatch) throw new Error('Malformed XML: element name is missing.');\n const name = nameMatch[1];\n const attributes: Record<string, string> = {};\n let remainder = content.slice(name.length);\n const attributePattern = /^\\s+([^\\s=/>]+)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/;\n while (remainder.trim()) {\n const match = attributePattern.exec(remainder);\n if (!match) {\n throw new Error(`Malformed XML attributes on <${name}>.`);\n }\n if (attributes[match[1]] !== undefined) {\n throw new Error(`Duplicate XML attribute \"${match[1]}\".`);\n }\n attributes[match[1]] = decodeEntities(match[3] ?? match[4] ?? '');\n remainder = remainder.slice(match[0].length);\n }\n return { name, attributes, selfClosing };\n}\n\n/**\n * Small, non-validating XML parser for the deliberately narrow XLIFF surface.\n * DTDs and entity declarations are rejected before tokenization, so parsing\n * never performs filesystem or network resolution.\n */\nfunction parseXml(xml: string): XmlNode {\n if (/<!DOCTYPE\\b/i.test(xml) || /<!ENTITY\\b/i.test(xml)) {\n throw new Error('XLIFF containing a DTD or entity declaration is not allowed.');\n }\n const root: XmlNode = {\n name: '#document',\n attributes: {},\n children: [],\n };\n const stack = [root];\n let cursor = 0;\n while (cursor < xml.length) {\n const opening = xml.indexOf('<', cursor);\n if (opening === -1) {\n const trailing = xml.slice(cursor);\n if (trailing) stack.at(-1)!.children.push(decodeEntities(trailing));\n break;\n }\n if (opening > cursor) {\n stack.at(-1)!.children.push(decodeEntities(xml.slice(cursor, opening)));\n }\n if (xml.startsWith('<!--', opening)) {\n const closing = xml.indexOf('-->', opening + 4);\n if (closing === -1) throw new Error('Malformed XML comment.');\n cursor = closing + 3;\n continue;\n }\n if (xml.startsWith('<?', opening)) {\n const closing = xml.indexOf('?>', opening + 2);\n if (closing === -1) throw new Error('Malformed XML processing instruction.');\n cursor = closing + 2;\n continue;\n }\n if (xml.startsWith('<![CDATA[', opening)) {\n const closing = xml.indexOf(']]>', opening + 9);\n if (closing === -1) throw new Error('Malformed XML CDATA section.');\n stack.at(-1)!.children.push(xml.slice(opening + 9, closing));\n cursor = closing + 3;\n continue;\n }\n if (xml.startsWith('</', opening)) {\n const closing = readTagEnd(xml, opening + 2);\n const name = xml.slice(opening + 2, closing).trim();\n const current = stack.pop();\n if (!current || current === root || current.name !== name) {\n throw new Error(`Malformed XML closing tag </${name}>.`);\n }\n cursor = closing + 1;\n continue;\n }\n if (xml.startsWith('<!', opening)) {\n throw new Error('Unsupported XML declaration.');\n }\n const closing = readTagEnd(xml, opening + 1);\n const parsed = parseAttributes(xml.slice(opening + 1, closing));\n const node: XmlNode = {\n name: parsed.name,\n attributes: parsed.attributes,\n children: [],\n };\n stack.at(-1)!.children.push(node);\n if (!parsed.selfClosing) stack.push(node);\n cursor = closing + 1;\n }\n if (stack.length !== 1) {\n throw new Error(`Malformed XML: unclosed <${stack.at(-1)!.name}> element.`);\n }\n const documentElements = root.children.filter(\n (child): child is XmlNode => typeof child !== 'string',\n );\n if (documentElements.length !== 1) {\n throw new Error('XLIFF must contain exactly one document element.');\n }\n return documentElements[0];\n}\n\nfunction children(node: XmlNode, name: string): XmlNode[] {\n return node.children.filter(\n (child): child is XmlNode =>\n typeof child !== 'string' && localName(child.name) === name,\n );\n}\n\nfunction descendants(node: XmlNode, name: string): XmlNode[] {\n const found: XmlNode[] = [];\n for (const child of node.children) {\n if (typeof child === 'string') continue;\n if (localName(child.name) === name) found.push(child);\n found.push(...descendants(child, name));\n }\n return found;\n}\n\nfunction first(node: XmlNode, name: string): XmlNode | undefined {\n return children(node, name)[0];\n}\n\nfunction attribute(node: XmlNode, name: string): string | undefined {\n const direct = node.attributes[name];\n if (direct !== undefined) return direct;\n const entry = Object.entries(node.attributes).find(\n ([qualified]) => localName(qualified) === name,\n );\n return entry?.[1];\n}\n\nfunction serializeNode(node: XmlNode): string {\n const attributes = Object.entries(node.attributes)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n if (node.children.length === 0) return `<${node.name}${attributes}/>`;\n return `<${node.name}${attributes}>${node.children\n .map((child) =>\n typeof child === 'string' ? escapeText(child) : serializeNode(child),\n )\n .join('')}</${node.name}>`;\n}\n\nfunction innerXml(\n node: XmlNode | undefined,\n supportedInline: Set<string>,\n options: XliffParseOptions,\n unitId?: string,\n): string | undefined {\n if (!node) return undefined;\n const visit = (parent: XmlNode): void => {\n for (const child of parent.children) {\n if (typeof child === 'string') continue;\n const name = localName(child.name);\n if (!supportedInline.has(name)) {\n options.onFinding?.({\n code: 'unsupported-inline',\n message: `Unsupported inline XLIFF element <${child.name}> was preserved.`,\n element: child.name,\n unitId,\n });\n }\n visit(child);\n }\n };\n visit(node);\n return node.children\n .map((child) =>\n typeof child === 'string' ? child : serializeNode(child),\n )\n .join('');\n}\n\nfunction plainText(node: XmlNode | undefined): string | undefined {\n if (!node) return undefined;\n return node.children\n .map((child) => (typeof child === 'string' ? child : plainText(child) ?? ''))\n .join('');\n}\n\nfunction metadata(node: XmlNode, name: string): string | undefined {\n return (\n node.attributes[`${PREFIX}:${name}`] ??\n node.attributes[`${LEGACY_PREFIX}:${name}`] ??\n attribute(node, name)\n );\n}\n\nfunction recognizedState(value: string | undefined): TranslationState | undefined {\n if (\n value === 'untranslated' ||\n value === 'machine' ||\n value === 'reviewed' ||\n value === 'stale'\n ) {\n return value;\n }\n if (value === 'final' || value === 'reviewed' || value === 'signed-off') {\n return 'reviewed';\n }\n if (value === 'translated') return 'machine';\n if (value === 'needs-review-translation') return 'stale';\n if (value === 'new' || value === 'initial') return 'untranslated';\n return undefined;\n}\n\nfunction commonDocument(root: XmlNode): Omit<\n ParsedTranslationExchangeDocument,\n 'sourceLanguage' | 'targetLanguages' | 'entries'\n> {\n return {\n schemaVersion: 1,\n ...(metadata(root, 'app-id') ? { appId: metadata(root, 'app-id') } : {}),\n ...(metadata(root, 'branch-id')\n ? { branchId: metadata(root, 'branch-id') }\n : {}),\n ...(metadata(root, 'exported-at')\n ? { exportedAt: metadata(root, 'exported-at') }\n : {}),\n ...(metadata(root, 'revision-watermark')\n ? { revisionWatermark: metadata(root, 'revision-watermark') }\n : {}),\n ...(metadata(root, 'contract-set-hash')\n ? { contractSetHash: metadata(root, 'contract-set-hash') }\n : {}),\n };\n}\n\nfunction mergeUnit(\n entries: Map<string, MutableParsedEntry>,\n unit: XmlNode,\n sourceText: string | undefined,\n targetText: string | undefined,\n targetLanguage: string | undefined,\n targetState: TranslationState | undefined,\n targetNote: string | undefined,\n description: string | undefined,\n): void {\n const key = metadata(unit, 'key') ?? attribute(unit, 'resname') ?? attribute(unit, 'name') ?? attribute(unit, 'id');\n if (!key) throw new Error('XLIFF unit is missing an id/key.');\n const namespace = metadata(unit, 'namespace');\n const identity = `${namespace ?? ''}\\u0000${key}`;\n let entry = entries.get(identity);\n if (!entry) {\n entry = {\n key,\n ...(namespace ? { namespace } : {}),\n kind: metadata(unit, 'kind') === 'semantic' ? 'semantic' : 'ui',\n format: metadata(unit, 'format') === 'icu' ? 'icu' : 'simple',\n ...(sourceText !== undefined ? { sourceText } : {}),\n ...(metadata(unit, 'key-version-id')\n ? { keyVersionId: metadata(unit, 'key-version-id') }\n : {}),\n ...(metadata(unit, 'source-hash')\n ? { sourceHash: metadata(unit, 'source-hash') }\n : {}),\n ...(metadata(unit, 'contract-hash')\n ? { contractHash: metadata(unit, 'contract-hash') }\n : {}),\n ...(metadata(unit, 'argument-signature')\n ? { argumentSignature: metadata(unit, 'argument-signature') }\n : {}),\n ...(description ? { description } : {}),\n translations: {},\n };\n entries.set(identity, entry);\n } else if (sourceText !== undefined && entry.sourceText !== sourceText) {\n throw new Error(`XLIFF source text conflicts for key \"${key}\".`);\n }\n if (targetLanguage && targetText !== undefined) {\n if (entry.translations[targetLanguage]) {\n throw new Error(\n `Duplicate XLIFF target for key \"${key}\" in ${targetLanguage}.`,\n );\n }\n entry.translations[targetLanguage] = {\n text: targetText,\n ...(targetState ? { state: targetState } : {}),\n ...(targetNote ? { note: targetNote } : {}),\n };\n }\n}\n\nfunction parse12(\n root: XmlNode,\n options: XliffParseOptions,\n): ParsedTranslationExchangeDocument {\n const entries = new Map<string, MutableParsedEntry>();\n let sourceLanguage = attribute(root, 'source-language');\n const targetLanguages = new Set<string>();\n for (const file of descendants(root, 'file')) {\n sourceLanguage ??= attribute(file, 'source-language');\n const targetLanguage = attribute(file, 'target-language');\n if (targetLanguage) targetLanguages.add(targetLanguage);\n for (const unit of descendants(file, 'trans-unit')) {\n const id = attribute(unit, 'id');\n const sourceText = innerXml(first(unit, 'source'), INLINE_12, options, id);\n const target = first(unit, 'target');\n const language =\n attribute(target ?? unit, 'lang') ?? targetLanguage;\n if (language) targetLanguages.add(language);\n const notes = children(unit, 'note');\n const description = plainText(\n notes.find((note) => isNoteRole(attribute(note, 'from'), 'description')),\n );\n const targetNote = plainText(\n notes.find(\n (note) =>\n isNoteRole(attribute(note, 'from'), 'target') &&\n (!language || !attribute(note, 'lang') || attribute(note, 'lang') === language),\n ),\n );\n mergeUnit(\n entries,\n unit,\n sourceText,\n innerXml(target, INLINE_12, options, id),\n language,\n recognizedState(metadata(target ?? unit, 'state') ?? attribute(target ?? unit, 'state')),\n targetNote,\n description ?? plainText(notes[0]),\n );\n }\n }\n if (!sourceLanguage) throw new Error('XLIFF 1.2 source language is missing.');\n return normalizeParsedTranslationExchangeDocument({\n ...commonDocument(root),\n sourceLanguage,\n targetLanguages: [...targetLanguages],\n entries: [...entries.values()],\n });\n}\n\nfunction parse20(\n root: XmlNode,\n options: XliffParseOptions,\n): ParsedTranslationExchangeDocument {\n const entries = new Map<string, MutableParsedEntry>();\n const sourceLanguage = attribute(root, 'srcLang');\n if (!sourceLanguage) throw new Error('XLIFF 2.0 srcLang is missing.');\n const targetLanguages = new Set<string>();\n const rootTargetLanguage = attribute(root, 'trgLang');\n if (rootTargetLanguage) targetLanguages.add(rootTargetLanguage);\n for (const file of descendants(root, 'file')) {\n const fileTargetLanguage =\n attribute(file, 'trgLang') ??\n metadata(file, 'target-language') ??\n rootTargetLanguage;\n if (fileTargetLanguage) targetLanguages.add(fileTargetLanguage);\n for (const unit of descendants(file, 'unit')) {\n const segment = first(unit, 'segment') ?? descendants(unit, 'segment')[0];\n if (!segment) continue;\n const target = first(segment, 'target');\n const language = attribute(target ?? unit, 'lang') ?? fileTargetLanguage;\n if (language) targetLanguages.add(language);\n const notesContainer = first(unit, 'notes');\n const notes = notesContainer ? children(notesContainer, 'note') : [];\n const description = plainText(\n notes.find(\n (note) => isNoteRole(attribute(note, 'category'), 'description'),\n ),\n );\n const targetNote = plainText(\n notes.find(\n (note) =>\n isNoteRole(attribute(note, 'category'), 'target') &&\n (!language || !attribute(note, 'lang') || attribute(note, 'lang') === language),\n ),\n );\n const id = attribute(unit, 'id');\n mergeUnit(\n entries,\n unit,\n innerXml(first(segment, 'source'), INLINE_20, options, id),\n innerXml(target, INLINE_20, options, id),\n language,\n recognizedState(metadata(segment, 'state') ?? attribute(segment, 'state')),\n targetNote,\n description ?? plainText(notes[0]),\n );\n }\n }\n return normalizeParsedTranslationExchangeDocument({\n ...commonDocument(root),\n sourceLanguage,\n targetLanguages: [...targetLanguages],\n entries: [...entries.values()],\n });\n}\n\nfunction parseXliff(\n input: Uint8Array,\n expectedVersion: '1.2' | '2.0',\n options: XliffParseOptions = {},\n): ParsedTranslationExchangeDocument {\n const root = parseXml(text(input));\n if (localName(root.name) !== 'xliff') {\n throw new Error('Document is not XLIFF.');\n }\n const version = attribute(root, 'version');\n if (version !== expectedVersion) {\n throw new Error(\n `Expected XLIFF ${expectedVersion}, received ${version ?? 'an unknown version'}.`,\n );\n }\n return version === '1.2' ? parse12(root, options) : parse20(root, options);\n}\n\nfunction deterministicId(entry: TranslationExchangeEntry, index: number): string {\n const identity = `${entry.namespace ?? 'default'}:${entry.key}`;\n return `u${index + 1}-${encodeURIComponent(identity).replaceAll('%', '_')}`;\n}\n\nfunction state12(state: TranslationState | undefined): string {\n if (state === 'reviewed') return 'final';\n if (state === 'stale') return 'needs-review-translation';\n if (state === 'machine') return 'translated';\n return 'new';\n}\n\nfunction state20(state: TranslationState | undefined): string {\n if (state === 'reviewed') return 'final';\n if (state === 'stale') return 'translated';\n if (state === 'machine') return 'translated';\n return 'initial';\n}\n\nfunction metadataAttributes(entry: TranslationExchangeEntry): string {\n return [\n [`${PREFIX}:key`, entry.key],\n [`${PREFIX}:namespace`, entry.namespace],\n [`${PREFIX}:kind`, entry.kind],\n [`${PREFIX}:format`, entry.format],\n [`${PREFIX}:key-version-id`, entry.keyVersionId],\n [`${PREFIX}:source-hash`, entry.sourceHash],\n [`${PREFIX}:contract-hash`, entry.contractHash],\n [`${PREFIX}:argument-signature`, entry.argumentSignature],\n ]\n .filter((pair): pair is [string, string] => pair[1] !== undefined)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n}\n\nfunction rootMetadata(document: TranslationExchangeDocument): string {\n return [\n [`${PREFIX}:schema-version`, String(document.schemaVersion)],\n [`${PREFIX}:app-id`, document.appId],\n [`${PREFIX}:branch-id`, document.branchId],\n [`${PREFIX}:exported-at`, document.exportedAt],\n [`${PREFIX}:revision-watermark`, document.revisionWatermark],\n [`${PREFIX}:contract-set-hash`, document.contractSetHash],\n ]\n .filter((pair): pair is [string, string] => pair[1] !== undefined)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n}\n\nfunction validatedMixedContent(value: string, inline: Set<string>): string {\n if (!value.includes('<')) return escapeText(value);\n try {\n const wrapper = parseXml(`<cn-wrapper>${value}</cn-wrapper>`);\n const nodes = wrapper.children.filter(\n (child): child is XmlNode => typeof child !== 'string',\n );\n if (\n nodes.length === 0 ||\n nodes.some((node) => !inline.has(localName(node.name)))\n ) {\n return escapeText(value);\n }\n return wrapper.children\n .map((child) =>\n typeof child === 'string' ? escapeText(child) : serializeNode(child),\n )\n .join('');\n } catch {\n return escapeText(value);\n }\n}\n\nfunction targets(document: TranslationExchangeDocument): Array<string | undefined> {\n return document.targetLanguages.length > 0\n ? document.targetLanguages\n : [undefined];\n}\n\nfunction serialize12(document: TranslationExchangeDocument): string {\n const files = targets(document)\n .map((language, fileIndex) => {\n const units = document.entries\n .map((entry, index) => {\n const target = language ? entry.translations[language] : undefined;\n const id = deterministicId(entry, index);\n const notes = [\n entry.description\n ? `<note from=\"${NOTE_ROLES.description[0]}\">${escapeText(entry.description)}</note>`\n : '',\n target?.note\n ? `<note from=\"${NOTE_ROLES.target[0]}\" xml:lang=\"${escapeAttribute(language!)}\">${escapeText(target.note)}</note>`\n : '',\n ].join('');\n return `<trans-unit id=\"${escapeAttribute(id)}\" resname=\"${escapeAttribute(entry.key)}\"${metadataAttributes(entry)}><source>${validatedMixedContent(entry.sourceText, INLINE_12)}</source>${\n language && target\n ? `<target xml:lang=\"${escapeAttribute(language)}\" state=\"${state12(target?.state)}\" ${PREFIX}:state=\"${escapeAttribute(target?.state ?? 'untranslated')}\">${validatedMixedContent(target?.text ?? '', INLINE_12)}</target>`\n : ''\n }${notes}</trans-unit>`;\n })\n .join('');\n return `<file id=\"f${fileIndex + 1}\" original=\"linked\" datatype=\"plaintext\" source-language=\"${escapeAttribute(document.sourceLanguage)}\"${\n language ? ` target-language=\"${escapeAttribute(language)}\"` : ''\n }><body>${units}</body></file>`;\n })\n .join('');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<xliff xmlns=\"${XLIFF_12_NAMESPACE}\" xmlns:${PREFIX}=\"${EXCHANGE_NAMESPACE}\" version=\"1.2\"${rootMetadata(document)}>${files}</xliff>\\n`;\n}\n\nfunction serialize20(document: TranslationExchangeDocument): string {\n const files = targets(document)\n .map((language, fileIndex) => {\n const units = document.entries\n .map((entry, index) => {\n const target = language ? entry.translations[language] : undefined;\n const id = deterministicId(entry, index);\n const notes =\n entry.description || target?.note\n ? `<notes>${\n entry.description\n ? `<note category=\"${NOTE_ROLES.description[0]}\">${escapeText(entry.description)}</note>`\n : ''\n }${\n target?.note\n ? `<note category=\"${NOTE_ROLES.target[0]}\" xml:lang=\"${escapeAttribute(language!)}\">${escapeText(target.note)}</note>`\n : ''\n }</notes>`\n : '';\n return `<unit id=\"${escapeAttribute(id)}\" name=\"${escapeAttribute(entry.key)}\"${metadataAttributes(entry)}>${notes}<segment id=\"s1\" state=\"${state20(target?.state)}\" ${PREFIX}:state=\"${escapeAttribute(target?.state ?? 'untranslated')}\"><source>${validatedMixedContent(entry.sourceText, INLINE_20)}</source>${\n language && target\n ? `<target xml:lang=\"${escapeAttribute(language)}\">${validatedMixedContent(target?.text ?? '', INLINE_20)}</target>`\n : ''\n }</segment></unit>`;\n })\n .join('');\n return `<file id=\"f${fileIndex + 1}\"${\n language ? ` ${PREFIX}:target-language=\"${escapeAttribute(language)}\"` : ''\n }>${units}</file>`;\n })\n .join('');\n const singleTarget =\n document.targetLanguages.length === 1\n ? ` trgLang=\"${escapeAttribute(document.targetLanguages[0])}\"`\n : '';\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<xliff xmlns=\"${XLIFF_20_NAMESPACE}\" xmlns:${PREFIX}=\"${EXCHANGE_NAMESPACE}\" version=\"2.0\" srcLang=\"${escapeAttribute(document.sourceLanguage)}\"${singleTarget}${rootMetadata(document)}>${files}</xliff>\\n`;\n}\n\nfunction sniffVersion(\n input: Uint8Array,\n expectedVersion: '1.2' | '2.0',\n fileName?: string,\n): boolean {\n if (fileName && !/\\.xlf(f)?$/i.test(fileName)) return false;\n const prefix = text(input.slice(0, Math.min(input.length, 4096)));\n return (\n /<(?:(?:[\\w.-]+):)?xliff\\b/i.test(prefix) &&\n new RegExp(`\\\\bversion\\\\s*=\\\\s*[\"']${expectedVersion.replace('.', '\\\\.')}[\"']`).test(prefix)\n );\n}\n\nexport const xliff12Adapter: TranslationFormatAdapter = {\n format: 'xliff-1.2',\n sniff: (input, fileName) => sniffVersion(input, '1.2', fileName),\n parse: async (input, options) =>\n parseXliff(input, '1.2', (options ?? {}) as XliffParseOptions),\n serialize: async (document) => ({\n fileName: 'translations.xlf',\n mediaType: XML_MEDIA_TYPE,\n body: UTF8.encode(serialize12(document)),\n }),\n};\n\nexport const xliff20Adapter: TranslationFormatAdapter = {\n format: 'xliff-2.0',\n sniff: (input, fileName) => sniffVersion(input, '2.0', fileName),\n parse: async (input, options) =>\n parseXliff(input, '2.0', (options ?? {}) as XliffParseOptions),\n serialize: async (document) => ({\n fileName: 'translations.xlf',\n mediaType: XML_MEDIA_TYPE,\n body: UTF8.encode(serialize20(document)),\n }),\n};\n"]}
@@ -6,12 +6,22 @@ export interface ExtractedTranslationKey {
6
6
  line: number;
7
7
  }
8
8
  export interface TranslationKeySyncTarget {
9
+ /**
10
+ * Existing keys. `overridden: true` marks a declared key the app has reworded
11
+ * locally; sync reports it in `preservedOverrides` and never writes it.
12
+ */
9
13
  list(data: {
10
14
  appId: string;
11
15
  }): Promise<Array<{
12
16
  key: string;
13
17
  sourceText?: string;
18
+ overridden?: boolean;
14
19
  }>>;
20
+ /**
21
+ * Write one key. A writer that keeps an app override instead of applying the
22
+ * declared source answers `{ preservedOverride: true }` (see
23
+ * `upsertTranslationKey` with `source: 'declaration-sync'`).
24
+ */
15
25
  upsert(data: {
16
26
  appId: string;
17
27
  key: string;
@@ -23,6 +33,8 @@ export interface TranslationKeySyncReport {
23
33
  created: string[];
24
34
  updated: string[];
25
35
  unchanged: string[];
36
+ /** Keys whose app override was kept over the declared source; also in `unchanged`. */
37
+ preservedOverrides: string[];
26
38
  orphaned: string[];
27
39
  conflicts: Array<{
28
40
  key: string;
@@ -84,7 +84,12 @@ export async function syncTranslationKeys(target, appId, extracted, options = {}
84
84
  defaultsByKey.set(item.key, defaults);
85
85
  }
86
86
  const report = {
87
- created: [], updated: [], unchanged: [], orphaned: [], conflicts: [],
87
+ created: [],
88
+ updated: [],
89
+ unchanged: [],
90
+ preservedOverrides: [],
91
+ orphaned: [],
92
+ conflicts: [],
88
93
  };
89
94
  for (const [key, defaults] of defaultsByKey) {
90
95
  if (defaults.size > 1) {
@@ -93,17 +98,37 @@ export async function syncTranslationKeys(target, appId, extracted, options = {}
93
98
  }
94
99
  const sourceText = [...defaults][0];
95
100
  const current = existingByKey.get(key);
96
- if (!current)
97
- report.created.push(key);
98
- else if (current.sourceText !== sourceText)
99
- report.updated.push(key);
100
- else {
101
+ if ((current === null || current === void 0 ? void 0 : current.overridden) === true) {
102
+ report.preservedOverrides.push(key);
103
+ report.unchanged.push(key);
104
+ continue;
105
+ }
106
+ if ((current === null || current === void 0 ? void 0 : current.sourceText) === sourceText) {
101
107
  report.unchanged.push(key);
102
108
  continue;
103
109
  }
104
110
  if (!options.dryRun) {
105
- await target.upsert({ appId, key, sourceText, kind: 'ui' });
111
+ const result = await target.upsert({
112
+ appId,
113
+ key,
114
+ sourceText,
115
+ kind: 'ui',
116
+ });
117
+ // The writer is authoritative: an override may have appeared since list,
118
+ // or the portable target may not project ownership in its list response.
119
+ if (result &&
120
+ typeof result === 'object' &&
121
+ 'preservedOverride' in result &&
122
+ result.preservedOverride === true) {
123
+ report.preservedOverrides.push(key);
124
+ report.unchanged.push(key);
125
+ continue;
126
+ }
106
127
  }
128
+ if (current)
129
+ report.updated.push(key);
130
+ else
131
+ report.created.push(key);
107
132
  }
108
133
  report.orphaned = existing
109
134
  .map((item) => item.key)
@@ -1 +1 @@
1
- {"version":3,"file":"key-sync.js","sourceRoot":"","sources":["../../src/key-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import ts from 'typescript';\nimport type {\n TranslationDeclaration,\n TranslationDiscoverySource,\n} from './discovery.js';\n\nexport interface ExtractedTranslationKey {\n key: string;\n sourceText: string;\n file: string;\n line: number;\n}\n\nexport interface TranslationKeySyncTarget {\n list(data: { appId: string }): Promise<Array<{ key: string; sourceText?: string }>>;\n upsert(data: {\n appId: string;\n key: string;\n sourceText: string;\n kind: 'ui';\n }): Promise<unknown>;\n}\n\nexport interface TranslationKeySyncReport {\n created: string[];\n updated: string[];\n unchanged: string[];\n orphaned: string[];\n conflicts: Array<{ key: string; defaults: string[] }>;\n}\n\nexport interface TranslationKeySyncOptions {\n /** Report changes without writing them to the target. */\n dryRun?: boolean;\n}\n\nfunction literalText(node: ts.Node | undefined): string | undefined {\n return node && (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node))\n ? node.text\n : undefined;\n}\n\n/** Extract static `t(key, default)` and `<T keyName defaultValue>` call sites. */\nexport function extractTranslationKeys(\n source: string,\n file = 'source.tsx',\n): ExtractedTranslationKey[] {\n const sourceFile = ts.createSourceFile(\n file,\n source,\n ts.ScriptTarget.Latest,\n true,\n file.endsWith('x') ? ts.ScriptKind.TSX : ts.ScriptKind.TS,\n );\n const extracted: ExtractedTranslationKey[] = [];\n const add = (keyNode: ts.Node | undefined, defaultNode: ts.Node | undefined) => {\n const key = literalText(keyNode);\n const sourceText = literalText(defaultNode);\n if (!key || sourceText === undefined) return;\n const { line } = sourceFile.getLineAndCharacterOfPosition(keyNode!.getStart(sourceFile));\n extracted.push({ key, sourceText, file, line: line + 1 });\n };\n const visit = (node: ts.Node) => {\n if (\n ts.isCallExpression(node) &&\n ts.isIdentifier(node.expression) &&\n node.expression.text === 't'\n ) {\n add(node.arguments[0], node.arguments[1]);\n } else if (ts.isJsxSelfClosingElement(node) || ts.isJsxOpeningElement(node)) {\n if (node.tagName.getText(sourceFile) === 'T') {\n const attrs = new Map(\n node.attributes.properties\n .filter(ts.isJsxAttribute)\n .map((attr) => [attr.name.getText(sourceFile), attr.initializer]),\n );\n const fromAttribute = (initializer: ts.JsxAttributeValue | undefined) => {\n if (!initializer) return undefined;\n if (ts.isStringLiteral(initializer)) return initializer;\n return ts.isJsxExpression(initializer) ? initializer.expression : undefined;\n };\n add(fromAttribute(attrs.get('keyName')), fromAttribute(attrs.get('defaultValue')));\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(sourceFile);\n return extracted;\n}\n\n/** Adapt the shipped static extractor to the portable discovery contract. */\nexport function translationDeclarationsFromExtractedKeys(\n extracted: Iterable<ExtractedTranslationKey>,\n): TranslationDeclaration[] {\n return [...extracted].map((item) => ({\n schemaVersion: 1,\n key: item.key,\n sourceText: item.sourceText,\n kind: 'ui',\n format: 'simple',\n provenance: {\n source: 'code',\n sourceId: item.file,\n authoritative: true,\n file: item.file,\n line: item.line,\n },\n }));\n}\n\n/** Create a portable source from already-extracted static call sites. */\nexport function staticTranslationDiscoverySource(\n extracted: Iterable<ExtractedTranslationKey>,\n name = 'static-code',\n): TranslationDiscoverySource {\n const declarations = translationDeclarationsFromExtractedKeys(extracted);\n return {\n name,\n async *discover() {\n yield* declarations;\n },\n };\n}\n\n/**\n * Apply extracted keys. Source drift is delegated to the provider, which marks\n * existing units stale. Orphans are deliberately report-only.\n */\nexport async function syncTranslationKeys(\n target: TranslationKeySyncTarget,\n appId: string,\n extracted: ExtractedTranslationKey[],\n options: TranslationKeySyncOptions = {},\n): Promise<TranslationKeySyncReport> {\n const existing = await target.list({ appId });\n const existingByKey = new Map(existing.map((item) => [item.key, item]));\n const defaultsByKey = new Map<string, Set<string>>();\n for (const item of extracted) {\n const defaults = defaultsByKey.get(item.key) ?? new Set<string>();\n defaults.add(item.sourceText);\n defaultsByKey.set(item.key, defaults);\n }\n const report: TranslationKeySyncReport = {\n created: [], updated: [], unchanged: [], orphaned: [], conflicts: [],\n };\n for (const [key, defaults] of defaultsByKey) {\n if (defaults.size > 1) {\n report.conflicts.push({ key, defaults: [...defaults].sort() });\n continue;\n }\n const sourceText = [...defaults][0];\n const current = existingByKey.get(key);\n if (!current) report.created.push(key);\n else if (current.sourceText !== sourceText) report.updated.push(key);\n else {\n report.unchanged.push(key);\n continue;\n }\n if (!options.dryRun) {\n await target.upsert({ appId, key, sourceText, kind: 'ui' });\n }\n }\n report.orphaned = existing\n .map((item) => item.key)\n .filter((key) => !defaultsByKey.has(key))\n .sort();\n return report;\n}\n"]}
1
+ {"version":3,"file":"key-sync.js","sourceRoot":"","sources":["../../src/key-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import ts from 'typescript';\nimport type {\n TranslationDeclaration,\n TranslationDiscoverySource,\n} from './discovery.js';\n\nexport interface ExtractedTranslationKey {\n key: string;\n sourceText: string;\n file: string;\n line: number;\n}\n\nexport interface TranslationKeySyncTarget {\n /**\n * Existing keys. `overridden: true` marks a declared key the app has reworded\n * locally; sync reports it in `preservedOverrides` and never writes it.\n */\n list(data: { appId: string }): Promise<\n Array<{ key: string; sourceText?: string; overridden?: boolean }>\n >;\n /**\n * Write one key. A writer that keeps an app override instead of applying the\n * declared source answers `{ preservedOverride: true }` (see\n * `upsertTranslationKey` with `source: 'declaration-sync'`).\n */\n upsert(data: {\n appId: string;\n key: string;\n sourceText: string;\n kind: 'ui';\n }): Promise<unknown>;\n}\n\nexport interface TranslationKeySyncReport {\n created: string[];\n updated: string[];\n unchanged: string[];\n /** Keys whose app override was kept over the declared source; also in `unchanged`. */\n preservedOverrides: string[];\n orphaned: string[];\n conflicts: Array<{ key: string; defaults: string[] }>;\n}\n\nexport interface TranslationKeySyncOptions {\n /** Report changes without writing them to the target. */\n dryRun?: boolean;\n}\n\nfunction literalText(node: ts.Node | undefined): string | undefined {\n return node && (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node))\n ? node.text\n : undefined;\n}\n\n/** Extract static `t(key, default)` and `<T keyName defaultValue>` call sites. */\nexport function extractTranslationKeys(\n source: string,\n file = 'source.tsx',\n): ExtractedTranslationKey[] {\n const sourceFile = ts.createSourceFile(\n file,\n source,\n ts.ScriptTarget.Latest,\n true,\n file.endsWith('x') ? ts.ScriptKind.TSX : ts.ScriptKind.TS,\n );\n const extracted: ExtractedTranslationKey[] = [];\n const add = (keyNode: ts.Node | undefined, defaultNode: ts.Node | undefined) => {\n const key = literalText(keyNode);\n const sourceText = literalText(defaultNode);\n if (!key || sourceText === undefined) return;\n const { line } = sourceFile.getLineAndCharacterOfPosition(keyNode!.getStart(sourceFile));\n extracted.push({ key, sourceText, file, line: line + 1 });\n };\n const visit = (node: ts.Node) => {\n if (\n ts.isCallExpression(node) &&\n ts.isIdentifier(node.expression) &&\n node.expression.text === 't'\n ) {\n add(node.arguments[0], node.arguments[1]);\n } else if (ts.isJsxSelfClosingElement(node) || ts.isJsxOpeningElement(node)) {\n if (node.tagName.getText(sourceFile) === 'T') {\n const attrs = new Map(\n node.attributes.properties\n .filter(ts.isJsxAttribute)\n .map((attr) => [attr.name.getText(sourceFile), attr.initializer]),\n );\n const fromAttribute = (initializer: ts.JsxAttributeValue | undefined) => {\n if (!initializer) return undefined;\n if (ts.isStringLiteral(initializer)) return initializer;\n return ts.isJsxExpression(initializer) ? initializer.expression : undefined;\n };\n add(fromAttribute(attrs.get('keyName')), fromAttribute(attrs.get('defaultValue')));\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(sourceFile);\n return extracted;\n}\n\n/** Adapt the shipped static extractor to the portable discovery contract. */\nexport function translationDeclarationsFromExtractedKeys(\n extracted: Iterable<ExtractedTranslationKey>,\n): TranslationDeclaration[] {\n return [...extracted].map((item) => ({\n schemaVersion: 1,\n key: item.key,\n sourceText: item.sourceText,\n kind: 'ui',\n format: 'simple',\n provenance: {\n source: 'code',\n sourceId: item.file,\n authoritative: true,\n file: item.file,\n line: item.line,\n },\n }));\n}\n\n/** Create a portable source from already-extracted static call sites. */\nexport function staticTranslationDiscoverySource(\n extracted: Iterable<ExtractedTranslationKey>,\n name = 'static-code',\n): TranslationDiscoverySource {\n const declarations = translationDeclarationsFromExtractedKeys(extracted);\n return {\n name,\n async *discover() {\n yield* declarations;\n },\n };\n}\n\n/**\n * Apply extracted keys. Source drift is delegated to the provider, which marks\n * existing units stale. Orphans are deliberately report-only.\n */\nexport async function syncTranslationKeys(\n target: TranslationKeySyncTarget,\n appId: string,\n extracted: ExtractedTranslationKey[],\n options: TranslationKeySyncOptions = {},\n): Promise<TranslationKeySyncReport> {\n const existing = await target.list({ appId });\n const existingByKey = new Map(existing.map((item) => [item.key, item]));\n const defaultsByKey = new Map<string, Set<string>>();\n for (const item of extracted) {\n const defaults = defaultsByKey.get(item.key) ?? new Set<string>();\n defaults.add(item.sourceText);\n defaultsByKey.set(item.key, defaults);\n }\n const report: TranslationKeySyncReport = {\n created: [],\n updated: [],\n unchanged: [],\n preservedOverrides: [],\n orphaned: [],\n conflicts: [],\n };\n for (const [key, defaults] of defaultsByKey) {\n if (defaults.size > 1) {\n report.conflicts.push({ key, defaults: [...defaults].sort() });\n continue;\n }\n const sourceText = [...defaults][0];\n const current = existingByKey.get(key);\n if (current?.overridden === true) {\n report.preservedOverrides.push(key);\n report.unchanged.push(key);\n continue;\n }\n if (current?.sourceText === sourceText) {\n report.unchanged.push(key);\n continue;\n }\n if (!options.dryRun) {\n const result = await target.upsert({\n appId,\n key,\n sourceText,\n kind: 'ui',\n });\n // The writer is authoritative: an override may have appeared since list,\n // or the portable target may not project ownership in its list response.\n if (\n result &&\n typeof result === 'object' &&\n 'preservedOverride' in result &&\n result.preservedOverride === true\n ) {\n report.preservedOverrides.push(key);\n report.unchanged.push(key);\n continue;\n }\n }\n if (current) report.updated.push(key);\n else report.created.push(key);\n }\n report.orphaned = existing\n .map((item) => item.key)\n .filter((key) => !defaultsByKey.has(key))\n .sort();\n return report;\n}\n"]}
package/lib/esm/mt.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * with a fallback chain: not every provider covers every language (DeepL has
6
6
  * no Swahili or Urdu), so the preferred provider is used where it supports
7
7
  * the target and the chain falls through otherwise. Pure module: no I/O, no
8
- * SDK imports — concrete providers live with the host (Create Now) and are
8
+ * SDK imports — concrete providers live with the host application and are
9
9
  * registered at boot.
10
10
  */
11
11
  import { analyzeMessage, compareMessageArguments, } from './message-format.js';