lezu 0.0.36 → 0.0.38

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.
@@ -0,0 +1,7 @@
1
+ import {
2
+ LezuApiClient
3
+ } from "./chunk-T2OGOAYB.js";
4
+ export {
5
+ LezuApiClient
6
+ };
7
+ //# sourceMappingURL=api-K3PNZNU2.js.map
@@ -4,12 +4,13 @@ import {
4
4
  } from "./chunk-EDQCBUBB.js";
5
5
  import {
6
6
  LezuApiClient
7
- } from "./chunk-CLZAMHSX.js";
7
+ } from "./chunk-T2OGOAYB.js";
8
8
 
9
9
  // src/commands/load.ts
10
10
  import { Command } from "commander";
11
11
  import chalk from "chalk";
12
12
  import ora from "ora";
13
+ import { confirm, isCancel, text } from "@clack/prompts";
13
14
 
14
15
  // src/writer.ts
15
16
  import { writeFileSync, mkdirSync } from "fs";
@@ -219,7 +220,7 @@ async function syncTranslations(config) {
219
220
  spinner.start("Connecting to Lezu API...");
220
221
  }
221
222
  }
222
- if (!config.release && config.environment) {
223
+ if (!config.release) {
223
224
  spinner.text = "Fetching latest release...";
224
225
  const latestRelease = await client.getLatestRelease();
225
226
  if (latestRelease) {
@@ -227,8 +228,45 @@ async function syncTranslations(config) {
227
228
  spinner.succeed(`Using latest release: ${latestRelease}`);
228
229
  spinner.start("Fetching translations...");
229
230
  } else {
230
- spinner.info("No releases found, fetching current translations...");
231
- spinner.start();
231
+ spinner.fail("No releases found");
232
+ console.log(chalk.yellow("\n\u26A0\uFE0F No releases found for this project."));
233
+ console.log(chalk.gray("Releases provide cached, versioned snapshots that are fast and efficient."));
234
+ const shouldCreateRelease = await confirm({
235
+ message: "Would you like to create a release now?",
236
+ initialValue: true
237
+ });
238
+ if (isCancel(shouldCreateRelease) || !shouldCreateRelease) {
239
+ console.log(chalk.red("\n\u2716 A release is required to download translations"));
240
+ console.log(chalk.gray("\nOptions:"));
241
+ console.log(chalk.gray(" 1. Create a release through the Lezu dashboard"));
242
+ console.log(chalk.gray(" 2. Use: npx lezu release create"));
243
+ process.exit(1);
244
+ }
245
+ const version = await text({
246
+ message: "Version",
247
+ placeholder: (/* @__PURE__ */ new Date()).toISOString().split("T")[0].replace(/-/g, "."),
248
+ initialValue: (/* @__PURE__ */ new Date()).toISOString().split("T")[0].replace(/-/g, ".")
249
+ });
250
+ if (isCancel(version)) {
251
+ console.log(chalk.yellow("\nOperation cancelled"));
252
+ process.exit(0);
253
+ }
254
+ spinner.start("Creating release...");
255
+ try {
256
+ const release = await client.createRelease({
257
+ version,
258
+ name: "Initial Release",
259
+ description: "Created by Lezu CLI"
260
+ });
261
+ config.release = release.release.id;
262
+ spinner.succeed(`Created release v${release.release.version}`);
263
+ spinner.start("Fetching translations...");
264
+ } catch (error) {
265
+ spinner.fail("Failed to create release");
266
+ console.log(chalk.red("\n\u2716 Cannot continue without a release"));
267
+ console.log(chalk.gray("Please check your permissions or try again later."));
268
+ process.exit(1);
269
+ }
232
270
  }
233
271
  }
234
272
  spinner.text = "Fetching translations...";
@@ -259,4 +297,4 @@ export {
259
297
  createLoadCommand,
260
298
  syncTranslations
261
299
  };
262
- //# sourceMappingURL=chunk-Q2ANUGT7.js.map
300
+ //# sourceMappingURL=chunk-7CSEHTUA.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, text } 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 // Release is required - either specified or use latest\n if (!config.release) {\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.fail('No releases found')\n console.log(chalk.yellow('\\n⚠️ No releases found for this project.'))\n console.log(chalk.gray('Releases provide cached, versioned snapshots that are fast and efficient.'))\n \n const shouldCreateRelease = await confirm({\n message: 'Would you like to create a release now?',\n initialValue: true\n })\n \n if (isCancel(shouldCreateRelease) || !shouldCreateRelease) {\n console.log(chalk.red('\\n✖ A release is required to download translations'))\n console.log(chalk.gray('\\nOptions:'))\n console.log(chalk.gray(' 1. Create a release through the Lezu dashboard'))\n console.log(chalk.gray(' 2. Use: npx lezu release create'))\n process.exit(1)\n }\n \n // Prompt for version\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 console.log(chalk.yellow('\\nOperation cancelled'))\n process.exit(0)\n }\n \n spinner.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 config.release = release.release.id\n spinner.succeed(`Created release v${release.release.version}`)\n spinner.start('Fetching translations...')\n } catch (error) {\n spinner.fail('Failed to create release')\n console.log(chalk.red('\\n✖ Cannot continue without a release'))\n console.log(chalk.gray('Please check your permissions or try again later.'))\n process.exit(1)\n }\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":[]}
@@ -15,7 +15,7 @@ var LezuApiClient = class {
15
15
  }
16
16
  async request(endpoint, options = {}) {
17
17
  const url = `${this.config.apiUrl}${endpoint}`;
18
- if (process.env.DEBUG || this.config.debug) {
18
+ if (process.env.DEBUG === "true" || this.config.debug) {
19
19
  console.error(`
20
20
  [Lezu CLI] Request Details:`);
21
21
  console.error(` URL: ${url}`);
@@ -175,4 +175,4 @@ Try running with DEBUG=true for more details.`;
175
175
  export {
176
176
  LezuApiClient
177
177
  };
178
- //# sourceMappingURL=chunk-CLZAMHSX.js.map
178
+ //# sourceMappingURL=chunk-T2OGOAYB.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 (only when DEBUG=true)\n if (process.env.DEBUG === 'true' || 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-CLZAMHSX.js";
7
+ } from "./chunk-T2OGOAYB.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-GLFSVPT4.js.map
217
+ //# sourceMappingURL=chunk-YPV7LUKI.js.map
@@ -0,0 +1,9 @@
1
+ import {
2
+ createGetCommand
3
+ } from "./chunk-YPV7LUKI.js";
4
+ import "./chunk-EDQCBUBB.js";
5
+ import "./chunk-T2OGOAYB.js";
6
+ export {
7
+ createGetCommand
8
+ };
9
+ //# sourceMappingURL=get-HPT3EP3B.js.map
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  createLoadCommand
3
- } from "./chunk-Q2ANUGT7.js";
3
+ } from "./chunk-7CSEHTUA.js";
4
4
  import {
5
5
  createGetCommand
6
- } from "./chunk-GLFSVPT4.js";
6
+ } from "./chunk-YPV7LUKI.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-CLZAMHSX.js";
13
+ } from "./chunk-T2OGOAYB.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-GMMIJ3O5.js");
138
+ const { getReleases } = await import("./get-HPT3EP3B.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-GSJWUOFT.js");
287
+ const { LezuApiClient: LezuApiClient2 } = await import("./api-K3PNZNU2.js");
288
288
  const client = new LezuApiClient2(config);
289
289
  await client.validateCredentials();
290
290
  validationSpinner.stop("Credentials validated!");
@@ -323,7 +323,7 @@ async function interactiveMode(initialConfig) {
323
323
  }
324
324
  }
325
325
  async function configureLoadCommand(config) {
326
- const { LezuApiClient: LezuApiClient2 } = await import("./api-GSJWUOFT.js");
326
+ const { LezuApiClient: LezuApiClient2 } = await import("./api-K3PNZNU2.js");
327
327
  const client = new LezuApiClient2(config);
328
328
  const releaseSpinner = spinner();
329
329
  releaseSpinner.start("Fetching releases...");
@@ -340,8 +340,7 @@ async function configureLoadCommand(config) {
340
340
  ...releasesResponse.releases.map((release) => ({
341
341
  value: release.id,
342
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)" }
343
+ }))
345
344
  ]
346
345
  });
347
346
  if (isCancel(releaseChoice)) {
@@ -352,55 +351,93 @@ async function configureLoadCommand(config) {
352
351
  selectedRelease = releasesResponse.releases[0].id;
353
352
  const release = releasesResponse.releases[0];
354
353
  availableLanguages = release.languages || [];
355
- } else if (releaseChoice === "current") {
356
- selectedRelease = void 0;
357
354
  } else {
358
355
  selectedRelease = releaseChoice;
359
356
  const release = releasesResponse.releases.find((r) => r.id === releaseChoice);
360
357
  availableLanguages = release?.languages || [];
361
358
  }
362
359
  } else {
363
- releaseSpinner.stop();
360
+ releaseSpinner2.stop();
364
361
  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."));
362
+ console.log(chalk3.gray("Releases are required for downloading translations."));
363
+ console.log(chalk3.gray("They provide cached, versioned snapshots that are fast and efficient."));
366
364
  const shouldCreateRelease = await confirm({
367
- message: "Would you like to create a release from the current translations?",
365
+ message: "Create a release now?",
368
366
  initialValue: true
369
367
  });
370
- if (isCancel(shouldCreateRelease)) {
368
+ if (isCancel(shouldCreateRelease) || !shouldCreateRelease) {
369
+ console.log(chalk3.red("\n\u2716 A release is required to download translations"));
370
+ console.log(chalk3.gray("Create a release through the dashboard or API first."));
371
+ process.exit(0);
372
+ }
373
+ const version2 = await text({
374
+ message: "Version",
375
+ placeholder: (/* @__PURE__ */ new Date()).toISOString().split("T")[0].replace(/-/g, "."),
376
+ initialValue: (/* @__PURE__ */ new Date()).toISOString().split("T")[0].replace(/-/g, ".")
377
+ });
378
+ if (isCancel(version2)) {
371
379
  cancel("Operation cancelled");
372
380
  process.exit(0);
373
381
  }
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, ".")
382
+ const releaseSpinner2 = spinner();
383
+ releaseSpinner2.start("Creating release...");
384
+ try {
385
+ const release = await client.createRelease({
386
+ version: version2,
387
+ name: "Initial Release",
388
+ description: "Created by Lezu CLI"
379
389
  });
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
- }
390
+ selectedRelease = release.release.id;
391
+ availableLanguages = release.release.languages || [];
392
+ releaseSpinner2.stop(`Created release v${release.release.version}`);
393
+ } catch (error) {
394
+ releaseSpinner2.stop();
395
+ console.log(chalk3.red("Failed to create release"));
396
+ console.log(chalk3.red("\n\u2716 Cannot continue without a release"));
397
+ console.log(chalk3.gray("Please check your permissions or try again later."));
398
+ process.exit(1);
399
399
  }
400
400
  }
401
401
  } catch (error) {
402
- releaseSpinner.fail("Failed to fetch releases");
403
- console.log(chalk3.gray("Continuing with current translations..."));
402
+ releaseSpinner.stop();
403
+ console.log(chalk3.yellow("\n\u26A0\uFE0F Could not fetch releases."));
404
+ console.log(chalk3.gray("This might be due to no releases existing yet."));
405
+ const shouldCreateRelease = await confirm({
406
+ message: "Would you like to create a release now?",
407
+ initialValue: true
408
+ });
409
+ if (isCancel(shouldCreateRelease) || !shouldCreateRelease) {
410
+ console.log(chalk3.red("\n\u2716 A release is required to download translations"));
411
+ console.log(chalk3.gray("Releases provide cached, versioned snapshots that are fast and efficient."));
412
+ process.exit(0);
413
+ }
414
+ const version2 = await text({
415
+ message: "Version",
416
+ placeholder: (/* @__PURE__ */ new Date()).toISOString().split("T")[0].replace(/-/g, "."),
417
+ initialValue: (/* @__PURE__ */ new Date()).toISOString().split("T")[0].replace(/-/g, ".")
418
+ });
419
+ if (isCancel(version2)) {
420
+ cancel("Operation cancelled");
421
+ process.exit(0);
422
+ }
423
+ const createReleaseSpinner = spinner();
424
+ createReleaseSpinner.start("Creating release...");
425
+ try {
426
+ const release = await client.createRelease({
427
+ version: version2,
428
+ name: "Initial Release",
429
+ description: "Created by Lezu CLI"
430
+ });
431
+ selectedRelease = release.release.id;
432
+ availableLanguages = release.release.languages || [];
433
+ createReleaseSpinner.stop(`Created release v${release.release.version}`);
434
+ } catch (createError) {
435
+ createReleaseSpinner.stop();
436
+ console.log(chalk3.red("Failed to create release"));
437
+ console.log(chalk3.red("\n\u2716 Cannot continue without a release"));
438
+ console.log(chalk3.gray("Please check your permissions or try again later."));
439
+ process.exit(1);
440
+ }
404
441
  }
405
442
  if (availableLanguages.length === 0) {
406
443
  try {
@@ -473,7 +510,7 @@ async function configureLoadCommand(config) {
473
510
  const s = spinner();
474
511
  s.start("Syncing translations...");
475
512
  try {
476
- const { syncTranslations } = await import("./load-C7ODNIT3.js");
513
+ const { syncTranslations } = await import("./load-I7JE44JQ.js");
477
514
  await syncTranslations(finalConfig);
478
515
  s.stop("Translations synced successfully!");
479
516
  } catch (error) {
@@ -551,7 +588,7 @@ async function configureAddCommand(config) {
551
588
  const s = spinner();
552
589
  s.start("Adding translation key...");
553
590
  try {
554
- const { LezuApiClient: LezuApiClient2 } = await import("./api-GSJWUOFT.js");
591
+ const { LezuApiClient: LezuApiClient2 } = await import("./api-K3PNZNU2.js");
555
592
  const client = new LezuApiClient2(config);
556
593
  await client.addTranslationKey(key, translations);
557
594
  s.stop("Translation key added successfully!");
@@ -583,7 +620,7 @@ async function configureGetCommand(config) {
583
620
  const s = spinner();
584
621
  s.start("Fetching information...");
585
622
  try {
586
- const { LezuApiClient: LezuApiClient2 } = await import("./api-GSJWUOFT.js");
623
+ const { LezuApiClient: LezuApiClient2 } = await import("./api-K3PNZNU2.js");
587
624
  const client = new LezuApiClient2(config);
588
625
  switch (infoType) {
589
626
  case "project":
@@ -631,7 +668,7 @@ async function configureReleaseCommand(config) {
631
668
  cancel("Operation cancelled");
632
669
  process.exit(0);
633
670
  }
634
- const { LezuApiClient: LezuApiClient2 } = await import("./api-GSJWUOFT.js");
671
+ const { LezuApiClient: LezuApiClient2 } = await import("./api-K3PNZNU2.js");
635
672
  const client = new LezuApiClient2(config);
636
673
  if (action === "create") {
637
674
  const version2 = await text({
@@ -718,7 +755,7 @@ async function configureReleaseCommand(config) {
718
755
  }
719
756
 
720
757
  // src/index.ts
721
- var version = "0.0.36";
758
+ var version = "0.0.38";
722
759
  program.name("lezu").description("CLI tool for managing translations with Lezu").version(version);
723
760
  program.addCommand(createLoadCommand());
724
761
  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.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
+ {"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.38'\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 ],\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 {\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, must create one\n releaseSpinner.stop()\n console.log(chalk.yellow('\\n⚠️ No releases found for this project.'))\n console.log(chalk.gray('Releases are required for downloading translations.'))\n console.log(chalk.gray('They provide cached, versioned snapshots that are fast and efficient.'))\n \n const shouldCreateRelease = await confirm({\n message: 'Create a release now?',\n initialValue: true\n })\n \n if (isCancel(shouldCreateRelease) || !shouldCreateRelease) {\n console.log(chalk.red('\\n✖ A release is required to download translations'))\n console.log(chalk.gray('Create a release through the dashboard or API first.'))\n process.exit(0)\n }\n \n // Must create a release to continue\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.stop()\n console.log(chalk.red('Failed to create release'))\n console.log(chalk.red('\\n✖ Cannot continue without a release'))\n console.log(chalk.gray('Please check your permissions or try again later.'))\n process.exit(1)\n }\n }\n } catch (error) {\n releaseSpinner.stop()\n console.log(chalk.yellow('\\n⚠️ Could not fetch releases.'))\n console.log(chalk.gray('This might be due to no releases existing yet.'))\n \n // Assume no releases and prompt to create one\n const shouldCreateRelease = await confirm({\n message: 'Would you like to create a release now?',\n initialValue: true\n })\n \n if (isCancel(shouldCreateRelease) || !shouldCreateRelease) {\n console.log(chalk.red('\\n✖ A release is required to download translations'))\n console.log(chalk.gray('Releases provide cached, versioned snapshots that are fast and efficient.'))\n process.exit(0)\n }\n \n // Create a release\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 createReleaseSpinner = spinner()\n createReleaseSpinner.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 createReleaseSpinner.stop(`Created release v${release.release.version}`)\n } catch (createError) {\n createReleaseSpinner.stop()\n console.log(chalk.red('Failed to create release'))\n console.log(chalk.red('\\n✖ Cannot continue without a release'))\n console.log(chalk.gray('Please check your permissions or try again later.'))\n process.exit(1)\n }\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","releaseSpinner","version","chalk"]}
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createLoadCommand,
3
3
  syncTranslations
4
- } from "./chunk-Q2ANUGT7.js";
4
+ } from "./chunk-7CSEHTUA.js";
5
5
  import "./chunk-EDQCBUBB.js";
6
- import "./chunk-CLZAMHSX.js";
6
+ import "./chunk-T2OGOAYB.js";
7
7
  export {
8
8
  createLoadCommand,
9
9
  syncTranslations
10
10
  };
11
- //# sourceMappingURL=load-C7ODNIT3.js.map
11
+ //# sourceMappingURL=load-I7JE44JQ.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lezu",
3
- "version": "0.0.36",
3
+ "version": "0.0.38",
4
4
  "description": "CLI tool for pulling translations from Lezu",
5
5
  "bin": {
6
6
  "lezu": "bin/lezu.js"
@@ -1,7 +0,0 @@
1
- import {
2
- LezuApiClient
3
- } from "./chunk-CLZAMHSX.js";
4
- export {
5
- LezuApiClient
6
- };
7
- //# sourceMappingURL=api-GSJWUOFT.js.map
@@ -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 // 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":[]}
@@ -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 { 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":[]}
@@ -1,9 +0,0 @@
1
- import {
2
- createGetCommand
3
- } from "./chunk-GLFSVPT4.js";
4
- import "./chunk-EDQCBUBB.js";
5
- import "./chunk-CLZAMHSX.js";
6
- export {
7
- createGetCommand
8
- };
9
- //# sourceMappingURL=get-GMMIJ3O5.js.map