lezu 0.0.31 → 0.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ import {
2
+ LezuApiClient
3
+ } from "./chunk-LLUQWDVH.js";
4
+ export {
5
+ LezuApiClient
6
+ };
7
+ //# sourceMappingURL=api-MJYD3C7C.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-EDQCBUBB.js";
5
5
  import {
6
6
  LezuApiClient
7
- } from "./chunk-RW6LQ7VV.js";
7
+ } from "./chunk-LLUQWDVH.js";
8
8
 
9
9
  // src/commands/load.ts
10
10
  import { Command } from "commander";
@@ -245,4 +245,4 @@ export {
245
245
  createLoadCommand,
246
246
  syncTranslations
247
247
  };
248
- //# sourceMappingURL=chunk-OAON7N5G.js.map
248
+ //# sourceMappingURL=chunk-6BO32UFM.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-EDQCBUBB.js";
5
5
  import {
6
6
  LezuApiClient
7
- } from "./chunk-RW6LQ7VV.js";
7
+ } from "./chunk-LLUQWDVH.js";
8
8
 
9
9
  // src/commands/get.ts
10
10
  import { Command } from "commander";
@@ -214,4 +214,4 @@ async function getProject(config, options) {
214
214
  export {
215
215
  createGetCommand
216
216
  };
217
- //# sourceMappingURL=chunk-BD3CX35B.js.map
217
+ //# sourceMappingURL=chunk-6I4ZZDJR.js.map
@@ -5,6 +5,17 @@ var LezuApiClient = class {
5
5
  constructor(config) {
6
6
  this.config = config;
7
7
  }
8
+ async validateCredentials() {
9
+ try {
10
+ await this.request("/v1/billing/subscription");
11
+ return true;
12
+ } catch (error) {
13
+ if (error instanceof Error && error.message.includes("402")) {
14
+ return true;
15
+ }
16
+ throw error;
17
+ }
18
+ }
8
19
  async request(endpoint, options = {}) {
9
20
  const url = `${this.config.apiUrl}${endpoint}`;
10
21
  if (process.env.DEBUG || this.config.debug) {
@@ -78,14 +89,14 @@ Try running with DEBUG=true for more details.`;
78
89
  }
79
90
  }
80
91
  async getTranslations() {
81
- let endpoint = `/v1/translations/bundle?environment=${this.config.environment}`;
92
+ let endpoint = `/v1/projects/${this.config.projectId}/translations?environment=${this.config.environment}`;
82
93
  if (this.config.release) {
83
94
  endpoint = `/v1/releases/${this.config.release}/bundle`;
84
95
  }
85
96
  if (this.config.languages && this.config.languages.length > 0) {
86
97
  const params = new URLSearchParams();
87
98
  this.config.languages.forEach((lang) => params.append("languages", lang));
88
- endpoint += `?${params.toString()}`;
99
+ endpoint += `&${params.toString()}`;
89
100
  }
90
101
  const response = await this.request(endpoint);
91
102
  return {
@@ -115,7 +126,14 @@ Try running with DEBUG=true for more details.`;
115
126
  }
116
127
  }
117
128
  async getLanguages() {
118
- return this.request(`/v1/projects/${this.config.projectId}/languages`);
129
+ const projectData = await this.getProject();
130
+ return {
131
+ languages: projectData.project.languages?.map((lang) => ({
132
+ language_code: typeof lang === "string" ? lang : lang.code,
133
+ name: typeof lang === "string" ? lang : lang.name,
134
+ enabled: true
135
+ })) || []
136
+ };
119
137
  }
120
138
  async addTranslationKey(key, translations) {
121
139
  return this.request(
@@ -161,4 +179,4 @@ Try running with DEBUG=true for more details.`;
161
179
  export {
162
180
  LezuApiClient
163
181
  };
164
- //# sourceMappingURL=chunk-RW6LQ7VV.js.map
182
+ //# sourceMappingURL=chunk-LLUQWDVH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api.ts"],"sourcesContent":["import fetch from 'node-fetch'\nimport type { Config, ApiResponse, ReleaseResponse } from './types.js'\n\nexport class LezuApiClient {\n private config: Config\n\n constructor(config: Config) {\n this.config = config\n }\n \n async validateCredentials(): Promise<boolean> {\n try {\n // Try a simple request that should work with API keys\n // The billing endpoint is a good test since it's lightweight\n await this.request<any>('/v1/billing/subscription')\n return true\n } catch (error) {\n // If it's a 402 (payment required), credentials are valid but no subscription\n if (error instanceof Error && error.message.includes('402')) {\n return true\n }\n throw error\n }\n }\n\n private async request<T>(endpoint: string, options: any = {}): Promise<T> {\n const url = `${this.config.apiUrl}${endpoint}`\n \n // Log request details for debugging\n if (process.env.DEBUG || this.config.debug) {\n console.error(`\\n[Lezu CLI] Request Details:`)\n console.error(` URL: ${url}`)\n console.error(` Method: ${options.method || 'GET'}`)\n console.error(` Headers:`)\n console.error(` Authorization: Bearer ${this.config.apiKey?.substring(0, 10)}...`)\n console.error(` Content-Type: application/json`)\n if (options.body) {\n console.error(` Body: ${options.body}`)\n }\n }\n \n try {\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n ...options.headers\n }\n })\n\n if (!response.ok) {\n let errorMessage = ''\n \n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.error || errorData.message || errorText\n } catch {\n errorMessage = errorText\n }\n } catch {\n errorMessage = response.statusText\n }\n\n // Provide user-friendly error messages with details\n const errorDetails = `\\n\\nRequest failed:\n Endpoint: ${options.method || 'GET'} ${url}\n Status: ${response.status} ${response.statusText}\n Response: ${errorMessage || 'No error details provided'}\n \nTry running with DEBUG=true for more details.`\n\n if (response.status === 401) {\n throw new Error(`Authentication failed. Please check your API key.${errorDetails}`)\n } else if (response.status === 403) {\n throw new Error(`Access denied. Your API key may not have permission for this action.${errorDetails}`)\n } else if (response.status === 404) {\n throw new Error(`Resource not found. Please check your project ID and configuration.${errorDetails}`)\n } else if (response.status === 500) {\n // Check for common 500 errors\n if (errorMessage.includes('project') || errorMessage.includes('not found')) {\n throw new Error(`Project not found. Please verify your project ID is correct.${errorDetails}`)\n } else if (errorMessage.includes('invalid') || errorMessage.includes('malformed')) {\n throw new Error(`Invalid project ID format. Please check your configuration.${errorDetails}`)\n }\n throw new Error(`Server error: ${errorMessage || 'Internal server error'}${errorDetails}`)\n } else {\n throw new Error(`API error: ${errorMessage || response.statusText}${errorDetails}`)\n }\n }\n\n return response.json() as Promise<T>\n } catch (error) {\n if (error instanceof Error) {\n // Check for network errors\n if (error.message.includes('ENOTFOUND') || error.message.includes('ECONNREFUSED')) {\n throw new Error(`Cannot connect to Lezu API at ${this.config.apiUrl}. Please check your internet connection and API URL.`)\n }\n throw error\n }\n throw new Error('An unexpected error occurred')\n }\n }\n\n async getTranslations(): Promise<ApiResponse> {\n let endpoint = `/v1/projects/${this.config.projectId}/translations?environment=${this.config.environment}`\n \n if (this.config.release) {\n endpoint = `/v1/releases/${this.config.release}/bundle`\n }\n\n // Add language filter if specified\n if (this.config.languages && this.config.languages.length > 0) {\n const params = new URLSearchParams()\n this.config.languages.forEach(lang => params.append('languages', lang))\n endpoint += `&${params.toString()}`\n }\n\n const response = await this.request<any>(endpoint)\n \n // Transform the response to match our expected format\n return {\n translations: response.translations || response,\n meta: {\n version: response.version,\n timestamp: response.timestamp || new Date().toISOString(),\n languages: response.languages || Object.keys(response.translations || response)\n }\n }\n }\n\n async getReleases(): Promise<ReleaseResponse> {\n return this.request<ReleaseResponse>(\n `/v1/releases?environment=${this.config.environment}`\n )\n }\n\n async getLatestRelease(): Promise<string | null> {\n try {\n const releases = await this.getReleases()\n if (releases.releases && releases.releases.length > 0) {\n // Releases are ordered by created_at desc, so first one is latest\n return releases.releases[0].id\n }\n return null\n } catch (error) {\n console.warn('Failed to fetch latest release:', error)\n return null\n }\n }\n\n async getLanguages(): Promise<any> {\n // Get project details to extract languages\n const projectData = await this.getProject()\n return {\n languages: projectData.project.languages?.map((lang: any) => ({\n language_code: typeof lang === 'string' ? lang : lang.code,\n name: typeof lang === 'string' ? lang : lang.name,\n enabled: true\n })) || []\n }\n }\n\n async addTranslationKey(key: string, translations: Record<string, string>): Promise<any> {\n return this.request<any>(\n `/v1/keys`,\n {\n method: 'POST',\n body: JSON.stringify({ key, translations })\n }\n )\n }\n\n async translateKey(text: string, sourceLanguage: string, targetLanguages: string[]): Promise<Record<string, string>> {\n // Use batch translate for efficiency\n const response = await this.request<any>('/v1/translations/translate/batch', {\n method: 'POST',\n body: JSON.stringify({\n texts: [text],\n sourceLanguage,\n targetLanguages\n })\n })\n \n return response.translations[text] || {}\n }\n\n async createRelease(data: {\n version?: string\n name?: string\n description?: string\n reviewedOnly?: boolean\n } = {}): Promise<any> {\n return this.request<any>(\n `/v1/releases`,\n {\n method: 'POST',\n body: JSON.stringify({\n environment: this.config.environment || 'production',\n version: data.version || new Date().toISOString().split('T')[0],\n name: data.name,\n description: data.description,\n reviewedOnly: data.reviewedOnly || false,\n setAsCurrent: true\n })\n }\n )\n }\n\n async getProject(): Promise<any> {\n return this.request<any>(`/v1/projects/${this.config.projectId}`)\n }\n}"],"mappings":"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","names":[]}
@@ -0,0 +1,9 @@
1
+ import {
2
+ createGetCommand
3
+ } from "./chunk-6I4ZZDJR.js";
4
+ import "./chunk-EDQCBUBB.js";
5
+ import "./chunk-LLUQWDVH.js";
6
+ export {
7
+ createGetCommand
8
+ };
9
+ //# sourceMappingURL=get-JPH7QHRH.js.map
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  createLoadCommand
3
- } from "./chunk-OAON7N5G.js";
3
+ } from "./chunk-6BO32UFM.js";
4
4
  import {
5
5
  createGetCommand
6
- } from "./chunk-BD3CX35B.js";
6
+ } from "./chunk-6I4ZZDJR.js";
7
7
  import {
8
8
  loadConfig,
9
9
  validateConfig
10
10
  } from "./chunk-EDQCBUBB.js";
11
11
  import {
12
12
  LezuApiClient
13
- } from "./chunk-RW6LQ7VV.js";
13
+ } from "./chunk-LLUQWDVH.js";
14
14
 
15
15
  // src/index.ts
16
16
  import { program } from "commander";
@@ -135,7 +135,7 @@ function createReleaseCommand() {
135
135
  errors.forEach((error) => console.error(chalk2.red(` - ${error}`)));
136
136
  process.exit(1);
137
137
  }
138
- const { getReleases } = await import("./get-7NSON4EJ.js");
138
+ const { getReleases } = await import("./get-JPH7QHRH.js");
139
139
  await getReleases(config, options);
140
140
  } catch (error) {
141
141
  console.error(chalk2.red("\n[Error]"), error instanceof Error ? error.message : error);
@@ -284,9 +284,9 @@ async function interactiveMode(initialConfig) {
284
284
  const validationSpinner = spinner();
285
285
  validationSpinner.start("Validating credentials...");
286
286
  try {
287
- const { LezuApiClient: LezuApiClient2 } = await import("./api-GD4JWDDP.js");
287
+ const { LezuApiClient: LezuApiClient2 } = await import("./api-MJYD3C7C.js");
288
288
  const client = new LezuApiClient2(config);
289
- await client.getLanguages();
289
+ await client.validateCredentials();
290
290
  validationSpinner.stop("Credentials validated!");
291
291
  } catch (error) {
292
292
  if (error instanceof Error) {
@@ -372,7 +372,7 @@ async function configureLoadCommand(config) {
372
372
  const s = spinner();
373
373
  s.start("Syncing translations...");
374
374
  try {
375
- const { syncTranslations } = await import("./load-P5I3TKON.js");
375
+ const { syncTranslations } = await import("./load-57MDNWD7.js");
376
376
  await syncTranslations(finalConfig);
377
377
  s.stop("Translations synced successfully!");
378
378
  } catch (error) {
@@ -450,7 +450,7 @@ async function configureAddCommand(config) {
450
450
  const s = spinner();
451
451
  s.start("Adding translation key...");
452
452
  try {
453
- const { LezuApiClient: LezuApiClient2 } = await import("./api-GD4JWDDP.js");
453
+ const { LezuApiClient: LezuApiClient2 } = await import("./api-MJYD3C7C.js");
454
454
  const client = new LezuApiClient2(config);
455
455
  await client.addTranslationKey(key, translations);
456
456
  s.stop("Translation key added successfully!");
@@ -482,7 +482,7 @@ async function configureGetCommand(config) {
482
482
  const s = spinner();
483
483
  s.start("Fetching information...");
484
484
  try {
485
- const { LezuApiClient: LezuApiClient2 } = await import("./api-GD4JWDDP.js");
485
+ const { LezuApiClient: LezuApiClient2 } = await import("./api-MJYD3C7C.js");
486
486
  const client = new LezuApiClient2(config);
487
487
  switch (infoType) {
488
488
  case "project":
@@ -530,7 +530,7 @@ async function configureReleaseCommand(config) {
530
530
  cancel("Operation cancelled");
531
531
  process.exit(0);
532
532
  }
533
- const { LezuApiClient: LezuApiClient2 } = await import("./api-GD4JWDDP.js");
533
+ const { LezuApiClient: LezuApiClient2 } = await import("./api-MJYD3C7C.js");
534
534
  const client = new LezuApiClient2(config);
535
535
  if (action === "create") {
536
536
  const version2 = await text({
@@ -617,7 +617,7 @@ async function configureReleaseCommand(config) {
617
617
  }
618
618
 
619
619
  // src/index.ts
620
- var version = "0.0.31";
620
+ var version = "0.0.32";
621
621
  program.name("lezu").description("CLI tool for managing translations with Lezu").version(version);
622
622
  program.addCommand(createLoadCommand());
623
623
  program.addCommand(createAddCommand());
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/commands/release.ts","../src/interactive.ts"],"sourcesContent":["import { program } from 'commander'\nimport chalk from 'chalk'\nimport { createLoadCommand } from './commands/load.js'\nimport { createAddCommand } from './commands/add.js'\nimport { createGetCommand } from './commands/get.js'\nimport { createReleaseCommand } from './commands/release.js'\nimport { interactiveMode } from './interactive.js'\nimport { loadConfig } from './config.js'\n\n// Version from package.json\nconst version = '0.0.31'\n\nprogram\n .name('lezu')\n .description('CLI tool for managing translations with Lezu')\n .version(version)\n\n// Add subcommands\nprogram.addCommand(createLoadCommand())\nprogram.addCommand(createAddCommand())\nprogram.addCommand(createGetCommand())\nprogram.addCommand(createReleaseCommand())\n\n// If no command was provided, run interactive mode\nif (process.argv.length <= 2) {\n ;(async () => {\n console.log(chalk.blue('Welcome to Lezu CLI!'))\n console.log()\n \n try {\n const config = loadConfig({})\n await interactiveMode(config)\n } catch (error) {\n if (error instanceof Error) {\n console.error(chalk.red('\\nError:'), error.message)\n } else {\n console.error(chalk.red('\\nError:'), error)\n }\n process.exit(1)\n }\n })()\n} else {\n // Parse commands normally\n program.parse()\n}","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loadConfig, validateConfig } from '../config.js'\nimport { LezuApiClient } from '../api.js'\nimport type { Config } from '../types.js'\n\nexport function createAddCommand() {\n const command = new Command('add')\n .description('Add a new translation key with values')\n .requiredOption('-k, --key <key>', 'Translation key (e.g., \"common.save\")')\n .option('-v, --value <value>', 'Value for the source language')\n .option('--en <value>', 'English translation')\n .option('--es <value>', 'Spanish translation')\n .option('--fr <value>', 'French translation')\n .option('--de <value>', 'German translation')\n .option('--nl <value>', 'Dutch translation')\n .option('--it <value>', 'Italian translation')\n .option('--pt <value>', 'Portuguese translation')\n .option('--ru <value>', 'Russian translation')\n .option('--ja <value>', 'Japanese translation')\n .option('--ko <value>', 'Korean translation')\n .option('--zh <value>', 'Chinese translation')\n .option('--ar <value>', 'Arabic translation')\n .option('-d, --description <desc>', 'Description for the translation key')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--auto', 'Auto-translate to all enabled languages')\n .action(async (options) => {\n try {\n // Load configuration\n const config = loadConfig(options)\n \n // Validate configuration\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n // Collect translations from language options\n const translations: Record<string, string> = {}\n const languageOptions = ['en', 'es', 'fr', 'de', 'nl', 'it', 'pt', 'ru', 'ja', 'ko', 'zh', 'ar']\n \n languageOptions.forEach(lang => {\n if (options[lang]) {\n translations[lang] = options[lang]\n }\n })\n \n // If --value is provided without specific language, use project's source language\n if (options.value && Object.keys(translations).length === 0) {\n // We'll need to get the project info to determine source language\n const spinner = ora('Getting project information...').start()\n const client = new LezuApiClient(config)\n \n try {\n const { project } = await client.getProject()\n const sourceLanguage = project.source_language || 'en'\n translations[sourceLanguage] = options.value\n spinner.succeed(`Using ${sourceLanguage} as source language`)\n } catch (error) {\n spinner.fail('Failed to get project information')\n translations['en'] = options.value // fallback to English\n }\n }\n \n await addTranslationKey(config, {\n key: options.key,\n description: options.description,\n translations,\n auto: options.auto,\n })\n \n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n return command\n}\n\ninterface AddKeyOptions {\n key: string\n description?: string\n translations: Record<string, string>\n auto?: boolean\n}\n\nasync function addTranslationKey(config: Config, options: AddKeyOptions) {\n const spinner = ora('Adding translation key...').start()\n \n try {\n const client = new LezuApiClient(config)\n \n // Add the key with translations\n const response = await client.addTranslationKey(options.key, options.translations)\n \n spinner.succeed('Translation key added successfully!')\n \n // Show summary\n console.log(chalk.green('\\n[Success] Key added:'))\n console.log(chalk.gray(` - Key: ${options.key}`))\n if (options.description) {\n console.log(chalk.gray(` - Description: ${options.description}`))\n }\n console.log(chalk.gray(` - Languages: ${Object.keys(options.translations).join(', ')}`))\n \n // Show translations\n if (Object.keys(options.translations).length > 0) {\n console.log(chalk.gray('\\n Translations:'))\n Object.entries(options.translations).forEach(([lang, value]) => {\n console.log(chalk.gray(` ${lang}: \"${value}\"`))\n })\n }\n \n // If auto-translate was used, show additional info\n if (options.auto) {\n console.log(chalk.cyan('\\n[AI] Auto-translation was enabled. Check the dashboard to review AI-generated translations.'))\n }\n \n } catch (error) {\n spinner.fail('Failed to add translation key')\n throw error\n }\n}","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loadConfig, validateConfig } from '../config.js'\nimport { LezuApiClient } from '../api.js'\nimport type { Config } from '../types.js'\n\nexport function createReleaseCommand() {\n const command = new Command('release')\n .description('Manage releases')\n \n // Create release subcommand\n command\n .command('create')\n .alias('new')\n .description('Create a new release')\n .option('-v, --version <version>', 'Release version (e.g., \"1.0.0\")')\n .option('-n, --name <name>', 'Release name')\n .option('-d, --description <desc>', 'Release description')\n .option('-e, --environment <env>', 'Environment', 'production')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--reviewed-only', 'Include only reviewed translations')\n .option('--set-current', 'Set this release as the current release')\n .option('--timestamp <iso>', 'Specific timestamp for the release (ISO format)')\n .option('--languages <langs>', 'Comma-separated list of languages to include')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const config = loadConfig(options)\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n await createRelease(config, options)\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n // Set current release subcommand\n command\n .command('current <releaseId>')\n .description('Set a release as current')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--json', 'Output as JSON')\n .action(async (releaseId, options) => {\n try {\n const config = loadConfig(options)\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n await setCurrentRelease(config, releaseId, options)\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n // List releases (alias for get releases)\n command\n .command('list')\n .alias('ls')\n .description('List all releases')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('-e, --environment <env>', 'Environment', 'production')\n .option('--json', 'Output as JSON')\n .option('--limit <n>', 'Limit number of results', '10')\n .action(async (options) => {\n try {\n const config = loadConfig(options)\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n // Import and use the getReleases function from get command\n const { getReleases } = await import('./get.js')\n await getReleases(config, options)\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n return command\n}\n\nasync function createRelease(config: Config, options: any) {\n const spinner = ora('Creating release...').start()\n \n try {\n const client = new LezuApiClient(config)\n \n // Parse languages if provided\n const languages = options.languages ? options.languages.split(',').map((l: string) => l.trim()) : undefined\n \n // Validate timestamp if provided\n let timestamp\n if (options.timestamp) {\n try {\n timestamp = new Date(options.timestamp).toISOString()\n } catch (error) {\n throw new Error('Invalid timestamp format. Use ISO format (e.g., 2023-12-01T10:00:00Z)')\n }\n }\n \n const releaseData = {\n environment: options.environment,\n version: options.version,\n name: options.name,\n description: options.description,\n reviewedOnly: options.reviewedOnly || false,\n setAsCurrent: options.setCurrent || false,\n timestamp,\n languages,\n }\n \n spinner.text = 'Creating release and generating bundles...'\n const response = await client.createRelease(releaseData)\n \n spinner.succeed('Release created successfully!')\n \n if (options.json) {\n console.log(JSON.stringify(response, null, 2))\n return\n }\n \n console.log(chalk.green('\\n[Release Created]'))\n console.log(` ID: ${response.release.id}`)\n console.log(` Version: ${response.release.version}`)\n if (response.release.name) {\n console.log(` Name: ${response.release.name}`)\n }\n if (response.release.description) {\n console.log(` Description: ${response.release.description}`)\n }\n console.log(` Environment: ${response.release.environment?.name || options.environment}`)\n console.log(` Reviewed Only: ${response.release.reviewed_only ? 'Yes' : 'No'}`)\n console.log(` Is Current: ${response.release.is_current ? 'Yes' : 'No'}`)\n console.log(` Created: ${new Date(response.release.created_at).toLocaleString()}`)\n \n // Show bundle information\n if (response.release.artifacts && response.release.artifacts.length > 0) {\n console.log(chalk.green('\\n[Bundles Generated]'))\n response.release.artifacts.forEach((artifact: any) => {\n const sizeKB = Math.round(artifact.file_size / 1024)\n console.log(` - ${artifact.language_code}: ${sizeKB}KB`)\n })\n console.log(chalk.gray(`\\nTotal: ${response.release.artifacts.length} language bundles`))\n }\n \n console.log(chalk.cyan('\\n[Tip] You can now use this release with:'))\n console.log(chalk.gray(` npx lezu load --release ${response.release.id}`))\n \n if (response.release.is_current) {\n console.log(chalk.green('\\n[Success] This release is now set as current!'))\n }\n \n } catch (error) {\n spinner.fail('Failed to create release')\n throw error\n }\n}\n\nasync function setCurrentRelease(config: Config, releaseId: string, options: any) {\n const spinner = ora('Setting release as current...').start()\n \n try {\n const response = await fetch(`${config.apiUrl}/v1/releases/${releaseId}/current`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n 'Content-Type': 'application/json',\n },\n })\n \n if (!response.ok) {\n const error = await response.text()\n throw new Error(`Failed to set current release: ${response.status} ${response.statusText}\\n${error}`)\n }\n \n const data = await response.json()\n \n spinner.succeed('Release set as current!')\n \n if (options.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n \n console.log(chalk.green('\\n[Release Updated]'))\n console.log(` Release ID: ${releaseId}`)\n console.log(' Status: Now set as current release')\n \n console.log(chalk.cyan('\\n[Info] All new bundle requests will now use this release'))\n \n } catch (error) {\n spinner.fail('Failed to set release as current')\n throw error\n }\n}","import { intro, outro, select, text, confirm, spinner, cancel, isCancel } from '@clack/prompts'\nimport chalk from 'chalk'\nimport { loadConfig } from './config.js'\nimport type { Config } from './types.js'\n\nexport async function interactiveMode(initialConfig: Partial<Config>): Promise<void> {\n intro(chalk.cyan('Welcome to Lezu CLI!'))\n\n try {\n // Select command\n const command = await select({\n message: 'What would you like to do?',\n options: [\n { value: 'load', label: 'Load translation files' },\n { value: 'add', label: 'Add a new translation key' },\n { value: 'get', label: 'Get project information' },\n { value: 'release', label: 'Manage releases' },\n ],\n })\n\n if (isCancel(command)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n // Get basic configuration\n const projectId = await text({\n message: 'Project ID',\n placeholder: 'Enter your project ID',\n initialValue: initialConfig.projectId || '',\n validate: (value) => {\n if (!value) return 'Project ID is required'\n },\n })\n\n if (isCancel(projectId)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const apiKey = await text({\n message: 'API Key',\n placeholder: 'Enter your API key',\n initialValue: initialConfig.apiKey || '',\n validate: (value) => {\n if (!value) return 'API Key is required'\n },\n })\n\n if (isCancel(apiKey)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const config = loadConfig({ projectId: projectId as string, apiKey: apiKey as string, ...initialConfig })\n\n // Validate connection before proceeding\n const validationSpinner = spinner()\n validationSpinner.start('Validating credentials...')\n \n try {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n \n // Try to validate by getting languages instead of project\n // This endpoint works better with API keys\n await client.getLanguages()\n validationSpinner.stop('Credentials validated!')\n } catch (error) {\n if (error instanceof Error) {\n validationSpinner.stop('Invalid credentials')\n outro(chalk.red(error.message))\n } else {\n validationSpinner.stop('Failed to validate credentials')\n outro(chalk.red('Could not connect to Lezu API'))\n }\n process.exit(1)\n }\n\n // Handle specific command configurations\n switch (command) {\n case 'load':\n await configureLoadCommand(config)\n break\n case 'add':\n await configureAddCommand(config)\n break\n case 'get':\n await configureGetCommand(config)\n break\n case 'release':\n await configureReleaseCommand(config)\n break\n }\n\n outro(chalk.green('Done!'))\n } catch (error) {\n if (error instanceof Error) {\n outro(chalk.red(error.message))\n } else {\n outro(chalk.red('An unexpected error occurred'))\n }\n process.exit(1)\n }\n}\n\nasync function configureLoadCommand(config: Config): Promise<void> {\n const dest = await text({\n message: 'Destination folder',\n placeholder: './src/i18n',\n initialValue: config.dest || './src/i18n',\n })\n\n if (isCancel(dest)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const format = await select({\n message: 'Output format',\n options: [\n { value: 'json', label: 'JSON' },\n { value: 'js', label: 'JavaScript (ES modules)' },\n { value: 'ts', label: 'TypeScript' },\n { value: 'yaml', label: 'YAML' },\n ],\n })\n\n if (isCancel(format)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const environment = await text({\n message: 'Environment',\n placeholder: 'production',\n initialValue: config.environment || 'production',\n })\n\n if (isCancel(environment)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const languages = await text({\n message: 'Specific languages (comma-separated, leave empty for all)',\n placeholder: 'en,es,fr',\n })\n\n if (isCancel(languages)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const finalConfig = {\n ...config,\n dest: dest as string,\n format: format as 'json' | 'js' | 'ts' | 'yaml',\n environment: environment as string,\n languages: languages ? (languages as string).split(',').map(l => l.trim()) : undefined\n }\n\n const s = spinner()\n s.start('Syncing translations...')\n \n try {\n const { syncTranslations } = await import('./commands/load.js')\n await syncTranslations(finalConfig)\n s.stop('Translations synced successfully!')\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to sync translations')\n }\n throw error\n }\n}\n\nasync function configureAddCommand(config: Config): Promise<void> {\n const key = await text({\n message: 'Translation key',\n placeholder: 'common.save',\n validate: (value) => {\n if (!value) return 'Translation key is required'\n },\n })\n\n if (isCancel(key)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const description = await text({\n message: 'Description (optional)',\n placeholder: 'Save button text',\n })\n\n if (isCancel(description)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const translationMethod = await select({\n message: 'How would you like to provide translations?',\n options: [\n { value: 'manual', label: 'Provide translations manually' },\n { value: 'auto', label: 'Auto-translate from source language' },\n ],\n })\n\n if (isCancel(translationMethod)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n let translations: Record<string, string> = {}\n let auto = false\n\n if (translationMethod === 'auto') {\n auto = true\n const sourceValue = await text({\n message: 'Source language value',\n placeholder: 'Save',\n validate: (value) => {\n if (!value) return 'Source value is required for auto-translation'\n },\n })\n\n if (isCancel(sourceValue)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n translations.en = sourceValue as string\n } else {\n const languages = ['en', 'es', 'fr', 'de', 'nl']\n \n for (const lang of languages) {\n const value = await text({\n message: `Translation for ${lang} (optional)`,\n placeholder: `Enter ${lang} translation`,\n })\n\n if (isCancel(value)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n if (value) {\n translations[lang] = value as string\n }\n }\n }\n\n const s = spinner()\n s.start('Adding translation key...')\n\n try {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n await client.addTranslationKey(key as string, translations)\n s.stop('Translation key added successfully!')\n \n if (auto) {\n console.log(chalk.cyan('\\n[AI] Auto-translation was enabled. Check the dashboard to review AI-generated translations.'))\n }\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to add translation key')\n }\n throw error\n }\n}\n\nasync function configureGetCommand(config: Config): Promise<void> {\n const infoType = await select({\n message: 'What information would you like to get?',\n options: [\n { value: 'project', label: 'Project information' },\n { value: 'languages', label: 'Languages' },\n { value: 'releases', label: 'Releases' },\n ],\n })\n\n if (isCancel(infoType)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const s = spinner()\n s.start('Fetching information...')\n\n try {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n\n switch (infoType) {\n case 'project':\n const project = await client.getProject()\n s.stop('Project information:')\n console.log(` Name: ${project.project.name}`)\n console.log(` Key: ${project.project.key}`)\n console.log(` Source Language: ${project.project.source_language}`)\n break\n \n case 'languages':\n const languages = await client.getLanguages()\n s.stop('Languages:')\n languages.languages?.forEach((lang: any) => {\n const status = lang.enabled ? chalk.green('[ON]') : chalk.gray('[OFF]')\n console.log(` ${status} ${lang.language?.name || lang.language_code}`)\n })\n break\n \n case 'releases':\n const releases = await client.getReleases()\n s.stop('Recent releases:')\n releases.releases?.slice(0, 10).forEach((release: any) => {\n const current = release.is_current ? chalk.green(' [CURRENT]') : ''\n console.log(` ${release.version}${current}`)\n })\n break\n }\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to fetch information')\n }\n throw error\n }\n}\n\nasync function configureReleaseCommand(config: Config): Promise<void> {\n const action = await select({\n message: 'Release management',\n options: [\n { value: 'create', label: 'Create new release' },\n { value: 'list', label: 'List releases' },\n ],\n })\n\n if (isCancel(action)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n\n if (action === 'create') {\n const version = await text({\n message: 'Version',\n placeholder: '1.0.0',\n validate: (value) => {\n if (!value) return 'Version is required'\n },\n })\n\n if (isCancel(version)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const name = await text({\n message: 'Name (optional)',\n placeholder: 'Production Release',\n })\n\n if (isCancel(name)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const description = await text({\n message: 'Description (optional)',\n placeholder: 'Added new features...',\n })\n\n if (isCancel(description)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const setCurrent = await confirm({\n message: 'Set as current release?',\n })\n\n if (isCancel(setCurrent)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const s = spinner()\n s.start('Creating release...')\n\n try {\n const release = await client.createRelease({\n version: version as string,\n name: name as string || undefined,\n description: description as string || undefined,\n reviewedOnly: false,\n })\n \n if (setCurrent) {\n await fetch(`${config.apiUrl}/v1/releases/${release.release.id}/current`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n })\n }\n \n s.stop('Release created successfully!')\n console.log(` ID: ${release.release.id}`)\n console.log(` Version: ${release.release.version}`)\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to create release')\n }\n throw error\n }\n \n } else {\n const s = spinner()\n s.start('Fetching releases...')\n \n try {\n const releases = await client.getReleases()\n s.stop('Releases:')\n releases.releases?.forEach((release: any, index: number) => {\n const current = release.is_current ? chalk.green(' [CURRENT]') : ''\n console.log(` ${index + 1}. ${release.version}${current}`)\n })\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to list releases')\n }\n throw error\n }\n }\n}"],"mappings":"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","names":["chalk","spinner","Command","chalk","ora","Command","chalk","spinner","ora","chalk","chalk","LezuApiClient","version","chalk"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/commands/release.ts","../src/interactive.ts"],"sourcesContent":["import { program } from 'commander'\nimport chalk from 'chalk'\nimport { createLoadCommand } from './commands/load.js'\nimport { createAddCommand } from './commands/add.js'\nimport { createGetCommand } from './commands/get.js'\nimport { createReleaseCommand } from './commands/release.js'\nimport { interactiveMode } from './interactive.js'\nimport { loadConfig } from './config.js'\n\n// Version from package.json\nconst version = '0.0.32'\n\nprogram\n .name('lezu')\n .description('CLI tool for managing translations with Lezu')\n .version(version)\n\n// Add subcommands\nprogram.addCommand(createLoadCommand())\nprogram.addCommand(createAddCommand())\nprogram.addCommand(createGetCommand())\nprogram.addCommand(createReleaseCommand())\n\n// If no command was provided, run interactive mode\nif (process.argv.length <= 2) {\n ;(async () => {\n console.log(chalk.blue('Welcome to Lezu CLI!'))\n console.log()\n \n try {\n const config = loadConfig({})\n await interactiveMode(config)\n } catch (error) {\n if (error instanceof Error) {\n console.error(chalk.red('\\nError:'), error.message)\n } else {\n console.error(chalk.red('\\nError:'), error)\n }\n process.exit(1)\n }\n })()\n} else {\n // Parse commands normally\n program.parse()\n}","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loadConfig, validateConfig } from '../config.js'\nimport { LezuApiClient } from '../api.js'\nimport type { Config } from '../types.js'\n\nexport function createAddCommand() {\n const command = new Command('add')\n .description('Add a new translation key with values')\n .requiredOption('-k, --key <key>', 'Translation key (e.g., \"common.save\")')\n .option('-v, --value <value>', 'Value for the source language')\n .option('--en <value>', 'English translation')\n .option('--es <value>', 'Spanish translation')\n .option('--fr <value>', 'French translation')\n .option('--de <value>', 'German translation')\n .option('--nl <value>', 'Dutch translation')\n .option('--it <value>', 'Italian translation')\n .option('--pt <value>', 'Portuguese translation')\n .option('--ru <value>', 'Russian translation')\n .option('--ja <value>', 'Japanese translation')\n .option('--ko <value>', 'Korean translation')\n .option('--zh <value>', 'Chinese translation')\n .option('--ar <value>', 'Arabic translation')\n .option('-d, --description <desc>', 'Description for the translation key')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--auto', 'Auto-translate to all enabled languages')\n .action(async (options) => {\n try {\n // Load configuration\n const config = loadConfig(options)\n \n // Validate configuration\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n // Collect translations from language options\n const translations: Record<string, string> = {}\n const languageOptions = ['en', 'es', 'fr', 'de', 'nl', 'it', 'pt', 'ru', 'ja', 'ko', 'zh', 'ar']\n \n languageOptions.forEach(lang => {\n if (options[lang]) {\n translations[lang] = options[lang]\n }\n })\n \n // If --value is provided without specific language, use project's source language\n if (options.value && Object.keys(translations).length === 0) {\n // We'll need to get the project info to determine source language\n const spinner = ora('Getting project information...').start()\n const client = new LezuApiClient(config)\n \n try {\n const { project } = await client.getProject()\n const sourceLanguage = project.source_language || 'en'\n translations[sourceLanguage] = options.value\n spinner.succeed(`Using ${sourceLanguage} as source language`)\n } catch (error) {\n spinner.fail('Failed to get project information')\n translations['en'] = options.value // fallback to English\n }\n }\n \n await addTranslationKey(config, {\n key: options.key,\n description: options.description,\n translations,\n auto: options.auto,\n })\n \n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n return command\n}\n\ninterface AddKeyOptions {\n key: string\n description?: string\n translations: Record<string, string>\n auto?: boolean\n}\n\nasync function addTranslationKey(config: Config, options: AddKeyOptions) {\n const spinner = ora('Adding translation key...').start()\n \n try {\n const client = new LezuApiClient(config)\n \n // Add the key with translations\n const response = await client.addTranslationKey(options.key, options.translations)\n \n spinner.succeed('Translation key added successfully!')\n \n // Show summary\n console.log(chalk.green('\\n[Success] Key added:'))\n console.log(chalk.gray(` - Key: ${options.key}`))\n if (options.description) {\n console.log(chalk.gray(` - Description: ${options.description}`))\n }\n console.log(chalk.gray(` - Languages: ${Object.keys(options.translations).join(', ')}`))\n \n // Show translations\n if (Object.keys(options.translations).length > 0) {\n console.log(chalk.gray('\\n Translations:'))\n Object.entries(options.translations).forEach(([lang, value]) => {\n console.log(chalk.gray(` ${lang}: \"${value}\"`))\n })\n }\n \n // If auto-translate was used, show additional info\n if (options.auto) {\n console.log(chalk.cyan('\\n[AI] Auto-translation was enabled. Check the dashboard to review AI-generated translations.'))\n }\n \n } catch (error) {\n spinner.fail('Failed to add translation key')\n throw error\n }\n}","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loadConfig, validateConfig } from '../config.js'\nimport { LezuApiClient } from '../api.js'\nimport type { Config } from '../types.js'\n\nexport function createReleaseCommand() {\n const command = new Command('release')\n .description('Manage releases')\n \n // Create release subcommand\n command\n .command('create')\n .alias('new')\n .description('Create a new release')\n .option('-v, --version <version>', 'Release version (e.g., \"1.0.0\")')\n .option('-n, --name <name>', 'Release name')\n .option('-d, --description <desc>', 'Release description')\n .option('-e, --environment <env>', 'Environment', 'production')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--reviewed-only', 'Include only reviewed translations')\n .option('--set-current', 'Set this release as the current release')\n .option('--timestamp <iso>', 'Specific timestamp for the release (ISO format)')\n .option('--languages <langs>', 'Comma-separated list of languages to include')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const config = loadConfig(options)\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n await createRelease(config, options)\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n // Set current release subcommand\n command\n .command('current <releaseId>')\n .description('Set a release as current')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('--json', 'Output as JSON')\n .action(async (releaseId, options) => {\n try {\n const config = loadConfig(options)\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n await setCurrentRelease(config, releaseId, options)\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n // List releases (alias for get releases)\n command\n .command('list')\n .alias('ls')\n .description('List all releases')\n .option('-p, --project <id>', 'Project ID')\n .option('-a, --api-key <key>', 'API key')\n .option('--api-url <url>', 'API URL', 'https://api.lezu.app')\n .option('-e, --environment <env>', 'Environment', 'production')\n .option('--json', 'Output as JSON')\n .option('--limit <n>', 'Limit number of results', '10')\n .action(async (options) => {\n try {\n const config = loadConfig(options)\n const errors = validateConfig(config)\n if (errors.length > 0) {\n console.error(chalk.red('Configuration errors:'))\n errors.forEach(error => console.error(chalk.red(` - ${error}`)))\n process.exit(1)\n }\n \n // Import and use the getReleases function from get command\n const { getReleases } = await import('./get.js')\n await getReleases(config, options)\n } catch (error) {\n console.error(chalk.red('\\n[Error]'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n })\n \n return command\n}\n\nasync function createRelease(config: Config, options: any) {\n const spinner = ora('Creating release...').start()\n \n try {\n const client = new LezuApiClient(config)\n \n // Parse languages if provided\n const languages = options.languages ? options.languages.split(',').map((l: string) => l.trim()) : undefined\n \n // Validate timestamp if provided\n let timestamp\n if (options.timestamp) {\n try {\n timestamp = new Date(options.timestamp).toISOString()\n } catch (error) {\n throw new Error('Invalid timestamp format. Use ISO format (e.g., 2023-12-01T10:00:00Z)')\n }\n }\n \n const releaseData = {\n environment: options.environment,\n version: options.version,\n name: options.name,\n description: options.description,\n reviewedOnly: options.reviewedOnly || false,\n setAsCurrent: options.setCurrent || false,\n timestamp,\n languages,\n }\n \n spinner.text = 'Creating release and generating bundles...'\n const response = await client.createRelease(releaseData)\n \n spinner.succeed('Release created successfully!')\n \n if (options.json) {\n console.log(JSON.stringify(response, null, 2))\n return\n }\n \n console.log(chalk.green('\\n[Release Created]'))\n console.log(` ID: ${response.release.id}`)\n console.log(` Version: ${response.release.version}`)\n if (response.release.name) {\n console.log(` Name: ${response.release.name}`)\n }\n if (response.release.description) {\n console.log(` Description: ${response.release.description}`)\n }\n console.log(` Environment: ${response.release.environment?.name || options.environment}`)\n console.log(` Reviewed Only: ${response.release.reviewed_only ? 'Yes' : 'No'}`)\n console.log(` Is Current: ${response.release.is_current ? 'Yes' : 'No'}`)\n console.log(` Created: ${new Date(response.release.created_at).toLocaleString()}`)\n \n // Show bundle information\n if (response.release.artifacts && response.release.artifacts.length > 0) {\n console.log(chalk.green('\\n[Bundles Generated]'))\n response.release.artifacts.forEach((artifact: any) => {\n const sizeKB = Math.round(artifact.file_size / 1024)\n console.log(` - ${artifact.language_code}: ${sizeKB}KB`)\n })\n console.log(chalk.gray(`\\nTotal: ${response.release.artifacts.length} language bundles`))\n }\n \n console.log(chalk.cyan('\\n[Tip] You can now use this release with:'))\n console.log(chalk.gray(` npx lezu load --release ${response.release.id}`))\n \n if (response.release.is_current) {\n console.log(chalk.green('\\n[Success] This release is now set as current!'))\n }\n \n } catch (error) {\n spinner.fail('Failed to create release')\n throw error\n }\n}\n\nasync function setCurrentRelease(config: Config, releaseId: string, options: any) {\n const spinner = ora('Setting release as current...').start()\n \n try {\n const response = await fetch(`${config.apiUrl}/v1/releases/${releaseId}/current`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n 'Content-Type': 'application/json',\n },\n })\n \n if (!response.ok) {\n const error = await response.text()\n throw new Error(`Failed to set current release: ${response.status} ${response.statusText}\\n${error}`)\n }\n \n const data = await response.json()\n \n spinner.succeed('Release set as current!')\n \n if (options.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n \n console.log(chalk.green('\\n[Release Updated]'))\n console.log(` Release ID: ${releaseId}`)\n console.log(' Status: Now set as current release')\n \n console.log(chalk.cyan('\\n[Info] All new bundle requests will now use this release'))\n \n } catch (error) {\n spinner.fail('Failed to set release as current')\n throw error\n }\n}","import { intro, outro, select, text, confirm, spinner, cancel, isCancel } from '@clack/prompts'\nimport chalk from 'chalk'\nimport { loadConfig } from './config.js'\nimport type { Config } from './types.js'\n\nexport async function interactiveMode(initialConfig: Partial<Config>): Promise<void> {\n intro(chalk.cyan('Welcome to Lezu CLI!'))\n\n try {\n // Select command\n const command = await select({\n message: 'What would you like to do?',\n options: [\n { value: 'load', label: 'Load translation files' },\n { value: 'add', label: 'Add a new translation key' },\n { value: 'get', label: 'Get project information' },\n { value: 'release', label: 'Manage releases' },\n ],\n })\n\n if (isCancel(command)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n // Get basic configuration\n const projectId = await text({\n message: 'Project ID',\n placeholder: 'Enter your project ID',\n initialValue: initialConfig.projectId || '',\n validate: (value) => {\n if (!value) return 'Project ID is required'\n },\n })\n\n if (isCancel(projectId)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const apiKey = await text({\n message: 'API Key',\n placeholder: 'Enter your API key',\n initialValue: initialConfig.apiKey || '',\n validate: (value) => {\n if (!value) return 'API Key is required'\n },\n })\n\n if (isCancel(apiKey)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const config = loadConfig({ projectId: projectId as string, apiKey: apiKey as string, ...initialConfig })\n\n // Validate connection before proceeding\n const validationSpinner = spinner()\n validationSpinner.start('Validating credentials...')\n \n try {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n \n // Validate credentials using the billing endpoint\n await client.validateCredentials()\n validationSpinner.stop('Credentials validated!')\n } catch (error) {\n if (error instanceof Error) {\n validationSpinner.stop('Invalid credentials')\n outro(chalk.red(error.message))\n } else {\n validationSpinner.stop('Failed to validate credentials')\n outro(chalk.red('Could not connect to Lezu API'))\n }\n process.exit(1)\n }\n\n // Handle specific command configurations\n switch (command) {\n case 'load':\n await configureLoadCommand(config)\n break\n case 'add':\n await configureAddCommand(config)\n break\n case 'get':\n await configureGetCommand(config)\n break\n case 'release':\n await configureReleaseCommand(config)\n break\n }\n\n outro(chalk.green('Done!'))\n } catch (error) {\n if (error instanceof Error) {\n outro(chalk.red(error.message))\n } else {\n outro(chalk.red('An unexpected error occurred'))\n }\n process.exit(1)\n }\n}\n\nasync function configureLoadCommand(config: Config): Promise<void> {\n const dest = await text({\n message: 'Destination folder',\n placeholder: './src/i18n',\n initialValue: config.dest || './src/i18n',\n })\n\n if (isCancel(dest)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const format = await select({\n message: 'Output format',\n options: [\n { value: 'json', label: 'JSON' },\n { value: 'js', label: 'JavaScript (ES modules)' },\n { value: 'ts', label: 'TypeScript' },\n { value: 'yaml', label: 'YAML' },\n ],\n })\n\n if (isCancel(format)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const environment = await text({\n message: 'Environment',\n placeholder: 'production',\n initialValue: config.environment || 'production',\n })\n\n if (isCancel(environment)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const languages = await text({\n message: 'Specific languages (comma-separated, leave empty for all)',\n placeholder: 'en,es,fr',\n })\n\n if (isCancel(languages)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const finalConfig = {\n ...config,\n dest: dest as string,\n format: format as 'json' | 'js' | 'ts' | 'yaml',\n environment: environment as string,\n languages: languages ? (languages as string).split(',').map(l => l.trim()) : undefined\n }\n\n const s = spinner()\n s.start('Syncing translations...')\n \n try {\n const { syncTranslations } = await import('./commands/load.js')\n await syncTranslations(finalConfig)\n s.stop('Translations synced successfully!')\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to sync translations')\n }\n throw error\n }\n}\n\nasync function configureAddCommand(config: Config): Promise<void> {\n const key = await text({\n message: 'Translation key',\n placeholder: 'common.save',\n validate: (value) => {\n if (!value) return 'Translation key is required'\n },\n })\n\n if (isCancel(key)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const description = await text({\n message: 'Description (optional)',\n placeholder: 'Save button text',\n })\n\n if (isCancel(description)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const translationMethod = await select({\n message: 'How would you like to provide translations?',\n options: [\n { value: 'manual', label: 'Provide translations manually' },\n { value: 'auto', label: 'Auto-translate from source language' },\n ],\n })\n\n if (isCancel(translationMethod)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n let translations: Record<string, string> = {}\n let auto = false\n\n if (translationMethod === 'auto') {\n auto = true\n const sourceValue = await text({\n message: 'Source language value',\n placeholder: 'Save',\n validate: (value) => {\n if (!value) return 'Source value is required for auto-translation'\n },\n })\n\n if (isCancel(sourceValue)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n translations.en = sourceValue as string\n } else {\n const languages = ['en', 'es', 'fr', 'de', 'nl']\n \n for (const lang of languages) {\n const value = await text({\n message: `Translation for ${lang} (optional)`,\n placeholder: `Enter ${lang} translation`,\n })\n\n if (isCancel(value)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n if (value) {\n translations[lang] = value as string\n }\n }\n }\n\n const s = spinner()\n s.start('Adding translation key...')\n\n try {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n await client.addTranslationKey(key as string, translations)\n s.stop('Translation key added successfully!')\n \n if (auto) {\n console.log(chalk.cyan('\\n[AI] Auto-translation was enabled. Check the dashboard to review AI-generated translations.'))\n }\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to add translation key')\n }\n throw error\n }\n}\n\nasync function configureGetCommand(config: Config): Promise<void> {\n const infoType = await select({\n message: 'What information would you like to get?',\n options: [\n { value: 'project', label: 'Project information' },\n { value: 'languages', label: 'Languages' },\n { value: 'releases', label: 'Releases' },\n ],\n })\n\n if (isCancel(infoType)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const s = spinner()\n s.start('Fetching information...')\n\n try {\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n\n switch (infoType) {\n case 'project':\n const project = await client.getProject()\n s.stop('Project information:')\n console.log(` Name: ${project.project.name}`)\n console.log(` Key: ${project.project.key}`)\n console.log(` Source Language: ${project.project.source_language}`)\n break\n \n case 'languages':\n const languages = await client.getLanguages()\n s.stop('Languages:')\n languages.languages?.forEach((lang: any) => {\n const status = lang.enabled ? chalk.green('[ON]') : chalk.gray('[OFF]')\n console.log(` ${status} ${lang.language?.name || lang.language_code}`)\n })\n break\n \n case 'releases':\n const releases = await client.getReleases()\n s.stop('Recent releases:')\n releases.releases?.slice(0, 10).forEach((release: any) => {\n const current = release.is_current ? chalk.green(' [CURRENT]') : ''\n console.log(` ${release.version}${current}`)\n })\n break\n }\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to fetch information')\n }\n throw error\n }\n}\n\nasync function configureReleaseCommand(config: Config): Promise<void> {\n const action = await select({\n message: 'Release management',\n options: [\n { value: 'create', label: 'Create new release' },\n { value: 'list', label: 'List releases' },\n ],\n })\n\n if (isCancel(action)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const { LezuApiClient } = await import('./api.js')\n const client = new LezuApiClient(config)\n\n if (action === 'create') {\n const version = await text({\n message: 'Version',\n placeholder: '1.0.0',\n validate: (value) => {\n if (!value) return 'Version is required'\n },\n })\n\n if (isCancel(version)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const name = await text({\n message: 'Name (optional)',\n placeholder: 'Production Release',\n })\n\n if (isCancel(name)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const description = await text({\n message: 'Description (optional)',\n placeholder: 'Added new features...',\n })\n\n if (isCancel(description)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const setCurrent = await confirm({\n message: 'Set as current release?',\n })\n\n if (isCancel(setCurrent)) {\n cancel('Operation cancelled')\n process.exit(0)\n }\n\n const s = spinner()\n s.start('Creating release...')\n\n try {\n const release = await client.createRelease({\n version: version as string,\n name: name as string || undefined,\n description: description as string || undefined,\n reviewedOnly: false,\n })\n \n if (setCurrent) {\n await fetch(`${config.apiUrl}/v1/releases/${release.release.id}/current`, {\n method: 'PUT',\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n })\n }\n \n s.stop('Release created successfully!')\n console.log(` ID: ${release.release.id}`)\n console.log(` Version: ${release.release.version}`)\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to create release')\n }\n throw error\n }\n \n } else {\n const s = spinner()\n s.start('Fetching releases...')\n \n try {\n const releases = await client.getReleases()\n s.stop('Releases:')\n releases.releases?.forEach((release: any, index: number) => {\n const current = release.is_current ? chalk.green(' [CURRENT]') : ''\n console.log(` ${index + 1}. ${release.version}${current}`)\n })\n } catch (error) {\n if (error instanceof Error) {\n s.stop(`Failed: ${error.message}`)\n } else {\n s.stop('Failed to list releases')\n }\n throw error\n }\n }\n}"],"mappings":"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","names":["chalk","spinner","Command","chalk","ora","Command","chalk","spinner","ora","chalk","chalk","LezuApiClient","version","chalk"]}
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createLoadCommand,
3
3
  syncTranslations
4
- } from "./chunk-OAON7N5G.js";
4
+ } from "./chunk-6BO32UFM.js";
5
5
  import "./chunk-EDQCBUBB.js";
6
- import "./chunk-RW6LQ7VV.js";
6
+ import "./chunk-LLUQWDVH.js";
7
7
  export {
8
8
  createLoadCommand,
9
9
  syncTranslations
10
10
  };
11
- //# sourceMappingURL=load-P5I3TKON.js.map
11
+ //# sourceMappingURL=load-57MDNWD7.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lezu",
3
- "version": "0.0.31",
3
+ "version": "0.0.32",
4
4
  "description": "CLI tool for pulling translations from Lezu",
5
5
  "bin": {
6
6
  "lezu": "bin/lezu.js"
@@ -1,7 +0,0 @@
1
- import {
2
- LezuApiClient
3
- } from "./chunk-RW6LQ7VV.js";
4
- export {
5
- LezuApiClient
6
- };
7
- //# sourceMappingURL=api-GD4JWDDP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api.ts"],"sourcesContent":["import fetch from 'node-fetch'\nimport type { Config, ApiResponse, ReleaseResponse } from './types.js'\n\nexport class LezuApiClient {\n private config: Config\n\n constructor(config: Config) {\n this.config = config\n }\n\n private async request<T>(endpoint: string, options: any = {}): Promise<T> {\n const url = `${this.config.apiUrl}${endpoint}`\n \n // Log request details for debugging\n if (process.env.DEBUG || this.config.debug) {\n console.error(`\\n[Lezu CLI] Request Details:`)\n console.error(` URL: ${url}`)\n console.error(` Method: ${options.method || 'GET'}`)\n console.error(` Headers:`)\n console.error(` Authorization: Bearer ${this.config.apiKey?.substring(0, 10)}...`)\n console.error(` Content-Type: application/json`)\n if (options.body) {\n console.error(` Body: ${options.body}`)\n }\n }\n \n try {\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n ...options.headers\n }\n })\n\n if (!response.ok) {\n let errorMessage = ''\n \n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.error || errorData.message || errorText\n } catch {\n errorMessage = errorText\n }\n } catch {\n errorMessage = response.statusText\n }\n\n // Provide user-friendly error messages with details\n const errorDetails = `\\n\\nRequest failed:\n Endpoint: ${options.method || 'GET'} ${url}\n Status: ${response.status} ${response.statusText}\n Response: ${errorMessage || 'No error details provided'}\n \nTry running with DEBUG=true for more details.`\n\n if (response.status === 401) {\n throw new Error(`Authentication failed. Please check your API key.${errorDetails}`)\n } else if (response.status === 403) {\n throw new Error(`Access denied. Your API key may not have permission for this action.${errorDetails}`)\n } else if (response.status === 404) {\n throw new Error(`Resource not found. Please check your project ID and configuration.${errorDetails}`)\n } else if (response.status === 500) {\n // Check for common 500 errors\n if (errorMessage.includes('project') || errorMessage.includes('not found')) {\n throw new Error(`Project not found. Please verify your project ID is correct.${errorDetails}`)\n } else if (errorMessage.includes('invalid') || errorMessage.includes('malformed')) {\n throw new Error(`Invalid project ID format. Please check your configuration.${errorDetails}`)\n }\n throw new Error(`Server error: ${errorMessage || 'Internal server error'}${errorDetails}`)\n } else {\n throw new Error(`API error: ${errorMessage || response.statusText}${errorDetails}`)\n }\n }\n\n return response.json() as Promise<T>\n } catch (error) {\n if (error instanceof Error) {\n // Check for network errors\n if (error.message.includes('ENOTFOUND') || error.message.includes('ECONNREFUSED')) {\n throw new Error(`Cannot connect to Lezu API at ${this.config.apiUrl}. Please check your internet connection and API URL.`)\n }\n throw error\n }\n throw new Error('An unexpected error occurred')\n }\n }\n\n async getTranslations(): Promise<ApiResponse> {\n let endpoint = `/v1/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/projects/${this.config.projectId}/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":";AAAA,OAAO,WAAW;AAGX,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EAER,YAAY,QAAgB;AAC1B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAc,QAAW,UAAkB,UAAe,CAAC,GAAe;AACxE,UAAM,MAAM,GAAG,KAAK,OAAO,MAAM,GAAG,QAAQ;AAG5C,QAAI,QAAQ,IAAI,SAAS,KAAK,OAAO,OAAO;AAC1C,cAAQ,MAAM;AAAA,4BAA+B;AAC7C,cAAQ,MAAM,UAAU,GAAG,EAAE;AAC7B,cAAQ,MAAM,aAAa,QAAQ,UAAU,KAAK,EAAE;AACpD,cAAQ,MAAM,YAAY;AAC1B,cAAQ,MAAM,6BAA6B,KAAK,OAAO,QAAQ,UAAU,GAAG,EAAE,CAAC,KAAK;AACpF,cAAQ,MAAM,oCAAoC;AAClD,UAAI,QAAQ,MAAM;AAChB,gBAAQ,MAAM,WAAW,QAAQ,IAAI,EAAE;AAAA,MACzC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,GAAG;AAAA,QACH,SAAS;AAAA,UACP,iBAAiB,UAAU,KAAK,OAAO,MAAM;AAAA,UAC7C,gBAAgB;AAAA,UAChB,GAAG,QAAQ;AAAA,QACb;AAAA,MACF,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI,eAAe;AAEnB,YAAI;AACF,gBAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAI;AACF,kBAAM,YAAY,KAAK,MAAM,SAAS;AACtC,2BAAe,UAAU,SAAS,UAAU,WAAW;AAAA,UACzD,QAAQ;AACN,2BAAe;AAAA,UACjB;AAAA,QACF,QAAQ;AACN,yBAAe,SAAS;AAAA,QAC1B;AAGA,cAAM,eAAe;AAAA;AAAA;AAAA,cACf,QAAQ,UAAU,KAAK,IAAI,GAAG;AAAA,YAChC,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,cACpC,gBAAgB,2BAA2B;AAAA;AAAA;AAIjD,YAAI,SAAS,WAAW,KAAK;AAC3B,gBAAM,IAAI,MAAM,oDAAoD,YAAY,EAAE;AAAA,QACpF,WAAW,SAAS,WAAW,KAAK;AAClC,gBAAM,IAAI,MAAM,uEAAuE,YAAY,EAAE;AAAA,QACvG,WAAW,SAAS,WAAW,KAAK;AAClC,gBAAM,IAAI,MAAM,sEAAsE,YAAY,EAAE;AAAA,QACtG,WAAW,SAAS,WAAW,KAAK;AAElC,cAAI,aAAa,SAAS,SAAS,KAAK,aAAa,SAAS,WAAW,GAAG;AAC1E,kBAAM,IAAI,MAAM,+DAA+D,YAAY,EAAE;AAAA,UAC/F,WAAW,aAAa,SAAS,SAAS,KAAK,aAAa,SAAS,WAAW,GAAG;AACjF,kBAAM,IAAI,MAAM,8DAA8D,YAAY,EAAE;AAAA,UAC9F;AACA,gBAAM,IAAI,MAAM,iBAAiB,gBAAgB,uBAAuB,GAAG,YAAY,EAAE;AAAA,QAC3F,OAAO;AACL,gBAAM,IAAI,MAAM,cAAc,gBAAgB,SAAS,UAAU,GAAG,YAAY,EAAE;AAAA,QACpF;AAAA,MACF;AAEA,aAAO,SAAS,KAAK;AAAA,IACvB,SAAS,OAAO;AACd,UAAI,iBAAiB,OAAO;AAE1B,YAAI,MAAM,QAAQ,SAAS,WAAW,KAAK,MAAM,QAAQ,SAAS,cAAc,GAAG;AACjF,gBAAM,IAAI,MAAM,iCAAiC,KAAK,OAAO,MAAM,sDAAsD;AAAA,QAC3H;AACA,cAAM;AAAA,MACR;AACA,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,kBAAwC;AAC5C,QAAI,WAAW,uCAAuC,KAAK,OAAO,WAAW;AAE7E,QAAI,KAAK,OAAO,SAAS;AACvB,iBAAW,gBAAgB,KAAK,OAAO,OAAO;AAAA,IAChD;AAGA,QAAI,KAAK,OAAO,aAAa,KAAK,OAAO,UAAU,SAAS,GAAG;AAC7D,YAAM,SAAS,IAAI,gBAAgB;AACnC,WAAK,OAAO,UAAU,QAAQ,UAAQ,OAAO,OAAO,aAAa,IAAI,CAAC;AACtE,kBAAY,IAAI,OAAO,SAAS,CAAC;AAAA,IACnC;AAEA,UAAM,WAAW,MAAM,KAAK,QAAa,QAAQ;AAGjD,WAAO;AAAA,MACL,cAAc,SAAS,gBAAgB;AAAA,MACvC,MAAM;AAAA,QACJ,SAAS,SAAS;AAAA,QAClB,WAAW,SAAS,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACxD,WAAW,SAAS,aAAa,OAAO,KAAK,SAAS,gBAAgB,QAAQ;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAwC;AAC5C,WAAO,KAAK;AAAA,MACV,4BAA4B,KAAK,OAAO,WAAW;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,mBAA2C;AAC/C,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,YAAY;AACxC,UAAI,SAAS,YAAY,SAAS,SAAS,SAAS,GAAG;AAErD,eAAO,SAAS,SAAS,CAAC,EAAE;AAAA,MAC9B;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,KAAK,mCAAmC,KAAK;AACrD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,eAA6B;AACjC,WAAO,KAAK,QAAa,gBAAgB,KAAK,OAAO,SAAS,YAAY;AAAA,EAC5E;AAAA,EAEA,MAAM,kBAAkB,KAAa,cAAoD;AACvF,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,KAAK,aAAa,CAAC;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAc,gBAAwB,iBAA4D;AAEnH,UAAM,WAAW,MAAM,KAAK,QAAa,oCAAoC;AAAA,MAC3E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB,OAAO,CAAC,IAAI;AAAA,QACZ;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,WAAO,SAAS,aAAa,IAAI,KAAK,CAAC;AAAA,EACzC;AAAA,EAEA,MAAM,cAAc,OAKhB,CAAC,GAAiB;AACpB,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU;AAAA,UACnB,aAAa,KAAK,OAAO,eAAe;AAAA,UACxC,SAAS,KAAK,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,UAC9D,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,cAAc,KAAK,gBAAgB;AAAA,UACnC,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAA2B;AAC/B,WAAO,KAAK,QAAa,gBAAgB,KAAK,OAAO,SAAS,EAAE;AAAA,EAClE;AACF;","names":[]}
@@ -1,9 +0,0 @@
1
- import {
2
- createGetCommand
3
- } from "./chunk-BD3CX35B.js";
4
- import "./chunk-EDQCBUBB.js";
5
- import "./chunk-RW6LQ7VV.js";
6
- export {
7
- createGetCommand
8
- };
9
- //# sourceMappingURL=get-7NSON4EJ.js.map