@intlayer/chokidar 8.4.3 → 8.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/cjs/_virtual/_utils_asset.cjs +98 -0
- package/dist/cjs/build.cjs +58 -1
- package/dist/cjs/buildIntlayerDictionary/buildIntlayerDictionary.cjs +62 -1
- package/dist/cjs/buildIntlayerDictionary/buildIntlayerDictionary.cjs.map +1 -1
- package/dist/cjs/buildIntlayerDictionary/index.cjs +6 -1
- package/dist/cjs/buildIntlayerDictionary/processContentDeclaration.cjs +26 -1
- package/dist/cjs/buildIntlayerDictionary/processContentDeclaration.cjs.map +1 -1
- package/dist/cjs/buildIntlayerDictionary/writeDynamicDictionary.cjs +107 -4
- package/dist/cjs/buildIntlayerDictionary/writeDynamicDictionary.cjs.map +1 -1
- package/dist/cjs/buildIntlayerDictionary/writeFetchDictionary.cjs +81 -5
- package/dist/cjs/buildIntlayerDictionary/writeFetchDictionary.cjs.map +1 -1
- package/dist/cjs/buildIntlayerDictionary/writeMergedDictionary.cjs +46 -1
- package/dist/cjs/buildIntlayerDictionary/writeMergedDictionary.cjs.map +1 -1
- package/dist/cjs/buildIntlayerDictionary/writeRemoteDictionary.cjs +50 -1
- package/dist/cjs/buildIntlayerDictionary/writeRemoteDictionary.cjs.map +1 -1
- package/dist/cjs/buildIntlayerDictionary/writeUnmergedDictionary.cjs +59 -1
- package/dist/cjs/buildIntlayerDictionary/writeUnmergedDictionary.cjs.map +1 -1
- package/dist/cjs/cleanOutputDir.cjs +30 -1
- package/dist/cjs/cleanOutputDir.cjs.map +1 -1
- package/dist/cjs/cleanRemovedContentDeclaration.cjs +97 -1
- package/dist/cjs/cleanRemovedContentDeclaration.cjs.map +1 -1
- package/dist/cjs/cli.cjs +35 -1
- package/dist/cjs/createDictionaryEntryPoint/createDictionaryEntryPoint.cjs +70 -1
- package/dist/cjs/createDictionaryEntryPoint/createDictionaryEntryPoint.cjs.map +1 -1
- package/dist/cjs/createDictionaryEntryPoint/generateDictionaryListContent.cjs +42 -7
- package/dist/cjs/createDictionaryEntryPoint/generateDictionaryListContent.cjs.map +1 -1
- package/dist/cjs/createDictionaryEntryPoint/getBuiltDictionariesPath.cjs +23 -1
- package/dist/cjs/createDictionaryEntryPoint/getBuiltDictionariesPath.cjs.map +1 -1
- package/dist/cjs/createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.cjs +24 -1
- package/dist/cjs/createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.cjs.map +1 -1
- package/dist/cjs/createDictionaryEntryPoint/getBuiltFetchDictionariesPath.cjs +24 -1
- package/dist/cjs/createDictionaryEntryPoint/getBuiltFetchDictionariesPath.cjs.map +1 -1
- package/dist/cjs/createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.cjs +23 -1
- package/dist/cjs/createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.cjs.map +1 -1
- package/dist/cjs/createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.cjs +23 -1
- package/dist/cjs/createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.cjs.map +1 -1
- package/dist/cjs/createDictionaryEntryPoint/index.cjs +16 -1
- package/dist/cjs/createType/createModuleAugmentation.cjs +112 -9
- package/dist/cjs/createType/createModuleAugmentation.cjs.map +1 -1
- package/dist/cjs/createType/createType.cjs +29 -1
- package/dist/cjs/createType/createType.cjs.map +1 -1
- package/dist/cjs/createType/index.cjs +8 -1
- package/dist/cjs/detectFormatCommand.cjs +32 -1
- package/dist/cjs/detectFormatCommand.cjs.map +1 -1
- package/dist/cjs/fetchDistantDictionaries.cjs +51 -1
- package/dist/cjs/fetchDistantDictionaries.cjs.map +1 -1
- package/dist/cjs/filterInvalidDictionaries.cjs +52 -1
- package/dist/cjs/filterInvalidDictionaries.cjs.map +1 -1
- package/dist/cjs/formatDictionary.cjs +49 -1
- package/dist/cjs/formatDictionary.cjs.map +1 -1
- package/dist/cjs/getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.cjs +61 -7
- package/dist/cjs/getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.cjs.map +1 -1
- package/dist/cjs/getContentDeclarationFileTemplate/index.cjs +4 -1
- package/dist/cjs/handleAdditionalContentDeclarationFile.cjs +34 -1
- package/dist/cjs/handleAdditionalContentDeclarationFile.cjs.map +1 -1
- package/dist/cjs/handleContentDeclarationFileChange.cjs +49 -1
- package/dist/cjs/handleContentDeclarationFileChange.cjs.map +1 -1
- package/dist/cjs/handleContentDeclarationFileMoved.cjs +24 -1
- package/dist/cjs/handleContentDeclarationFileMoved.cjs.map +1 -1
- package/dist/cjs/handleUnlinkedContentDeclarationFile.cjs +37 -1
- package/dist/cjs/handleUnlinkedContentDeclarationFile.cjs.map +1 -1
- package/dist/cjs/init/index.cjs +284 -1
- package/dist/cjs/init/index.cjs.map +1 -1
- package/dist/cjs/init/utils/configManipulation.cjs +111 -1
- package/dist/cjs/init/utils/configManipulation.cjs.map +1 -1
- package/dist/cjs/init/utils/fileSystem.cjs +39 -1
- package/dist/cjs/init/utils/fileSystem.cjs.map +1 -1
- package/dist/cjs/init/utils/index.cjs +14 -1
- package/dist/cjs/init/utils/jsonParser.cjs +42 -3
- package/dist/cjs/init/utils/jsonParser.cjs.map +1 -1
- package/dist/cjs/init/utils/tsConfig.cjs +18 -1
- package/dist/cjs/init/utils/tsConfig.cjs.map +1 -1
- package/dist/cjs/initConfig/index.cjs +39 -1
- package/dist/cjs/initConfig/index.cjs.map +1 -1
- package/dist/cjs/installMCP/installMCP.cjs +50 -1
- package/dist/cjs/installMCP/installMCP.cjs.map +1 -1
- package/dist/cjs/installSkills/index.cjs +303 -1
- package/dist/cjs/installSkills/index.cjs.map +1 -1
- package/dist/cjs/listDictionariesPath.cjs +42 -1
- package/dist/cjs/listDictionariesPath.cjs.map +1 -1
- package/dist/cjs/listGitFiles.cjs +105 -5
- package/dist/cjs/listGitFiles.cjs.map +1 -1
- package/dist/cjs/listProjects.cjs +47 -1
- package/dist/cjs/listProjects.cjs.map +1 -1
- package/dist/cjs/loadDictionaries/getIntlayerBundle.cjs +68 -1
- package/dist/cjs/loadDictionaries/getIntlayerBundle.cjs.map +1 -1
- package/dist/cjs/loadDictionaries/index.cjs +14 -1
- package/dist/cjs/loadDictionaries/loadContentDeclaration.cjs +93 -2
- package/dist/cjs/loadDictionaries/loadContentDeclaration.cjs.map +1 -1
- package/dist/cjs/loadDictionaries/loadDictionaries.cjs +127 -1
- package/dist/cjs/loadDictionaries/loadDictionaries.cjs.map +1 -1
- package/dist/cjs/loadDictionaries/loadLocalDictionaries.cjs +27 -1
- package/dist/cjs/loadDictionaries/loadLocalDictionaries.cjs.map +1 -1
- package/dist/cjs/loadDictionaries/loadRemoteDictionaries.cjs +61 -1
- package/dist/cjs/loadDictionaries/loadRemoteDictionaries.cjs.map +1 -1
- package/dist/cjs/loadDictionaries/log.cjs +138 -3
- package/dist/cjs/loadDictionaries/log.cjs.map +1 -1
- package/dist/cjs/loadDictionaries/logTypeScriptErrors.cjs +63 -2
- package/dist/cjs/loadDictionaries/logTypeScriptErrors.cjs.map +1 -1
- package/dist/cjs/logConfigDetails.cjs +39 -2
- package/dist/cjs/logConfigDetails.cjs.map +1 -1
- package/dist/cjs/prepareIntlayer.cjs +103 -1
- package/dist/cjs/prepareIntlayer.cjs.map +1 -1
- package/dist/cjs/reduceDictionaryContent/applyMask.cjs +30 -1
- package/dist/cjs/reduceDictionaryContent/applyMask.cjs.map +1 -1
- package/dist/cjs/reduceDictionaryContent/reduceDictionaryContent.cjs +12 -1
- package/dist/cjs/reduceDictionaryContent/reduceDictionaryContent.cjs.map +1 -1
- package/dist/cjs/utils/autoDecorateContent.cjs +89 -1
- package/dist/cjs/utils/autoDecorateContent.cjs.map +1 -1
- package/dist/cjs/utils/buildComponentFilesList.cjs +67 -1
- package/dist/cjs/utils/buildComponentFilesList.cjs.map +1 -1
- package/dist/cjs/utils/buildFilesList.cjs +83 -1
- package/dist/cjs/utils/buildFilesList.cjs.map +1 -1
- package/dist/cjs/utils/chunkJSON.cjs +336 -1
- package/dist/cjs/utils/chunkJSON.cjs.map +1 -1
- package/dist/cjs/utils/formatter.cjs +18 -1
- package/dist/cjs/utils/formatter.cjs.map +1 -1
- package/dist/cjs/utils/getChunk.cjs +34 -1
- package/dist/cjs/utils/getChunk.cjs.map +1 -1
- package/dist/cjs/utils/getContentExtension.cjs +29 -1
- package/dist/cjs/utils/getContentExtension.cjs.map +1 -1
- package/dist/cjs/utils/getFormatFromExtension.cjs +34 -1
- package/dist/cjs/utils/getFormatFromExtension.cjs.map +1 -1
- package/dist/cjs/utils/getPathHash.cjs +10 -1
- package/dist/cjs/utils/getPathHash.cjs.map +1 -1
- package/dist/cjs/utils/index.cjs +49 -1
- package/dist/cjs/utils/mergeChunks.cjs +28 -1
- package/dist/cjs/utils/mergeChunks.cjs.map +1 -1
- package/dist/cjs/utils/pLimit.cjs +128 -1
- package/dist/cjs/utils/pLimit.cjs.map +1 -1
- package/dist/cjs/utils/parallelize.cjs +11 -1
- package/dist/cjs/utils/parallelize.cjs.map +1 -1
- package/dist/cjs/utils/parallelizeGlobal.cjs +29 -1
- package/dist/cjs/utils/parallelizeGlobal.cjs.map +1 -1
- package/dist/cjs/utils/reduceObjectFormat.cjs +31 -1
- package/dist/cjs/utils/reduceObjectFormat.cjs.map +1 -1
- package/dist/cjs/utils/resolveObjectPromises.cjs +21 -1
- package/dist/cjs/utils/resolveObjectPromises.cjs.map +1 -1
- package/dist/cjs/utils/resolveRelativePath.cjs +21 -1
- package/dist/cjs/utils/resolveRelativePath.cjs.map +1 -1
- package/dist/cjs/utils/runOnce.cjs +95 -1
- package/dist/cjs/utils/runOnce.cjs.map +1 -1
- package/dist/cjs/utils/runParallel/bin.cjs +54 -1
- package/dist/cjs/utils/runParallel/bin.cjs.map +1 -1
- package/dist/cjs/utils/runParallel/bootstrap.cjs +24 -1
- package/dist/cjs/utils/runParallel/bootstrap.cjs.map +1 -1
- package/dist/cjs/utils/runParallel/index.cjs +115 -1
- package/dist/cjs/utils/runParallel/index.cjs.map +1 -1
- package/dist/cjs/utils/runParallel/pidTree.cjs +145 -1
- package/dist/cjs/utils/runParallel/pidTree.cjs.map +1 -1
- package/dist/cjs/utils/runParallel/ps.cjs +49 -1
- package/dist/cjs/utils/runParallel/ps.cjs.map +1 -1
- package/dist/cjs/utils/runParallel/runTask.cjs +154 -1
- package/dist/cjs/utils/runParallel/runTask.cjs.map +1 -1
- package/dist/cjs/utils/runParallel/spawnPosix.cjs +59 -1
- package/dist/cjs/utils/runParallel/spawnPosix.cjs.map +1 -1
- package/dist/cjs/utils/runParallel/spawnWin32.cjs +43 -1
- package/dist/cjs/utils/runParallel/spawnWin32.cjs.map +1 -1
- package/dist/cjs/utils/runParallel/wmic.cjs +52 -1
- package/dist/cjs/utils/runParallel/wmic.cjs.map +1 -1
- package/dist/cjs/utils/sortAlphabetically.cjs +7 -1
- package/dist/cjs/utils/sortAlphabetically.cjs.map +1 -1
- package/dist/cjs/utils/splitTextByLine.cjs +11 -1
- package/dist/cjs/utils/splitTextByLine.cjs.map +1 -1
- package/dist/cjs/utils/verifyIdenticObjectFormat.cjs +60 -1
- package/dist/cjs/utils/verifyIdenticObjectFormat.cjs.map +1 -1
- package/dist/cjs/watcher.cjs +120 -1
- package/dist/cjs/watcher.cjs.map +1 -1
- package/dist/cjs/writeConfiguration/index.cjs +42 -1
- package/dist/cjs/writeConfiguration/index.cjs.map +1 -1
- package/dist/cjs/writeContentDeclaration/detectExportedComponentName.cjs +28 -1
- package/dist/cjs/writeContentDeclaration/detectExportedComponentName.cjs.map +1 -1
- package/dist/cjs/writeContentDeclaration/index.cjs +10 -1
- package/dist/cjs/writeContentDeclaration/processContentDeclarationContent.cjs +94 -1
- package/dist/cjs/writeContentDeclaration/processContentDeclarationContent.cjs.map +1 -1
- package/dist/cjs/writeContentDeclaration/transformJSFile.cjs +412 -3
- package/dist/cjs/writeContentDeclaration/transformJSFile.cjs.map +1 -1
- package/dist/cjs/writeContentDeclaration/transformJSONFile.cjs +127 -2
- package/dist/cjs/writeContentDeclaration/transformJSONFile.cjs.map +1 -1
- package/dist/cjs/writeContentDeclaration/writeContentDeclaration.cjs +148 -1
- package/dist/cjs/writeContentDeclaration/writeContentDeclaration.cjs.map +1 -1
- package/dist/cjs/writeContentDeclaration/writeJSFile.cjs +92 -1
- package/dist/cjs/writeContentDeclaration/writeJSFile.cjs.map +1 -1
- package/dist/cjs/writeFileIfChanged.cjs +50 -1
- package/dist/cjs/writeFileIfChanged.cjs.map +1 -1
- package/dist/cjs/writeJsonIfChanged.cjs +17 -1
- package/dist/cjs/writeJsonIfChanged.cjs.map +1 -1
- package/dist/esm/_virtual/_rolldown/runtime.mjs +8 -0
- package/dist/esm/_virtual/_utils_asset.mjs +97 -0
- package/dist/esm/build.mjs +25 -1
- package/dist/esm/buildIntlayerDictionary/buildIntlayerDictionary.mjs +60 -1
- package/dist/esm/buildIntlayerDictionary/buildIntlayerDictionary.mjs.map +1 -1
- package/dist/esm/buildIntlayerDictionary/index.mjs +4 -1
- package/dist/esm/buildIntlayerDictionary/processContentDeclaration.mjs +24 -1
- package/dist/esm/buildIntlayerDictionary/processContentDeclaration.mjs.map +1 -1
- package/dist/esm/buildIntlayerDictionary/writeDynamicDictionary.mjs +102 -4
- package/dist/esm/buildIntlayerDictionary/writeDynamicDictionary.mjs.map +1 -1
- package/dist/esm/buildIntlayerDictionary/writeFetchDictionary.mjs +77 -5
- package/dist/esm/buildIntlayerDictionary/writeFetchDictionary.mjs.map +1 -1
- package/dist/esm/buildIntlayerDictionary/writeMergedDictionary.mjs +44 -1
- package/dist/esm/buildIntlayerDictionary/writeMergedDictionary.mjs.map +1 -1
- package/dist/esm/buildIntlayerDictionary/writeRemoteDictionary.mjs +48 -1
- package/dist/esm/buildIntlayerDictionary/writeRemoteDictionary.mjs.map +1 -1
- package/dist/esm/buildIntlayerDictionary/writeUnmergedDictionary.mjs +56 -1
- package/dist/esm/buildIntlayerDictionary/writeUnmergedDictionary.mjs.map +1 -1
- package/dist/esm/cleanOutputDir.mjs +28 -1
- package/dist/esm/cleanOutputDir.mjs.map +1 -1
- package/dist/esm/cleanRemovedContentDeclaration.mjs +94 -1
- package/dist/esm/cleanRemovedContentDeclaration.mjs.map +1 -1
- package/dist/esm/cli.mjs +15 -1
- package/dist/esm/createDictionaryEntryPoint/createDictionaryEntryPoint.mjs +68 -1
- package/dist/esm/createDictionaryEntryPoint/createDictionaryEntryPoint.mjs.map +1 -1
- package/dist/esm/createDictionaryEntryPoint/generateDictionaryListContent.mjs +40 -7
- package/dist/esm/createDictionaryEntryPoint/generateDictionaryListContent.mjs.map +1 -1
- package/dist/esm/createDictionaryEntryPoint/getBuiltDictionariesPath.mjs +20 -1
- package/dist/esm/createDictionaryEntryPoint/getBuiltDictionariesPath.mjs.map +1 -1
- package/dist/esm/createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.mjs +21 -1
- package/dist/esm/createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.mjs.map +1 -1
- package/dist/esm/createDictionaryEntryPoint/getBuiltFetchDictionariesPath.mjs +21 -1
- package/dist/esm/createDictionaryEntryPoint/getBuiltFetchDictionariesPath.mjs.map +1 -1
- package/dist/esm/createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.mjs +20 -1
- package/dist/esm/createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.mjs.map +1 -1
- package/dist/esm/createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.mjs +20 -1
- package/dist/esm/createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.mjs.map +1 -1
- package/dist/esm/createDictionaryEntryPoint/index.mjs +9 -1
- package/dist/esm/createType/createModuleAugmentation.mjs +108 -9
- package/dist/esm/createType/createModuleAugmentation.mjs.map +1 -1
- package/dist/esm/createType/createType.mjs +26 -1
- package/dist/esm/createType/createType.mjs.map +1 -1
- package/dist/esm/createType/index.mjs +4 -1
- package/dist/esm/detectFormatCommand.mjs +30 -1
- package/dist/esm/detectFormatCommand.mjs.map +1 -1
- package/dist/esm/fetchDistantDictionaries.mjs +49 -1
- package/dist/esm/fetchDistantDictionaries.mjs.map +1 -1
- package/dist/esm/filterInvalidDictionaries.mjs +48 -1
- package/dist/esm/filterInvalidDictionaries.mjs.map +1 -1
- package/dist/esm/formatDictionary.mjs +44 -1
- package/dist/esm/formatDictionary.mjs.map +1 -1
- package/dist/esm/getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs +59 -7
- package/dist/esm/getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.mjs.map +1 -1
- package/dist/esm/getContentDeclarationFileTemplate/index.mjs +3 -1
- package/dist/esm/handleAdditionalContentDeclarationFile.mjs +32 -1
- package/dist/esm/handleAdditionalContentDeclarationFile.mjs.map +1 -1
- package/dist/esm/handleContentDeclarationFileChange.mjs +47 -1
- package/dist/esm/handleContentDeclarationFileChange.mjs.map +1 -1
- package/dist/esm/handleContentDeclarationFileMoved.mjs +22 -1
- package/dist/esm/handleContentDeclarationFileMoved.mjs.map +1 -1
- package/dist/esm/handleUnlinkedContentDeclarationFile.mjs +35 -1
- package/dist/esm/handleUnlinkedContentDeclarationFile.mjs.map +1 -1
- package/dist/esm/init/index.mjs +281 -1
- package/dist/esm/init/index.mjs.map +1 -1
- package/dist/esm/init/utils/configManipulation.mjs +108 -1
- package/dist/esm/init/utils/configManipulation.mjs.map +1 -1
- package/dist/esm/init/utils/fileSystem.mjs +34 -1
- package/dist/esm/init/utils/fileSystem.mjs.map +1 -1
- package/dist/esm/init/utils/index.mjs +6 -1
- package/dist/esm/init/utils/jsonParser.mjs +40 -3
- package/dist/esm/init/utils/jsonParser.mjs.map +1 -1
- package/dist/esm/init/utils/tsConfig.mjs +16 -1
- package/dist/esm/init/utils/tsConfig.mjs.map +1 -1
- package/dist/esm/initConfig/index.mjs +37 -1
- package/dist/esm/initConfig/index.mjs.map +1 -1
- package/dist/esm/installMCP/installMCP.mjs +46 -1
- package/dist/esm/installMCP/installMCP.mjs.map +1 -1
- package/dist/esm/installSkills/index.mjs +295 -1
- package/dist/esm/installSkills/index.mjs.map +1 -1
- package/dist/esm/listDictionariesPath.mjs +38 -1
- package/dist/esm/listDictionariesPath.mjs.map +1 -1
- package/dist/esm/listGitFiles.mjs +100 -5
- package/dist/esm/listGitFiles.mjs.map +1 -1
- package/dist/esm/listProjects.mjs +43 -1
- package/dist/esm/listProjects.mjs.map +1 -1
- package/dist/esm/loadDictionaries/getIntlayerBundle.mjs +67 -1
- package/dist/esm/loadDictionaries/getIntlayerBundle.mjs.map +1 -1
- package/dist/esm/loadDictionaries/index.mjs +6 -1
- package/dist/esm/loadDictionaries/loadContentDeclaration.mjs +88 -2
- package/dist/esm/loadDictionaries/loadContentDeclaration.mjs.map +1 -1
- package/dist/esm/loadDictionaries/loadDictionaries.mjs +124 -1
- package/dist/esm/loadDictionaries/loadDictionaries.mjs.map +1 -1
- package/dist/esm/loadDictionaries/loadLocalDictionaries.mjs +25 -1
- package/dist/esm/loadDictionaries/loadLocalDictionaries.mjs.map +1 -1
- package/dist/esm/loadDictionaries/loadRemoteDictionaries.mjs +58 -1
- package/dist/esm/loadDictionaries/loadRemoteDictionaries.mjs.map +1 -1
- package/dist/esm/loadDictionaries/log.mjs +134 -3
- package/dist/esm/loadDictionaries/log.mjs.map +1 -1
- package/dist/esm/loadDictionaries/logTypeScriptErrors.mjs +61 -2
- package/dist/esm/loadDictionaries/logTypeScriptErrors.mjs.map +1 -1
- package/dist/esm/logConfigDetails.mjs +36 -2
- package/dist/esm/logConfigDetails.mjs.map +1 -1
- package/dist/esm/prepareIntlayer.mjs +99 -1
- package/dist/esm/prepareIntlayer.mjs.map +1 -1
- package/dist/esm/reduceDictionaryContent/applyMask.mjs +28 -1
- package/dist/esm/reduceDictionaryContent/applyMask.mjs.map +1 -1
- package/dist/esm/reduceDictionaryContent/reduceDictionaryContent.mjs +10 -1
- package/dist/esm/reduceDictionaryContent/reduceDictionaryContent.mjs.map +1 -1
- package/dist/esm/utils/autoDecorateContent.mjs +86 -1
- package/dist/esm/utils/autoDecorateContent.mjs.map +1 -1
- package/dist/esm/utils/buildComponentFilesList.mjs +64 -1
- package/dist/esm/utils/buildComponentFilesList.mjs.map +1 -1
- package/dist/esm/utils/buildFilesList.mjs +79 -1
- package/dist/esm/utils/buildFilesList.mjs.map +1 -1
- package/dist/esm/utils/chunkJSON.mjs +333 -1
- package/dist/esm/utils/chunkJSON.mjs.map +1 -1
- package/dist/esm/utils/formatter.mjs +13 -1
- package/dist/esm/utils/formatter.mjs.map +1 -1
- package/dist/esm/utils/getChunk.mjs +33 -1
- package/dist/esm/utils/getChunk.mjs.map +1 -1
- package/dist/esm/utils/getContentExtension.mjs +27 -1
- package/dist/esm/utils/getContentExtension.mjs.map +1 -1
- package/dist/esm/utils/getFormatFromExtension.mjs +31 -1
- package/dist/esm/utils/getFormatFromExtension.mjs.map +1 -1
- package/dist/esm/utils/getPathHash.mjs +7 -1
- package/dist/esm/utils/getPathHash.mjs.map +1 -1
- package/dist/esm/utils/index.mjs +22 -1
- package/dist/esm/utils/mergeChunks.mjs +26 -1
- package/dist/esm/utils/mergeChunks.mjs.map +1 -1
- package/dist/esm/utils/pLimit.mjs +125 -1
- package/dist/esm/utils/pLimit.mjs.map +1 -1
- package/dist/esm/utils/parallelize.mjs +10 -1
- package/dist/esm/utils/parallelize.mjs.map +1 -1
- package/dist/esm/utils/parallelizeGlobal.mjs +26 -1
- package/dist/esm/utils/parallelizeGlobal.mjs.map +1 -1
- package/dist/esm/utils/reduceObjectFormat.mjs +29 -1
- package/dist/esm/utils/reduceObjectFormat.mjs.map +1 -1
- package/dist/esm/utils/resolveObjectPromises.mjs +19 -1
- package/dist/esm/utils/resolveObjectPromises.mjs.map +1 -1
- package/dist/esm/utils/resolveRelativePath.mjs +19 -1
- package/dist/esm/utils/resolveRelativePath.mjs.map +1 -1
- package/dist/esm/utils/runOnce.mjs +92 -1
- package/dist/esm/utils/runOnce.mjs.map +1 -1
- package/dist/esm/utils/runParallel/bin.mjs +52 -1
- package/dist/esm/utils/runParallel/bin.mjs.map +1 -1
- package/dist/esm/utils/runParallel/bootstrap.mjs +22 -1
- package/dist/esm/utils/runParallel/bootstrap.mjs.map +1 -1
- package/dist/esm/utils/runParallel/index.mjs +113 -1
- package/dist/esm/utils/runParallel/index.mjs.map +1 -1
- package/dist/esm/utils/runParallel/pidTree.mjs +142 -1
- package/dist/esm/utils/runParallel/pidTree.mjs.map +1 -1
- package/dist/esm/utils/runParallel/ps.mjs +46 -1
- package/dist/esm/utils/runParallel/ps.mjs.map +1 -1
- package/dist/esm/utils/runParallel/runTask.mjs +152 -1
- package/dist/esm/utils/runParallel/runTask.mjs.map +1 -1
- package/dist/esm/utils/runParallel/spawnPosix.mjs +57 -1
- package/dist/esm/utils/runParallel/spawnPosix.mjs.map +1 -1
- package/dist/esm/utils/runParallel/spawnWin32.mjs +41 -1
- package/dist/esm/utils/runParallel/spawnWin32.mjs.map +1 -1
- package/dist/esm/utils/runParallel/wmic.mjs +49 -1
- package/dist/esm/utils/runParallel/wmic.mjs.map +1 -1
- package/dist/esm/utils/sortAlphabetically.mjs +5 -1
- package/dist/esm/utils/sortAlphabetically.mjs.map +1 -1
- package/dist/esm/utils/splitTextByLine.mjs +9 -1
- package/dist/esm/utils/splitTextByLine.mjs.map +1 -1
- package/dist/esm/utils/verifyIdenticObjectFormat.mjs +58 -1
- package/dist/esm/utils/verifyIdenticObjectFormat.mjs.map +1 -1
- package/dist/esm/watcher.mjs +117 -1
- package/dist/esm/watcher.mjs.map +1 -1
- package/dist/esm/writeConfiguration/index.mjs +39 -1
- package/dist/esm/writeConfiguration/index.mjs.map +1 -1
- package/dist/esm/writeContentDeclaration/detectExportedComponentName.mjs +26 -1
- package/dist/esm/writeContentDeclaration/detectExportedComponentName.mjs.map +1 -1
- package/dist/esm/writeContentDeclaration/index.mjs +6 -1
- package/dist/esm/writeContentDeclaration/processContentDeclarationContent.mjs +91 -1
- package/dist/esm/writeContentDeclaration/processContentDeclarationContent.mjs.map +1 -1
- package/dist/esm/writeContentDeclaration/transformJSFile.mjs +407 -3
- package/dist/esm/writeContentDeclaration/transformJSFile.mjs.map +1 -1
- package/dist/esm/writeContentDeclaration/transformJSONFile.mjs +124 -2
- package/dist/esm/writeContentDeclaration/transformJSONFile.mjs.map +1 -1
- package/dist/esm/writeContentDeclaration/writeContentDeclaration.mjs +146 -1
- package/dist/esm/writeContentDeclaration/writeContentDeclaration.mjs.map +1 -1
- package/dist/esm/writeContentDeclaration/writeJSFile.mjs +90 -1
- package/dist/esm/writeContentDeclaration/writeJSFile.mjs.map +1 -1
- package/dist/esm/writeFileIfChanged.mjs +48 -1
- package/dist/esm/writeFileIfChanged.mjs.map +1 -1
- package/dist/esm/writeJsonIfChanged.mjs +16 -1
- package/dist/esm/writeJsonIfChanged.mjs.map +1 -1
- package/dist/types/build.d.ts +20 -20
- package/dist/types/buildIntlayerDictionary/buildIntlayerDictionary.d.ts +25 -2
- package/dist/types/buildIntlayerDictionary/buildIntlayerDictionary.d.ts.map +1 -0
- package/dist/types/buildIntlayerDictionary/index.d.ts +2 -2
- package/dist/types/buildIntlayerDictionary/processContentDeclaration.d.ts +11 -2
- package/dist/types/buildIntlayerDictionary/processContentDeclaration.d.ts.map +1 -0
- package/dist/types/buildIntlayerDictionary/writeDynamicDictionary.d.ts +49 -2
- package/dist/types/buildIntlayerDictionary/writeDynamicDictionary.d.ts.map +1 -0
- package/dist/types/buildIntlayerDictionary/writeFetchDictionary.d.ts +7 -7
- package/dist/types/buildIntlayerDictionary/writeFetchDictionary.d.ts.map +1 -1
- package/dist/types/buildIntlayerDictionary/writeMergedDictionary.d.ts +30 -2
- package/dist/types/buildIntlayerDictionary/writeMergedDictionary.d.ts.map +1 -0
- package/dist/types/buildIntlayerDictionary/writeUnmergedDictionary.d.ts +34 -2
- package/dist/types/buildIntlayerDictionary/writeUnmergedDictionary.d.ts.map +1 -0
- package/dist/types/cli.d.ts +6 -6
- package/dist/types/createDictionaryEntryPoint/createDictionaryEntryPoint.d.ts +14 -2
- package/dist/types/createDictionaryEntryPoint/createDictionaryEntryPoint.d.ts.map +1 -0
- package/dist/types/createDictionaryEntryPoint/generateDictionaryListContent.d.ts +10 -2
- package/dist/types/createDictionaryEntryPoint/generateDictionaryListContent.d.ts.map +1 -0
- package/dist/types/createDictionaryEntryPoint/getBuiltDictionariesPath.d.ts +10 -2
- package/dist/types/createDictionaryEntryPoint/getBuiltDictionariesPath.d.ts.map +1 -0
- package/dist/types/createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.d.ts +10 -2
- package/dist/types/createDictionaryEntryPoint/getBuiltDynamicDictionariesPath.d.ts.map +1 -0
- package/dist/types/createDictionaryEntryPoint/getBuiltFetchDictionariesPath.d.ts +10 -2
- package/dist/types/createDictionaryEntryPoint/getBuiltFetchDictionariesPath.d.ts.map +1 -0
- package/dist/types/createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.d.ts +10 -2
- package/dist/types/createDictionaryEntryPoint/getBuiltRemoteDictionariesPath.d.ts.map +1 -0
- package/dist/types/createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.d.ts +10 -2
- package/dist/types/createDictionaryEntryPoint/getBuiltUnmergedDictionariesPath.d.ts.map +1 -0
- package/dist/types/createDictionaryEntryPoint/index.d.ts +7 -7
- package/dist/types/createType/createModuleAugmentation.d.ts +9 -2
- package/dist/types/createType/createModuleAugmentation.d.ts.map +1 -0
- package/dist/types/createType/createType.d.ts +12 -2
- package/dist/types/createType/createType.d.ts.map +1 -0
- package/dist/types/createType/index.d.ts +2 -2
- package/dist/types/fetchDistantDictionaries.d.ts +1 -1
- package/dist/types/fetchDistantDictionaries.d.ts.map +1 -1
- package/dist/types/getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.d.ts +7 -2
- package/dist/types/getContentDeclarationFileTemplate/getContentDeclarationFileTemplate.d.ts.map +1 -0
- package/dist/types/getContentDeclarationFileTemplate/index.d.ts +1 -1
- package/dist/types/loadDictionaries/index.d.ts +4 -4
- package/dist/types/loadDictionaries/loadContentDeclaration.d.ts +12 -2
- package/dist/types/loadDictionaries/loadContentDeclaration.d.ts.map +1 -0
- package/dist/types/loadDictionaries/loadDictionaries.d.ts +23 -2
- package/dist/types/loadDictionaries/loadDictionaries.d.ts.map +1 -0
- package/dist/types/loadDictionaries/loadLocalDictionaries.d.ts +8 -2
- package/dist/types/loadDictionaries/loadLocalDictionaries.d.ts.map +1 -0
- package/dist/types/loadDictionaries/loadRemoteDictionaries.d.ts +15 -2
- package/dist/types/loadDictionaries/loadRemoteDictionaries.d.ts.map +1 -0
- package/dist/types/loadDictionaries/log.d.ts +1 -1
- package/dist/types/utils/getFormatFromExtension.d.ts +8 -2
- package/dist/types/utils/getFormatFromExtension.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +1 -1
- package/dist/types/writeConfiguration/index.d.ts.map +1 -1
- package/dist/types/writeContentDeclaration/detectExportedComponentName.d.ts +12 -2
- package/dist/types/writeContentDeclaration/detectExportedComponentName.d.ts.map +1 -0
- package/dist/types/writeContentDeclaration/dictionaryStatus.d.ts +5 -2
- package/dist/types/writeContentDeclaration/dictionaryStatus.d.ts.map +1 -0
- package/dist/types/writeContentDeclaration/index.d.ts +5 -5
- package/dist/types/writeContentDeclaration/processContentDeclarationContent.d.ts.map +1 -1
- package/dist/types/writeContentDeclaration/transformJSFile.d.ts +11 -2
- package/dist/types/writeContentDeclaration/transformJSFile.d.ts.map +1 -0
- package/dist/types/writeContentDeclaration/writeContentDeclaration.d.ts +19 -2
- package/dist/types/writeContentDeclaration/writeContentDeclaration.d.ts.map +1 -0
- package/dist/types/writeContentDeclaration/writeJSFile.d.ts +14 -2
- package/dist/types/writeContentDeclaration/writeJSFile.d.ts.map +1 -0
- package/package.json +8 -8
- package/dist/cjs/_utils_asset-SJVy1xMD.cjs +0 -2
- package/dist/cjs/chunk-Bmb41Sf3.cjs +0 -1
- package/dist/esm/_utils_asset-4w8dPH9r.mjs +0 -2
- package/dist/esm/chunk-DDgYwkfe.mjs +0 -1
- package/dist/types/buildIntlayerDictionary-_xrGjSmw.d.ts +0 -25
- package/dist/types/buildIntlayerDictionary-_xrGjSmw.d.ts.map +0 -1
- package/dist/types/createDictionaryEntryPoint-Bc5lHSiY.d.ts +0 -14
- package/dist/types/createDictionaryEntryPoint-Bc5lHSiY.d.ts.map +0 -1
- package/dist/types/createModuleAugmentation-D1eIVnjg.d.ts +0 -9
- package/dist/types/createModuleAugmentation-D1eIVnjg.d.ts.map +0 -1
- package/dist/types/createType--rDwdg2t.d.ts +0 -12
- package/dist/types/createType--rDwdg2t.d.ts.map +0 -1
- package/dist/types/detectExportedComponentName-DVXsp_FG.d.ts +0 -12
- package/dist/types/detectExportedComponentName-DVXsp_FG.d.ts.map +0 -1
- package/dist/types/dictionaryStatus-DPVO37qe.d.ts +0 -5
- package/dist/types/dictionaryStatus-DPVO37qe.d.ts.map +0 -1
- package/dist/types/generateDictionaryListContent-DAtHG6SR.d.ts +0 -10
- package/dist/types/generateDictionaryListContent-DAtHG6SR.d.ts.map +0 -1
- package/dist/types/getBuiltDictionariesPath-C4it65a1.d.ts +0 -10
- package/dist/types/getBuiltDictionariesPath-C4it65a1.d.ts.map +0 -1
- package/dist/types/getBuiltDynamicDictionariesPath-Cj9EWnjT.d.ts +0 -10
- package/dist/types/getBuiltDynamicDictionariesPath-Cj9EWnjT.d.ts.map +0 -1
- package/dist/types/getBuiltFetchDictionariesPath-1JleRhT3.d.ts +0 -10
- package/dist/types/getBuiltFetchDictionariesPath-1JleRhT3.d.ts.map +0 -1
- package/dist/types/getBuiltRemoteDictionariesPath-DHOmqNCr.d.ts +0 -10
- package/dist/types/getBuiltRemoteDictionariesPath-DHOmqNCr.d.ts.map +0 -1
- package/dist/types/getBuiltUnmergedDictionariesPath-GUmmLxTB.d.ts +0 -10
- package/dist/types/getBuiltUnmergedDictionariesPath-GUmmLxTB.d.ts.map +0 -1
- package/dist/types/getContentDeclarationFileTemplate-Dz3rnFy9.d.ts +0 -7
- package/dist/types/getContentDeclarationFileTemplate-Dz3rnFy9.d.ts.map +0 -1
- package/dist/types/getFormatFromExtension-SdXYWfPx.d.ts +0 -8
- package/dist/types/getFormatFromExtension-SdXYWfPx.d.ts.map +0 -1
- package/dist/types/loadContentDeclaration-CBMS4vkA.d.ts +0 -12
- package/dist/types/loadContentDeclaration-CBMS4vkA.d.ts.map +0 -1
- package/dist/types/loadDictionaries-BIqHwtYE.d.ts +0 -23
- package/dist/types/loadDictionaries-BIqHwtYE.d.ts.map +0 -1
- package/dist/types/loadLocalDictionaries-CNmVaw0c.d.ts +0 -8
- package/dist/types/loadLocalDictionaries-CNmVaw0c.d.ts.map +0 -1
- package/dist/types/loadRemoteDictionaries-MoITTb7W.d.ts +0 -15
- package/dist/types/loadRemoteDictionaries-MoITTb7W.d.ts.map +0 -1
- package/dist/types/processContentDeclaration-CAvrHaIT.d.ts +0 -11
- package/dist/types/processContentDeclaration-CAvrHaIT.d.ts.map +0 -1
- package/dist/types/transformJSFile-Cg0LkeLb.d.ts +0 -11
- package/dist/types/transformJSFile-Cg0LkeLb.d.ts.map +0 -1
- package/dist/types/writeContentDeclaration-XdGxj0KP.d.ts +0 -19
- package/dist/types/writeContentDeclaration-XdGxj0KP.d.ts.map +0 -1
- package/dist/types/writeDynamicDictionary-DO8f3FYl.d.ts +0 -48
- package/dist/types/writeDynamicDictionary-DO8f3FYl.d.ts.map +0 -1
- package/dist/types/writeJSFile-kK95jzg_.d.ts +0 -14
- package/dist/types/writeJSFile-kK95jzg_.d.ts.map +0 -1
- package/dist/types/writeMergedDictionary-CMeghcRI.d.ts +0 -30
- package/dist/types/writeMergedDictionary-CMeghcRI.d.ts.map +0 -1
- package/dist/types/writeUnmergedDictionary-Cxx51isz.d.ts +0 -34
- package/dist/types/writeUnmergedDictionary-Cxx51isz.d.ts.map +0 -1
|
@@ -1,4 +1,408 @@
|
|
|
1
|
-
import{getNodeType
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { getNodeType } from "@intlayer/core/dictionaryManipulator";
|
|
2
|
+
import * as NodeTypes from "@intlayer/types/nodeType";
|
|
3
|
+
import * as recast from "recast";
|
|
4
|
+
import * as babelTsParser from "recast/parsers/babel-ts.js";
|
|
5
|
+
|
|
6
|
+
//#region src/writeContentDeclaration/transformJSFile.ts
|
|
7
|
+
const b = recast.types.builders;
|
|
8
|
+
const n = recast.types.namedTypes;
|
|
9
|
+
/**
|
|
10
|
+
* Unwraps TypeScript/Babel expression wrappers (satisfies, as, !, <Type>).
|
|
11
|
+
* Uses string fallbacks to bypass outdated ast-types definitions.
|
|
12
|
+
*/
|
|
13
|
+
const unwrap = (node) => {
|
|
14
|
+
while (node && (n.TSSatisfiesExpression?.check(node) || n.TSAsExpression?.check(node) || n.TSTypeAssertion?.check(node) || n.TSNonNullExpression?.check(node) || [
|
|
15
|
+
"TSSatisfiesExpression",
|
|
16
|
+
"TSAsExpression",
|
|
17
|
+
"TSTypeAssertion",
|
|
18
|
+
"TSNonNullExpression"
|
|
19
|
+
].includes(node.type))) node = node.expression;
|
|
20
|
+
return node;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Robustly finds a property in a recast ObjectExpression.
|
|
24
|
+
* Handles quoted ("key") or unquoted (key) properties.
|
|
25
|
+
*/
|
|
26
|
+
const getMatchingProperty = (node, key) => {
|
|
27
|
+
return node.properties.find((prop) => {
|
|
28
|
+
if (n.Property.check(prop) || n.ObjectProperty.check(prop)) {
|
|
29
|
+
if (n.Identifier.check(prop.key) && prop.key.name === key) return true;
|
|
30
|
+
if (n.StringLiteral.check(prop.key) && prop.key.value === key) return true;
|
|
31
|
+
if (n.Literal.check(prop.key) && prop.key.value === key) return true;
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Synchronizes numeric suffixes across locales.
|
|
38
|
+
* E.g. "Hello 1" -> "Hello 3" updates "Bonjour 1" to "Bonjour 3".
|
|
39
|
+
*/
|
|
40
|
+
const syncNumericSuffixAcrossLocales = (existingNode, fallbackLocaleCode, newFallbackValue) => {
|
|
41
|
+
const trailingNumberMatch = newFallbackValue.match(/\d+(?!.*\d)/);
|
|
42
|
+
if (!trailingNumberMatch) return;
|
|
43
|
+
const newTrailingNumber = trailingNumberMatch[0];
|
|
44
|
+
if (n.ObjectExpression.check(existingNode)) {
|
|
45
|
+
for (const prop of existingNode.properties) if (n.Property.check(prop) || n.ObjectProperty.check(prop)) {
|
|
46
|
+
let propName = "";
|
|
47
|
+
if (n.Identifier.check(prop.key)) propName = prop.key.name;
|
|
48
|
+
else if (n.Literal.check(prop.key) && typeof prop.key.value === "string") propName = prop.key.value;
|
|
49
|
+
else if (n.StringLiteral.check(prop.key)) propName = prop.key.value;
|
|
50
|
+
if (propName && propName !== fallbackLocaleCode) {
|
|
51
|
+
if (n.Literal.check(prop.value) && typeof prop.value.value === "string") {
|
|
52
|
+
const currentValue = prop.value.value;
|
|
53
|
+
if (currentValue.match(/\d+(?!.*\d)/)) prop.value = b.literal(currentValue.replace(/(\d+)(?!.*\d)/, newTrailingNumber));
|
|
54
|
+
} else if (n.StringLiteral.check(prop.value)) {
|
|
55
|
+
const currentValue = prop.value.value;
|
|
56
|
+
if (currentValue.match(/\d+(?!.*\d)/)) prop.value = b.stringLiteral(currentValue.replace(/(\d+)(?!.*\d)/, newTrailingNumber));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Checks if a value represents a multilingual Intlayer node.
|
|
64
|
+
* A node is multilingual if it is a Translation node, or if it is a specialized node
|
|
65
|
+
* (Markdown, HTML, etc.) that contains a Translation node.
|
|
66
|
+
*/
|
|
67
|
+
const isMultilingualNode = (val) => {
|
|
68
|
+
if (typeof val !== "object" || val === null || Array.isArray(val)) return false;
|
|
69
|
+
const nodeType = getNodeType(val);
|
|
70
|
+
if (nodeType === NodeTypes.TRANSLATION) return true;
|
|
71
|
+
if (nodeType === NodeTypes.MARKDOWN || nodeType === NodeTypes.HTML || nodeType === NodeTypes.INSERTION) return isMultilingualNode(val[nodeType]);
|
|
72
|
+
if (nodeType === NodeTypes.ENUMERATION || nodeType === NodeTypes.CONDITION || nodeType === NodeTypes.GENDER) {
|
|
73
|
+
const data = val[nodeType];
|
|
74
|
+
if (data && typeof data === "object") return Object.values(data).some((v) => isMultilingualNode(v));
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Recursively builds or updates an AST node for a given dictionary value.
|
|
80
|
+
*/
|
|
81
|
+
const buildNodeForValue = (val, existingNode, fallbackLocale, requiredImports) => {
|
|
82
|
+
const unwrappedExisting = unwrap(existingNode);
|
|
83
|
+
if (unwrappedExisting) {
|
|
84
|
+
if (!(n.Literal.check(unwrappedExisting) || n.StringLiteral.check(unwrappedExisting) || n.NumericLiteral.check(unwrappedExisting) || n.BooleanLiteral.check(unwrappedExisting) || n.TemplateLiteral.check(unwrappedExisting) || n.ObjectExpression.check(unwrappedExisting) || n.ArrayExpression.check(unwrappedExisting) || n.CallExpression.check(unwrappedExisting) && n.Identifier.check(unwrappedExisting.callee) && [
|
|
85
|
+
"t",
|
|
86
|
+
"enu",
|
|
87
|
+
"cond",
|
|
88
|
+
"gender",
|
|
89
|
+
"insert",
|
|
90
|
+
"md",
|
|
91
|
+
"html",
|
|
92
|
+
"file",
|
|
93
|
+
"nest"
|
|
94
|
+
].includes(unwrappedExisting.callee.name))) return existingNode;
|
|
95
|
+
}
|
|
96
|
+
if (fallbackLocale && !existingNode && !isMultilingualNode(val)) {
|
|
97
|
+
if (val === null) return b.literal(null);
|
|
98
|
+
if (typeof val === "string" || typeof val === "number" || typeof val === "boolean") {
|
|
99
|
+
if (typeof val === "string" && val.includes("\n")) return b.templateLiteral([b.templateElement({
|
|
100
|
+
raw: val,
|
|
101
|
+
cooked: val
|
|
102
|
+
}, true)], []);
|
|
103
|
+
return b.literal(val);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (fallbackLocale && existingNode && !isMultilingualNode(val)) {
|
|
107
|
+
if (n.CallExpression.check(existingNode) && n.Identifier.check(existingNode.callee) && existingNode.callee.name === "t") {
|
|
108
|
+
const arg = unwrap(existingNode.arguments[0]);
|
|
109
|
+
if (n.ObjectExpression.check(arg)) {
|
|
110
|
+
if (typeof val === "string") syncNumericSuffixAcrossLocales(arg, fallbackLocale, val);
|
|
111
|
+
updateObjectLiteral(arg, { [fallbackLocale]: val }, fallbackLocale, requiredImports);
|
|
112
|
+
if (!fallbackLocale) requiredImports.add("t");
|
|
113
|
+
return existingNode;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if ((!val || typeof val !== "object") && n.CallExpression.check(existingNode) && n.Identifier.check(existingNode.callee) && existingNode.callee.name === "md") {
|
|
117
|
+
const innerArg = existingNode.arguments[0];
|
|
118
|
+
if (n.CallExpression.check(innerArg) && n.Identifier.check(innerArg.callee) && innerArg.callee.name === "t") {
|
|
119
|
+
const tArg = unwrap(innerArg.arguments[0]);
|
|
120
|
+
if (n.ObjectExpression.check(tArg)) {
|
|
121
|
+
if (typeof val === "string") syncNumericSuffixAcrossLocales(tArg, fallbackLocale, val);
|
|
122
|
+
updateObjectLiteral(tArg, { [fallbackLocale]: val }, fallbackLocale, requiredImports);
|
|
123
|
+
requiredImports.add("md");
|
|
124
|
+
requiredImports.add("t");
|
|
125
|
+
return existingNode;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (val === null) return b.literal(null);
|
|
131
|
+
if (typeof val === "string" || typeof val === "number" || typeof val === "boolean") {
|
|
132
|
+
if (unwrappedExisting) {
|
|
133
|
+
if (n.TemplateLiteral.check(unwrappedExisting) && unwrappedExisting.expressions.length === 0) {
|
|
134
|
+
unwrappedExisting.quasis[0].value.raw = String(val);
|
|
135
|
+
unwrappedExisting.quasis[0].value.cooked = String(val);
|
|
136
|
+
return existingNode;
|
|
137
|
+
}
|
|
138
|
+
if (n.Literal.check(unwrappedExisting) || n.StringLiteral.check(unwrappedExisting)) {
|
|
139
|
+
unwrappedExisting.value = val;
|
|
140
|
+
return existingNode;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (typeof val === "string" && val.includes("\n")) return b.templateLiteral([b.templateElement({
|
|
144
|
+
raw: val,
|
|
145
|
+
cooked: val
|
|
146
|
+
}, true)], []);
|
|
147
|
+
return b.literal(val);
|
|
148
|
+
}
|
|
149
|
+
if (Array.isArray(val)) if (unwrappedExisting && n.ArrayExpression.check(unwrappedExisting)) {
|
|
150
|
+
const elements = [...unwrappedExisting.elements];
|
|
151
|
+
val.forEach((item, i) => {
|
|
152
|
+
elements[i] = buildNodeForValue(item, elements[i], fallbackLocale, requiredImports);
|
|
153
|
+
});
|
|
154
|
+
if (elements.length > val.length) elements.length = val.length;
|
|
155
|
+
unwrappedExisting.elements = elements;
|
|
156
|
+
return existingNode;
|
|
157
|
+
} else return b.arrayExpression(val.map((item) => buildNodeForValue(item, null, fallbackLocale, requiredImports)));
|
|
158
|
+
const nodeType = val && typeof val === "object" && !Array.isArray(val) ? getNodeType(val) : null;
|
|
159
|
+
if (nodeType && [
|
|
160
|
+
NodeTypes.TRANSLATION,
|
|
161
|
+
NodeTypes.ENUMERATION,
|
|
162
|
+
NodeTypes.CONDITION,
|
|
163
|
+
NodeTypes.GENDER,
|
|
164
|
+
NodeTypes.INSERTION,
|
|
165
|
+
NodeTypes.MARKDOWN,
|
|
166
|
+
NodeTypes.HTML,
|
|
167
|
+
NodeTypes.FILE,
|
|
168
|
+
NodeTypes.NESTED,
|
|
169
|
+
NodeTypes.ARRAY,
|
|
170
|
+
NodeTypes.OBJECT,
|
|
171
|
+
NodeTypes.REACT_NODE,
|
|
172
|
+
NodeTypes.NUMBER,
|
|
173
|
+
NodeTypes.BOOLEAN,
|
|
174
|
+
NodeTypes.NULL,
|
|
175
|
+
NodeTypes.UNKNOWN
|
|
176
|
+
].includes(nodeType) && nodeType !== NodeTypes.TEXT) {
|
|
177
|
+
const nodeData = val[nodeType];
|
|
178
|
+
let calleeName = "";
|
|
179
|
+
if (nodeType === NodeTypes.TRANSLATION) calleeName = "t";
|
|
180
|
+
else if (nodeType === NodeTypes.ENUMERATION) calleeName = "enu";
|
|
181
|
+
else if (nodeType === NodeTypes.CONDITION) calleeName = "cond";
|
|
182
|
+
else if (nodeType === NodeTypes.GENDER) calleeName = "gender";
|
|
183
|
+
else if (nodeType === NodeTypes.INSERTION) calleeName = "insert";
|
|
184
|
+
else if (nodeType === NodeTypes.MARKDOWN) calleeName = "md";
|
|
185
|
+
else if (nodeType === NodeTypes.HTML) calleeName = "html";
|
|
186
|
+
else if (nodeType === NodeTypes.FILE) calleeName = "file";
|
|
187
|
+
else if (nodeType === NodeTypes.NESTED) calleeName = "nest";
|
|
188
|
+
if (calleeName) requiredImports.add(calleeName);
|
|
189
|
+
const isMatchingCall = existingNode && n.CallExpression.check(existingNode) && n.Identifier.check(existingNode.callee) && existingNode.callee.name === calleeName;
|
|
190
|
+
if ([
|
|
191
|
+
"t",
|
|
192
|
+
"enu",
|
|
193
|
+
"cond",
|
|
194
|
+
"gender"
|
|
195
|
+
].includes(calleeName)) {
|
|
196
|
+
let objArg = null;
|
|
197
|
+
if (isMatchingCall && existingNode.arguments.length > 0 && n.ObjectExpression.check(existingNode.arguments[0])) objArg = existingNode.arguments[0];
|
|
198
|
+
else objArg = b.objectExpression([]);
|
|
199
|
+
updateObjectLiteral(objArg, nodeData, fallbackLocale, requiredImports);
|
|
200
|
+
return isMatchingCall ? existingNode : b.callExpression(b.identifier(calleeName), [objArg]);
|
|
201
|
+
}
|
|
202
|
+
if ([
|
|
203
|
+
"md",
|
|
204
|
+
"html",
|
|
205
|
+
"insert",
|
|
206
|
+
"file"
|
|
207
|
+
].includes(calleeName)) {
|
|
208
|
+
const argNode = buildNodeForValue(nodeData, isMatchingCall && existingNode.arguments.length > 0 ? existingNode.arguments[0] : null, fallbackLocale, requiredImports);
|
|
209
|
+
if (isMatchingCall) {
|
|
210
|
+
existingNode.arguments[0] = argNode;
|
|
211
|
+
return existingNode;
|
|
212
|
+
}
|
|
213
|
+
return b.callExpression(b.identifier(calleeName), [argNode]);
|
|
214
|
+
}
|
|
215
|
+
if (calleeName === "nest") {
|
|
216
|
+
const args = [b.literal(nodeData.dictionaryKey)];
|
|
217
|
+
if (nodeData.path) args.push(b.literal(nodeData.path));
|
|
218
|
+
if (isMatchingCall) {
|
|
219
|
+
existingNode.arguments = args;
|
|
220
|
+
return existingNode;
|
|
221
|
+
}
|
|
222
|
+
return b.callExpression(b.identifier("nest"), args);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const objNode = unwrappedExisting && n.ObjectExpression.check(unwrappedExisting) ? unwrappedExisting : b.objectExpression([]);
|
|
226
|
+
updateObjectLiteral(objNode, val, fallbackLocale, requiredImports);
|
|
227
|
+
return existingNode && unwrappedExisting === existingNode ? objNode : existingNode || objNode;
|
|
228
|
+
};
|
|
229
|
+
/**
|
|
230
|
+
* Recursively updates the AST object literal properties.
|
|
231
|
+
*/
|
|
232
|
+
const updateObjectLiteral = (node, data, fallbackLocale, requiredImports) => {
|
|
233
|
+
for (const [key, val] of Object.entries(data)) {
|
|
234
|
+
if (val === void 0) continue;
|
|
235
|
+
const existingProp = getMatchingProperty(node, key);
|
|
236
|
+
if (existingProp) existingProp.value = buildNodeForValue(val, existingProp.value, fallbackLocale, requiredImports);
|
|
237
|
+
else {
|
|
238
|
+
const keyNode = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? b.identifier(key) : b.literal(key);
|
|
239
|
+
const valueNode = buildNodeForValue(val, null, fallbackLocale, requiredImports);
|
|
240
|
+
node.properties.push(b.property("init", keyNode, valueNode));
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* Modifies the AST's top-level imports to inject dynamically needed helper utilities seamlessly.
|
|
246
|
+
*/
|
|
247
|
+
const addImports = (ast, requiredImports, isESM) => {
|
|
248
|
+
if (requiredImports.size === 0) return;
|
|
249
|
+
const existingCoreImports = /* @__PURE__ */ new Set();
|
|
250
|
+
let coreImportPath = null;
|
|
251
|
+
recast.visit(ast, {
|
|
252
|
+
visitImportDeclaration(path) {
|
|
253
|
+
if (path.node.source.value === "intlayer") {
|
|
254
|
+
coreImportPath = path;
|
|
255
|
+
path.node.specifiers?.forEach((spec) => {
|
|
256
|
+
if (n.ImportSpecifier.check(spec) && typeof spec.imported.name === "string") existingCoreImports.add(spec.imported.name);
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
return false;
|
|
260
|
+
},
|
|
261
|
+
visitVariableDeclaration(path) {
|
|
262
|
+
path.node.declarations.forEach((decl) => {
|
|
263
|
+
if (n.VariableDeclarator.check(decl) && n.CallExpression.check(decl.init) && n.Identifier.check(decl.init.callee) && decl.init.callee.name === "require") {
|
|
264
|
+
const arg = decl.init.arguments[0];
|
|
265
|
+
if (n.Literal.check(arg)) {
|
|
266
|
+
if (arg.value === "intlayer") {
|
|
267
|
+
if (n.ObjectPattern.check(decl.id)) decl.id.properties.forEach((prop) => {
|
|
268
|
+
if (n.Property.check(prop) && (n.Identifier.check(prop.key) || n.Identifier.check(prop.value))) {
|
|
269
|
+
const name = n.Identifier.check(prop.key) ? prop.key.name : prop.value.name;
|
|
270
|
+
existingCoreImports.add(name);
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
else if (n.Identifier.check(decl.id)) existingCoreImports.add(decl.id.name);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
const missingCore = Array.from(requiredImports).filter((imp) => !existingCoreImports.has(imp));
|
|
282
|
+
if (missingCore.length === 0) return;
|
|
283
|
+
if (isESM) if (coreImportPath) {
|
|
284
|
+
missingCore.forEach((imp) => {
|
|
285
|
+
coreImportPath.node.specifiers.push(b.importSpecifier(b.identifier(imp)));
|
|
286
|
+
});
|
|
287
|
+
coreImportPath.node.specifiers.sort((a, b) => a.imported.name.localeCompare(b.imported.name));
|
|
288
|
+
} else {
|
|
289
|
+
const specifiers = missingCore.sort().map((imp) => b.importSpecifier(b.identifier(imp)));
|
|
290
|
+
const newImport = b.importDeclaration(specifiers, b.literal("intlayer"));
|
|
291
|
+
ast.program.body.unshift(newImport);
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
let insertIndex = 0;
|
|
295
|
+
if (ast.program.body.length > 0 && n.ExpressionStatement.check(ast.program.body[0]) && n.Literal.check(ast.program.body[0].expression)) insertIndex = 1;
|
|
296
|
+
const cjsLines = [];
|
|
297
|
+
const properties = missingCore.sort().map((imp) => {
|
|
298
|
+
const prop = b.property("init", b.identifier(imp), b.identifier(imp));
|
|
299
|
+
prop.shorthand = true;
|
|
300
|
+
return prop;
|
|
301
|
+
});
|
|
302
|
+
cjsLines.push(b.variableDeclaration("const", [b.variableDeclarator(b.objectPattern(properties), b.callExpression(b.identifier("require"), [b.literal("intlayer")]))]));
|
|
303
|
+
ast.program.body.splice(insertIndex, 0, ...cjsLines);
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
/**
|
|
307
|
+
* Updates a JS/TS file seamlessly to map new localization keys, arrays, complex nodes and nested dictionaries gracefully using AST updates via Recast parser.
|
|
308
|
+
*/
|
|
309
|
+
const transformJSFile = async (fileContent, dictionary, fallbackLocale, noMetadata) => {
|
|
310
|
+
if (!dictionary || typeof dictionary !== "object") return fileContent;
|
|
311
|
+
let ast;
|
|
312
|
+
try {
|
|
313
|
+
ast = recast.parse(fileContent, { parser: babelTsParser });
|
|
314
|
+
} catch (error) {
|
|
315
|
+
console.error({ error });
|
|
316
|
+
return fileContent;
|
|
317
|
+
}
|
|
318
|
+
let rootObject = null;
|
|
319
|
+
let isESM = false;
|
|
320
|
+
recast.visit(ast, {
|
|
321
|
+
visitExportDefaultDeclaration() {
|
|
322
|
+
isESM = true;
|
|
323
|
+
return false;
|
|
324
|
+
},
|
|
325
|
+
visitImportDeclaration() {
|
|
326
|
+
isESM = true;
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
recast.visit(ast, {
|
|
331
|
+
visitExportDefaultDeclaration(path) {
|
|
332
|
+
const decl = path.node.declaration;
|
|
333
|
+
const unwrappedDecl = unwrap(decl);
|
|
334
|
+
if (n.ObjectExpression.check(unwrappedDecl)) rootObject = unwrappedDecl;
|
|
335
|
+
else if (n.Identifier.check(unwrappedDecl)) {
|
|
336
|
+
const varName = unwrappedDecl.name;
|
|
337
|
+
recast.visit(ast, { visitVariableDeclarator(vp) {
|
|
338
|
+
const unwrappedInit = unwrap(vp.node.init);
|
|
339
|
+
if (n.Identifier.check(vp.node.id) && vp.node.id.name === varName && n.ObjectExpression.check(unwrappedInit)) rootObject = unwrappedInit;
|
|
340
|
+
return false;
|
|
341
|
+
} });
|
|
342
|
+
}
|
|
343
|
+
return false;
|
|
344
|
+
},
|
|
345
|
+
visitAssignmentExpression(path) {
|
|
346
|
+
const left = path.node.left;
|
|
347
|
+
if (n.MemberExpression.check(left)) {
|
|
348
|
+
if (n.Identifier.check(left.object) && left.object.name === "module" && n.Identifier.check(left.property) && left.property.name === "exports") {
|
|
349
|
+
const unwrappedRight = unwrap(path.node.right);
|
|
350
|
+
if (n.ObjectExpression.check(unwrappedRight)) rootObject = unwrappedRight;
|
|
351
|
+
}
|
|
352
|
+
if (n.Identifier.check(left.object) && left.object.name === "exports" && n.Identifier.check(left.property) && left.property.name === "default") {
|
|
353
|
+
const unwrappedRight = unwrap(path.node.right);
|
|
354
|
+
if (n.ObjectExpression.check(unwrappedRight)) rootObject = unwrappedRight;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
this.traverse(path);
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
if (!rootObject) recast.visit(ast, { visitVariableDeclarator(path) {
|
|
361
|
+
const unwrappedInit = unwrap(path.node.init);
|
|
362
|
+
if (!rootObject && n.ObjectExpression.check(unwrappedInit)) rootObject = unwrappedInit;
|
|
363
|
+
return false;
|
|
364
|
+
} });
|
|
365
|
+
if (!rootObject) return fileContent;
|
|
366
|
+
const requiredImports = /* @__PURE__ */ new Set();
|
|
367
|
+
const effectiveFallbackLocale = fallbackLocale ?? "en";
|
|
368
|
+
const metadataProperties = [
|
|
369
|
+
"id",
|
|
370
|
+
"locale",
|
|
371
|
+
"filled",
|
|
372
|
+
"fill",
|
|
373
|
+
"title",
|
|
374
|
+
"description",
|
|
375
|
+
"tags",
|
|
376
|
+
"version",
|
|
377
|
+
"priority",
|
|
378
|
+
"contentAutoTransformation"
|
|
379
|
+
];
|
|
380
|
+
if (noMetadata) {
|
|
381
|
+
rootObject.properties = rootObject.properties.filter((prop) => {
|
|
382
|
+
if (n.Property.check(prop) || n.ObjectProperty.check(prop)) {
|
|
383
|
+
let propName = "";
|
|
384
|
+
if (n.Identifier.check(prop.key)) propName = prop.key.name;
|
|
385
|
+
else if (n.StringLiteral.check(prop.key)) propName = prop.key.value;
|
|
386
|
+
else if (n.Literal.check(prop.key)) propName = String(prop.key.value);
|
|
387
|
+
return ![
|
|
388
|
+
"key",
|
|
389
|
+
"content",
|
|
390
|
+
...metadataProperties
|
|
391
|
+
].includes(propName);
|
|
392
|
+
}
|
|
393
|
+
return true;
|
|
394
|
+
});
|
|
395
|
+
recast.visit(ast, { visitNode(path) {
|
|
396
|
+
const node = path.node;
|
|
397
|
+
if ((n.TSSatisfiesExpression?.check(node) || node.type === "TSSatisfiesExpression") && node.typeAnnotation && n.TSTypeReference.check(node.typeAnnotation) && n.Identifier.check(node.typeAnnotation.typeName) && node.typeAnnotation.typeName.name === "Dictionary") node.typeAnnotation = b.tsIndexedAccessType(b.tsTypeReference(b.identifier("Dictionary")), b.tsLiteralType(b.stringLiteral("content")));
|
|
398
|
+
this.traverse(path);
|
|
399
|
+
} });
|
|
400
|
+
} else for (const prop of metadataProperties) if (dictionary[prop] !== void 0) updateObjectLiteral(rootObject, { [prop]: dictionary[prop] }, void 0, requiredImports);
|
|
401
|
+
if (dictionary.content !== void 0) updateObjectLiteral(rootObject, noMetadata ? dictionary.content : { content: dictionary.content }, effectiveFallbackLocale, requiredImports);
|
|
402
|
+
addImports(ast, requiredImports, isESM);
|
|
403
|
+
return recast.print(ast).code;
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
//#endregion
|
|
407
|
+
export { transformJSFile };
|
|
4
408
|
//# sourceMappingURL=transformJSFile.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformJSFile.mjs","names":[],"sources":["../../../src/writeContentDeclaration/transformJSFile.ts"],"sourcesContent":["import { getNodeType } from '@intlayer/core/dictionaryManipulator';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport type { ContentNode, Dictionary } from '@intlayer/types/dictionary';\nimport { NodeType } from '@intlayer/types/nodeType';\nimport * as recast from 'recast';\nimport * as babelTsParser from 'recast/parsers/babel-ts.js';\n\nconst b = recast.types.builders;\nconst n = recast.types.namedTypes;\n\n/**\n * Unwraps TypeScript/Babel expression wrappers (satisfies, as, !, <Type>).\n * Uses string fallbacks to bypass outdated ast-types definitions.\n */\nconst unwrap = (node: any) => {\n while (\n node &&\n (n.TSSatisfiesExpression?.check(node) ||\n n.TSAsExpression?.check(node) ||\n n.TSTypeAssertion?.check(node) ||\n n.TSNonNullExpression?.check(node) ||\n [\n 'TSSatisfiesExpression',\n 'TSAsExpression',\n 'TSTypeAssertion',\n 'TSNonNullExpression',\n ].includes(node.type))\n ) {\n node = node.expression;\n }\n return node;\n};\n\n/**\n * Robustly finds a property in a recast ObjectExpression.\n * Handles quoted (\"key\") or unquoted (key) properties.\n */\nconst getMatchingProperty = (node: any, key: string) => {\n return node.properties.find((prop: any) => {\n if (n.Property.check(prop) || n.ObjectProperty.check(prop)) {\n if (n.Identifier.check(prop.key) && prop.key.name === key) return true;\n\n if (n.StringLiteral.check(prop.key) && prop.key.value === key)\n return true;\n\n if (n.Literal.check(prop.key) && prop.key.value === key) return true;\n }\n\n return false;\n });\n};\n\n/**\n * Synchronizes numeric suffixes across locales.\n * E.g. \"Hello 1\" -> \"Hello 3\" updates \"Bonjour 1\" to \"Bonjour 3\".\n */\nconst syncNumericSuffixAcrossLocales = (\n existingNode: any,\n fallbackLocaleCode: string,\n newFallbackValue: string\n) => {\n const trailingNumberMatch = newFallbackValue.match(/\\d+(?!.*\\d)/);\n if (!trailingNumberMatch) return;\n const newTrailingNumber = trailingNumberMatch[0];\n\n if (n.ObjectExpression.check(existingNode)) {\n for (const prop of existingNode.properties) {\n if (n.Property.check(prop) || n.ObjectProperty.check(prop)) {\n let propName = '';\n\n if (n.Identifier.check(prop.key)) propName = prop.key.name;\n else if (\n n.Literal.check(prop.key) &&\n typeof prop.key.value === 'string'\n )\n propName = prop.key.value;\n else if (n.StringLiteral.check(prop.key)) propName = prop.key.value;\n\n if (propName && propName !== fallbackLocaleCode) {\n if (\n n.Literal.check(prop.value) &&\n typeof prop.value.value === 'string'\n ) {\n const currentValue = prop.value.value;\n const currentTrailingNumberMatch =\n currentValue.match(/\\d+(?!.*\\d)/);\n\n if (currentTrailingNumberMatch) {\n prop.value = b.literal(\n currentValue.replace(/(\\d+)(?!.*\\d)/, newTrailingNumber)\n );\n }\n } else if (n.StringLiteral.check(prop.value)) {\n const currentValue = prop.value.value;\n const currentTrailingNumberMatch =\n currentValue.match(/\\d+(?!.*\\d)/);\n\n if (currentTrailingNumberMatch) {\n prop.value = b.stringLiteral(\n currentValue.replace(/(\\d+)(?!.*\\d)/, newTrailingNumber)\n );\n }\n }\n }\n }\n }\n }\n};\n\n/**\n * Checks if a value represents a multilingual Intlayer node.\n * A node is multilingual if it is a Translation node, or if it is a specialized node\n * (Markdown, HTML, etc.) that contains a Translation node.\n */\nconst isMultilingualNode = (val: any): boolean => {\n if (typeof val !== 'object' || val === null || Array.isArray(val)) {\n return false;\n }\n\n const nodeType = getNodeType(val as ContentNode);\n\n if (nodeType === NodeType.Translation) {\n return true;\n }\n\n if (\n nodeType === NodeType.Markdown ||\n nodeType === NodeType.HTML ||\n nodeType === NodeType.Insertion\n ) {\n return isMultilingualNode((val as any)[nodeType]);\n }\n\n if (\n nodeType === NodeType.Enumeration ||\n nodeType === NodeType.Condition ||\n nodeType === NodeType.Gender\n ) {\n const data = (val as any)[nodeType];\n\n if (data && typeof data === 'object') {\n return Object.values(data).some((v) => isMultilingualNode(v));\n }\n }\n\n return false;\n};\n\n/**\n * Recursively builds or updates an AST node for a given dictionary value.\n */\nconst buildNodeForValue = (\n val: any,\n existingNode: any,\n fallbackLocale: string | undefined, // In per-locale mode, this is the locale of the file\n requiredImports: Set<string>\n): any => {\n const unwrappedExisting = unwrap(existingNode);\n\n // --- CRITICAL GUARD: STRICT AST PRESERVATION ---\n // If the existing node is code (JSX, Variables, standard functions), leave it alone.\n // Only allow updates to literals, plain objects, arrays, and Intlayer helpers.\n if (unwrappedExisting) {\n const isUpdatableNode =\n n.Literal.check(unwrappedExisting) ||\n n.StringLiteral.check(unwrappedExisting) ||\n n.NumericLiteral.check(unwrappedExisting) ||\n n.BooleanLiteral.check(unwrappedExisting) ||\n n.TemplateLiteral.check(unwrappedExisting) ||\n n.ObjectExpression.check(unwrappedExisting) ||\n n.ArrayExpression.check(unwrappedExisting) ||\n (n.CallExpression.check(unwrappedExisting) &&\n n.Identifier.check(unwrappedExisting.callee) &&\n [\n 't',\n 'enu',\n 'cond',\n 'gender',\n 'insert',\n 'md',\n 'html',\n 'file',\n 'nest',\n ].includes(unwrappedExisting.callee.name));\n\n if (!isUpdatableNode) {\n return existingNode;\n }\n }\n\n // If we are in per-locale mode (fallbackLocale is set)\n // and the value is not already a complex translation node,\n // we want to store it as a simple literal, NOT wrapped in t().\n if (fallbackLocale && !existingNode && !isMultilingualNode(val)) {\n if (val === null) return b.literal(null);\n if (\n typeof val === 'string' ||\n typeof val === 'number' ||\n typeof val === 'boolean'\n ) {\n if (typeof val === 'string' && val.includes('\\n')) {\n return b.templateLiteral(\n [b.templateElement({ raw: val, cooked: val }, true)],\n []\n );\n }\n return b.literal(val);\n }\n }\n\n if (fallbackLocale && existingNode && !isMultilingualNode(val)) {\n if (\n n.CallExpression.check(existingNode) &&\n n.Identifier.check(existingNode.callee) &&\n existingNode.callee.name === 't'\n ) {\n const arg = unwrap(existingNode.arguments[0]);\n\n if (n.ObjectExpression.check(arg)) {\n if (typeof val === 'string') {\n syncNumericSuffixAcrossLocales(arg, fallbackLocale, val);\n }\n updateObjectLiteral(\n arg,\n { [fallbackLocale]: val },\n fallbackLocale,\n requiredImports\n );\n\n if (!fallbackLocale) {\n requiredImports.add('t');\n }\n\n return existingNode;\n }\n }\n\n if (\n (!val || typeof val !== 'object') &&\n n.CallExpression.check(existingNode) &&\n n.Identifier.check(existingNode.callee) &&\n existingNode.callee.name === 'md'\n ) {\n const innerArg = existingNode.arguments[0];\n\n if (\n n.CallExpression.check(innerArg) &&\n n.Identifier.check(innerArg.callee) &&\n innerArg.callee.name === 't'\n ) {\n const tArg = unwrap(innerArg.arguments[0]);\n\n if (n.ObjectExpression.check(tArg)) {\n if (typeof val === 'string') {\n syncNumericSuffixAcrossLocales(tArg, fallbackLocale, val);\n }\n updateObjectLiteral(\n tArg,\n { [fallbackLocale]: val },\n fallbackLocale,\n requiredImports\n );\n requiredImports.add('md');\n requiredImports.add('t');\n\n return existingNode;\n }\n }\n }\n }\n\n // 1. Primitives\n if (val === null) return b.literal(null);\n if (\n typeof val === 'string' ||\n typeof val === 'number' ||\n typeof val === 'boolean'\n ) {\n if (unwrappedExisting) {\n // Preserve existing template literals (backticks)\n if (\n n.TemplateLiteral.check(unwrappedExisting) &&\n unwrappedExisting.expressions.length === 0\n ) {\n unwrappedExisting.quasis[0].value.raw = String(val);\n unwrappedExisting.quasis[0].value.cooked = String(val);\n return existingNode;\n }\n // Preserve existing standard literals (keeps quote styling)\n if (\n n.Literal.check(unwrappedExisting) ||\n n.StringLiteral.check(unwrappedExisting)\n ) {\n unwrappedExisting.value = val;\n return existingNode;\n }\n }\n\n // Force multiline strings to use Template Literals\n if (typeof val === 'string' && val.includes('\\n')) {\n return b.templateLiteral(\n [b.templateElement({ raw: val, cooked: val }, true)],\n []\n );\n }\n return b.literal(val);\n }\n\n // 2. Arrays\n if (Array.isArray(val)) {\n if (unwrappedExisting && n.ArrayExpression.check(unwrappedExisting)) {\n const elements = [...unwrappedExisting.elements];\n val.forEach((item, i) => {\n elements[i] = buildNodeForValue(\n item,\n elements[i],\n fallbackLocale,\n requiredImports\n );\n });\n\n if (elements.length > val.length) elements.length = val.length;\n unwrappedExisting.elements = elements as any;\n\n return existingNode;\n } else {\n return b.arrayExpression(\n val.map((item) =>\n buildNodeForValue(item, null, fallbackLocale, requiredImports)\n )\n );\n }\n }\n\n // 3. Intlayer Specialized Nodes\n const nodeType =\n val && typeof val === 'object' && !Array.isArray(val)\n ? getNodeType(val as ContentNode)\n : null;\n\n if (\n nodeType &&\n Object.values(NodeType).includes(nodeType as any) &&\n nodeType !== NodeType.Text\n ) {\n const nodeData = (val as any)[nodeType];\n let calleeName = '';\n\n if (nodeType === NodeType.Translation) calleeName = 't';\n else if (nodeType === NodeType.Enumeration) calleeName = 'enu';\n else if (nodeType === NodeType.Condition) calleeName = 'cond';\n else if (nodeType === NodeType.Gender) calleeName = 'gender';\n else if (nodeType === NodeType.Insertion) calleeName = 'insert';\n else if (nodeType === NodeType.Markdown) calleeName = 'md';\n else if (nodeType === NodeType.HTML) calleeName = 'html';\n else if (nodeType === NodeType.File) calleeName = 'file';\n else if (nodeType === NodeType.Nested) calleeName = 'nest';\n\n if (calleeName) requiredImports.add(calleeName);\n\n const isMatchingCall =\n existingNode &&\n n.CallExpression.check(existingNode) &&\n n.Identifier.check(existingNode.callee) &&\n existingNode.callee.name === calleeName;\n\n if (['t', 'enu', 'cond', 'gender'].includes(calleeName)) {\n let objArg: any = null;\n\n if (\n isMatchingCall &&\n existingNode.arguments.length > 0 &&\n n.ObjectExpression.check(existingNode.arguments[0])\n ) {\n objArg = existingNode.arguments[0];\n } else {\n objArg = b.objectExpression([]);\n }\n updateObjectLiteral(objArg, nodeData, fallbackLocale, requiredImports);\n\n return isMatchingCall\n ? existingNode\n : b.callExpression(b.identifier(calleeName), [objArg]);\n }\n\n if (['md', 'html', 'insert', 'file'].includes(calleeName)) {\n const argNode = buildNodeForValue(\n nodeData,\n isMatchingCall && existingNode.arguments.length > 0\n ? existingNode.arguments[0]\n : null,\n fallbackLocale,\n requiredImports\n );\n\n if (isMatchingCall) {\n existingNode.arguments[0] = argNode;\n\n return existingNode;\n }\n\n return b.callExpression(b.identifier(calleeName), [argNode]);\n }\n\n if (calleeName === 'nest') {\n const args = [b.literal(nodeData.dictionaryKey)];\n\n if (nodeData.path) args.push(b.literal(nodeData.path));\n\n if (isMatchingCall) {\n existingNode.arguments = args;\n\n return existingNode;\n }\n\n return b.callExpression(b.identifier('nest'), args);\n }\n }\n\n // 4. Plain Object\n const objNode =\n unwrappedExisting && n.ObjectExpression.check(unwrappedExisting)\n ? unwrappedExisting\n : b.objectExpression([]);\n\n updateObjectLiteral(objNode, val, fallbackLocale, requiredImports);\n\n return existingNode && unwrappedExisting === existingNode\n ? objNode\n : existingNode || objNode;\n};\n\n/**\n * Recursively updates the AST object literal properties.\n */\nconst updateObjectLiteral = (\n node: recast.types.namedTypes.ObjectExpression,\n data: Record<string, any>,\n fallbackLocale: string | undefined,\n requiredImports: Set<string>\n) => {\n for (const [key, val] of Object.entries(data)) {\n if (val === undefined) continue;\n\n const existingProp = getMatchingProperty(node, key);\n\n if (existingProp) {\n existingProp.value = buildNodeForValue(\n val,\n existingProp.value,\n fallbackLocale,\n requiredImports\n );\n } else {\n const isValidId = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key);\n const keyNode = isValidId ? b.identifier(key) : b.literal(key);\n const valueNode = buildNodeForValue(\n val,\n null,\n fallbackLocale,\n requiredImports\n );\n node.properties.push(b.property('init', keyNode, valueNode));\n }\n }\n};\n\n/**\n * Modifies the AST's top-level imports to inject dynamically needed helper utilities seamlessly.\n */\nconst addImports = (ast: any, requiredImports: Set<string>, isESM: boolean) => {\n if (requiredImports.size === 0) return;\n\n const existingCoreImports = new Set<string>();\n let coreImportPath: any = null;\n\n recast.visit(ast, {\n visitImportDeclaration(path) {\n const source = path.node.source.value;\n\n if (source === 'intlayer') {\n coreImportPath = path;\n path.node.specifiers?.forEach((spec) => {\n if (\n n.ImportSpecifier.check(spec) &&\n typeof spec.imported.name === 'string'\n ) {\n existingCoreImports.add(spec.imported.name);\n }\n });\n }\n\n return false;\n },\n visitVariableDeclaration(path) {\n path.node.declarations.forEach((decl) => {\n if (\n n.VariableDeclarator.check(decl) &&\n n.CallExpression.check(decl.init) &&\n n.Identifier.check(decl.init.callee) &&\n decl.init.callee.name === 'require'\n ) {\n const arg = decl.init.arguments[0];\n\n if (n.Literal.check(arg)) {\n if (arg.value === 'intlayer') {\n if (n.ObjectPattern.check(decl.id)) {\n decl.id.properties.forEach((prop) => {\n if (\n n.Property.check(prop) &&\n (n.Identifier.check(prop.key) ||\n n.Identifier.check(prop.value))\n ) {\n const name = n.Identifier.check(prop.key)\n ? prop.key.name\n : (prop.value as any).name;\n existingCoreImports.add(name);\n }\n });\n } else if (n.Identifier.check(decl.id)) {\n // Handle const intlayer = require('intlayer')\n existingCoreImports.add(decl.id.name);\n }\n }\n }\n }\n });\n\n return false;\n },\n });\n\n const missingCore = Array.from(requiredImports).filter(\n (imp) => !existingCoreImports.has(imp)\n );\n\n if (missingCore.length === 0) return;\n\n if (isESM) {\n if (coreImportPath) {\n missingCore.forEach((imp) => {\n coreImportPath.node.specifiers.push(\n b.importSpecifier(b.identifier(imp))\n );\n });\n coreImportPath.node.specifiers.sort((a: any, b: any) =>\n a.imported.name.localeCompare(b.imported.name)\n );\n } else {\n const specifiers = missingCore\n .sort()\n .map((imp) => b.importSpecifier(b.identifier(imp)));\n const newImport = b.importDeclaration(specifiers, b.literal('intlayer'));\n ast.program.body.unshift(newImport);\n }\n } else {\n let insertIndex = 0;\n\n if (\n ast.program.body.length > 0 &&\n n.ExpressionStatement.check(ast.program.body[0]) &&\n n.Literal.check(ast.program.body[0].expression)\n ) {\n insertIndex = 1; // Insert after 'use strict'\n }\n const cjsLines: any[] = [];\n\n const properties = missingCore.sort().map((imp) => {\n const prop = b.property('init', b.identifier(imp), b.identifier(imp));\n prop.shorthand = true;\n\n return prop;\n });\n cjsLines.push(\n b.variableDeclaration('const', [\n b.variableDeclarator(\n b.objectPattern(properties),\n b.callExpression(b.identifier('require'), [b.literal('intlayer')])\n ),\n ])\n );\n\n ast.program.body.splice(insertIndex, 0, ...cjsLines);\n }\n};\n\n/**\n * Updates a JS/TS file seamlessly to map new localization keys, arrays, complex nodes and nested dictionaries gracefully using AST updates via Recast parser.\n */\nexport const transformJSFile = async (\n fileContent: string,\n dictionary: Dictionary,\n fallbackLocale?: Locale,\n noMetadata?: boolean\n): Promise<string> => {\n if (!dictionary || typeof dictionary !== 'object') return fileContent;\n\n let ast: any;\n try {\n ast = recast.parse(fileContent, {\n parser: babelTsParser,\n });\n } catch (error) {\n console.error({ error });\n return fileContent;\n }\n\n let rootObject: any = null;\n let isESM = false;\n\n recast.visit(ast, {\n visitExportDefaultDeclaration() {\n isESM = true;\n\n return false;\n },\n visitImportDeclaration() {\n isESM = true;\n\n return false;\n },\n });\n\n recast.visit(ast, {\n visitExportDefaultDeclaration(path) {\n const decl = path.node.declaration;\n const unwrappedDecl = unwrap(decl);\n\n if (n.ObjectExpression.check(unwrappedDecl)) {\n rootObject = unwrappedDecl;\n } else if (n.Identifier.check(unwrappedDecl)) {\n const varName = unwrappedDecl.name;\n recast.visit(ast, {\n visitVariableDeclarator(vp) {\n const unwrappedInit = unwrap(vp.node.init);\n\n if (\n n.Identifier.check(vp.node.id) &&\n vp.node.id.name === varName &&\n n.ObjectExpression.check(unwrappedInit)\n ) {\n rootObject = unwrappedInit;\n }\n\n return false;\n },\n });\n }\n\n return false;\n },\n visitAssignmentExpression(path) {\n const left = path.node.left;\n\n if (n.MemberExpression.check(left)) {\n if (\n n.Identifier.check(left.object) &&\n left.object.name === 'module' &&\n n.Identifier.check(left.property) &&\n left.property.name === 'exports'\n ) {\n const unwrappedRight = unwrap(path.node.right);\n\n if (n.ObjectExpression.check(unwrappedRight)) {\n rootObject = unwrappedRight;\n }\n }\n\n if (\n n.Identifier.check(left.object) &&\n left.object.name === 'exports' &&\n n.Identifier.check(left.property) &&\n left.property.name === 'default'\n ) {\n const unwrappedRight = unwrap(path.node.right);\n\n if (n.ObjectExpression.check(unwrappedRight)) {\n rootObject = unwrappedRight;\n }\n }\n }\n this.traverse(path);\n },\n });\n\n if (!rootObject) {\n recast.visit(ast, {\n visitVariableDeclarator(path) {\n const unwrappedInit = unwrap(path.node.init);\n\n if (!rootObject && n.ObjectExpression.check(unwrappedInit)) {\n rootObject = unwrappedInit;\n }\n\n return false;\n },\n });\n }\n\n if (!rootObject) return fileContent;\n\n const requiredImports = new Set<string>();\n const effectiveFallbackLocale = (fallbackLocale as string) ?? 'en';\n\n const metadataProperties = [\n 'id',\n 'locale',\n 'filled',\n 'fill',\n 'title',\n 'description',\n 'tags',\n 'version',\n 'priority',\n 'contentAutoTransformation',\n ];\n\n if (noMetadata) {\n // Remove key, content and metadata properties if they exist\n rootObject.properties = rootObject.properties.filter((prop: any) => {\n if (n.Property.check(prop) || n.ObjectProperty.check(prop)) {\n let propName = '';\n if (n.Identifier.check(prop.key)) propName = prop.key.name;\n else if (n.StringLiteral.check(prop.key)) propName = prop.key.value;\n else if (n.Literal.check(prop.key)) propName = String(prop.key.value);\n\n return !['key', 'content', ...metadataProperties].includes(propName);\n }\n return true;\n });\n\n // Update satisfies type if exists\n recast.visit(ast, {\n visitNode(path) {\n const node = path.node;\n if (\n (n.TSSatisfiesExpression?.check(node) ||\n node.type === 'TSSatisfiesExpression') &&\n (node as any).typeAnnotation &&\n n.TSTypeReference.check((node as any).typeAnnotation) &&\n n.Identifier.check((node as any).typeAnnotation.typeName) &&\n (node as any).typeAnnotation.typeName.name === 'Dictionary'\n ) {\n (node as any).typeAnnotation = b.tsIndexedAccessType(\n b.tsTypeReference(b.identifier('Dictionary')),\n b.tsLiteralType(b.stringLiteral('content'))\n );\n }\n this.traverse(path);\n },\n });\n } else {\n for (const prop of metadataProperties) {\n if ((dictionary as any)[prop] !== undefined) {\n updateObjectLiteral(\n rootObject,\n { [prop]: (dictionary as any)[prop] },\n undefined,\n requiredImports\n );\n }\n }\n }\n\n if (dictionary.content !== undefined) {\n updateObjectLiteral(\n rootObject,\n noMetadata\n ? (dictionary.content as Record<string, any>)\n : { content: dictionary.content },\n effectiveFallbackLocale,\n requiredImports\n );\n }\n\n addImports(ast, requiredImports, isESM);\n\n return recast.print(ast).code;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transformJSFile.mjs","names":[],"sources":["../../../src/writeContentDeclaration/transformJSFile.ts"],"sourcesContent":["import { getNodeType } from '@intlayer/core/dictionaryManipulator';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport type { ContentNode, Dictionary } from '@intlayer/types/dictionary';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport * as recast from 'recast';\nimport * as babelTsParser from 'recast/parsers/babel-ts.js';\n\nconst b = recast.types.builders;\nconst n = recast.types.namedTypes;\n\n/**\n * Unwraps TypeScript/Babel expression wrappers (satisfies, as, !, <Type>).\n * Uses string fallbacks to bypass outdated ast-types definitions.\n */\nconst unwrap = (node: any) => {\n while (\n node &&\n (n.TSSatisfiesExpression?.check(node) ||\n n.TSAsExpression?.check(node) ||\n n.TSTypeAssertion?.check(node) ||\n n.TSNonNullExpression?.check(node) ||\n [\n 'TSSatisfiesExpression',\n 'TSAsExpression',\n 'TSTypeAssertion',\n 'TSNonNullExpression',\n ].includes(node.type))\n ) {\n node = node.expression;\n }\n return node;\n};\n\n/**\n * Robustly finds a property in a recast ObjectExpression.\n * Handles quoted (\"key\") or unquoted (key) properties.\n */\nconst getMatchingProperty = (node: any, key: string) => {\n return node.properties.find((prop: any) => {\n if (n.Property.check(prop) || n.ObjectProperty.check(prop)) {\n if (n.Identifier.check(prop.key) && prop.key.name === key) return true;\n\n if (n.StringLiteral.check(prop.key) && prop.key.value === key)\n return true;\n\n if (n.Literal.check(prop.key) && prop.key.value === key) return true;\n }\n\n return false;\n });\n};\n\n/**\n * Synchronizes numeric suffixes across locales.\n * E.g. \"Hello 1\" -> \"Hello 3\" updates \"Bonjour 1\" to \"Bonjour 3\".\n */\nconst syncNumericSuffixAcrossLocales = (\n existingNode: any,\n fallbackLocaleCode: string,\n newFallbackValue: string\n) => {\n const trailingNumberMatch = newFallbackValue.match(/\\d+(?!.*\\d)/);\n if (!trailingNumberMatch) return;\n const newTrailingNumber = trailingNumberMatch[0];\n\n if (n.ObjectExpression.check(existingNode)) {\n for (const prop of existingNode.properties) {\n if (n.Property.check(prop) || n.ObjectProperty.check(prop)) {\n let propName = '';\n\n if (n.Identifier.check(prop.key)) propName = prop.key.name;\n else if (\n n.Literal.check(prop.key) &&\n typeof prop.key.value === 'string'\n )\n propName = prop.key.value;\n else if (n.StringLiteral.check(prop.key)) propName = prop.key.value;\n\n if (propName && propName !== fallbackLocaleCode) {\n if (\n n.Literal.check(prop.value) &&\n typeof prop.value.value === 'string'\n ) {\n const currentValue = prop.value.value;\n const currentTrailingNumberMatch =\n currentValue.match(/\\d+(?!.*\\d)/);\n\n if (currentTrailingNumberMatch) {\n prop.value = b.literal(\n currentValue.replace(/(\\d+)(?!.*\\d)/, newTrailingNumber)\n );\n }\n } else if (n.StringLiteral.check(prop.value)) {\n const currentValue = prop.value.value;\n const currentTrailingNumberMatch =\n currentValue.match(/\\d+(?!.*\\d)/);\n\n if (currentTrailingNumberMatch) {\n prop.value = b.stringLiteral(\n currentValue.replace(/(\\d+)(?!.*\\d)/, newTrailingNumber)\n );\n }\n }\n }\n }\n }\n }\n};\n\n/**\n * Checks if a value represents a multilingual Intlayer node.\n * A node is multilingual if it is a Translation node, or if it is a specialized node\n * (Markdown, HTML, etc.) that contains a Translation node.\n */\nconst isMultilingualNode = (val: any): boolean => {\n if (typeof val !== 'object' || val === null || Array.isArray(val)) {\n return false;\n }\n\n const nodeType = getNodeType(val as ContentNode);\n\n if (nodeType === NodeTypes.TRANSLATION) {\n return true;\n }\n\n if (\n nodeType === NodeTypes.MARKDOWN ||\n nodeType === NodeTypes.HTML ||\n nodeType === NodeTypes.INSERTION\n ) {\n return isMultilingualNode((val as any)[nodeType]);\n }\n\n if (\n nodeType === NodeTypes.ENUMERATION ||\n nodeType === NodeTypes.CONDITION ||\n nodeType === NodeTypes.GENDER\n ) {\n const data = (val as any)[nodeType];\n\n if (data && typeof data === 'object') {\n return Object.values(data).some((v) => isMultilingualNode(v));\n }\n }\n\n return false;\n};\n\n/**\n * Recursively builds or updates an AST node for a given dictionary value.\n */\nconst buildNodeForValue = (\n val: any,\n existingNode: any,\n fallbackLocale: string | undefined, // In per-locale mode, this is the locale of the file\n requiredImports: Set<string>\n): any => {\n const unwrappedExisting = unwrap(existingNode);\n\n // --- CRITICAL GUARD: STRICT AST PRESERVATION ---\n // If the existing node is code (JSX, Variables, standard functions), leave it alone.\n // Only allow updates to literals, plain objects, arrays, and Intlayer helpers.\n if (unwrappedExisting) {\n const isUpdatableNode =\n n.Literal.check(unwrappedExisting) ||\n n.StringLiteral.check(unwrappedExisting) ||\n n.NumericLiteral.check(unwrappedExisting) ||\n n.BooleanLiteral.check(unwrappedExisting) ||\n n.TemplateLiteral.check(unwrappedExisting) ||\n n.ObjectExpression.check(unwrappedExisting) ||\n n.ArrayExpression.check(unwrappedExisting) ||\n (n.CallExpression.check(unwrappedExisting) &&\n n.Identifier.check(unwrappedExisting.callee) &&\n [\n 't',\n 'enu',\n 'cond',\n 'gender',\n 'insert',\n 'md',\n 'html',\n 'file',\n 'nest',\n ].includes(unwrappedExisting.callee.name));\n\n if (!isUpdatableNode) {\n return existingNode;\n }\n }\n\n // If we are in per-locale mode (fallbackLocale is set)\n // and the value is not already a complex translation node,\n // we want to store it as a simple literal, NOT wrapped in t().\n if (fallbackLocale && !existingNode && !isMultilingualNode(val)) {\n if (val === null) return b.literal(null);\n if (\n typeof val === 'string' ||\n typeof val === 'number' ||\n typeof val === 'boolean'\n ) {\n if (typeof val === 'string' && val.includes('\\n')) {\n return b.templateLiteral(\n [b.templateElement({ raw: val, cooked: val }, true)],\n []\n );\n }\n return b.literal(val);\n }\n }\n\n if (fallbackLocale && existingNode && !isMultilingualNode(val)) {\n if (\n n.CallExpression.check(existingNode) &&\n n.Identifier.check(existingNode.callee) &&\n existingNode.callee.name === 't'\n ) {\n const arg = unwrap(existingNode.arguments[0]);\n\n if (n.ObjectExpression.check(arg)) {\n if (typeof val === 'string') {\n syncNumericSuffixAcrossLocales(arg, fallbackLocale, val);\n }\n updateObjectLiteral(\n arg,\n { [fallbackLocale]: val },\n fallbackLocale,\n requiredImports\n );\n\n if (!fallbackLocale) {\n requiredImports.add('t');\n }\n\n return existingNode;\n }\n }\n\n if (\n (!val || typeof val !== 'object') &&\n n.CallExpression.check(existingNode) &&\n n.Identifier.check(existingNode.callee) &&\n existingNode.callee.name === 'md'\n ) {\n const innerArg = existingNode.arguments[0];\n\n if (\n n.CallExpression.check(innerArg) &&\n n.Identifier.check(innerArg.callee) &&\n innerArg.callee.name === 't'\n ) {\n const tArg = unwrap(innerArg.arguments[0]);\n\n if (n.ObjectExpression.check(tArg)) {\n if (typeof val === 'string') {\n syncNumericSuffixAcrossLocales(tArg, fallbackLocale, val);\n }\n updateObjectLiteral(\n tArg,\n { [fallbackLocale]: val },\n fallbackLocale,\n requiredImports\n );\n requiredImports.add('md');\n requiredImports.add('t');\n\n return existingNode;\n }\n }\n }\n }\n\n // 1. Primitives\n if (val === null) return b.literal(null);\n if (\n typeof val === 'string' ||\n typeof val === 'number' ||\n typeof val === 'boolean'\n ) {\n if (unwrappedExisting) {\n // Preserve existing template literals (backticks)\n if (\n n.TemplateLiteral.check(unwrappedExisting) &&\n unwrappedExisting.expressions.length === 0\n ) {\n unwrappedExisting.quasis[0].value.raw = String(val);\n unwrappedExisting.quasis[0].value.cooked = String(val);\n return existingNode;\n }\n // Preserve existing standard literals (keeps quote styling)\n if (\n n.Literal.check(unwrappedExisting) ||\n n.StringLiteral.check(unwrappedExisting)\n ) {\n unwrappedExisting.value = val;\n return existingNode;\n }\n }\n\n // Force multiline strings to use Template Literals\n if (typeof val === 'string' && val.includes('\\n')) {\n return b.templateLiteral(\n [b.templateElement({ raw: val, cooked: val }, true)],\n []\n );\n }\n return b.literal(val);\n }\n\n // 2. Arrays\n if (Array.isArray(val)) {\n if (unwrappedExisting && n.ArrayExpression.check(unwrappedExisting)) {\n const elements = [...unwrappedExisting.elements];\n val.forEach((item, i) => {\n elements[i] = buildNodeForValue(\n item,\n elements[i],\n fallbackLocale,\n requiredImports\n );\n });\n\n if (elements.length > val.length) elements.length = val.length;\n unwrappedExisting.elements = elements as any;\n\n return existingNode;\n } else {\n return b.arrayExpression(\n val.map((item) =>\n buildNodeForValue(item, null, fallbackLocale, requiredImports)\n )\n );\n }\n }\n\n // 3. Intlayer Specialized Nodes\n const nodeType =\n val && typeof val === 'object' && !Array.isArray(val)\n ? getNodeType(val as ContentNode)\n : null;\n\n if (\n nodeType &&\n [\n NodeTypes.TRANSLATION,\n NodeTypes.ENUMERATION,\n NodeTypes.CONDITION,\n NodeTypes.GENDER,\n NodeTypes.INSERTION,\n NodeTypes.MARKDOWN,\n NodeTypes.HTML,\n NodeTypes.FILE,\n NodeTypes.NESTED,\n NodeTypes.ARRAY,\n NodeTypes.OBJECT,\n NodeTypes.REACT_NODE,\n NodeTypes.NUMBER,\n NodeTypes.BOOLEAN,\n NodeTypes.NULL,\n NodeTypes.UNKNOWN,\n ].includes(nodeType as any) &&\n nodeType !== NodeTypes.TEXT\n ) {\n const nodeData = (val as any)[nodeType];\n let calleeName = '';\n\n if (nodeType === NodeTypes.TRANSLATION) calleeName = 't';\n else if (nodeType === NodeTypes.ENUMERATION) calleeName = 'enu';\n else if (nodeType === NodeTypes.CONDITION) calleeName = 'cond';\n else if (nodeType === NodeTypes.GENDER) calleeName = 'gender';\n else if (nodeType === NodeTypes.INSERTION) calleeName = 'insert';\n else if (nodeType === NodeTypes.MARKDOWN) calleeName = 'md';\n else if (nodeType === NodeTypes.HTML) calleeName = 'html';\n else if (nodeType === NodeTypes.FILE) calleeName = 'file';\n else if (nodeType === NodeTypes.NESTED) calleeName = 'nest';\n\n if (calleeName) requiredImports.add(calleeName);\n\n const isMatchingCall =\n existingNode &&\n n.CallExpression.check(existingNode) &&\n n.Identifier.check(existingNode.callee) &&\n existingNode.callee.name === calleeName;\n\n if (['t', 'enu', 'cond', 'gender'].includes(calleeName)) {\n let objArg: any = null;\n\n if (\n isMatchingCall &&\n existingNode.arguments.length > 0 &&\n n.ObjectExpression.check(existingNode.arguments[0])\n ) {\n objArg = existingNode.arguments[0];\n } else {\n objArg = b.objectExpression([]);\n }\n updateObjectLiteral(objArg, nodeData, fallbackLocale, requiredImports);\n\n return isMatchingCall\n ? existingNode\n : b.callExpression(b.identifier(calleeName), [objArg]);\n }\n\n if (['md', 'html', 'insert', 'file'].includes(calleeName)) {\n const argNode = buildNodeForValue(\n nodeData,\n isMatchingCall && existingNode.arguments.length > 0\n ? existingNode.arguments[0]\n : null,\n fallbackLocale,\n requiredImports\n );\n\n if (isMatchingCall) {\n existingNode.arguments[0] = argNode;\n\n return existingNode;\n }\n\n return b.callExpression(b.identifier(calleeName), [argNode]);\n }\n\n if (calleeName === 'nest') {\n const args = [b.literal(nodeData.dictionaryKey)];\n\n if (nodeData.path) args.push(b.literal(nodeData.path));\n\n if (isMatchingCall) {\n existingNode.arguments = args;\n\n return existingNode;\n }\n\n return b.callExpression(b.identifier('nest'), args);\n }\n }\n\n // 4. Plain Object\n const objNode =\n unwrappedExisting && n.ObjectExpression.check(unwrappedExisting)\n ? unwrappedExisting\n : b.objectExpression([]);\n\n updateObjectLiteral(objNode, val, fallbackLocale, requiredImports);\n\n return existingNode && unwrappedExisting === existingNode\n ? objNode\n : existingNode || objNode;\n};\n\n/**\n * Recursively updates the AST object literal properties.\n */\nconst updateObjectLiteral = (\n node: recast.types.namedTypes.ObjectExpression,\n data: Record<string, any>,\n fallbackLocale: string | undefined,\n requiredImports: Set<string>\n) => {\n for (const [key, val] of Object.entries(data)) {\n if (val === undefined) continue;\n\n const existingProp = getMatchingProperty(node, key);\n\n if (existingProp) {\n existingProp.value = buildNodeForValue(\n val,\n existingProp.value,\n fallbackLocale,\n requiredImports\n );\n } else {\n const isValidId = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key);\n const keyNode = isValidId ? b.identifier(key) : b.literal(key);\n const valueNode = buildNodeForValue(\n val,\n null,\n fallbackLocale,\n requiredImports\n );\n node.properties.push(b.property('init', keyNode, valueNode));\n }\n }\n};\n\n/**\n * Modifies the AST's top-level imports to inject dynamically needed helper utilities seamlessly.\n */\nconst addImports = (ast: any, requiredImports: Set<string>, isESM: boolean) => {\n if (requiredImports.size === 0) return;\n\n const existingCoreImports = new Set<string>();\n let coreImportPath: any = null;\n\n recast.visit(ast, {\n visitImportDeclaration(path) {\n const source = path.node.source.value;\n\n if (source === 'intlayer') {\n coreImportPath = path;\n path.node.specifiers?.forEach((spec) => {\n if (\n n.ImportSpecifier.check(spec) &&\n typeof spec.imported.name === 'string'\n ) {\n existingCoreImports.add(spec.imported.name);\n }\n });\n }\n\n return false;\n },\n visitVariableDeclaration(path) {\n path.node.declarations.forEach((decl) => {\n if (\n n.VariableDeclarator.check(decl) &&\n n.CallExpression.check(decl.init) &&\n n.Identifier.check(decl.init.callee) &&\n decl.init.callee.name === 'require'\n ) {\n const arg = decl.init.arguments[0];\n\n if (n.Literal.check(arg)) {\n if (arg.value === 'intlayer') {\n if (n.ObjectPattern.check(decl.id)) {\n decl.id.properties.forEach((prop) => {\n if (\n n.Property.check(prop) &&\n (n.Identifier.check(prop.key) ||\n n.Identifier.check(prop.value))\n ) {\n const name = n.Identifier.check(prop.key)\n ? prop.key.name\n : (prop.value as any).name;\n existingCoreImports.add(name);\n }\n });\n } else if (n.Identifier.check(decl.id)) {\n // Handle const intlayer = require('intlayer')\n existingCoreImports.add(decl.id.name);\n }\n }\n }\n }\n });\n\n return false;\n },\n });\n\n const missingCore = Array.from(requiredImports).filter(\n (imp) => !existingCoreImports.has(imp)\n );\n\n if (missingCore.length === 0) return;\n\n if (isESM) {\n if (coreImportPath) {\n missingCore.forEach((imp) => {\n coreImportPath.node.specifiers.push(\n b.importSpecifier(b.identifier(imp))\n );\n });\n coreImportPath.node.specifiers.sort((a: any, b: any) =>\n a.imported.name.localeCompare(b.imported.name)\n );\n } else {\n const specifiers = missingCore\n .sort()\n .map((imp) => b.importSpecifier(b.identifier(imp)));\n const newImport = b.importDeclaration(specifiers, b.literal('intlayer'));\n ast.program.body.unshift(newImport);\n }\n } else {\n let insertIndex = 0;\n\n if (\n ast.program.body.length > 0 &&\n n.ExpressionStatement.check(ast.program.body[0]) &&\n n.Literal.check(ast.program.body[0].expression)\n ) {\n insertIndex = 1; // Insert after 'use strict'\n }\n const cjsLines: any[] = [];\n\n const properties = missingCore.sort().map((imp) => {\n const prop = b.property('init', b.identifier(imp), b.identifier(imp));\n prop.shorthand = true;\n\n return prop;\n });\n cjsLines.push(\n b.variableDeclaration('const', [\n b.variableDeclarator(\n b.objectPattern(properties),\n b.callExpression(b.identifier('require'), [b.literal('intlayer')])\n ),\n ])\n );\n\n ast.program.body.splice(insertIndex, 0, ...cjsLines);\n }\n};\n\n/**\n * Updates a JS/TS file seamlessly to map new localization keys, arrays, complex nodes and nested dictionaries gracefully using AST updates via Recast parser.\n */\nexport const transformJSFile = async (\n fileContent: string,\n dictionary: Dictionary,\n fallbackLocale?: Locale,\n noMetadata?: boolean\n): Promise<string> => {\n if (!dictionary || typeof dictionary !== 'object') return fileContent;\n\n let ast: any;\n try {\n ast = recast.parse(fileContent, {\n parser: babelTsParser,\n });\n } catch (error) {\n console.error({ error });\n return fileContent;\n }\n\n let rootObject: any = null;\n let isESM = false;\n\n recast.visit(ast, {\n visitExportDefaultDeclaration() {\n isESM = true;\n\n return false;\n },\n visitImportDeclaration() {\n isESM = true;\n\n return false;\n },\n });\n\n recast.visit(ast, {\n visitExportDefaultDeclaration(path) {\n const decl = path.node.declaration;\n const unwrappedDecl = unwrap(decl);\n\n if (n.ObjectExpression.check(unwrappedDecl)) {\n rootObject = unwrappedDecl;\n } else if (n.Identifier.check(unwrappedDecl)) {\n const varName = unwrappedDecl.name;\n recast.visit(ast, {\n visitVariableDeclarator(vp) {\n const unwrappedInit = unwrap(vp.node.init);\n\n if (\n n.Identifier.check(vp.node.id) &&\n vp.node.id.name === varName &&\n n.ObjectExpression.check(unwrappedInit)\n ) {\n rootObject = unwrappedInit;\n }\n\n return false;\n },\n });\n }\n\n return false;\n },\n visitAssignmentExpression(path) {\n const left = path.node.left;\n\n if (n.MemberExpression.check(left)) {\n if (\n n.Identifier.check(left.object) &&\n left.object.name === 'module' &&\n n.Identifier.check(left.property) &&\n left.property.name === 'exports'\n ) {\n const unwrappedRight = unwrap(path.node.right);\n\n if (n.ObjectExpression.check(unwrappedRight)) {\n rootObject = unwrappedRight;\n }\n }\n\n if (\n n.Identifier.check(left.object) &&\n left.object.name === 'exports' &&\n n.Identifier.check(left.property) &&\n left.property.name === 'default'\n ) {\n const unwrappedRight = unwrap(path.node.right);\n\n if (n.ObjectExpression.check(unwrappedRight)) {\n rootObject = unwrappedRight;\n }\n }\n }\n this.traverse(path);\n },\n });\n\n if (!rootObject) {\n recast.visit(ast, {\n visitVariableDeclarator(path) {\n const unwrappedInit = unwrap(path.node.init);\n\n if (!rootObject && n.ObjectExpression.check(unwrappedInit)) {\n rootObject = unwrappedInit;\n }\n\n return false;\n },\n });\n }\n\n if (!rootObject) return fileContent;\n\n const requiredImports = new Set<string>();\n const effectiveFallbackLocale = (fallbackLocale as string) ?? 'en';\n\n const metadataProperties = [\n 'id',\n 'locale',\n 'filled',\n 'fill',\n 'title',\n 'description',\n 'tags',\n 'version',\n 'priority',\n 'contentAutoTransformation',\n ];\n\n if (noMetadata) {\n // Remove key, content and metadata properties if they exist\n rootObject.properties = rootObject.properties.filter((prop: any) => {\n if (n.Property.check(prop) || n.ObjectProperty.check(prop)) {\n let propName = '';\n if (n.Identifier.check(prop.key)) propName = prop.key.name;\n else if (n.StringLiteral.check(prop.key)) propName = prop.key.value;\n else if (n.Literal.check(prop.key)) propName = String(prop.key.value);\n\n return !['key', 'content', ...metadataProperties].includes(propName);\n }\n return true;\n });\n\n // Update satisfies type if exists\n recast.visit(ast, {\n visitNode(path) {\n const node = path.node;\n if (\n (n.TSSatisfiesExpression?.check(node) ||\n node.type === 'TSSatisfiesExpression') &&\n (node as any).typeAnnotation &&\n n.TSTypeReference.check((node as any).typeAnnotation) &&\n n.Identifier.check((node as any).typeAnnotation.typeName) &&\n (node as any).typeAnnotation.typeName.name === 'Dictionary'\n ) {\n (node as any).typeAnnotation = b.tsIndexedAccessType(\n b.tsTypeReference(b.identifier('Dictionary')),\n b.tsLiteralType(b.stringLiteral('content'))\n );\n }\n this.traverse(path);\n },\n });\n } else {\n for (const prop of metadataProperties) {\n if ((dictionary as any)[prop] !== undefined) {\n updateObjectLiteral(\n rootObject,\n { [prop]: (dictionary as any)[prop] },\n undefined,\n requiredImports\n );\n }\n }\n }\n\n if (dictionary.content !== undefined) {\n updateObjectLiteral(\n rootObject,\n noMetadata\n ? (dictionary.content as Record<string, any>)\n : { content: dictionary.content },\n effectiveFallbackLocale,\n requiredImports\n );\n }\n\n addImports(ast, requiredImports, isESM);\n\n return recast.print(ast).code;\n};\n"],"mappings":"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"}
|