locadex 0.1.11 → 0.1.12

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # locadex
2
2
 
3
+ ## 0.1.12
4
+
5
+ ### Patch Changes
6
+
7
+ - [#404](https://github.com/generaltranslation/gt/pull/404) [`bf06c8e`](https://github.com/generaltranslation/gt/commit/bf06c8e06579c16ff2e1a87c2a884646912eeb36) Thanks [@brian-lou](https://github.com/brian-lou)! - Fix error caused by cursor
8
+
3
9
  ## 0.1.11
4
10
 
5
11
  ### Patch Changes
@@ -24,7 +24,7 @@ import { generateSettings } from 'gtx-cli/config/generateSettings';
24
24
  import { setCredentials } from 'gtx-cli/utils/credentials';
25
25
  import { retrieveCredentials } from 'gtx-cli/utils/credentials';
26
26
  import { isGTAuthConfigured } from '../utils/config.js';
27
- import { execFunction } from 'src/utils/exec.js';
27
+ import { execFunction } from '../utils/exec.js';
28
28
  /**
29
29
  * Run Locadex setup on the project
30
30
  * If autoSetup is true, the task will run without human intervention.
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"/","sources":["tasks/setup.ts"],"names":[],"mappings":"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","sourcesContent":["import { createSpinner, promptConfirm } from '../logging/console.js';\nimport { getPackageJson, isPackageInstalled } from 'gtx-cli/utils/packageJson';\nimport {\n getPackageManager,\n PackageManager,\n} from 'gtx-cli/utils/packageManager';\nimport { installPackage } from 'gtx-cli/utils/installPackage';\nimport chalk from 'chalk';\nimport { logger } from '../logging/logger.js';\nimport { findFilepaths } from '../utils/fs/findConfigs.js';\nimport { wrapContentNext } from 'gtx-cli/next/parse/wrapContent';\nimport { handleInitGT } from 'gtx-cli/next/parse/handleInitGT';\nimport { detectFormatter, formatFiles } from 'gtx-cli/hooks/postProcess';\nimport { createOrUpdateConfig } from 'gtx-cli/fs/config/setupConfig';\nimport { i18nTask } from '../tasks/i18n.js';\nimport { getNextDirectories } from '../utils/fs/getFiles.js';\nimport { LocadexManager } from '../utils/locadexManager.js';\nimport { outro } from '@clack/prompts';\nimport { appendFileSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { exit } from '../utils/shutdown.js';\nimport {\n addTranslateScript,\n installGlobalPackage,\n} from '../utils/packages/installPackage.js';\nimport { CLAUDE_CODE_VERSION } from '../utils/shared.js';\nimport { getLocadexVersion } from '../utils/getPaths.js';\nimport { getResource } from '../resources/getResource.js';\nimport { generateSettings } from 'gtx-cli/config/generateSettings';\nimport { setCredentials } from 'gtx-cli/utils/credentials';\nimport { retrieveCredentials } from 'gtx-cli/utils/credentials';\nimport { isGTAuthConfigured } from '../utils/config.js';\nimport { CliOptions } from '../types/cli.js';\nimport { execFunction } from 'src/utils/exec.js';\n\n/**\n * Run Locadex setup on the project\n * If autoSetup is true, the task will run without human intervention.\n * If autoSetup is false, the task may prompt the user for confirmation.\n */\nexport async function setupTask(\n cliOptions: CliOptions,\n autoSetup: boolean,\n bypassPrompts: boolean,\n specifiedPackageManager?: string\n) {\n if (!bypassPrompts && !autoSetup) {\n await promptConfirm({\n message: chalk.yellow(\n `Locadex will modify files! Make sure you have committed or stashed any changes. Do you want to continue?`\n ),\n defaultValue: true,\n cancelMessage: 'Operation cancelled.',\n });\n }\n\n const manager = LocadexManager.getInstance();\n\n // Setup API keys\n if (!autoSetup && !isGTAuthConfigured(manager.appDirectory)) {\n const shouldGenerateApiKeys = await promptConfirm({\n message: `Would you like locadex to automatically generate a General Translation API key and project ID for you?`,\n defaultValue: true,\n });\n if (shouldGenerateApiKeys) {\n await setupApiKeys('production', manager);\n }\n }\n\n const packageManager = await getPackageManager(\n manager.rootDirectory,\n specifiedPackageManager,\n autoSetup\n );\n let appPackageJson = await getPackageJson(manager.appDirectory);\n\n if (appPackageJson) {\n if (!isPackageInstalled('gt-next', appPackageJson)) {\n const spinner = createSpinner('timer');\n spinner.start(`Installing gt-next with ${packageManager.name}...`);\n await installPackage(\n 'gt-next',\n packageManager,\n false,\n manager.appDirectory\n );\n spinner.stop('Automatically installed gt-next.');\n }\n }\n\n const nextConfigPath = findFilepaths(\n [\n './next.config.js',\n './next.config.ts',\n './next.config.mjs',\n './next.config.mts',\n ],\n manager.appDirectory\n )[0];\n\n if (!nextConfigPath) {\n logger.error('No next.config.[js|ts|mjs|mts] file found.');\n await exit(1);\n }\n\n const errors: string[] = [];\n const warnings: string[] = [];\n let filesUpdated: string[] = [];\n\n const babel = createSpinner();\n\n babel.start('Wrapping <GTProvider> tags...');\n\n // Wrap all JSX elements in the src directory with a <T> tag, with unique ids\n const { filesUpdated: filesUpdatedNext } = await wrapContentNext(\n {\n src: getNextDirectories(manager.appDirectory),\n config: nextConfigPath,\n disableIds: true,\n disableFormatting: true,\n skipTs: true,\n addGTProvider: true,\n },\n 'gt-next',\n errors,\n warnings\n );\n filesUpdated = [...filesUpdated, ...filesUpdatedNext];\n\n babel.stop(`Modified ${filesUpdated.length} files.`);\n\n // Add the withGTConfig() function to the next.config.js file\n await handleInitGT(nextConfigPath, errors, warnings, filesUpdated);\n logger.step(`Added withGTConfig() to your ${nextConfigPath} file.`);\n\n // Create gt.config.json\n await createOrUpdateConfig(\n path.resolve(manager.appDirectory, 'gt.config.json'),\n {\n defaultLocale: 'en',\n locales: ['es', 'fr', 'de', 'ja', 'zh'],\n framework: 'next-app',\n }\n );\n\n logger.success(\n `Feel free to edit ${chalk.cyan(\n 'gt.config.json'\n )} to customize your translation setup. Docs: https://generaltranslation.com/docs/cli/reference/config`\n );\n\n // Add translate to scripts\n // Re-get the package.json to make sure it's updated\n appPackageJson = await getPackageJson(manager.appDirectory);\n if (appPackageJson) {\n await addTranslateScript(manager, appPackageJson, packageManager);\n }\n\n // Install claude-code if not installed\n await installGlobalPackage('@anthropic-ai/claude-code', CLAUDE_CODE_VERSION);\n\n // Install locadex if not installed\n await installGlobalPackage('locadex', getLocadexVersion());\n\n // Set up locale selector\n await setupLocaleSelector();\n\n // Create dictionary.json file if not exists\n // commented out because this trips up the AI\n // setupDictionary(manager);\n\n // Add locadex github action if not exists\n setupGithubAction(manager, packageManager);\n\n if (cliOptions.formatCmd) {\n await execFunction(\n cliOptions.formatCmd,\n [],\n false,\n manager.appDirectory,\n manager.getAgentAbortController()\n );\n } else {\n const formatter = await detectFormatter();\n if (formatter && filesUpdated.length > 0) {\n await formatFiles(filesUpdated, formatter);\n logger.log(`Formatted ${filesUpdated.length} files with ${formatter}`);\n }\n }\n\n // Run i18n command\n await i18nTask(cliOptions);\n}\n\nfunction setupDictionary(manager: LocadexManager) {\n const usingSrcDirectory = existsSync(path.join(manager.appDirectory, 'src'));\n const dictionaryPath = usingSrcDirectory\n ? path.join(manager.appDirectory, 'src', 'dictionary.json')\n : path.join(manager.appDirectory, 'dictionary.json');\n if (!existsSync(dictionaryPath)) {\n writeFileSync(dictionaryPath, '{}');\n logger.step(\n `Created ${chalk.cyan(\n 'dictionary.json'\n )} file at ${chalk.cyan(dictionaryPath)}.`\n );\n } else {\n logger.step(\n `Found ${chalk.cyan('dictionary.json')} file at ${chalk.cyan(\n dictionaryPath\n )}. Skipping creation...`\n );\n }\n}\n\nfunction setupGithubAction(\n manager: LocadexManager,\n packageManager: PackageManager\n) {\n const githubActionPath = path.join(\n manager.rootDirectory,\n '.github',\n 'workflows',\n 'locadex.yml'\n );\n if (!existsSync(githubActionPath)) {\n mkdirSync(path.join(manager.rootDirectory, '.github', 'workflows'), {\n recursive: true,\n });\n const resource = getResource('ghaYaml.yml');\n if (resource.content) {\n const content = resource.content.replace(\n '[packageManager install command]',\n packageManager.installAllCommand\n );\n writeFileSync(githubActionPath, content);\n logger.step(\n `Created ${chalk.cyan(\n 'locadex.yml'\n )} Github Action at ${chalk.cyan(githubActionPath)}. You can edit this file to customize the Github Action. Make sure to add the corresponding secrets to your repo settings!`\n );\n } else {\n logger.error(`Error reading resource ghaYaml.yml: ${resource.error}`);\n }\n } else {\n logger.step(\n `Found ${chalk.cyan('locadex.yml')} Github Action at ${chalk.cyan(\n githubActionPath\n )}. Skipping creation...`\n );\n }\n}\n\nasync function setupApiKeys(\n keyType: 'development' | 'production',\n manager: LocadexManager\n) {\n const settings = await generateSettings({}, manager.appDirectory);\n const credentials = await retrieveCredentials(settings, keyType);\n await setCredentials(\n credentials,\n keyType,\n settings.framework,\n manager.appDirectory\n );\n}\n\nasync function setupLocaleSelector() {\n logger.initializeSpinner();\n logger.spinner.start('Creating locale selector...');\n\n // Create agent\n const manager = LocadexManager.getInstance();\n\n const agent = manager.createSingleAgent('claude_setup_agent', {});\n\n // Fix prompt\n const localeSelectorPrompt = getLocaleSelectorPrompt(manager.appDirectory);\n try {\n await agent.run(\n localeSelectorPrompt,\n {\n maxTurns: 50,\n timeoutSec: 120,\n maxRetries: 1,\n },\n {}\n );\n\n // Generate report\n const report = agent.generateReport();\n const reportSummary = `# Summary of locadex setup changes\n${report}`;\n const summaryFilePath = path.join(\n manager.getLogDirectory(),\n 'locadex-report.md'\n );\n appendFileSync(summaryFilePath, reportSummary);\n } catch (error) {\n agent.aggregateStats();\n // Check if this is an abort\n if (manager.getAgentAbortController().signal.aborted) {\n return;\n }\n logger.debugMessage(`[setup] Adding locale selector failed: ${error}`);\n outro(chalk.red('❌ Locadex setup failed!'));\n await exit(1);\n }\n agent.aggregateStats();\n\n logger.spinner.stop('Locale selector setup complete');\n}\n\nfunction getLocaleSelectorPrompt(appDirectory: string) {\n const prompt = `# Task: Add a locale selector to the app\n\n## Instructions\n- The locale selector should be a dropdown that allows the user to select the locale.\n- The app root is: \"${appDirectory}\"\n\n## LOCALE SELECTOR USAGE\n(1) Import the locale selector component from 'gt-next'\n(2) Add the locale selector to the app\n\nFor example:\nimport { LocaleSelector } from 'gt-next';\n\nfunction MyComponent() {\n return (\n <div>\n <LocaleSelector />\n <p>Hello, world!</p>\n </div>\n );\n}\n\n## RULES\n- The locale selector should be added to a header or footer or some other very obvious place in the app.\n- Scan across files to find the best place to add the locale selector.\n- **DO NOT** create new files. You may only modify existing files.\n- You do not need to mark the component containing the LocaleSelector with 'use client'. The LocaleSelector component is already internally marked with 'use client'.\n\n## Final output\n- When you are done, please return a **brief summary** of the files you modified.\n- **DO NOT** include any other text in your response.\n`;\n return prompt;\n}\n"]}
1
+ {"version":3,"file":"setup.js","sourceRoot":"/","sources":["tasks/setup.ts"],"names":[],"mappings":"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","sourcesContent":["import { createSpinner, promptConfirm } from '../logging/console.js';\nimport { getPackageJson, isPackageInstalled } from 'gtx-cli/utils/packageJson';\nimport {\n getPackageManager,\n PackageManager,\n} from 'gtx-cli/utils/packageManager';\nimport { installPackage } from 'gtx-cli/utils/installPackage';\nimport chalk from 'chalk';\nimport { logger } from '../logging/logger.js';\nimport { findFilepaths } from '../utils/fs/findConfigs.js';\nimport { wrapContentNext } from 'gtx-cli/next/parse/wrapContent';\nimport { handleInitGT } from 'gtx-cli/next/parse/handleInitGT';\nimport { detectFormatter, formatFiles } from 'gtx-cli/hooks/postProcess';\nimport { createOrUpdateConfig } from 'gtx-cli/fs/config/setupConfig';\nimport { i18nTask } from '../tasks/i18n.js';\nimport { getNextDirectories } from '../utils/fs/getFiles.js';\nimport { LocadexManager } from '../utils/locadexManager.js';\nimport { outro } from '@clack/prompts';\nimport { appendFileSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { exit } from '../utils/shutdown.js';\nimport {\n addTranslateScript,\n installGlobalPackage,\n} from '../utils/packages/installPackage.js';\nimport { CLAUDE_CODE_VERSION } from '../utils/shared.js';\nimport { getLocadexVersion } from '../utils/getPaths.js';\nimport { getResource } from '../resources/getResource.js';\nimport { generateSettings } from 'gtx-cli/config/generateSettings';\nimport { setCredentials } from 'gtx-cli/utils/credentials';\nimport { retrieveCredentials } from 'gtx-cli/utils/credentials';\nimport { isGTAuthConfigured } from '../utils/config.js';\nimport { CliOptions } from '../types/cli.js';\nimport { execFunction } from '../utils/exec.js';\n\n/**\n * Run Locadex setup on the project\n * If autoSetup is true, the task will run without human intervention.\n * If autoSetup is false, the task may prompt the user for confirmation.\n */\nexport async function setupTask(\n cliOptions: CliOptions,\n autoSetup: boolean,\n bypassPrompts: boolean,\n specifiedPackageManager?: string\n) {\n if (!bypassPrompts && !autoSetup) {\n await promptConfirm({\n message: chalk.yellow(\n `Locadex will modify files! Make sure you have committed or stashed any changes. Do you want to continue?`\n ),\n defaultValue: true,\n cancelMessage: 'Operation cancelled.',\n });\n }\n\n const manager = LocadexManager.getInstance();\n\n // Setup API keys\n if (!autoSetup && !isGTAuthConfigured(manager.appDirectory)) {\n const shouldGenerateApiKeys = await promptConfirm({\n message: `Would you like locadex to automatically generate a General Translation API key and project ID for you?`,\n defaultValue: true,\n });\n if (shouldGenerateApiKeys) {\n await setupApiKeys('production', manager);\n }\n }\n\n const packageManager = await getPackageManager(\n manager.rootDirectory,\n specifiedPackageManager,\n autoSetup\n );\n let appPackageJson = await getPackageJson(manager.appDirectory);\n\n if (appPackageJson) {\n if (!isPackageInstalled('gt-next', appPackageJson)) {\n const spinner = createSpinner('timer');\n spinner.start(`Installing gt-next with ${packageManager.name}...`);\n await installPackage(\n 'gt-next',\n packageManager,\n false,\n manager.appDirectory\n );\n spinner.stop('Automatically installed gt-next.');\n }\n }\n\n const nextConfigPath = findFilepaths(\n [\n './next.config.js',\n './next.config.ts',\n './next.config.mjs',\n './next.config.mts',\n ],\n manager.appDirectory\n )[0];\n\n if (!nextConfigPath) {\n logger.error('No next.config.[js|ts|mjs|mts] file found.');\n await exit(1);\n }\n\n const errors: string[] = [];\n const warnings: string[] = [];\n let filesUpdated: string[] = [];\n\n const babel = createSpinner();\n\n babel.start('Wrapping <GTProvider> tags...');\n\n // Wrap all JSX elements in the src directory with a <T> tag, with unique ids\n const { filesUpdated: filesUpdatedNext } = await wrapContentNext(\n {\n src: getNextDirectories(manager.appDirectory),\n config: nextConfigPath,\n disableIds: true,\n disableFormatting: true,\n skipTs: true,\n addGTProvider: true,\n },\n 'gt-next',\n errors,\n warnings\n );\n filesUpdated = [...filesUpdated, ...filesUpdatedNext];\n\n babel.stop(`Modified ${filesUpdated.length} files.`);\n\n // Add the withGTConfig() function to the next.config.js file\n await handleInitGT(nextConfigPath, errors, warnings, filesUpdated);\n logger.step(`Added withGTConfig() to your ${nextConfigPath} file.`);\n\n // Create gt.config.json\n await createOrUpdateConfig(\n path.resolve(manager.appDirectory, 'gt.config.json'),\n {\n defaultLocale: 'en',\n locales: ['es', 'fr', 'de', 'ja', 'zh'],\n framework: 'next-app',\n }\n );\n\n logger.success(\n `Feel free to edit ${chalk.cyan(\n 'gt.config.json'\n )} to customize your translation setup. Docs: https://generaltranslation.com/docs/cli/reference/config`\n );\n\n // Add translate to scripts\n // Re-get the package.json to make sure it's updated\n appPackageJson = await getPackageJson(manager.appDirectory);\n if (appPackageJson) {\n await addTranslateScript(manager, appPackageJson, packageManager);\n }\n\n // Install claude-code if not installed\n await installGlobalPackage('@anthropic-ai/claude-code', CLAUDE_CODE_VERSION);\n\n // Install locadex if not installed\n await installGlobalPackage('locadex', getLocadexVersion());\n\n // Set up locale selector\n await setupLocaleSelector();\n\n // Create dictionary.json file if not exists\n // commented out because this trips up the AI\n // setupDictionary(manager);\n\n // Add locadex github action if not exists\n setupGithubAction(manager, packageManager);\n\n if (cliOptions.formatCmd) {\n await execFunction(\n cliOptions.formatCmd,\n [],\n false,\n manager.appDirectory,\n manager.getAgentAbortController()\n );\n } else {\n const formatter = await detectFormatter();\n if (formatter && filesUpdated.length > 0) {\n await formatFiles(filesUpdated, formatter);\n logger.log(`Formatted ${filesUpdated.length} files with ${formatter}`);\n }\n }\n\n // Run i18n command\n await i18nTask(cliOptions);\n}\n\nfunction setupDictionary(manager: LocadexManager) {\n const usingSrcDirectory = existsSync(path.join(manager.appDirectory, 'src'));\n const dictionaryPath = usingSrcDirectory\n ? path.join(manager.appDirectory, 'src', 'dictionary.json')\n : path.join(manager.appDirectory, 'dictionary.json');\n if (!existsSync(dictionaryPath)) {\n writeFileSync(dictionaryPath, '{}');\n logger.step(\n `Created ${chalk.cyan(\n 'dictionary.json'\n )} file at ${chalk.cyan(dictionaryPath)}.`\n );\n } else {\n logger.step(\n `Found ${chalk.cyan('dictionary.json')} file at ${chalk.cyan(\n dictionaryPath\n )}. Skipping creation...`\n );\n }\n}\n\nfunction setupGithubAction(\n manager: LocadexManager,\n packageManager: PackageManager\n) {\n const githubActionPath = path.join(\n manager.rootDirectory,\n '.github',\n 'workflows',\n 'locadex.yml'\n );\n if (!existsSync(githubActionPath)) {\n mkdirSync(path.join(manager.rootDirectory, '.github', 'workflows'), {\n recursive: true,\n });\n const resource = getResource('ghaYaml.yml');\n if (resource.content) {\n const content = resource.content.replace(\n '[packageManager install command]',\n packageManager.installAllCommand\n );\n writeFileSync(githubActionPath, content);\n logger.step(\n `Created ${chalk.cyan(\n 'locadex.yml'\n )} Github Action at ${chalk.cyan(githubActionPath)}. You can edit this file to customize the Github Action. Make sure to add the corresponding secrets to your repo settings!`\n );\n } else {\n logger.error(`Error reading resource ghaYaml.yml: ${resource.error}`);\n }\n } else {\n logger.step(\n `Found ${chalk.cyan('locadex.yml')} Github Action at ${chalk.cyan(\n githubActionPath\n )}. Skipping creation...`\n );\n }\n}\n\nasync function setupApiKeys(\n keyType: 'development' | 'production',\n manager: LocadexManager\n) {\n const settings = await generateSettings({}, manager.appDirectory);\n const credentials = await retrieveCredentials(settings, keyType);\n await setCredentials(\n credentials,\n keyType,\n settings.framework,\n manager.appDirectory\n );\n}\n\nasync function setupLocaleSelector() {\n logger.initializeSpinner();\n logger.spinner.start('Creating locale selector...');\n\n // Create agent\n const manager = LocadexManager.getInstance();\n\n const agent = manager.createSingleAgent('claude_setup_agent', {});\n\n // Fix prompt\n const localeSelectorPrompt = getLocaleSelectorPrompt(manager.appDirectory);\n try {\n await agent.run(\n localeSelectorPrompt,\n {\n maxTurns: 50,\n timeoutSec: 120,\n maxRetries: 1,\n },\n {}\n );\n\n // Generate report\n const report = agent.generateReport();\n const reportSummary = `# Summary of locadex setup changes\n${report}`;\n const summaryFilePath = path.join(\n manager.getLogDirectory(),\n 'locadex-report.md'\n );\n appendFileSync(summaryFilePath, reportSummary);\n } catch (error) {\n agent.aggregateStats();\n // Check if this is an abort\n if (manager.getAgentAbortController().signal.aborted) {\n return;\n }\n logger.debugMessage(`[setup] Adding locale selector failed: ${error}`);\n outro(chalk.red('❌ Locadex setup failed!'));\n await exit(1);\n }\n agent.aggregateStats();\n\n logger.spinner.stop('Locale selector setup complete');\n}\n\nfunction getLocaleSelectorPrompt(appDirectory: string) {\n const prompt = `# Task: Add a locale selector to the app\n\n## Instructions\n- The locale selector should be a dropdown that allows the user to select the locale.\n- The app root is: \"${appDirectory}\"\n\n## LOCALE SELECTOR USAGE\n(1) Import the locale selector component from 'gt-next'\n(2) Add the locale selector to the app\n\nFor example:\nimport { LocaleSelector } from 'gt-next';\n\nfunction MyComponent() {\n return (\n <div>\n <LocaleSelector />\n <p>Hello, world!</p>\n </div>\n );\n}\n\n## RULES\n- The locale selector should be added to a header or footer or some other very obvious place in the app.\n- Scan across files to find the best place to add the locale selector.\n- **DO NOT** create new files. You may only modify existing files.\n- You do not need to mark the component containing the LocaleSelector with 'use client'. The LocaleSelector component is already internally marked with 'use client'.\n\n## Final output\n- When you are done, please return a **brief summary** of the files you modified.\n- **DO NOT** include any other text in your response.\n`;\n return prompt;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "locadex",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
4
4
  "description": "An AI agent for internationalization",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",