gtx-cli 2.6.31 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -1261
- package/README.md +12 -3
- package/dist/bin/bin-entry.js +2 -1
- package/dist/config/generateSettings.d.ts +1 -9
- package/dist/config/generateSettings.js +1 -214
- package/dist/config/resolveConfig.d.ts +1 -4
- package/dist/config/resolveConfig.js +1 -33
- package/dist/fs/config/setupConfig.d.ts +1 -17
- package/dist/fs/config/setupConfig.js +1 -50
- package/dist/fs/matchFiles.d.ts +1 -1
- package/dist/fs/matchFiles.js +1 -8
- package/dist/functions.d.ts +1 -7
- package/dist/functions.js +1 -6
- package/dist/index.d.ts +1 -4
- package/dist/index.js +1 -27
- package/dist/main.js +2 -2
- package/dist/next/parse/handleInitGT.d.ts +1 -7
- package/dist/next/parse/handleInitGT.js +1 -157
- package/dist/next/parse/wrapContent.d.ts +1 -12
- package/dist/next/parse/wrapContent.js +1 -164
- package/dist/react/parse/wrapContent.d.ts +1 -12
- package/dist/react/parse/wrapContent.js +1 -162
- package/dist/types/index.d.ts +1 -243
- package/dist/types/index.js +1 -1
- package/dist/utils/installPackage.d.ts +1 -3
- package/dist/utils/installPackage.js +1 -77
- package/dist/utils/packageInfo.d.ts +1 -3
- package/dist/utils/packageInfo.js +1 -17
- package/dist/utils/packageJson.d.ts +1 -6
- package/dist/utils/packageJson.js +1 -68
- package/dist/utils/packageManager.d.ts +1 -28
- package/dist/utils/packageManager.js +1 -269
- package/package.json +11 -97
- package/dist/api/collectUserEditDiffs.d.ts +0 -9
- package/dist/api/collectUserEditDiffs.js +0 -159
- package/dist/api/downloadFileBatch.d.ts +0 -23
- package/dist/api/downloadFileBatch.js +0 -190
- package/dist/api/saveLocalEdits.d.ts +0 -6
- package/dist/api/saveLocalEdits.js +0 -38
- package/dist/cli/base.d.ts +0 -59
- package/dist/cli/base.js +0 -529
- package/dist/cli/commands/download.d.ts +0 -8
- package/dist/cli/commands/download.js +0 -51
- package/dist/cli/commands/enqueue.d.ts +0 -9
- package/dist/cli/commands/enqueue.js +0 -27
- package/dist/cli/commands/setupProject.d.ts +0 -7
- package/dist/cli/commands/setupProject.js +0 -37
- package/dist/cli/commands/stage.d.ts +0 -9
- package/dist/cli/commands/stage.js +0 -59
- package/dist/cli/commands/translate.d.ts +0 -7
- package/dist/cli/commands/translate.js +0 -70
- package/dist/cli/commands/upload.d.ts +0 -13
- package/dist/cli/commands/upload.js +0 -142
- package/dist/cli/commands/utils/validation.d.ts +0 -13
- package/dist/cli/commands/utils/validation.js +0 -38
- package/dist/cli/flags.d.ts +0 -15
- package/dist/cli/flags.js +0 -70
- package/dist/cli/inline.d.ts +0 -17
- package/dist/cli/inline.js +0 -135
- package/dist/cli/next.d.ts +0 -10
- package/dist/cli/next.js +0 -12
- package/dist/cli/node.d.ts +0 -10
- package/dist/cli/node.js +0 -9
- package/dist/cli/react.d.ts +0 -12
- package/dist/cli/react.js +0 -72
- package/dist/config/optionPresets.d.ts +0 -3
- package/dist/config/optionPresets.js +0 -65
- package/dist/config/utils.d.ts +0 -2
- package/dist/config/utils.js +0 -4
- package/dist/config/validateSettings.d.ts +0 -3
- package/dist/config/validateSettings.js +0 -32
- package/dist/console/colors.d.ts +0 -6
- package/dist/console/colors.js +0 -19
- package/dist/console/displayTranslateSummary.d.ts +0 -1
- package/dist/console/displayTranslateSummary.js +0 -42
- package/dist/console/formatting.d.ts +0 -1
- package/dist/console/formatting.js +0 -7
- package/dist/console/index.d.ts +0 -34
- package/dist/console/index.js +0 -46
- package/dist/console/logger.d.ts +0 -35
- package/dist/console/logger.js +0 -250
- package/dist/console/logging.d.ts +0 -52
- package/dist/console/logging.js +0 -175
- package/dist/formats/files/aggregateFiles.d.ts +0 -4
- package/dist/formats/files/aggregateFiles.js +0 -156
- package/dist/formats/files/collectFiles.d.ts +0 -6
- package/dist/formats/files/collectFiles.js +0 -49
- package/dist/formats/files/convertToFileTranslationData.d.ts +0 -15
- package/dist/formats/files/convertToFileTranslationData.js +0 -21
- package/dist/formats/files/fileMapping.d.ts +0 -11
- package/dist/formats/files/fileMapping.js +0 -115
- package/dist/formats/files/preprocess/mdx.d.ts +0 -6
- package/dist/formats/files/preprocess/mdx.js +0 -14
- package/dist/formats/files/preprocess/mintlify.d.ts +0 -5
- package/dist/formats/files/preprocess/mintlify.js +0 -15
- package/dist/formats/files/preprocessContent.d.ts +0 -8
- package/dist/formats/files/preprocessContent.js +0 -23
- package/dist/formats/files/save.d.ts +0 -5
- package/dist/formats/files/save.js +0 -17
- package/dist/formats/files/supportedFiles.d.ts +0 -11
- package/dist/formats/files/supportedFiles.js +0 -20
- package/dist/formats/json/extractJson.d.ts +0 -15
- package/dist/formats/json/extractJson.js +0 -101
- package/dist/formats/json/flattenJson.d.ts +0 -14
- package/dist/formats/json/flattenJson.js +0 -64
- package/dist/formats/json/mergeJson.d.ts +0 -13
- package/dist/formats/json/mergeJson.js +0 -367
- package/dist/formats/json/parseJson.d.ts +0 -2
- package/dist/formats/json/parseJson.js +0 -109
- package/dist/formats/json/utils.d.ts +0 -47
- package/dist/formats/json/utils.js +0 -150
- package/dist/formats/utils.d.ts +0 -2
- package/dist/formats/utils.js +0 -24
- package/dist/formats/yaml/mergeYaml.d.ts +0 -5
- package/dist/formats/yaml/mergeYaml.js +0 -61
- package/dist/formats/yaml/parseYaml.d.ts +0 -5
- package/dist/formats/yaml/parseYaml.js +0 -24
- package/dist/formats/yaml/utils.d.ts +0 -2
- package/dist/formats/yaml/utils.js +0 -23
- package/dist/fs/clearLocaleDirs.d.ts +0 -8
- package/dist/fs/clearLocaleDirs.js +0 -126
- package/dist/fs/config/downloadedVersions.d.ts +0 -21
- package/dist/fs/config/downloadedVersions.js +0 -50
- package/dist/fs/config/loadConfig.d.ts +0 -1
- package/dist/fs/config/loadConfig.js +0 -9
- package/dist/fs/config/parseFilesConfig.d.ts +0 -27
- package/dist/fs/config/parseFilesConfig.js +0 -150
- package/dist/fs/config/updateConfig.d.ts +0 -21
- package/dist/fs/config/updateConfig.js +0 -57
- package/dist/fs/config/updateVersions.d.ts +0 -11
- package/dist/fs/config/updateVersions.js +0 -30
- package/dist/fs/copyFile.d.ts +0 -7
- package/dist/fs/copyFile.js +0 -39
- package/dist/fs/createLoadTranslationsFile.d.ts +0 -1
- package/dist/fs/createLoadTranslationsFile.js +0 -49
- package/dist/fs/determineFramework.d.ts +0 -5
- package/dist/fs/determineFramework.js +0 -53
- package/dist/fs/findFilepath.d.ts +0 -36
- package/dist/fs/findFilepath.js +0 -90
- package/dist/fs/index.d.ts +0 -1
- package/dist/fs/index.js +0 -1
- package/dist/fs/loadJSON.d.ts +0 -6
- package/dist/fs/loadJSON.js +0 -17
- package/dist/fs/saveJSON.d.ts +0 -1
- package/dist/fs/saveJSON.js +0 -7
- package/dist/fs/utils.d.ts +0 -1
- package/dist/fs/utils.js +0 -16
- package/dist/generated/version.d.ts +0 -1
- package/dist/generated/version.js +0 -2
- package/dist/git/branches.d.ts +0 -7
- package/dist/git/branches.js +0 -88
- package/dist/hooks/postProcess.d.ts +0 -4
- package/dist/hooks/postProcess.js +0 -110
- package/dist/locadex/setupFlow.d.ts +0 -2
- package/dist/locadex/setupFlow.js +0 -9
- package/dist/next/config/parseNextConfig.d.ts +0 -10
- package/dist/next/config/parseNextConfig.js +0 -53
- package/dist/next/jsx/utils.d.ts +0 -7
- package/dist/next/jsx/utils.js +0 -42
- package/dist/react/config/createESBuildConfig.d.ts +0 -2
- package/dist/react/config/createESBuildConfig.js +0 -119
- package/dist/react/jsx/evaluateJsx.d.ts +0 -24
- package/dist/react/jsx/evaluateJsx.js +0 -123
- package/dist/react/jsx/utils/buildImportMap.d.ts +0 -9
- package/dist/react/jsx/utils/buildImportMap.js +0 -30
- package/dist/react/jsx/utils/constants.d.ts +0 -15
- package/dist/react/jsx/utils/constants.js +0 -49
- package/dist/react/jsx/utils/getCalleeNameFromExpression.d.ts +0 -9
- package/dist/react/jsx/utils/getCalleeNameFromExpression.js +0 -32
- package/dist/react/jsx/utils/getPathsAndAliases.d.ts +0 -21
- package/dist/react/jsx/utils/getPathsAndAliases.js +0 -91
- package/dist/react/jsx/utils/isNumberLiteral.d.ts +0 -7
- package/dist/react/jsx/utils/isNumberLiteral.js +0 -13
- package/dist/react/jsx/utils/jsxParsing/addGTIdentifierToSyntaxTree.d.ts +0 -9
- package/dist/react/jsx/utils/jsxParsing/addGTIdentifierToSyntaxTree.js +0 -138
- package/dist/react/jsx/utils/jsxParsing/handleChildrenWhitespace.d.ts +0 -6
- package/dist/react/jsx/utils/jsxParsing/handleChildrenWhitespace.js +0 -197
- package/dist/react/jsx/utils/jsxParsing/multiplication/findMultiplicationNode.d.ts +0 -13
- package/dist/react/jsx/utils/jsxParsing/multiplication/findMultiplicationNode.js +0 -42
- package/dist/react/jsx/utils/jsxParsing/multiplication/multiplyJsxTree.d.ts +0 -5
- package/dist/react/jsx/utils/jsxParsing/multiplication/multiplyJsxTree.js +0 -69
- package/dist/react/jsx/utils/jsxParsing/parseJsx.d.ts +0 -33
- package/dist/react/jsx/utils/jsxParsing/parseJsx.js +0 -918
- package/dist/react/jsx/utils/jsxParsing/parseTProps.d.ts +0 -8
- package/dist/react/jsx/utils/jsxParsing/parseTProps.js +0 -65
- package/dist/react/jsx/utils/jsxParsing/removeNullChildrenFields.d.ts +0 -2
- package/dist/react/jsx/utils/jsxParsing/removeNullChildrenFields.js +0 -61
- package/dist/react/jsx/utils/jsxParsing/types.d.ts +0 -48
- package/dist/react/jsx/utils/jsxParsing/types.js +0 -34
- package/dist/react/jsx/utils/mapAttributeName.d.ts +0 -11
- package/dist/react/jsx/utils/mapAttributeName.js +0 -12
- package/dist/react/jsx/utils/parseAst.d.ts +0 -31
- package/dist/react/jsx/utils/parseAst.js +0 -278
- package/dist/react/jsx/utils/parseDeclareStatic.d.ts +0 -15
- package/dist/react/jsx/utils/parseDeclareStatic.js +0 -540
- package/dist/react/jsx/utils/parseString.d.ts +0 -25
- package/dist/react/jsx/utils/parseString.js +0 -540
- package/dist/react/jsx/utils/parseStringFunction.d.ts +0 -30
- package/dist/react/jsx/utils/parseStringFunction.js +0 -348
- package/dist/react/jsx/utils/resolveImportPath.d.ts +0 -11
- package/dist/react/jsx/utils/resolveImportPath.js +0 -111
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/extractStringEntryMetadata.d.ts +0 -29
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/extractStringEntryMetadata.js +0 -86
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleInvalidTranslationCall.d.ts +0 -14
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleInvalidTranslationCall.js +0 -24
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleLiteralTranslationCall.d.ts +0 -19
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleLiteralTranslationCall.js +0 -31
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleStaticTranslationCall.d.ts +0 -22
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleStaticTranslationCall.js +0 -51
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/index.d.ts +0 -18
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/index.js +0 -39
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/routeTranslationCall.d.ts +0 -24
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/routeTranslationCall.js +0 -68
- package/dist/react/jsx/utils/stringParsing/types.d.ts +0 -41
- package/dist/react/jsx/utils/stringParsing/types.js +0 -1
- package/dist/react/jsx/utils/types.d.ts +0 -14
- package/dist/react/jsx/utils/types.js +0 -1
- package/dist/react/jsx/utils/validateStringFunction.d.ts +0 -7
- package/dist/react/jsx/utils/validateStringFunction.js +0 -31
- package/dist/react/jsx/wrapJsx.d.ts +0 -51
- package/dist/react/jsx/wrapJsx.js +0 -387
- package/dist/react/parse/addVitePlugin/index.d.ts +0 -22
- package/dist/react/parse/addVitePlugin/index.js +0 -41
- package/dist/react/parse/addVitePlugin/installCompiler.d.ts +0 -8
- package/dist/react/parse/addVitePlugin/installCompiler.js +0 -22
- package/dist/react/parse/addVitePlugin/updateViteConfig.d.ts +0 -19
- package/dist/react/parse/addVitePlugin/updateViteConfig.js +0 -120
- package/dist/react/parse/addVitePlugin/utils/addCompilerImport.d.ts +0 -9
- package/dist/react/parse/addVitePlugin/utils/addCompilerImport.js +0 -34
- package/dist/react/parse/addVitePlugin/utils/addPluginInvocation.d.ts +0 -11
- package/dist/react/parse/addVitePlugin/utils/addPluginInvocation.js +0 -48
- package/dist/react/parse/addVitePlugin/utils/checkCompilerImport.d.ts +0 -15
- package/dist/react/parse/addVitePlugin/utils/checkCompilerImport.js +0 -113
- package/dist/react/parse/addVitePlugin/utils/checkPluginInvocation.d.ts +0 -12
- package/dist/react/parse/addVitePlugin/utils/checkPluginInvocation.js +0 -32
- package/dist/react/parse/createDictionaryUpdates.d.ts +0 -3
- package/dist/react/parse/createDictionaryUpdates.js +0 -187
- package/dist/react/parse/createInlineUpdates.d.ts +0 -13
- package/dist/react/parse/createInlineUpdates.js +0 -161
- package/dist/react/utils/flattenDictionary.d.ts +0 -20
- package/dist/react/utils/flattenDictionary.js +0 -75
- package/dist/react/utils/getEntryAndMetadata.d.ts +0 -5
- package/dist/react/utils/getEntryAndMetadata.js +0 -11
- package/dist/react/utils/getVariableName.d.ts +0 -25
- package/dist/react/utils/getVariableName.js +0 -37
- package/dist/setup/agentInstructions.d.ts +0 -24
- package/dist/setup/agentInstructions.js +0 -138
- package/dist/setup/detectFramework.d.ts +0 -31
- package/dist/setup/detectFramework.js +0 -106
- package/dist/setup/frameworkUtils.d.ts +0 -3
- package/dist/setup/frameworkUtils.js +0 -30
- package/dist/setup/instructions/base.md +0 -29
- package/dist/setup/instructions/gt-next.md +0 -107
- package/dist/setup/instructions/gt-react.md +0 -98
- package/dist/setup/userInput.d.ts +0 -4
- package/dist/setup/userInput.js +0 -32
- package/dist/setup/wizard.d.ts +0 -3
- package/dist/setup/wizard.js +0 -147
- package/dist/state/recentDownloads.d.ts +0 -12
- package/dist/state/recentDownloads.js +0 -18
- package/dist/state/translateWarnings.d.ts +0 -10
- package/dist/state/translateWarnings.js +0 -13
- package/dist/translation/parse.d.ts +0 -17
- package/dist/translation/parse.js +0 -77
- package/dist/translation/stage.d.ts +0 -3
- package/dist/translation/stage.js +0 -44
- package/dist/translation/validate.d.ts +0 -14
- package/dist/translation/validate.js +0 -100
- package/dist/types/branch.d.ts +0 -14
- package/dist/types/branch.js +0 -1
- package/dist/types/data/json.d.ts +0 -6
- package/dist/types/data/json.js +0 -1
- package/dist/types/data.d.ts +0 -37
- package/dist/types/data.js +0 -1
- package/dist/types/files.d.ts +0 -8
- package/dist/types/files.js +0 -1
- package/dist/types/libraries.d.ts +0 -31
- package/dist/types/libraries.js +0 -72
- package/dist/types/parsing.d.ts +0 -3
- package/dist/types/parsing.js +0 -1
- package/dist/utils/addExplicitAnchorIds.d.ts +0 -24
- package/dist/utils/addExplicitAnchorIds.js +0 -416
- package/dist/utils/constants.d.ts +0 -5
- package/dist/utils/constants.js +0 -6
- package/dist/utils/credentials.d.ts +0 -12
- package/dist/utils/credentials.js +0 -120
- package/dist/utils/flattenJsonFiles.d.ts +0 -2
- package/dist/utils/flattenJsonFiles.js +0 -36
- package/dist/utils/gitDiff.d.ts +0 -8
- package/dist/utils/gitDiff.js +0 -34
- package/dist/utils/gt.d.ts +0 -2
- package/dist/utils/gt.js +0 -2
- package/dist/utils/hash.d.ts +0 -6
- package/dist/utils/hash.js +0 -11
- package/dist/utils/headers.d.ts +0 -1
- package/dist/utils/headers.js +0 -14
- package/dist/utils/localizeRelativeAssets.d.ts +0 -8
- package/dist/utils/localizeRelativeAssets.js +0 -166
- package/dist/utils/localizeStaticImports.d.ts +0 -15
- package/dist/utils/localizeStaticImports.js +0 -397
- package/dist/utils/localizeStaticUrls.d.ts +0 -19
- package/dist/utils/localizeStaticUrls.js +0 -450
- package/dist/utils/mintlifyTitleFallback.d.ts +0 -6
- package/dist/utils/mintlifyTitleFallback.js +0 -80
- package/dist/utils/parse/needsCJS.d.ts +0 -20
- package/dist/utils/parse/needsCJS.js +0 -72
- package/dist/utils/persistPostprocessHashes.d.ts +0 -12
- package/dist/utils/persistPostprocessHashes.js +0 -39
- package/dist/utils/processAnchorIds.d.ts +0 -6
- package/dist/utils/processAnchorIds.js +0 -56
- package/dist/utils/processOpenApi.d.ts +0 -8
- package/dist/utils/processOpenApi.js +0 -651
- package/dist/utils/sanitizeFileContent.d.ts +0 -6
- package/dist/utils/sanitizeFileContent.js +0 -29
- package/dist/utils/sharedStaticAssets.d.ts +0 -9
- package/dist/utils/sharedStaticAssets.js +0 -384
- package/dist/utils/validateMdx.d.ts +0 -10
- package/dist/utils/validateMdx.js +0 -25
- package/dist/utils/wrapPlainUrls.d.ts +0 -8
- package/dist/utils/wrapPlainUrls.js +0 -72
- package/dist/workflows/download.d.ts +0 -32
- package/dist/workflows/download.js +0 -131
- package/dist/workflows/enqueue.d.ts +0 -17
- package/dist/workflows/enqueue.js +0 -59
- package/dist/workflows/setupProject.d.ts +0 -13
- package/dist/workflows/setupProject.js +0 -48
- package/dist/workflows/stage.d.ts +0 -18
- package/dist/workflows/stage.js +0 -59
- package/dist/workflows/steps/BranchStep.d.ts +0 -13
- package/dist/workflows/steps/BranchStep.js +0 -161
- package/dist/workflows/steps/DownloadStep.d.ts +0 -19
- package/dist/workflows/steps/DownloadStep.js +0 -131
- package/dist/workflows/steps/EnqueueStep.d.ts +0 -15
- package/dist/workflows/steps/EnqueueStep.js +0 -33
- package/dist/workflows/steps/PollJobsStep.d.ts +0 -31
- package/dist/workflows/steps/PollJobsStep.js +0 -288
- package/dist/workflows/steps/SetupStep.d.ts +0 -16
- package/dist/workflows/steps/SetupStep.js +0 -72
- package/dist/workflows/steps/UploadSourcesStep.d.ts +0 -27
- package/dist/workflows/steps/UploadSourcesStep.js +0 -131
- package/dist/workflows/steps/UploadTranslationsStep.d.ts +0 -22
- package/dist/workflows/steps/UploadTranslationsStep.js +0 -71
- package/dist/workflows/steps/UserEditDiffsStep.d.ts +0 -11
- package/dist/workflows/steps/UserEditDiffsStep.js +0 -30
- package/dist/workflows/steps/WorkflowStep.d.ts +0 -4
- package/dist/workflows/steps/WorkflowStep.js +0 -2
- package/dist/workflows/upload.d.ts +0 -15
- package/dist/workflows/upload.js +0 -47
|
@@ -1,450 +0,0 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
|
-
import { createFileMapping } from '../formats/files/fileMapping.js';
|
|
3
|
-
import micromatch from 'micromatch';
|
|
4
|
-
import { unified } from 'unified';
|
|
5
|
-
import remarkParse from 'remark-parse';
|
|
6
|
-
import remarkMdx from 'remark-mdx';
|
|
7
|
-
import remarkFrontmatter from 'remark-frontmatter';
|
|
8
|
-
import remarkStringify from 'remark-stringify';
|
|
9
|
-
import { visit } from 'unist-util-visit';
|
|
10
|
-
import { escapeHtmlInTextNodes, normalizeCJKCharacters } from 'gt-remark';
|
|
11
|
-
const { isMatch } = micromatch;
|
|
12
|
-
/**
|
|
13
|
-
* Localizes static urls in content files.
|
|
14
|
-
* Currently only supported for md and mdx files. (/docs/ -> /[locale]/docs/)
|
|
15
|
-
* @param settings - The settings object containing the project configuration.
|
|
16
|
-
* @returns void
|
|
17
|
-
*
|
|
18
|
-
* @TODO This is an experimental feature, and only works in very specific cases. This needs to be improved before
|
|
19
|
-
* it can be enabled by default.
|
|
20
|
-
*
|
|
21
|
-
* Before this becomes a non-experimental feature, we need to:
|
|
22
|
-
* - Support more file types
|
|
23
|
-
* - Support more complex paths
|
|
24
|
-
*/
|
|
25
|
-
export default async function localizeStaticUrls(settings, targetLocales, includeFiles) {
|
|
26
|
-
if (!settings.files ||
|
|
27
|
-
(Object.keys(settings.files.placeholderPaths).length === 1 &&
|
|
28
|
-
settings.files.placeholderPaths.gt)) {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
const { resolvedPaths: sourceFiles } = settings.files;
|
|
32
|
-
// Use filtered locales if provided, otherwise use all locales
|
|
33
|
-
const locales = targetLocales || settings.locales;
|
|
34
|
-
const fileMapping = createFileMapping(sourceFiles, settings.files.placeholderPaths, settings.files.transformPaths, settings.locales, // Always use all locales for mapping, filter later
|
|
35
|
-
settings.defaultLocale);
|
|
36
|
-
// Process all file types at once with a single call
|
|
37
|
-
const processPromises = [];
|
|
38
|
-
// First, process default locale files (from source files)
|
|
39
|
-
// This is needed because they might not be in the fileMapping if they're not being translated
|
|
40
|
-
// Only process default locale if it's in the target locales filter
|
|
41
|
-
if (!fileMapping[settings.defaultLocale] &&
|
|
42
|
-
locales.includes(settings.defaultLocale) &&
|
|
43
|
-
!includeFiles // when filtering, skip default-locale pass
|
|
44
|
-
) {
|
|
45
|
-
const defaultLocaleFiles = [];
|
|
46
|
-
// Collect all .md and .mdx files from sourceFiles
|
|
47
|
-
if (sourceFiles.md) {
|
|
48
|
-
defaultLocaleFiles.push(...sourceFiles.md);
|
|
49
|
-
}
|
|
50
|
-
if (sourceFiles.mdx) {
|
|
51
|
-
defaultLocaleFiles.push(...sourceFiles.mdx);
|
|
52
|
-
}
|
|
53
|
-
if (defaultLocaleFiles.length > 0) {
|
|
54
|
-
const defaultPromise = Promise.all(defaultLocaleFiles.map(async (filePath) => {
|
|
55
|
-
// Check if file exists before processing
|
|
56
|
-
if (!fs.existsSync(filePath)) {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
// Get file content
|
|
60
|
-
const fileContent = await fs.promises.readFile(filePath, 'utf8');
|
|
61
|
-
// Localize the file using default locale
|
|
62
|
-
const result = localizeStaticUrlsForFile(fileContent, settings.defaultLocale, settings.defaultLocale, // Process as default locale
|
|
63
|
-
settings.options?.experimentalHideDefaultLocale || false, settings.options?.docsUrlPattern, settings.options?.excludeStaticUrls, settings.options?.baseDomain);
|
|
64
|
-
// Only write the file if there were changes
|
|
65
|
-
if (result.hasChanges) {
|
|
66
|
-
await fs.promises.writeFile(filePath, result.content);
|
|
67
|
-
}
|
|
68
|
-
}));
|
|
69
|
-
processPromises.push(defaultPromise);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
// Then process all other locales from fileMapping
|
|
73
|
-
const mappingPromises = Object.entries(fileMapping)
|
|
74
|
-
.filter(([locale, filesMap]) => locales.includes(locale)) // Filter by target locales
|
|
75
|
-
.map(async ([locale, filesMap]) => {
|
|
76
|
-
// Get all files that are md or mdx
|
|
77
|
-
const targetFiles = Object.values(filesMap).filter((p) => (p.endsWith('.md') || p.endsWith('.mdx')) &&
|
|
78
|
-
(!includeFiles || includeFiles.has(p)));
|
|
79
|
-
// Replace the placeholder path with the target path
|
|
80
|
-
await Promise.all(targetFiles.map(async (filePath) => {
|
|
81
|
-
// Check if file exists before processing
|
|
82
|
-
if (!fs.existsSync(filePath)) {
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
// Get file content
|
|
86
|
-
const fileContent = await fs.promises.readFile(filePath, 'utf8');
|
|
87
|
-
// Localize the file (handles both URLs and hrefs in single AST pass)
|
|
88
|
-
const result = localizeStaticUrlsForFile(fileContent, settings.defaultLocale, locale, settings.options?.experimentalHideDefaultLocale || false, settings.options?.docsUrlPattern, settings.options?.excludeStaticUrls, settings.options?.baseDomain);
|
|
89
|
-
// Only write the file if there were changes
|
|
90
|
-
if (result.hasChanges) {
|
|
91
|
-
await fs.promises.writeFile(filePath, result.content);
|
|
92
|
-
}
|
|
93
|
-
}));
|
|
94
|
-
});
|
|
95
|
-
processPromises.push(...mappingPromises);
|
|
96
|
-
await Promise.all(processPromises);
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Determines if a URL should be processed based on pattern matching
|
|
100
|
-
*/
|
|
101
|
-
function shouldProcessUrl(originalUrl, patternHead, targetLocale, defaultLocale, baseDomain) {
|
|
102
|
-
// Check fragment-only URLs like "#id-name"
|
|
103
|
-
if (/^\s*#/.test(originalUrl)) {
|
|
104
|
-
return false;
|
|
105
|
-
}
|
|
106
|
-
const patternWithoutSlash = patternHead.replace(/\/$/, '');
|
|
107
|
-
// Handle absolute URLs with baseDomain
|
|
108
|
-
let urlToCheck = originalUrl;
|
|
109
|
-
if (baseDomain && originalUrl.startsWith(baseDomain)) {
|
|
110
|
-
urlToCheck = originalUrl.substring(baseDomain.length);
|
|
111
|
-
}
|
|
112
|
-
if (targetLocale === defaultLocale) {
|
|
113
|
-
// For default locale processing, check if URL contains the pattern
|
|
114
|
-
return urlToCheck.includes(patternWithoutSlash);
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
// For non-default locales, check if URL starts with pattern
|
|
118
|
-
return urlToCheck.startsWith(patternWithoutSlash);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Determines if a URL should be processed based on the base domain
|
|
123
|
-
*/
|
|
124
|
-
function shouldProcessAbsoluteUrl(originalUrl, baseDomain) {
|
|
125
|
-
return originalUrl.startsWith(baseDomain);
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Checks if a URL should be excluded based on exclusion patterns
|
|
129
|
-
*/
|
|
130
|
-
function isUrlExcluded(originalUrl, exclude, defaultLocale) {
|
|
131
|
-
const excludePatterns = exclude.map((p) => p.replace(/\[locale\]/g, defaultLocale));
|
|
132
|
-
return excludePatterns.some((pattern) => isMatch(originalUrl, pattern));
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Main URL transformation function that delegates to specific scenarios
|
|
136
|
-
*/
|
|
137
|
-
export function transformUrlPath(originalUrl, patternHead, targetLocale, defaultLocale, hideDefaultLocale) {
|
|
138
|
-
const originalPathArray = originalUrl
|
|
139
|
-
.split('/')
|
|
140
|
-
.filter((path) => path !== '');
|
|
141
|
-
const patternHeadArray = patternHead.split('/').filter((path) => path !== '');
|
|
142
|
-
// check if the pattern head matches the original path
|
|
143
|
-
if (!checkIfPathMatchesPattern(originalPathArray, patternHeadArray)) {
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
if (patternHeadArray.length > originalPathArray.length) {
|
|
147
|
-
return null; // Pattern is longer than the URL path
|
|
148
|
-
}
|
|
149
|
-
let result = null;
|
|
150
|
-
if (targetLocale === defaultLocale) {
|
|
151
|
-
if (hideDefaultLocale) {
|
|
152
|
-
// check if default locale is already present
|
|
153
|
-
if (originalPathArray?.[patternHeadArray.length] !== defaultLocale) {
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
// remove default locale
|
|
157
|
-
const newPathArray = [
|
|
158
|
-
...originalPathArray.slice(0, patternHeadArray.length),
|
|
159
|
-
...originalPathArray.slice(patternHeadArray.length + 1),
|
|
160
|
-
];
|
|
161
|
-
result = newPathArray.join('/');
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
// check if default locale is already present
|
|
165
|
-
if (originalPathArray?.[patternHeadArray.length] === defaultLocale) {
|
|
166
|
-
return null;
|
|
167
|
-
}
|
|
168
|
-
// insert default locale
|
|
169
|
-
const newPathArray = [
|
|
170
|
-
...originalPathArray.slice(0, patternHeadArray.length),
|
|
171
|
-
defaultLocale,
|
|
172
|
-
...originalPathArray.slice(patternHeadArray.length),
|
|
173
|
-
];
|
|
174
|
-
result = newPathArray.join('/');
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
else if (hideDefaultLocale) {
|
|
178
|
-
// Avoid duplicating target locale if already present
|
|
179
|
-
if (originalPathArray?.[patternHeadArray.length] === targetLocale) {
|
|
180
|
-
return null;
|
|
181
|
-
}
|
|
182
|
-
const newPathArray = [
|
|
183
|
-
...originalPathArray.slice(0, patternHeadArray.length),
|
|
184
|
-
targetLocale,
|
|
185
|
-
...originalPathArray.slice(patternHeadArray.length),
|
|
186
|
-
];
|
|
187
|
-
result = newPathArray.join('/');
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
// check default locale
|
|
191
|
-
if (originalPathArray?.[patternHeadArray.length] !== defaultLocale) {
|
|
192
|
-
return null;
|
|
193
|
-
}
|
|
194
|
-
// replace default locale with target locale
|
|
195
|
-
const newPathArray = [...originalPathArray];
|
|
196
|
-
newPathArray[patternHeadArray.length] = targetLocale;
|
|
197
|
-
result = newPathArray.join('/');
|
|
198
|
-
}
|
|
199
|
-
// check for leading and trailing slashes
|
|
200
|
-
if (originalUrl.startsWith('/')) {
|
|
201
|
-
result = '/' + result;
|
|
202
|
-
}
|
|
203
|
-
if (originalUrl.endsWith('/')) {
|
|
204
|
-
result = result + '/';
|
|
205
|
-
}
|
|
206
|
-
return result;
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* AST-based transformation for MDX files using remark-mdx
|
|
210
|
-
*/
|
|
211
|
-
function transformMdxUrls(mdxContent, defaultLocale, targetLocale, hideDefaultLocale, pattern = '/[locale]', exclude = [], baseDomain) {
|
|
212
|
-
const transformedUrls = [];
|
|
213
|
-
if (!pattern.startsWith('/')) {
|
|
214
|
-
pattern = '/' + pattern;
|
|
215
|
-
}
|
|
216
|
-
const patternHead = pattern.split('[locale]')[0];
|
|
217
|
-
// Quick check: if the file doesn't contain the pattern, skip expensive AST parsing
|
|
218
|
-
// For default locale processing, we also need to check if content might need adjustment
|
|
219
|
-
if (targetLocale === defaultLocale) {
|
|
220
|
-
// For default locale files, we always need to check as we're looking for either:
|
|
221
|
-
// - paths without locale (when hideDefaultLocale=false)
|
|
222
|
-
// - paths with default locale (when hideDefaultLocale=true)
|
|
223
|
-
const patternWithoutSlash = patternHead.replace(/\/$/, '');
|
|
224
|
-
if (!mdxContent.includes(patternWithoutSlash)) {
|
|
225
|
-
return {
|
|
226
|
-
content: mdxContent,
|
|
227
|
-
hasChanges: false,
|
|
228
|
-
transformedUrls: [],
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
// For non-default locales, use the original logic
|
|
234
|
-
if (!mdxContent.includes(patternHead.replace(/\/$/, ''))) {
|
|
235
|
-
return {
|
|
236
|
-
content: mdxContent,
|
|
237
|
-
hasChanges: false,
|
|
238
|
-
transformedUrls: [],
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
// Parse the MDX content into an AST
|
|
243
|
-
let processedAst;
|
|
244
|
-
try {
|
|
245
|
-
const parseProcessor = unified()
|
|
246
|
-
.use(remarkParse)
|
|
247
|
-
.use(remarkFrontmatter, ['yaml', 'toml'])
|
|
248
|
-
.use(remarkMdx);
|
|
249
|
-
const ast = parseProcessor.parse(mdxContent);
|
|
250
|
-
processedAst = parseProcessor.runSync(ast);
|
|
251
|
-
}
|
|
252
|
-
catch {
|
|
253
|
-
return {
|
|
254
|
-
content: mdxContent,
|
|
255
|
-
hasChanges: false,
|
|
256
|
-
transformedUrls,
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
// Helper function to transform URL based on pattern
|
|
260
|
-
const transformUrl = (originalUrl, linkType) => {
|
|
261
|
-
// For Markdown links [text](path), only process absolute-root paths starting with '/'
|
|
262
|
-
// Relative markdown links should remain relative to the current page and not be localized.
|
|
263
|
-
if (linkType === 'markdown') {
|
|
264
|
-
const isFragment = /^\s*#/.test(originalUrl);
|
|
265
|
-
const isAbsoluteRoot = originalUrl.startsWith('/');
|
|
266
|
-
const looksAbsoluteWithDomain = baseDomain
|
|
267
|
-
? shouldProcessAbsoluteUrl(originalUrl, baseDomain)
|
|
268
|
-
: false;
|
|
269
|
-
if (!isAbsoluteRoot && !looksAbsoluteWithDomain && !isFragment) {
|
|
270
|
-
return null;
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
// Check if URL should be processed
|
|
274
|
-
if (!shouldProcessUrl(originalUrl, patternHead, targetLocale, defaultLocale, baseDomain)) {
|
|
275
|
-
return null;
|
|
276
|
-
}
|
|
277
|
-
// Skip absolute URLs (http://, https://, //, etc.)
|
|
278
|
-
if (baseDomain && shouldProcessAbsoluteUrl(originalUrl, baseDomain)) {
|
|
279
|
-
// Get everything after the base domain
|
|
280
|
-
const afterDomain = originalUrl.substring(baseDomain.length);
|
|
281
|
-
const transformedPath = transformUrlPath(afterDomain, patternHead, targetLocale, defaultLocale, hideDefaultLocale);
|
|
282
|
-
if (!transformedPath) {
|
|
283
|
-
return null;
|
|
284
|
-
}
|
|
285
|
-
transformedUrls.push({
|
|
286
|
-
originalPath: originalUrl,
|
|
287
|
-
newPath: transformedPath,
|
|
288
|
-
type: linkType,
|
|
289
|
-
});
|
|
290
|
-
return transformedPath ? baseDomain + transformedPath : null;
|
|
291
|
-
}
|
|
292
|
-
// Exclude colon-prefixed URLs (http://, https://, //, etc.)
|
|
293
|
-
if (originalUrl.split('?')[0].includes(':')) {
|
|
294
|
-
return null;
|
|
295
|
-
}
|
|
296
|
-
// Transform the URL based on locale and configuration
|
|
297
|
-
const newUrl = transformUrlPath(originalUrl, patternHead, targetLocale, defaultLocale, hideDefaultLocale);
|
|
298
|
-
if (!newUrl) {
|
|
299
|
-
return null;
|
|
300
|
-
}
|
|
301
|
-
// Check exclusions
|
|
302
|
-
if (isUrlExcluded(originalUrl, exclude, defaultLocale)) {
|
|
303
|
-
return null;
|
|
304
|
-
}
|
|
305
|
-
transformedUrls.push({
|
|
306
|
-
originalPath: originalUrl,
|
|
307
|
-
newPath: newUrl,
|
|
308
|
-
type: linkType,
|
|
309
|
-
});
|
|
310
|
-
return newUrl;
|
|
311
|
-
};
|
|
312
|
-
// Visit markdown link nodes: [text](url)
|
|
313
|
-
visit(processedAst, 'link', (node) => {
|
|
314
|
-
if (node.url) {
|
|
315
|
-
const newUrl = transformUrl(node.url, 'markdown');
|
|
316
|
-
if (newUrl) {
|
|
317
|
-
node.url = newUrl;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
});
|
|
321
|
-
// Visit JSX/HTML elements for href attributes: <a href="url"> or <Card href="url">
|
|
322
|
-
visit(processedAst, ['mdxJsxFlowElement', 'mdxJsxTextElement'], (node) => {
|
|
323
|
-
const jsxNode = node;
|
|
324
|
-
if (jsxNode.attributes) {
|
|
325
|
-
for (const attr of jsxNode.attributes) {
|
|
326
|
-
if (attr.type === 'mdxJsxAttribute' &&
|
|
327
|
-
attr.name === 'href' &&
|
|
328
|
-
attr.value) {
|
|
329
|
-
// Handle MdxJsxAttribute with string or MdxJsxAttributeValueExpression
|
|
330
|
-
const hrefValue = typeof attr.value === 'string' ? attr.value : attr.value.value;
|
|
331
|
-
if (typeof hrefValue === 'string') {
|
|
332
|
-
const newUrl = transformUrl(hrefValue, 'href');
|
|
333
|
-
if (newUrl) {
|
|
334
|
-
if (typeof attr.value === 'string') {
|
|
335
|
-
attr.value = newUrl;
|
|
336
|
-
}
|
|
337
|
-
else {
|
|
338
|
-
attr.value.value = newUrl;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
});
|
|
346
|
-
// Visit raw JSX nodes for href attributes in JSX strings
|
|
347
|
-
visit(processedAst, 'jsx', (node) => {
|
|
348
|
-
if (node.value && typeof node.value === 'string') {
|
|
349
|
-
const jsxContent = node.value;
|
|
350
|
-
// Use regex to find href attributes in the JSX string
|
|
351
|
-
const hrefRegex = /href\s*=\s*["']([^"']+)["']/g;
|
|
352
|
-
let match;
|
|
353
|
-
const replacements = [];
|
|
354
|
-
// Reset regex lastIndex to avoid issues with global flag
|
|
355
|
-
hrefRegex.lastIndex = 0;
|
|
356
|
-
while ((match = hrefRegex.exec(jsxContent)) !== null) {
|
|
357
|
-
const originalHref = match[1];
|
|
358
|
-
const newUrl = transformUrl(originalHref, 'href');
|
|
359
|
-
if (newUrl) {
|
|
360
|
-
// Store replacement info
|
|
361
|
-
const oldHrefAttr = match[0]; // The full match like 'href="/quickstart"'
|
|
362
|
-
const quote = oldHrefAttr.includes('"') ? '"' : "'";
|
|
363
|
-
const newHrefAttr = `href=${quote}${newUrl}${quote}`;
|
|
364
|
-
replacements.push({
|
|
365
|
-
start: match.index,
|
|
366
|
-
end: match.index + oldHrefAttr.length,
|
|
367
|
-
oldHrefAttr,
|
|
368
|
-
newHrefAttr,
|
|
369
|
-
});
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
// Apply replacements in reverse order (from end to start) to avoid position shifts
|
|
373
|
-
if (replacements.length > 0) {
|
|
374
|
-
let newJsxContent = jsxContent;
|
|
375
|
-
replacements
|
|
376
|
-
.sort((a, b) => b.start - a.start)
|
|
377
|
-
.forEach(({ start, end, newHrefAttr }) => {
|
|
378
|
-
newJsxContent =
|
|
379
|
-
newJsxContent.slice(0, start) +
|
|
380
|
-
newHrefAttr +
|
|
381
|
-
newJsxContent.slice(end);
|
|
382
|
-
});
|
|
383
|
-
node.value = newJsxContent;
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
});
|
|
387
|
-
// Convert the modified AST back to MDX string
|
|
388
|
-
let content;
|
|
389
|
-
try {
|
|
390
|
-
const stringifyProcessor = unified()
|
|
391
|
-
.use(remarkFrontmatter, ['yaml', 'toml'])
|
|
392
|
-
.use(remarkMdx)
|
|
393
|
-
.use(normalizeCJKCharacters)
|
|
394
|
-
.use(escapeHtmlInTextNodes)
|
|
395
|
-
.use(remarkStringify, {
|
|
396
|
-
handlers: {
|
|
397
|
-
// Handler to prevent escaping (avoids '<' -> '\<')
|
|
398
|
-
text(node) {
|
|
399
|
-
return node.value;
|
|
400
|
-
},
|
|
401
|
-
},
|
|
402
|
-
});
|
|
403
|
-
const outTree = stringifyProcessor.runSync(processedAst);
|
|
404
|
-
content = stringifyProcessor.stringify(outTree);
|
|
405
|
-
}
|
|
406
|
-
catch (error) {
|
|
407
|
-
console.warn(`Failed to stringify MDX content: ${error instanceof Error ? error.message : String(error)}`);
|
|
408
|
-
console.warn('Returning original content unchanged due to stringify error.');
|
|
409
|
-
return {
|
|
410
|
-
content: mdxContent,
|
|
411
|
-
hasChanges: false,
|
|
412
|
-
transformedUrls: [],
|
|
413
|
-
};
|
|
414
|
-
}
|
|
415
|
-
// Handle newline formatting to match original input
|
|
416
|
-
if (content.endsWith('\n') && !mdxContent.endsWith('\n')) {
|
|
417
|
-
content = content.slice(0, -1);
|
|
418
|
-
}
|
|
419
|
-
// Preserve leading newlines from original content
|
|
420
|
-
if (mdxContent.startsWith('\n') && !content.startsWith('\n')) {
|
|
421
|
-
content = '\n' + content;
|
|
422
|
-
}
|
|
423
|
-
return {
|
|
424
|
-
content,
|
|
425
|
-
hasChanges: transformedUrls.length > 0,
|
|
426
|
-
transformedUrls,
|
|
427
|
-
};
|
|
428
|
-
}
|
|
429
|
-
// AST-based transformation for MDX files using remark
|
|
430
|
-
function localizeStaticUrlsForFile(file, defaultLocale, targetLocale, hideDefaultLocale, pattern = '/[locale]', // eg /docs/[locale] or /[locale]
|
|
431
|
-
exclude = [], baseDomain) {
|
|
432
|
-
// Use AST-based transformation for MDX files
|
|
433
|
-
return transformMdxUrls(file, defaultLocale, targetLocale, hideDefaultLocale, pattern, exclude, baseDomain || '');
|
|
434
|
-
}
|
|
435
|
-
function cleanPath(path) {
|
|
436
|
-
let cleanedPath = path.startsWith('/') ? path.slice(1) : path;
|
|
437
|
-
cleanedPath = cleanedPath.endsWith('/')
|
|
438
|
-
? cleanedPath.slice(0, -1)
|
|
439
|
-
: cleanedPath;
|
|
440
|
-
return cleanedPath;
|
|
441
|
-
}
|
|
442
|
-
function checkIfPathMatchesPattern(originalUrlArray, patternHeadArray) {
|
|
443
|
-
// check if the pattern head matches the original path
|
|
444
|
-
for (let i = 0; i < patternHeadArray.length; i++) {
|
|
445
|
-
if (patternHeadArray[i] !== originalUrlArray?.[i]) {
|
|
446
|
-
return false;
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
return true;
|
|
450
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import YAML from 'yaml';
|
|
3
|
-
const FRONTMATTER_REGEX = /^---\s*\r?\n([\s\S]*?)\r?\n(---|\.\.\.)\s*(?:\r?\n|$)/;
|
|
4
|
-
function toTitleCase(value) {
|
|
5
|
-
return value
|
|
6
|
-
.split(' ')
|
|
7
|
-
.map((word) => {
|
|
8
|
-
if (!word)
|
|
9
|
-
return '';
|
|
10
|
-
return word[0].toUpperCase() + word.slice(1);
|
|
11
|
-
})
|
|
12
|
-
.join(' ');
|
|
13
|
-
}
|
|
14
|
-
function deriveTitleFromFilename(fileName, defaultLocale) {
|
|
15
|
-
const base = path.basename(fileName, path.extname(fileName));
|
|
16
|
-
if (base.toLowerCase() === 'index') {
|
|
17
|
-
const parentDir = path.dirname(fileName);
|
|
18
|
-
if (parentDir === '.' || parentDir === path.sep) {
|
|
19
|
-
return 'Index';
|
|
20
|
-
}
|
|
21
|
-
const parent = path.basename(parentDir);
|
|
22
|
-
if (parent && defaultLocale && parent === defaultLocale) {
|
|
23
|
-
return 'Index';
|
|
24
|
-
}
|
|
25
|
-
if (parent) {
|
|
26
|
-
return toTitleCase(parent.replace(/[-_]+/g, ' ').trim());
|
|
27
|
-
}
|
|
28
|
-
return 'Index';
|
|
29
|
-
}
|
|
30
|
-
const normalized = base.replace(/[-_]+/g, ' ').replace(/\s+/g, ' ').trim();
|
|
31
|
-
if (!normalized) {
|
|
32
|
-
return base;
|
|
33
|
-
}
|
|
34
|
-
return toTitleCase(normalized);
|
|
35
|
-
}
|
|
36
|
-
function hasMeaningfulTitle(value) {
|
|
37
|
-
if (value === null || value === undefined) {
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
if (typeof value === 'string') {
|
|
41
|
-
return value.trim().length > 0;
|
|
42
|
-
}
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
export function applyMintlifyTitleFallback(content, fileName, defaultLocale) {
|
|
46
|
-
const inferredTitle = deriveTitleFromFilename(fileName, defaultLocale);
|
|
47
|
-
if (!inferredTitle) {
|
|
48
|
-
return { content, addedTitle: false };
|
|
49
|
-
}
|
|
50
|
-
const hasBom = content.startsWith('\uFEFF');
|
|
51
|
-
const contentBody = hasBom ? content.slice(1) : content;
|
|
52
|
-
const newline = contentBody.includes('\r\n') ? '\r\n' : '\n';
|
|
53
|
-
const frontmatterMatch = contentBody.match(FRONTMATTER_REGEX);
|
|
54
|
-
if (frontmatterMatch) {
|
|
55
|
-
const frontmatterContent = frontmatterMatch[1];
|
|
56
|
-
let parsed;
|
|
57
|
-
try {
|
|
58
|
-
parsed = YAML.parse(frontmatterContent);
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
return { content, addedTitle: false };
|
|
62
|
-
}
|
|
63
|
-
if (parsed && hasMeaningfulTitle(parsed.title)) {
|
|
64
|
-
return { content, addedTitle: false };
|
|
65
|
-
}
|
|
66
|
-
const titleLine = YAML.stringify({ title: inferredTitle }).trimEnd();
|
|
67
|
-
const headerEndIndex = contentBody.indexOf(newline) + newline.length;
|
|
68
|
-
const updated = contentBody.slice(0, headerEndIndex) +
|
|
69
|
-
titleLine +
|
|
70
|
-
newline +
|
|
71
|
-
contentBody.slice(headerEndIndex);
|
|
72
|
-
return { content: (hasBom ? '\uFEFF' : '') + updated, addedTitle: true };
|
|
73
|
-
}
|
|
74
|
-
const titleLine = YAML.stringify({ title: inferredTitle }).trimEnd();
|
|
75
|
-
const frontmatterBlock = `---${newline}${titleLine}${newline}---${newline}${newline}`;
|
|
76
|
-
return {
|
|
77
|
-
content: (hasBom ? '\uFEFF' : '') + frontmatterBlock + contentBody,
|
|
78
|
-
addedTitle: true,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { ParseResult } from '@babel/parser';
|
|
2
|
-
import * as t from '@babel/types';
|
|
3
|
-
/**
|
|
4
|
-
* Given an AST determines if the file needs to be compiled as CommonJS or ESM.
|
|
5
|
-
* @param ast - The AST to analyze
|
|
6
|
-
* @returns True if the file needs to be compiled as CommonJS, false if it needs to be compiled as ESM
|
|
7
|
-
*/
|
|
8
|
-
export declare function needsCJS({ ast, warnings, filepath, packageJson, tsconfigJson, }: {
|
|
9
|
-
ast: ParseResult<t.File>;
|
|
10
|
-
warnings: string[];
|
|
11
|
-
filepath: string;
|
|
12
|
-
packageJson?: {
|
|
13
|
-
type?: string;
|
|
14
|
-
};
|
|
15
|
-
tsconfigJson?: {
|
|
16
|
-
compilerOptions?: {
|
|
17
|
-
module?: string;
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
}): boolean;
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import traverseModule from '@babel/traverse';
|
|
2
|
-
import * as t from '@babel/types';
|
|
3
|
-
// Handle CommonJS/ESM interop
|
|
4
|
-
const traverse = traverseModule.default || traverseModule;
|
|
5
|
-
/**
|
|
6
|
-
* Given an AST determines if the file needs to be compiled as CommonJS or ESM.
|
|
7
|
-
* @param ast - The AST to analyze
|
|
8
|
-
* @returns True if the file needs to be compiled as CommonJS, false if it needs to be compiled as ESM
|
|
9
|
-
*/
|
|
10
|
-
export function needsCJS({ ast, warnings, filepath, packageJson, tsconfigJson, }) {
|
|
11
|
-
// Analyze the actual file content to determine module system
|
|
12
|
-
let hasES6Imports = false;
|
|
13
|
-
let hasCommonJSRequire = false;
|
|
14
|
-
traverse(ast, {
|
|
15
|
-
ImportDeclaration() {
|
|
16
|
-
hasES6Imports = true;
|
|
17
|
-
},
|
|
18
|
-
CallExpression(path) {
|
|
19
|
-
if (t.isIdentifier(path.node.callee, { name: 'require' })) {
|
|
20
|
-
hasCommonJSRequire = true;
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
});
|
|
24
|
-
// Determine if we need CommonJS based on actual file content and fallback to config-based logic
|
|
25
|
-
let needsCJS = false;
|
|
26
|
-
if (hasES6Imports && !hasCommonJSRequire) {
|
|
27
|
-
// File uses ES6 imports, so we should use ES6 imports
|
|
28
|
-
needsCJS = false;
|
|
29
|
-
}
|
|
30
|
-
else if (hasCommonJSRequire && !hasES6Imports) {
|
|
31
|
-
// File uses CommonJS require, so we should use CommonJS require
|
|
32
|
-
needsCJS = true;
|
|
33
|
-
}
|
|
34
|
-
else if (hasES6Imports && hasCommonJSRequire) {
|
|
35
|
-
// Mixed usage - this is unusual but we'll default to ES6 imports
|
|
36
|
-
warnings.push(`Mixed ES6 imports and CommonJS require detected in ${filepath}. Defaulting to ES6 imports.`);
|
|
37
|
-
needsCJS = false;
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
// No imports/requires found, fall back to configuration-based logic
|
|
41
|
-
if (filepath.endsWith('.ts') || filepath.endsWith('.tsx')) {
|
|
42
|
-
// For TypeScript files, check tsconfig.json compilerOptions.module
|
|
43
|
-
const moduleSetting = tsconfigJson?.compilerOptions?.module;
|
|
44
|
-
if (moduleSetting === 'commonjs' || moduleSetting === 'node') {
|
|
45
|
-
needsCJS = true;
|
|
46
|
-
}
|
|
47
|
-
else if (moduleSetting === 'esnext' ||
|
|
48
|
-
moduleSetting === 'es2022' ||
|
|
49
|
-
moduleSetting === 'es2020' ||
|
|
50
|
-
moduleSetting === 'es2015' ||
|
|
51
|
-
moduleSetting === 'es6' ||
|
|
52
|
-
moduleSetting === 'node16' ||
|
|
53
|
-
moduleSetting === 'nodenext') {
|
|
54
|
-
needsCJS = false;
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
// Default to ESM for TypeScript files if no module setting is specified
|
|
58
|
-
needsCJS = false;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
else if (filepath.endsWith('.js')) {
|
|
62
|
-
// For JavaScript files, check package.json type
|
|
63
|
-
// If package.json has "type": "module", .js files are treated as ES modules
|
|
64
|
-
needsCJS = packageJson?.type !== 'module';
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
// For other file extensions, default to ESM
|
|
68
|
-
needsCJS = false;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return needsCJS;
|
|
72
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { Settings } from '../types/index.js';
|
|
2
|
-
type DownloadMeta = {
|
|
3
|
-
branchId: string;
|
|
4
|
-
fileId: string;
|
|
5
|
-
versionId: string;
|
|
6
|
-
locale: string;
|
|
7
|
-
};
|
|
8
|
-
/**
|
|
9
|
-
* Persist postprocessed content hashes for recently downloaded files into gt-lock.json.
|
|
10
|
-
*/
|
|
11
|
-
export declare function persistPostProcessHashes(settings: Settings, includeFiles: Set<string> | undefined, downloadedMeta: Map<string, DownloadMeta>): void;
|
|
12
|
-
export {};
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import * as fs from 'node:fs';
|
|
2
|
-
import { ensureNestedObject, getDownloadedVersions, saveDownloadedVersions, } from '../fs/config/downloadedVersions.js';
|
|
3
|
-
import { hashStringSync } from './hash.js';
|
|
4
|
-
/**
|
|
5
|
-
* Persist postprocessed content hashes for recently downloaded files into gt-lock.json.
|
|
6
|
-
*/
|
|
7
|
-
export function persistPostProcessHashes(settings, includeFiles, downloadedMeta) {
|
|
8
|
-
if (!includeFiles || includeFiles.size === 0 || downloadedMeta.size === 0) {
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
const downloadedVersions = getDownloadedVersions(settings.configDirectory);
|
|
12
|
-
let lockUpdated = false;
|
|
13
|
-
for (const filePath of includeFiles) {
|
|
14
|
-
const meta = downloadedMeta.get(filePath);
|
|
15
|
-
if (!meta)
|
|
16
|
-
continue;
|
|
17
|
-
if (!fs.existsSync(filePath))
|
|
18
|
-
continue;
|
|
19
|
-
const content = fs.readFileSync(filePath, 'utf8');
|
|
20
|
-
const hash = hashStringSync(content);
|
|
21
|
-
ensureNestedObject(downloadedVersions.entries, [
|
|
22
|
-
meta.branchId,
|
|
23
|
-
meta.fileId,
|
|
24
|
-
meta.versionId,
|
|
25
|
-
meta.locale,
|
|
26
|
-
]);
|
|
27
|
-
const existing = downloadedVersions.entries[meta.branchId][meta.fileId][meta.versionId][meta.locale] || {};
|
|
28
|
-
if (existing.postProcessHash !== hash) {
|
|
29
|
-
downloadedVersions.entries[meta.branchId][meta.fileId][meta.versionId][meta.locale] = {
|
|
30
|
-
...existing,
|
|
31
|
-
postProcessHash: hash,
|
|
32
|
-
};
|
|
33
|
-
lockUpdated = true;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
if (lockUpdated) {
|
|
37
|
-
saveDownloadedVersions(settings.configDirectory, downloadedVersions);
|
|
38
|
-
}
|
|
39
|
-
}
|