lezu 0.0.13 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/lezu.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import '../dist/index.js'
@@ -0,0 +1,7 @@
1
+ import {
2
+ LezuApiClient
3
+ } from "./chunk-WZDLWLM3.js";
4
+ export {
5
+ LezuApiClient
6
+ };
7
+ //# sourceMappingURL=api-PFXU7GZT.js.map
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env node
2
-
3
1
  // src/config.ts
4
2
  import { readFileSync, existsSync } from "fs";
5
3
  import { resolve } from "path";
@@ -95,4 +93,4 @@ export {
95
93
  loadConfig,
96
94
  validateConfig
97
95
  };
98
- //# sourceMappingURL=chunk-VGQICGPH.js.map
96
+ //# sourceMappingURL=chunk-4YJMQGUZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/types.ts"],"sourcesContent":["import { readFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport dotenv from 'dotenv'\nimport { Config, ConfigSchema } from './types.js'\n\n// Load environment variables\ndotenv.config()\n\nexport function loadConfig(options: Partial<Config> = {}): Config {\n // 1. Start with defaults\n let config: Partial<Config> = {\n apiUrl: 'https://api.lezu.app',\n dest: './src/i18n',\n format: 'json',\n environment: 'production',\n flatten: false,\n namespace: false,\n includeEmpty: false,\n watch: false,\n watchInterval: 5000\n }\n\n // 2. Load from config file (only JSON files to avoid JS module complexity)\n const configFiles = ['.lezurc', '.lezurc.json']\n for (const file of configFiles) {\n const configPath = resolve(process.cwd(), file)\n if (existsSync(configPath)) {\n try {\n // JSON config files only\n const content = readFileSync(configPath, 'utf-8')\n const fileConfig = JSON.parse(content)\n config = { ...config, ...fileConfig }\n console.log(`📁 Loaded config from ${file}`)\n break\n } catch (error) {\n console.warn(`⚠️ Failed to load config from ${file}:`, error)\n }\n }\n }\n\n // 3. Load from environment variables\n if (process.env.LEZU_PROJECT_ID) {\n config.projectId = process.env.LEZU_PROJECT_ID\n }\n if (process.env.LEZU_API_KEY) {\n config.apiKey = process.env.LEZU_API_KEY\n }\n if (process.env.LEZU_API_URL) {\n config.apiUrl = process.env.LEZU_API_URL\n }\n if (process.env.LEZU_DEST) {\n config.dest = process.env.LEZU_DEST\n }\n if (process.env.LEZU_FORMAT) {\n config.format = process.env.LEZU_FORMAT as any\n }\n if (process.env.LEZU_ENVIRONMENT) {\n config.environment = process.env.LEZU_ENVIRONMENT\n }\n\n // 4. Apply CLI options (highest priority)\n config = { ...config, ...options }\n\n // 5. Validate and return\n try {\n return ConfigSchema.parse(config)\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Invalid configuration: ${error.message}`)\n }\n throw error\n }\n}\n\nexport function validateConfig(config: Config): string[] {\n const errors: string[] = []\n\n if (!config.projectId) {\n errors.push('Project ID is required (use --project, LEZU_PROJECT_ID env var, or projectId in config file)')\n }\n\n if (!config.apiKey) {\n errors.push('API Key is required (use --api-key, LEZU_API_KEY env var, or apiKey in config file)')\n }\n\n return errors\n}","import { z } from 'zod'\n\nexport const ConfigSchema = z.object({\n projectId: z.string().optional(),\n apiKey: z.string().optional(),\n apiUrl: z.string().default('https://api.lezu.app'),\n dest: z.string().default('./src/i18n'),\n format: z.enum(['json', 'js', 'ts', 'yaml', 'po']).default('json'),\n languages: z.array(z.string()).optional(),\n release: z.string().optional(),\n environment: z.string().default('production'),\n flatten: z.boolean().default(false),\n namespace: z.boolean().default(false),\n includeEmpty: z.boolean().default(false),\n watch: z.boolean().default(false),\n watchInterval: z.number().default(5000)\n})\n\nexport type Config = z.infer<typeof ConfigSchema>\n\nexport interface TranslationBundle {\n [key: string]: string | TranslationBundle\n}\n\nexport interface ApiResponse {\n translations: Record<string, any>\n meta?: {\n version?: string\n timestamp?: string\n languages?: string[]\n }\n}\n\nexport interface ReleaseResponse {\n releases: Array<{\n id: string\n version: string\n name?: string\n created_at: string\n }>\n}"],"mappings":";;;AAAA,SAAS,cAAc,kBAAkB;AACzC,SAAS,eAAe;AACxB,OAAO,YAAY;;;ACFnB,SAAS,SAAS;AAEX,IAAM,eAAe,EAAE,OAAO;AAAA,EACnC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,QAAQ,EAAE,OAAO,EAAE,QAAQ,sBAAsB;AAAA,EACjD,MAAM,EAAE,OAAO,EAAE,QAAQ,YAAY;AAAA,EACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ,MAAM,MAAM,QAAQ,IAAI,CAAC,EAAE,QAAQ,MAAM;AAAA,EACjE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAa,EAAE,OAAO,EAAE,QAAQ,YAAY;AAAA,EAC5C,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAClC,WAAW,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACpC,cAAc,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACvC,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAChC,eAAe,EAAE,OAAO,EAAE,QAAQ,GAAI;AACxC,CAAC;;;ADVD,OAAO,OAAO;AAEP,SAAS,WAAW,UAA2B,CAAC,GAAW;AAEhE,MAAI,SAA0B;AAAA,IAC5B,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,cAAc;AAAA,IACd,OAAO;AAAA,IACP,eAAe;AAAA,EACjB;AAGA,QAAM,cAAc,CAAC,WAAW,cAAc;AAC9C,aAAW,QAAQ,aAAa;AAC9B,UAAM,aAAa,QAAQ,QAAQ,IAAI,GAAG,IAAI;AAC9C,QAAI,WAAW,UAAU,GAAG;AAC1B,UAAI;AAEF,cAAM,UAAU,aAAa,YAAY,OAAO;AAChD,cAAM,aAAa,KAAK,MAAM,OAAO;AACrC,iBAAS,EAAE,GAAG,QAAQ,GAAG,WAAW;AACpC,gBAAQ,IAAI,gCAAyB,IAAI,EAAE;AAC3C;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,KAAK,4CAAkC,IAAI,KAAK,KAAK;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,IAAI,iBAAiB;AAC/B,WAAO,YAAY,QAAQ,IAAI;AAAA,EACjC;AACA,MAAI,QAAQ,IAAI,cAAc;AAC5B,WAAO,SAAS,QAAQ,IAAI;AAAA,EAC9B;AACA,MAAI,QAAQ,IAAI,cAAc;AAC5B,WAAO,SAAS,QAAQ,IAAI;AAAA,EAC9B;AACA,MAAI,QAAQ,IAAI,WAAW;AACzB,WAAO,OAAO,QAAQ,IAAI;AAAA,EAC5B;AACA,MAAI,QAAQ,IAAI,aAAa;AAC3B,WAAO,SAAS,QAAQ,IAAI;AAAA,EAC9B;AACA,MAAI,QAAQ,IAAI,kBAAkB;AAChC,WAAO,cAAc,QAAQ,IAAI;AAAA,EACnC;AAGA,WAAS,EAAE,GAAG,QAAQ,GAAG,QAAQ;AAGjC,MAAI;AACF,WAAO,aAAa,MAAM,MAAM;AAAA,EAClC,SAAS,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,IAAI,MAAM,0BAA0B,MAAM,OAAO,EAAE;AAAA,IAC3D;AACA,UAAM;AAAA,EACR;AACF;AAEO,SAAS,eAAe,QAA0B;AACvD,QAAM,SAAmB,CAAC;AAE1B,MAAI,CAAC,OAAO,WAAW;AACrB,WAAO,KAAK,8FAA8F;AAAA,EAC5G;AAEA,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO,KAAK,qFAAqF;AAAA,EACnG;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/config.ts","../src/types.ts"],"sourcesContent":["import { readFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport dotenv from 'dotenv'\nimport { Config, ConfigSchema } from './types.js'\n\n// Load environment variables\ndotenv.config()\n\nexport function loadConfig(options: Partial<Config> = {}): Config {\n // 1. Start with defaults\n let config: Partial<Config> = {\n apiUrl: 'https://api.lezu.app',\n dest: './src/i18n',\n format: 'json',\n environment: 'production',\n flatten: false,\n namespace: false,\n includeEmpty: false,\n watch: false,\n watchInterval: 5000\n }\n\n // 2. Load from config file (only JSON files to avoid JS module complexity)\n const configFiles = ['.lezurc', '.lezurc.json']\n for (const file of configFiles) {\n const configPath = resolve(process.cwd(), file)\n if (existsSync(configPath)) {\n try {\n // JSON config files only\n const content = readFileSync(configPath, 'utf-8')\n const fileConfig = JSON.parse(content)\n config = { ...config, ...fileConfig }\n console.log(`📁 Loaded config from ${file}`)\n break\n } catch (error) {\n console.warn(`⚠️ Failed to load config from ${file}:`, error)\n }\n }\n }\n\n // 3. Load from environment variables\n if (process.env.LEZU_PROJECT_ID) {\n config.projectId = process.env.LEZU_PROJECT_ID\n }\n if (process.env.LEZU_API_KEY) {\n config.apiKey = process.env.LEZU_API_KEY\n }\n if (process.env.LEZU_API_URL) {\n config.apiUrl = process.env.LEZU_API_URL\n }\n if (process.env.LEZU_DEST) {\n config.dest = process.env.LEZU_DEST\n }\n if (process.env.LEZU_FORMAT) {\n config.format = process.env.LEZU_FORMAT as any\n }\n if (process.env.LEZU_ENVIRONMENT) {\n config.environment = process.env.LEZU_ENVIRONMENT\n }\n\n // 4. Apply CLI options (highest priority)\n config = { ...config, ...options }\n\n // 5. Validate and return\n try {\n return ConfigSchema.parse(config)\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Invalid configuration: ${error.message}`)\n }\n throw error\n }\n}\n\nexport function validateConfig(config: Config): string[] {\n const errors: string[] = []\n\n if (!config.projectId) {\n errors.push('Project ID is required (use --project, LEZU_PROJECT_ID env var, or projectId in config file)')\n }\n\n if (!config.apiKey) {\n errors.push('API Key is required (use --api-key, LEZU_API_KEY env var, or apiKey in config file)')\n }\n\n return errors\n}","import { z } from 'zod'\n\nexport const ConfigSchema = z.object({\n projectId: z.string().optional(),\n apiKey: z.string().optional(),\n apiUrl: z.string().default('https://api.lezu.app'),\n dest: z.string().default('./src/i18n'),\n format: z.enum(['json', 'js', 'ts', 'yaml', 'po']).default('json'),\n languages: z.array(z.string()).optional(),\n release: z.string().optional(),\n environment: z.string().default('production'),\n flatten: z.boolean().default(false),\n namespace: z.boolean().default(false),\n includeEmpty: z.boolean().default(false),\n watch: z.boolean().default(false),\n watchInterval: z.number().default(5000)\n})\n\nexport type Config = z.infer<typeof ConfigSchema>\n\nexport interface TranslationBundle {\n [key: string]: string | TranslationBundle\n}\n\nexport interface ApiResponse {\n translations: Record<string, any>\n meta?: {\n version?: string\n timestamp?: string\n languages?: string[]\n }\n}\n\nexport interface ReleaseResponse {\n releases: Array<{\n id: string\n version: string\n name?: string\n created_at: string\n }>\n}"],"mappings":";AAAA,SAAS,cAAc,kBAAkB;AACzC,SAAS,eAAe;AACxB,OAAO,YAAY;;;ACFnB,SAAS,SAAS;AAEX,IAAM,eAAe,EAAE,OAAO;AAAA,EACnC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,QAAQ,EAAE,OAAO,EAAE,QAAQ,sBAAsB;AAAA,EACjD,MAAM,EAAE,OAAO,EAAE,QAAQ,YAAY;AAAA,EACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ,MAAM,MAAM,QAAQ,IAAI,CAAC,EAAE,QAAQ,MAAM;AAAA,EACjE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAa,EAAE,OAAO,EAAE,QAAQ,YAAY;AAAA,EAC5C,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAClC,WAAW,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACpC,cAAc,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACvC,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAChC,eAAe,EAAE,OAAO,EAAE,QAAQ,GAAI;AACxC,CAAC;;;ADVD,OAAO,OAAO;AAEP,SAAS,WAAW,UAA2B,CAAC,GAAW;AAEhE,MAAI,SAA0B;AAAA,IAC5B,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,IACX,cAAc;AAAA,IACd,OAAO;AAAA,IACP,eAAe;AAAA,EACjB;AAGA,QAAM,cAAc,CAAC,WAAW,cAAc;AAC9C,aAAW,QAAQ,aAAa;AAC9B,UAAM,aAAa,QAAQ,QAAQ,IAAI,GAAG,IAAI;AAC9C,QAAI,WAAW,UAAU,GAAG;AAC1B,UAAI;AAEF,cAAM,UAAU,aAAa,YAAY,OAAO;AAChD,cAAM,aAAa,KAAK,MAAM,OAAO;AACrC,iBAAS,EAAE,GAAG,QAAQ,GAAG,WAAW;AACpC,gBAAQ,IAAI,gCAAyB,IAAI,EAAE;AAC3C;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,KAAK,4CAAkC,IAAI,KAAK,KAAK;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,IAAI,iBAAiB;AAC/B,WAAO,YAAY,QAAQ,IAAI;AAAA,EACjC;AACA,MAAI,QAAQ,IAAI,cAAc;AAC5B,WAAO,SAAS,QAAQ,IAAI;AAAA,EAC9B;AACA,MAAI,QAAQ,IAAI,cAAc;AAC5B,WAAO,SAAS,QAAQ,IAAI;AAAA,EAC9B;AACA,MAAI,QAAQ,IAAI,WAAW;AACzB,WAAO,OAAO,QAAQ,IAAI;AAAA,EAC5B;AACA,MAAI,QAAQ,IAAI,aAAa;AAC3B,WAAO,SAAS,QAAQ,IAAI;AAAA,EAC9B;AACA,MAAI,QAAQ,IAAI,kBAAkB;AAChC,WAAO,cAAc,QAAQ,IAAI;AAAA,EACnC;AAGA,WAAS,EAAE,GAAG,QAAQ,GAAG,QAAQ;AAGjC,MAAI;AACF,WAAO,aAAa,MAAM,MAAM;AAAA,EAClC,SAAS,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,IAAI,MAAM,0BAA0B,MAAM,OAAO,EAAE;AAAA,IAC3D;AACA,UAAM;AAAA,EACR;AACF;AAEO,SAAS,eAAe,QAA0B;AACvD,QAAM,SAAmB,CAAC;AAE1B,MAAI,CAAC,OAAO,WAAW;AACrB,WAAO,KAAK,8FAA8F;AAAA,EAC5G;AAEA,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO,KAAK,qFAAqF;AAAA,EACnG;AAEA,SAAO;AACT;","names":[]}
@@ -1,11 +1,10 @@
1
- #!/usr/bin/env node
2
1
  import {
3
2
  loadConfig,
4
3
  validateConfig
5
- } from "./chunk-VGQICGPH.js";
4
+ } from "./chunk-4YJMQGUZ.js";
6
5
  import {
7
6
  LezuApiClient
8
- } from "./chunk-UN7HQJOX.js";
7
+ } from "./chunk-WZDLWLM3.js";
9
8
 
