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,9 +0,0 @@
|
|
|
1
|
-
import type { Settings } from '../types/index.js';
|
|
2
|
-
export declare function mirrorAssetsToLocales(settings: Settings): Promise<void>;
|
|
3
|
-
/**
|
|
4
|
-
* If you specify in config you have blob patterns pointing to assets (jpg, png, etc.)
|
|
5
|
-
* Moves static assets into a specified directory and goes thru src files and updates refrence to static assets
|
|
6
|
-
* @param settings
|
|
7
|
-
* @returns
|
|
8
|
-
*/
|
|
9
|
-
export default function processSharedStaticAssets(settings: Settings): Promise<void>;
|
|
@@ -1,384 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import fs from 'node:fs';
|
|
3
|
-
import fg from 'fast-glob';
|
|
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
|
-
import { createFileMapping } from '../formats/files/fileMapping.js';
|
|
12
|
-
import { TEMPLATE_FILE_NAME } from './constants.js';
|
|
13
|
-
function derivePublicPath(outDir, provided) {
|
|
14
|
-
if (provided)
|
|
15
|
-
return provided;
|
|
16
|
-
const norm = outDir.replace(/\\/g, '/');
|
|
17
|
-
if (norm.startsWith('public/'))
|
|
18
|
-
return '/' + norm.slice('public/'.length);
|
|
19
|
-
if (norm.startsWith('static/'))
|
|
20
|
-
return '/' + norm.slice('static/'.length);
|
|
21
|
-
if (norm.startsWith('/'))
|
|
22
|
-
return norm; // already absolute URL path
|
|
23
|
-
return '/' + path.basename(norm);
|
|
24
|
-
}
|
|
25
|
-
function toArray(val) {
|
|
26
|
-
if (!val)
|
|
27
|
-
return [];
|
|
28
|
-
return Array.isArray(val) ? val : [val];
|
|
29
|
-
}
|
|
30
|
-
async function ensureDir(dir) {
|
|
31
|
-
await fs.promises.mkdir(dir, { recursive: true });
|
|
32
|
-
}
|
|
33
|
-
async function moveFile(src, dest) {
|
|
34
|
-
if (src === dest)
|
|
35
|
-
return;
|
|
36
|
-
try {
|
|
37
|
-
await ensureDir(path.dirname(dest));
|
|
38
|
-
await fs.promises.rename(src, dest);
|
|
39
|
-
}
|
|
40
|
-
catch (err) {
|
|
41
|
-
// Fallback to copy+unlink for cross-device or existing files
|
|
42
|
-
if (err &&
|
|
43
|
-
(err.code === 'EXDEV' ||
|
|
44
|
-
err.code === 'EEXIST' ||
|
|
45
|
-
err.code === 'ENOTEMPTY')) {
|
|
46
|
-
const data = await fs.promises.readFile(src);
|
|
47
|
-
await ensureDir(path.dirname(dest));
|
|
48
|
-
await fs.promises.writeFile(dest, data);
|
|
49
|
-
try {
|
|
50
|
-
await fs.promises.unlink(src);
|
|
51
|
-
}
|
|
52
|
-
catch { }
|
|
53
|
-
}
|
|
54
|
-
else if (err && err.code === 'ENOENT') {
|
|
55
|
-
// already moved or missing; ignore
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
throw err;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
async function pathExists(p) {
|
|
64
|
-
try {
|
|
65
|
-
await fs.promises.stat(p);
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
return false;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
async function isDirEmpty(dir) {
|
|
73
|
-
try {
|
|
74
|
-
const entries = await fs.promises.readdir(dir);
|
|
75
|
-
return entries.length === 0;
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
async function removeEmptyDirsUpwards(startDir, stopDir) {
|
|
82
|
-
let current = path.resolve(startDir);
|
|
83
|
-
const stop = path.resolve(stopDir);
|
|
84
|
-
while (current.startsWith(stop)) {
|
|
85
|
-
if (current === stop)
|
|
86
|
-
break;
|
|
87
|
-
const exists = await pathExists(current);
|
|
88
|
-
if (!exists)
|
|
89
|
-
break;
|
|
90
|
-
const empty = await isDirEmpty(current);
|
|
91
|
-
if (!empty)
|
|
92
|
-
break;
|
|
93
|
-
try {
|
|
94
|
-
await fs.promises.rmdir(current);
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
const parent = path.dirname(current);
|
|
100
|
-
if (parent === current)
|
|
101
|
-
break;
|
|
102
|
-
current = parent;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
function stripQueryAndHash(url) {
|
|
106
|
-
const match = url.match(/^[^?#]+/);
|
|
107
|
-
const base = match ? match[0] : url;
|
|
108
|
-
const suffix = url.slice(base.length);
|
|
109
|
-
return { base, suffix };
|
|
110
|
-
}
|
|
111
|
-
function rewriteMdxContent(content, filePath, pathMap) {
|
|
112
|
-
let changed = false;
|
|
113
|
-
let ast;
|
|
114
|
-
try {
|
|
115
|
-
const processor = unified()
|
|
116
|
-
.use(remarkParse)
|
|
117
|
-
.use(remarkFrontmatter, ['yaml', 'toml'])
|
|
118
|
-
.use(remarkMdx);
|
|
119
|
-
ast = processor.runSync(processor.parse(content));
|
|
120
|
-
}
|
|
121
|
-
catch (e) {
|
|
122
|
-
return { content, changed: false };
|
|
123
|
-
}
|
|
124
|
-
const fileDir = path.dirname(filePath);
|
|
125
|
-
// Helper to resolve and possibly rewrite a URL
|
|
126
|
-
const maybeRewrite = (url) => {
|
|
127
|
-
if (!url ||
|
|
128
|
-
/^(https?:)?\/\//i.test(url) ||
|
|
129
|
-
url.startsWith('data:') ||
|
|
130
|
-
url.startsWith('#') ||
|
|
131
|
-
url.startsWith('mailto:') ||
|
|
132
|
-
url.startsWith('tel:')) {
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
const { base, suffix } = stripQueryAndHash(url);
|
|
136
|
-
// Only handle relative paths
|
|
137
|
-
if (base.startsWith('/'))
|
|
138
|
-
return null;
|
|
139
|
-
const abs = path.resolve(fileDir, base);
|
|
140
|
-
const normAbs = path.normalize(abs);
|
|
141
|
-
const mapped = pathMap.get(normAbs);
|
|
142
|
-
if (mapped) {
|
|
143
|
-
changed = true;
|
|
144
|
-
return mapped + suffix;
|
|
145
|
-
}
|
|
146
|
-
return null;
|
|
147
|
-
};
|
|
148
|
-
visit(ast, (node) => {
|
|
149
|
-
// Markdown image: 
|
|
150
|
-
if (node.type === 'image' && typeof node.url === 'string') {
|
|
151
|
-
const newUrl = maybeRewrite(node.url);
|
|
152
|
-
if (newUrl)
|
|
153
|
-
node.url = newUrl;
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
// Markdown link: [text](url) — useful for PDFs and other downloadable assets
|
|
157
|
-
if (node.type === 'link' && typeof node.url === 'string') {
|
|
158
|
-
const newUrl = maybeRewrite(node.url);
|
|
159
|
-
if (newUrl)
|
|
160
|
-
node.url = newUrl;
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
// MDX <img src="..." />
|
|
164
|
-
if ((node.type === 'mdxJsxFlowElement' ||
|
|
165
|
-
node.type === 'mdxJsxTextElement') &&
|
|
166
|
-
Array.isArray(node.attributes)) {
|
|
167
|
-
for (const attr of node.attributes) {
|
|
168
|
-
if (attr &&
|
|
169
|
-
attr.type === 'mdxJsxAttribute' &&
|
|
170
|
-
(attr.name === 'src' || attr.name === 'href') &&
|
|
171
|
-
typeof attr.value === 'string') {
|
|
172
|
-
const newUrl = maybeRewrite(attr.value);
|
|
173
|
-
if (newUrl)
|
|
174
|
-
attr.value = newUrl;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
try {
|
|
180
|
-
const s = unified()
|
|
181
|
-
.use(remarkFrontmatter, ['yaml', 'toml'])
|
|
182
|
-
.use(remarkMdx)
|
|
183
|
-
.use(normalizeCJKCharacters)
|
|
184
|
-
.use(escapeHtmlInTextNodes)
|
|
185
|
-
.use(remarkStringify, {
|
|
186
|
-
handlers: {
|
|
187
|
-
text(node) {
|
|
188
|
-
return node.value;
|
|
189
|
-
},
|
|
190
|
-
},
|
|
191
|
-
});
|
|
192
|
-
const outTree = s.runSync(ast);
|
|
193
|
-
let out = s.stringify(outTree);
|
|
194
|
-
// Preserve trailing/leading newlines similar to localizeStaticUrls
|
|
195
|
-
if (out.endsWith('\n') && !content.endsWith('\n'))
|
|
196
|
-
out = out.slice(0, -1);
|
|
197
|
-
if (content.startsWith('\n') && !out.startsWith('\n'))
|
|
198
|
-
out = '\n' + out;
|
|
199
|
-
return { content: out, changed };
|
|
200
|
-
}
|
|
201
|
-
catch (e) {
|
|
202
|
-
return { content, changed: false };
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
function resolveAssetPaths(include, cwd) {
|
|
206
|
-
const assetPaths = new Set();
|
|
207
|
-
for (let pattern of include) {
|
|
208
|
-
if (pattern.startsWith('/'))
|
|
209
|
-
pattern = pattern.slice(1);
|
|
210
|
-
const matches = fg.sync(path.resolve(cwd, pattern), { absolute: true });
|
|
211
|
-
for (const m of matches)
|
|
212
|
-
assetPaths.add(path.normalize(m));
|
|
213
|
-
}
|
|
214
|
-
return assetPaths;
|
|
215
|
-
}
|
|
216
|
-
export async function mirrorAssetsToLocales(settings) {
|
|
217
|
-
const cfg = settings.sharedStaticAssets;
|
|
218
|
-
if (!cfg?.mirrorToLocales)
|
|
219
|
-
return;
|
|
220
|
-
if (!settings.files)
|
|
221
|
-
return;
|
|
222
|
-
const cwd = process.cwd();
|
|
223
|
-
const include = toArray(cfg.include);
|
|
224
|
-
if (include.length === 0)
|
|
225
|
-
return;
|
|
226
|
-
const assetPaths = resolveAssetPaths(include, cwd);
|
|
227
|
-
if (assetPaths.size === 0)
|
|
228
|
-
return;
|
|
229
|
-
const { resolvedPaths, placeholderPaths, transformPaths } = settings.files;
|
|
230
|
-
const targetLocales = settings.locales.filter((l) => l !== settings.defaultLocale);
|
|
231
|
-
if (targetLocales.length === 0)
|
|
232
|
-
return;
|
|
233
|
-
const fileMapping = createFileMapping(resolvedPaths, placeholderPaths, transformPaths, targetLocales, settings.defaultLocale);
|
|
234
|
-
for (const locale of targetLocales) {
|
|
235
|
-
const filesMap = fileMapping[locale];
|
|
236
|
-
if (!filesMap)
|
|
237
|
-
continue;
|
|
238
|
-
// Extract unique (sourceDir, targetDir) pairs from the file mapping
|
|
239
|
-
const dirPairs = new Map();
|
|
240
|
-
for (const [sourcePath, targetPath] of Object.entries(filesMap)) {
|
|
241
|
-
if (sourcePath === TEMPLATE_FILE_NAME)
|
|
242
|
-
continue;
|
|
243
|
-
const sourceDir = path.dirname(path.resolve(cwd, sourcePath));
|
|
244
|
-
const targetDir = path.dirname(path.resolve(cwd, targetPath));
|
|
245
|
-
if (sourceDir !== targetDir) {
|
|
246
|
-
dirPairs.set(sourceDir, targetDir);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
if (dirPairs.size === 0)
|
|
250
|
-
continue;
|
|
251
|
-
// Derive ancestor directory pairs by walking up from each known pair.
|
|
252
|
-
// e.g. if docs/guide → ja/docs/guide, infer docs → ja/docs.
|
|
253
|
-
// Stop at cwd or when an existing pair conflicts.
|
|
254
|
-
const ancestorPairs = new Map();
|
|
255
|
-
for (const [sourceDir, targetDir] of dirPairs) {
|
|
256
|
-
let s = path.dirname(sourceDir);
|
|
257
|
-
let t = path.dirname(targetDir);
|
|
258
|
-
while (s.startsWith(cwd) && s !== cwd) {
|
|
259
|
-
const existing = dirPairs.get(s) ?? ancestorPairs.get(s);
|
|
260
|
-
if (existing !== undefined) {
|
|
261
|
-
if (existing !== t)
|
|
262
|
-
break; // conflict — different transforms
|
|
263
|
-
}
|
|
264
|
-
else {
|
|
265
|
-
ancestorPairs.set(s, t);
|
|
266
|
-
}
|
|
267
|
-
s = path.dirname(s);
|
|
268
|
-
t = path.dirname(t);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
for (const [s, t] of ancestorPairs) {
|
|
272
|
-
dirPairs.set(s, t);
|
|
273
|
-
}
|
|
274
|
-
// Sort source dirs by length descending so longest prefix matches first
|
|
275
|
-
const sortedPairs = [...dirPairs.entries()].sort((a, b) => b[0].length - a[0].length);
|
|
276
|
-
for (const assetAbs of assetPaths) {
|
|
277
|
-
// Find the directory pair whose sourceDir is the longest prefix of the asset
|
|
278
|
-
let bestSource;
|
|
279
|
-
let bestTarget;
|
|
280
|
-
for (const [sourceDir, targetDir] of sortedPairs) {
|
|
281
|
-
if (assetAbs.startsWith(sourceDir + path.sep) ||
|
|
282
|
-
assetAbs.startsWith(sourceDir + '/')) {
|
|
283
|
-
bestSource = sourceDir;
|
|
284
|
-
bestTarget = targetDir;
|
|
285
|
-
break;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
if (!bestSource || !bestTarget)
|
|
289
|
-
continue;
|
|
290
|
-
const relFromSource = path.relative(bestSource, assetAbs);
|
|
291
|
-
const targetAsset = path.resolve(bestTarget, relFromSource);
|
|
292
|
-
// Skip if target already exists with same size
|
|
293
|
-
try {
|
|
294
|
-
const [srcStat, dstStat] = await Promise.all([
|
|
295
|
-
fs.promises.stat(assetAbs),
|
|
296
|
-
fs.promises.stat(targetAsset),
|
|
297
|
-
]);
|
|
298
|
-
if (dstStat.isFile() && srcStat.size === dstStat.size)
|
|
299
|
-
continue;
|
|
300
|
-
}
|
|
301
|
-
catch {
|
|
302
|
-
// target doesn't exist, proceed with copy
|
|
303
|
-
}
|
|
304
|
-
await ensureDir(path.dirname(targetAsset));
|
|
305
|
-
await fs.promises.copyFile(assetAbs, targetAsset);
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* If you specify in config you have blob patterns pointing to assets (jpg, png, etc.)
|
|
311
|
-
* Moves static assets into a specified directory and goes thru src files and updates refrence to static assets
|
|
312
|
-
* @param settings
|
|
313
|
-
* @returns
|
|
314
|
-
*/
|
|
315
|
-
export default async function processSharedStaticAssets(settings) {
|
|
316
|
-
const cfg = settings.sharedStaticAssets;
|
|
317
|
-
if (!cfg)
|
|
318
|
-
return;
|
|
319
|
-
// mirrorToLocales is handled separately after translations are downloaded
|
|
320
|
-
if (cfg.mirrorToLocales)
|
|
321
|
-
return;
|
|
322
|
-
const cwd = process.cwd();
|
|
323
|
-
const include = toArray(cfg.include);
|
|
324
|
-
if (include.length === 0)
|
|
325
|
-
return;
|
|
326
|
-
// Resolve assets
|
|
327
|
-
const assetPaths = resolveAssetPaths(include, cwd);
|
|
328
|
-
if (assetPaths.size === 0)
|
|
329
|
-
return;
|
|
330
|
-
if (!cfg.outDir)
|
|
331
|
-
return;
|
|
332
|
-
const outDirInput = cfg.outDir.startsWith('/')
|
|
333
|
-
? cfg.outDir.slice(1)
|
|
334
|
-
: cfg.outDir;
|
|
335
|
-
const outDirAbs = path.resolve(cwd, outDirInput);
|
|
336
|
-
const publicPath = derivePublicPath(outDirInput, cfg.publicPath);
|
|
337
|
-
// Map original absolute path -> public URL
|
|
338
|
-
const originalToPublic = new Map();
|
|
339
|
-
for (const abs of assetPaths) {
|
|
340
|
-
const relFromRoot = path.relative(cwd, abs).replace(/\\/g, '/');
|
|
341
|
-
const publicUrl = (publicPath.endsWith('/') ? publicPath.slice(0, -1) : publicPath) +
|
|
342
|
-
'/' +
|
|
343
|
-
relFromRoot;
|
|
344
|
-
originalToPublic.set(path.normalize(abs), publicUrl);
|
|
345
|
-
}
|
|
346
|
-
// Move assets to outDir, preserving relative structure
|
|
347
|
-
for (const abs of assetPaths) {
|
|
348
|
-
const relFromRoot = path.relative(cwd, abs);
|
|
349
|
-
const destAbs = path.resolve(outDirAbs, relFromRoot);
|
|
350
|
-
// Skip if already in destination
|
|
351
|
-
if (path.normalize(abs) === path.normalize(destAbs))
|
|
352
|
-
continue;
|
|
353
|
-
// If destination exists, assume already moved
|
|
354
|
-
try {
|
|
355
|
-
const st = await fs.promises.stat(destAbs).catch(() => null);
|
|
356
|
-
if (st && st.isFile()) {
|
|
357
|
-
// Remove source if it still exists
|
|
358
|
-
await fs.promises.unlink(abs).catch(() => { });
|
|
359
|
-
await removeEmptyDirsUpwards(path.dirname(abs), cwd);
|
|
360
|
-
continue;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
catch { }
|
|
364
|
-
await moveFile(abs, destAbs);
|
|
365
|
-
await removeEmptyDirsUpwards(path.dirname(abs), cwd);
|
|
366
|
-
}
|
|
367
|
-
// Rewrite references in default-locale files we send for translation
|
|
368
|
-
const resolved = settings.files?.resolvedPaths || {};
|
|
369
|
-
const mdFiles = [...(resolved.mdx || []), ...(resolved.md || [])];
|
|
370
|
-
await Promise.all(mdFiles.map(async (filePath) => {
|
|
371
|
-
// only rewrite existing files
|
|
372
|
-
const exists = await fs.promises
|
|
373
|
-
.stat(filePath)
|
|
374
|
-
.then(() => true)
|
|
375
|
-
.catch(() => false);
|
|
376
|
-
if (!exists)
|
|
377
|
-
return;
|
|
378
|
-
const orig = await fs.promises.readFile(filePath, 'utf8');
|
|
379
|
-
const { content: out, changed } = rewriteMdxContent(orig, filePath, originalToPublic);
|
|
380
|
-
if (changed) {
|
|
381
|
-
await fs.promises.writeFile(filePath, out, 'utf8');
|
|
382
|
-
}
|
|
383
|
-
}));
|
|
384
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Validates if an MDX file content can be parsed as a valid AST
|
|
3
|
-
* @param content - The MDX file content to validate
|
|
4
|
-
* @param filePath - The file path for error reporting
|
|
5
|
-
* @returns object with isValid boolean and optional error message
|
|
6
|
-
*/
|
|
7
|
-
export declare function isValidMdx(content: string, filePath: string): {
|
|
8
|
-
isValid: boolean;
|
|
9
|
-
error?: string;
|
|
10
|
-
};
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { unified } from 'unified';
|
|
2
|
-
import remarkParse from 'remark-parse';
|
|
3
|
-
import remarkMdx from 'remark-mdx';
|
|
4
|
-
import remarkFrontmatter from 'remark-frontmatter';
|
|
5
|
-
/**
|
|
6
|
-
* Validates if an MDX file content can be parsed as a valid AST
|
|
7
|
-
* @param content - The MDX file content to validate
|
|
8
|
-
* @param filePath - The file path for error reporting
|
|
9
|
-
* @returns object with isValid boolean and optional error message
|
|
10
|
-
*/
|
|
11
|
-
export function isValidMdx(content, filePath) {
|
|
12
|
-
try {
|
|
13
|
-
const parseProcessor = unified()
|
|
14
|
-
.use(remarkParse)
|
|
15
|
-
.use(remarkFrontmatter, ['yaml', 'toml'])
|
|
16
|
-
.use(remarkMdx);
|
|
17
|
-
const ast = parseProcessor.parse(content);
|
|
18
|
-
parseProcessor.runSync(ast);
|
|
19
|
-
return { isValid: true };
|
|
20
|
-
}
|
|
21
|
-
catch (error) {
|
|
22
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
23
|
-
return { isValid: false, error: errorMessage };
|
|
24
|
-
}
|
|
25
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Wraps plain URLs in markdown link syntax [url](url) so that
|
|
3
|
-
* translation pipelines preserve the URL separately from surrounding text.
|
|
4
|
-
*
|
|
5
|
-
* Uses remark AST parsing to identify URLs that appear in text nodes only.
|
|
6
|
-
*
|
|
7
|
-
*/
|
|
8
|
-
export default function wrapPlainUrls(content: string): string;
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { unified } from 'unified';
|
|
2
|
-
import remarkParse from 'remark-parse';
|
|
3
|
-
import remarkMdx from 'remark-mdx';
|
|
4
|
-
import remarkFrontmatter from 'remark-frontmatter';
|
|
5
|
-
import { visit } from 'unist-util-visit';
|
|
6
|
-
/**
|
|
7
|
-
* Wraps plain URLs in markdown link syntax [url](url) so that
|
|
8
|
-
* translation pipelines preserve the URL separately from surrounding text.
|
|
9
|
-
*
|
|
10
|
-
* Uses remark AST parsing to identify URLs that appear in text nodes only.
|
|
11
|
-
*
|
|
12
|
-
*/
|
|
13
|
-
export default function wrapPlainUrls(content) {
|
|
14
|
-
const URL_REGEX = /https?:\/\/[^\s<>\[\]]*[^\s<>\[\].,;:!?'"\]}>]/g;
|
|
15
|
-
let ast;
|
|
16
|
-
try {
|
|
17
|
-
const processor = unified()
|
|
18
|
-
.use(remarkParse)
|
|
19
|
-
.use(remarkFrontmatter, ['yaml', 'toml'])
|
|
20
|
-
.use(remarkMdx);
|
|
21
|
-
ast = processor.parse(content);
|
|
22
|
-
ast = processor.runSync(ast);
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
// If parsing fails, return content unchanged
|
|
26
|
-
return content;
|
|
27
|
-
}
|
|
28
|
-
// Collect all URL replacements from text nodes with their positions
|
|
29
|
-
const replacements = [];
|
|
30
|
-
visit(ast, 'text', (node, _index, parent) => {
|
|
31
|
-
// Skip text nodes inside links — those are already display text for a link
|
|
32
|
-
if (parent && parent.type === 'link')
|
|
33
|
-
return;
|
|
34
|
-
const pos = node.position;
|
|
35
|
-
if (!pos)
|
|
36
|
-
return;
|
|
37
|
-
const value = node.value;
|
|
38
|
-
let match;
|
|
39
|
-
while ((match = URL_REGEX.exec(value)) !== null) {
|
|
40
|
-
let url = match[0];
|
|
41
|
-
const nodeStartOffset = pos.start.offset;
|
|
42
|
-
if (nodeStartOffset === undefined)
|
|
43
|
-
continue;
|
|
44
|
-
// Trim unbalanced trailing ')' so that prose like "(see https://example.com)"
|
|
45
|
-
// doesn't absorb the surrounding paren, while Wikipedia-style URLs with
|
|
46
|
-
// balanced parens (e.g. /wiki/Unix_(operating_system)) are kept intact.
|
|
47
|
-
while (url.endsWith(')')) {
|
|
48
|
-
const open = url.split('(').length - 1;
|
|
49
|
-
const close = url.split(')').length - 1;
|
|
50
|
-
if (close > open) {
|
|
51
|
-
url = url.slice(0, -1);
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
// Calculate the absolute offset in the original content
|
|
58
|
-
const urlStart = nodeStartOffset + match.index;
|
|
59
|
-
const urlEnd = urlStart + url.length;
|
|
60
|
-
replacements.push({ start: urlStart, end: urlEnd, url });
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
if (replacements.length === 0)
|
|
64
|
-
return content;
|
|
65
|
-
// Apply replacements in reverse order to preserve positions
|
|
66
|
-
let result = content;
|
|
67
|
-
for (let i = replacements.length - 1; i >= 0; i--) {
|
|
68
|
-
const { start, end, url } = replacements[i];
|
|
69
|
-
result = result.slice(0, start) + `[${url}](${url})` + result.slice(end);
|
|
70
|
-
}
|
|
71
|
-
return result;
|
|
72
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { Settings } from '../types/index.js';
|
|
2
|
-
import { EnqueueFilesResult } from 'generaltranslation/types';
|
|
3
|
-
import { BranchData } from '../types/branch.js';
|
|
4
|
-
export type FileTranslationData = {
|
|
5
|
-
[fileId: string]: {
|
|
6
|
-
versionId: string;
|
|
7
|
-
fileName: string;
|
|
8
|
-
};
|
|
9
|
-
};
|
|
10
|
-
/**
|
|
11
|
-
* Checks the status of translations and downloads them using a workflow pattern
|
|
12
|
-
* @param fileVersionData - Mapping of file IDs to their version and name information
|
|
13
|
-
* @param jobData - Optional job data from enqueue operation
|
|
14
|
-
* @param locales - The locales to wait for
|
|
15
|
-
* @param timeoutDuration - The timeout duration for the wait in seconds
|
|
16
|
-
* @param resolveOutputPath - Function to resolve the output path for a given source path and locale
|
|
17
|
-
* @param options - Settings configuration
|
|
18
|
-
* @param forceRetranslation - Whether to force retranslation
|
|
19
|
-
* @param forceDownload - Whether to force download even if file exists
|
|
20
|
-
* @returns True if all translations are downloaded successfully, false otherwise
|
|
21
|
-
*/
|
|
22
|
-
export declare function runDownloadWorkflow({ fileVersionData, jobData, branchData, locales, timeoutDuration, resolveOutputPath, options, forceRetranslation, forceDownload, }: {
|
|
23
|
-
fileVersionData: FileTranslationData;
|
|
24
|
-
jobData: EnqueueFilesResult | undefined;
|
|
25
|
-
branchData: BranchData | undefined;
|
|
26
|
-
locales: string[];
|
|
27
|
-
timeoutDuration: number;
|
|
28
|
-
resolveOutputPath: (sourcePath: string, locale: string) => string | null;
|
|
29
|
-
options: Settings;
|
|
30
|
-
forceRetranslation?: boolean;
|
|
31
|
-
forceDownload?: boolean;
|
|
32
|
-
}): Promise<boolean>;
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { gt } from '../utils/gt.js';
|
|
3
|
-
import { clearLocaleDirs } from '../fs/clearLocaleDirs.js';
|
|
4
|
-
import { PollTranslationJobsStep, } from './steps/PollJobsStep.js';
|
|
5
|
-
import { DownloadTranslationsStep } from './steps/DownloadStep.js';
|
|
6
|
-
import { logErrorAndExit } from '../console/logging.js';
|
|
7
|
-
import { logger } from '../console/logger.js';
|
|
8
|
-
import { recordWarning } from '../state/translateWarnings.js';
|
|
9
|
-
import { BranchStep } from './steps/BranchStep.js';
|
|
10
|
-
import chalk from 'chalk';
|
|
11
|
-
/**
|
|
12
|
-
* Checks the status of translations and downloads them using a workflow pattern
|
|
13
|
-
* @param fileVersionData - Mapping of file IDs to their version and name information
|
|
14
|
-
* @param jobData - Optional job data from enqueue operation
|
|
15
|
-
* @param locales - The locales to wait for
|
|
16
|
-
* @param timeoutDuration - The timeout duration for the wait in seconds
|
|
17
|
-
* @param resolveOutputPath - Function to resolve the output path for a given source path and locale
|
|
18
|
-
* @param options - Settings configuration
|
|
19
|
-
* @param forceRetranslation - Whether to force retranslation
|
|
20
|
-
* @param forceDownload - Whether to force download even if file exists
|
|
21
|
-
* @returns True if all translations are downloaded successfully, false otherwise
|
|
22
|
-
*/
|
|
23
|
-
export async function runDownloadWorkflow({ fileVersionData, jobData, branchData, locales, timeoutDuration, resolveOutputPath, options, forceRetranslation, forceDownload, }) {
|
|
24
|
-
if (!branchData) {
|
|
25
|
-
// Run the branch step
|
|
26
|
-
const branchStep = new BranchStep(gt, options);
|
|
27
|
-
const branchResult = await branchStep.run();
|
|
28
|
-
await branchStep.wait();
|
|
29
|
-
if (!branchResult) {
|
|
30
|
-
return logErrorAndExit('Failed to resolve git branch information.');
|
|
31
|
-
}
|
|
32
|
-
branchData = branchResult;
|
|
33
|
-
}
|
|
34
|
-
// Prepare the query data
|
|
35
|
-
const fileQueryData = prepareFileQueryData(fileVersionData, locales, branchData);
|
|
36
|
-
// Clear translated files before any downloads (if enabled)
|
|
37
|
-
if (options.options?.experimentalClearLocaleDirs === true &&
|
|
38
|
-
fileQueryData.length > 0) {
|
|
39
|
-
const translatedFiles = new Set(fileQueryData
|
|
40
|
-
.map((file) => {
|
|
41
|
-
const outputPath = resolveOutputPath(file.fileName, file.locale);
|
|
42
|
-
// Only clear if the output path is different from the source (i.e., there's a transform)
|
|
43
|
-
return outputPath !== null && outputPath !== file.fileName
|
|
44
|
-
? outputPath
|
|
45
|
-
: null;
|
|
46
|
-
})
|
|
47
|
-
.filter((path) => path !== null));
|
|
48
|
-
// Derive cwd from config path
|
|
49
|
-
const cwd = path.dirname(options.config);
|
|
50
|
-
await clearLocaleDirs(translatedFiles, locales, options.options?.clearLocaleDirsExclude, cwd);
|
|
51
|
-
}
|
|
52
|
-
// Initialize download status
|
|
53
|
-
const fileTracker = {
|
|
54
|
-
completed: new Map(),
|
|
55
|
-
inProgress: new Map(),
|
|
56
|
-
failed: new Map(),
|
|
57
|
-
skipped: new Map(),
|
|
58
|
-
};
|
|
59
|
-
// Step 1: Poll translation jobs if jobData exists
|
|
60
|
-
let pollTimedOut = false;
|
|
61
|
-
if (jobData) {
|
|
62
|
-
const pollStep = new PollTranslationJobsStep(gt);
|
|
63
|
-
const pollResult = await pollStep.run({
|
|
64
|
-
fileTracker,
|
|
65
|
-
fileQueryData,
|
|
66
|
-
jobData,
|
|
67
|
-
timeoutDuration,
|
|
68
|
-
forceRetranslation,
|
|
69
|
-
});
|
|
70
|
-
await pollStep.wait();
|
|
71
|
-
if (pollResult.fileTracker.failed.size > 0) {
|
|
72
|
-
logger.error(`${chalk.red(`${pollResult.fileTracker.failed.size} file(s) failed to translate:`)}\n${Array.from(pollResult.fileTracker.failed.entries())
|
|
73
|
-
.map(([, value]) => `- ${value.fileName}`)
|
|
74
|
-
.join('\n')}`);
|
|
75
|
-
for (const [, value] of pollResult.fileTracker.failed) {
|
|
76
|
-
recordWarning('failed_translation', value.fileName, `Failed to translate for locale ${value.locale}`);
|
|
77
|
-
}
|
|
78
|
-
// If all files failed translation, exit early
|
|
79
|
-
if (pollResult.fileTracker.completed.size === 0) {
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
// Even if polling timed out, still download whatever completed successfully
|
|
84
|
-
if (!pollResult.success) {
|
|
85
|
-
pollTimedOut = true;
|
|
86
|
-
if (pollResult.fileTracker.completed.size > 0) {
|
|
87
|
-
logger.warn(chalk.yellow(`Timed out, but ${pollResult.fileTracker.completed.size} translation(s) completed successfully. Downloading completed files...`));
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
return false;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
for (const file of fileQueryData) {
|
|
96
|
-
// Staging - assume all files are completed
|
|
97
|
-
fileTracker.completed.set(`${file.branchId}:${file.fileId}:${file.versionId}:${file.locale}`, file);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
// Step 2: Download translations
|
|
101
|
-
const downloadStep = new DownloadTranslationsStep(gt, options);
|
|
102
|
-
const downloadResult = await downloadStep.run({
|
|
103
|
-
fileTracker,
|
|
104
|
-
resolveOutputPath,
|
|
105
|
-
forceDownload,
|
|
106
|
-
});
|
|
107
|
-
await downloadStep.wait();
|
|
108
|
-
// If polling timed out, report failure even though we downloaded what we could
|
|
109
|
-
if (pollTimedOut) {
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
return downloadResult;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Prepares the file query data from input data and locales
|
|
116
|
-
*/
|
|
117
|
-
function prepareFileQueryData(fileVersionData, locales, branchData) {
|
|
118
|
-
const fileQueryData = [];
|
|
119
|
-
for (const fileId in fileVersionData) {
|
|
120
|
-
for (const locale of locales) {
|
|
121
|
-
fileQueryData.push({
|
|
122
|
-
versionId: fileVersionData[fileId].versionId,
|
|
123
|
-
fileName: fileVersionData[fileId].fileName,
|
|
124
|
-
fileId,
|
|
125
|
-
locale,
|
|
126
|
-
branchId: branchData.currentBranch.id,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
return fileQueryData;
|
|
131
|
-
}
|