gt 2.14.35 → 2.14.37
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/CHANGELOG.md +22 -1
- package/dist/api/collectUserEditDiffs.js +112 -155
- package/dist/api/collectUserEditDiffs.js.map +1 -0
- package/dist/api/downloadFileBatch.js +164 -241
- package/dist/api/downloadFileBatch.js.map +1 -0
- package/dist/api/saveLocalEdits.js +37 -41
- package/dist/api/saveLocalEdits.js.map +1 -0
- package/dist/bin/bin-entry.js +17 -7
- package/dist/bin/bin-entry.js.map +1 -0
- package/dist/bin/bin-main.js +43 -61
- package/dist/bin/bin-main.js.map +1 -0
- package/dist/cli/base.js +382 -497
- package/dist/cli/base.js.map +1 -0
- package/dist/cli/commands/download.js +41 -49
- package/dist/cli/commands/download.js.map +1 -0
- package/dist/cli/commands/enqueue.js +26 -25
- package/dist/cli/commands/enqueue.js.map +1 -0
- package/dist/cli/commands/setupProject.js +33 -36
- package/dist/cli/commands/setupProject.js.map +1 -0
- package/dist/cli/commands/stage.js +53 -61
- package/dist/cli/commands/stage.js.map +1 -0
- package/dist/cli/commands/translate.js +75 -112
- package/dist/cli/commands/translate.js.map +1 -0
- package/dist/cli/commands/upload.js +185 -213
- package/dist/cli/commands/upload.js.map +1 -0
- package/dist/cli/commands/utils/validation.js +39 -34
- package/dist/cli/commands/utils/validation.js.map +1 -0
- package/dist/cli/flags.js +35 -62
- package/dist/cli/flags.js.map +1 -0
- package/dist/cli/inline.js +112 -137
- package/dist/cli/inline.js.map +1 -0
- package/dist/cli/next.js +17 -12
- package/dist/cli/next.js.map +1 -0
- package/dist/cli/node.js +19 -15
- package/dist/cli/node.js.map +1 -0
- package/dist/cli/python.js +13 -8
- package/dist/cli/python.js.map +1 -0
- package/dist/cli/react.js +61 -78
- package/dist/cli/react.js.map +1 -0
- package/dist/config/defaults.js +16 -11
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/generateSettings.js +167 -269
- package/dist/config/generateSettings.js.map +1 -0
- package/dist/config/optionPresets.js +78 -96
- package/dist/config/optionPresets.js.map +1 -0
- package/dist/config/resolveConfig.js +27 -32
- package/dist/config/resolveConfig.js.map +1 -0
- package/dist/config/utils.js +7 -3
- package/dist/config/utils.js.map +1 -0
- package/dist/config/validateSettings.js +19 -30
- package/dist/config/validateSettings.js.map +1 -0
- package/dist/console/colors.js +18 -13
- package/dist/console/colors.js.map +1 -0
- package/dist/console/displayTranslateSummary.js +40 -37
- package/dist/console/displayTranslateSummary.js.map +1 -0
- package/dist/console/formatting.js +8 -5
- package/dist/console/formatting.js.map +1 -0
- package/dist/console/index.d.ts +11 -9
- package/dist/console/index.js +53 -50
- package/dist/console/index.js.map +1 -0
- package/dist/console/inkFields.d.ts +23 -0
- package/dist/console/inkFields.js +87 -0
- package/dist/console/inkFields.js.map +1 -0
- package/dist/console/inkLayout.d.ts +7 -0
- package/dist/console/inkLayout.js +139 -0
- package/dist/console/inkLayout.js.map +1 -0
- package/dist/console/inkLocaleData.d.ts +4 -0
- package/dist/console/inkLocaleData.js +32 -0
- package/dist/console/inkLocaleData.js.map +1 -0
- package/dist/console/inkPrompts.d.ts +8 -0
- package/dist/console/inkPrompts.js +496 -0
- package/dist/console/inkPrompts.js.map +1 -0
- package/dist/console/inkSession.d.ts +3 -0
- package/dist/console/inkSession.js +42 -0
- package/dist/console/inkSession.js.map +1 -0
- package/dist/console/inkTerminal.d.ts +4 -0
- package/dist/console/inkTerminal.js +15 -0
- package/dist/console/inkTerminal.js.map +1 -0
- package/dist/console/inkTypes.d.ts +66 -0
- package/dist/console/inkTypes.js +1 -0
- package/dist/console/inkUtils.d.ts +24 -0
- package/dist/console/inkUtils.js +87 -0
- package/dist/console/inkUtils.js.map +1 -0
- package/dist/console/logger.js +209 -249
- package/dist/console/logger.js.map +1 -0
- package/dist/console/logging.d.ts +14 -0
- package/dist/console/logging.js +203 -162
- package/dist/console/logging.js.map +1 -0
- package/dist/console/promptParsing.d.ts +5 -0
- package/dist/console/promptParsing.js +28 -0
- package/dist/console/promptParsing.js.map +1 -0
- package/dist/console/terminalSession.d.ts +5 -0
- package/dist/console/terminalSession.js +38 -0
- package/dist/console/terminalSession.js.map +1 -0
- package/dist/extraction/index.js +3 -2
- package/dist/extraction/mapToUpdates.js +19 -18
- package/dist/extraction/mapToUpdates.js.map +1 -0
- package/dist/extraction/postProcess.js +68 -86
- package/dist/extraction/postProcess.js.map +1 -0
- package/dist/formats/files/aggregateFiles.js +223 -304
- package/dist/formats/files/aggregateFiles.js.map +1 -0
- package/dist/formats/files/collectFiles.js +53 -54
- package/dist/formats/files/collectFiles.js.map +1 -0
- package/dist/formats/files/convertToFileTranslationData.js +21 -19
- package/dist/formats/files/convertToFileTranslationData.js.map +1 -0
- package/dist/formats/files/fileMapping.js +82 -119
- package/dist/formats/files/fileMapping.js.map +1 -0
- package/dist/formats/files/preprocess/mdx.js +15 -12
- package/dist/formats/files/preprocess/mdx.js.map +1 -0
- package/dist/formats/files/preprocess/mintlify.js +15 -13
- package/dist/formats/files/preprocess/mintlify.js.map +1 -0
- package/dist/formats/files/preprocessContent.js +20 -21
- package/dist/formats/files/preprocessContent.js.map +1 -0
- package/dist/formats/files/save.js +18 -15
- package/dist/formats/files/save.js.map +1 -0
- package/dist/formats/files/supportedFiles.js +27 -22
- package/dist/formats/files/supportedFiles.js.map +1 -0
- package/dist/formats/files/transformFormat.js +93 -100
- package/dist/formats/files/transformFormat.js.map +1 -0
- package/dist/formats/json/extractJson.js +83 -110
- package/dist/formats/json/extractJson.js.map +1 -0
- package/dist/formats/json/flattenJson.js +41 -48
- package/dist/formats/json/flattenJson.js.map +1 -0
- package/dist/formats/json/jsonPath.js +20 -15
- package/dist/formats/json/jsonPath.js.map +1 -0
- package/dist/formats/json/jsonPointer.js +17 -17
- package/dist/formats/json/jsonPointer.js.map +1 -0
- package/dist/formats/json/mergeJson.js +230 -371
- package/dist/formats/json/mergeJson.js.map +1 -0
- package/dist/formats/json/parseJson.js +74 -111
- package/dist/formats/json/parseJson.js.map +1 -0
- package/dist/formats/json/transformJson.js +53 -61
- package/dist/formats/json/transformJson.js.map +1 -0
- package/dist/formats/json/utils.js +158 -187
- package/dist/formats/json/utils.js.map +1 -0
- package/dist/formats/parseKeyedMetadata.js +85 -106
- package/dist/formats/parseKeyedMetadata.js.map +1 -0
- package/dist/formats/utils.js +13 -23
- package/dist/formats/utils.js.map +1 -0
- package/dist/formats/yaml/extractYaml.js +32 -31
- package/dist/formats/yaml/extractYaml.js.map +1 -0
- package/dist/formats/yaml/mergeYaml.js +43 -60
- package/dist/formats/yaml/mergeYaml.js.map +1 -0
- package/dist/formats/yaml/parseYaml.js +34 -23
- package/dist/formats/yaml/parseYaml.js.map +1 -0
- package/dist/formats/yaml/utils.js +19 -21
- package/dist/formats/yaml/utils.js.map +1 -0
- package/dist/fs/clearLocaleDirs.js +82 -114
- package/dist/fs/clearLocaleDirs.js.map +1 -0
- package/dist/fs/config/downloadedVersions.js +174 -188
- package/dist/fs/config/downloadedVersions.js.map +1 -0
- package/dist/fs/config/loadConfig.js +12 -8
- package/dist/fs/config/loadConfig.js.map +1 -0
- package/dist/fs/config/parseFilesConfig.js +166 -227
- package/dist/fs/config/parseFilesConfig.js.map +1 -0
- package/dist/fs/config/setupConfig.js +43 -52
- package/dist/fs/config/setupConfig.js.map +1 -0
- package/dist/fs/config/updateConfig.js +44 -56
- package/dist/fs/config/updateConfig.js.map +1 -0
- package/dist/fs/config/updateVersions.js +27 -28
- package/dist/fs/config/updateVersions.js.map +1 -0
- package/dist/fs/copyFile.js +33 -37
- package/dist/fs/copyFile.js.map +1 -0
- package/dist/fs/createLoadTranslationsFile.js +32 -48
- package/dist/fs/createLoadTranslationsFile.js.map +1 -0
- package/dist/fs/determineFramework/detectPythonLibrary.js +30 -34
- package/dist/fs/determineFramework/detectPythonLibrary.js.map +1 -0
- package/dist/fs/determineFramework/index.js +46 -64
- package/dist/fs/determineFramework/index.js.map +1 -0
- package/dist/fs/determineFramework/matchPyprojectDependency.js +65 -78
- package/dist/fs/determineFramework/matchPyprojectDependency.js.map +1 -0
- package/dist/fs/determineFramework/matchRequirementsTxtDependency.js +21 -19
- package/dist/fs/determineFramework/matchRequirementsTxtDependency.js.map +1 -0
- package/dist/fs/determineFramework/matchSetupPyDependency.js +60 -81
- package/dist/fs/determineFramework/matchSetupPyDependency.js.map +1 -0
- package/dist/fs/determineFramework/resolveGtDependency.js +15 -15
- package/dist/fs/determineFramework/resolveGtDependency.js.map +1 -0
- package/dist/fs/findFilepath.js +63 -78
- package/dist/fs/findFilepath.js.map +1 -0
- package/dist/fs/loadJSON.js +18 -15
- package/dist/fs/loadJSON.js.map +1 -0
- package/dist/fs/matchFiles.js +12 -7
- package/dist/fs/matchFiles.js.map +1 -0
- package/dist/fs/saveJSON.js +10 -6
- package/dist/fs/saveJSON.js.map +1 -0
- package/dist/fs/utils.js +19 -15
- package/dist/fs/utils.js.map +1 -0
- package/dist/functions.d.ts +2 -1
- package/dist/functions.js +3 -6
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +6 -2
- package/dist/generated/version.js.map +1 -0
- package/dist/git/branches.js +77 -83
- package/dist/git/branches.js.map +1 -0
- package/dist/hooks/postProcess.js +97 -114
- package/dist/hooks/postProcess.js.map +1 -0
- package/dist/index.js +23 -31
- package/dist/index.js.map +1 -0
- package/dist/locadex/setupFlow.js +11 -8
- package/dist/locadex/setupFlow.js.map +1 -0
- package/dist/main.js +17 -7
- package/dist/main.js.map +1 -0
- package/dist/next/config/parseNextConfig.js +32 -51
- package/dist/next/config/parseNextConfig.js.map +1 -0
- package/dist/next/jsx/utils.js +25 -37
- package/dist/next/jsx/utils.js.map +1 -0
- package/dist/next/parse/handleInitGT.js +87 -154
- package/dist/next/parse/handleInitGT.js.map +1 -0
- package/dist/next/parse/wrapContent.js +136 -158
- package/dist/next/parse/wrapContent.js.map +1 -0
- package/dist/python/parse/createPythonInlineUpdates.js +36 -33
- package/dist/python/parse/createPythonInlineUpdates.js.map +1 -0
- package/dist/react/config/createESBuildConfig.js +115 -115
- package/dist/react/config/createESBuildConfig.js.map +1 -0
- package/dist/react/jsx/evaluateJsx.js +90 -124
- package/dist/react/jsx/evaluateJsx.js.map +1 -0
- package/dist/react/jsx/utils/buildImportMap.js +24 -28
- package/dist/react/jsx/utils/buildImportMap.js.map +1 -0
- package/dist/react/jsx/utils/constants.js +79 -87
- package/dist/react/jsx/utils/constants.js.map +1 -0
- package/dist/react/jsx/utils/extractSourceCode.js +36 -37
- package/dist/react/jsx/utils/extractSourceCode.js.map +1 -0
- package/dist/react/jsx/utils/getCalleeNameFromExpression.js +30 -30
- package/dist/react/jsx/utils/getCalleeNameFromExpression.js.map +1 -0
- package/dist/react/jsx/utils/getPathsAndAliases.js +70 -105
- package/dist/react/jsx/utils/getPathsAndAliases.js.map +1 -0
- package/dist/react/jsx/utils/isNumberLiteral.js +13 -11
- package/dist/react/jsx/utils/isNumberLiteral.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/addGTIdentifierToSyntaxTree.js +103 -148
- package/dist/react/jsx/utils/jsxParsing/addGTIdentifierToSyntaxTree.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/autoInsertion.js +305 -389
- package/dist/react/jsx/utils/jsxParsing/autoInsertion.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/handleChildrenWhitespace.js +122 -193
- package/dist/react/jsx/utils/jsxParsing/handleChildrenWhitespace.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/multiplication/findMultiplicationNode.js +50 -64
- package/dist/react/jsx/utils/jsxParsing/multiplication/findMultiplicationNode.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/multiplication/multiplyJsxTree.js +41 -68
- package/dist/react/jsx/utils/jsxParsing/multiplication/multiplyJsxTree.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/parseJsx.js +760 -1107
- package/dist/react/jsx/utils/jsxParsing/parseJsx.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/parseTProps.js +35 -71
- package/dist/react/jsx/utils/jsxParsing/parseTProps.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/removeNullChildrenFields.js +39 -58
- package/dist/react/jsx/utils/jsxParsing/removeNullChildrenFields.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/types.js +10 -24
- package/dist/react/jsx/utils/jsxParsing/types.js.map +1 -0
- package/dist/react/jsx/utils/mapAttributeName.js +13 -13
- package/dist/react/jsx/utils/mapAttributeName.js.map +1 -0
- package/dist/react/jsx/utils/parseAst.js +142 -272
- package/dist/react/jsx/utils/parseAst.js.map +1 -0
- package/dist/react/jsx/utils/parseString.js +726 -1090
- package/dist/react/jsx/utils/parseString.js.map +1 -0
- package/dist/react/jsx/utils/parseStringFunction.js +274 -401
- package/dist/react/jsx/utils/parseStringFunction.js.map +1 -0
- package/dist/react/jsx/utils/resolveImportPath.d.ts +1 -1
- package/dist/react/jsx/utils/resolveImportPath.js +125 -108
- package/dist/react/jsx/utils/resolveImportPath.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/derivation/containsDeriveCall.js +18 -24
- package/dist/react/jsx/utils/stringParsing/derivation/containsDeriveCall.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/derivation/handleDerivation.js +412 -579
- package/dist/react/jsx/utils/stringParsing/derivation/handleDerivation.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/derivation/index.js +57 -67
- package/dist/react/jsx/utils/stringParsing/derivation/index.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/derivation/isDeriveCall.js +26 -36
- package/dist/react/jsx/utils/stringParsing/derivation/isDeriveCall.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/handleTaggedTemplateTranslationCall.js +29 -24
- package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/handleTaggedTemplateTranslationCall.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/index.js +34 -32
- package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/index.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/extractStringEntryMetadata.js +80 -117
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/extractStringEntryMetadata.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleDeriveTranslationCall.js +24 -19
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleDeriveTranslationCall.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleInvalidTranslationCall.js +18 -21
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleInvalidTranslationCall.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleLiteralTranslationCall.js +45 -50
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleLiteralTranslationCall.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/index.js +54 -59
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/index.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/routeTranslationCall.js +56 -69
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/routeTranslationCall.js.map +1 -0
- package/dist/react/jsx/utils/validateStringFunction.js +21 -29
- package/dist/react/jsx/utils/validateStringFunction.js.map +1 -0
- package/dist/react/jsx/wrapJsx.js +192 -375
- package/dist/react/jsx/wrapJsx.js.map +1 -0
- package/dist/react/parse/addVitePlugin/index.js +40 -34
- package/dist/react/parse/addVitePlugin/index.js.map +1 -0
- package/dist/react/parse/addVitePlugin/installCompiler.js +18 -20
- package/dist/react/parse/addVitePlugin/installCompiler.js.map +1 -0
- package/dist/react/parse/addVitePlugin/updateViteConfig.js +107 -111
- package/dist/react/parse/addVitePlugin/updateViteConfig.js.map +1 -0
- package/dist/react/parse/addVitePlugin/utils/addCompilerImport.js +23 -26
- package/dist/react/parse/addVitePlugin/utils/addCompilerImport.js.map +1 -0
- package/dist/react/parse/addVitePlugin/utils/addPluginInvocation.js +29 -43
- package/dist/react/parse/addVitePlugin/utils/addPluginInvocation.js.map +1 -0
- package/dist/react/parse/addVitePlugin/utils/checkCompilerImport.js +70 -104
- package/dist/react/parse/addVitePlugin/utils/checkCompilerImport.js.map +1 -0
- package/dist/react/parse/addVitePlugin/utils/checkPluginInvocation.js +23 -29
- package/dist/react/parse/addVitePlugin/utils/checkPluginInvocation.js.map +1 -0
- package/dist/react/parse/createDictionaryUpdates.js +121 -185
- package/dist/react/parse/createDictionaryUpdates.js.map +1 -0
- package/dist/react/parse/createInlineUpdates.js +123 -139
- package/dist/react/parse/createInlineUpdates.js.map +1 -0
- package/dist/react/parse/wrapContent.js +131 -156
- package/dist/react/parse/wrapContent.js.map +1 -0
- package/dist/react/utils/flattenDictionary.js +55 -70
- package/dist/react/utils/flattenDictionary.js.map +1 -0
- package/dist/react/utils/getEntryAndMetadata.js +14 -10
- package/dist/react/utils/getEntryAndMetadata.js.map +1 -0
- package/dist/react/utils/getVariableName.js +36 -33
- package/dist/react/utils/getVariableName.js.map +1 -0
- package/dist/setup/detectFramework.js +85 -102
- package/dist/setup/detectFramework.js.map +1 -0
- package/dist/setup/frameworkUtils.js +17 -28
- package/dist/setup/frameworkUtils.js.map +1 -0
- package/dist/setup/userInput.js +24 -31
- package/dist/setup/userInput.js.map +1 -0
- package/dist/setup/wizard.js +141 -143
- package/dist/setup/wizard.js.map +1 -0
- package/dist/state/mintlifyRefMap.js +12 -9
- package/dist/state/mintlifyRefMap.js.map +1 -0
- package/dist/state/recentDownloads.js +26 -23
- package/dist/state/recentDownloads.js.map +1 -0
- package/dist/state/translateWarnings.js +17 -8
- package/dist/state/translateWarnings.js.map +1 -0
- package/dist/translation/parse.js +77 -98
- package/dist/translation/parse.js.map +1 -0
- package/dist/translation/stage.js +28 -43
- package/dist/translation/stage.js.map +1 -0
- package/dist/translation/validate.js +68 -91
- package/dist/translation/validate.js.map +1 -0
- package/dist/types/libraries.js +93 -91
- package/dist/types/libraries.js.map +1 -0
- package/dist/types/parsing.js +19 -10
- package/dist/types/parsing.js.map +1 -0
- package/dist/utils/addExplicitAnchorIds.js +270 -389
- package/dist/utils/addExplicitAnchorIds.js.map +1 -0
- package/dist/utils/calculateTimeoutMs.js +11 -6
- package/dist/utils/calculateTimeoutMs.js.map +1 -0
- package/dist/utils/constants.js +15 -12
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/credentials.js +67 -114
- package/dist/utils/credentials.js.map +1 -0
- package/dist/utils/fetch.js +22 -20
- package/dist/utils/fetch.js.map +1 -0
- package/dist/utils/flattenJsonFiles.js +27 -34
- package/dist/utils/flattenJsonFiles.js.map +1 -0
- package/dist/utils/gitDiff.js +30 -32
- package/dist/utils/gitDiff.js.map +1 -0
- package/dist/utils/gt.js +7 -2
- package/dist/utils/gt.js.map +1 -0
- package/dist/utils/hash.js +14 -9
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/headers.js +10 -13
- package/dist/utils/headers.js.map +1 -0
- package/dist/utils/installPackage.js +70 -75
- package/dist/utils/installPackage.js.map +1 -0
- package/dist/utils/localizeRelativeAssets.js +114 -157
- package/dist/utils/localizeRelativeAssets.js.map +1 -0
- package/dist/utils/localizeStaticImports.js +229 -371
- package/dist/utils/localizeStaticImports.js.map +1 -0
- package/dist/utils/localizeStaticUrls.js +241 -424
- package/dist/utils/localizeStaticUrls.js.map +1 -0
- package/dist/utils/mintlifyTitleFallback.js +64 -72
- package/dist/utils/mintlifyTitleFallback.js.map +1 -0
- package/dist/utils/monorepoVersionCheck.js +177 -215
- package/dist/utils/monorepoVersionCheck.js.map +1 -0
- package/dist/utils/packageInfo.js +17 -16
- package/dist/utils/packageInfo.js.map +1 -0
- package/dist/utils/packageJson.js +51 -66
- package/dist/utils/packageJson.js.map +1 -0
- package/dist/utils/packageManager.js +237 -260
- package/dist/utils/packageManager.js.map +1 -0
- package/dist/utils/parse/needsCJS.js +36 -69
- package/dist/utils/parse/needsCJS.js.map +1 -0
- package/dist/utils/persistPostprocessHashes.js +30 -32
- package/dist/utils/persistPostprocessHashes.js.map +1 -0
- package/dist/utils/processAnchorIds.js +32 -54
- package/dist/utils/processAnchorIds.js.map +1 -0
- package/dist/utils/processOpenApi.js +469 -578
- package/dist/utils/processOpenApi.js.map +1 -0
- package/dist/utils/resolveMintlifyRefs.js +89 -105
- package/dist/utils/resolveMintlifyRefs.js.map +1 -0
- package/dist/utils/resolvePublish.js +46 -54
- package/dist/utils/resolvePublish.js.map +1 -0
- package/dist/utils/sanitizeFileContent.js +20 -27
- package/dist/utils/sanitizeFileContent.js.map +1 -0
- package/dist/utils/sharedStaticAssets.js +248 -366
- package/dist/utils/sharedStaticAssets.js.map +1 -0
- package/dist/utils/splitMintlifyLanguageRefs.js +208 -282
- package/dist/utils/splitMintlifyLanguageRefs.js.map +1 -0
- package/dist/utils/validateMdx.js +26 -23
- package/dist/utils/validateMdx.js.map +1 -0
- package/dist/utils/wrapPlainUrls.js +58 -70
- package/dist/utils/wrapPlainUrls.js.map +1 -0
- package/dist/workflows/download.js +92 -126
- package/dist/workflows/download.js.map +1 -0
- package/dist/workflows/enqueue.js +47 -54
- package/dist/workflows/enqueue.js.map +1 -0
- package/dist/workflows/publish.js +29 -29
- package/dist/workflows/publish.js.map +1 -0
- package/dist/workflows/setupProject.js +39 -40
- package/dist/workflows/setupProject.js.map +1 -0
- package/dist/workflows/stage.js +61 -65
- package/dist/workflows/stage.js.map +1 -0
- package/dist/workflows/steps/BranchStep.js +118 -163
- package/dist/workflows/steps/BranchStep.js.map +1 -0
- package/dist/workflows/steps/DownloadStep.js +107 -137
- package/dist/workflows/steps/DownloadStep.js.map +1 -0
- package/dist/workflows/steps/EnqueueStep.js +32 -32
- package/dist/workflows/steps/EnqueueStep.js.map +1 -0
- package/dist/workflows/steps/PollJobsStep.js +208 -292
- package/dist/workflows/steps/PollJobsStep.js.map +1 -0
- package/dist/workflows/steps/PublishStep.js +33 -38
- package/dist/workflows/steps/PublishStep.js.map +1 -0
- package/dist/workflows/steps/SetupStep.js +71 -72
- package/dist/workflows/steps/SetupStep.js.map +1 -0
- package/dist/workflows/steps/TagStep.js +39 -44
- package/dist/workflows/steps/TagStep.js.map +1 -0
- package/dist/workflows/steps/UploadSourcesStep.js +108 -140
- package/dist/workflows/steps/UploadSourcesStep.js.map +1 -0
- package/dist/workflows/steps/UploadTranslationsStep.js +61 -71
- package/dist/workflows/steps/UploadTranslationsStep.js.map +1 -0
- package/dist/workflows/steps/UserEditDiffsStep.js +32 -34
- package/dist/workflows/steps/UserEditDiffsStep.js.map +1 -0
- package/dist/workflows/steps/WorkflowStep.js +6 -2
- package/dist/workflows/steps/WorkflowStep.js.map +1 -0
- package/dist/workflows/upload.js +45 -46
- package/dist/workflows/upload.js.map +1 -0
- package/package.json +14 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharedStaticAssets.js","names":[],"sources":["../../src/utils/sharedStaticAssets.ts"],"sourcesContent":["import path from 'node:path';\nimport fs from 'node:fs';\nimport fg from 'fast-glob';\nimport { unified } from 'unified';\nimport remarkParse from 'remark-parse';\nimport remarkMdx from 'remark-mdx';\nimport remarkFrontmatter from 'remark-frontmatter';\nimport remarkStringify from 'remark-stringify';\nimport { visit } from 'unist-util-visit';\nimport type { Literal, Root } from 'mdast';\nimport { escapeHtmlInTextNodes, normalizeCJKCharacters } from 'gt-remark';\nimport type { Settings } from '../types/index.js';\nimport { createFileMapping } from '../formats/files/fileMapping.js';\nimport { TEMPLATE_FILE_NAME } from './constants.js';\n\ntype MdxAssetNode = {\n type?: string;\n name?: unknown;\n attributes?: unknown;\n url?: unknown;\n};\n\ntype MdxAttribute = {\n type?: string;\n name?: string;\n value?: unknown;\n};\n\nfunction derivePublicPath(outDir: string, provided?: string): string {\n if (provided) return provided;\n const norm = outDir.replace(/\\\\/g, '/');\n if (norm.startsWith('public/')) return '/' + norm.slice('public/'.length);\n if (norm.startsWith('static/')) return '/' + norm.slice('static/'.length);\n if (norm.startsWith('/')) return norm; // already absolute URL path\n return '/' + path.basename(norm);\n}\n\nfunction toArray<T>(val: T | T[] | undefined): T[] {\n if (!val) return [];\n return Array.isArray(val) ? val : [val];\n}\n\nasync function ensureDir(dir: string) {\n await fs.promises.mkdir(dir, { recursive: true });\n}\n\nasync function moveFile(src: string, dest: string) {\n if (src === dest) return;\n try {\n await ensureDir(path.dirname(dest));\n await fs.promises.rename(src, dest);\n } catch (err: unknown) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n // Fallback to copy+unlink for cross-device or existing files\n if (code === 'EXDEV' || code === 'EEXIST' || code === 'ENOTEMPTY') {\n const data = await fs.promises.readFile(src);\n await ensureDir(path.dirname(dest));\n await fs.promises.writeFile(dest, data);\n try {\n await fs.promises.unlink(src);\n } catch {\n // Ignore cleanup errors for source files that were already moved.\n }\n } else if (code === 'ENOENT') {\n // already moved or missing; ignore\n return;\n } else {\n throw err;\n }\n }\n}\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await fs.promises.stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isDirEmpty(dir: string): Promise<boolean> {\n try {\n const entries = await fs.promises.readdir(dir);\n return entries.length === 0;\n } catch {\n return false;\n }\n}\n\nasync function removeEmptyDirsUpwards(startDir: string, stopDir: string) {\n let current = path.resolve(startDir);\n const stop = path.resolve(stopDir);\n while (current.startsWith(stop)) {\n if (current === stop) break;\n const exists = await pathExists(current);\n if (!exists) break;\n const empty = await isDirEmpty(current);\n if (!empty) break;\n try {\n await fs.promises.rmdir(current);\n } catch {\n break;\n }\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n}\n\nfunction stripQueryAndHash(url: string): { base: string; suffix: string } {\n const match = url.match(/^[^?#]+/);\n const base = match ? match[0] : url;\n const suffix = url.slice(base.length);\n return { base, suffix };\n}\n\nfunction rewriteMdxContent(\n content: string,\n filePath: string,\n pathMap: Map<string, string>\n): { content: string; changed: boolean } {\n let changed = false;\n\n let ast: Root;\n try {\n const processor = unified()\n .use(remarkParse)\n .use(remarkFrontmatter, ['yaml', 'toml'])\n .use(remarkMdx);\n ast = processor.runSync(processor.parse(content)) as Root;\n } catch {\n return { content, changed: false };\n }\n\n const fileDir = path.dirname(filePath);\n\n // Helper to resolve and possibly rewrite a URL\n const maybeRewrite = (url: string): string | null => {\n if (\n !url ||\n /^(https?:)?\\/\\//i.test(url) ||\n url.startsWith('data:') ||\n url.startsWith('#') ||\n url.startsWith('mailto:') ||\n url.startsWith('tel:')\n ) {\n return null;\n }\n const { base, suffix } = stripQueryAndHash(url);\n // Only handle relative paths\n if (base.startsWith('/')) return null;\n const abs = path.resolve(fileDir, base);\n const normAbs = path.normalize(abs);\n const mapped = pathMap.get(normAbs);\n if (mapped) {\n changed = true;\n return mapped + suffix;\n }\n return null;\n };\n\n visit(ast, (node) => {\n const assetNode = node as MdxAssetNode;\n // Markdown image: \n if (assetNode.type === 'image' && typeof assetNode.url === 'string') {\n const newUrl = maybeRewrite(assetNode.url);\n if (newUrl) assetNode.url = newUrl;\n return;\n }\n // Markdown link: [text](url) — useful for PDFs and other downloadable assets\n if (assetNode.type === 'link' && typeof assetNode.url === 'string') {\n const newUrl = maybeRewrite(assetNode.url);\n if (newUrl) assetNode.url = newUrl;\n return;\n }\n // MDX <img src=\"...\" />\n if (\n (assetNode.type === 'mdxJsxFlowElement' ||\n assetNode.type === 'mdxJsxTextElement') &&\n Array.isArray(assetNode.attributes)\n ) {\n for (const attr of assetNode.attributes) {\n const attribute = attr as MdxAttribute;\n if (\n attribute.type === 'mdxJsxAttribute' &&\n (attribute.name === 'src' || attribute.name === 'href') &&\n typeof attribute.value === 'string'\n ) {\n const newUrl = maybeRewrite(attribute.value);\n if (newUrl) attribute.value = newUrl;\n }\n }\n }\n });\n\n try {\n const s = unified()\n .use(remarkFrontmatter, ['yaml', 'toml'])\n .use(remarkMdx)\n .use(normalizeCJKCharacters)\n .use(escapeHtmlInTextNodes)\n .use(remarkStringify, {\n handlers: {\n text(node: Literal) {\n return node.value;\n },\n },\n });\n const outTree = s.runSync(ast) as Root;\n let out = s.stringify(outTree);\n // Preserve trailing/leading newlines similar to localizeStaticUrls\n if (out.endsWith('\\n') && !content.endsWith('\\n')) out = out.slice(0, -1);\n if (content.startsWith('\\n') && !out.startsWith('\\n')) out = '\\n' + out;\n return { content: out, changed };\n } catch {\n return { content, changed: false };\n }\n}\n\nfunction resolveAssetPaths(include: string[], cwd: string): Set<string> {\n const assetPaths = new Set<string>();\n for (let pattern of include) {\n if (pattern.startsWith('/')) pattern = pattern.slice(1);\n const matches = fg.sync(path.resolve(cwd, pattern), { absolute: true });\n for (const m of matches) assetPaths.add(path.normalize(m));\n }\n return assetPaths;\n}\n\nexport async function mirrorAssetsToLocales(settings: Settings) {\n const cfg = settings.sharedStaticAssets;\n if (!cfg?.mirrorToLocales) return;\n if (!settings.files) return;\n\n const cwd = process.cwd();\n const include = toArray(cfg.include);\n if (include.length === 0) return;\n\n const assetPaths = resolveAssetPaths(include, cwd);\n if (assetPaths.size === 0) return;\n\n const { resolvedPaths, placeholderPaths, transformPaths, transformFormats } =\n settings.files;\n const targetLocales = settings.locales.filter(\n (l) => l !== settings.defaultLocale\n );\n if (targetLocales.length === 0) return;\n\n const fileMapping = createFileMapping(\n resolvedPaths,\n placeholderPaths,\n transformPaths,\n transformFormats,\n targetLocales,\n settings.defaultLocale\n );\n\n for (const locale of targetLocales) {\n const filesMap = fileMapping[locale];\n if (!filesMap) continue;\n\n // Extract unique (sourceDir, targetDir) pairs from the file mapping\n const dirPairs = new Map<string, string>();\n for (const [sourcePath, targetPath] of Object.entries(filesMap)) {\n if (sourcePath === TEMPLATE_FILE_NAME) continue;\n const sourceDir = path.dirname(path.resolve(cwd, sourcePath));\n const targetDir = path.dirname(path.resolve(cwd, targetPath));\n if (sourceDir !== targetDir) {\n dirPairs.set(sourceDir, targetDir);\n }\n }\n\n if (dirPairs.size === 0) continue;\n\n // Derive ancestor directory pairs by walking up from each known pair.\n // e.g. if docs/guide → ja/docs/guide, infer docs → ja/docs.\n // Stop at cwd or when an existing pair conflicts.\n const ancestorPairs = new Map<string, string>();\n for (const [sourceDir, targetDir] of dirPairs) {\n let s = path.dirname(sourceDir);\n let t = path.dirname(targetDir);\n while (s.startsWith(cwd) && s !== cwd) {\n const existing = dirPairs.get(s) ?? ancestorPairs.get(s);\n if (existing !== undefined) {\n if (existing !== t) break; // conflict — different transforms\n } else {\n ancestorPairs.set(s, t);\n }\n s = path.dirname(s);\n t = path.dirname(t);\n }\n }\n for (const [s, t] of ancestorPairs) {\n dirPairs.set(s, t);\n }\n\n // Sort source dirs by length descending so longest prefix matches first\n const sortedPairs = [...dirPairs.entries()].sort(\n (a, b) => b[0].length - a[0].length\n );\n\n for (const assetAbs of assetPaths) {\n // Find the directory pair whose sourceDir is the longest prefix of the asset\n let bestSource: string | undefined;\n let bestTarget: string | undefined;\n for (const [sourceDir, targetDir] of sortedPairs) {\n if (\n assetAbs.startsWith(sourceDir + path.sep) ||\n assetAbs.startsWith(sourceDir + '/')\n ) {\n bestSource = sourceDir;\n bestTarget = targetDir;\n break;\n }\n }\n if (!bestSource || !bestTarget) continue;\n\n const relFromSource = path.relative(bestSource, assetAbs);\n const targetAsset = path.resolve(bestTarget, relFromSource);\n\n // Skip if target already exists with same size\n try {\n const [srcStat, dstStat] = await Promise.all([\n fs.promises.stat(assetAbs),\n fs.promises.stat(targetAsset),\n ]);\n if (dstStat.isFile() && srcStat.size === dstStat.size) continue;\n } catch {\n // target doesn't exist, proceed with copy\n }\n\n await ensureDir(path.dirname(targetAsset));\n await fs.promises.copyFile(assetAbs, targetAsset);\n }\n }\n}\n\n/**\n * If you specify in config you have blob patterns pointing to assets (jpg, png, etc.)\n * Moves static assets into a specified directory and goes thru src files and updates refrence to static assets\n * @param settings\n * @returns\n */\nexport default async function processSharedStaticAssets(settings: Settings) {\n const cfg = settings.sharedStaticAssets;\n if (!cfg) return;\n\n // mirrorToLocales is handled separately after translations are downloaded\n if (cfg.mirrorToLocales) return;\n\n const cwd = process.cwd();\n const include = toArray(cfg.include);\n if (include.length === 0) return;\n\n // Resolve assets\n const assetPaths = resolveAssetPaths(include, cwd);\n if (assetPaths.size === 0) return;\n\n if (!cfg.outDir) return;\n\n const outDirInput = cfg.outDir.startsWith('/')\n ? cfg.outDir.slice(1)\n : cfg.outDir;\n const outDirAbs = path.resolve(cwd, outDirInput);\n const publicPath = derivePublicPath(outDirInput, cfg.publicPath);\n\n // Map original absolute path -> public URL\n const originalToPublic = new Map<string, string>();\n for (const abs of assetPaths) {\n const relFromRoot = path.relative(cwd, abs).replace(/\\\\/g, '/');\n const publicUrl =\n (publicPath.endsWith('/') ? publicPath.slice(0, -1) : publicPath) +\n '/' +\n relFromRoot;\n originalToPublic.set(path.normalize(abs), publicUrl);\n }\n\n // Move assets to outDir, preserving relative structure\n for (const abs of assetPaths) {\n const relFromRoot = path.relative(cwd, abs);\n const destAbs = path.resolve(outDirAbs, relFromRoot);\n // Skip if already in destination\n if (path.normalize(abs) === path.normalize(destAbs)) continue;\n // If destination exists, assume already moved\n try {\n const st = await fs.promises.stat(destAbs).catch(() => null);\n if (st && st.isFile()) {\n // Remove source if it still exists\n await fs.promises.unlink(abs).catch(() => {\n // Ignore missing source files.\n });\n await removeEmptyDirsUpwards(path.dirname(abs), cwd);\n continue;\n }\n } catch {\n // If stat/removal fails, fall through to the normal move path.\n }\n await moveFile(abs, destAbs);\n await removeEmptyDirsUpwards(path.dirname(abs), cwd);\n }\n\n // Rewrite references in default-locale files we send for translation\n const resolved = settings.files?.resolvedPaths || {};\n const mdFiles = [...(resolved.mdx || []), ...(resolved.md || [])];\n\n await Promise.all(\n mdFiles.map(async (filePath) => {\n // only rewrite existing files\n const exists = await fs.promises\n .stat(filePath)\n .then(() => true)\n .catch(() => false);\n if (!exists) return;\n const orig = await fs.promises.readFile(filePath, 'utf8');\n const { content: out, changed } = rewriteMdxContent(\n orig,\n filePath,\n originalToPublic\n );\n if (changed) {\n await fs.promises.writeFile(filePath, out, 'utf8');\n }\n })\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,310 +1,236 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
1
|
+
import { logger } from "../console/logger.js";
|
|
2
|
+
import { validateJsonSchema } from "../formats/json/utils.js";
|
|
3
|
+
import { clearStoredRefMap, getStoredRefMap } from "../state/mintlifyRefMap.js";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import { getLocaleProperties } from "@generaltranslation/format";
|
|
7
|
+
import { JSONPath } from "jsonpath-plus";
|
|
8
|
+
//#region src/utils/splitMintlifyLanguageRefs.ts
|
|
8
9
|
function isJsonContainer(value) {
|
|
9
|
-
|
|
10
|
+
return typeof value === "object" && value !== null;
|
|
10
11
|
}
|
|
11
12
|
/**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (splitConfig) {
|
|
45
|
-
processSplitEntries(fileJson, compositeFilePath, docsDir, splitConfig, settings, refMap);
|
|
46
|
-
}
|
|
47
|
-
// Restore top-level refs if any exist
|
|
48
|
-
if (refMap && refMap.size > 0) {
|
|
49
|
-
restoreTopLevelRefs(fileJson, refMap, splitConfig);
|
|
50
|
-
}
|
|
51
|
-
// Always write the composite file back — splitEntries modified the
|
|
52
|
-
// languages array, and restoreTopLevelRefs may not have written it
|
|
53
|
-
// (e.g., when all refs are inside language entries, not top-level)
|
|
54
|
-
fs.writeFileSync(compositeFilePath, JSON.stringify(fileJson, null, 2), 'utf-8');
|
|
55
|
-
}
|
|
56
|
-
finally {
|
|
57
|
-
clearStoredRefMap();
|
|
58
|
-
}
|
|
13
|
+
* Post-processing step for composite JSON files with splitEntries enabled.
|
|
14
|
+
*
|
|
15
|
+
* After mergeJson writes a fully-inlined composite file, this function:
|
|
16
|
+
* 1. Restores the original $ref structure (if the source used $ref / resolveRefs)
|
|
17
|
+
* 2. Extracts non-default keyed entries into their own ref files
|
|
18
|
+
* to keep the source file compact
|
|
19
|
+
*
|
|
20
|
+
* Driven entirely by the jsonSchema config — reads the composite path,
|
|
21
|
+
* key field, and splitEntries flag from the schema.
|
|
22
|
+
*/
|
|
23
|
+
async function splitMintlifyLanguageRefs(settings) {
|
|
24
|
+
const refMap = getStoredRefMap();
|
|
25
|
+
try {
|
|
26
|
+
const resolvedJsonPaths = settings.files?.resolvedPaths?.json;
|
|
27
|
+
if (!resolvedJsonPaths) return;
|
|
28
|
+
const targetFile = findTargetFile(resolvedJsonPaths, settings);
|
|
29
|
+
if (!targetFile) return;
|
|
30
|
+
const { filePath: compositeFilePath, splitConfig } = targetFile;
|
|
31
|
+
if (!fs.existsSync(compositeFilePath)) return;
|
|
32
|
+
let fileJson;
|
|
33
|
+
try {
|
|
34
|
+
fileJson = JSON.parse(fs.readFileSync(compositeFilePath, "utf-8"));
|
|
35
|
+
} catch {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const docsDir = path.dirname(compositeFilePath);
|
|
39
|
+
if (splitConfig) processSplitEntries(fileJson, compositeFilePath, docsDir, splitConfig, settings, refMap);
|
|
40
|
+
if (refMap && refMap.size > 0) restoreTopLevelRefs(fileJson, refMap, splitConfig);
|
|
41
|
+
fs.writeFileSync(compositeFilePath, JSON.stringify(fileJson, null, 2), "utf-8");
|
|
42
|
+
} finally {
|
|
43
|
+
clearStoredRefMap();
|
|
44
|
+
}
|
|
59
45
|
}
|
|
60
46
|
/**
|
|
61
|
-
|
|
62
|
-
|
|
47
|
+
* Find the target file and extract split configuration from the schema.
|
|
48
|
+
*/
|
|
63
49
|
function findTargetFile(resolvedPaths, settings) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
return { filePath, schema, splitConfig };
|
|
93
|
-
}
|
|
94
|
-
return null;
|
|
50
|
+
if (!settings.options?.jsonSchema) return null;
|
|
51
|
+
for (const filePath of resolvedPaths) {
|
|
52
|
+
const schema = validateJsonSchema(settings.options, filePath);
|
|
53
|
+
if (!schema) continue;
|
|
54
|
+
const hasSplitEntries = schema.composite ? Object.entries(schema.composite).some(([, opts]) => opts.splitEntries) : false;
|
|
55
|
+
const hasResolveRefs = schema.resolveRefs;
|
|
56
|
+
if (!hasSplitEntries && !hasResolveRefs) continue;
|
|
57
|
+
let splitConfig = null;
|
|
58
|
+
if (schema.composite) {
|
|
59
|
+
for (const [compositePath, opts] of Object.entries(schema.composite)) if (opts.splitEntries && opts.type === "array" && opts.key) {
|
|
60
|
+
splitConfig = {
|
|
61
|
+
compositePath,
|
|
62
|
+
jsonPointer: jsonPathToPointer(compositePath),
|
|
63
|
+
keyField: opts.key,
|
|
64
|
+
keyJsonPath: opts.key,
|
|
65
|
+
sourceObjectOptions: opts
|
|
66
|
+
};
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
filePath,
|
|
72
|
+
schema,
|
|
73
|
+
splitConfig
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
95
77
|
}
|
|
96
78
|
/**
|
|
97
|
-
|
|
98
|
-
|
|
79
|
+
* Process splitEntries: extract non-default keyed entries into ref files.
|
|
80
|
+
*/
|
|
99
81
|
function processSplitEntries(fileJson, compositeFilePath, docsDir, splitConfig, settings, refMap) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
}
|
|
173
|
-
// Extract each non-default entry into its own ref file
|
|
174
|
-
const navFileName = navRefEntry
|
|
175
|
-
? path.basename(navRefEntry.sourceFile)
|
|
176
|
-
: path.basename(compositeFilePath);
|
|
177
|
-
// Get the actual property name from the key JSONPath (e.g., "$.language" → "language")
|
|
178
|
-
const keyPropertyName = keyJsonPath.replace(/^\$\.?/, '');
|
|
179
|
-
for (let i = 0; i < entries.length; i++) {
|
|
180
|
-
const entry = entries[i];
|
|
181
|
-
if (!entry || typeof entry !== 'object')
|
|
182
|
-
continue;
|
|
183
|
-
const keyValues = JSONPath({
|
|
184
|
-
json: entry,
|
|
185
|
-
path: keyJsonPath,
|
|
186
|
-
resultType: 'value',
|
|
187
|
-
flatten: true,
|
|
188
|
-
wrap: true,
|
|
189
|
-
});
|
|
190
|
-
const keyValue = keyValues?.[0];
|
|
191
|
-
if (typeof keyValue !== 'string' || keyValue === defaultKeyValue)
|
|
192
|
-
continue;
|
|
193
|
-
if (!isJsonContainer(entry) || Array.isArray(entry))
|
|
194
|
-
continue;
|
|
195
|
-
const { [keyPropertyName]: _, ...contentWithoutKey } = entry;
|
|
196
|
-
const entryFileName = `${keyValue}/${navFileName}`;
|
|
197
|
-
const entryFilePath = path.resolve(navDir, entryFileName);
|
|
198
|
-
writeJsonFile(entryFilePath, contentWithoutKey);
|
|
199
|
-
entries[i] = { [keyPropertyName]: keyValue, $ref: `./${entryFileName}` };
|
|
200
|
-
}
|
|
201
|
-
logger.info(`Split keyed entries into ref files`);
|
|
82
|
+
const { jsonPointer, keyJsonPath } = splitConfig;
|
|
83
|
+
const parentPointer = jsonPointer.split("/").slice(0, -1).join("/") || "";
|
|
84
|
+
const arrayKey = jsonPointer.split("/").pop() || "";
|
|
85
|
+
const navRefEntry = parentPointer ? refMap?.get(parentPointer) : void 0;
|
|
86
|
+
const arrayContainer = parentPointer ? getAtPointer(fileJson, parentPointer) : fileJson;
|
|
87
|
+
if (!isJsonContainer(arrayContainer)) return;
|
|
88
|
+
const entries = Array.isArray(arrayContainer) ? arrayContainer[Number(arrayKey)] : arrayContainer[arrayKey];
|
|
89
|
+
if (!Array.isArray(entries) || entries.length <= 1) return;
|
|
90
|
+
const defaultKeyValue = getDefaultKeyValue(settings.defaultLocale, splitConfig.sourceObjectOptions);
|
|
91
|
+
const defaultIndex = entries.findIndex((e) => {
|
|
92
|
+
if (!e || typeof e !== "object") return false;
|
|
93
|
+
return JSONPath({
|
|
94
|
+
json: e,
|
|
95
|
+
path: keyJsonPath,
|
|
96
|
+
resultType: "value",
|
|
97
|
+
flatten: true,
|
|
98
|
+
wrap: true
|
|
99
|
+
})?.[0] === defaultKeyValue;
|
|
100
|
+
});
|
|
101
|
+
if (defaultIndex < 0) return;
|
|
102
|
+
const navDir = navRefEntry ? path.dirname(navRefEntry.sourceFile) : docsDir;
|
|
103
|
+
if (refMap && refMap.size > 0) {
|
|
104
|
+
const internalRefs = collectInternalRefs(refMap, `${jsonPointer}/${defaultIndex}`);
|
|
105
|
+
if (internalRefs.length > 0) {
|
|
106
|
+
const defaultEntry = entries[defaultIndex];
|
|
107
|
+
for (const ref of internalRefs) setAtPointer(defaultEntry, ref.relativePointer, { $ref: ref.refPath });
|
|
108
|
+
for (const entry of entries) {
|
|
109
|
+
const entryKeyValues = JSONPath({
|
|
110
|
+
json: entry,
|
|
111
|
+
path: keyJsonPath,
|
|
112
|
+
resultType: "value",
|
|
113
|
+
flatten: true,
|
|
114
|
+
wrap: true
|
|
115
|
+
});
|
|
116
|
+
if (entryKeyValues?.[0] === defaultKeyValue) continue;
|
|
117
|
+
for (const ref of internalRefs) {
|
|
118
|
+
const subtree = getAtPointer(entry, ref.relativePointer);
|
|
119
|
+
if (subtree === void 0) continue;
|
|
120
|
+
const originalAbsPath = path.resolve(ref.resolvedDir, ref.refPath);
|
|
121
|
+
const relToNavDir = path.relative(navDir, originalAbsPath);
|
|
122
|
+
const keyValue = typeof entryKeyValues?.[0] === "string" ? entryKeyValues[0] : "unknown";
|
|
123
|
+
const localeRelPath = path.join(keyValue, relToNavDir);
|
|
124
|
+
writeJsonFile(path.resolve(navDir, localeRelPath), subtree);
|
|
125
|
+
setAtPointer(entry, ref.relativePointer, { $ref: ref.refPath });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
logger.info(`Restored $ref structure for default entry`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const navFileName = navRefEntry ? path.basename(navRefEntry.sourceFile) : path.basename(compositeFilePath);
|
|
132
|
+
const keyPropertyName = keyJsonPath.replace(/^\$\.?/, "");
|
|
133
|
+
for (let i = 0; i < entries.length; i++) {
|
|
134
|
+
const entry = entries[i];
|
|
135
|
+
if (!entry || typeof entry !== "object") continue;
|
|
136
|
+
const keyValue = JSONPath({
|
|
137
|
+
json: entry,
|
|
138
|
+
path: keyJsonPath,
|
|
139
|
+
resultType: "value",
|
|
140
|
+
flatten: true,
|
|
141
|
+
wrap: true
|
|
142
|
+
})?.[0];
|
|
143
|
+
if (typeof keyValue !== "string" || keyValue === defaultKeyValue) continue;
|
|
144
|
+
if (!isJsonContainer(entry) || Array.isArray(entry)) continue;
|
|
145
|
+
const { [keyPropertyName]: _, ...contentWithoutKey } = entry;
|
|
146
|
+
const entryFileName = `${keyValue}/${navFileName}`;
|
|
147
|
+
writeJsonFile(path.resolve(navDir, entryFileName), contentWithoutKey);
|
|
148
|
+
entries[i] = {
|
|
149
|
+
[keyPropertyName]: keyValue,
|
|
150
|
+
$ref: `./${entryFileName}`
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
logger.info(`Split keyed entries into ref files`);
|
|
202
154
|
}
|
|
203
155
|
/**
|
|
204
|
-
|
|
205
|
-
|
|
156
|
+
* Get the identifying key value for the default locale.
|
|
157
|
+
*/
|
|
206
158
|
function getDefaultKeyValue(defaultLocale, sourceObjectOptions) {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
localeProperties.code ||
|
|
211
|
-
defaultLocale);
|
|
159
|
+
const localeProperty = sourceObjectOptions.localeProperty || "code";
|
|
160
|
+
const localeProperties = getLocaleProperties(defaultLocale);
|
|
161
|
+
return localeProperties[localeProperty] || localeProperties.code || defaultLocale;
|
|
212
162
|
}
|
|
213
163
|
/**
|
|
214
|
-
|
|
215
|
-
|
|
164
|
+
* Convert a JSONPath like "$.navigation.languages" to a JSON pointer like "/navigation/languages".
|
|
165
|
+
*/
|
|
216
166
|
function jsonPathToPointer(jsonPath) {
|
|
217
|
-
|
|
218
|
-
.replace(/^\$\.?/, '')
|
|
219
|
-
.split('.')
|
|
220
|
-
.filter(Boolean)
|
|
221
|
-
.map((segment) => `/${segment}`)
|
|
222
|
-
.join('');
|
|
167
|
+
return jsonPath.replace(/^\$\.?/, "").split(".").filter(Boolean).map((segment) => `/${segment}`).join("");
|
|
223
168
|
}
|
|
224
169
|
/**
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
170
|
+
* Restore top-level $ref pointers in the composite file.
|
|
171
|
+
* Sorted deepest-first so nested refs are written before parents.
|
|
172
|
+
*/
|
|
228
173
|
function restoreTopLevelRefs(fileJson, refMap, splitConfig) {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
const subtree = getAtPointer(fileJson, pointer);
|
|
238
|
-
if (subtree === undefined)
|
|
239
|
-
continue;
|
|
240
|
-
writeJsonFile(entry.sourceFile, subtree);
|
|
241
|
-
setAtPointer(fileJson, pointer, { $ref: entry.refPath });
|
|
242
|
-
}
|
|
174
|
+
const arrayPointerPattern = splitConfig ? new RegExp(`^${splitConfig.jsonPointer.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\/\\d+`) : null;
|
|
175
|
+
const entries = [...refMap.entries()].filter(([pointer]) => !arrayPointerPattern || !arrayPointerPattern.test(pointer)).sort(([a], [b]) => b.length - a.length);
|
|
176
|
+
for (const [pointer, entry] of entries) {
|
|
177
|
+
const subtree = getAtPointer(fileJson, pointer);
|
|
178
|
+
if (subtree === void 0) continue;
|
|
179
|
+
writeJsonFile(entry.sourceFile, subtree);
|
|
180
|
+
setAtPointer(fileJson, pointer, { $ref: entry.refPath });
|
|
181
|
+
}
|
|
243
182
|
}
|
|
244
183
|
/**
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
184
|
+
* Collect refMap entries that describe an entry's internal $ref chain.
|
|
185
|
+
* Sorted deepest-first so nested content is extracted before parents.
|
|
186
|
+
*/
|
|
248
187
|
function collectInternalRefs(refMap, entryPointerPrefix) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
return refs;
|
|
188
|
+
const refs = [];
|
|
189
|
+
for (const [pointer, entry] of refMap.entries()) {
|
|
190
|
+
if (!pointer.startsWith(entryPointerPrefix + "/")) continue;
|
|
191
|
+
refs.push({
|
|
192
|
+
relativePointer: pointer.slice(entryPointerPrefix.length),
|
|
193
|
+
refPath: entry.refPath,
|
|
194
|
+
resolvedDir: entry.containingDir
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
refs.sort((a, b) => b.relativePointer.length - a.relativePointer.length);
|
|
198
|
+
return refs;
|
|
261
199
|
}
|
|
262
200
|
function writeJsonFile(filePath, data) {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
}
|
|
267
|
-
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
201
|
+
const dir = path.dirname(filePath);
|
|
202
|
+
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
203
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), "utf-8");
|
|
268
204
|
}
|
|
269
205
|
function getAtPointer(obj, pointer) {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
? current[index]
|
|
280
|
-
: current[index];
|
|
281
|
-
}
|
|
282
|
-
return current;
|
|
206
|
+
if (!pointer || pointer === "/") return obj;
|
|
207
|
+
const parts = pointer.split("/").filter(Boolean);
|
|
208
|
+
let current = obj;
|
|
209
|
+
for (const part of parts) {
|
|
210
|
+
if (!isJsonContainer(current)) return void 0;
|
|
211
|
+
const index = /^\d+$/.test(part) ? parseInt(part) : part;
|
|
212
|
+
current = Array.isArray(current) ? current[index] : current[index];
|
|
213
|
+
}
|
|
214
|
+
return current;
|
|
283
215
|
}
|
|
284
216
|
function setAtPointer(obj, pointer, value) {
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
const lastPart = parts[parts.length - 1];
|
|
301
|
-
const lastIndex = /^\d+$/.test(lastPart) ? parseInt(lastPart) : lastPart;
|
|
302
|
-
if (!isJsonContainer(current))
|
|
303
|
-
return;
|
|
304
|
-
if (Array.isArray(current)) {
|
|
305
|
-
current[lastIndex] = value;
|
|
306
|
-
}
|
|
307
|
-
else {
|
|
308
|
-
current[lastIndex] = value;
|
|
309
|
-
}
|
|
217
|
+
if (!pointer || pointer === "/") return;
|
|
218
|
+
const parts = pointer.split("/").filter(Boolean);
|
|
219
|
+
let current = obj;
|
|
220
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
221
|
+
if (!isJsonContainer(current)) return;
|
|
222
|
+
const index = /^\d+$/.test(parts[i]) ? parseInt(parts[i]) : parts[i];
|
|
223
|
+
const next = Array.isArray(current) ? current[index] : current[index];
|
|
224
|
+
if (next === void 0) return;
|
|
225
|
+
current = next;
|
|
226
|
+
}
|
|
227
|
+
const lastPart = parts[parts.length - 1];
|
|
228
|
+
const lastIndex = /^\d+$/.test(lastPart) ? parseInt(lastPart) : lastPart;
|
|
229
|
+
if (!isJsonContainer(current)) return;
|
|
230
|
+
if (Array.isArray(current)) current[lastIndex] = value;
|
|
231
|
+
else current[lastIndex] = value;
|
|
310
232
|
}
|
|
233
|
+
//#endregion
|
|
234
|
+
export { splitMintlifyLanguageRefs };
|
|
235
|
+
|
|
236
|
+
//# sourceMappingURL=splitMintlifyLanguageRefs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"splitMintlifyLanguageRefs.js","names":[],"sources":["../../src/utils/splitMintlifyLanguageRefs.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { logger } from '../console/logger.js';\nimport { Settings, JsonSchema, SourceObjectOptions } from '../types/index.js';\nimport type { RefMap } from './resolveMintlifyRefs.js';\nimport { validateJsonSchema } from '../formats/json/utils.js';\nimport { getStoredRefMap, clearStoredRefMap } from '../state/mintlifyRefMap.js';\nimport { JSONPath } from 'jsonpath-plus';\nimport { getLocaleProperties } from '@generaltranslation/format';\n\ntype JsonContainer = Record<string, unknown> | unknown[];\n\nfunction isJsonContainer(value: unknown): value is JsonContainer {\n return typeof value === 'object' && value !== null;\n}\n\n/**\n * Post-processing step for composite JSON files with splitEntries enabled.\n *\n * After mergeJson writes a fully-inlined composite file, this function:\n * 1. Restores the original $ref structure (if the source used $ref / resolveRefs)\n * 2. Extracts non-default keyed entries into their own ref files\n * to keep the source file compact\n *\n * Driven entirely by the jsonSchema config — reads the composite path,\n * key field, and splitEntries flag from the schema.\n */\nexport async function splitMintlifyLanguageRefs(\n settings: Settings\n): Promise<void> {\n const refMap = getStoredRefMap();\n\n try {\n const resolvedJsonPaths = settings.files?.resolvedPaths?.json;\n if (!resolvedJsonPaths) return;\n\n // Find a JSON file that has splitEntries enabled or resolveRefs\n const targetFile = findTargetFile(resolvedJsonPaths, settings);\n if (!targetFile) return;\n\n const { filePath: compositeFilePath, splitConfig } = targetFile;\n if (!fs.existsSync(compositeFilePath)) return;\n\n let fileJson: unknown;\n try {\n fileJson = JSON.parse(fs.readFileSync(compositeFilePath, 'utf-8'));\n } catch {\n return;\n }\n\n const docsDir = path.dirname(compositeFilePath);\n\n // If splitEntries is configured, process it\n if (splitConfig) {\n processSplitEntries(\n fileJson,\n compositeFilePath,\n docsDir,\n splitConfig,\n settings,\n refMap\n );\n }\n\n // Restore top-level refs if any exist\n if (refMap && refMap.size > 0) {\n restoreTopLevelRefs(fileJson, refMap, splitConfig);\n }\n\n // Always write the composite file back — splitEntries modified the\n // languages array, and restoreTopLevelRefs may not have written it\n // (e.g., when all refs are inside language entries, not top-level)\n fs.writeFileSync(\n compositeFilePath,\n JSON.stringify(fileJson, null, 2),\n 'utf-8'\n );\n } finally {\n clearStoredRefMap();\n }\n}\n\ntype SplitConfig = {\n compositePath: string;\n jsonPointer: string;\n keyField: string;\n keyJsonPath: string;\n sourceObjectOptions: SourceObjectOptions;\n};\n\n/**\n * Find the target file and extract split configuration from the schema.\n */\nfunction findTargetFile(\n resolvedPaths: string[],\n settings: Settings\n): {\n filePath: string;\n schema: JsonSchema;\n splitConfig: SplitConfig | null;\n} | null {\n if (!settings.options?.jsonSchema) return null;\n\n for (const filePath of resolvedPaths) {\n const schema = validateJsonSchema(settings.options, filePath);\n if (!schema) continue;\n\n const hasSplitEntries = schema.composite\n ? Object.entries(schema.composite).some(([, opts]) => opts.splitEntries)\n : false;\n\n const hasResolveRefs = schema.resolveRefs;\n\n if (!hasSplitEntries && !hasResolveRefs) continue;\n\n // Extract split config if available\n let splitConfig: SplitConfig | null = null;\n if (schema.composite) {\n for (const [compositePath, opts] of Object.entries(schema.composite)) {\n if (opts.splitEntries && opts.type === 'array' && opts.key) {\n splitConfig = {\n compositePath,\n jsonPointer: jsonPathToPointer(compositePath),\n keyField: opts.key,\n keyJsonPath: opts.key,\n sourceObjectOptions: opts,\n };\n break;\n }\n }\n }\n\n return { filePath, schema, splitConfig };\n }\n\n return null;\n}\n\n/**\n * Process splitEntries: extract non-default keyed entries into ref files.\n */\nfunction processSplitEntries(\n fileJson: unknown,\n compositeFilePath: string,\n docsDir: string,\n splitConfig: SplitConfig,\n settings: Settings,\n refMap: RefMap | null\n): void {\n const { jsonPointer, keyJsonPath } = splitConfig;\n\n // Find the composite array — may be behind a $ref\n const parentPointer = jsonPointer.split('/').slice(0, -1).join('/') || '';\n const arrayKey = jsonPointer.split('/').pop() || '';\n const navRefEntry = parentPointer ? refMap?.get(parentPointer) : undefined;\n\n // Get the array from the file\n const arrayContainer = parentPointer\n ? getAtPointer(fileJson, parentPointer)\n : fileJson;\n if (!isJsonContainer(arrayContainer)) return;\n\n const entries = Array.isArray(arrayContainer)\n ? arrayContainer[Number(arrayKey)]\n : arrayContainer[arrayKey];\n if (!Array.isArray(entries) || entries.length <= 1) return;\n\n // Determine the default key value (the source entry)\n const defaultKeyValue = getDefaultKeyValue(\n settings.defaultLocale,\n splitConfig.sourceObjectOptions\n );\n\n const defaultIndex = entries.findIndex((e: unknown) => {\n if (!e || typeof e !== 'object') return false;\n const values = JSONPath({\n json: e,\n path: keyJsonPath,\n resultType: 'value',\n flatten: true,\n wrap: true,\n }) as unknown[];\n return values?.[0] === defaultKeyValue;\n });\n if (defaultIndex < 0) return;\n\n // Determine where the composite array actually lives on disk\n const navDir = navRefEntry ? path.dirname(navRefEntry.sourceFile) : docsDir;\n\n // Restore $ref structure if the source used $ref\n if (refMap && refMap.size > 0) {\n const defaultPointerPrefix = `${jsonPointer}/${defaultIndex}`;\n const internalRefs = collectInternalRefs(refMap, defaultPointerPrefix);\n\n if (internalRefs.length > 0) {\n const defaultEntry = entries[defaultIndex];\n for (const ref of internalRefs) {\n setAtPointer(defaultEntry, ref.relativePointer, {\n $ref: ref.refPath,\n });\n }\n\n for (const entry of entries) {\n const entryKeyValues = JSONPath({\n json: entry,\n path: keyJsonPath,\n resultType: 'value',\n flatten: true,\n wrap: true,\n }) as unknown[];\n if (entryKeyValues?.[0] === defaultKeyValue) continue;\n\n for (const ref of internalRefs) {\n const subtree = getAtPointer(entry, ref.relativePointer);\n if (subtree === undefined) continue;\n\n const originalAbsPath = path.resolve(ref.resolvedDir, ref.refPath);\n const relToNavDir = path.relative(navDir, originalAbsPath);\n const keyValue =\n typeof entryKeyValues?.[0] === 'string'\n ? entryKeyValues[0]\n : 'unknown';\n const localeRelPath = path.join(keyValue, relToNavDir);\n const outputPath = path.resolve(navDir, localeRelPath);\n writeJsonFile(outputPath, subtree);\n\n setAtPointer(entry, ref.relativePointer, { $ref: ref.refPath });\n }\n }\n\n logger.info(`Restored $ref structure for default entry`);\n }\n }\n\n // Extract each non-default entry into its own ref file\n const navFileName = navRefEntry\n ? path.basename(navRefEntry.sourceFile)\n : path.basename(compositeFilePath);\n\n // Get the actual property name from the key JSONPath (e.g., \"$.language\" → \"language\")\n const keyPropertyName = keyJsonPath.replace(/^\\$\\.?/, '');\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n if (!entry || typeof entry !== 'object') continue;\n\n const keyValues = JSONPath({\n json: entry,\n path: keyJsonPath,\n resultType: 'value',\n flatten: true,\n wrap: true,\n }) as unknown[];\n const keyValue = keyValues?.[0];\n if (typeof keyValue !== 'string' || keyValue === defaultKeyValue) continue;\n\n if (!isJsonContainer(entry) || Array.isArray(entry)) continue;\n const { [keyPropertyName]: _, ...contentWithoutKey } = entry;\n const entryFileName = `${keyValue}/${navFileName}`;\n const entryFilePath = path.resolve(navDir, entryFileName);\n writeJsonFile(entryFilePath, contentWithoutKey);\n\n entries[i] = { [keyPropertyName]: keyValue, $ref: `./${entryFileName}` };\n }\n\n logger.info(`Split keyed entries into ref files`);\n}\n\n/**\n * Get the identifying key value for the default locale.\n */\nfunction getDefaultKeyValue(\n defaultLocale: string,\n sourceObjectOptions: SourceObjectOptions\n): string {\n const localeProperty = sourceObjectOptions.localeProperty || 'code';\n const localeProperties = getLocaleProperties(defaultLocale);\n return (\n (localeProperties as Record<string, string | undefined>)[localeProperty] ||\n localeProperties.code ||\n defaultLocale\n );\n}\n\n/**\n * Convert a JSONPath like \"$.navigation.languages\" to a JSON pointer like \"/navigation/languages\".\n */\nfunction jsonPathToPointer(jsonPath: string): string {\n return jsonPath\n .replace(/^\\$\\.?/, '')\n .split('.')\n .filter(Boolean)\n .map((segment) => `/${segment}`)\n .join('');\n}\n\n/**\n * Restore top-level $ref pointers in the composite file.\n * Sorted deepest-first so nested refs are written before parents.\n */\nfunction restoreTopLevelRefs(\n fileJson: unknown,\n refMap: RefMap,\n splitConfig: SplitConfig | null\n): void {\n // Build a regex to exclude entries inside the composite array\n const arrayPointerPattern = splitConfig\n ? new RegExp(\n `^${splitConfig.jsonPointer.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\/\\\\d+`\n )\n : null;\n\n const entries = [...refMap.entries()]\n .filter(\n ([pointer]) => !arrayPointerPattern || !arrayPointerPattern.test(pointer)\n )\n .sort(([a], [b]) => b.length - a.length);\n\n for (const [pointer, entry] of entries) {\n const subtree = getAtPointer(fileJson, pointer);\n if (subtree === undefined) continue;\n\n writeJsonFile(entry.sourceFile, subtree);\n setAtPointer(fileJson, pointer, { $ref: entry.refPath });\n }\n}\n\n/**\n * Collect refMap entries that describe an entry's internal $ref chain.\n * Sorted deepest-first so nested content is extracted before parents.\n */\nfunction collectInternalRefs(\n refMap: RefMap,\n entryPointerPrefix: string\n): { relativePointer: string; refPath: string; resolvedDir: string }[] {\n const refs: {\n relativePointer: string;\n refPath: string;\n resolvedDir: string;\n }[] = [];\n\n for (const [pointer, entry] of refMap.entries()) {\n if (!pointer.startsWith(entryPointerPrefix + '/')) continue;\n refs.push({\n relativePointer: pointer.slice(entryPointerPrefix.length),\n refPath: entry.refPath,\n resolvedDir: entry.containingDir,\n });\n }\n\n refs.sort((a, b) => b.relativePointer.length - a.relativePointer.length);\n return refs;\n}\n\nfunction writeJsonFile(filePath: string, data: unknown): void {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\n}\n\nfunction getAtPointer(obj: unknown, pointer: string): unknown {\n if (!pointer || pointer === '/') return obj;\n const parts = pointer.split('/').filter(Boolean);\n let current = obj;\n for (const part of parts) {\n if (!isJsonContainer(current)) return undefined;\n const index = /^\\d+$/.test(part) ? parseInt(part) : part;\n current = Array.isArray(current)\n ? current[index as number]\n : current[index];\n }\n return current;\n}\n\nfunction setAtPointer(obj: unknown, pointer: string, value: unknown): void {\n if (!pointer || pointer === '/') return;\n const parts = pointer.split('/').filter(Boolean);\n let current = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n if (!isJsonContainer(current)) return;\n const index = /^\\d+$/.test(parts[i]) ? parseInt(parts[i]) : parts[i];\n const next = Array.isArray(current)\n ? current[index as number]\n : current[index];\n if (next === undefined) return;\n current = next;\n }\n const lastPart = parts[parts.length - 1];\n const lastIndex = /^\\d+$/.test(lastPart) ? parseInt(lastPart) : lastPart;\n if (!isJsonContainer(current)) return;\n if (Array.isArray(current)) {\n current[lastIndex as number] = value;\n } else {\n current[lastIndex] = value;\n }\n}\n"],"mappings":"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"}
|