10
9
  // src/commands/get.ts
11
10
  import { Command } from "commander";
@@ -215,4 +214,4 @@ async function getProject(config, options) {
215
214
  export {
216
215
  createGetCommand
217
216
  };
218
- //# sourceMappingURL=chunk-LYGGTR5I.js.map
217
+ //# sourceMappingURL=chunk-BCNTD3QK.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/get.ts"],"sourcesContent":["import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loadConfig, validateConfig } from '../config.js'\nimport { LezuApiClient } from '../api.js'\nimport type { Config } from '../types.js'\n\nexport function createGetCommand() {\n const command = new Command('get')\n .description('Get information about your project')\n \n // Languages subcommand\n command\n .command('languages')\n .alias('langs')\n .description('List all languages in your project')\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('--include-disabled', 'Include disabled languages')\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 getLanguages(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 // Releases subcommand\n command\n .command('releases')\n .description('List all releases in your project')\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 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 // Project info subcommand\n command\n .command('project')\n .alias('info')\n .description('Get project information and statistics')\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 .option('--stats', 'Include detailed statistics')\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 getProject(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 getLanguages(config: Config, options: any) {\n const spinner = ora('Fetching languages...').start()\n \n try {\n const client = new LezuApiClient(config)\n const response = await client.getLanguages()\n \n spinner.succeed('Languages fetched successfully!')\n \n if (options.json) {\n console.log(JSON.stringify(response, null, 2))\n return\n }\n \n console.log(chalk.green('\\n📚 Project Languages:'))\n \n if (!response.languages || response.languages.length === 0) {\n console.log(chalk.gray(' No languages found'))\n return\n }\n \n response.languages.forEach((lang: any) => {\n const status = lang.enabled ? chalk.green('✓') : chalk.gray('✗')\n const progress = lang.progress ? ` (${lang.progress.percentage}% complete)` : ''\n const source = lang.is_source ? chalk.yellow(' [SOURCE]') : ''\n \n console.log(` ${status} ${lang.language?.name || lang.language_code} (${lang.language_code})${source}${progress}`)\n \n if (lang.progress && lang.progress.total > 0) {\n console.log(chalk.gray(` ${lang.progress.translated}/${lang.progress.total} keys translated`))\n }\n })\n \n console.log(chalk.gray(`\\nTotal: ${response.total} languages`))\n \n } catch (error) {\n spinner.fail('Failed to fetch languages')\n throw error\n }\n}\n\nasync function getReleases(config: Config, options: any) {\n const spinner = ora('Fetching releases...').start()\n \n try {\n const client = new LezuApiClient(config)\n const response = await client.getReleases()\n \n spinner.succeed('Releases fetched successfully!')\n \n if (options.json) {\n console.log(JSON.stringify(response, null, 2))\n return\n }\n \n console.log(chalk.green(`\\n🚀 Releases (${options.environment} environment):`))\n \n if (!response.releases || response.releases.length === 0) {\n console.log(chalk.gray(' No releases found'))\n return\n }\n \n const limit = parseInt(options.limit, 10)\n const releases = response.releases.slice(0, limit)\n \n releases.forEach((release: any, index: number) => {\n const current = release.is_current ? chalk.yellow(' [CURRENT]') : ''\n const date = new Date(release.created_at).toLocaleDateString()\n const reviewedTag = release.reviewed_only ? chalk.blue(' [REVIEWED ONLY]') : ''\n \n console.log(` ${index + 1}. ${release.version}${current}${reviewedTag}`)\n if (release.name && release.name !== release.version) {\n console.log(chalk.gray(` ${release.name}`))\n }\n if (release.description) {\n console.log(chalk.gray(` ${release.description}`))\n }\n console.log(chalk.gray(` Created: ${date}`))\n if (release.created_by_user?.email) {\n console.log(chalk.gray(` By: ${release.created_by_user.email}`))\n }\n console.log() // empty line\n })\n \n if (response.releases.length > limit) {\n console.log(chalk.gray(`... and ${response.releases.length - limit} more releases`))\n console.log(chalk.gray(`Use --limit ${response.releases.length} to see all releases`))\n }\n \n } catch (error) {\n spinner.fail('Failed to fetch releases')\n throw error\n }\n}\n\nasync function getProject(config: Config, options: any) {\n const spinner = ora('Fetching project information...').start()\n \n try {\n const client = new LezuApiClient(config)\n \n let projectData, statsData\n \n if (options.stats) {\n // Fetch both project info and detailed stats\n const [projectResponse, statsResponse] = await Promise.all([\n client.getProject(),\n fetch(`${config.apiUrl}/v1/projects/${config.projectId}/stats`, {\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n }).then(r => r.json())\n ])\n projectData = projectResponse.project\n statsData = statsResponse.stats\n } else {\n const response = await client.getProject()\n projectData = response.project\n }\n \n spinner.succeed('Project information fetched successfully!')\n \n if (options.json) {\n console.log(JSON.stringify({ project: projectData, stats: statsData }, null, 2))\n return\n }\n \n console.log(chalk.green('\\n📋 Project Information:'))\n console.log(` Name: ${projectData.name}`)\n console.log(` Key: ${projectData.key}`)\n console.log(` ID: ${projectData.id}`)\n if (projectData.description) {\n console.log(` Description: ${projectData.description}`)\n }\n console.log(` Source Language: ${projectData.source_language}`)\n console.log(` Created: ${new Date(projectData.created_at).toLocaleDateString()}`)\n \n // Basic stats (always available)\n if (projectData.stats) {\n console.log(chalk.green('\\n📊 Basic Statistics:'))\n console.log(` Translation Keys: ${projectData.stats.keys}`)\n console.log(` Languages: ${projectData.stats.languages}`)\n console.log(` Translations: ${projectData.stats.translations}`)\n console.log(` Completeness: ${projectData.stats.completeness}%`)\n }\n \n // Detailed stats (when --stats is used)\n if (statsData) {\n console.log(chalk.green('\\n📈 Detailed Statistics:'))\n console.log(` Total Keys: ${statsData.overview.totalKeys}`)\n console.log(` Total Languages: ${statsData.overview.totalLanguages}`)\n console.log(` Total Releases: ${statsData.overview.totalReleases}`)\n console.log(` Keys Added Last Month: ${statsData.overview.keysAddedLastMonth}`)\n \n if (statsData.languages && statsData.languages.length > 0) {\n console.log(chalk.green('\\n🌍 Language Progress:'))\n statsData.languages.forEach((lang: any) => {\n const percentage = lang.percentage\n const bar = '█'.repeat(Math.floor(percentage / 5)) + '░'.repeat(20 - Math.floor(percentage / 5))\n console.log(` ${lang.language_code}: [${bar}] ${percentage}%`)\n console.log(chalk.gray(` ${lang.translated}/${lang.total} translated, ${lang.reviewed} reviewed, ${lang.missing} missing`))\n })\n }\n \n if (statsData.recentReleases && statsData.recentReleases.length > 0) {\n console.log(chalk.green('\\n🚀 Recent Releases:'))\n statsData.recentReleases.forEach((release: any) => {\n const date = new Date(release.created_at).toLocaleDateString()\n console.log(` • ${release.version} (${date})`)\n })\n }\n }\n \n // Show environments\n if (projectData.environments && projectData.environments.length > 0) {\n console.log(chalk.green('\\n🏗️ Environments:'))\n projectData.environments.forEach((env: any) => {\n const current = env.current_release_id ? ` (current: ${env.current_release_id.substring(0, 8)}...)` : ''\n console.log(` • ${env.name}${current}`)\n })\n }\n \n } catch (error) {\n spinner.fail('Failed to fetch project information')\n throw error\n }\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/get.ts"],"sourcesContent":["import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loadConfig, validateConfig } from '../config.js'\nimport { LezuApiClient } from '../api.js'\nimport type { Config } from '../types.js'\n\nexport function createGetCommand() {\n const command = new Command('get')\n .description('Get information about your project')\n \n // Languages subcommand\n command\n .command('languages')\n .alias('langs')\n .description('List all languages in your project')\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('--include-disabled', 'Include disabled languages')\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 getLanguages(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 // Releases subcommand\n command\n .command('releases')\n .description('List all releases in your project')\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 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 // Project info subcommand\n command\n .command('project')\n .alias('info')\n .description('Get project information and statistics')\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 .option('--stats', 'Include detailed statistics')\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 getProject(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 getLanguages(config: Config, options: any) {\n const spinner = ora('Fetching languages...').start()\n \n try {\n const client = new LezuApiClient(config)\n const response = await client.getLanguages()\n \n spinner.succeed('Languages fetched successfully!')\n \n if (options.json) {\n console.log(JSON.stringify(response, null, 2))\n return\n }\n \n console.log(chalk.green('\\n📚 Project Languages:'))\n \n if (!response.languages || response.languages.length === 0) {\n console.log(chalk.gray(' No languages found'))\n return\n }\n \n response.languages.forEach((lang: any) => {\n const status = lang.enabled ? chalk.green('✓') : chalk.gray('✗')\n const progress = lang.progress ? ` (${lang.progress.percentage}% complete)` : ''\n const source = lang.is_source ? chalk.yellow(' [SOURCE]') : ''\n \n console.log(` ${status} ${lang.language?.name || lang.language_code} (${lang.language_code})${source}${progress}`)\n \n if (lang.progress && lang.progress.total > 0) {\n console.log(chalk.gray(` ${lang.progress.translated}/${lang.progress.total} keys translated`))\n }\n })\n \n console.log(chalk.gray(`\\nTotal: ${response.total} languages`))\n \n } catch (error) {\n spinner.fail('Failed to fetch languages')\n throw error\n }\n}\n\nasync function getReleases(config: Config, options: any) {\n const spinner = ora('Fetching releases...').start()\n \n try {\n const client = new LezuApiClient(config)\n const response = await client.getReleases()\n \n spinner.succeed('Releases fetched successfully!')\n \n if (options.json) {\n console.log(JSON.stringify(response, null, 2))\n return\n }\n \n console.log(chalk.green(`\\n🚀 Releases (${options.environment} environment):`))\n \n if (!response.releases || response.releases.length === 0) {\n console.log(chalk.gray(' No releases found'))\n return\n }\n \n const limit = parseInt(options.limit, 10)\n const releases = response.releases.slice(0, limit)\n \n releases.forEach((release: any, index: number) => {\n const current = release.is_current ? chalk.yellow(' [CURRENT]') : ''\n const date = new Date(release.created_at).toLocaleDateString()\n const reviewedTag = release.reviewed_only ? chalk.blue(' [REVIEWED ONLY]') : ''\n \n console.log(` ${index + 1}. ${release.version}${current}${reviewedTag}`)\n if (release.name && release.name !== release.version) {\n console.log(chalk.gray(` ${release.name}`))\n }\n if (release.description) {\n console.log(chalk.gray(` ${release.description}`))\n }\n console.log(chalk.gray(` Created: ${date}`))\n if (release.created_by_user?.email) {\n console.log(chalk.gray(` By: ${release.created_by_user.email}`))\n }\n console.log() // empty line\n })\n \n if (response.releases.length > limit) {\n console.log(chalk.gray(`... and ${response.releases.length - limit} more releases`))\n console.log(chalk.gray(`Use --limit ${response.releases.length} to see all releases`))\n }\n \n } catch (error) {\n spinner.fail('Failed to fetch releases')\n throw error\n }\n}\n\nasync function getProject(config: Config, options: any) {\n const spinner = ora('Fetching project information...').start()\n \n try {\n const client = new LezuApiClient(config)\n \n let projectData, statsData\n \n if (options.stats) {\n // Fetch both project info and detailed stats\n const [projectResponse, statsResponse] = await Promise.all([\n client.getProject(),\n fetch(`${config.apiUrl}/v1/projects/${config.projectId}/stats`, {\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n }).then(r => r.json())\n ])\n projectData = projectResponse.project\n statsData = statsResponse.stats\n } else {\n const response = await client.getProject()\n projectData = response.project\n }\n \n spinner.succeed('Project information fetched successfully!')\n \n if (options.json) {\n console.log(JSON.stringify({ project: projectData, stats: statsData }, null, 2))\n return\n }\n \n console.log(chalk.green('\\n📋 Project Information:'))\n console.log(` Name: ${projectData.name}`)\n console.log(` Key: ${projectData.key}`)\n console.log(` ID: ${projectData.id}`)\n if (projectData.description) {\n console.log(` Description: ${projectData.description}`)\n }\n console.log(` Source Language: ${projectData.source_language}`)\n console.log(` Created: ${new Date(projectData.created_at).toLocaleDateString()}`)\n \n // Basic stats (always available)\n if (projectData.stats) {\n console.log(chalk.green('\\n📊 Basic Statistics:'))\n console.log(` Translation Keys: ${projectData.stats.keys}`)\n console.log(` Languages: ${projectData.stats.languages}`)\n console.log(` Translations: ${projectData.stats.translations}`)\n console.log(` Completeness: ${projectData.stats.completeness}%`)\n }\n \n // Detailed stats (when --stats is used)\n if (statsData) {\n console.log(chalk.green('\\n📈 Detailed Statistics:'))\n console.log(` Total Keys: ${statsData.overview.totalKeys}`)\n console.log(` Total Languages: ${statsData.overview.totalLanguages}`)\n console.log(` Total Releases: ${statsData.overview.totalReleases}`)\n console.log(` Keys Added Last Month: ${statsData.overview.keysAddedLastMonth}`)\n \n if (statsData.languages && statsData.languages.length > 0) {\n console.log(chalk.green('\\n🌍 Language Progress:'))\n statsData.languages.forEach((lang: any) => {\n const percentage = lang.percentage\n const bar = '█'.repeat(Math.floor(percentage / 5)) + '░'.repeat(20 - Math.floor(percentage / 5))\n console.log(` ${lang.language_code}: [${bar}] ${percentage}%`)\n console.log(chalk.gray(` ${lang.translated}/${lang.total} translated, ${lang.reviewed} reviewed, ${lang.missing} missing`))\n })\n }\n \n if (statsData.recentReleases && statsData.recentReleases.length > 0) {\n console.log(chalk.green('\\n🚀 Recent Releases:'))\n statsData.recentReleases.forEach((release: any) => {\n const date = new Date(release.created_at).toLocaleDateString()\n console.log(` • ${release.version} (${date})`)\n })\n }\n }\n \n // Show environments\n if (projectData.environments && projectData.environments.length > 0) {\n console.log(chalk.green('\\n🏗️ Environments:'))\n projectData.environments.forEach((env: any) => {\n const current = env.current_release_id ? ` (current: ${env.current_release_id.substring(0, 8)}...)` : ''\n console.log(` • ${env.name}${current}`)\n })\n }\n \n } catch (error) {\n spinner.fail('Failed to fetch project information')\n throw error\n }\n}"],"mappings":"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","names":[]}
@@ -1,11 +1,10 @@
1
- #!/usr/bin/env node
2
1
  import {
3
2
  loadConfig,
4
3
  validateConfig
5
- } from "./chunk-VGQICGPH.js";
4
+ } from "./chunk-4YJMQGUZ.js";
6
5
  import {
7
6
  LezuApiClient
8
- } from "./chunk-UN7HQJOX.js";
7
+ } from "./chunk-WZDLWLM3.js";
9
8
 
