lezu 0.0.33 → 0.0.36
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/dist/api-GSJWUOFT.js +7 -0
- package/dist/{chunk-IXYAPQ2N.js → chunk-CLZAMHSX.js} +1 -2
- package/dist/chunk-CLZAMHSX.js.map +1 -0
- package/dist/{chunk-T5TUX4PA.js → chunk-GLFSVPT4.js} +2 -2
- package/dist/{chunk-6BXGRTJX.js → chunk-Q2ANUGT7.js} +16 -2
- package/dist/chunk-Q2ANUGT7.js.map +1 -0
- package/dist/get-GMMIJ3O5.js +9 -0
- package/dist/index.js +125 -24
- package/dist/index.js.map +1 -1
- package/dist/{load-JSL4BFBD.js → load-C7ODNIT3.js} +3 -3
- package/package.json +1 -1
- package/dist/api-4VYPIBVY.js +0 -7
- package/dist/chunk-6BXGRTJX.js.map +0 -1
- package/dist/chunk-IXYAPQ2N.js.map +0 -1
- package/dist/get-HLIULTFB.js +0 -9
- /package/dist/{api-4VYPIBVY.js.map → api-GSJWUOFT.js.map} +0 -0
- /package/dist/{chunk-T5TUX4PA.js.map → chunk-GLFSVPT4.js.map} +0 -0
- /package/dist/{get-HLIULTFB.js.map → get-GMMIJ3O5.js.map} +0 -0
- /package/dist/{load-JSL4BFBD.js.map → load-C7ODNIT3.js.map} +0 -0
|
@@ -118,7 +118,6 @@ Try running with DEBUG=true for more details.`;
|
|
|
118
118
|
}
|
|
119
119
|
return null;
|
|
120
120
|
} catch (error) {
|
|
121
|
-
console.warn("Failed to fetch latest release:", error);
|
|
122
121
|
return null;
|
|
123
122
|
}
|
|
124
123
|
}
|
|
@@ -176,4 +175,4 @@ Try running with DEBUG=true for more details.`;
|
|
|
176
175
|
export {
|
|
177
176
|
LezuApiClient
|
|
178
177
|
};
|
|
179
|
-
//# sourceMappingURL=chunk-
|
|
178
|
+
//# sourceMappingURL=chunk-CLZAMHSX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api.ts"],"sourcesContent":["import fetch from 'node-fetch'\nimport type { Config, ApiResponse, ReleaseResponse } from './types.js'\n\nexport class LezuApiClient {\n private config: Config\n\n constructor(config: Config) {\n this.config = config\n }\n \n async validateCredentials(): Promise<boolean> {\n try {\n // Try to list projects - this works with both API keys and JWT tokens\n await this.request<any>('/v1/projects')\n return true\n } catch (error) {\n throw error\n }\n }\n\n private async request<T>(endpoint: string, options: any = {}): Promise<T> {\n const url = `${this.config.apiUrl}${endpoint}`\n \n // Log request details for debugging\n if (process.env.DEBUG || this.config.debug) {\n console.error(`\\n[Lezu CLI] Request Details:`)\n console.error(` URL: ${url}`)\n console.error(` Method: ${options.method || 'GET'}`)\n console.error(` Headers:`)\n console.error(` Authorization: Bearer ${this.config.apiKey?.substring(0, 10)}...`)\n console.error(` Content-Type: application/json`)\n if (options.body) {\n console.error(` Body: ${options.body}`)\n }\n }\n \n try {\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n ...options.headers\n }\n })\n\n if (!response.ok) {\n let errorMessage = ''\n \n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.error || errorData.message || errorText\n } catch {\n errorMessage = errorText\n }\n } catch {\n errorMessage = response.statusText\n }\n\n // Provide user-friendly error messages with details\n const errorDetails = `\\n\\nRequest failed:\n Endpoint: ${options.method || 'GET'} ${url}\n Status: ${response.status} ${response.statusText}\n Response: ${errorMessage || 'No error details provided'}\n \nTry running with DEBUG=true for more details.`\n\n if (response.status === 401) {\n throw new Error(`Authentication failed. Please check your API key.${errorDetails}`)\n } else if (response.status === 403) {\n throw new Error(`Access denied. Your API key may not have permission for this action.${errorDetails}`)\n } else if (response.status === 404) {\n throw new Error(`Resource not found. Please check your project ID and configuration.${errorDetails}`)\n } else if (response.status === 500) {\n // Check for common 500 errors\n if (errorMessage.includes('project') || errorMessage.includes('not found')) {\n throw new Error(`Project not found. Please verify your project ID is correct.${errorDetails}`)\n } else if (errorMessage.includes('invalid') || errorMessage.includes('malformed')) {\n throw new Error(`Invalid project ID format. Please check your configuration.${errorDetails}`)\n }\n throw new Error(`Server error: ${errorMessage || 'Internal server error'}${errorDetails}`)\n } else {\n throw new Error(`API error: ${errorMessage || response.statusText}${errorDetails}`)\n }\n }\n\n return response.json() as Promise<T>\n } catch (error) {\n if (error instanceof Error) {\n // Check for network errors\n if (error.message.includes('ENOTFOUND') || error.message.includes('ECONNREFUSED')) {\n throw new Error(`Cannot connect to Lezu API at ${this.config.apiUrl}. Please check your internet connection and API URL.`)\n }\n throw error\n }\n throw new Error('An unexpected error occurred')\n }\n }\n\n async getTranslations(): Promise<ApiResponse> {\n let endpoint = `/v1/projects/${this.config.projectId}/translations?environment=${this.config.environment}`\n \n if (this.config.release) {\n endpoint = `/v1/releases/${this.config.release}/bundle`\n }\n\n // Add language filter if specified\n if (this.config.languages && this.config.languages.length > 0) {\n const params = new URLSearchParams()\n this.config.languages.forEach(lang => params.append('languages', lang))\n endpoint += `&${params.toString()}`\n }\n\n const response = await this.request<any>(endpoint)\n \n // Transform the response to match our expected format\n return {\n translations: response.translations || response,\n meta: {\n version: response.version,\n timestamp: response.timestamp || new Date().toISOString(),\n languages: response.languages || Object.keys(response.translations || response)\n }\n }\n }\n\n async getReleases(): Promise<ReleaseResponse> {\n return this.request<ReleaseResponse>(\n `/v1/releases?environment=${this.config.environment}`\n )\n }\n\n async getLatestRelease(): Promise<string | null> {\n try {\n const releases = await this.getReleases()\n if (releases.releases && releases.releases.length > 0) {\n // Releases are ordered by created_at desc, so first one is latest\n return releases.releases[0].id\n }\n return null\n } catch (error) {\n // Silently return null - the calling code will handle no releases\n return null\n }\n }\n\n async getLanguages(): Promise<any> {\n // Get project details to extract languages\n const projectData = await this.getProject()\n return {\n languages: projectData.project.languages?.map((lang: any) => ({\n language_code: typeof lang === 'string' ? lang : lang.code,\n name: typeof lang === 'string' ? lang : lang.name,\n enabled: true\n })) || []\n }\n }\n\n async addTranslationKey(key: string, translations: Record<string, string>): Promise<any> {\n return this.request<any>(\n `/v1/keys`,\n {\n method: 'POST',\n body: JSON.stringify({ key, translations })\n }\n )\n }\n\n async translateKey(text: string, sourceLanguage: string, targetLanguages: string[]): Promise<Record<string, string>> {\n // Use batch translate for efficiency\n const response = await this.request<any>('/v1/translations/translate/batch', {\n method: 'POST',\n body: JSON.stringify({\n texts: [text],\n sourceLanguage,\n targetLanguages\n })\n })\n \n return response.translations[text] || {}\n }\n\n async createRelease(data: {\n version?: string\n name?: string\n description?: string\n reviewedOnly?: boolean\n } = {}): Promise<any> {\n return this.request<any>(\n `/v1/releases`,\n {\n method: 'POST',\n body: JSON.stringify({\n environment: this.config.environment || 'production',\n version: data.version || new Date().toISOString().split('T')[0],\n name: data.name,\n description: data.description,\n reviewedOnly: data.reviewedOnly || false,\n setAsCurrent: true\n })\n }\n )\n }\n\n async getProject(): Promise<any> {\n return this.request<any>(`/v1/projects/${this.config.projectId}`)\n }\n}"],"mappings":"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","names":[]}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-EDQCBUBB.js";
|
|
5
5
|
import {
|
|
6
6
|
LezuApiClient
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-CLZAMHSX.js";
|
|
8
8
|
|
|
9
9
|
// src/commands/get.ts
|
|
10
10
|
import { Command } from "commander";
|
|
@@ -214,4 +214,4 @@ async function getProject(config, options) {
|
|
|
214
214
|
export {
|
|
215
215
|
createGetCommand
|
|
216
216
|
};
|
|
217
|
-
//# sourceMappingURL=chunk-
|
|
217
|
+
//# sourceMappingURL=chunk-GLFSVPT4.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-EDQCBUBB.js";
|
|
5
5
|
import {
|
|
6
6
|
LezuApiClient
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-CLZAMHSX.js";
|
|
8
8
|
|
|
9
9
|
// src/commands/load.ts
|
|
10
10
|
import { Command } from "commander";
|
|
@@ -205,6 +205,20 @@ async function syncTranslations(config) {
|
|
|
205
205
|
const spinner = ora("Connecting to Lezu API...").start();
|
|
206
206
|
try {
|
|
207
207
|
const client = new LezuApiClient(config);
|
|
208
|
+
if (!config.languages || config.languages.length === 0) {
|
|
209
|
+
spinner.text = "Fetching project languages...";
|
|
210
|
+
try {
|
|
211
|
+
const projectData = await client.getProject();
|
|
212
|
+
const projectLanguages = projectData.project.languages || ["en"];
|
|
213
|
+
config.languages = Array.isArray(projectLanguages) ? projectLanguages.map((lang) => typeof lang === "string" ? lang : lang.code) : ["en"];
|
|
214
|
+
spinner.info(`Using project languages: ${config.languages.join(", ")}`);
|
|
215
|
+
spinner.start("Connecting to Lezu API...");
|
|
216
|
+
} catch (error) {
|
|
217
|
+
spinner.warn('Could not fetch project languages, defaulting to "en"');
|
|
218
|
+
config.languages = ["en"];
|
|
219
|
+
spinner.start("Connecting to Lezu API...");
|
|
220
|
+
}
|
|
221
|
+
}
|
|
208
222
|
if (!config.release && config.environment) {
|
|
209
223
|
spinner.text = "Fetching latest release...";
|
|
210
224
|
const latestRelease = await client.getLatestRelease();
|
|
@@ -245,4 +259,4 @@ export {
|
|
|
245
259
|
createLoadCommand,
|
|
246
260
|
syncTranslations
|
|
247
261
|
};
|
|
248
|
-
//# sourceMappingURL=chunk-
|
|
262
|
+
//# sourceMappingURL=chunk-Q2ANUGT7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/load.ts","../src/writer.ts"],"sourcesContent":["import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { confirm, isCancel } from '@clack/prompts'\nimport { loadConfig, validateConfig } from '../config.js'\nimport { LezuApiClient } from '../api.js'\nimport { TranslationWriter } from '../writer.js'\nimport type { Config } from '../types.js'\n\nexport function createLoadCommand() {\n const command = new Command('load')\n .description('Download translation files from Lezu')\n .option('-p, --project <id>', 'Project ID')\n .option('-k, --api-key <key>', 'API key')\n .option('-d, --dest <path>', 'Destination folder', './src/i18n')\n .option('-f, --format <format>', 'Output format (json, js, ts, yaml, po)', 'json')\n .option('-l, --languages <languages>', 'Comma-separated list of languages to download')\n .option('-r, --release <id>', 'Specific release ID')\n .option('-e, --environment <env>', 'Environment', 'production')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--flatten', 'Flatten nested keys')\n .option('--namespace', 'Use namespace folder structure')\n .option('--include-empty', 'Include empty translations')\n .option('-w, --watch', 'Watch for changes')\n .option('--watch-interval <ms>', 'Watch interval in milliseconds', '5000')\n .action(async (options) => {\n try {\n // Parse languages from comma-separated string\n if (options.languages) {\n options.languages = options.languages.split(',').map((l: string) => l.trim())\n }\n\n // Convert watch interval to number\n if (options.watchInterval) {\n options.watchInterval = parseInt(options.watchInterval, 10)\n }\n\n // Load configuration\n const config = loadConfig(options)\n\n // Validate configuration\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n\n // Run the sync\n await syncTranslations(config)\n\n // Watch mode\n if (config.watch) {\n console.log(chalk.cyan(`\\n[Watching] Monitoring for changes every ${config.watchInterval}ms...`))\n console.log(chalk.gray('Press Ctrl+C to stop'))\n \n setInterval(async () => {\n console.log(chalk.gray('\\n[Checking] Looking for updates...'))\n await syncTranslations(config)\n }, config.watchInterval)\n }\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n\n return command\n}\n\nexport async function syncTranslations(config: Config) {\n const spinner = ora('Connecting to Lezu API...').start()\n\n try {\n // Create API client\n const client = new LezuApiClient(config)\n \n // If no languages specified, fetch project languages\n if (!config.languages || config.languages.length === 0) {\n spinner.text = 'Fetching project languages...'\n try {\n const projectData = await client.getProject()\n \n // Extract language codes from project\n const projectLanguages = projectData.project.languages || ['en']\n config.languages = Array.isArray(projectLanguages) \n ? projectLanguages.map((lang: any) => typeof lang === 'string' ? lang : lang.code)\n : ['en']\n \n spinner.info(`Using project languages: ${config.languages.join(', ')}`)\n spinner.start('Connecting to Lezu API...')\n } catch (error) {\n spinner.warn('Could not fetch project languages, defaulting to \"en\"')\n config.languages = ['en']\n spinner.start('Connecting to Lezu API...')\n }\n }\n\n // Skip release fetching if already selected in interactive mode\n // Otherwise, for command line usage, try to get latest release\n if (!config.release && config.environment) {\n spinner.text = 'Fetching latest release...'\n const latestRelease = await client.getLatestRelease()\n if (latestRelease) {\n config.release = latestRelease\n spinner.succeed(`Using latest release: ${latestRelease}`)\n spinner.start('Fetching translations...')\n } else {\n spinner.info('No releases found, fetching current translations...')\n spinner.start()\n }\n }\n\n // Fetch translations\n spinner.text = 'Fetching translations...'\n const response = await client.getTranslations()\n\n if (!response.translations || Object.keys(response.translations).length === 0) {\n spinner.fail('No translations found')\n return\n }\n\n spinner.succeed(`Fetched translations for ${Object.keys(response.translations).length} languages`)\n\n // Write translations\n const writer = new TranslationWriter(config)\n writer.write(response.translations)\n\n console.log(chalk.green('\\n[Success] Translations synced successfully!'))\n\n // Show summary\n console.log(chalk.gray('\\nSummary:'))\n console.log(chalk.gray(` - Project: ${config.projectId}`))\n console.log(chalk.gray(` - Languages: ${Object.keys(response.translations).join(', ')}`))\n console.log(chalk.gray(` - Destination: ${config.dest}`))\n console.log(chalk.gray(` - Format: ${config.format}`))\n \n if (response.meta?.version) {\n console.log(chalk.gray(` - Version: ${response.meta.version}`))\n }\n\n } catch (error) {\n spinner.fail('Failed to sync translations')\n throw error\n }\n}","import { writeFileSync, mkdirSync } from 'fs'\nimport { resolve, dirname, join } from 'path'\nimport type { Config, TranslationBundle } from './types.js'\n\nexport class TranslationWriter {\n private config: Config\n\n constructor(config: Config) {\n this.config = config\n }\n\n write(translations: Record<string, any>): void {\n // Ensure destination directory exists\n mkdirSync(this.config.dest, { recursive: true })\n\n // Write each language to its own file\n for (const [language, content] of Object.entries(translations)) {\n const processedContent = this.processContent(content)\n const filePath = this.getFilePath(language)\n \n mkdirSync(dirname(filePath), { recursive: true })\n \n const fileContent = this.formatContent(processedContent, language)\n writeFileSync(filePath, fileContent, 'utf-8')\n \n console.log(`[Written] ${language} translations to ${filePath}`)\n }\n }\n\n private processContent(content: any): any {\n if (this.config.flatten) {\n return this.flattenObject(content)\n }\n \n if (!this.config.includeEmpty) {\n return this.removeEmptyValues(content)\n }\n \n return content\n }\n\n private flattenObject(obj: any, prefix = ''): Record<string, string> {\n const result: Record<string, string> = {}\n \n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key\n \n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n Object.assign(result, this.flattenObject(value, newKey))\n } else {\n result[newKey] = value as string\n }\n }\n \n return result\n }\n\n private removeEmptyValues(obj: any): any {\n if (typeof obj !== 'object' || obj === null) {\n return obj\n }\n \n const result: any = {}\n \n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'object' && value !== null) {\n const cleaned = this.removeEmptyValues(value)\n if (Object.keys(cleaned).length > 0) {\n result[key] = cleaned\n }\n } else if (value !== '' && value !== null && value !== undefined) {\n result[key] = value\n }\n }\n \n return result\n }\n\n private getFilePath(language: string): string {\n const extension = this.getFileExtension()\n \n if (this.config.namespace) {\n // Use namespace structure: dest/locales/en.json\n return join(this.config.dest, 'locales', `${language}.${extension}`)\n } else {\n // Use flat structure: dest/en.json\n return join(this.config.dest, `${language}.${extension}`)\n }\n }\n\n private getFileExtension(): string {\n switch (this.config.format) {\n case 'json':\n return 'json'\n case 'js':\n return 'js'\n case 'ts':\n return 'ts'\n case 'yaml':\n return 'yaml'\n case 'po':\n return 'po'\n default:\n return 'json'\n }\n }\n\n private formatContent(content: any, language: string): string {\n switch (this.config.format) {\n case 'json':\n return JSON.stringify(content, null, 2)\n \n case 'js':\n return `export default ${JSON.stringify(content, null, 2)}`\n \n case 'ts':\n return `const translations = ${JSON.stringify(content, null, 2)} as const\\n\\nexport default translations`\n \n case 'yaml':\n return this.toYaml(content)\n \n case 'po':\n return this.toPo(content, language)\n \n default:\n return JSON.stringify(content, null, 2)\n }\n }\n\n private toYaml(obj: any, indent = 0): string {\n let result = ''\n const spaces = ' '.repeat(indent)\n \n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'object' && value !== null) {\n result += `${spaces}${key}:\\n${this.toYaml(value, indent + 2)}`\n } else {\n const escapedValue = String(value).includes(':') || String(value).includes('#') \n ? `\"${String(value).replace(/\"/g, '\\\\\"')}\"` \n : value\n result += `${spaces}${key}: ${escapedValue}\\n`\n }\n }\n \n return result\n }\n\n private toPo(obj: any, language: string): string {\n const now = new Date().toISOString()\n let result = `# Translation file for ${language}\n# Generated by Lezu CLI on ${now}\nmsgid \"\"\nmsgstr \"\"\n\"Language: ${language}\\\\n\"\n\"MIME-Version: 1.0\\\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\\\n\"\n\"Content-Transfer-Encoding: 8bit\\\\n\"\n\"Generated-By: Lezu CLI\\\\n\"\n\n`\n\n const flatEntries = this.flattenForPo(obj)\n \n for (const [key, value] of Object.entries(flatEntries)) {\n const escapedKey = this.escapePoString(key)\n const escapedValue = this.escapePoString(String(value))\n \n result += `msgid \"${escapedKey}\"\\n`\n result += `msgstr \"${escapedValue}\"\\n\\n`\n }\n \n return result\n }\n\n private flattenForPo(obj: any, prefix = ''): Record<string, string> {\n const result: Record<string, string> = {}\n \n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key\n \n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n Object.assign(result, this.flattenForPo(value, fullKey))\n } else {\n result[fullKey] = String(value)\n }\n }\n \n return result\n }\n\n private escapePoString(str: string): string {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t')\n }\n}"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createLoadCommand
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Q2ANUGT7.js";
|
|
4
4
|
import {
|
|
5
5
|
createGetCommand
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-GLFSVPT4.js";
|
|
7
7
|
import {
|
|
8
8
|
loadConfig,
|
|
9
9
|
validateConfig
|
|
10
10
|
} from "./chunk-EDQCBUBB.js";
|
|
11
11
|
import {
|
|
12
12
|
LezuApiClient
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-CLZAMHSX.js";
|
|
14
14
|
|
|
15
15
|
// src/index.ts
|
|
16
16
|
import { program } from "commander";
|
|
@@ -135,7 +135,7 @@ function createReleaseCommand() {
|
|
|
135
135
|
errors.forEach((error) => console.error(chalk2.red(` - ${error}`)));
|
|
136
136
|
process.exit(1);
|
|
137
137
|
}
|
|
138
|
-
const { getReleases } = await import("./get-
|
|
138
|
+
const { getReleases } = await import("./get-GMMIJ3O5.js");
|
|
139
139
|
await getReleases(config, options);
|
|
140
140
|
} catch (error) {
|
|
141
141
|
console.error(chalk2.red("\n[Error]"), error instanceof Error ? error.message : error);
|
|
@@ -284,7 +284,7 @@ async function interactiveMode(initialConfig) {
|
|
|
284
284
|
const validationSpinner = spinner();
|
|
285
285
|
validationSpinner.start("Validating credentials...");
|
|
286
286
|
try {
|
|
287
|
-
const { LezuApiClient: LezuApiClient2 } = await import("./api-
|
|
287
|
+
const { LezuApiClient: LezuApiClient2 } = await import("./api-GSJWUOFT.js");
|
|
288
288
|
const client = new LezuApiClient2(config);
|
|
289
289
|
await client.validateCredentials();
|
|
290
290
|
validationSpinner.stop("Credentials validated!");
|
|
@@ -323,6 +323,93 @@ async function interactiveMode(initialConfig) {
|
|
|
323
323
|
}
|
|
324
324
|
}
|
|
325
325
|
async function configureLoadCommand(config) {
|
|
326
|
+
const { LezuApiClient: LezuApiClient2 } = await import("./api-GSJWUOFT.js");
|
|
327
|
+
const client = new LezuApiClient2(config);
|
|
328
|
+
const releaseSpinner = spinner();
|
|
329
|
+
releaseSpinner.start("Fetching releases...");
|
|
330
|
+
let selectedRelease;
|
|
331
|
+
let availableLanguages = [];
|
|
332
|
+
try {
|
|
333
|
+
const releasesResponse = await client.getReleases();
|
|
334
|
+
releaseSpinner.stop();
|
|
335
|
+
if (releasesResponse.releases && releasesResponse.releases.length > 0) {
|
|
336
|
+
const releaseChoice = await select({
|
|
337
|
+
message: "Select a release",
|
|
338
|
+
options: [
|
|
339
|
+
{ value: "latest", label: "\u{1F4E6} Latest release (recommended)" },
|
|
340
|
+
...releasesResponse.releases.map((release) => ({
|
|
341
|
+
value: release.id,
|
|
342
|
+
label: `${release.version}${release.is_current ? " \u2B50\uFE0F (current)" : ""}${release.name ? ` - ${release.name}` : ""}`
|
|
343
|
+
})),
|
|
344
|
+
{ value: "current", label: "\u{1F504} Current translations (no release)" }
|
|
345
|
+
]
|
|
346
|
+
});
|
|
347
|
+
if (isCancel(releaseChoice)) {
|
|
348
|
+
cancel("Operation cancelled");
|
|
349
|
+
process.exit(0);
|
|
350
|
+
}
|
|
351
|
+
if (releaseChoice === "latest") {
|
|
352
|
+
selectedRelease = releasesResponse.releases[0].id;
|
|
353
|
+
const release = releasesResponse.releases[0];
|
|
354
|
+
availableLanguages = release.languages || [];
|
|
355
|
+
} else if (releaseChoice === "current") {
|
|
356
|
+
selectedRelease = void 0;
|
|
357
|
+
} else {
|
|
358
|
+
selectedRelease = releaseChoice;
|
|
359
|
+
const release = releasesResponse.releases.find((r) => r.id === releaseChoice);
|
|
360
|
+
availableLanguages = release?.languages || [];
|
|
361
|
+
}
|
|
362
|
+
} else {
|
|
363
|
+
releaseSpinner.stop();
|
|
364
|
+
console.log(chalk3.yellow("\n\u26A0\uFE0F No releases found for this project."));
|
|
365
|
+
console.log(chalk3.gray("Releases provide versioned snapshots of your translations."));
|
|
366
|
+
const shouldCreateRelease = await confirm({
|
|
367
|
+
message: "Would you like to create a release from the current translations?",
|
|
368
|
+
initialValue: true
|
|
369
|
+
});
|
|
370
|
+
if (isCancel(shouldCreateRelease)) {
|
|
371
|
+
cancel("Operation cancelled");
|
|
372
|
+
process.exit(0);
|
|
373
|
+
}
|
|
374
|
+
if (shouldCreateRelease) {
|
|
375
|
+
const version2 = await text({
|
|
376
|
+
message: "Version",
|
|
377
|
+
placeholder: (/* @__PURE__ */ new Date()).toISOString().split("T")[0].replace(/-/g, "."),
|
|
378
|
+
initialValue: (/* @__PURE__ */ new Date()).toISOString().split("T")[0].replace(/-/g, ".")
|
|
379
|
+
});
|
|
380
|
+
if (isCancel(version2)) {
|
|
381
|
+
cancel("Operation cancelled");
|
|
382
|
+
process.exit(0);
|
|
383
|
+
}
|
|
384
|
+
const releaseSpinner2 = spinner();
|
|
385
|
+
releaseSpinner2.start("Creating release...");
|
|
386
|
+
try {
|
|
387
|
+
const release = await client.createRelease({
|
|
388
|
+
version: version2,
|
|
389
|
+
name: "Initial Release",
|
|
390
|
+
description: "Created by Lezu CLI"
|
|
391
|
+
});
|
|
392
|
+
selectedRelease = release.release.id;
|
|
393
|
+
availableLanguages = release.release.languages || [];
|
|
394
|
+
releaseSpinner2.stop(`Created release v${release.release.version}`);
|
|
395
|
+
} catch (error) {
|
|
396
|
+
releaseSpinner2.fail("Failed to create release");
|
|
397
|
+
console.log(chalk3.gray("Continuing with current translations..."));
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
} catch (error) {
|
|
402
|
+
releaseSpinner.fail("Failed to fetch releases");
|
|
403
|
+
console.log(chalk3.gray("Continuing with current translations..."));
|
|
404
|
+
}
|
|
405
|
+
if (availableLanguages.length === 0) {
|
|
406
|
+
try {
|
|
407
|
+
const projectData = await client.getProject();
|
|
408
|
+
availableLanguages = projectData.project.languages || ["en"];
|
|
409
|
+
} catch {
|
|
410
|
+
availableLanguages = ["en"];
|
|
411
|
+
}
|
|
412
|
+
}
|
|
326
413
|
const dest = await text({
|
|
327
414
|
message: "Destination folder",
|
|
328
415
|
placeholder: "./src/i18n",
|
|
@@ -345,34 +432,48 @@ async function configureLoadCommand(config) {
|
|
|
345
432
|
cancel("Operation cancelled");
|
|
346
433
|
process.exit(0);
|
|
347
434
|
}
|
|
348
|
-
const
|
|
349
|
-
message: "
|
|
350
|
-
|
|
351
|
-
|
|
435
|
+
const languageChoice = await select({
|
|
436
|
+
message: "Which languages to download?",
|
|
437
|
+
options: [
|
|
438
|
+
{ value: "all", label: `All languages (${availableLanguages.join(", ")})` },
|
|
439
|
+
{ value: "specific", label: "Select specific languages" }
|
|
440
|
+
]
|
|
352
441
|
});
|
|
353
|
-
if (isCancel(
|
|
442
|
+
if (isCancel(languageChoice)) {
|
|
354
443
|
cancel("Operation cancelled");
|
|
355
444
|
process.exit(0);
|
|
356
445
|
}
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
446
|
+
let languages;
|
|
447
|
+
if (languageChoice === "specific") {
|
|
448
|
+
const languageInput = await text({
|
|
449
|
+
message: "Enter languages (comma-separated)",
|
|
450
|
+
placeholder: availableLanguages.slice(0, 3).join(","),
|
|
451
|
+
validate: (value) => {
|
|
452
|
+
if (!value) return "At least one language is required";
|
|
453
|
+
const langs = value.split(",").map((l) => l.trim());
|
|
454
|
+
const invalid = langs.filter((l) => !availableLanguages.includes(l));
|
|
455
|
+
if (invalid.length > 0) {
|
|
456
|
+
return `Invalid languages: ${invalid.join(", ")}. Available: ${availableLanguages.join(", ")}`;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
});
|
|
460
|
+
if (isCancel(languageInput)) {
|
|
461
|
+
cancel("Operation cancelled");
|
|
462
|
+
process.exit(0);
|
|
463
|
+
}
|
|
464
|
+
languages = languageInput.split(",").map((l) => l.trim());
|
|
364
465
|
}
|
|
365
466
|
const finalConfig = {
|
|
366
467
|
...config,
|
|
367
468
|
dest,
|
|
368
469
|
format,
|
|
369
|
-
|
|
370
|
-
languages
|
|
470
|
+
release: selectedRelease,
|
|
471
|
+
languages
|
|
371
472
|
};
|
|
372
473
|
const s = spinner();
|
|
373
474
|
s.start("Syncing translations...");
|
|
374
475
|
try {
|
|
375
|
-
const { syncTranslations } = await import("./load-
|
|
476
|
+
const { syncTranslations } = await import("./load-C7ODNIT3.js");
|
|
376
477
|
await syncTranslations(finalConfig);
|
|
377
478
|
s.stop("Translations synced successfully!");
|
|
378
479
|
} catch (error) {
|
|
@@ -450,7 +551,7 @@ async function configureAddCommand(config) {
|
|
|
450
551
|
const s = spinner();
|
|
451
552
|
s.start("Adding translation key...");
|
|
452
553
|
try {
|
|
453
|
-
const { LezuApiClient: LezuApiClient2 } = await import("./api-
|
|
554
|
+
const { LezuApiClient: LezuApiClient2 } = await import("./api-GSJWUOFT.js");
|
|
454
555
|
const client = new LezuApiClient2(config);
|
|
455
556
|
await client.addTranslationKey(key, translations);
|
|
456
557
|
s.stop("Translation key added successfully!");
|
|
@@ -482,7 +583,7 @@ async function configureGetCommand(config) {
|
|
|
482
583
|
const s = spinner();
|
|
483
584
|
s.start("Fetching information...");
|
|
484
585
|
try {
|
|
485
|
-
const { LezuApiClient: LezuApiClient2 } = await import("./api-
|
|
586
|
+
const { LezuApiClient: LezuApiClient2 } = await import("./api-GSJWUOFT.js");
|
|
486
587
|
const client = new LezuApiClient2(config);
|
|
487
588
|
switch (infoType) {
|
|
488
589
|
case "project":
|
|
@@ -530,7 +631,7 @@ async function configureReleaseCommand(config) {
|
|
|
530
631
|
cancel("Operation cancelled");
|
|
531
632
|
process.exit(0);
|
|
532
633
|
}
|
|
533
|
-
const { LezuApiClient: LezuApiClient2 } = await import("./api-
|
|
634
|
+
const { LezuApiClient: LezuApiClient2 } = await import("./api-GSJWUOFT.js");
|
|
534
635
|
const client = new LezuApiClient2(config);
|
|
535
636
|
if (action === "create") {
|
|
536
637
|
const version2 = await text({
|
|
@@ -617,7 +718,7 @@ async function configureReleaseCommand(config) {
|
|
|
617
718
|
}
|
|
618
719
|
|
|
619
720
|
// src/index.ts
|
|
620
|
-
var version = "0.0.
|
|
721
|
+
var version = "0.0.36";
|
|
621
722
|
program.name("lezu").description("CLI tool for managing translations with Lezu").version(version);
|
|
622
723
|
program.addCommand(createLoadCommand());
|
|
623
724
|
program.addCommand(createAddCommand());
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/commands/release.ts","../src/interactive.ts"],"sourcesContent":["import { program } from 'commander'\nimport chalk from 'chalk'\nimport { createLoadCommand } from './commands/load.js'\nimport { createAddCommand } from './commands/add.js'\nimport { createGetCommand } from './commands/get.js'\nimport { createReleaseCommand } from './commands/release.js'\nimport { interactiveMode } from './interactive.js'\nimport { loadConfig } from './config.js'\n\n// Version from package.json\nconst version = '0.0.33'\n\nprogram\n .name('lezu')\n .description('CLI tool for managing translations with Lezu')\n .version(version)\n\n// Add subcommands\nprogram.addCommand(createLoadCommand())\nprogram.addCommand(createAddCommand())\nprogram.addCommand(createGetCommand())\nprogram.addCommand(createReleaseCommand())\n\n// If no command was provided, run interactive mode\nif (process.argv.length <= 2) {\n ;(async () => {\n console.log(chalk.blue('Welcome to Lezu CLI!'))\n console.log()\n \n try {\n const config = loadConfig({})\n await interactiveMode(config)\n } catch (error) {\n if (error instanceof Error) {\n console.error(chalk.red('\\nError:'), error.message)\n } else {\n console.error(chalk.red('\\nError:'), error)\n }\n process.exit(1)\n }\n })()\n} else {\n // Parse commands normally\n program.parse()\n}","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loadConfig, validateConfig } from '../config.js'\nimport { LezuApiClient } from '../api.js'\nimport type { Config } from '../types.js'\n\nexport function createAddCommand() {\n const command = new Command('add')\n .description('Add a new translation key with values')\n .requiredOption('-k, --key <key>', 'Translation key (e.g., \"common.save\")')\n .option('-v, --value <value>', 'Value for the source language')\n .option('--en <value>', 'English translation')\n .option('--es <value>', 'Spanish translation')\n .option('--fr <value>', 'French translation')\n .option('--de <value>', 'German translation')\n .option('--nl <value>', 'Dutch translation')\n .option('--it <value>', 'Italian translation')\n .option('--pt <value>', 'Portuguese translation')\n .option('--ru <value>', 'Russian translation')\n .option('--ja <value>', 'Japanese translation')\n .option('--ko <value>', 'Korean translation')\n .option('--zh <value>', 'Chinese translation')\n .option('--ar <value>', 'Arabic translation')\n .option('-d, --description <desc>', 'Description for the translation key')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--auto', 'Auto-translate to all enabled languages')\n .action(async (options) => {\n try {\n // Load configuration\n const config = loadConfig(options)\n \n // Validate configuration\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n // Collect translations from language options\n const translations: Record<string, string> = {}\n const languageOptions = ['en', 'es', 'fr', 'de', 'nl', 'it', 'pt', 'ru', 'ja', 'ko', 'zh', 'ar']\n \n languageOptions.forEach(lang => {\n if (options[lang]) {\n translations[lang] = options[lang]\n }\n })\n \n // If --value is provided without specific language, use project's source language\n if (options.value && Object.keys(translations).length === 0) {\n // We'll need to get the project info to determine source language\n const spinner = ora('Getting project information...').start()\n const client = new LezuApiClient(config)\n \n try {\n const { project } = await client.getProject()\n const sourceLanguage = project.source_language || 'en'\n translations[sourceLanguage] = options.value\n spinner.succeed(`Using ${sourceLanguage} as source language`)\n } catch (error) {\n spinner.fail('Failed to get project information')\n translations['en'] = options.value // fallback to English\n }\n }\n \n await addTranslationKey(config, {\n key: options.key,\n description: options.description,\n translations,\n auto: options.auto,\n })\n \n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n return command\n}\n\ninterface AddKeyOptions {\n key: string\n description?: string\n translations: Record<string, string>\n auto?: boolean\n}\n\nasync function addTranslationKey(config: Config, options: AddKeyOptions) {\n const spinner = ora('Adding translation key...').start()\n \n try {\n const client = new LezuApiClient(config)\n \n // Add the key with translations\n const response = await client.addTranslationKey(options.key, options.translations)\n \n spinner.succeed('Translation key added successfully!')\n \n // Show summary\n console.log(chalk.green('\\n[Success] Key added:'))\n console.log(chalk.gray(` - Key: ${options.key}`))\n if (options.description) {\n console.log(chalk.gray(` - Description: ${options.description}`))\n }\n console.log(chalk.gray(` - Languages: ${Object.keys(options.translations).join(', ')}`))\n \n // Show translations\n if (Object.keys(options.translations).length > 0) {\n console.log(chalk.gray('\\n Translations:'))\n Object.entries(options.translations).forEach(([lang, value]) => {\n console.log(chalk.gray(` ${lang}: \"${value}\"`))\n })\n }\n \n // If auto-translate was used, show additional info\n if (options.auto) {\n console.log(chalk.cyan('\\n[AI] Auto-translation was enabled. Check the dashboard to review AI-generated translations.'))\n }\n \n } catch (error) {\n spinner.fail('Failed to add translation key')\n throw error\n }\n}","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loadConfig, validateConfig } from '../config.js'\nimport { LezuApiClient } from '../api.js'\nimport type { Config } from '../types.js'\n\nexport function createReleaseCommand() {\n const command = new Command('release')\n .description('Manage releases')\n \n // Create release subcommand\n command\n .command('create')\n .alias('new')\n .description('Create a new release')\n .option('-v, --version <version>', 'Release version (e.g., \"1.0.0\")')\n .option('-n, --name <name>', 'Release name')\n .option('-d, --description <desc>', 'Release description')\n .option('-e, --environment <env>', 'Environment', 'production')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--reviewed-only', 'Include only reviewed translations')\n .option('--set-current', 'Set this release as the current release')\n .option('--timestamp <iso>', 'Specific timestamp for the release (ISO format)')\n .option('--languages <langs>', 'Comma-separated list of languages to include')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const config = loadConfig(options)\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n await createRelease(config, options)\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n // Set current release subcommand\n command\n .command('current <releaseId>')\n .description('Set a release as current')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--json', 'Output as JSON')\n .action(async (releaseId, options) => {\n try {\n const config = loadConfig(options)\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n await setCurrentRelease(config, releaseId, options)\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n // List releases (alias for get releases)\n command\n .command('list')\n .alias('ls')\n .description('List all releases')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('-e, --environment <env>', 'Environment', 'production')\n .option('--json', 'Output as JSON')\n .option('--limit <n>', 'Limit number of results', '10')\n .action(async (options) => {\n try {\n const config = loadConfig(options)\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n // Import and use the getReleases function from get command\n const { getReleases } = await import('./get.js')\n await getReleases(config, options)\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n return command\n}\n\nasync function createRelease(config: Config, options: any) {\n const spinner = ora('Creating release...').start()\n \n try {\n const client = new LezuApiClient(config)\n \n // Parse languages if provided\n const languages = options.languages ? options.languages.split(',').map((l: string) => l.trim()) : undefined\n \n // Validate timestamp if provided\n let timestamp\n if (options.timestamp) {\n try {\n timestamp = new Date(options.timestamp).toISOString()\n } catch (error) {\n throw new Error('Invalid timestamp format. Use ISO format (e.g., 2023-12-01T10:00:00Z)')\n }\n }\n \n const releaseData = {\n environment: options.environment,\n version: options.version,\n name: options.name,\n description: options.description,\n reviewedOnly: options.reviewedOnly || false,\n setAsCurrent: options.setCurrent || false,\n timestamp,\n languages,\n }\n \n spinner.text = 'Creating release and generating bundles...'\n const response = await client.createRelease(releaseData)\n \n spinner.succeed('Release created successfully!')\n \n if (options.json) {\n console.log(JSON.stringify(response, null, 2))\n return\n }\n \n console.log(chalk.green('\\n[Release Created]'))\n console.log(` ID: ${response.release.id}`)\n console.log(` Version: ${response.release.version}`)\n if (response.release.name) {\n console.log(` Name: ${response.release.name}`)\n }\n if (response.release.description) {\n console.log(` Description: ${response.release.description}`)\n }\n console.log(` Environment: ${response.release.environment?.name || options.environment}`)\n console.log(` Reviewed Only: ${response.release.reviewed_only ? 'Yes' : 'No'}`)\n console.log(` Is Current: ${response.release.is_current ? 'Yes' : 'No'}`)\n console.log(` Created: ${new Date(response.release.created_at).toLocaleString()}`)\n \n // Show bundle information\n if (response.release.artifacts && response.release.artifacts.length > 0) {\n console.log(chalk.green('\\n[Bundles Generated]'))\n response.release.artifacts.forEach((artifact: any) => {\n const sizeKB = Math.round(artifact.file_size / 1024)\n console.log(` - ${artifact.language_code}: ${sizeKB}KB`)\n })\n console.log(chalk.gray(`\\nTotal: ${response.release.artifacts.length} language bundles`))\n }\n \n console.log(chalk.cyan('\\n[Tip] You can now use this release with:'))\n console.log(chalk.gray(` npx lezu load --release ${response.release.id}`))\n \n if (response.release.is_current) {\n console.log(chalk.green('\\n[Success] This release is now set as current!'))\n }\n \n } catch (error) {\n spinner.fail('Failed to create release')\n throw error\n }\n}\n\nasync function setCurrentRelease(config: Config, releaseId: string, options: any) {\n const spinner = ora('Setting release as current...').start()\n \n try {\n const response = await fetch(`${config.apiUrl}/v1/releases/${releaseId}/current`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n 'Content-Type': 'application/json',\n },\n })\n \n if (!response.ok) {\n const error = await response.text()\n throw new Error(`Failed to set current release: ${response.status} ${response.statusText}\\n${error}`)\n }\n \n const data = await response.json()\n \n spinner.succeed('Release set as current!')\n \n if (options.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n \n console.log(chalk.green('\\n[Release Updated]'))\n console.log(` Release ID: ${releaseId}`)\n console.log(' Status: Now set as current release')\n \n console.log(chalk.cyan('\\n[Info] All new bundle requests will now use this release'))\n \n } catch (error) {\n spinner.fail('Failed to set release as current')\n throw error\n }\n}","import { intro, outro, select, text, confirm, spinner, cancel, isCancel } from '@clack/prompts'\nimport chalk from 'chalk'\nimport { loadConfig } from './config.js'\nimport type { Config } from './types.js'\n\nexport async function interactiveMode(initialConfig: Partial<Config>): Promise<void> {\n intro(chalk.cyan('Welcome to Lezu CLI!'))\n\n try {\n // Select command\n const command = await select({\n message: 'What would you like to do?',\n options: [\n { value: 'load', label: 'Load translation files' },\n { value: 'add', label: 'Add a new translation key' },\n { value: 'get', label: 'Get project information' },\n { value: 'release', label: 'Manage releases' },\n ],\n })\n\n if (isCancel(command)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n // Get basic configuration\n const projectId = await text({\n message: 'Project ID',\n placeholder: 'Enter your project ID',\n initialValue: initialConfig.projectId || '',\n validate: (value) => {\n if (!value) return 'Project ID is required'\n },\n })\n\n if (isCancel(projectId)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const apiKey = await text({\n message: 'API Key',\n placeholder: 'Enter your API key',\n initialValue: initialConfig.apiKey || '',\n validate: (value) => {\n if (!value) return 'API Key is required'\n },\n })\n\n if (isCancel(apiKey)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const config = loadConfig({ projectId: projectId as string, apiKey: apiKey as string, ...initialConfig })\n\n // Validate connection before proceeding\n const validationSpinner = spinner()\n validationSpinner.start('Validating credentials...')\n \n try {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n \n // Validate credentials using the billing endpoint\n await client.validateCredentials()\n validationSpinner.stop('Credentials validated!')\n } catch (error) {\n if (error instanceof Error) {\n validationSpinner.stop('Invalid credentials')\n outro(chalk.red(error.message))\n } else {\n validationSpinner.stop('Failed to validate credentials')\n outro(chalk.red('Could not connect to Lezu API'))\n }\n process.exit(1)\n }\n\n // Handle specific command configurations\n switch (command) {\n case 'load':\n await configureLoadCommand(config)\n break\n case 'add':\n await configureAddCommand(config)\n break\n case 'get':\n await configureGetCommand(config)\n break\n case 'release':\n await configureReleaseCommand(config)\n break\n }\n\n outro(chalk.green('Done!'))\n } catch (error) {\n if (error instanceof Error) {\n outro(chalk.red(error.message))\n } else {\n outro(chalk.red('An unexpected error occurred'))\n }\n process.exit(1)\n }\n}\n\nasync function configureLoadCommand(config: Config): Promise<void> {\n const dest = await text({\n message: 'Destination folder',\n placeholder: './src/i18n',\n initialValue: config.dest || './src/i18n',\n })\n\n if (isCancel(dest)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const format = await select({\n message: 'Output format',\n options: [\n { value: 'json', label: 'JSON' },\n { value: 'js', label: 'JavaScript (ES modules)' },\n { value: 'ts', label: 'TypeScript' },\n { value: 'yaml', label: 'YAML' },\n ],\n })\n\n if (isCancel(format)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const environment = await text({\n message: 'Environment',\n placeholder: 'production',\n initialValue: config.environment || 'production',\n })\n\n if (isCancel(environment)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const languages = await text({\n message: 'Specific languages (comma-separated, leave empty for all)',\n placeholder: 'en,es,fr',\n })\n\n if (isCancel(languages)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const finalConfig = {\n ...config,\n dest: dest as string,\n format: format as 'json' | 'js' | 'ts' | 'yaml',\n environment: environment as string,\n languages: languages ? (languages as string).split(',').map(l => l.trim()) : undefined\n }\n\n const s = spinner()\n s.start('Syncing translations...')\n \n try {\n const { syncTranslations } = await import('./commands/load.js')\n await syncTranslations(finalConfig)\n s.stop('Translations synced successfully!')\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to sync translations')\n }\n throw error\n }\n}\n\nasync function configureAddCommand(config: Config): Promise<void> {\n const key = await text({\n message: 'Translation key',\n placeholder: 'common.save',\n validate: (value) => {\n if (!value) return 'Translation key is required'\n },\n })\n\n if (isCancel(key)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const description = await text({\n message: 'Description (optional)',\n placeholder: 'Save button text',\n })\n\n if (isCancel(description)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const translationMethod = await select({\n message: 'How would you like to provide translations?',\n options: [\n { value: 'manual', label: 'Provide translations manually' },\n { value: 'auto', label: 'Auto-translate from source language' },\n ],\n })\n\n if (isCancel(translationMethod)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n let translations: Record<string, string> = {}\n let auto = false\n\n if (translationMethod === 'auto') {\n auto = true\n const sourceValue = await text({\n message: 'Source language value',\n placeholder: 'Save',\n validate: (value) => {\n if (!value) return 'Source value is required for auto-translation'\n },\n })\n\n if (isCancel(sourceValue)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n translations.en = sourceValue as string\n } else {\n const languages = ['en', 'es', 'fr', 'de', 'nl']\n \n for (const lang of languages) {\n const value = await text({\n message: `Translation for ${lang} (optional)`,\n placeholder: `Enter ${lang} translation`,\n })\n\n if (isCancel(value)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n if (value) {\n translations[lang] = value as string\n }\n }\n }\n\n const s = spinner()\n s.start('Adding translation key...')\n\n try {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n await client.addTranslationKey(key as string, translations)\n s.stop('Translation key added successfully!')\n \n if (auto) {\n console.log(chalk.cyan('\\n[AI] Auto-translation was enabled. Check the dashboard to review AI-generated translations.'))\n }\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to add translation key')\n }\n throw error\n }\n}\n\nasync function configureGetCommand(config: Config): Promise<void> {\n const infoType = await select({\n message: 'What information would you like to get?',\n options: [\n { value: 'project', label: 'Project information' },\n { value: 'languages', label: 'Languages' },\n { value: 'releases', label: 'Releases' },\n ],\n })\n\n if (isCancel(infoType)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const s = spinner()\n s.start('Fetching information...')\n\n try {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n\n switch (infoType) {\n case 'project':\n const project = await client.getProject()\n s.stop('Project information:')\n console.log(` Name: ${project.project.name}`)\n console.log(` Key: ${project.project.key}`)\n console.log(` Source Language: ${project.project.source_language}`)\n break\n \n case 'languages':\n const languages = await client.getLanguages()\n s.stop('Languages:')\n languages.languages?.forEach((lang: any) => {\n const status = lang.enabled ? chalk.green('[ON]') : chalk.gray('[OFF]')\n console.log(` ${status} ${lang.language?.name || lang.language_code}`)\n })\n break\n \n case 'releases':\n const releases = await client.getReleases()\n s.stop('Recent releases:')\n releases.releases?.slice(0, 10).forEach((release: any) => {\n const current = release.is_current ? chalk.green(' [CURRENT]') : ''\n console.log(` ${release.version}${current}`)\n })\n break\n }\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to fetch information')\n }\n throw error\n }\n}\n\nasync function configureReleaseCommand(config: Config): Promise<void> {\n const action = await select({\n message: 'Release management',\n options: [\n { value: 'create', label: 'Create new release' },\n { value: 'list', label: 'List releases' },\n ],\n })\n\n if (isCancel(action)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n\n if (action === 'create') {\n const version = await text({\n message: 'Version',\n placeholder: '1.0.0',\n validate: (value) => {\n if (!value) return 'Version is required'\n },\n })\n\n if (isCancel(version)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const name = await text({\n message: 'Name (optional)',\n placeholder: 'Production Release',\n })\n\n if (isCancel(name)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const description = await text({\n message: 'Description (optional)',\n placeholder: 'Added new features...',\n })\n\n if (isCancel(description)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const setCurrent = await confirm({\n message: 'Set as current release?',\n })\n\n if (isCancel(setCurrent)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const s = spinner()\n s.start('Creating release...')\n\n try {\n const release = await client.createRelease({\n version: version as string,\n name: name as string || undefined,\n description: description as string || undefined,\n reviewedOnly: false,\n })\n \n if (setCurrent) {\n await fetch(`${config.apiUrl}/v1/releases/${release.release.id}/current`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n })\n }\n \n s.stop('Release created successfully!')\n console.log(` ID: ${release.release.id}`)\n console.log(` Version: ${release.release.version}`)\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to create release')\n }\n throw error\n }\n \n } else {\n const s = spinner()\n s.start('Fetching releases...')\n \n try {\n const releases = await client.getReleases()\n s.stop('Releases:')\n releases.releases?.forEach((release: any, index: number) => {\n const current = release.is_current ? chalk.green(' [CURRENT]') : ''\n console.log(` ${index + 1}. ${release.version}${current}`)\n })\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to list releases')\n }\n throw error\n }\n }\n}"],"mappings":"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","names":["chalk","spinner","Command","chalk","ora","Command","chalk","spinner","ora","chalk","chalk","LezuApiClient","version","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/commands/release.ts","../src/interactive.ts"],"sourcesContent":["import { program } from 'commander'\nimport chalk from 'chalk'\nimport { createLoadCommand } from './commands/load.js'\nimport { createAddCommand } from './commands/add.js'\nimport { createGetCommand } from './commands/get.js'\nimport { createReleaseCommand } from './commands/release.js'\nimport { interactiveMode } from './interactive.js'\nimport { loadConfig } from './config.js'\n\n// Version from package.json\nconst version = '0.0.36'\n\nprogram\n .name('lezu')\n .description('CLI tool for managing translations with Lezu')\n .version(version)\n\n// Add subcommands\nprogram.addCommand(createLoadCommand())\nprogram.addCommand(createAddCommand())\nprogram.addCommand(createGetCommand())\nprogram.addCommand(createReleaseCommand())\n\n// If no command was provided, run interactive mode\nif (process.argv.length <= 2) {\n ;(async () => {\n console.log(chalk.blue('Welcome to Lezu CLI!'))\n console.log()\n \n try {\n const config = loadConfig({})\n await interactiveMode(config)\n } catch (error) {\n if (error instanceof Error) {\n console.error(chalk.red('\\nError:'), error.message)\n } else {\n console.error(chalk.red('\\nError:'), error)\n }\n process.exit(1)\n }\n })()\n} else {\n // Parse commands normally\n program.parse()\n}","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loadConfig, validateConfig } from '../config.js'\nimport { LezuApiClient } from '../api.js'\nimport type { Config } from '../types.js'\n\nexport function createAddCommand() {\n const command = new Command('add')\n .description('Add a new translation key with values')\n .requiredOption('-k, --key <key>', 'Translation key (e.g., \"common.save\")')\n .option('-v, --value <value>', 'Value for the source language')\n .option('--en <value>', 'English translation')\n .option('--es <value>', 'Spanish translation')\n .option('--fr <value>', 'French translation')\n .option('--de <value>', 'German translation')\n .option('--nl <value>', 'Dutch translation')\n .option('--it <value>', 'Italian translation')\n .option('--pt <value>', 'Portuguese translation')\n .option('--ru <value>', 'Russian translation')\n .option('--ja <value>', 'Japanese translation')\n .option('--ko <value>', 'Korean translation')\n .option('--zh <value>', 'Chinese translation')\n .option('--ar <value>', 'Arabic translation')\n .option('-d, --description <desc>', 'Description for the translation key')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--auto', 'Auto-translate to all enabled languages')\n .action(async (options) => {\n try {\n // Load configuration\n const config = loadConfig(options)\n \n // Validate configuration\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n // Collect translations from language options\n const translations: Record<string, string> = {}\n const languageOptions = ['en', 'es', 'fr', 'de', 'nl', 'it', 'pt', 'ru', 'ja', 'ko', 'zh', 'ar']\n \n languageOptions.forEach(lang => {\n if (options[lang]) {\n translations[lang] = options[lang]\n }\n })\n \n // If --value is provided without specific language, use project's source language\n if (options.value && Object.keys(translations).length === 0) {\n // We'll need to get the project info to determine source language\n const spinner = ora('Getting project information...').start()\n const client = new LezuApiClient(config)\n \n try {\n const { project } = await client.getProject()\n const sourceLanguage = project.source_language || 'en'\n translations[sourceLanguage] = options.value\n spinner.succeed(`Using ${sourceLanguage} as source language`)\n } catch (error) {\n spinner.fail('Failed to get project information')\n translations['en'] = options.value // fallback to English\n }\n }\n \n await addTranslationKey(config, {\n key: options.key,\n description: options.description,\n translations,\n auto: options.auto,\n })\n \n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n return command\n}\n\ninterface AddKeyOptions {\n key: string\n description?: string\n translations: Record<string, string>\n auto?: boolean\n}\n\nasync function addTranslationKey(config: Config, options: AddKeyOptions) {\n const spinner = ora('Adding translation key...').start()\n \n try {\n const client = new LezuApiClient(config)\n \n // Add the key with translations\n const response = await client.addTranslationKey(options.key, options.translations)\n \n spinner.succeed('Translation key added successfully!')\n \n // Show summary\n console.log(chalk.green('\\n[Success] Key added:'))\n console.log(chalk.gray(` - Key: ${options.key}`))\n if (options.description) {\n console.log(chalk.gray(` - Description: ${options.description}`))\n }\n console.log(chalk.gray(` - Languages: ${Object.keys(options.translations).join(', ')}`))\n \n // Show translations\n if (Object.keys(options.translations).length > 0) {\n console.log(chalk.gray('\\n Translations:'))\n Object.entries(options.translations).forEach(([lang, value]) => {\n console.log(chalk.gray(` ${lang}: \"${value}\"`))\n })\n }\n \n // If auto-translate was used, show additional info\n if (options.auto) {\n console.log(chalk.cyan('\\n[AI] Auto-translation was enabled. Check the dashboard to review AI-generated translations.'))\n }\n \n } catch (error) {\n spinner.fail('Failed to add translation key')\n throw error\n }\n}","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loadConfig, validateConfig } from '../config.js'\nimport { LezuApiClient } from '../api.js'\nimport type { Config } from '../types.js'\n\nexport function createReleaseCommand() {\n const command = new Command('release')\n .description('Manage releases')\n \n // Create release subcommand\n command\n .command('create')\n .alias('new')\n .description('Create a new release')\n .option('-v, --version <version>', 'Release version (e.g., \"1.0.0\")')\n .option('-n, --name <name>', 'Release name')\n .option('-d, --description <desc>', 'Release description')\n .option('-e, --environment <env>', 'Environment', 'production')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--reviewed-only', 'Include only reviewed translations')\n .option('--set-current', 'Set this release as the current release')\n .option('--timestamp <iso>', 'Specific timestamp for the release (ISO format)')\n .option('--languages <langs>', 'Comma-separated list of languages to include')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const config = loadConfig(options)\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n await createRelease(config, options)\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n // Set current release subcommand\n command\n .command('current <releaseId>')\n .description('Set a release as current')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--json', 'Output as JSON')\n .action(async (releaseId, options) => {\n try {\n const config = loadConfig(options)\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n await setCurrentRelease(config, releaseId, options)\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n // List releases (alias for get releases)\n command\n .command('list')\n .alias('ls')\n .description('List all releases')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('-e, --environment <env>', 'Environment', 'production')\n .option('--json', 'Output as JSON')\n .option('--limit <n>', 'Limit number of results', '10')\n .action(async (options) => {\n try {\n const config = loadConfig(options)\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n // Import and use the getReleases function from get command\n const { getReleases } = await import('./get.js')\n await getReleases(config, options)\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n return command\n}\n\nasync function createRelease(config: Config, options: any) {\n const spinner = ora('Creating release...').start()\n \n try {\n const client = new LezuApiClient(config)\n \n // Parse languages if provided\n const languages = options.languages ? options.languages.split(',').map((l: string) => l.trim()) : undefined\n \n // Validate timestamp if provided\n let timestamp\n if (options.timestamp) {\n try {\n timestamp = new Date(options.timestamp).toISOString()\n } catch (error) {\n throw new Error('Invalid timestamp format. Use ISO format (e.g., 2023-12-01T10:00:00Z)')\n }\n }\n \n const releaseData = {\n environment: options.environment,\n version: options.version,\n name: options.name,\n description: options.description,\n reviewedOnly: options.reviewedOnly || false,\n setAsCurrent: options.setCurrent || false,\n timestamp,\n languages,\n }\n \n spinner.text = 'Creating release and generating bundles...'\n const response = await client.createRelease(releaseData)\n \n spinner.succeed('Release created successfully!')\n \n if (options.json) {\n console.log(JSON.stringify(response, null, 2))\n return\n }\n \n console.log(chalk.green('\\n[Release Created]'))\n console.log(` ID: ${response.release.id}`)\n console.log(` Version: ${response.release.version}`)\n if (response.release.name) {\n console.log(` Name: ${response.release.name}`)\n }\n if (response.release.description) {\n console.log(` Description: ${response.release.description}`)\n }\n console.log(` Environment: ${response.release.environment?.name || options.environment}`)\n console.log(` Reviewed Only: ${response.release.reviewed_only ? 'Yes' : 'No'}`)\n console.log(` Is Current: ${response.release.is_current ? 'Yes' : 'No'}`)\n console.log(` Created: ${new Date(response.release.created_at).toLocaleString()}`)\n \n // Show bundle information\n if (response.release.artifacts && response.release.artifacts.length > 0) {\n console.log(chalk.green('\\n[Bundles Generated]'))\n response.release.artifacts.forEach((artifact: any) => {\n const sizeKB = Math.round(artifact.file_size / 1024)\n console.log(` - ${artifact.language_code}: ${sizeKB}KB`)\n })\n console.log(chalk.gray(`\\nTotal: ${response.release.artifacts.length} language bundles`))\n }\n \n console.log(chalk.cyan('\\n[Tip] You can now use this release with:'))\n console.log(chalk.gray(` npx lezu load --release ${response.release.id}`))\n \n if (response.release.is_current) {\n console.log(chalk.green('\\n[Success] This release is now set as current!'))\n }\n \n } catch (error) {\n spinner.fail('Failed to create release')\n throw error\n }\n}\n\nasync function setCurrentRelease(config: Config, releaseId: string, options: any) {\n const spinner = ora('Setting release as current...').start()\n \n try {\n const response = await fetch(`${config.apiUrl}/v1/releases/${releaseId}/current`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n 'Content-Type': 'application/json',\n },\n })\n \n if (!response.ok) {\n const error = await response.text()\n throw new Error(`Failed to set current release: ${response.status} ${response.statusText}\\n${error}`)\n }\n \n const data = await response.json()\n \n spinner.succeed('Release set as current!')\n \n if (options.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n \n console.log(chalk.green('\\n[Release Updated]'))\n console.log(` Release ID: ${releaseId}`)\n console.log(' Status: Now set as current release')\n \n console.log(chalk.cyan('\\n[Info] All new bundle requests will now use this release'))\n \n } catch (error) {\n spinner.fail('Failed to set release as current')\n throw error\n }\n}","import { intro, outro, select, text, confirm, spinner, cancel, isCancel } from '@clack/prompts'\nimport chalk from 'chalk'\nimport { loadConfig } from './config.js'\nimport type { Config } from './types.js'\n\nexport async function interactiveMode(initialConfig: Partial<Config>): Promise<void> {\n intro(chalk.cyan('Welcome to Lezu CLI!'))\n\n try {\n // Select command\n const command = await select({\n message: 'What would you like to do?',\n options: [\n { value: 'load', label: 'Load translation files' },\n { value: 'add', label: 'Add a new translation key' },\n { value: 'get', label: 'Get project information' },\n { value: 'release', label: 'Manage releases' },\n ],\n })\n\n if (isCancel(command)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n // Get basic configuration\n const projectId = await text({\n message: 'Project ID',\n placeholder: 'Enter your project ID',\n initialValue: initialConfig.projectId || '',\n validate: (value) => {\n if (!value) return 'Project ID is required'\n },\n })\n\n if (isCancel(projectId)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const apiKey = await text({\n message: 'API Key',\n placeholder: 'Enter your API key',\n initialValue: initialConfig.apiKey || '',\n validate: (value) => {\n if (!value) return 'API Key is required'\n },\n })\n\n if (isCancel(apiKey)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const config = loadConfig({ projectId: projectId as string, apiKey: apiKey as string, ...initialConfig })\n\n // Validate connection before proceeding\n const validationSpinner = spinner()\n validationSpinner.start('Validating credentials...')\n \n try {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n \n // Validate credentials using the billing endpoint\n await client.validateCredentials()\n validationSpinner.stop('Credentials validated!')\n } catch (error) {\n if (error instanceof Error) {\n validationSpinner.stop('Invalid credentials')\n outro(chalk.red(error.message))\n } else {\n validationSpinner.stop('Failed to validate credentials')\n outro(chalk.red('Could not connect to Lezu API'))\n }\n process.exit(1)\n }\n\n // Handle specific command configurations\n switch (command) {\n case 'load':\n await configureLoadCommand(config)\n break\n case 'add':\n await configureAddCommand(config)\n break\n case 'get':\n await configureGetCommand(config)\n break\n case 'release':\n await configureReleaseCommand(config)\n break\n }\n\n outro(chalk.green('Done!'))\n } catch (error) {\n if (error instanceof Error) {\n outro(chalk.red(error.message))\n } else {\n outro(chalk.red('An unexpected error occurred'))\n }\n process.exit(1)\n }\n}\n\nasync function configureLoadCommand(config: Config): Promise<void> {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n \n // First, select release or create one\n const releaseSpinner = spinner()\n releaseSpinner.start('Fetching releases...')\n \n let selectedRelease: string | undefined\n let availableLanguages: string[] = []\n \n try {\n const releasesResponse = await client.getReleases()\n releaseSpinner.stop()\n \n if (releasesResponse.releases && releasesResponse.releases.length > 0) {\n // Show release selection\n const releaseChoice = await select({\n message: 'Select a release',\n options: [\n { value: 'latest', label: '📦 Latest release (recommended)' },\n ...releasesResponse.releases.map((release: any) => ({\n value: release.id,\n label: `${release.version}${release.is_current ? ' ⭐️ (current)' : ''}${release.name ? ` - ${release.name}` : ''}`\n })),\n { value: 'current', label: '🔄 Current translations (no release)' }\n ],\n })\n \n if (isCancel(releaseChoice)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n \n if (releaseChoice === 'latest') {\n selectedRelease = releasesResponse.releases[0].id\n // Get languages from the release\n const release = releasesResponse.releases[0]\n availableLanguages = release.languages || []\n } else if (releaseChoice === 'current') {\n // No release, will use current translations\n selectedRelease = undefined\n } else {\n selectedRelease = releaseChoice as string\n // Get languages from the selected release\n const release = releasesResponse.releases.find((r: any) => r.id === releaseChoice)\n availableLanguages = release?.languages || []\n }\n } else {\n // No releases found, offer to create one\n releaseSpinner.stop()\n console.log(chalk.yellow('\\n⚠️ No releases found for this project.'))\n console.log(chalk.gray('Releases provide versioned snapshots of your translations.'))\n \n const shouldCreateRelease = await confirm({\n message: 'Would you like to create a release from the current translations?',\n initialValue: true\n })\n \n if (isCancel(shouldCreateRelease)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n \n if (shouldCreateRelease) {\n const version = await text({\n message: 'Version',\n placeholder: new Date().toISOString().split('T')[0].replace(/-/g, '.'),\n initialValue: new Date().toISOString().split('T')[0].replace(/-/g, '.')\n })\n \n if (isCancel(version)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n \n const releaseSpinner = spinner()\n releaseSpinner.start('Creating release...')\n \n try {\n const release = await client.createRelease({\n version: version as string,\n name: 'Initial Release',\n description: 'Created by Lezu CLI'\n })\n selectedRelease = release.release.id\n availableLanguages = release.release.languages || []\n releaseSpinner.stop(`Created release v${release.release.version}`)\n } catch (error) {\n releaseSpinner.fail('Failed to create release')\n console.log(chalk.gray('Continuing with current translations...'))\n }\n }\n }\n } catch (error) {\n releaseSpinner.fail('Failed to fetch releases')\n console.log(chalk.gray('Continuing with current translations...'))\n }\n \n // If no languages from release, try to get from project\n if (availableLanguages.length === 0) {\n try {\n const projectData = await client.getProject()\n availableLanguages = projectData.project.languages || ['en']\n } catch {\n availableLanguages = ['en']\n }\n }\n \n const dest = await text({\n message: 'Destination folder',\n placeholder: './src/i18n',\n initialValue: config.dest || './src/i18n',\n })\n\n if (isCancel(dest)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const format = await select({\n message: 'Output format',\n options: [\n { value: 'json', label: 'JSON' },\n { value: 'js', label: 'JavaScript (ES modules)' },\n { value: 'ts', label: 'TypeScript' },\n { value: 'yaml', label: 'YAML' },\n ],\n })\n\n if (isCancel(format)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n // Now ask about languages with context\n const languageChoice = await select({\n message: 'Which languages to download?',\n options: [\n { value: 'all', label: `All languages (${availableLanguages.join(', ')})` },\n { value: 'specific', label: 'Select specific languages' }\n ],\n })\n \n if (isCancel(languageChoice)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n \n let languages: string[] | undefined\n \n if (languageChoice === 'specific') {\n const languageInput = await text({\n message: 'Enter languages (comma-separated)',\n placeholder: availableLanguages.slice(0, 3).join(','),\n validate: (value) => {\n if (!value) return 'At least one language is required'\n const langs = value.split(',').map(l => l.trim())\n const invalid = langs.filter(l => !availableLanguages.includes(l))\n if (invalid.length > 0) {\n return `Invalid languages: ${invalid.join(', ')}. Available: ${availableLanguages.join(', ')}`\n }\n }\n })\n \n if (isCancel(languageInput)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n \n languages = (languageInput as string).split(',').map(l => l.trim())\n }\n\n const finalConfig = {\n ...config,\n dest: dest as string,\n format: format as 'json' | 'js' | 'ts' | 'yaml',\n release: selectedRelease,\n languages: languages\n }\n\n const s = spinner()\n s.start('Syncing translations...')\n \n try {\n const { syncTranslations } = await import('./commands/load.js')\n await syncTranslations(finalConfig)\n s.stop('Translations synced successfully!')\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to sync translations')\n }\n throw error\n }\n}\n\nasync function configureAddCommand(config: Config): Promise<void> {\n const key = await text({\n message: 'Translation key',\n placeholder: 'common.save',\n validate: (value) => {\n if (!value) return 'Translation key is required'\n },\n })\n\n if (isCancel(key)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const description = await text({\n message: 'Description (optional)',\n placeholder: 'Save button text',\n })\n\n if (isCancel(description)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const translationMethod = await select({\n message: 'How would you like to provide translations?',\n options: [\n { value: 'manual', label: 'Provide translations manually' },\n { value: 'auto', label: 'Auto-translate from source language' },\n ],\n })\n\n if (isCancel(translationMethod)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n let translations: Record<string, string> = {}\n let auto = false\n\n if (translationMethod === 'auto') {\n auto = true\n const sourceValue = await text({\n message: 'Source language value',\n placeholder: 'Save',\n validate: (value) => {\n if (!value) return 'Source value is required for auto-translation'\n },\n })\n\n if (isCancel(sourceValue)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n translations.en = sourceValue as string\n } else {\n const languages = ['en', 'es', 'fr', 'de', 'nl']\n \n for (const lang of languages) {\n const value = await text({\n message: `Translation for ${lang} (optional)`,\n placeholder: `Enter ${lang} translation`,\n })\n\n if (isCancel(value)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n if (value) {\n translations[lang] = value as string\n }\n }\n }\n\n const s = spinner()\n s.start('Adding translation key...')\n\n try {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n await client.addTranslationKey(key as string, translations)\n s.stop('Translation key added successfully!')\n \n if (auto) {\n console.log(chalk.cyan('\\n[AI] Auto-translation was enabled. Check the dashboard to review AI-generated translations.'))\n }\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to add translation key')\n }\n throw error\n }\n}\n\nasync function configureGetCommand(config: Config): Promise<void> {\n const infoType = await select({\n message: 'What information would you like to get?',\n options: [\n { value: 'project', label: 'Project information' },\n { value: 'languages', label: 'Languages' },\n { value: 'releases', label: 'Releases' },\n ],\n })\n\n if (isCancel(infoType)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const s = spinner()\n s.start('Fetching information...')\n\n try {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n\n switch (infoType) {\n case 'project':\n const project = await client.getProject()\n s.stop('Project information:')\n console.log(` Name: ${project.project.name}`)\n console.log(` Key: ${project.project.key}`)\n console.log(` Source Language: ${project.project.source_language}`)\n break\n \n case 'languages':\n const languages = await client.getLanguages()\n s.stop('Languages:')\n languages.languages?.forEach((lang: any) => {\n const status = lang.enabled ? chalk.green('[ON]') : chalk.gray('[OFF]')\n console.log(` ${status} ${lang.language?.name || lang.language_code}`)\n })\n break\n \n case 'releases':\n const releases = await client.getReleases()\n s.stop('Recent releases:')\n releases.releases?.slice(0, 10).forEach((release: any) => {\n const current = release.is_current ? chalk.green(' [CURRENT]') : ''\n console.log(` ${release.version}${current}`)\n })\n break\n }\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to fetch information')\n }\n throw error\n }\n}\n\nasync function configureReleaseCommand(config: Config): Promise<void> {\n const action = await select({\n message: 'Release management',\n options: [\n { value: 'create', label: 'Create new release' },\n { value: 'list', label: 'List releases' },\n ],\n })\n\n if (isCancel(action)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n\n if (action === 'create') {\n const version = await text({\n message: 'Version',\n placeholder: '1.0.0',\n validate: (value) => {\n if (!value) return 'Version is required'\n },\n })\n\n if (isCancel(version)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const name = await text({\n message: 'Name (optional)',\n placeholder: 'Production Release',\n })\n\n if (isCancel(name)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const description = await text({\n message: 'Description (optional)',\n placeholder: 'Added new features...',\n })\n\n if (isCancel(description)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const setCurrent = await confirm({\n message: 'Set as current release?',\n })\n\n if (isCancel(setCurrent)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const s = spinner()\n s.start('Creating release...')\n\n try {\n const release = await client.createRelease({\n version: version as string,\n name: name as string || undefined,\n description: description as string || undefined,\n reviewedOnly: false,\n })\n \n if (setCurrent) {\n await fetch(`${config.apiUrl}/v1/releases/${release.release.id}/current`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n })\n }\n \n s.stop('Release created successfully!')\n console.log(` ID: ${release.release.id}`)\n console.log(` Version: ${release.release.version}`)\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to create release')\n }\n throw error\n }\n \n } else {\n const s = spinner()\n s.start('Fetching releases...')\n \n try {\n const releases = await client.getReleases()\n s.stop('Releases:')\n releases.releases?.forEach((release: any, index: number) => {\n const current = release.is_current ? chalk.green(' [CURRENT]') : ''\n console.log(` ${index + 1}. ${release.version}${current}`)\n })\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to list releases')\n }\n throw error\n }\n }\n}"],"mappings":"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","names":["chalk","spinner","Command","chalk","ora","Command","chalk","spinner","ora","chalk","chalk","LezuApiClient","version","releaseSpinner","chalk"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createLoadCommand,
|
|
3
3
|
syncTranslations
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-Q2ANUGT7.js";
|
|
5
5
|
import "./chunk-EDQCBUBB.js";
|
|
6
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-CLZAMHSX.js";
|
|
7
7
|
export {
|
|
8
8
|
createLoadCommand,
|
|
9
9
|
syncTranslations
|
|
10
10
|
};
|
|
11
|
-
//# sourceMappingURL=load-
|
|
11
|
+
//# sourceMappingURL=load-C7ODNIT3.js.map
|
package/package.json
CHANGED
package/dist/api-4VYPIBVY.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/load.ts","../src/writer.ts"],"sourcesContent":["import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loadConfig, validateConfig } from '../config.js'\nimport { LezuApiClient } from '../api.js'\nimport { TranslationWriter } from '../writer.js'\nimport type { Config } from '../types.js'\n\nexport function createLoadCommand() {\n const command = new Command('load')\n .description('Download translation files from Lezu')\n .option('-p, --project <id>', 'Project ID')\n .option('-k, --api-key <key>', 'API key')\n .option('-d, --dest <path>', 'Destination folder', './src/i18n')\n .option('-f, --format <format>', 'Output format (json, js, ts, yaml, po)', 'json')\n .option('-l, --languages <languages>', 'Comma-separated list of languages to download')\n .option('-r, --release <id>', 'Specific release ID')\n .option('-e, --environment <env>', 'Environment', 'production')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--flatten', 'Flatten nested keys')\n .option('--namespace', 'Use namespace folder structure')\n .option('--include-empty', 'Include empty translations')\n .option('-w, --watch', 'Watch for changes')\n .option('--watch-interval <ms>', 'Watch interval in milliseconds', '5000')\n .action(async (options) => {\n try {\n // Parse languages from comma-separated string\n if (options.languages) {\n options.languages = options.languages.split(',').map((l: string) => l.trim())\n }\n\n // Convert watch interval to number\n if (options.watchInterval) {\n options.watchInterval = parseInt(options.watchInterval, 10)\n }\n\n // Load configuration\n const config = loadConfig(options)\n\n // Validate configuration\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n\n // Run the sync\n await syncTranslations(config)\n\n // Watch mode\n if (config.watch) {\n console.log(chalk.cyan(`\\n[Watching] Monitoring for changes every ${config.watchInterval}ms...`))\n console.log(chalk.gray('Press Ctrl+C to stop'))\n \n setInterval(async () => {\n console.log(chalk.gray('\\n[Checking] Looking for updates...'))\n await syncTranslations(config)\n }, config.watchInterval)\n }\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n\n return command\n}\n\nexport async function syncTranslations(config: Config) {\n const spinner = ora('Connecting to Lezu API...').start()\n\n try {\n // Create API client\n const client = new LezuApiClient(config)\n\n // If no release specified and not using latest, try to get latest release\n if (!config.release && config.environment) {\n spinner.text = 'Fetching latest release...'\n const latestRelease = await client.getLatestRelease()\n if (latestRelease) {\n config.release = latestRelease\n spinner.succeed(`Using latest release: ${latestRelease}`)\n spinner.start('Fetching translations...')\n } else {\n spinner.info('No releases found, fetching current translations...')\n spinner.start()\n }\n }\n\n // Fetch translations\n spinner.text = 'Fetching translations...'\n const response = await client.getTranslations()\n\n if (!response.translations || Object.keys(response.translations).length === 0) {\n spinner.fail('No translations found')\n return\n }\n\n spinner.succeed(`Fetched translations for ${Object.keys(response.translations).length} languages`)\n\n // Write translations\n const writer = new TranslationWriter(config)\n writer.write(response.translations)\n\n console.log(chalk.green('\\n[Success] Translations synced successfully!'))\n\n // Show summary\n console.log(chalk.gray('\\nSummary:'))\n console.log(chalk.gray(` - Project: ${config.projectId}`))\n console.log(chalk.gray(` - Languages: ${Object.keys(response.translations).join(', ')}`))\n console.log(chalk.gray(` - Destination: ${config.dest}`))\n console.log(chalk.gray(` - Format: ${config.format}`))\n \n if (response.meta?.version) {\n console.log(chalk.gray(` - Version: ${response.meta.version}`))\n }\n\n } catch (error) {\n spinner.fail('Failed to sync translations')\n throw error\n }\n}","import { writeFileSync, mkdirSync } from 'fs'\nimport { resolve, dirname, join } from 'path'\nimport type { Config, TranslationBundle } from './types.js'\n\nexport class TranslationWriter {\n private config: Config\n\n constructor(config: Config) {\n this.config = config\n }\n\n write(translations: Record<string, any>): void {\n // Ensure destination directory exists\n mkdirSync(this.config.dest, { recursive: true })\n\n // Write each language to its own file\n for (const [language, content] of Object.entries(translations)) {\n const processedContent = this.processContent(content)\n const filePath = this.getFilePath(language)\n \n mkdirSync(dirname(filePath), { recursive: true })\n \n const fileContent = this.formatContent(processedContent, language)\n writeFileSync(filePath, fileContent, 'utf-8')\n \n console.log(`[Written] ${language} translations to ${filePath}`)\n }\n }\n\n private processContent(content: any): any {\n if (this.config.flatten) {\n return this.flattenObject(content)\n }\n \n if (!this.config.includeEmpty) {\n return this.removeEmptyValues(content)\n }\n \n return content\n }\n\n private flattenObject(obj: any, prefix = ''): Record<string, string> {\n const result: Record<string, string> = {}\n \n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key\n \n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n Object.assign(result, this.flattenObject(value, newKey))\n } else {\n result[newKey] = value as string\n }\n }\n \n return result\n }\n\n private removeEmptyValues(obj: any): any {\n if (typeof obj !== 'object' || obj === null) {\n return obj\n }\n \n const result: any = {}\n \n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'object' && value !== null) {\n const cleaned = this.removeEmptyValues(value)\n if (Object.keys(cleaned).length > 0) {\n result[key] = cleaned\n }\n } else if (value !== '' && value !== null && value !== undefined) {\n result[key] = value\n }\n }\n \n return result\n }\n\n private getFilePath(language: string): string {\n const extension = this.getFileExtension()\n \n if (this.config.namespace) {\n // Use namespace structure: dest/locales/en.json\n return join(this.config.dest, 'locales', `${language}.${extension}`)\n } else {\n // Use flat structure: dest/en.json\n return join(this.config.dest, `${language}.${extension}`)\n }\n }\n\n private getFileExtension(): string {\n switch (this.config.format) {\n case 'json':\n return 'json'\n case 'js':\n return 'js'\n case 'ts':\n return 'ts'\n case 'yaml':\n return 'yaml'\n case 'po':\n return 'po'\n default:\n return 'json'\n }\n }\n\n private formatContent(content: any, language: string): string {\n switch (this.config.format) {\n case 'json':\n return JSON.stringify(content, null, 2)\n \n case 'js':\n return `export default ${JSON.stringify(content, null, 2)}`\n \n case 'ts':\n return `const translations = ${JSON.stringify(content, null, 2)} as const\\n\\nexport default translations`\n \n case 'yaml':\n return this.toYaml(content)\n \n case 'po':\n return this.toPo(content, language)\n \n default:\n return JSON.stringify(content, null, 2)\n }\n }\n\n private toYaml(obj: any, indent = 0): string {\n let result = ''\n const spaces = ' '.repeat(indent)\n \n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'object' && value !== null) {\n result += `${spaces}${key}:\\n${this.toYaml(value, indent + 2)}`\n } else {\n const escapedValue = String(value).includes(':') || String(value).includes('#') \n ? `\"${String(value).replace(/\"/g, '\\\\\"')}\"` \n : value\n result += `${spaces}${key}: ${escapedValue}\\n`\n }\n }\n \n return result\n }\n\n private toPo(obj: any, language: string): string {\n const now = new Date().toISOString()\n let result = `# Translation file for ${language}\n# Generated by Lezu CLI on ${now}\nmsgid \"\"\nmsgstr \"\"\n\"Language: ${language}\\\\n\"\n\"MIME-Version: 1.0\\\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\\\n\"\n\"Content-Transfer-Encoding: 8bit\\\\n\"\n\"Generated-By: Lezu CLI\\\\n\"\n\n`\n\n const flatEntries = this.flattenForPo(obj)\n \n for (const [key, value] of Object.entries(flatEntries)) {\n const escapedKey = this.escapePoString(key)\n const escapedValue = this.escapePoString(String(value))\n \n result += `msgid \"${escapedKey}\"\\n`\n result += `msgstr \"${escapedValue}\"\\n\\n`\n }\n \n return result\n }\n\n private flattenForPo(obj: any, prefix = ''): Record<string, string> {\n const result: Record<string, string> = {}\n \n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key\n \n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n Object.assign(result, this.flattenForPo(value, fullKey))\n } else {\n result[fullKey] = String(value)\n }\n }\n \n return result\n }\n\n private escapePoString(str: string): string {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t')\n }\n}"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api.ts"],"sourcesContent":["import fetch from 'node-fetch'\nimport type { Config, ApiResponse, ReleaseResponse } from './types.js'\n\nexport class LezuApiClient {\n private config: Config\n\n constructor(config: Config) {\n this.config = config\n }\n \n async validateCredentials(): Promise<boolean> {\n try {\n // Try to list projects - this works with both API keys and JWT tokens\n await this.request<any>('/v1/projects')\n return true\n } catch (error) {\n throw error\n }\n }\n\n private async request<T>(endpoint: string, options: any = {}): Promise<T> {\n const url = `${this.config.apiUrl}${endpoint}`\n \n // Log request details for debugging\n if (process.env.DEBUG || this.config.debug) {\n console.error(`\\n[Lezu CLI] Request Details:`)\n console.error(` URL: ${url}`)\n console.error(` Method: ${options.method || 'GET'}`)\n console.error(` Headers:`)\n console.error(` Authorization: Bearer ${this.config.apiKey?.substring(0, 10)}...`)\n console.error(` Content-Type: application/json`)\n if (options.body) {\n console.error(` Body: ${options.body}`)\n }\n }\n \n try {\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n ...options.headers\n }\n })\n\n if (!response.ok) {\n let errorMessage = ''\n \n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.error || errorData.message || errorText\n } catch {\n errorMessage = errorText\n }\n } catch {\n errorMessage = response.statusText\n }\n\n // Provide user-friendly error messages with details\n const errorDetails = `\\n\\nRequest failed:\n Endpoint: ${options.method || 'GET'} ${url}\n Status: ${response.status} ${response.statusText}\n Response: ${errorMessage || 'No error details provided'}\n \nTry running with DEBUG=true for more details.`\n\n if (response.status === 401) {\n throw new Error(`Authentication failed. Please check your API key.${errorDetails}`)\n } else if (response.status === 403) {\n throw new Error(`Access denied. Your API key may not have permission for this action.${errorDetails}`)\n } else if (response.status === 404) {\n throw new Error(`Resource not found. Please check your project ID and configuration.${errorDetails}`)\n } else if (response.status === 500) {\n // Check for common 500 errors\n if (errorMessage.includes('project') || errorMessage.includes('not found')) {\n throw new Error(`Project not found. Please verify your project ID is correct.${errorDetails}`)\n } else if (errorMessage.includes('invalid') || errorMessage.includes('malformed')) {\n throw new Error(`Invalid project ID format. Please check your configuration.${errorDetails}`)\n }\n throw new Error(`Server error: ${errorMessage || 'Internal server error'}${errorDetails}`)\n } else {\n throw new Error(`API error: ${errorMessage || response.statusText}${errorDetails}`)\n }\n }\n\n return response.json() as Promise<T>\n } catch (error) {\n if (error instanceof Error) {\n // Check for network errors\n if (error.message.includes('ENOTFOUND') || error.message.includes('ECONNREFUSED')) {\n throw new Error(`Cannot connect to Lezu API at ${this.config.apiUrl}. Please check your internet connection and API URL.`)\n }\n throw error\n }\n throw new Error('An unexpected error occurred')\n }\n }\n\n async getTranslations(): Promise<ApiResponse> {\n let endpoint = `/v1/projects/${this.config.projectId}/translations?environment=${this.config.environment}`\n \n if (this.config.release) {\n endpoint = `/v1/releases/${this.config.release}/bundle`\n }\n\n // Add language filter if specified\n if (this.config.languages && this.config.languages.length > 0) {\n const params = new URLSearchParams()\n this.config.languages.forEach(lang => params.append('languages', lang))\n endpoint += `&${params.toString()}`\n }\n\n const response = await this.request<any>(endpoint)\n \n // Transform the response to match our expected format\n return {\n translations: response.translations || response,\n meta: {\n version: response.version,\n timestamp: response.timestamp || new Date().toISOString(),\n languages: response.languages || Object.keys(response.translations || response)\n }\n }\n }\n\n async getReleases(): Promise<ReleaseResponse> {\n return this.request<ReleaseResponse>(\n `/v1/releases?environment=${this.config.environment}`\n )\n }\n\n async getLatestRelease(): Promise<string | null> {\n try {\n const releases = await this.getReleases()\n if (releases.releases && releases.releases.length > 0) {\n // Releases are ordered by created_at desc, so first one is latest\n return releases.releases[0].id\n }\n return null\n } catch (error) {\n console.warn('Failed to fetch latest release:', error)\n return null\n }\n }\n\n async getLanguages(): Promise<any> {\n // Get project details to extract languages\n const projectData = await this.getProject()\n return {\n languages: projectData.project.languages?.map((lang: any) => ({\n language_code: typeof lang === 'string' ? lang : lang.code,\n name: typeof lang === 'string' ? lang : lang.name,\n enabled: true\n })) || []\n }\n }\n\n async addTranslationKey(key: string, translations: Record<string, string>): Promise<any> {\n return this.request<any>(\n `/v1/keys`,\n {\n method: 'POST',\n body: JSON.stringify({ key, translations })\n }\n )\n }\n\n async translateKey(text: string, sourceLanguage: string, targetLanguages: string[]): Promise<Record<string, string>> {\n // Use batch translate for efficiency\n const response = await this.request<any>('/v1/translations/translate/batch', {\n method: 'POST',\n body: JSON.stringify({\n texts: [text],\n sourceLanguage,\n targetLanguages\n })\n })\n \n return response.translations[text] || {}\n }\n\n async createRelease(data: {\n version?: string\n name?: string\n description?: string\n reviewedOnly?: boolean\n } = {}): Promise<any> {\n return this.request<any>(\n `/v1/releases`,\n {\n method: 'POST',\n body: JSON.stringify({\n environment: this.config.environment || 'production',\n version: data.version || new Date().toISOString().split('T')[0],\n name: data.name,\n description: data.description,\n reviewedOnly: data.reviewedOnly || false,\n setAsCurrent: true\n })\n }\n )\n }\n\n async getProject(): Promise<any> {\n return this.request<any>(`/v1/projects/${this.config.projectId}`)\n }\n}"],"mappings":"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","names":[]}
|
package/dist/get-HLIULTFB.js
DELETED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|