gt 2.14.35 → 2.14.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -1
- package/dist/api/collectUserEditDiffs.js +112 -155
- package/dist/api/collectUserEditDiffs.js.map +1 -0
- package/dist/api/downloadFileBatch.js +164 -241
- package/dist/api/downloadFileBatch.js.map +1 -0
- package/dist/api/saveLocalEdits.js +37 -41
- package/dist/api/saveLocalEdits.js.map +1 -0
- package/dist/bin/bin-entry.js +17 -7
- package/dist/bin/bin-entry.js.map +1 -0
- package/dist/bin/bin-main.js +43 -61
- package/dist/bin/bin-main.js.map +1 -0
- package/dist/cli/base.js +382 -497
- package/dist/cli/base.js.map +1 -0
- package/dist/cli/commands/download.js +41 -49
- package/dist/cli/commands/download.js.map +1 -0
- package/dist/cli/commands/enqueue.js +26 -25
- package/dist/cli/commands/enqueue.js.map +1 -0
- package/dist/cli/commands/setupProject.js +33 -36
- package/dist/cli/commands/setupProject.js.map +1 -0
- package/dist/cli/commands/stage.js +53 -61
- package/dist/cli/commands/stage.js.map +1 -0
- package/dist/cli/commands/translate.js +75 -112
- package/dist/cli/commands/translate.js.map +1 -0
- package/dist/cli/commands/upload.js +185 -213
- package/dist/cli/commands/upload.js.map +1 -0
- package/dist/cli/commands/utils/validation.js +39 -34
- package/dist/cli/commands/utils/validation.js.map +1 -0
- package/dist/cli/flags.js +35 -62
- package/dist/cli/flags.js.map +1 -0
- package/dist/cli/inline.js +112 -137
- package/dist/cli/inline.js.map +1 -0
- package/dist/cli/next.js +17 -12
- package/dist/cli/next.js.map +1 -0
- package/dist/cli/node.js +19 -15
- package/dist/cli/node.js.map +1 -0
- package/dist/cli/python.js +13 -8
- package/dist/cli/python.js.map +1 -0
- package/dist/cli/react.js +61 -78
- package/dist/cli/react.js.map +1 -0
- package/dist/config/defaults.js +16 -11
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/generateSettings.js +167 -269
- package/dist/config/generateSettings.js.map +1 -0
- package/dist/config/optionPresets.js +78 -96
- package/dist/config/optionPresets.js.map +1 -0
- package/dist/config/resolveConfig.js +27 -32
- package/dist/config/resolveConfig.js.map +1 -0
- package/dist/config/utils.js +7 -3
- package/dist/config/utils.js.map +1 -0
- package/dist/config/validateSettings.js +19 -30
- package/dist/config/validateSettings.js.map +1 -0
- package/dist/console/colors.js +18 -13
- package/dist/console/colors.js.map +1 -0
- package/dist/console/displayTranslateSummary.js +40 -37
- package/dist/console/displayTranslateSummary.js.map +1 -0
- package/dist/console/formatting.js +8 -5
- package/dist/console/formatting.js.map +1 -0
- package/dist/console/index.d.ts +11 -9
- package/dist/console/index.js +53 -50
- package/dist/console/index.js.map +1 -0
- package/dist/console/inkFields.d.ts +23 -0
- package/dist/console/inkFields.js +87 -0
- package/dist/console/inkFields.js.map +1 -0
- package/dist/console/inkLayout.d.ts +7 -0
- package/dist/console/inkLayout.js +139 -0
- package/dist/console/inkLayout.js.map +1 -0
- package/dist/console/inkLocaleData.d.ts +4 -0
- package/dist/console/inkLocaleData.js +32 -0
- package/dist/console/inkLocaleData.js.map +1 -0
- package/dist/console/inkPrompts.d.ts +8 -0
- package/dist/console/inkPrompts.js +496 -0
- package/dist/console/inkPrompts.js.map +1 -0
- package/dist/console/inkSession.d.ts +3 -0
- package/dist/console/inkSession.js +42 -0
- package/dist/console/inkSession.js.map +1 -0
- package/dist/console/inkTerminal.d.ts +4 -0
- package/dist/console/inkTerminal.js +15 -0
- package/dist/console/inkTerminal.js.map +1 -0
- package/dist/console/inkTypes.d.ts +66 -0
- package/dist/console/inkTypes.js +1 -0
- package/dist/console/inkUtils.d.ts +24 -0
- package/dist/console/inkUtils.js +87 -0
- package/dist/console/inkUtils.js.map +1 -0
- package/dist/console/logger.js +209 -249
- package/dist/console/logger.js.map +1 -0
- package/dist/console/logging.d.ts +14 -0
- package/dist/console/logging.js +203 -162
- package/dist/console/logging.js.map +1 -0
- package/dist/console/promptParsing.d.ts +5 -0
- package/dist/console/promptParsing.js +28 -0
- package/dist/console/promptParsing.js.map +1 -0
- package/dist/console/terminalSession.d.ts +5 -0
- package/dist/console/terminalSession.js +38 -0
- package/dist/console/terminalSession.js.map +1 -0
- package/dist/extraction/index.js +3 -2
- package/dist/extraction/mapToUpdates.js +19 -18
- package/dist/extraction/mapToUpdates.js.map +1 -0
- package/dist/extraction/postProcess.js +68 -86
- package/dist/extraction/postProcess.js.map +1 -0
- package/dist/formats/files/aggregateFiles.js +223 -304
- package/dist/formats/files/aggregateFiles.js.map +1 -0
- package/dist/formats/files/collectFiles.js +53 -54
- package/dist/formats/files/collectFiles.js.map +1 -0
- package/dist/formats/files/convertToFileTranslationData.js +21 -19
- package/dist/formats/files/convertToFileTranslationData.js.map +1 -0
- package/dist/formats/files/fileMapping.js +82 -119
- package/dist/formats/files/fileMapping.js.map +1 -0
- package/dist/formats/files/preprocess/mdx.js +15 -12
- package/dist/formats/files/preprocess/mdx.js.map +1 -0
- package/dist/formats/files/preprocess/mintlify.js +15 -13
- package/dist/formats/files/preprocess/mintlify.js.map +1 -0
- package/dist/formats/files/preprocessContent.js +20 -21
- package/dist/formats/files/preprocessContent.js.map +1 -0
- package/dist/formats/files/save.js +18 -15
- package/dist/formats/files/save.js.map +1 -0
- package/dist/formats/files/supportedFiles.js +27 -22
- package/dist/formats/files/supportedFiles.js.map +1 -0
- package/dist/formats/files/transformFormat.js +93 -100
- package/dist/formats/files/transformFormat.js.map +1 -0
- package/dist/formats/json/extractJson.js +83 -110
- package/dist/formats/json/extractJson.js.map +1 -0
- package/dist/formats/json/flattenJson.js +41 -48
- package/dist/formats/json/flattenJson.js.map +1 -0
- package/dist/formats/json/jsonPath.js +20 -15
- package/dist/formats/json/jsonPath.js.map +1 -0
- package/dist/formats/json/jsonPointer.js +17 -17
- package/dist/formats/json/jsonPointer.js.map +1 -0
- package/dist/formats/json/mergeJson.js +230 -371
- package/dist/formats/json/mergeJson.js.map +1 -0
- package/dist/formats/json/parseJson.js +74 -111
- package/dist/formats/json/parseJson.js.map +1 -0
- package/dist/formats/json/transformJson.js +53 -61
- package/dist/formats/json/transformJson.js.map +1 -0
- package/dist/formats/json/utils.js +158 -187
- package/dist/formats/json/utils.js.map +1 -0
- package/dist/formats/parseKeyedMetadata.js +85 -106
- package/dist/formats/parseKeyedMetadata.js.map +1 -0
- package/dist/formats/utils.js +13 -23
- package/dist/formats/utils.js.map +1 -0
- package/dist/formats/yaml/extractYaml.js +32 -31
- package/dist/formats/yaml/extractYaml.js.map +1 -0
- package/dist/formats/yaml/mergeYaml.js +43 -60
- package/dist/formats/yaml/mergeYaml.js.map +1 -0
- package/dist/formats/yaml/parseYaml.js +34 -23
- package/dist/formats/yaml/parseYaml.js.map +1 -0
- package/dist/formats/yaml/utils.js +19 -21
- package/dist/formats/yaml/utils.js.map +1 -0
- package/dist/fs/clearLocaleDirs.js +82 -114
- package/dist/fs/clearLocaleDirs.js.map +1 -0
- package/dist/fs/config/downloadedVersions.js +174 -188
- package/dist/fs/config/downloadedVersions.js.map +1 -0
- package/dist/fs/config/loadConfig.js +12 -8
- package/dist/fs/config/loadConfig.js.map +1 -0
- package/dist/fs/config/parseFilesConfig.js +166 -227
- package/dist/fs/config/parseFilesConfig.js.map +1 -0
- package/dist/fs/config/setupConfig.js +43 -52
- package/dist/fs/config/setupConfig.js.map +1 -0
- package/dist/fs/config/updateConfig.js +44 -56
- package/dist/fs/config/updateConfig.js.map +1 -0
- package/dist/fs/config/updateVersions.js +27 -28
- package/dist/fs/config/updateVersions.js.map +1 -0
- package/dist/fs/copyFile.js +33 -37
- package/dist/fs/copyFile.js.map +1 -0
- package/dist/fs/createLoadTranslationsFile.js +32 -48
- package/dist/fs/createLoadTranslationsFile.js.map +1 -0
- package/dist/fs/determineFramework/detectPythonLibrary.js +30 -34
- package/dist/fs/determineFramework/detectPythonLibrary.js.map +1 -0
- package/dist/fs/determineFramework/index.js +46 -64
- package/dist/fs/determineFramework/index.js.map +1 -0
- package/dist/fs/determineFramework/matchPyprojectDependency.js +65 -78
- package/dist/fs/determineFramework/matchPyprojectDependency.js.map +1 -0
- package/dist/fs/determineFramework/matchRequirementsTxtDependency.js +21 -19
- package/dist/fs/determineFramework/matchRequirementsTxtDependency.js.map +1 -0
- package/dist/fs/determineFramework/matchSetupPyDependency.js +60 -81
- package/dist/fs/determineFramework/matchSetupPyDependency.js.map +1 -0
- package/dist/fs/determineFramework/resolveGtDependency.js +15 -15
- package/dist/fs/determineFramework/resolveGtDependency.js.map +1 -0
- package/dist/fs/findFilepath.js +63 -78
- package/dist/fs/findFilepath.js.map +1 -0
- package/dist/fs/loadJSON.js +18 -15
- package/dist/fs/loadJSON.js.map +1 -0
- package/dist/fs/matchFiles.js +12 -7
- package/dist/fs/matchFiles.js.map +1 -0
- package/dist/fs/saveJSON.js +10 -6
- package/dist/fs/saveJSON.js.map +1 -0
- package/dist/fs/utils.js +19 -15
- package/dist/fs/utils.js.map +1 -0
- package/dist/functions.d.ts +2 -1
- package/dist/functions.js +3 -6
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +6 -2
- package/dist/generated/version.js.map +1 -0
- package/dist/git/branches.js +77 -83
- package/dist/git/branches.js.map +1 -0
- package/dist/hooks/postProcess.js +97 -114
- package/dist/hooks/postProcess.js.map +1 -0
- package/dist/index.js +23 -31
- package/dist/index.js.map +1 -0
- package/dist/locadex/setupFlow.js +11 -8
- package/dist/locadex/setupFlow.js.map +1 -0
- package/dist/main.js +17 -7
- package/dist/main.js.map +1 -0
- package/dist/next/config/parseNextConfig.js +32 -51
- package/dist/next/config/parseNextConfig.js.map +1 -0
- package/dist/next/jsx/utils.js +25 -37
- package/dist/next/jsx/utils.js.map +1 -0
- package/dist/next/parse/handleInitGT.js +87 -154
- package/dist/next/parse/handleInitGT.js.map +1 -0
- package/dist/next/parse/wrapContent.js +136 -158
- package/dist/next/parse/wrapContent.js.map +1 -0
- package/dist/python/parse/createPythonInlineUpdates.js +36 -33
- package/dist/python/parse/createPythonInlineUpdates.js.map +1 -0
- package/dist/react/config/createESBuildConfig.js +115 -115
- package/dist/react/config/createESBuildConfig.js.map +1 -0
- package/dist/react/jsx/evaluateJsx.js +90 -124
- package/dist/react/jsx/evaluateJsx.js.map +1 -0
- package/dist/react/jsx/utils/buildImportMap.js +24 -28
- package/dist/react/jsx/utils/buildImportMap.js.map +1 -0
- package/dist/react/jsx/utils/constants.js +79 -87
- package/dist/react/jsx/utils/constants.js.map +1 -0
- package/dist/react/jsx/utils/extractSourceCode.js +36 -37
- package/dist/react/jsx/utils/extractSourceCode.js.map +1 -0
- package/dist/react/jsx/utils/getCalleeNameFromExpression.js +30 -30
- package/dist/react/jsx/utils/getCalleeNameFromExpression.js.map +1 -0
- package/dist/react/jsx/utils/getPathsAndAliases.js +70 -105
- package/dist/react/jsx/utils/getPathsAndAliases.js.map +1 -0
- package/dist/react/jsx/utils/isNumberLiteral.js +13 -11
- package/dist/react/jsx/utils/isNumberLiteral.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/addGTIdentifierToSyntaxTree.js +103 -148
- package/dist/react/jsx/utils/jsxParsing/addGTIdentifierToSyntaxTree.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/autoInsertion.js +305 -389
- package/dist/react/jsx/utils/jsxParsing/autoInsertion.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/handleChildrenWhitespace.js +122 -193
- package/dist/react/jsx/utils/jsxParsing/handleChildrenWhitespace.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/multiplication/findMultiplicationNode.js +50 -64
- package/dist/react/jsx/utils/jsxParsing/multiplication/findMultiplicationNode.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/multiplication/multiplyJsxTree.js +41 -68
- package/dist/react/jsx/utils/jsxParsing/multiplication/multiplyJsxTree.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/parseJsx.js +760 -1107
- package/dist/react/jsx/utils/jsxParsing/parseJsx.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/parseTProps.js +35 -71
- package/dist/react/jsx/utils/jsxParsing/parseTProps.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/removeNullChildrenFields.js +39 -58
- package/dist/react/jsx/utils/jsxParsing/removeNullChildrenFields.js.map +1 -0
- package/dist/react/jsx/utils/jsxParsing/types.js +10 -24
- package/dist/react/jsx/utils/jsxParsing/types.js.map +1 -0
- package/dist/react/jsx/utils/mapAttributeName.js +13 -13
- package/dist/react/jsx/utils/mapAttributeName.js.map +1 -0
- package/dist/react/jsx/utils/parseAst.js +142 -272
- package/dist/react/jsx/utils/parseAst.js.map +1 -0
- package/dist/react/jsx/utils/parseString.js +726 -1090
- package/dist/react/jsx/utils/parseString.js.map +1 -0
- package/dist/react/jsx/utils/parseStringFunction.js +274 -401
- package/dist/react/jsx/utils/parseStringFunction.js.map +1 -0
- package/dist/react/jsx/utils/resolveImportPath.d.ts +1 -1
- package/dist/react/jsx/utils/resolveImportPath.js +125 -108
- package/dist/react/jsx/utils/resolveImportPath.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/derivation/containsDeriveCall.js +18 -24
- package/dist/react/jsx/utils/stringParsing/derivation/containsDeriveCall.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/derivation/handleDerivation.js +412 -579
- package/dist/react/jsx/utils/stringParsing/derivation/handleDerivation.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/derivation/index.js +57 -67
- package/dist/react/jsx/utils/stringParsing/derivation/index.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/derivation/isDeriveCall.js +26 -36
- package/dist/react/jsx/utils/stringParsing/derivation/isDeriveCall.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/handleTaggedTemplateTranslationCall.js +29 -24
- package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/handleTaggedTemplateTranslationCall.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/index.js +34 -32
- package/dist/react/jsx/utils/stringParsing/processTaggedTemplateCall/index.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/extractStringEntryMetadata.js +80 -117
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/extractStringEntryMetadata.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleDeriveTranslationCall.js +24 -19
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleDeriveTranslationCall.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleInvalidTranslationCall.js +18 -21
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleInvalidTranslationCall.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleLiteralTranslationCall.js +45 -50
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/handleLiteralTranslationCall.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/index.js +54 -59
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/index.js.map +1 -0
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/routeTranslationCall.js +56 -69
- package/dist/react/jsx/utils/stringParsing/processTranslationCall/routeTranslationCall.js.map +1 -0
- package/dist/react/jsx/utils/validateStringFunction.js +21 -29
- package/dist/react/jsx/utils/validateStringFunction.js.map +1 -0
- package/dist/react/jsx/wrapJsx.js +192 -375
- package/dist/react/jsx/wrapJsx.js.map +1 -0
- package/dist/react/parse/addVitePlugin/index.js +40 -34
- package/dist/react/parse/addVitePlugin/index.js.map +1 -0
- package/dist/react/parse/addVitePlugin/installCompiler.js +18 -20
- package/dist/react/parse/addVitePlugin/installCompiler.js.map +1 -0
- package/dist/react/parse/addVitePlugin/updateViteConfig.js +107 -111
- package/dist/react/parse/addVitePlugin/updateViteConfig.js.map +1 -0
- package/dist/react/parse/addVitePlugin/utils/addCompilerImport.js +23 -26
- package/dist/react/parse/addVitePlugin/utils/addCompilerImport.js.map +1 -0
- package/dist/react/parse/addVitePlugin/utils/addPluginInvocation.js +29 -43
- package/dist/react/parse/addVitePlugin/utils/addPluginInvocation.js.map +1 -0
- package/dist/react/parse/addVitePlugin/utils/checkCompilerImport.js +70 -104
- package/dist/react/parse/addVitePlugin/utils/checkCompilerImport.js.map +1 -0
- package/dist/react/parse/addVitePlugin/utils/checkPluginInvocation.js +23 -29
- package/dist/react/parse/addVitePlugin/utils/checkPluginInvocation.js.map +1 -0
- package/dist/react/parse/createDictionaryUpdates.js +121 -185
- package/dist/react/parse/createDictionaryUpdates.js.map +1 -0
- package/dist/react/parse/createInlineUpdates.js +123 -139
- package/dist/react/parse/createInlineUpdates.js.map +1 -0
- package/dist/react/parse/wrapContent.js +131 -156
- package/dist/react/parse/wrapContent.js.map +1 -0
- package/dist/react/utils/flattenDictionary.js +55 -70
- package/dist/react/utils/flattenDictionary.js.map +1 -0
- package/dist/react/utils/getEntryAndMetadata.js +14 -10
- package/dist/react/utils/getEntryAndMetadata.js.map +1 -0
- package/dist/react/utils/getVariableName.js +36 -33
- package/dist/react/utils/getVariableName.js.map +1 -0
- package/dist/setup/detectFramework.js +85 -102
- package/dist/setup/detectFramework.js.map +1 -0
- package/dist/setup/frameworkUtils.js +17 -28
- package/dist/setup/frameworkUtils.js.map +1 -0
- package/dist/setup/userInput.js +24 -31
- package/dist/setup/userInput.js.map +1 -0
- package/dist/setup/wizard.js +141 -143
- package/dist/setup/wizard.js.map +1 -0
- package/dist/state/mintlifyRefMap.js +12 -9
- package/dist/state/mintlifyRefMap.js.map +1 -0
- package/dist/state/recentDownloads.js +26 -23
- package/dist/state/recentDownloads.js.map +1 -0
- package/dist/state/translateWarnings.js +17 -8
- package/dist/state/translateWarnings.js.map +1 -0
- package/dist/translation/parse.js +77 -98
- package/dist/translation/parse.js.map +1 -0
- package/dist/translation/stage.js +28 -43
- package/dist/translation/stage.js.map +1 -0
- package/dist/translation/validate.js +68 -91
- package/dist/translation/validate.js.map +1 -0
- package/dist/types/libraries.js +93 -91
- package/dist/types/libraries.js.map +1 -0
- package/dist/types/parsing.js +19 -10
- package/dist/types/parsing.js.map +1 -0
- package/dist/utils/addExplicitAnchorIds.js +270 -389
- package/dist/utils/addExplicitAnchorIds.js.map +1 -0
- package/dist/utils/calculateTimeoutMs.js +11 -6
- package/dist/utils/calculateTimeoutMs.js.map +1 -0
- package/dist/utils/constants.js +15 -12
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/credentials.js +67 -114
- package/dist/utils/credentials.js.map +1 -0
- package/dist/utils/fetch.js +22 -20
- package/dist/utils/fetch.js.map +1 -0
- package/dist/utils/flattenJsonFiles.js +27 -34
- package/dist/utils/flattenJsonFiles.js.map +1 -0
- package/dist/utils/gitDiff.js +30 -32
- package/dist/utils/gitDiff.js.map +1 -0
- package/dist/utils/gt.js +7 -2
- package/dist/utils/gt.js.map +1 -0
- package/dist/utils/hash.js +14 -9
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/headers.js +10 -13
- package/dist/utils/headers.js.map +1 -0
- package/dist/utils/installPackage.js +70 -75
- package/dist/utils/installPackage.js.map +1 -0
- package/dist/utils/localizeRelativeAssets.js +114 -157
- package/dist/utils/localizeRelativeAssets.js.map +1 -0
- package/dist/utils/localizeStaticImports.js +229 -371
- package/dist/utils/localizeStaticImports.js.map +1 -0
- package/dist/utils/localizeStaticUrls.js +241 -424
- package/dist/utils/localizeStaticUrls.js.map +1 -0
- package/dist/utils/mintlifyTitleFallback.js +64 -72
- package/dist/utils/mintlifyTitleFallback.js.map +1 -0
- package/dist/utils/monorepoVersionCheck.js +177 -215
- package/dist/utils/monorepoVersionCheck.js.map +1 -0
- package/dist/utils/packageInfo.js +17 -16
- package/dist/utils/packageInfo.js.map +1 -0
- package/dist/utils/packageJson.js +51 -66
- package/dist/utils/packageJson.js.map +1 -0
- package/dist/utils/packageManager.js +237 -260
- package/dist/utils/packageManager.js.map +1 -0
- package/dist/utils/parse/needsCJS.js +36 -69
- package/dist/utils/parse/needsCJS.js.map +1 -0
- package/dist/utils/persistPostprocessHashes.js +30 -32
- package/dist/utils/persistPostprocessHashes.js.map +1 -0
- package/dist/utils/processAnchorIds.js +32 -54
- package/dist/utils/processAnchorIds.js.map +1 -0
- package/dist/utils/processOpenApi.js +469 -578
- package/dist/utils/processOpenApi.js.map +1 -0
- package/dist/utils/resolveMintlifyRefs.js +89 -105
- package/dist/utils/resolveMintlifyRefs.js.map +1 -0
- package/dist/utils/resolvePublish.js +46 -54
- package/dist/utils/resolvePublish.js.map +1 -0
- package/dist/utils/sanitizeFileContent.js +20 -27
- package/dist/utils/sanitizeFileContent.js.map +1 -0
- package/dist/utils/sharedStaticAssets.js +248 -366
- package/dist/utils/sharedStaticAssets.js.map +1 -0
- package/dist/utils/splitMintlifyLanguageRefs.js +208 -282
- package/dist/utils/splitMintlifyLanguageRefs.js.map +1 -0
- package/dist/utils/validateMdx.js +26 -23
- package/dist/utils/validateMdx.js.map +1 -0
- package/dist/utils/wrapPlainUrls.js +58 -70
- package/dist/utils/wrapPlainUrls.js.map +1 -0
- package/dist/workflows/download.js +92 -126
- package/dist/workflows/download.js.map +1 -0
- package/dist/workflows/enqueue.js +47 -54
- package/dist/workflows/enqueue.js.map +1 -0
- package/dist/workflows/publish.js +29 -29
- package/dist/workflows/publish.js.map +1 -0
- package/dist/workflows/setupProject.js +39 -40
- package/dist/workflows/setupProject.js.map +1 -0
- package/dist/workflows/stage.js +61 -65
- package/dist/workflows/stage.js.map +1 -0
- package/dist/workflows/steps/BranchStep.js +118 -163
- package/dist/workflows/steps/BranchStep.js.map +1 -0
- package/dist/workflows/steps/DownloadStep.js +107 -137
- package/dist/workflows/steps/DownloadStep.js.map +1 -0
- package/dist/workflows/steps/EnqueueStep.js +32 -32
- package/dist/workflows/steps/EnqueueStep.js.map +1 -0
- package/dist/workflows/steps/PollJobsStep.js +208 -292
- package/dist/workflows/steps/PollJobsStep.js.map +1 -0
- package/dist/workflows/steps/PublishStep.js +33 -38
- package/dist/workflows/steps/PublishStep.js.map +1 -0
- package/dist/workflows/steps/SetupStep.js +71 -72
- package/dist/workflows/steps/SetupStep.js.map +1 -0
- package/dist/workflows/steps/TagStep.js +39 -44
- package/dist/workflows/steps/TagStep.js.map +1 -0
- package/dist/workflows/steps/UploadSourcesStep.js +108 -140
- package/dist/workflows/steps/UploadSourcesStep.js.map +1 -0
- package/dist/workflows/steps/UploadTranslationsStep.js +61 -71
- package/dist/workflows/steps/UploadTranslationsStep.js.map +1 -0
- package/dist/workflows/steps/UserEditDiffsStep.js +32 -34
- package/dist/workflows/steps/UserEditDiffsStep.js.map +1 -0
- package/dist/workflows/steps/WorkflowStep.js +6 -2
- package/dist/workflows/steps/WorkflowStep.js.map +1 -0
- package/dist/workflows/upload.js +45 -46
- package/dist/workflows/upload.js.map +1 -0
- package/package.json +14 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","names":[],"sources":["../../src/console/logger.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { randomUUID } from 'node:crypto';\nimport { pino, destination } from 'pino';\nimport {\n log as clackLog,\n spinner,\n progress,\n intro,\n outro,\n} from '@clack/prompts';\nimport { endTerminalSession } from './terminalSession.js';\n\nimport type { Logger as PinoLogger } from 'pino';\nimport type { SpinnerResult, ProgressResult } from '@clack/prompts';\n\nfunction wrapTerminalSessionAware<T extends SpinnerResult | ProgressResult>(\n target: T\n): T {\n const start = target.start.bind(target);\n const stop = target.stop.bind(target);\n const message = target.message.bind(target);\n target.start = (msg?: string) => {\n endTerminalSession();\n return start(msg);\n };\n target.stop = (msg?: string, code?: number) => {\n endTerminalSession();\n return (stop as (m?: string, c?: number) => void)(msg, code);\n };\n target.message = (msg?: string) => {\n endTerminalSession();\n return message(msg);\n };\n if ('advance' in target) {\n const advance = target.advance.bind(target);\n target.advance = (amount: number, msg?: string) => {\n endTerminalSession();\n return advance(amount, msg);\n };\n }\n return target;\n}\n\nexport type LogFormat = 'default' | 'json';\n\n// Mock spinner that logs to console instead of updating terminal UI\nclass MockSpinner implements SpinnerResult {\n private currentMessage: string = '';\n private logger: Logger;\n isCancelled: boolean = false;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n start(message?: string): void {\n if (message) {\n this.currentMessage = message;\n this.logger.info(`[Spinner] ${message}`);\n }\n }\n\n stop(message?: string): void {\n const msg = message || this.currentMessage;\n if (msg) {\n this.logger.info(`[Spinner] ${msg}`);\n }\n this.currentMessage = '';\n }\n\n message(message?: string): void {\n if (message) {\n this.currentMessage = message;\n this.logger.info(`[Spinner] ${message}`);\n }\n }\n}\n\n// Mock progress bar that logs to console instead of updating terminal UI\nclass MockProgress implements ProgressResult {\n private max: number;\n private current: number = 0;\n private logger: Logger;\n isCancelled: boolean = false;\n\n constructor(max: number, logger: Logger) {\n this.max = max;\n this.logger = logger;\n }\n\n start(message?: string): void {\n const msg = message || 'Starting progress';\n this.logger.info(`[Progress] ${msg} (0/${this.max})`);\n }\n\n stop(message?: string): void {\n const msg = message || 'Complete';\n this.logger.info(`[Progress] ${msg} (${this.current}/${this.max})`);\n }\n\n message(message?: string): void {\n if (message) {\n this.logger.info(`[Progress] ${message} (${this.current}/${this.max})`);\n }\n }\n\n advance(amount: number, message?: string): void {\n this.current += amount;\n const msg = message || 'Progress';\n this.logger.info(`[Progress] ${msg} (${this.current}/${this.max})`);\n }\n}\n\n/**\n * GT_LOG_FORMAT: default | json.\n * - If default, logs will be pretty-printed using @clack/prompts.\n * - If json, logs will be written in JSON format to the console.\n * GT_LOG_FILE: If specified, logs will be written to the file.\n * GT_LOG_LEVEL: The level of logs to write. If not specified, defaults to 'info'.\n * - Valid levels: debug, info, warn, error.\n */\nclass Logger {\n private static instance: Logger;\n private pinoLogger: PinoLogger | null = null;\n private fileLogger: PinoLogger | null = null;\n private logFormat: LogFormat;\n\n private constructor() {\n // Read configuration from environment variables\n const format = (\n process.env.GT_LOG_FORMAT || 'default'\n ).toLowerCase() as LogFormat;\n const logFile = process.env.GT_LOG_FILE;\n const logLevel = process.env.GT_LOG_LEVEL || 'info';\n\n if (format !== 'default' && format !== 'json') {\n console.error('Invalid log format');\n process.exit(1);\n }\n if (\n logLevel !== 'debug' &&\n logLevel !== 'info' &&\n logLevel !== 'warn' &&\n logLevel !== 'error'\n ) {\n console.error('Invalid log level');\n process.exit(1);\n }\n\n this.logFormat = format;\n\n // Console output (stdout) - only for JSON format\n // For 'default' format, we use @clack/prompts directly\n if (format === 'json') {\n this.pinoLogger = pino(\n {\n level: logLevel,\n mixin: () => ({\n logId: randomUUID(),\n }),\n },\n destination(1)\n );\n }\n\n // File output (if specified) - always JSON format\n if (logFile) {\n this.fileLogger = pino(\n {\n level: logLevel,\n mixin: () => ({\n logId: randomUUID(),\n }),\n },\n destination(logFile)\n );\n }\n }\n\n static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n return Logger.instance;\n }\n\n // Standard logging methods\n trace(message: string): void {\n if (this.logFormat === 'default') {\n endTerminalSession();\n // @clack/prompts doesn't have trace, use message\n clackLog.message(message, { symbol: chalk.dim('•') });\n } else {\n this.pinoLogger?.trace(message);\n }\n this.fileLogger?.trace(message);\n }\n\n debug(message: string): void {\n if (this.logFormat === 'default') {\n endTerminalSession();\n // @clack/prompts doesn't have debug, use message\n clackLog.message(message, { symbol: chalk.dim('◆') });\n } else {\n this.pinoLogger?.debug(message);\n }\n this.fileLogger?.debug(message);\n }\n\n info(message: string): void {\n if (this.logFormat === 'default') {\n endTerminalSession();\n clackLog.info(message);\n } else {\n this.pinoLogger?.info(message);\n }\n this.fileLogger?.info(message);\n }\n\n warn(message: string): void {\n if (this.logFormat === 'default') {\n endTerminalSession();\n clackLog.warn(message);\n } else {\n this.pinoLogger?.warn(message);\n }\n this.fileLogger?.warn(message);\n }\n\n error(message: string): void {\n if (this.logFormat === 'default') {\n endTerminalSession();\n clackLog.error(message);\n } else {\n this.pinoLogger?.error(message);\n }\n this.fileLogger?.error(message);\n }\n\n fatal(message: string): void {\n if (this.logFormat === 'default') {\n endTerminalSession();\n clackLog.error(message); // @clack/prompts doesn't have fatal, use error\n } else {\n this.pinoLogger?.fatal(message);\n }\n this.fileLogger?.fatal(message);\n }\n\n silent(message: string): void {\n // Silent doesn't log to console, only to file\n this.fileLogger?.silent(message);\n }\n\n // @clack/prompts specific methods (for 'default' format)\n success(message: string): void {\n if (this.logFormat === 'default') {\n endTerminalSession();\n clackLog.success(message);\n } else {\n this.pinoLogger?.info(message); // Map to info for non-default formats\n }\n this.fileLogger?.info(message);\n }\n\n step(message: string): void {\n if (this.logFormat === 'default') {\n endTerminalSession();\n clackLog.step(message);\n } else {\n this.pinoLogger?.info(message); // Map to info for non-default formats\n }\n this.fileLogger?.info(message);\n }\n\n message(message: string, symbol?: string): void {\n if (this.logFormat === 'default') {\n endTerminalSession();\n clackLog.message(message, symbol ? { symbol } : undefined);\n } else {\n this.pinoLogger?.info(message); // Map to info for non-default formats\n }\n this.fileLogger?.info(message);\n }\n\n // Spinner functionality\n createSpinner(indicator: 'dots' | 'timer' = 'timer'): SpinnerResult {\n if (this.logFormat === 'default') {\n return wrapTerminalSessionAware(spinner({ indicator }));\n } else {\n return new MockSpinner(this);\n }\n }\n\n // Progress bar functionality\n createProgressBar(total: number): ProgressResult {\n if (this.logFormat === 'default') {\n return wrapTerminalSessionAware(progress({ max: total }));\n } else {\n return new MockProgress(total, this);\n }\n }\n\n // Command start/end markers\n startCommand(message: string): void {\n if (this.logFormat === 'default') {\n endTerminalSession();\n intro(chalk.cyan(message));\n } else {\n this.info(`╭─ ${message}`);\n }\n this.fileLogger?.info(`[START] ${message}`);\n }\n\n endCommand(message: string): void {\n if (this.logFormat === 'default') {\n endTerminalSession();\n outro(chalk.cyan(message));\n } else {\n this.info(`╰─ ${message}`);\n }\n this.fileLogger?.info(`[END] ${message}`);\n }\n\n // Flush logs to ensure they're written before process exit\n flush(): void {\n this.pinoLogger?.flush();\n this.fileLogger?.flush();\n }\n}\n\nexport const logger = Logger.getInstance();\n"],"mappings":"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"}
|
|
@@ -16,6 +16,20 @@ export declare function promptText({ message, defaultValue, validate, }: {
|
|
|
16
16
|
defaultValue?: string;
|
|
17
17
|
validate?: (value: string) => boolean | string;
|
|
18
18
|
}): Promise<string>;
|
|
19
|
+
export declare function promptLocale({ message, defaultValue, }: {
|
|
20
|
+
message: string;
|
|
21
|
+
defaultValue?: string;
|
|
22
|
+
}): Promise<string>;
|
|
23
|
+
export declare function promptLocaleList({ message, defaultValue, required, }: {
|
|
24
|
+
message: string;
|
|
25
|
+
defaultValue?: string[];
|
|
26
|
+
required?: boolean;
|
|
27
|
+
}): Promise<string[]>;
|
|
28
|
+
export declare function promptGlobPatterns({ label, message, defaultValue, }: {
|
|
29
|
+
label: string;
|
|
30
|
+
message: string;
|
|
31
|
+
defaultValue?: string;
|
|
32
|
+
}): Promise<string>;
|
|
19
33
|
export declare function promptSelect<T>({ message, options, defaultValue, }: {
|
|
20
34
|
message: string;
|
|
21
35
|
options: Array<{
|
package/dist/console/logging.js
CHANGED
|
@@ -1,35 +1,45 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import { getCLIVersion } from
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
1
|
+
import { endTerminalSession, shouldUseInkPrompts } from "./terminalSession.js";
|
|
2
|
+
import { logger } from "./logger.js";
|
|
3
|
+
import { getCLIVersion } from "../utils/packageJson.js";
|
|
4
|
+
import "../utils/constants.js";
|
|
5
|
+
import { parseLocaleList, validateLocale, validateLocaleList } from "./promptParsing.js";
|
|
6
|
+
import { cancel, confirm, isCancel, multiselect, select, text } from "@clack/prompts";
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
//#region src/console/logging.ts
|
|
9
|
+
function cancelPromptAndExit(message) {
|
|
10
|
+
endTerminalSession();
|
|
11
|
+
cancel(message);
|
|
12
|
+
return exitSync(0);
|
|
13
|
+
}
|
|
14
|
+
async function loadInkPrompts() {
|
|
15
|
+
return import("./inkPrompts.js");
|
|
16
|
+
}
|
|
17
|
+
async function runInkPrompt(prompt, cancelMessage = "Operation cancelled") {
|
|
18
|
+
const result = await prompt(await loadInkPrompts());
|
|
19
|
+
if (result.cancelled) return cancelPromptAndExit(cancelMessage);
|
|
20
|
+
return result.value;
|
|
21
|
+
}
|
|
6
22
|
/**
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
displayAsciiTitle();
|
|
25
|
-
displayInitializingText();
|
|
26
|
-
if (introString) {
|
|
27
|
-
logger.startCommand(introString);
|
|
28
|
-
}
|
|
23
|
+
* Strip ANSI escape codes from a string (e.g., chalk color codes)
|
|
24
|
+
*/
|
|
25
|
+
function stripAnsi(str) {
|
|
26
|
+
return str.replace(/\x1B\[[0-9;]*m/g, "");
|
|
27
|
+
}
|
|
28
|
+
function logErrorAndExit(message) {
|
|
29
|
+
logger.error(message);
|
|
30
|
+
return exitSync(1);
|
|
31
|
+
}
|
|
32
|
+
function exitSync(code) {
|
|
33
|
+
logger.flush();
|
|
34
|
+
process.exit(code);
|
|
35
|
+
}
|
|
36
|
+
function displayHeader(introString) {
|
|
37
|
+
displayAsciiTitle();
|
|
38
|
+
displayInitializingText();
|
|
39
|
+
if (introString) logger.startCommand(introString);
|
|
29
40
|
}
|
|
30
41
|
function displayAsciiTitle() {
|
|
31
|
-
|
|
32
|
-
console.log(chalk.cyan(`\n ,ad8888ba, 888888888888
|
|
42
|
+
console.log(chalk.cyan(`\n ,ad8888ba, 888888888888
|
|
33
43
|
d8"' \`"8b 88
|
|
34
44
|
d8' 88
|
|
35
45
|
88 88
|
|
@@ -39,140 +49,171 @@ Y8, 88 88
|
|
|
39
49
|
\`"Y88888P" 88 `));
|
|
40
50
|
}
|
|
41
51
|
function displayInitializingText() {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
${chalk.dim('https://generaltranslation.com/docs')}
|
|
52
|
+
const version = getCLIVersion();
|
|
53
|
+
console.log(`\n${chalk.bold.blue("General Translation, Inc.")}
|
|
54
|
+
${chalk.dim("https://generaltranslation.com/docs")}
|
|
46
55
|
${chalk.dim(`CLI Version: ${version}\n`)}`);
|
|
47
56
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
57
|
+
function displayProjectId(projectId) {
|
|
58
|
+
logger.message(chalk.dim(`Project ID: ${chalk.bold(projectId)}`), chalk.cyan("~"));
|
|
59
|
+
}
|
|
60
|
+
function displayResolvedPaths(resolvedPaths) {
|
|
61
|
+
const paths = resolvedPaths.map(([key, resolvedPath]) => {
|
|
62
|
+
return chalk.dim(`'${chalk.white(key)}' → '${chalk.green(resolvedPath)}'`);
|
|
63
|
+
});
|
|
64
|
+
logger.step(`Resolved path aliases:\n${paths.join("\n")}`);
|
|
65
|
+
}
|
|
66
|
+
function displayCreatedConfigFile(configFilepath) {
|
|
67
|
+
logger.step(`Created config file ${chalk.cyan(configFilepath)}`);
|
|
68
|
+
}
|
|
69
|
+
function displayUpdatedConfigFile(configFilepath) {
|
|
70
|
+
logger.success(`Updated config file ${chalk.cyan(configFilepath)}`);
|
|
71
|
+
}
|
|
72
|
+
function displayUpdatedVersionsFile(versionFilepath) {
|
|
73
|
+
logger.success(`Updated versions file ${chalk.cyan(versionFilepath)}`);
|
|
74
|
+
}
|
|
75
|
+
async function promptText({ message, defaultValue, validate }) {
|
|
76
|
+
if (shouldUseInkPrompts()) return await runInkPrompt((prompts) => prompts.inkPromptText({
|
|
77
|
+
message,
|
|
78
|
+
defaultValue,
|
|
79
|
+
validate
|
|
80
|
+
})) ?? "";
|
|
81
|
+
const result = await text({
|
|
82
|
+
message,
|
|
83
|
+
placeholder: defaultValue,
|
|
84
|
+
validate: validate ? (value) => {
|
|
85
|
+
const validation = validate(value || "");
|
|
86
|
+
return validation === true ? void 0 : validation.toString();
|
|
87
|
+
} : void 0
|
|
88
|
+
});
|
|
89
|
+
if (isCancel(result)) {
|
|
90
|
+
cancel("Operation cancelled");
|
|
91
|
+
return exitSync(0);
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
async function promptLocale({ message, defaultValue }) {
|
|
96
|
+
if (shouldUseInkPrompts()) return await runInkPrompt((prompts) => prompts.inkPromptLocale({
|
|
97
|
+
message,
|
|
98
|
+
defaultValue
|
|
99
|
+
})) ?? "";
|
|
100
|
+
return promptText({
|
|
101
|
+
message,
|
|
102
|
+
defaultValue,
|
|
103
|
+
validate: validateLocale
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
async function promptLocaleList({ message, defaultValue, required = true }) {
|
|
107
|
+
if (shouldUseInkPrompts()) return await runInkPrompt((prompts) => prompts.inkPromptLocaleMulti({
|
|
108
|
+
message,
|
|
109
|
+
defaultValue,
|
|
110
|
+
required
|
|
111
|
+
})) ?? [];
|
|
112
|
+
return promptText({
|
|
113
|
+
message,
|
|
114
|
+
defaultValue: defaultValue?.join(" "),
|
|
115
|
+
validate: validateLocaleList
|
|
116
|
+
}).then(parseLocaleList);
|
|
117
|
+
}
|
|
118
|
+
async function promptGlobPatterns({ label, message, defaultValue }) {
|
|
119
|
+
if (shouldUseInkPrompts()) return await runInkPrompt((prompts) => prompts.inkPromptGlob({
|
|
120
|
+
label,
|
|
121
|
+
message,
|
|
122
|
+
defaultValue
|
|
123
|
+
})) ?? "";
|
|
124
|
+
return promptText({
|
|
125
|
+
message,
|
|
126
|
+
defaultValue
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
async function promptSelect({ message, options, defaultValue }) {
|
|
130
|
+
if (shouldUseInkPrompts()) return await runInkPrompt((prompts) => prompts.inkPromptSelect({
|
|
131
|
+
message,
|
|
132
|
+
options,
|
|
133
|
+
defaultValue
|
|
134
|
+
}));
|
|
135
|
+
const result = await select({
|
|
136
|
+
message,
|
|
137
|
+
options: options.map((opt) => ({
|
|
138
|
+
value: opt.value,
|
|
139
|
+
label: opt.label,
|
|
140
|
+
hint: opt.hint
|
|
141
|
+
})),
|
|
142
|
+
initialValue: defaultValue
|
|
143
|
+
});
|
|
144
|
+
if (isCancel(result)) {
|
|
145
|
+
cancel("Operation cancelled");
|
|
146
|
+
return exitSync(0);
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
async function promptMultiSelect({ message, options, required = true }) {
|
|
151
|
+
if (shouldUseInkPrompts()) return await runInkPrompt((prompts) => prompts.inkPromptMultiSelect({
|
|
152
|
+
message,
|
|
153
|
+
options,
|
|
154
|
+
required
|
|
155
|
+
})) ?? [];
|
|
156
|
+
const result = await multiselect({
|
|
157
|
+
message,
|
|
158
|
+
options: options.map((opt) => ({
|
|
159
|
+
value: opt.value,
|
|
160
|
+
label: opt.label,
|
|
161
|
+
hint: opt.hint
|
|
162
|
+
})),
|
|
163
|
+
required
|
|
164
|
+
});
|
|
165
|
+
if (isCancel(result)) {
|
|
166
|
+
cancel("Operation cancelled");
|
|
167
|
+
return exitSync(0);
|
|
168
|
+
}
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
async function promptConfirm({ message, defaultValue = true, cancelMessage = "Operation cancelled" }) {
|
|
172
|
+
if (shouldUseInkPrompts()) return await runInkPrompt((prompts) => prompts.inkPromptConfirm({
|
|
173
|
+
message,
|
|
174
|
+
defaultValue
|
|
175
|
+
}), cancelMessage) ?? defaultValue;
|
|
176
|
+
const result = await confirm({
|
|
177
|
+
message,
|
|
178
|
+
initialValue: defaultValue
|
|
179
|
+
});
|
|
180
|
+
if (isCancel(result)) {
|
|
181
|
+
cancel(cancelMessage);
|
|
182
|
+
return exitSync(0);
|
|
183
|
+
}
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
function warnApiKeyInConfig(optionsFilepath) {
|
|
187
|
+
logger.warn(`Found ${chalk.cyan("apiKey")} in "${chalk.green(optionsFilepath)}". ` + chalk.white("Your API key is exposed! Remove it from the file and include it as an environment variable."));
|
|
188
|
+
}
|
|
189
|
+
function warnVariableProp(file, attrName, value) {
|
|
190
|
+
logger.warn(`Found ${chalk.green("<T>")} component in ${chalk.cyan(file)} with variable ${attrName}: "${chalk.white(value)}". Change "${attrName}" to ensure this content is translated.`);
|
|
191
|
+
}
|
|
192
|
+
function warnNoId(file) {
|
|
193
|
+
logger.warn(`Found ${chalk.green("<T>")} component in ${chalk.cyan(file)} with no id. ` + chalk.white("Add an id to ensure the content is translated."));
|
|
194
|
+
}
|
|
195
|
+
function warnHasUnwrappedExpression(file, id, unwrappedExpressions) {
|
|
196
|
+
logger.warn(`${chalk.green("<T>")} with id "${id}" in ${chalk.cyan(file)} has children: ${unwrappedExpressions.join(", ")} that could change at runtime. ` + chalk.white("Use a variable component like ") + chalk.green("<Var>") + chalk.white(" (") + chalk.blue("https://generaltranslation.com/docs") + chalk.white(") to translate this properly."));
|
|
197
|
+
}
|
|
198
|
+
function warnTemplateLiteral(file, value) {
|
|
199
|
+
logger.warn(`Found template literal with quasis (${value}) in ${chalk.cyan(file)}. ` + chalk.white("Change the template literal to a string to ensure this content is translated."));
|
|
200
|
+
}
|
|
201
|
+
function warnTernary(file) {
|
|
202
|
+
logger.warn(`Found ternary expression in ${chalk.cyan(file)}. ` + chalk.white("A Branch component may be more appropriate here."));
|
|
203
|
+
}
|
|
204
|
+
function warnDeprecatedField(deprecatedField, replacement) {
|
|
205
|
+
logger.warn(`${chalk.green(deprecatedField)} is deprecated. ` + chalk.white(`Use ${chalk.green(replacement)} instead.`));
|
|
163
206
|
}
|
|
164
207
|
/**
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
.join('\n'));
|
|
178
|
-
}
|
|
208
|
+
* Helper: Log all collected files
|
|
209
|
+
*/
|
|
210
|
+
function logCollectedFiles(files, reactComponents) {
|
|
211
|
+
logger.message(chalk.cyan("Files found in project:") + "\n" + files.map((file) => {
|
|
212
|
+
if (file.fileName === "__INTERNAL_GT_TEMPLATE_NAME__") return `- <React Elements>${reactComponents ? ` (${reactComponents})` : ""}`;
|
|
213
|
+
return `- ${file.fileName}`;
|
|
214
|
+
}).join("\n"));
|
|
215
|
+
}
|
|
216
|
+
//#endregion
|
|
217
|
+
export { displayCreatedConfigFile, displayHeader, displayProjectId, displayResolvedPaths, displayUpdatedConfigFile, displayUpdatedVersionsFile, exitSync, logCollectedFiles, logErrorAndExit, promptConfirm, promptGlobPatterns, promptLocale, promptLocaleList, promptMultiSelect, promptSelect, promptText, stripAnsi, warnApiKeyInConfig, warnDeprecatedField, warnHasUnwrappedExpression, warnNoId, warnTemplateLiteral, warnTernary, warnVariableProp };
|
|
218
|
+
|
|
219
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","names":[],"sources":["../../src/console/logging.ts"],"sourcesContent":["import {\n text,\n select,\n confirm,\n isCancel,\n cancel,\n multiselect,\n} from '@clack/prompts';\nimport type { Option } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { getCLIVersion } from '../utils/packageJson.js';\nimport { logger } from './logger.js';\nimport { TEMPLATE_FILE_NAME } from '../utils/constants.js';\nimport { FileToUpload } from 'generaltranslation/types';\nimport { endTerminalSession, shouldUseInkPrompts } from './terminalSession.js';\nimport {\n parseLocaleList,\n validateLocale,\n validateLocaleList,\n} from './promptParsing.js';\n\nfunction cancelPromptAndExit(message: string): never {\n endTerminalSession();\n cancel(message);\n return exitSync(0);\n}\n\nasync function loadInkPrompts() {\n return import('./inkPrompts.js');\n}\n\nasync function runInkPrompt<T>(\n prompt: (prompts: Awaited<ReturnType<typeof loadInkPrompts>>) => Promise<{\n value?: T;\n cancelled: boolean;\n }>,\n cancelMessage = 'Operation cancelled'\n) {\n const result = await prompt(await loadInkPrompts());\n if (result.cancelled) {\n return cancelPromptAndExit(cancelMessage);\n }\n return result.value;\n}\n\n/**\n * Strip ANSI escape codes from a string (e.g., chalk color codes)\n */\nexport function stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex, no-useless-escape\n return str.replace(/\\x1B\\[[0-9;]*m/g, '');\n}\n\nexport function logErrorAndExit(message: string): never {\n logger.error(message);\n return exitSync(1);\n}\n\nexport function exitSync(code: number): never {\n // Flush logs before exit\n logger.flush();\n process.exit(code);\n}\n\n// GT specific logging\nexport function displayHeader(introString?: string) {\n displayAsciiTitle();\n displayInitializingText();\n\n if (introString) {\n logger.startCommand(introString);\n }\n}\n\nfunction displayAsciiTitle() {\n // eslint-disable-next-line no-console\n console.log(\n chalk.cyan(\n `\\n ,ad8888ba, 888888888888 \n d8\"' \\`\"8b 88 \nd8' 88 \n88 88 \n88 88888 88 \nY8, 88 88 \n Y8a. .a88 88 \n \\`\"Y88888P\" 88 `\n )\n );\n}\n\nfunction displayInitializingText() {\n const version = getCLIVersion();\n // eslint-disable-next-line no-console\n console.log(\n `\\n${chalk.bold.blue('General Translation, Inc.')}\n${chalk.dim('https://generaltranslation.com/docs')}\n${chalk.dim(`CLI Version: ${version}\\n`)}`\n );\n}\n\nexport function displayProjectId(projectId: string) {\n logger.message(\n chalk.dim(`Project ID: ${chalk.bold(projectId)}`),\n chalk.cyan('~')\n );\n}\n\nexport function displayResolvedPaths(resolvedPaths: [string, string][]) {\n const paths = resolvedPaths.map(([key, resolvedPath]) => {\n return chalk.dim(`'${chalk.white(key)}' → '${chalk.green(resolvedPath)}'`);\n });\n logger.step(`Resolved path aliases:\\n${paths.join('\\n')}`);\n}\n\nexport function displayCreatedConfigFile(configFilepath: string) {\n logger.step(`Created config file ${chalk.cyan(configFilepath)}`);\n}\n\nexport function displayUpdatedConfigFile(configFilepath: string) {\n logger.success(`Updated config file ${chalk.cyan(configFilepath)}`);\n}\n\nexport function displayUpdatedVersionsFile(versionFilepath: string) {\n logger.success(`Updated versions file ${chalk.cyan(versionFilepath)}`);\n}\n\n// Input prompts\nexport async function promptText({\n message,\n defaultValue,\n validate,\n}: {\n message: string;\n defaultValue?: string;\n validate?: (value: string) => boolean | string;\n}) {\n if (shouldUseInkPrompts()) {\n return (\n (await runInkPrompt<string>((prompts) =>\n prompts.inkPromptText({ message, defaultValue, validate })\n )) ?? ''\n );\n }\n\n const result = await text({\n message,\n placeholder: defaultValue,\n validate: validate\n ? (value) => {\n const validation = validate(value || '');\n return validation === true ? undefined : validation.toString();\n }\n : undefined,\n });\n\n if (isCancel(result)) {\n cancel('Operation cancelled');\n return exitSync(0);\n }\n\n return result;\n}\n\nexport async function promptLocale({\n message,\n defaultValue,\n}: {\n message: string;\n defaultValue?: string;\n}) {\n if (shouldUseInkPrompts()) {\n return (\n (await runInkPrompt<string>((prompts) =>\n prompts.inkPromptLocale({ message, defaultValue })\n )) ?? ''\n );\n }\n\n return promptText({\n message,\n defaultValue,\n validate: validateLocale,\n });\n}\n\nexport async function promptLocaleList({\n message,\n defaultValue,\n required = true,\n}: {\n message: string;\n defaultValue?: string[];\n required?: boolean;\n}) {\n if (shouldUseInkPrompts()) {\n return (\n (await runInkPrompt<string[]>((prompts) =>\n prompts.inkPromptLocaleMulti({\n message,\n defaultValue,\n required,\n })\n )) ?? []\n );\n }\n\n return promptText({\n message,\n defaultValue: defaultValue?.join(' '),\n validate: validateLocaleList,\n }).then(parseLocaleList);\n}\n\nexport async function promptGlobPatterns({\n label,\n message,\n defaultValue,\n}: {\n label: string;\n message: string;\n defaultValue?: string;\n}) {\n if (shouldUseInkPrompts()) {\n return (\n (await runInkPrompt<string>((prompts) =>\n prompts.inkPromptGlob({ label, message, defaultValue })\n )) ?? ''\n );\n }\n\n return promptText({\n message,\n defaultValue,\n });\n}\n\nexport async function promptSelect<T>({\n message,\n options,\n defaultValue,\n}: {\n message: string;\n options: Array<{ value: T; label: string; hint?: string }>;\n defaultValue?: T;\n}) {\n if (shouldUseInkPrompts()) {\n return (await runInkPrompt<T>((prompts) =>\n prompts.inkPromptSelect({ message, options, defaultValue })\n )) as T;\n }\n\n // Convert options to the format expected by clack\n const clackOptions = options.map((opt) => ({\n value: opt.value,\n label: opt.label,\n hint: opt.hint,\n })) as Option<T>[];\n\n const result = await select({\n message,\n options: clackOptions,\n initialValue: defaultValue,\n });\n\n if (isCancel(result)) {\n cancel('Operation cancelled');\n return exitSync(0);\n }\n\n return result as T;\n}\n\nexport async function promptMultiSelect<T extends string>({\n message,\n options,\n required = true,\n}: {\n message: string;\n options: Array<{ value: T; label: string; hint?: string }>;\n required?: boolean;\n}) {\n if (shouldUseInkPrompts()) {\n return (\n (await runInkPrompt<Array<T>>((prompts) =>\n prompts.inkPromptMultiSelect({\n message,\n options,\n required,\n })\n )) ?? []\n );\n }\n\n // Convert options to the format expected by clack\n const clackOptions = options.map((opt) => ({\n value: opt.value,\n label: opt.label,\n hint: opt.hint,\n })) as Option<T>[];\n\n const result = await multiselect({\n message,\n options: clackOptions,\n required,\n });\n\n if (isCancel(result)) {\n cancel('Operation cancelled');\n return exitSync(0);\n }\n\n return result as Array<T>;\n}\n\nexport async function promptConfirm({\n message,\n defaultValue = true,\n cancelMessage = 'Operation cancelled',\n}: {\n message: string;\n defaultValue?: boolean;\n cancelMessage?: string;\n}) {\n if (shouldUseInkPrompts()) {\n return (\n (await runInkPrompt<boolean>(\n (prompts) => prompts.inkPromptConfirm({ message, defaultValue }),\n cancelMessage\n )) ?? defaultValue\n );\n }\n\n const result = await confirm({\n message,\n initialValue: defaultValue,\n });\n\n if (isCancel(result)) {\n cancel(cancelMessage);\n return exitSync(0);\n }\n\n return result;\n}\n\n// Warning display functions\nexport function warnApiKeyInConfig(optionsFilepath: string) {\n logger.warn(\n `Found ${chalk.cyan('apiKey')} in \"${chalk.green(optionsFilepath)}\". ` +\n chalk.white(\n 'Your API key is exposed! Remove it from the file and include it as an environment variable.'\n )\n );\n}\n\nexport function warnVariableProp(\n file: string,\n attrName: string,\n value: string\n) {\n logger.warn(\n `Found ${chalk.green('<T>')} component in ${chalk.cyan(file)} with variable ${attrName}: \"${chalk.white(value)}\". ` +\n `Change \"${attrName}\" to ensure this content is translated.`\n );\n}\n\nexport function warnNoId(file: string) {\n logger.warn(\n `Found ${chalk.green('<T>')} component in ${chalk.cyan(file)} with no id. ` +\n chalk.white('Add an id to ensure the content is translated.')\n );\n}\n\nexport function warnHasUnwrappedExpression(\n file: string,\n id: string,\n unwrappedExpressions: string[]\n) {\n logger.warn(\n `${chalk.green('<T>')} with id \"${id}\" in ${chalk.cyan(file)} has children: ${unwrappedExpressions.join(', ')} that could change at runtime. ` +\n chalk.white('Use a variable component like ') +\n chalk.green('<Var>') +\n chalk.white(' (') +\n chalk.blue('https://generaltranslation.com/docs') +\n chalk.white(') to translate this properly.')\n );\n}\n\nexport function warnTemplateLiteral(file: string, value: string) {\n logger.warn(\n `Found template literal with quasis (${value}) in ${chalk.cyan(file)}. ` +\n chalk.white(\n 'Change the template literal to a string to ensure this content is translated.'\n )\n );\n}\n\nexport function warnTernary(file: string) {\n logger.warn(\n `Found ternary expression in ${chalk.cyan(file)}. ` +\n chalk.white('A Branch component may be more appropriate here.')\n );\n}\n\nexport function warnDeprecatedField(\n deprecatedField: string,\n replacement: string\n) {\n logger.warn(\n `${chalk.green(deprecatedField)} is deprecated. ` +\n chalk.white(`Use ${chalk.green(replacement)} instead.`)\n );\n}\n\n/**\n * Helper: Log all collected files\n */\nexport function logCollectedFiles(\n files: Pick<FileToUpload, 'fileName'>[],\n reactComponents?: number\n): void {\n logger.message(\n chalk.cyan('Files found in project:') +\n '\\n' +\n files\n .map((file) => {\n if (file.fileName === TEMPLATE_FILE_NAME) {\n return `- <React Elements>${reactComponents ? ` (${reactComponents})` : ''}`;\n }\n return `- ${file.fileName}`;\n })\n .join('\\n')\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function validateLocale(value: string): true | "Enter a valid locale (e.g., en)";
|
|
2
|
+
export declare function parseTypedLocale(value: string): string | null;
|
|
3
|
+
export declare function parseLocaleList(value: string): string[];
|
|
4
|
+
export declare function validateLocaleList(value: string): true | "Enter at least one locale" | "Enter a valid locale (e.g., es fr de)";
|
|
5
|
+
export declare function parseGlobPatterns(value: string): string[];
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { gt } from "../utils/gt.js";
|
|
2
|
+
//#region src/console/promptParsing.ts
|
|
3
|
+
function validateLocale(value) {
|
|
4
|
+
const locale = value.trim();
|
|
5
|
+
if (!locale) return "Enter a valid locale (e.g., en)";
|
|
6
|
+
return gt.isValidLocale(locale) || "Enter a valid locale (e.g., en)";
|
|
7
|
+
}
|
|
8
|
+
function parseTypedLocale(value) {
|
|
9
|
+
const locale = value.trim();
|
|
10
|
+
if (!locale) return null;
|
|
11
|
+
return validateLocale(locale) === true ? locale : null;
|
|
12
|
+
}
|
|
13
|
+
function parseLocaleList(value) {
|
|
14
|
+
return value.trim().split(/\s+/).filter(Boolean);
|
|
15
|
+
}
|
|
16
|
+
function validateLocaleList(value) {
|
|
17
|
+
const locales = parseLocaleList(value);
|
|
18
|
+
if (locales.length === 0) return "Enter at least one locale";
|
|
19
|
+
for (const locale of locales) if (!gt.isValidLocale(locale)) return "Enter a valid locale (e.g., es fr de)";
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
function parseGlobPatterns(value) {
|
|
23
|
+
return value.split(/\s+/).map((path) => path.trim()).filter(Boolean);
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { parseGlobPatterns, parseLocaleList, parseTypedLocale, validateLocale, validateLocaleList };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=promptParsing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptParsing.js","names":[],"sources":["../../src/console/promptParsing.ts"],"sourcesContent":["import { gt } from '../utils/gt.js';\n\nexport function validateLocale(value: string) {\n const locale = value.trim();\n if (!locale) return 'Enter a valid locale (e.g., en)';\n return gt.isValidLocale(locale) || 'Enter a valid locale (e.g., en)';\n}\n\nexport function parseTypedLocale(value: string) {\n const locale = value.trim();\n if (!locale) return null;\n return validateLocale(locale) === true ? locale : null;\n}\n\nexport function parseLocaleList(value: string) {\n return value.trim().split(/\\s+/).filter(Boolean);\n}\n\nexport function validateLocaleList(value: string) {\n const locales = parseLocaleList(value);\n if (locales.length === 0) {\n return 'Enter at least one locale';\n }\n for (const locale of locales) {\n if (!gt.isValidLocale(locale)) {\n return 'Enter a valid locale (e.g., es fr de)';\n }\n }\n return true;\n}\n\nexport function parseGlobPatterns(value: string) {\n return value\n .split(/\\s+/)\n .map((path) => path.trim())\n .filter(Boolean);\n}\n"],"mappings":";;AAEA,SAAgB,eAAe,OAAe;CAC5C,MAAM,SAAS,MAAM,MAAM;AAC3B,KAAI,CAAC,OAAQ,QAAO;AACpB,QAAO,GAAG,cAAc,OAAO,IAAI;;AAGrC,SAAgB,iBAAiB,OAAe;CAC9C,MAAM,SAAS,MAAM,MAAM;AAC3B,KAAI,CAAC,OAAQ,QAAO;AACpB,QAAO,eAAe,OAAO,KAAK,OAAO,SAAS;;AAGpD,SAAgB,gBAAgB,OAAe;AAC7C,QAAO,MAAM,MAAM,CAAC,MAAM,MAAM,CAAC,OAAO,QAAQ;;AAGlD,SAAgB,mBAAmB,OAAe;CAChD,MAAM,UAAU,gBAAgB,MAAM;AACtC,KAAI,QAAQ,WAAW,EACrB,QAAO;AAET,MAAK,MAAM,UAAU,QACnB,KAAI,CAAC,GAAG,cAAc,OAAO,CAC3B,QAAO;AAGX,QAAO;;AAGT,SAAgB,kBAAkB,OAAe;AAC/C,QAAO,MACJ,MAAM,MAAM,CACZ,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,OAAO,QAAQ"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//#region src/console/terminalSession.ts
|
|
2
|
+
let activeCleanup;
|
|
3
|
+
let processCleanupRegistered = false;
|
|
4
|
+
function registerProcessCleanup() {
|
|
5
|
+
if (processCleanupRegistered) return;
|
|
6
|
+
processCleanupRegistered = true;
|
|
7
|
+
process.on("exit", () => {
|
|
8
|
+
endTerminalSession();
|
|
9
|
+
});
|
|
10
|
+
process.on("SIGINT", () => {
|
|
11
|
+
endTerminalSession();
|
|
12
|
+
process.exit(130);
|
|
13
|
+
});
|
|
14
|
+
process.on("SIGTERM", () => {
|
|
15
|
+
endTerminalSession();
|
|
16
|
+
process.exit(143);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function registerTerminalSessionCleanup(cleanup) {
|
|
20
|
+
registerProcessCleanup();
|
|
21
|
+
activeCleanup = cleanup;
|
|
22
|
+
return () => {
|
|
23
|
+
if (activeCleanup === cleanup) activeCleanup = void 0;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function endTerminalSession() {
|
|
27
|
+
const cleanup = activeCleanup;
|
|
28
|
+
if (!cleanup) return;
|
|
29
|
+
activeCleanup = void 0;
|
|
30
|
+
cleanup();
|
|
31
|
+
}
|
|
32
|
+
function shouldUseInkPrompts() {
|
|
33
|
+
return process.env.GT_INK !== "0" && process.stdin.isTTY === true && process.stdout.isTTY === true;
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { endTerminalSession, registerTerminalSessionCleanup, shouldUseInkPrompts };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=terminalSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminalSession.js","names":[],"sources":["../../src/console/terminalSession.ts"],"sourcesContent":["type Cleanup = () => void;\n\nlet activeCleanup: Cleanup | undefined;\nlet processCleanupRegistered = false;\n\nfunction registerProcessCleanup() {\n if (processCleanupRegistered) return;\n processCleanupRegistered = true;\n\n process.on('exit', () => {\n endTerminalSession();\n });\n process.on('SIGINT', () => {\n endTerminalSession();\n process.exit(130);\n });\n process.on('SIGTERM', () => {\n endTerminalSession();\n process.exit(143);\n });\n}\n\nexport function registerTerminalSessionCleanup(cleanup: Cleanup) {\n registerProcessCleanup();\n activeCleanup = cleanup;\n\n return () => {\n if (activeCleanup === cleanup) {\n activeCleanup = undefined;\n }\n };\n}\n\nexport function endTerminalSession() {\n const cleanup = activeCleanup;\n if (!cleanup) return;\n activeCleanup = undefined;\n cleanup();\n}\n\nexport function shouldUseInkPrompts() {\n return (\n process.env.GT_INK !== '0' &&\n process.stdin.isTTY === true &&\n process.stdout.isTTY === true\n );\n}\n"],"mappings":";AAEA,IAAI;AACJ,IAAI,2BAA2B;AAE/B,SAAS,yBAAyB;AAChC,KAAI,yBAA0B;AAC9B,4BAA2B;AAE3B,SAAQ,GAAG,cAAc;AACvB,sBAAoB;GACpB;AACF,SAAQ,GAAG,gBAAgB;AACzB,sBAAoB;AACpB,UAAQ,KAAK,IAAI;GACjB;AACF,SAAQ,GAAG,iBAAiB;AAC1B,sBAAoB;AACpB,UAAQ,KAAK,IAAI;GACjB;;AAGJ,SAAgB,+BAA+B,SAAkB;AAC/D,yBAAwB;AACxB,iBAAgB;AAEhB,cAAa;AACX,MAAI,kBAAkB,QACpB,iBAAgB,KAAA;;;AAKtB,SAAgB,qBAAqB;CACnC,MAAM,UAAU;AAChB,KAAI,CAAC,QAAS;AACd,iBAAgB,KAAA;AAChB,UAAS;;AAGX,SAAgB,sBAAsB;AACpC,QACE,QAAQ,IAAI,WAAW,OACvB,QAAQ,MAAM,UAAU,QACxB,QAAQ,OAAO,UAAU"}
|
package/dist/extraction/index.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { calculateHashes, dedupeUpdates, linkDeriveUpdates } from "./postProcess.js";
|
|
2
|
+
import { mapExtractionResultsToUpdates } from "./mapToUpdates.js";
|
|
3
|
+
export { calculateHashes, dedupeUpdates, linkDeriveUpdates, mapExtractionResultsToUpdates };
|
|
@@ -1,20 +1,21 @@
|
|
|
1
|
+
//#region src/extraction/mapToUpdates.ts
|
|
1
2
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}),
|
|
17
|
-
...(result.metadata.staticId && { staticId: result.metadata.staticId }),
|
|
18
|
-
},
|
|
19
|
-
}));
|
|
3
|
+
* Maps ExtractionResult[] to Updates[] format used by the CLI pipeline
|
|
4
|
+
*/
|
|
5
|
+
function mapExtractionResultsToUpdates(results) {
|
|
6
|
+
return results.map((result) => ({
|
|
7
|
+
dataFormat: result.dataFormat,
|
|
8
|
+
source: result.source,
|
|
9
|
+
metadata: {
|
|
10
|
+
...result.metadata.id && { id: result.metadata.id },
|
|
11
|
+
...result.metadata.context && { context: result.metadata.context },
|
|
12
|
+
...result.metadata.maxChars != null && { maxChars: result.metadata.maxChars },
|
|
13
|
+
...result.metadata.filePaths && { filePaths: result.metadata.filePaths },
|
|
14
|
+
...result.metadata.staticId && { staticId: result.metadata.staticId }
|
|
15
|
+
}
|
|
16
|
+
}));
|
|
20
17
|
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { mapExtractionResultsToUpdates };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=mapToUpdates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapToUpdates.js","names":[],"sources":["../../src/extraction/mapToUpdates.ts"],"sourcesContent":["import type { ExtractionResult } from '@generaltranslation/python-extractor';\nimport type { Updates } from '../types/index.js';\n\n/**\n * Maps ExtractionResult[] to Updates[] format used by the CLI pipeline\n */\nexport function mapExtractionResultsToUpdates(\n results: ExtractionResult[]\n): Updates {\n return results.map((result) => ({\n dataFormat: result.dataFormat,\n source: result.source,\n metadata: {\n ...(result.metadata.id && { id: result.metadata.id }),\n ...(result.metadata.context && { context: result.metadata.context }),\n ...(result.metadata.maxChars != null && {\n maxChars: result.metadata.maxChars,\n }),\n ...(result.metadata.filePaths && {\n filePaths: result.metadata.filePaths,\n }),\n ...(result.metadata.staticId && { staticId: result.metadata.staticId }),\n },\n }));\n}\n"],"mappings":";;;;AAMA,SAAgB,8BACd,SACS;AACT,QAAO,QAAQ,KAAK,YAAY;EAC9B,YAAY,OAAO;EACnB,QAAQ,OAAO;EACf,UAAU;GACR,GAAI,OAAO,SAAS,MAAM,EAAE,IAAI,OAAO,SAAS,IAAI;GACpD,GAAI,OAAO,SAAS,WAAW,EAAE,SAAS,OAAO,SAAS,SAAS;GACnE,GAAI,OAAO,SAAS,YAAY,QAAQ,EACtC,UAAU,OAAO,SAAS,UAC3B;GACD,GAAI,OAAO,SAAS,aAAa,EAC/B,WAAW,OAAO,SAAS,WAC5B;GACD,GAAI,OAAO,SAAS,YAAY,EAAE,UAAU,OAAO,SAAS,UAAU;GACvE;EACF,EAAE"}
|