UNPKG

@intlayer/core

Version:

Includes core Intlayer functions like translation, dictionary, and utility functions shared across multiple packages.

105 lines (103 loc) 4.2 kB
import { NodeType } from "@intlayer/types"; //#region src/deepTransformPlugins/insertContentInDictionary.ts /** * Deep merge helper that handles translation blocks * @param target - The target object (dictionary content) * @param source - The source object (new content to merge) * @param locale - Optional locale to target specific translation * @returns Merged content */ const deepMergeContent = (target, source, locale) => { if (source === null || source === void 0) return target; if (target === null || target === void 0) if (Array.isArray(source)) target = []; else if (typeof source === "object") target = {}; else return source; if (target && typeof target === "object" && target.nodeType === NodeType.Translation) if (locale) { const existingLocaleContent = target.translation[locale]; let newLocaleContent; if (typeof source === "object" && !Array.isArray(source)) newLocaleContent = deepMergeContent(existingLocaleContent, source, void 0); else if (Array.isArray(source)) newLocaleContent = source; else newLocaleContent = source; return { ...target, translation: { ...target.translation, [locale]: newLocaleContent } }; } else if (typeof source === "object" && !Array.isArray(source) && source.nodeType === NodeType.Translation) return { ...target, translation: { ...target.translation, ...source.translation } }; else return processNewContent(source, locale); if (Array.isArray(source)) if (locale && Array.isArray(target)) { const result = []; const maxLength = Math.max(source.length, target.length); for (let i = 0; i < maxLength; i++) if (i < source.length) if (i < target.length && target[i] !== void 0) result[i] = deepMergeContent(target[i], source[i], locale); else result[i] = processNewContent(source[i], locale); else result[i] = target[i]; return result; } else return source.map((item) => { if (item && typeof item === "object" && item.nodeType === NodeType.Translation) return item; return processNewContent(item, locale); }); if (typeof source === "object" && !Array.isArray(source)) { if (typeof target !== "object" || Array.isArray(target)) target = {}; const result = { ...target }; for (const key in source) if (Object.hasOwn(source, key)) if (target[key] !== void 0) result[key] = deepMergeContent(target[key], source[key], locale); else result[key] = processNewContent(source[key], locale); return result; } return source; }; /** * Process new content that doesn't exist in target * @param content - New content to process * @param locale - Optional locale * @returns Processed content */ const processNewContent = (content, locale) => { if (content === null || content === void 0) return content; if (content && typeof content === "object" && content.nodeType === NodeType.Translation) return content; if (Array.isArray(content)) return content.map((item) => processNewContent(item, locale)); if (content && typeof content === "object") { const result = {}; for (const key in content) if (Object.hasOwn(content, key)) result[key] = processNewContent(content[key], locale); return result; } if (locale) return { nodeType: NodeType.Translation, translation: { [locale]: content } }; else return content; }; /** * Insert content into a dictionary with deep merge support * Handles translation blocks and nested structures * * @param dictionary - The dictionary to insert content into * @param content - The content to insert * @param locale - Optional locale to target specific translation * @returns Updated dictionary * * @example * // Without locale - deep merge all content * insertContentInDictionary(dictionary, { title: 'New Title' }) * * @example * // With locale - insert content for specific locale * insertContentInDictionary(dictionary, { title: 'このページ' }, 'ja') */ const insertContentInDictionary = (dictionary, content, locale) => { const mergedContent = deepMergeContent(Array.isArray(dictionary.content) ? [...dictionary.content] : { ...dictionary.content }, content, locale); return { ...dictionary, content: mergedContent }; }; //#endregion export { insertContentInDictionary }; //# sourceMappingURL=insertContentInDictionary.mjs.map