@pigment/auto-translate 1.4.0 → 1.6.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.
@@ -1,3 +1,122 @@
1
+ /**
2
+ * Field types whose stored value is an option/enum constant rather than
3
+ * human-readable prose. The Postgres adapter persists these as native `enum`
4
+ * columns, so translating their values (e.g. "narrow" -> "schmal") produces an
5
+ * invalid enum value and makes the locale-row INSERT fail with
6
+ * `invalid input value for enum`. These must never be sent to the translator.
7
+ */ const NON_TRANSLATABLE_FIELD_TYPES = new Set([
8
+ 'select',
9
+ 'radio'
10
+ ]);
11
+ /**
12
+ * Container field types that hold nested fields rather than a leaf value.
13
+ * Localization (`localized: true`) set on a named container (`group`, `array`,
14
+ * `blocks`, named `tab`) cascades to every field nested within it.
15
+ */ const CONTAINER_FIELD_TYPES = new Set([
16
+ 'array',
17
+ 'blocks',
18
+ 'collapsible',
19
+ 'group',
20
+ 'row',
21
+ 'tabs'
22
+ ]);
23
+ /**
24
+ * Walks a Payload field schema and copies canonical (untranslated) values from
25
+ * `original` back into `translated`, in place. A field's value is restored when:
26
+ *
27
+ * - it is a `select`/`radio` field (enum-backed; always restored), or
28
+ * - `localizedOnly` is enabled and the field is not localized (directly or via
29
+ * a localized ancestor container).
30
+ *
31
+ * This works regardless of which translation strategy produced `translated`
32
+ * (optimized, legacy, or a custom translator).
33
+ */ export function overlayNonTranslatableValues(translated, original, fields, options = {}) {
34
+ if (!Array.isArray(fields) || !translated || typeof translated !== 'object' || !original || typeof original !== 'object') {
35
+ return;
36
+ }
37
+ const { inheritedLocalized = false, localizedOnly = false } = options;
38
+ for (const field of fields){
39
+ const type = field?.type;
40
+ const name = typeof field?.name === 'string' ? field.name : undefined;
41
+ const isLocalized = inheritedLocalized || field?.localized === true;
42
+ // Container fields: recurse, cascading localization to nested fields.
43
+ if (type && CONTAINER_FIELD_TYPES.has(type)) {
44
+ const childOptions = {
45
+ inheritedLocalized: isLocalized,
46
+ localizedOnly
47
+ };
48
+ switch(type){
49
+ case 'array':
50
+ if (name && Array.isArray(translated[name]) && Array.isArray(original[name])) {
51
+ translated[name].forEach((item, index)=>{
52
+ overlayNonTranslatableValues(item, original[name][index], field.fields, childOptions);
53
+ });
54
+ } else if (localizedOnly && name && !isLocalized && original[name] !== undefined) {
55
+ translated[name] = original[name];
56
+ }
57
+ break;
58
+ case 'blocks':
59
+ if (name && Array.isArray(translated[name]) && Array.isArray(original[name])) {
60
+ const blockDefs = Array.isArray(field.blocks) ? field.blocks : [];
61
+ translated[name].forEach((item, index)=>{
62
+ const originalItem = original[name][index];
63
+ const blockType = item?.blockType ?? originalItem?.blockType;
64
+ const blockDef = blockDefs.find((b)=>b?.slug === blockType);
65
+ if (blockDef) {
66
+ overlayNonTranslatableValues(item, originalItem, blockDef.fields, childOptions);
67
+ }
68
+ });
69
+ } else if (localizedOnly && name && !isLocalized && original[name] !== undefined) {
70
+ translated[name] = original[name];
71
+ }
72
+ break;
73
+ case 'collapsible':
74
+ case 'row':
75
+ // Presentational wrappers share the parent object and cannot be localized.
76
+ overlayNonTranslatableValues(translated, original, field.fields, {
77
+ inheritedLocalized,
78
+ localizedOnly
79
+ });
80
+ break;
81
+ case 'group':
82
+ if (name) {
83
+ overlayNonTranslatableValues(translated[name], original[name], field.fields, childOptions);
84
+ }
85
+ break;
86
+ case 'tabs':
87
+ if (Array.isArray(field.tabs)) {
88
+ for (const tab of field.tabs){
89
+ const tabName = typeof tab?.name === 'string' ? tab.name : undefined;
90
+ const tabLocalized = inheritedLocalized || tab?.localized === true;
91
+ if (tabName) {
92
+ overlayNonTranslatableValues(translated[tabName], original[tabName], tab.fields, {
93
+ inheritedLocalized: tabLocalized,
94
+ localizedOnly
95
+ });
96
+ } else {
97
+ // Unnamed tabs share the parent object.
98
+ overlayNonTranslatableValues(translated, original, tab.fields, {
99
+ inheritedLocalized,
100
+ localizedOnly
101
+ });
102
+ }
103
+ }
104
+ }
105
+ break;
106
+ }
107
+ continue;
108
+ }
109
+ // Leaf fields: restore the original value when it must not be translated.
110
+ if (!name) {
111
+ continue;
112
+ }
113
+ const isEnumField = Boolean(type && NON_TRANSLATABLE_FIELD_TYPES.has(type));
114
+ const shouldRestore = isEnumField || localizedOnly && !isLocalized;
115
+ if (shouldRestore && original[name] !== undefined) {
116
+ translated[name] = original[name];
117
+ }
118
+ }
119
+ }
1
120
  /**
2
121
  * Recursively extracts all field paths and their values from a document
3
122
  */ export function extractFieldPaths(data, parentPath = '', fields) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/fieldHelpers.ts"],"sourcesContent":["import type { Field } from 'payload'\n\nimport type { FieldPath } from '../types/index.js'\n\n/**\n * Recursively extracts all field paths and their values from a document\n */\nexport function extractFieldPaths(\n data: any,\n parentPath: string = '',\n fields?: Field[],\n): FieldPath[] {\n const paths: FieldPath[] = []\n\n if (!data || typeof data !== 'object') {\n return paths\n }\n\n for (const [key, value] of Object.entries(data)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key\n\n // Skip internal fields\n if (\n key === 'id' ||\n key === '_id' ||\n key === 'createdAt' ||\n key === 'updatedAt' ||\n key === 'translationSync' ||\n key === '__v'\n ) {\n continue\n }\n\n // Add current field\n paths.push({\n parentPath,\n path: currentPath,\n value,\n })\n\n // Recursively process nested objects\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n paths.push(...extractFieldPaths(value, currentPath, fields))\n }\n\n // Process arrays\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n const arrayPath = `${currentPath}.${index}`\n if (item && typeof item === 'object') {\n paths.push(...extractFieldPaths(item, arrayPath, fields))\n }\n })\n }\n }\n\n return paths\n}\n\n/**\n * Filters out excluded paths from data before translation\n */\nexport function filterExcludedPaths(data: any, excludedPaths: string[]): any {\n if (!data || typeof data !== 'object' || excludedPaths.length === 0) {\n return data\n }\n\n const filtered = JSON.parse(JSON.stringify(data)) // Deep clone\n\n for (const excludedPath of excludedPaths) {\n deletePath(filtered, excludedPath)\n }\n\n return filtered\n}\n\n/**\n * Merges translated data back, respecting excluded paths\n */\nexport function mergeTranslatedData(\n originalData: any,\n translatedData: any,\n excludedPaths: string[],\n): any {\n if (!translatedData || typeof translatedData !== 'object') {\n return originalData\n }\n\n const merged = JSON.parse(JSON.stringify(originalData)) // Deep clone\n\n function merge(target: any, source: any, currentPath: string = ''): void {\n for (const key in source) {\n const fullPath = currentPath ? `${currentPath}.${key}` : key\n\n // Skip if this path is excluded\n if (isPathExcluded(fullPath, excludedPaths)) {\n continue\n }\n\n // Skip internal fields\n if (\n key === 'id' ||\n key === '_id' ||\n key === 'createdAt' ||\n key === 'updatedAt' ||\n key === 'translationSync' ||\n key === '__v'\n ) {\n continue\n }\n\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n if (!target[key]) {\n target[key] = {}\n }\n merge(target[key], source[key], fullPath)\n } else {\n target[key] = source[key]\n }\n }\n }\n\n merge(merged, translatedData)\n return merged\n}\n\n/**\n * Checks if a path is excluded or if any parent path is excluded\n */\nexport function isPathExcluded(path: string, excludedPaths: string[]): boolean {\n return excludedPaths.some((excludedPath) => {\n // Exact match\n if (path === excludedPath) {\n return true\n }\n\n // Check if path is a child of excluded path\n if (path.startsWith(`${excludedPath}.`)) {\n return true\n }\n\n // Check if excluded path is a pattern match for arrays (e.g., content.0.title)\n const pathParts = path.split('.')\n const excludedParts = excludedPath.split('.')\n\n for (let i = 0; i < Math.min(pathParts.length, excludedParts.length); i++) {\n if (excludedParts[i] !== pathParts[i]) {\n // Check if it's an array index difference\n if (!isNaN(Number(pathParts[i])) && !isNaN(Number(excludedParts[i]))) {\n continue\n }\n return false\n }\n }\n\n return excludedParts.length <= pathParts.length\n })\n}\n\n/**\n * Deletes a path from an object using dot notation\n */\nfunction deletePath(obj: any, path: string): void {\n const parts = path.split('.')\n let current = obj\n\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) {\n return\n }\n current = current[parts[i]]\n }\n\n delete current[parts[parts.length - 1]]\n}\n\n/**\n * Gets value at path using dot notation\n */\nexport function getValueAtPath(obj: any, path: string): any {\n return path.split('.').reduce((current, part) => current?.[part], obj)\n}\n\n/**\n * Sets value at path using dot notation\n */\nexport function setValueAtPath(obj: any, path: string, value: any): void {\n const parts = path.split('.')\n let current = obj\n\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) {\n current[parts[i]] = {}\n }\n current = current[parts[i]]\n }\n\n current[parts[parts.length - 1]] = value\n}\n\n/**\n * Checks if a field is a localized field\n */\nexport function isLocalizedField(field: Field): boolean {\n return 'localized' in field && field.localized === true\n}\n\n/**\n * Gets all localized field paths from a collection config\n */\nexport function getLocalizedFieldPaths(fields: Field[], parentPath: string = ''): string[] {\n const paths: string[] = []\n\n for (const field of fields) {\n if (!('name' in field)) {\n continue\n }\n\n const fieldPath = parentPath ? `${parentPath}.${field.name}` : field.name\n\n if (isLocalizedField(field)) {\n paths.push(fieldPath)\n }\n\n // Recursively check nested fields\n if ('fields' in field && Array.isArray(field.fields)) {\n paths.push(...getLocalizedFieldPaths(field.fields, fieldPath))\n }\n\n // Check blocks\n if (field.type === 'blocks' && 'blocks' in field && Array.isArray(field.blocks)) {\n for (const block of field.blocks) {\n if ('fields' in block && Array.isArray(block.fields)) {\n paths.push(...getLocalizedFieldPaths(block.fields, fieldPath))\n }\n }\n }\n\n // Check group fields\n if (field.type === 'group' && 'fields' in field && Array.isArray(field.fields)) {\n paths.push(...getLocalizedFieldPaths(field.fields, fieldPath))\n }\n\n // Check array fields\n if (field.type === 'array' && 'fields' in field && Array.isArray(field.fields)) {\n paths.push(...getLocalizedFieldPaths(field.fields, fieldPath))\n }\n }\n\n return paths\n}\n"],"names":["extractFieldPaths","data","parentPath","fields","paths","key","value","Object","entries","currentPath","push","path","Array","isArray","forEach","item","index","arrayPath","filterExcludedPaths","excludedPaths","length","filtered","JSON","parse","stringify","excludedPath","deletePath","mergeTranslatedData","originalData","translatedData","merged","merge","target","source","fullPath","isPathExcluded","some","startsWith","pathParts","split","excludedParts","i","Math","min","isNaN","Number","obj","parts","current","getValueAtPath","reduce","part","setValueAtPath","isLocalizedField","field","localized","getLocalizedFieldPaths","fieldPath","name","type","blocks","block"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/fieldHelpers.ts"],"sourcesContent":["import type { Field } from 'payload'\n\nimport type { FieldPath } from '../types/index.js'\n\n/**\n * Field types whose stored value is an option/enum constant rather than\n * human-readable prose. The Postgres adapter persists these as native `enum`\n * columns, so translating their values (e.g. \"narrow\" -> \"schmal\") produces an\n * invalid enum value and makes the locale-row INSERT fail with\n * `invalid input value for enum`. These must never be sent to the translator.\n */\nconst NON_TRANSLATABLE_FIELD_TYPES = new Set(['select', 'radio'])\n\n/**\n * Container field types that hold nested fields rather than a leaf value.\n * Localization (`localized: true`) set on a named container (`group`, `array`,\n * `blocks`, named `tab`) cascades to every field nested within it.\n */\nconst CONTAINER_FIELD_TYPES = new Set(['array', 'blocks', 'collapsible', 'group', 'row', 'tabs'])\n\nexport type OverlayOptions = {\n /**\n * Localization inherited from an ancestor container (`group`/`array`/`blocks`/\n * named `tab`) that has `localized: true`. When true, every nested field is\n * treated as localized.\n */\n inheritedLocalized?: boolean\n /**\n * When true, only fields that are localized (directly or via an ancestor\n * container) are kept from `translated`; every non-localized field is restored\n * from `original` so it is effectively excluded from translation.\n */\n localizedOnly?: boolean\n}\n\n/**\n * Walks a Payload field schema and copies canonical (untranslated) values from\n * `original` back into `translated`, in place. A field's value is restored when:\n *\n * - it is a `select`/`radio` field (enum-backed; always restored), or\n * - `localizedOnly` is enabled and the field is not localized (directly or via\n * a localized ancestor container).\n *\n * This works regardless of which translation strategy produced `translated`\n * (optimized, legacy, or a custom translator).\n */\nexport function overlayNonTranslatableValues(\n translated: any,\n original: any,\n fields: Field[] | undefined,\n options: OverlayOptions = {},\n): void {\n if (\n !Array.isArray(fields) ||\n !translated ||\n typeof translated !== 'object' ||\n !original ||\n typeof original !== 'object'\n ) {\n return\n }\n\n const { inheritedLocalized = false, localizedOnly = false } = options\n\n for (const field of fields as any[]) {\n const type = field?.type\n const name = typeof field?.name === 'string' ? field.name : undefined\n const isLocalized = inheritedLocalized || field?.localized === true\n\n // Container fields: recurse, cascading localization to nested fields.\n if (type && CONTAINER_FIELD_TYPES.has(type)) {\n const childOptions: OverlayOptions = { inheritedLocalized: isLocalized, localizedOnly }\n\n switch (type) {\n case 'array':\n if (name && Array.isArray(translated[name]) && Array.isArray(original[name])) {\n translated[name].forEach((item: any, index: number) => {\n overlayNonTranslatableValues(item, original[name][index], field.fields, childOptions)\n })\n } else if (localizedOnly && name && !isLocalized && original[name] !== undefined) {\n translated[name] = original[name]\n }\n break\n\n case 'blocks':\n if (name && Array.isArray(translated[name]) && Array.isArray(original[name])) {\n const blockDefs: any[] = Array.isArray(field.blocks) ? field.blocks : []\n translated[name].forEach((item: any, index: number) => {\n const originalItem = original[name][index]\n const blockType = item?.blockType ?? originalItem?.blockType\n const blockDef = blockDefs.find((b) => b?.slug === blockType)\n if (blockDef) {\n overlayNonTranslatableValues(item, originalItem, blockDef.fields, childOptions)\n }\n })\n } else if (localizedOnly && name && !isLocalized && original[name] !== undefined) {\n translated[name] = original[name]\n }\n break\n\n case 'collapsible':\n case 'row':\n // Presentational wrappers share the parent object and cannot be localized.\n overlayNonTranslatableValues(translated, original, field.fields, {\n inheritedLocalized,\n localizedOnly,\n })\n break\n\n case 'group':\n if (name) {\n overlayNonTranslatableValues(\n translated[name],\n original[name],\n field.fields,\n childOptions,\n )\n }\n break\n\n case 'tabs':\n if (Array.isArray(field.tabs)) {\n for (const tab of field.tabs) {\n const tabName = typeof tab?.name === 'string' ? tab.name : undefined\n const tabLocalized = inheritedLocalized || tab?.localized === true\n if (tabName) {\n overlayNonTranslatableValues(translated[tabName], original[tabName], tab.fields, {\n inheritedLocalized: tabLocalized,\n localizedOnly,\n })\n } else {\n // Unnamed tabs share the parent object.\n overlayNonTranslatableValues(translated, original, tab.fields, {\n inheritedLocalized,\n localizedOnly,\n })\n }\n }\n }\n break\n }\n\n continue\n }\n\n // Leaf fields: restore the original value when it must not be translated.\n if (!name) {\n continue\n }\n\n const isEnumField = Boolean(type && NON_TRANSLATABLE_FIELD_TYPES.has(type))\n const shouldRestore = isEnumField || (localizedOnly && !isLocalized)\n\n if (shouldRestore && original[name] !== undefined) {\n translated[name] = original[name]\n }\n }\n}\n\n/**\n * Recursively extracts all field paths and their values from a document\n */\nexport function extractFieldPaths(\n data: any,\n parentPath: string = '',\n fields?: Field[],\n): FieldPath[] {\n const paths: FieldPath[] = []\n\n if (!data || typeof data !== 'object') {\n return paths\n }\n\n for (const [key, value] of Object.entries(data)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key\n\n // Skip internal fields\n if (\n key === 'id' ||\n key === '_id' ||\n key === 'createdAt' ||\n key === 'updatedAt' ||\n key === 'translationSync' ||\n key === '__v'\n ) {\n continue\n }\n\n // Add current field\n paths.push({\n parentPath,\n path: currentPath,\n value,\n })\n\n // Recursively process nested objects\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n paths.push(...extractFieldPaths(value, currentPath, fields))\n }\n\n // Process arrays\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n const arrayPath = `${currentPath}.${index}`\n if (item && typeof item === 'object') {\n paths.push(...extractFieldPaths(item, arrayPath, fields))\n }\n })\n }\n }\n\n return paths\n}\n\n/**\n * Filters out excluded paths from data before translation\n */\nexport function filterExcludedPaths(data: any, excludedPaths: string[]): any {\n if (!data || typeof data !== 'object' || excludedPaths.length === 0) {\n return data\n }\n\n const filtered = JSON.parse(JSON.stringify(data)) // Deep clone\n\n for (const excludedPath of excludedPaths) {\n deletePath(filtered, excludedPath)\n }\n\n return filtered\n}\n\n/**\n * Merges translated data back, respecting excluded paths\n */\nexport function mergeTranslatedData(\n originalData: any,\n translatedData: any,\n excludedPaths: string[],\n): any {\n if (!translatedData || typeof translatedData !== 'object') {\n return originalData\n }\n\n const merged = JSON.parse(JSON.stringify(originalData)) // Deep clone\n\n function merge(target: any, source: any, currentPath: string = ''): void {\n for (const key in source) {\n const fullPath = currentPath ? `${currentPath}.${key}` : key\n\n // Skip if this path is excluded\n if (isPathExcluded(fullPath, excludedPaths)) {\n continue\n }\n\n // Skip internal fields\n if (\n key === 'id' ||\n key === '_id' ||\n key === 'createdAt' ||\n key === 'updatedAt' ||\n key === 'translationSync' ||\n key === '__v'\n ) {\n continue\n }\n\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n if (!target[key]) {\n target[key] = {}\n }\n merge(target[key], source[key], fullPath)\n } else {\n target[key] = source[key]\n }\n }\n }\n\n merge(merged, translatedData)\n return merged\n}\n\n/**\n * Checks if a path is excluded or if any parent path is excluded\n */\nexport function isPathExcluded(path: string, excludedPaths: string[]): boolean {\n return excludedPaths.some((excludedPath) => {\n // Exact match\n if (path === excludedPath) {\n return true\n }\n\n // Check if path is a child of excluded path\n if (path.startsWith(`${excludedPath}.`)) {\n return true\n }\n\n // Check if excluded path is a pattern match for arrays (e.g., content.0.title)\n const pathParts = path.split('.')\n const excludedParts = excludedPath.split('.')\n\n for (let i = 0; i < Math.min(pathParts.length, excludedParts.length); i++) {\n if (excludedParts[i] !== pathParts[i]) {\n // Check if it's an array index difference\n if (!isNaN(Number(pathParts[i])) && !isNaN(Number(excludedParts[i]))) {\n continue\n }\n return false\n }\n }\n\n return excludedParts.length <= pathParts.length\n })\n}\n\n/**\n * Deletes a path from an object using dot notation\n */\nfunction deletePath(obj: any, path: string): void {\n const parts = path.split('.')\n let current = obj\n\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) {\n return\n }\n current = current[parts[i]]\n }\n\n delete current[parts[parts.length - 1]]\n}\n\n/**\n * Gets value at path using dot notation\n */\nexport function getValueAtPath(obj: any, path: string): any {\n return path.split('.').reduce((current, part) => current?.[part], obj)\n}\n\n/**\n * Sets value at path using dot notation\n */\nexport function setValueAtPath(obj: any, path: string, value: any): void {\n const parts = path.split('.')\n let current = obj\n\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) {\n current[parts[i]] = {}\n }\n current = current[parts[i]]\n }\n\n current[parts[parts.length - 1]] = value\n}\n\n/**\n * Checks if a field is a localized field\n */\nexport function isLocalizedField(field: Field): boolean {\n return 'localized' in field && field.localized === true\n}\n\n/**\n * Gets all localized field paths from a collection config\n */\nexport function getLocalizedFieldPaths(fields: Field[], parentPath: string = ''): string[] {\n const paths: string[] = []\n\n for (const field of fields) {\n if (!('name' in field)) {\n continue\n }\n\n const fieldPath = parentPath ? `${parentPath}.${field.name}` : field.name\n\n if (isLocalizedField(field)) {\n paths.push(fieldPath)\n }\n\n // Recursively check nested fields\n if ('fields' in field && Array.isArray(field.fields)) {\n paths.push(...getLocalizedFieldPaths(field.fields, fieldPath))\n }\n\n // Check blocks\n if (field.type === 'blocks' && 'blocks' in field && Array.isArray(field.blocks)) {\n for (const block of field.blocks) {\n if ('fields' in block && Array.isArray(block.fields)) {\n paths.push(...getLocalizedFieldPaths(block.fields, fieldPath))\n }\n }\n }\n\n // Check group fields\n if (field.type === 'group' && 'fields' in field && Array.isArray(field.fields)) {\n paths.push(...getLocalizedFieldPaths(field.fields, fieldPath))\n }\n\n // Check array fields\n if (field.type === 'array' && 'fields' in field && Array.isArray(field.fields)) {\n paths.push(...getLocalizedFieldPaths(field.fields, fieldPath))\n }\n }\n\n return paths\n}\n"],"names":["NON_TRANSLATABLE_FIELD_TYPES","Set","CONTAINER_FIELD_TYPES","overlayNonTranslatableValues","translated","original","fields","options","Array","isArray","inheritedLocalized","localizedOnly","field","type","name","undefined","isLocalized","localized","has","childOptions","forEach","item","index","blockDefs","blocks","originalItem","blockType","blockDef","find","b","slug","tabs","tab","tabName","tabLocalized","isEnumField","Boolean","shouldRestore","extractFieldPaths","data","parentPath","paths","key","value","Object","entries","currentPath","push","path","arrayPath","filterExcludedPaths","excludedPaths","length","filtered","JSON","parse","stringify","excludedPath","deletePath","mergeTranslatedData","originalData","translatedData","merged","merge","target","source","fullPath","isPathExcluded","some","startsWith","pathParts","split","excludedParts","i","Math","min","isNaN","Number","obj","parts","current","getValueAtPath","reduce","part","setValueAtPath","isLocalizedField","getLocalizedFieldPaths","fieldPath","block"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pigment/auto-translate",
3
- "version": "1.4.0",
3
+ "version": "1.6.0",
4
4
  "description": "Automatic translation plugin for Payload CMS with field-level exclusion controls and performance optimizations",
5
5
  "keywords": [
6
6
  "payload",
@@ -27,18 +27,18 @@
27
27
  "type": "module",
28
28
  "exports": {
29
29
  ".": {
30
- "import": "./dist/index.js",
31
30
  "types": "./dist/index.d.ts",
31
+ "import": "./dist/index.js",
32
32
  "default": "./dist/index.js"
33
33
  },
34
34
  "./client": {
35
- "import": "./dist/exports/client.js",
36
35
  "types": "./dist/exports/client.d.ts",
36
+ "import": "./dist/exports/client.js",
37
37
  "default": "./dist/exports/client.js"
38
38
  },
39
39
  "./rsc": {
40
- "import": "./dist/exports/rsc.js",
41
40
  "types": "./dist/exports/rsc.d.ts",
41
+ "import": "./dist/exports/rsc.js",
42
42
  "default": "./dist/exports/rsc.js"
43
43
  }
44
44
  },
@@ -47,6 +47,30 @@
47
47
  "files": [
48
48
  "dist"
49
49
  ],
50
+ "scripts": {
51
+ "build": "pnpm copyfiles && pnpm build:types && pnpm build:swc",
52
+ "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths",
53
+ "build:types": "tsc --outDir dist --rootDir ./src",
54
+ "clean": "rimraf {dist,*.tsbuildinfo}",
55
+ "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/",
56
+ "dev": "next dev dev",
57
+ "dev:generate-importmap": "pnpm dev:payload generate:importmap",
58
+ "dev:generate-types": "pnpm dev:payload generate:types",
59
+ "dev:migrate": "pnpm dev:payload migrate",
60
+ "dev:migrate:create": "pnpm dev:payload migrate:create",
61
+ "dev:migrate:down": "pnpm dev:payload migrate:down",
62
+ "dev:migrate:fresh": "pnpm dev:payload migrate:fresh",
63
+ "dev:migrate:status": "pnpm dev:payload migrate:status",
64
+ "dev:payload": "dotenv -e ./dev/.env -- cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload",
65
+ "generate:importmap": "pnpm dev:generate-importmap",
66
+ "generate:types": "pnpm dev:generate-types",
67
+ "lint": "eslint",
68
+ "lint:fix": "eslint ./src --fix",
69
+ "prepublishOnly": "pnpm clean && pnpm build",
70
+ "test": "pnpm test:int && pnpm test:e2e",
71
+ "test:e2e": "playwright test",
72
+ "test:int": "vitest"
73
+ },
50
74
  "devDependencies": {
51
75
  "@eslint/eslintrc": "^3.2.0",
52
76
  "@payloadcms/db-mongodb": "3.85.0",
@@ -54,6 +78,7 @@
54
78
  "@payloadcms/db-sqlite": "3.85.0",
55
79
  "@payloadcms/eslint-config": "3.28.0",
56
80
  "@payloadcms/next": "3.85.0",
81
+ "@payloadcms/plugin-nested-docs": "3.85.0",
57
82
  "@payloadcms/richtext-lexical": "3.85.0",
58
83
  "@payloadcms/ui": "3.85.0",
59
84
  "@playwright/test": "^1.52.0",
@@ -90,31 +115,36 @@
90
115
  "node": "^20.9.0 || >=22",
91
116
  "pnpm": "^9 || ^10"
92
117
  },
118
+ "publishConfig": {
119
+ "exports": {
120
+ ".": {
121
+ "types": "./dist/index.d.ts",
122
+ "import": "./dist/index.js",
123
+ "default": "./dist/index.js"
124
+ },
125
+ "./client": {
126
+ "types": "./dist/exports/client.d.ts",
127
+ "import": "./dist/exports/client.js",
128
+ "default": "./dist/exports/client.js"
129
+ },
130
+ "./rsc": {
131
+ "types": "./dist/exports/rsc.d.ts",
132
+ "import": "./dist/exports/rsc.js",
133
+ "default": "./dist/exports/rsc.js"
134
+ }
135
+ },
136
+ "main": "./dist/index.js",
137
+ "types": "./dist/index.d.ts"
138
+ },
139
+ "pnpm": {
140
+ "onlyBuiltDependencies": [
141
+ "sharp",
142
+ "esbuild",
143
+ "unrs-resolver"
144
+ ]
145
+ },
93
146
  "registry": "https://registry.npmjs.org/",
94
147
  "dependencies": {
95
148
  "openai": "^6.8.0"
96
- },
97
- "scripts": {
98
- "build": "pnpm copyfiles && pnpm build:types && pnpm build:swc",
99
- "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths",
100
- "build:types": "tsc --outDir dist --rootDir ./src",
101
- "clean": "rimraf {dist,*.tsbuildinfo}",
102
- "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/",
103
- "dev": "next dev dev",
104
- "dev:generate-importmap": "pnpm dev:payload generate:importmap",
105
- "dev:generate-types": "pnpm dev:payload generate:types",
106
- "dev:migrate": "pnpm dev:payload migrate",
107
- "dev:migrate:create": "pnpm dev:payload migrate:create",
108
- "dev:migrate:down": "pnpm dev:payload migrate:down",
109
- "dev:migrate:fresh": "pnpm dev:payload migrate:fresh",
110
- "dev:migrate:status": "pnpm dev:payload migrate:status",
111
- "dev:payload": "dotenv -e ./dev/.env -- cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload",
112
- "generate:importmap": "pnpm dev:generate-importmap",
113
- "generate:types": "pnpm dev:generate-types",
114
- "lint": "eslint",
115
- "lint:fix": "eslint ./src --fix",
116
- "test": "pnpm test:int && pnpm test:e2e",
117
- "test:e2e": "playwright test",
118
- "test:int": "vitest"
119
149
  }
120
- }
150
+ }