10
9
  // src/commands/load.ts
11
10
  import { Command } from "commander";
@@ -246,4 +245,4 @@ export {
246
245
  createLoadCommand,
247
246
  syncTranslations
248
247
  };
249
- //# sourceMappingURL=chunk-2MDUFSO7.js.map
248
+ //# sourceMappingURL=chunk-G75WRDSJ.js.map
@@ -1 +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 { 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 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 for updates...'))\n await syncTranslations(config)\n }, config.watchInterval)\n }\n } catch (error) {\n console.error(chalk.red('\\n❌ Error:'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n\n return command\n}\n\nexport async function syncTranslations(config: Config) {\n const spinner = ora('Connecting to Lezu API...').start()\n\n try {\n // Create API client\n const client = new LezuApiClient(config)\n\n // If no release specified and not using latest, try to get latest release\n if (!config.release && config.environment) {\n spinner.text = 'Fetching latest release...'\n const latestRelease = await client.getLatestRelease()\n if (latestRelease) {\n config.release = latestRelease\n spinner.succeed(`Using latest release: ${latestRelease}`)\n spinner.start('Fetching translations...')\n } else {\n spinner.info('No releases found, fetching current translations...')\n spinner.start()\n }\n }\n\n // Fetch translations\n spinner.text = 'Fetching translations...'\n const response = await client.getTranslations()\n\n if (!response.translations || Object.keys(response.translations).length === 0) {\n spinner.fail('No translations found')\n return\n }\n\n spinner.succeed(`Fetched translations for ${Object.keys(response.translations).length} languages`)\n\n // Write translations\n const writer = new TranslationWriter(config)\n writer.write(response.translations)\n\n console.log(chalk.green('\\n✨ 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
+ {"version":3,"sources":["../src/commands/load.ts","../src/writer.ts"],"sourcesContent":["import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loadConfig, validateConfig } from '../config.js'\nimport { LezuApiClient } from '../api.js'\nimport { TranslationWriter } from '../writer.js'\nimport type { Config } from '../types.js'\n\nexport function createLoadCommand() {\n const command = new Command('load')\n .description('Download translation files from Lezu')\n .option('-p, --project <id>', 'Project ID')\n .option('-k, --api-key <key>', 'API key')\n .option('-d, --dest <path>', 'Destination folder', './src/i18n')\n .option('-f, --format <format>', 'Output format (json, js, ts, yaml, po)', 'json')\n .option('-l, --languages <languages>', 'Comma-separated list of languages to download')\n .option('-r, --release <id>', 'Specific release ID')\n .option('-e, --environment <env>', 'Environment', 'production')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--flatten', 'Flatten nested keys')\n .option('--namespace', 'Use namespace folder structure')\n .option('--include-empty', 'Include empty translations')\n .option('-w, --watch', 'Watch for changes')\n .option('--watch-interval <ms>', 'Watch interval in milliseconds', '5000')\n .action(async (options) => {\n try {\n // Parse languages from comma-separated string\n if (options.languages) {\n options.languages = options.languages.split(',').map((l: string) => l.trim())\n }\n\n // Convert watch interval to number\n if (options.watchInterval) {\n options.watchInterval = parseInt(options.watchInterval, 10)\n }\n\n // Load configuration\n const config = loadConfig(options)\n\n // Validate configuration\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` • ${error}`)))\n process.exit(1)\n }\n\n // Run the sync\n await syncTranslations(config)\n\n // Watch mode\n if (config.watch) {\n console.log(chalk.cyan(`\\n👁 Watching 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 for updates...'))\n await syncTranslations(config)\n }, config.watchInterval)\n }\n } catch (error) {\n console.error(chalk.red('\\n❌ Error:'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n\n return command\n}\n\nexport async function syncTranslations(config: Config) {\n const spinner = ora('Connecting to Lezu API...').start()\n\n try {\n // Create API client\n const client = new LezuApiClient(config)\n\n // If no release specified and not using latest, try to get latest release\n if (!config.release && config.environment) {\n spinner.text = 'Fetching latest release...'\n const latestRelease = await client.getLatestRelease()\n if (latestRelease) {\n config.release = latestRelease\n spinner.succeed(`Using latest release: ${latestRelease}`)\n spinner.start('Fetching translations...')\n } else {\n spinner.info('No releases found, fetching current translations...')\n spinner.start()\n }\n }\n\n // Fetch translations\n spinner.text = 'Fetching translations...'\n const response = await client.getTranslations()\n\n if (!response.translations || Object.keys(response.translations).length === 0) {\n spinner.fail('No translations found')\n return\n }\n\n spinner.succeed(`Fetched translations for ${Object.keys(response.translations).length} languages`)\n\n // Write translations\n const writer = new TranslationWriter(config)\n writer.write(response.translations)\n\n console.log(chalk.green('\\n✨ 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,5 +1,3 @@
1
- #!/usr/bin/env node
2
-
3
1
  // src/api.ts
4
2
  import fetch from "node-fetch";
5
3
  var LezuApiClient = class {
@@ -108,4 +106,4 @@ ${error}`);
108
106
  export {
109
107
  LezuApiClient
110
108
  };
111
- //# sourceMappingURL=chunk-UN7HQJOX.js.map
109
+ //# sourceMappingURL=chunk-WZDLWLM3.js.map
@@ -1 +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 private async request<T>(endpoint: string, options: any = {}): Promise<T> {\n const url = `${this.config.apiUrl}${endpoint}`\n \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 const error = await response.text()\n throw new Error(`API request failed: ${response.status} ${response.statusText}\\n${error}`)\n }\n\n return response.json() as Promise<T>\n }\n\n async getTranslations(): Promise<ApiResponse> {\n let endpoint = `/v1/translations/bundle?environment=${this.config.environment}`\n \n if (this.config.release) {\n endpoint = `/v1/releases/${this.config.release}/bundle`\n }\n\n // Add language filter if specified\n if (this.config.languages && this.config.languages.length > 0) {\n const params = new URLSearchParams()\n this.config.languages.forEach(lang => params.append('languages', lang))\n endpoint += `?${params.toString()}`\n }\n\n const response = await this.request<any>(endpoint)\n \n // Transform the response to match our expected format\n return {\n translations: response.translations || response,\n meta: {\n version: response.version,\n timestamp: response.timestamp || new Date().toISOString(),\n languages: response.languages || Object.keys(response.translations || response)\n }\n }\n }\n\n async getReleases(): Promise<ReleaseResponse> {\n return this.request<ReleaseResponse>(\n `/v1/releases?environment=${this.config.environment}`\n )\n }\n\n async getLatestRelease(): Promise<string | null> {\n try {\n const releases = await this.getReleases()\n if (releases.releases && releases.releases.length > 0) {\n // Releases are ordered by created_at desc, so first one is latest\n return releases.releases[0].id\n }\n return null\n } catch (error) {\n console.warn('Failed to fetch latest release:', error)\n return null\n }\n }\n\n async getLanguages(): Promise<any> {\n return this.request<any>(`/v1/languages`)\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
+ {"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 private async request<T>(endpoint: string, options: any = {}): Promise<T> {\n const url = `${this.config.apiUrl}${endpoint}`\n \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 const error = await response.text()\n throw new Error(`API request failed: ${response.status} ${response.statusText}\\n${error}`)\n }\n\n return response.json() as Promise<T>\n }\n\n async getTranslations(): Promise<ApiResponse> {\n let endpoint = `/v1/translations/bundle?environment=${this.config.environment}`\n \n if (this.config.release) {\n endpoint = `/v1/releases/${this.config.release}/bundle`\n }\n\n // Add language filter if specified\n if (this.config.languages && this.config.languages.length > 0) {\n const params = new URLSearchParams()\n this.config.languages.forEach(lang => params.append('languages', lang))\n endpoint += `?${params.toString()}`\n }\n\n const response = await this.request<any>(endpoint)\n \n // Transform the response to match our expected format\n return {\n translations: response.translations || response,\n meta: {\n version: response.version,\n timestamp: response.timestamp || new Date().toISOString(),\n languages: response.languages || Object.keys(response.translations || response)\n }\n }\n }\n\n async getReleases(): Promise<ReleaseResponse> {\n return this.request<ReleaseResponse>(\n `/v1/releases?environment=${this.config.environment}`\n )\n }\n\n async getLatestRelease(): Promise<string | null> {\n try {\n const releases = await this.getReleases()\n if (releases.releases && releases.releases.length > 0) {\n // Releases are ordered by created_at desc, so first one is latest\n return releases.releases[0].id\n }\n return null\n } catch (error) {\n console.warn('Failed to fetch latest release:', error)\n return null\n }\n }\n\n async getLanguages(): Promise<any> {\n return this.request<any>(`/v1/languages`)\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":[]}
@@ -0,0 +1,9 @@
1
+ import {
2
+ createGetCommand
3
+ } from "./chunk-BCNTD3QK.js";
4
+ import "./chunk-4YJMQGUZ.js";
5
+ import "./chunk-WZDLWLM3.js";
6
+ export {
7
+ createGetCommand
8
+ };
9
+ //# sourceMappingURL=get-R4XXTDRV.js.map
package/dist/index.d.ts CHANGED
@@ -1 +1,2 @@
1
- #!/usr/bin/env node
1
+
2
+ export { }
package/dist/index.js CHANGED
@@ -1,18 +1,16 @@
1
- #!/usr/bin/env node
2
- #!/usr/bin/env node
3
1
  import {
4
2
  createLoadCommand
5
- } from "./chunk-2MDUFSO7.js";
3
+ } from "./chunk-G75WRDSJ.js";
6
4
  import {
7
5
  createGetCommand
8
- } from "./chunk-LYGGTR5I.js";
6
+ } from "./chunk-BCNTD3QK.js";
9
7
  import {
10
8
  loadConfig,
11
9
  validateConfig
12
- } from "./chunk-VGQICGPH.js";
10
+ } from "./chunk-4YJMQGUZ.js";
13
11
  import {
14
12
  LezuApiClient
15
- } from "./chunk-UN7HQJOX.js";
13
+ } from "./chunk-WZDLWLM3.js";
16
14
 
17
15
  // src/index.ts
18
16
  import { program } from "commander";
@@ -137,7 +135,7 @@ function createReleaseCommand() {
137
135
  errors.forEach((error) => console.error(chalk2.red(` \u2022 ${error}`)));
138
136
  process.exit(1);
139
137
  }
140
- const { getReleases } = await import("./get-EDBOC5W6.js");
138
+ const { getReleases } = await import("./get-R4XXTDRV.js");
141
139
  await getReleases(config, options);
142
140
  } catch (error) {
143
141
  console.error(chalk2.red("\n\u274C Error:"), error instanceof Error ? error.message : error);
@@ -312,7 +310,7 @@ async function interactiveMode(initialConfig) {
312
310
  }
313
311
  }
314
312
  async function configureLoadCommand(rl, config) {
315
- const { syncTranslations } = await import("./load-3MKWVORU.js");
313
+ const { syncTranslations } = await import("./load-5EN5NPEL.js");
316
314
  console.log(chalk3.bold("\nLoad Configuration:"));
317
315
  const dest = await rl.question(
318
316
  chalk3.gray(`Destination folder (${config.dest || "./src/i18n"}): `)
@@ -344,7 +342,7 @@ async function configureLoadCommand(rl, config) {
344
342
  languages: languages ? languages.split(",").map((l) => l.trim()) : void 0
345
343
  };
346
344
  console.log(chalk3.green("\n\u{1F680} Starting translation sync..."));
347
- const { syncTranslations: sync } = await import("./load-3MKWVORU.js");
345
+ const { syncTranslations: sync } = await import("./load-5EN5NPEL.js");
348
346
  await sync(finalConfig);
349
347
  }
350
348
  async function configureAddCommand(rl, config) {
@@ -377,7 +375,7 @@ async function configureAddCommand(rl, config) {
377
375
  }
378
376
  }
379
377
  console.log(chalk3.green("\n\u{1F680} Adding translation key..."));
380
- const { LezuApiClient: LezuApiClient2 } = await import("./api-CS5JMU72.js");
378
+ const { LezuApiClient: LezuApiClient2 } = await import("./api-PFXU7GZT.js");
381
379
  const client = new LezuApiClient2(config);
382
380
  try {
383
381
  await client.addTranslationKey(key, translations);
@@ -392,7 +390,7 @@ async function configureGetCommand(rl, config) {
392
390
  console.log("2) Languages");
393
391
  console.log("3) Releases");
394
392
  const choice = await rl.question(chalk3.gray("What to get (1-3): ")) || "1";
395
- const { LezuApiClient: LezuApiClient2 } = await import("./api-CS5JMU72.js");
393
+ const { LezuApiClient: LezuApiClient2 } = await import("./api-PFXU7GZT.js");
396
394
  const client = new LezuApiClient2(config);
397
395
  try {
398
396
  switch (choice) {
@@ -435,7 +433,7 @@ async function configureReleaseCommand(rl, config) {
435
433
  const description = await rl.question(chalk3.gray("Description (optional): "));
436
434
  const setCurrent = await rl.question(chalk3.gray("Set as current release? (y/n): "));
437
435
  console.log(chalk3.green("\n\u{1F680} Creating release..."));
438
- const { LezuApiClient: LezuApiClient2 } = await import("./api-CS5JMU72.js");
436
+ const { LezuApiClient: LezuApiClient2 } = await import("./api-PFXU7GZT.js");
439
437
  const client = new LezuApiClient2(config);
440
438
  try {
441
439
  const release = await client.createRelease({
@@ -459,7 +457,7 @@ async function configureReleaseCommand(rl, config) {
459
457
  console.error(chalk3.red("\u274C Failed to create release:"), error);
460
458
  }
461
459
  } else {
462
- const { LezuApiClient: LezuApiClient2 } = await import("./api-CS5JMU72.js");
460
+ const { LezuApiClient: LezuApiClient2 } = await import("./api-PFXU7GZT.js");
463
461
  const client = new LezuApiClient2(config);
464
462
  try {
465
463
  const releases = await client.getReleases();
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":["#!/usr/bin/env node\n\nimport { 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.1'\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// Handle case when no command is provided - run interactive mode\nprogram.action(async () => {\n console.log(chalk.blue('👋 Welcome to Lezu CLI!'))\n console.log()\n \n try {\n // Load initial config from file/env for defaults\n const initialConfig = loadConfig({})\n await interactiveMode(initialConfig)\n } catch (error) {\n console.error(chalk.red('\\n❌ Error:'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n})\n\n// Show help when no arguments provided\nif (process.argv.length <= 2) {\n // Run interactive mode\n program.action(() => {})\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✨ 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🤖 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💡 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✨ 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💡 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 * as readline from 'readline'\nimport { stdin as input, stdout as output } from 'process'\nimport { promisify } from 'util'\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 const rl = readline.createInterface({ input, output })\n const question = promisify(rl.question).bind(rl)\n\n console.log(chalk.cyan('🌍 Lezu CLI - Interactive Mode\\n'))\n console.log(chalk.gray('What would you like to do?\\n'))\n\n try {\n // Show available commands\n console.log('Available commands:')\n console.log(chalk.green('1) load') + chalk.gray(' - Download translation files'))\n console.log(chalk.green('2) add') + chalk.gray(' - Add a new translation key'))\n console.log(chalk.green('3) get') + chalk.gray(' - Get project information'))\n console.log(chalk.green('4) release') + chalk.gray(' - Manage releases'))\n console.log()\n\n const commandChoice = await question(chalk.bold('Choose a command (1-4): '))\n \n let command: string\n switch (commandChoice) {\n case '1':\n command = 'load'\n break\n case '2':\n command = 'add'\n break\n case '3':\n command = 'get'\n break\n case '4':\n command = 'release'\n break\n default:\n console.log(chalk.yellow('Invalid choice, defaulting to load'))\n command = 'load'\n }\n\n console.log(chalk.cyan(`\\n📋 Setting up ${command} command...\\n`))\n\n // Get basic configuration\n const projectId = await rl.question(\n chalk.bold('Project ID') + \n (initialConfig.projectId ? chalk.gray(` (${initialConfig.projectId}): `) : ': ')\n ) || initialConfig.projectId\n\n if (!projectId) {\n throw new Error('Project ID is required')\n }\n\n const apiKey = await rl.question(\n chalk.bold('API Key') + \n (initialConfig.apiKey ? chalk.gray(' (current key will be used): ') : ': ')\n ) || initialConfig.apiKey\n\n if (!apiKey) {\n throw new Error('API Key is required')\n }\n\n const config = loadConfig({ projectId, apiKey, ...initialConfig })\n\n // Handle specific command configurations\n switch (command) {\n case 'load':\n await configureLoadCommand(rl, config)\n break\n case 'add':\n await configureAddCommand(rl, config)\n break\n case 'get':\n await configureGetCommand(rl, config)\n break\n case 'release':\n await configureReleaseCommand(rl, config)\n break\n }\n\n } catch (error) {\n throw error\n } finally {\n rl.close()\n }\n}\n\nasync function configureLoadCommand(rl: any, config: Config): Promise<void> {\n const { syncTranslations } = await import('./commands/load.js')\n \n console.log(chalk.bold('\\nLoad Configuration:'))\n \n // Destination\n const dest = await rl.question(\n chalk.gray(`Destination folder (${config.dest || './src/i18n'}): `)\n ) || config.dest || './src/i18n'\n\n // Format\n console.log(chalk.gray('\\nOutput format:'))\n console.log('1) JSON (default)')\n console.log('2) JavaScript (ES modules)')\n console.log('3) TypeScript')\n console.log('4) YAML')\n \n const formatChoice = await rl.question(chalk.gray('Choice (1-4): ')) || '1'\n const formatMap: Record<string, 'json' | 'js' | 'ts' | 'yaml'> = {\n '1': 'json',\n '2': 'js',\n '3': 'ts',\n '4': 'yaml'\n }\n const format = formatMap[formatChoice] || 'json'\n\n // Environment\n const environment = await rl.question(\n chalk.gray(`Environment (${config.environment || 'production'}): `)\n ) || config.environment || 'production'\n\n // Languages\n const languages = await rl.question(\n chalk.gray('Specific languages (comma-separated, leave empty for all): ')\n )\n\n const finalConfig = {\n ...config,\n dest,\n format,\n environment,\n languages: languages ? languages.split(',').map(l => l.trim()) : undefined\n }\n\n console.log(chalk.green('\\n🚀 Starting translation sync...'))\n \n // Import and execute the sync\n const { syncTranslations: sync } = await import('./commands/load.js')\n await sync(finalConfig)\n}\n\nasync function configureAddCommand(rl: any, config: Config): Promise<void> {\n console.log(chalk.bold('\\nAdd Translation Key:'))\n \n const key = await rl.question(chalk.bold('Translation key (e.g., \"common.save\"): '))\n if (!key) {\n throw new Error('Translation key is required')\n }\n\n const description = await rl.question(chalk.gray('Description (optional): '))\n\n console.log(chalk.gray('\\nDo you want to:'))\n console.log('1) Provide translations manually')\n console.log('2) Auto-translate from source language')\n \n const choice = await rl.question(chalk.gray('Choice (1-2): ')) || '1'\n\n let translations: Record<string, string> = {}\n let auto = false\n\n if (choice === '2') {\n auto = true\n const sourceValue = await rl.question(chalk.bold('Source language value: '))\n if (sourceValue) {\n // We'll determine the source language from the project\n translations.en = sourceValue // Default fallback\n }\n } else {\n console.log(chalk.gray('\\nEnter translations (press Enter to skip):'))\n const languages = ['en', 'es', 'fr', 'de', 'nl']\n \n for (const lang of languages) {\n const value = await rl.question(chalk.gray(`${lang}: `))\n if (value) {\n translations[lang] = value\n }\n }\n }\n\n console.log(chalk.green('\\n🚀 Adding translation key...'))\n\n // Import and execute the add command\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n \n try {\n await client.addTranslationKey(key, translations)\n console.log(chalk.green('✅ Translation key added successfully!'))\n } catch (error) {\n console.error(chalk.red('❌ Failed to add translation key:'), error)\n }\n}\n\nasync function configureGetCommand(rl: any, config: Config): Promise<void> {\n console.log(chalk.bold('\\nGet Information:'))\n console.log('1) Project info')\n console.log('2) Languages')\n console.log('3) Releases')\n \n const choice = await rl.question(chalk.gray('What to get (1-3): ')) || '1'\n \n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n\n try {\n switch (choice) {\n case '1':\n const project = await client.getProject()\n console.log(chalk.green('\\n📋 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 '2':\n const languages = await client.getLanguages()\n console.log(chalk.green('\\n🌍 Languages:'))\n languages.languages?.forEach((lang: any) => {\n const status = lang.enabled ? '✅' : '❌'\n console.log(` ${status} ${lang.language?.name || lang.language_code}`)\n })\n break\n \n case '3':\n const releases = await client.getReleases()\n console.log(chalk.green('\\n🚀 Recent Releases:'))\n releases.releases?.slice(0, 5).forEach((release: any) => {\n const current = release.is_current ? ' [CURRENT]' : ''\n console.log(` • ${release.version}${current}`)\n })\n break\n }\n } catch (error) {\n console.error(chalk.red('❌ Failed to get information:'), error)\n }\n}\n\nasync function configureReleaseCommand(rl: any, config: Config): Promise<void> {\n console.log(chalk.bold('\\nRelease Management:'))\n console.log('1) Create new release')\n console.log('2) List releases')\n \n const choice = await rl.question(chalk.gray('Choice (1-2): ')) || '1'\n\n if (choice === '1') {\n const version = await rl.question(chalk.bold('Version (e.g., \"1.0.0\"): '))\n const name = await rl.question(chalk.gray('Name (optional): '))\n const description = await rl.question(chalk.gray('Description (optional): '))\n \n const setCurrent = await rl.question(chalk.gray('Set as current release? (y/n): '))\n\n console.log(chalk.green('\\n🚀 Creating release...'))\n\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n \n try {\n const release = await client.createRelease({\n version,\n name,\n description,\n reviewedOnly: false,\n })\n \n if (setCurrent?.toLowerCase() === 'y') {\n // Set as current\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 console.log(chalk.green('✅ Release created successfully!'))\n console.log(` ID: ${release.release.id}`)\n console.log(` Version: ${release.release.version}`)\n } catch (error) {\n console.error(chalk.red('❌ Failed to create release:'), error)\n }\n \n } else {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n \n try {\n const releases = await client.getReleases()\n console.log(chalk.green('\\n🚀 Releases:'))\n releases.releases?.forEach((release: any, index: number) => {\n const current = release.is_current ? ' [CURRENT]' : ''\n console.log(` ${index + 1}. ${release.version}${current}`)\n })\n } catch (error) {\n console.error(chalk.red('❌ Failed to list releases:'), error)\n }\n }\n}"],"mappings":"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","names":["chalk","Command","chalk","ora","Command","chalk","ora","chalk","chalk","LezuApiClient","version","chalk"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/commands/release.ts","../src/interactive.ts"],"sourcesContent":["import { program } from 'commander'\nimport chalk from 'chalk'\nimport { createLoadCommand } from './commands/load.js'\nimport { createAddCommand } from './commands/add.js'\nimport { createGetCommand } from './commands/get.js'\nimport { createReleaseCommand } from './commands/release.js'\nimport { interactiveMode } from './interactive.js'\nimport { loadConfig } from './config.js'\n\n// Version from package.json\nconst version = '0.0.1'\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// Handle case when no command is provided - run interactive mode\nprogram.action(async () => {\n console.log(chalk.blue('👋 Welcome to Lezu CLI!'))\n console.log()\n \n try {\n // Load initial config from file/env for defaults\n const initialConfig = loadConfig({})\n await interactiveMode(initialConfig)\n } catch (error) {\n console.error(chalk.red('\\n❌ Error:'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n})\n\n// Show help when no arguments provided\nif (process.argv.length <= 2) {\n // Run interactive mode\n program.action(() => {})\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✨ 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🤖 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💡 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✨ 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💡 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 * as readline from 'readline'\nimport { stdin as input, stdout as output } from 'process'\nimport { promisify } from 'util'\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 const rl = readline.createInterface({ input, output })\n const question = promisify(rl.question).bind(rl)\n\n console.log(chalk.cyan('🌍 Lezu CLI - Interactive Mode\\n'))\n console.log(chalk.gray('What would you like to do?\\n'))\n\n try {\n // Show available commands\n console.log('Available commands:')\n console.log(chalk.green('1) load') + chalk.gray(' - Download translation files'))\n console.log(chalk.green('2) add') + chalk.gray(' - Add a new translation key'))\n console.log(chalk.green('3) get') + chalk.gray(' - Get project information'))\n console.log(chalk.green('4) release') + chalk.gray(' - Manage releases'))\n console.log()\n\n const commandChoice = await question(chalk.bold('Choose a command (1-4): '))\n \n let command: string\n switch (commandChoice) {\n case '1':\n command = 'load'\n break\n case '2':\n command = 'add'\n break\n case '3':\n command = 'get'\n break\n case '4':\n command = 'release'\n break\n default:\n console.log(chalk.yellow('Invalid choice, defaulting to load'))\n command = 'load'\n }\n\n console.log(chalk.cyan(`\\n📋 Setting up ${command} command...\\n`))\n\n // Get basic configuration\n const projectId = await rl.question(\n chalk.bold('Project ID') + \n (initialConfig.projectId ? chalk.gray(` (${initialConfig.projectId}): `) : ': ')\n ) || initialConfig.projectId\n\n if (!projectId) {\n throw new Error('Project ID is required')\n }\n\n const apiKey = await rl.question(\n chalk.bold('API Key') + \n (initialConfig.apiKey ? chalk.gray(' (current key will be used): ') : ': ')\n ) || initialConfig.apiKey\n\n if (!apiKey) {\n throw new Error('API Key is required')\n }\n\n const config = loadConfig({ projectId, apiKey, ...initialConfig })\n\n // Handle specific command configurations\n switch (command) {\n case 'load':\n await configureLoadCommand(rl, config)\n break\n case 'add':\n await configureAddCommand(rl, config)\n break\n case 'get':\n await configureGetCommand(rl, config)\n break\n case 'release':\n await configureReleaseCommand(rl, config)\n break\n }\n\n } catch (error) {\n throw error\n } finally {\n rl.close()\n }\n}\n\nasync function configureLoadCommand(rl: any, config: Config): Promise<void> {\n const { syncTranslations } = await import('./commands/load.js')\n \n console.log(chalk.bold('\\nLoad Configuration:'))\n \n // Destination\n const dest = await rl.question(\n chalk.gray(`Destination folder (${config.dest || './src/i18n'}): `)\n ) || config.dest || './src/i18n'\n\n // Format\n console.log(chalk.gray('\\nOutput format:'))\n console.log('1) JSON (default)')\n console.log('2) JavaScript (ES modules)')\n console.log('3) TypeScript')\n console.log('4) YAML')\n \n const formatChoice = await rl.question(chalk.gray('Choice (1-4): ')) || '1'\n const formatMap: Record<string, 'json' | 'js' | 'ts' | 'yaml'> = {\n '1': 'json',\n '2': 'js',\n '3': 'ts',\n '4': 'yaml'\n }\n const format = formatMap[formatChoice] || 'json'\n\n // Environment\n const environment = await rl.question(\n chalk.gray(`Environment (${config.environment || 'production'}): `)\n ) || config.environment || 'production'\n\n // Languages\n const languages = await rl.question(\n chalk.gray('Specific languages (comma-separated, leave empty for all): ')\n )\n\n const finalConfig = {\n ...config,\n dest,\n format,\n environment,\n languages: languages ? languages.split(',').map(l => l.trim()) : undefined\n }\n\n console.log(chalk.green('\\n🚀 Starting translation sync...'))\n \n // Import and execute the sync\n const { syncTranslations: sync } = await import('./commands/load.js')\n await sync(finalConfig)\n}\n\nasync function configureAddCommand(rl: any, config: Config): Promise<void> {\n console.log(chalk.bold('\\nAdd Translation Key:'))\n \n const key = await rl.question(chalk.bold('Translation key (e.g., \"common.save\"): '))\n if (!key) {\n throw new Error('Translation key is required')\n }\n\n const description = await rl.question(chalk.gray('Description (optional): '))\n\n console.log(chalk.gray('\\nDo you want to:'))\n console.log('1) Provide translations manually')\n console.log('2) Auto-translate from source language')\n \n const choice = await rl.question(chalk.gray('Choice (1-2): ')) || '1'\n\n let translations: Record<string, string> = {}\n let auto = false\n\n if (choice === '2') {\n auto = true\n const sourceValue = await rl.question(chalk.bold('Source language value: '))\n if (sourceValue) {\n // We'll determine the source language from the project\n translations.en = sourceValue // Default fallback\n }\n } else {\n console.log(chalk.gray('\\nEnter translations (press Enter to skip):'))\n const languages = ['en', 'es', 'fr', 'de', 'nl']\n \n for (const lang of languages) {\n const value = await rl.question(chalk.gray(`${lang}: `))\n if (value) {\n translations[lang] = value\n }\n }\n }\n\n console.log(chalk.green('\\n🚀 Adding translation key...'))\n\n // Import and execute the add command\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n \n try {\n await client.addTranslationKey(key, translations)\n console.log(chalk.green('✅ Translation key added successfully!'))\n } catch (error) {\n console.error(chalk.red('❌ Failed to add translation key:'), error)\n }\n}\n\nasync function configureGetCommand(rl: any, config: Config): Promise<void> {\n console.log(chalk.bold('\\nGet Information:'))\n console.log('1) Project info')\n console.log('2) Languages')\n console.log('3) Releases')\n \n const choice = await rl.question(chalk.gray('What to get (1-3): ')) || '1'\n \n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n\n try {\n switch (choice) {\n case '1':\n const project = await client.getProject()\n console.log(chalk.green('\\n📋 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 '2':\n const languages = await client.getLanguages()\n console.log(chalk.green('\\n🌍 Languages:'))\n languages.languages?.forEach((lang: any) => {\n const status = lang.enabled ? '✅' : '❌'\n console.log(` ${status} ${lang.language?.name || lang.language_code}`)\n })\n break\n \n case '3':\n const releases = await client.getReleases()\n console.log(chalk.green('\\n🚀 Recent Releases:'))\n releases.releases?.slice(0, 5).forEach((release: any) => {\n const current = release.is_current ? ' [CURRENT]' : ''\n console.log(` • ${release.version}${current}`)\n })\n break\n }\n } catch (error) {\n console.error(chalk.red('❌ Failed to get information:'), error)\n }\n}\n\nasync function configureReleaseCommand(rl: any, config: Config): Promise<void> {\n console.log(chalk.bold('\\nRelease Management:'))\n console.log('1) Create new release')\n console.log('2) List releases')\n \n const choice = await rl.question(chalk.gray('Choice (1-2): ')) || '1'\n\n if (choice === '1') {\n const version = await rl.question(chalk.bold('Version (e.g., \"1.0.0\"): '))\n const name = await rl.question(chalk.gray('Name (optional): '))\n const description = await rl.question(chalk.gray('Description (optional): '))\n \n const setCurrent = await rl.question(chalk.gray('Set as current release? (y/n): '))\n\n console.log(chalk.green('\\n🚀 Creating release...'))\n\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n \n try {\n const release = await client.createRelease({\n version,\n name,\n description,\n reviewedOnly: false,\n })\n \n if (setCurrent?.toLowerCase() === 'y') {\n // Set as current\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 console.log(chalk.green('✅ Release created successfully!'))\n console.log(` ID: ${release.release.id}`)\n console.log(` Version: ${release.release.version}`)\n } catch (error) {\n console.error(chalk.red('❌ Failed to create release:'), error)\n }\n \n } else {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n \n try {\n const releases = await client.getReleases()\n console.log(chalk.green('\\n🚀 Releases:'))\n releases.releases?.forEach((release: any, index: number) => {\n const current = release.is_current ? ' [CURRENT]' : ''\n console.log(` ${index + 1}. ${release.version}${current}`)\n })\n } catch (error) {\n console.error(chalk.red('❌ Failed to list releases:'), error)\n }\n }\n}"],"mappings":"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","names":["chalk","Command","chalk","ora","Command","chalk","ora","chalk","chalk","LezuApiClient","version","chalk"]}
@@ -0,0 +1,11 @@
1
+ import {
2
+ createLoadCommand,
3
+ syncTranslations
4
+ } from "./chunk-G75WRDSJ.js";
5
+ import "./chunk-4YJMQGUZ.js";
6
+ import "./chunk-WZDLWLM3.js";
7
+ export {
8
+ createLoadCommand,
9
+ syncTranslations
10
+ };
11
+ //# sourceMappingURL=load-5EN5NPEL.js.map
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "lezu",
3
- "version": "0.0.13",
3
+ "version": "0.0.15",
4
4
  "description": "CLI tool for pulling translations from Lezu",
5
5
  "bin": {
6
- "lezu": "./dist/index.js"
6
+ "lezu": "./bin/lezu.js"
7
7
  },
8
8
  "type": "module",
9
9
  "scripts": {
@@ -32,7 +32,8 @@
32
32
  "node": ">=18"
33
33
  },
34
34
  "files": [
35
- "dist"
35
+ "dist",
36
+ "bin"
36
37
  ],
37
38
  "publishConfig": {
38
39
  "access": "public"
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- LezuApiClient
4
- } from "./chunk-UN7HQJOX.js";
5
- export {
6
- LezuApiClient
7
- };
8
- //# sourceMappingURL=api-CS5JMU72.js.map
@@ -1,10 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- createGetCommand
4
- } from "./chunk-LYGGTR5I.js";
5
- import "./chunk-VGQICGPH.js";
6
- import "./chunk-UN7HQJOX.js";
7
- export {
8
- createGetCommand
9
- };
10
- //# sourceMappingURL=get-EDBOC5W6.js.map
@@ -1,12 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- createLoadCommand,
4
- syncTranslations
5
- } from "./chunk-2MDUFSO7.js";
6
- import "./chunk-VGQICGPH.js";
7
- import "./chunk-UN7HQJOX.js";
8
- export {
9
- createLoadCommand,
10
- syncTranslations
11
- };
12
- //# sourceMappingURL=load-3MKWVORU.js.map