@lionrapid/cli 0.1.0

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.
Files changed (130) hide show
  1. package/README.md +159 -0
  2. package/dist/adapters/android-xml.d.ts +20 -0
  3. package/dist/adapters/android-xml.d.ts.map +1 -0
  4. package/dist/adapters/android-xml.js +101 -0
  5. package/dist/adapters/android-xml.js.map +1 -0
  6. package/dist/adapters/arb.d.ts +17 -0
  7. package/dist/adapters/arb.d.ts.map +1 -0
  8. package/dist/adapters/arb.js +45 -0
  9. package/dist/adapters/arb.js.map +1 -0
  10. package/dist/adapters/content.d.ts +13 -0
  11. package/dist/adapters/content.d.ts.map +1 -0
  12. package/dist/adapters/content.js +24 -0
  13. package/dist/adapters/content.js.map +1 -0
  14. package/dist/adapters/index.d.ts +11 -0
  15. package/dist/adapters/index.d.ts.map +1 -0
  16. package/dist/adapters/index.js +34 -0
  17. package/dist/adapters/index.js.map +1 -0
  18. package/dist/adapters/ios-strings.d.ts +15 -0
  19. package/dist/adapters/ios-strings.d.ts.map +1 -0
  20. package/dist/adapters/ios-strings.js +54 -0
  21. package/dist/adapters/ios-strings.js.map +1 -0
  22. package/dist/adapters/json.d.ts +12 -0
  23. package/dist/adapters/json.d.ts.map +1 -0
  24. package/dist/adapters/json.js +31 -0
  25. package/dist/adapters/json.js.map +1 -0
  26. package/dist/adapters/nested.d.ts +9 -0
  27. package/dist/adapters/nested.d.ts.map +1 -0
  28. package/dist/adapters/nested.js +37 -0
  29. package/dist/adapters/nested.js.map +1 -0
  30. package/dist/adapters/po.d.ts +23 -0
  31. package/dist/adapters/po.d.ts.map +1 -0
  32. package/dist/adapters/po.js +197 -0
  33. package/dist/adapters/po.js.map +1 -0
  34. package/dist/adapters/types.d.ts +46 -0
  35. package/dist/adapters/types.d.ts.map +1 -0
  36. package/dist/adapters/types.js +16 -0
  37. package/dist/adapters/types.js.map +1 -0
  38. package/dist/adapters/xcstrings.d.ts +20 -0
  39. package/dist/adapters/xcstrings.d.ts.map +1 -0
  40. package/dist/adapters/xcstrings.js +77 -0
  41. package/dist/adapters/xcstrings.js.map +1 -0
  42. package/dist/adapters/xliff.d.ts +22 -0
  43. package/dist/adapters/xliff.d.ts.map +1 -0
  44. package/dist/adapters/xliff.js +83 -0
  45. package/dist/adapters/xliff.js.map +1 -0
  46. package/dist/adapters/yaml.d.ts +16 -0
  47. package/dist/adapters/yaml.d.ts.map +1 -0
  48. package/dist/adapters/yaml.js +51 -0
  49. package/dist/adapters/yaml.js.map +1 -0
  50. package/dist/api-client.d.ts +123 -0
  51. package/dist/api-client.d.ts.map +1 -0
  52. package/dist/api-client.js +236 -0
  53. package/dist/api-client.js.map +1 -0
  54. package/dist/cli.d.ts +24 -0
  55. package/dist/cli.d.ts.map +1 -0
  56. package/dist/cli.js +365 -0
  57. package/dist/cli.js.map +1 -0
  58. package/dist/commands/context.d.ts +38 -0
  59. package/dist/commands/context.d.ts.map +1 -0
  60. package/dist/commands/context.js +70 -0
  61. package/dist/commands/context.js.map +1 -0
  62. package/dist/commands/doctor.d.ts +27 -0
  63. package/dist/commands/doctor.d.ts.map +1 -0
  64. package/dist/commands/doctor.js +87 -0
  65. package/dist/commands/doctor.js.map +1 -0
  66. package/dist/commands/init.d.ts +36 -0
  67. package/dist/commands/init.d.ts.map +1 -0
  68. package/dist/commands/init.js +111 -0
  69. package/dist/commands/init.js.map +1 -0
  70. package/dist/commands/pull.d.ts +35 -0
  71. package/dist/commands/pull.d.ts.map +1 -0
  72. package/dist/commands/pull.js +123 -0
  73. package/dist/commands/pull.js.map +1 -0
  74. package/dist/commands/push.d.ts +37 -0
  75. package/dist/commands/push.d.ts.map +1 -0
  76. package/dist/commands/push.js +63 -0
  77. package/dist/commands/push.js.map +1 -0
  78. package/dist/commands/scan.d.ts +46 -0
  79. package/dist/commands/scan.d.ts.map +1 -0
  80. package/dist/commands/scan.js +68 -0
  81. package/dist/commands/scan.js.map +1 -0
  82. package/dist/commands/snapshot.d.ts +48 -0
  83. package/dist/commands/snapshot.d.ts.map +1 -0
  84. package/dist/commands/snapshot.js +52 -0
  85. package/dist/commands/snapshot.js.map +1 -0
  86. package/dist/commands/types.d.ts +38 -0
  87. package/dist/commands/types.d.ts.map +1 -0
  88. package/dist/commands/types.js +82 -0
  89. package/dist/commands/types.js.map +1 -0
  90. package/dist/commands/validate.d.ts +28 -0
  91. package/dist/commands/validate.d.ts.map +1 -0
  92. package/dist/commands/validate.js +48 -0
  93. package/dist/commands/validate.js.map +1 -0
  94. package/dist/config.d.ts +80 -0
  95. package/dist/config.d.ts.map +1 -0
  96. package/dist/config.js +279 -0
  97. package/dist/config.js.map +1 -0
  98. package/dist/exit-codes.d.ts +26 -0
  99. package/dist/exit-codes.d.ts.map +1 -0
  100. package/dist/exit-codes.js +42 -0
  101. package/dist/exit-codes.js.map +1 -0
  102. package/dist/index.d.ts +8 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +8 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/output.d.ts +29 -0
  107. package/dist/output.d.ts.map +1 -0
  108. package/dist/output.js +38 -0
  109. package/dist/output.js.map +1 -0
  110. package/dist/scan/canonical.d.ts +33 -0
  111. package/dist/scan/canonical.d.ts.map +1 -0
  112. package/dist/scan/canonical.js +57 -0
  113. package/dist/scan/canonical.js.map +1 -0
  114. package/dist/scan/discover.d.ts +13 -0
  115. package/dist/scan/discover.d.ts.map +1 -0
  116. package/dist/scan/discover.js +95 -0
  117. package/dist/scan/discover.js.map +1 -0
  118. package/dist/scan/scanner.d.ts +32 -0
  119. package/dist/scan/scanner.d.ts.map +1 -0
  120. package/dist/scan/scanner.js +137 -0
  121. package/dist/scan/scanner.js.map +1 -0
  122. package/dist/types-gen/extract.d.ts +22 -0
  123. package/dist/types-gen/extract.d.ts.map +1 -0
  124. package/dist/types-gen/extract.js +148 -0
  125. package/dist/types-gen/extract.js.map +1 -0
  126. package/dist/types-gen/generate.d.ts +10 -0
  127. package/dist/types-gen/generate.d.ts.map +1 -0
  128. package/dist/types-gen/generate.js +39 -0
  129. package/dist/types-gen/generate.js.map +1 -0
  130. package/package.json +71 -0
package/dist/cli.js ADDED
@@ -0,0 +1,365 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @lionrapid/cli — sync translation files (iOS, Android, Flutter, JSON, YAML,
4
+ * PO) with the LionRapid backend.
5
+ *
6
+ * This file wires up the command surface. Each command's behaviour lives in
7
+ * `src/commands/*`; commands not yet implemented print a clear "not implemented
8
+ * yet" notice and exit non-zero so scripts never silently succeed.
9
+ */
10
+ import { Command } from 'commander';
11
+ import { readFileSync } from 'node:fs';
12
+ import { dirname, join } from 'node:path';
13
+ import { fileURLToPath } from 'node:url';
14
+ import { ConfigError, ApiKeyError } from './config.js';
15
+ import { ApiError, NetworkError } from './api-client.js';
16
+ import { ExitCode, exitCodeForError } from './exit-codes.js';
17
+ import { emitJson, errorEnvelope } from './output.js';
18
+ import { loadContext, loadOfflineContext } from './commands/context.js';
19
+ import { runInit } from './commands/init.js';
20
+ import { runPush } from './commands/push.js';
21
+ import { runPull } from './commands/pull.js';
22
+ import { runValidate } from './commands/validate.js';
23
+ import { runTypesGenerate, runTypesGenerateServer, runTypesCheck } from './commands/types.js';
24
+ import { runScan, seedFromScan } from './commands/scan.js';
25
+ import { runSnapshot } from './commands/snapshot.js';
26
+ import { runDoctor } from './commands/doctor.js';
27
+ /**
28
+ * Read the package version at runtime from package.json. We deliberately do
29
+ * NOT hardcode the version (the previous `@lionrapid/types` CLI did, and it
30
+ * drifted) — `../package.json` resolves correctly both from `dist/cli.js` and
31
+ * from `src/cli.ts` under vitest, since both sit one level below the package
32
+ * root.
33
+ */
34
+ export function readVersion() {
35
+ const here = dirname(fileURLToPath(import.meta.url));
36
+ const pkg = JSON.parse(readFileSync(join(here, '../package.json'), 'utf8'));
37
+ return pkg.version ?? '0.0.0';
38
+ }
39
+ /**
40
+ * Print a friendly error and exit with the taxonomy code for its class. Human
41
+ * prose always goes to stderr; under `--json`, a structured error envelope is
42
+ * also written to stdout so agents get a parseable failure on the data channel.
43
+ */
44
+ function fail(err, ctx = {}) {
45
+ if (err instanceof ConfigError || err instanceof ApiKeyError) {
46
+ console.error(`✖ ${err.message}`);
47
+ }
48
+ else if (err instanceof NetworkError) {
49
+ console.error(`✖ ${err.message}`);
50
+ console.error(' The server could not be reached — check your connection and the server URL.');
51
+ }
52
+ else if (err instanceof ApiError) {
53
+ console.error(`✖ API error ${err.status}: ${err.message}`);
54
+ if (err.isAuth)
55
+ console.error(' Check your LIONRAPID_API_KEY.');
56
+ }
57
+ else {
58
+ console.error(`✖ ${err instanceof Error ? err.message : String(err)}`);
59
+ }
60
+ if (ctx.json) {
61
+ process.stdout.write(`${JSON.stringify(errorEnvelope(ctx.command ?? 'lionrapid', err), null, 2)}\n`);
62
+ }
63
+ process.exit(exitCodeForError(err));
64
+ }
65
+ /**
66
+ * Build the commander program. Exported (rather than parsed inline) so tests
67
+ * can construct and inspect the program without executing it.
68
+ */
69
+ export function buildProgram() {
70
+ const program = new Command();
71
+ program
72
+ .name('lionrapid')
73
+ .description('Sync translation files (iOS, Android, Flutter, JSON, YAML, PO) with the LionRapid backend')
74
+ .version(readVersion(), '-v, --version', 'output the current version');
75
+ program
76
+ .command('init')
77
+ .description('Scaffold a lionrapid.yml config in the current project')
78
+ .option('--project <id>', 'project id')
79
+ .option('--server <url>', 'API server URL')
80
+ .option('--source <locale>', 'source locale')
81
+ .option('--targets <list>', 'comma-separated target locales')
82
+ .option('--force', 'overwrite an existing lionrapid.yml')
83
+ .action((options) => {
84
+ try {
85
+ const res = runInit(process.cwd(), {
86
+ project: options.project,
87
+ server: options.server,
88
+ sourceLocale: options.source,
89
+ targetLocales: options.targets?.split(',').map((s) => s.trim()),
90
+ force: options.force,
91
+ });
92
+ console.log(`✓ wrote ${res.configPath}`);
93
+ console.log(` detected: ${res.detected.stacks.join(', ')}`);
94
+ console.log(' edit the project id + locales, then run `lionrapid push`.');
95
+ }
96
+ catch (err) {
97
+ fail(err);
98
+ }
99
+ });
100
+ program
101
+ .command('push')
102
+ .description('Upload source strings to the LionRapid backend')
103
+ .option('--target <locale>', 'push an already-translated target locale instead of the source')
104
+ .option('--publish', 'in --target mode, mark pushed rows ready (public)')
105
+ .option('--dry-run', 'parse + count what would be pushed, but make no network calls')
106
+ .option('--json', 'emit the result as JSON on stdout (prose to stderr)')
107
+ .option('-c, --config <path>', 'path to lionrapid.yml')
108
+ .action(async (options) => {
109
+ try {
110
+ const ctx = loadContext({ config: options.config });
111
+ const res = await runPush(ctx.config, ctx.client, {
112
+ cwd: ctx.cwd,
113
+ target: options.target,
114
+ publish: options.publish,
115
+ dryRun: options.dryRun,
116
+ });
117
+ const out = options.json ? console.error : console.log;
118
+ const tag = res.dryRun ? '[dry-run] would push' : '✓ pushed';
119
+ out(`${tag} ${res.pushed} ${res.mode} string(s) across ${res.files.length} file(s)`);
120
+ for (const f of res.files) {
121
+ out(` ${f.skipped ? '· skipped (missing)' : '·'} ${f.file}: ${f.count}`);
122
+ }
123
+ if (res.publishSkipped) {
124
+ out('⚠ uploaded as drafts but not published — publishing needs an editor session token.\n' +
125
+ ' Set LIONRAPID_EDITOR_TOKEN, or publish in the dashboard.');
126
+ }
127
+ if (options.json)
128
+ emitJson('push', true, res);
129
+ }
130
+ catch (err) {
131
+ fail(err, { json: options.json, command: 'push' });
132
+ }
133
+ });
134
+ program
135
+ .command('pull')
136
+ .description('Download translations and write them into target files')
137
+ .option('-c, --config <path>', 'path to lionrapid.yml')
138
+ .option('--types', 'regenerate TypeScript types after pulling')
139
+ .option('--dry-run', 'fetch + count what would be written, but write no files')
140
+ .option('--json', 'emit the result as JSON on stdout (prose to stderr)')
141
+ .action(async (options) => {
142
+ try {
143
+ const ctx = loadContext({ config: options.config });
144
+ const res = await runPull(ctx.config, ctx.client, {
145
+ cwd: ctx.cwd,
146
+ dryRun: options.dryRun,
147
+ onProgress: (done, total) => {
148
+ // Interactive feedback only — never pollute CI logs or --json stdout.
149
+ if (process.stderr.isTTY && total > 1) {
150
+ process.stderr.write(`\r fetching ${done}/${total}…`);
151
+ if (done === total)
152
+ process.stderr.write('\r\x1b[K');
153
+ }
154
+ },
155
+ });
156
+ const out = options.json ? console.error : console.log;
157
+ const mark = res.dryRun ? '[dry-run]' : '✓';
158
+ for (const loc of res.locales) {
159
+ const pending = loc.pending > 0 ? ` (${loc.pending} pending)` : '';
160
+ out(`${mark} ${loc.locale}${pending}`);
161
+ for (const f of loc.files) {
162
+ out(` · ${f.target}: ${f.count}${res.dryRun ? ' (not written)' : ''}`);
163
+ }
164
+ }
165
+ let types;
166
+ if ((options.types || ctx.config.generateTypes) && !options.dryRun) {
167
+ types = runTypesGenerate(ctx.config, { cwd: ctx.cwd });
168
+ out(`✓ types: ${types.keys} key(s) → ${types.output}`);
169
+ }
170
+ if (options.json)
171
+ emitJson('pull', true, { ...res, types });
172
+ }
173
+ catch (err) {
174
+ fail(err, { json: options.json, command: 'pull' });
175
+ }
176
+ });
177
+ program
178
+ .command('validate')
179
+ .description('Check local files against the backend for missing/extra keys')
180
+ .option('-c, --config <path>', 'path to lionrapid.yml')
181
+ .option('--ci', 'exit non-zero if any issue is found')
182
+ .option('--json', 'emit the result as JSON on stdout (prose to stderr)')
183
+ .action(async (options) => {
184
+ try {
185
+ const ctx = loadContext({ config: options.config });
186
+ const res = await runValidate(ctx.config, ctx.client, { cwd: ctx.cwd });
187
+ const out = options.json ? console.error : console.log;
188
+ if (res.ok) {
189
+ out(`✓ all ${res.sourceKeys} source key(s) translated across target locales`);
190
+ }
191
+ else {
192
+ out(`✖ ${res.issues.length} issue(s):`);
193
+ for (const i of res.issues) {
194
+ out(` [${i.type}] ${i.locale}/${i.namespace} ${i.key}`);
195
+ }
196
+ }
197
+ if (options.json)
198
+ emitJson('validate', res.ok, res);
199
+ if (!res.ok && options.ci)
200
+ process.exit(ExitCode.VALIDATION);
201
+ }
202
+ catch (err) {
203
+ fail(err, { json: options.json, command: 'validate' });
204
+ }
205
+ });
206
+ const types = program
207
+ .command('types')
208
+ .description('Generate TypeScript types from your translations');
209
+ types
210
+ .command('generate')
211
+ .description('Generate a .d.ts of typed translation keys from your source files')
212
+ .option('-o, --output <path>', 'output path for the .d.ts')
213
+ .option('--strict-icu', 'fail if an ICU plural/select is missing its "other" arm')
214
+ .option('--server', 'fetch the source-locale schema from the backend instead of local files')
215
+ .option('--json', 'emit the result as JSON on stdout (prose to stderr)')
216
+ .option('-c, --config <path>', 'path to lionrapid.yml')
217
+ .action(async (options) => {
218
+ try {
219
+ const genOpts = { output: options.output, strictIcu: options.strictIcu };
220
+ let res;
221
+ if (options.server) {
222
+ const ctx = loadContext({ config: options.config });
223
+ res = await runTypesGenerateServer(ctx.config, ctx.client, {
224
+ cwd: ctx.cwd,
225
+ ...genOpts,
226
+ });
227
+ }
228
+ else {
229
+ const ctx = loadOfflineContext({ config: options.config });
230
+ res = runTypesGenerate(ctx.config, { cwd: ctx.cwd, ...genOpts });
231
+ }
232
+ (options.json ? console.error : console.log)(`✓ generated ${res.keys} key(s) → ${res.output}`);
233
+ if (options.json)
234
+ emitJson('types:generate', true, res);
235
+ }
236
+ catch (err) {
237
+ fail(err, { json: options.json, command: 'types:generate' });
238
+ }
239
+ });
240
+ types
241
+ .command('check')
242
+ .description('Report ICU issues in your source translations')
243
+ .option('--json', 'emit the result as JSON on stdout (prose to stderr)')
244
+ .option('-c, --config <path>', 'path to lionrapid.yml')
245
+ .action((options) => {
246
+ try {
247
+ const ctx = loadOfflineContext({ config: options.config });
248
+ const res = runTypesCheck(ctx.config, { cwd: ctx.cwd });
249
+ const out = options.json ? console.error : console.log;
250
+ if (res.issues.length === 0) {
251
+ out(`✓ ${res.keys} key(s), no ICU issues`);
252
+ }
253
+ else {
254
+ out(`✖ ${res.issues.length} ICU issue(s):`);
255
+ for (const i of res.issues)
256
+ out(` ${i}`);
257
+ }
258
+ if (options.json)
259
+ emitJson('types:check', res.issues.length === 0, res);
260
+ if (res.issues.length > 0)
261
+ process.exit(ExitCode.VALIDATION);
262
+ }
263
+ catch (err) {
264
+ fail(err, { json: options.json, command: 'types:check' });
265
+ }
266
+ });
267
+ program
268
+ .command('scan')
269
+ .description('Find candidate user-facing strings in source (no-library localization)')
270
+ .option('--json', 'emit the inventory as JSON on stdout (prose goes to stderr)')
271
+ .option('--include <globs>', 'comma-separated include globs (overrides config)')
272
+ .option('--push', 'seed the wrap candidates to the backend under their auto_key')
273
+ .option('-c, --config <path>', 'path to lionrapid.yml')
274
+ .action(async (options) => {
275
+ try {
276
+ const include = options.include
277
+ ? options.include.split(',').map((s) => s.trim())
278
+ : undefined;
279
+ // Scanning is offline; --push additionally needs an API key + client.
280
+ const offline = loadOfflineContext({ config: options.config });
281
+ const res = await runScan(offline.config, { cwd: offline.cwd, include });
282
+ // Agent-friendly contract: machine output on stdout, human prose on stderr.
283
+ if (options.json) {
284
+ process.stdout.write(`${JSON.stringify(res, null, 2)}\n`);
285
+ }
286
+ const s = res.summary;
287
+ console.error(`scanned ${s.files} file(s): ${s.wrap} wrap, ${s.review} review, ${s.uniqueKeys} unique key(s)`);
288
+ if (!options.json) {
289
+ for (const c of res.candidates) {
290
+ const key = c.autoKey ? ` ${c.autoKey}` : '';
291
+ console.error(` [${c.action}] ${c.file}:${c.line} ${c.sink} "${c.text.slice(0, 48)}"${key}`);
292
+ }
293
+ }
294
+ if (options.push) {
295
+ const ctx = loadContext({ config: options.config });
296
+ const seed = await seedFromScan(res, ctx.client, {
297
+ sourceLocale: ctx.config.sourceLocale,
298
+ namespace: ctx.config.namespace,
299
+ });
300
+ console.error(`✓ seeded ${seed.pushed} source string(s) under auto_key`);
301
+ }
302
+ }
303
+ catch (err) {
304
+ fail(err, { json: options.json, command: 'scan' });
305
+ }
306
+ });
307
+ program
308
+ .command('snapshot')
309
+ .description('Write raw offline-resilience snapshots (ContentUnit bundles) per locale/namespace')
310
+ .option('-o, --out <dir>', 'output directory for snapshots', 'snapshots')
311
+ .option('--json', 'emit the result as JSON on stdout (prose to stderr)')
312
+ .option('-c, --config <path>', 'path to lionrapid.yml')
313
+ .action(async (options) => {
314
+ try {
315
+ const ctx = loadContext({ config: options.config });
316
+ const res = await runSnapshot(ctx.config, ctx.client, {
317
+ cwd: ctx.cwd,
318
+ out: options.out,
319
+ });
320
+ console.error(`✓ wrote ${res.files.length} snapshot(s) → ${options.out ?? 'snapshots'}/`);
321
+ for (const f of res.files)
322
+ console.error(` · ${f.path}: ${f.keys} key(s)`);
323
+ if (res.skipped.length > 0) {
324
+ console.error(` (${res.skipped.length} locale/namespace skipped — nothing published yet)`);
325
+ }
326
+ if (options.json)
327
+ emitJson('snapshot', true, res);
328
+ }
329
+ catch (err) {
330
+ fail(err, { json: options.json, command: 'snapshot' });
331
+ }
332
+ });
333
+ program
334
+ .command('doctor')
335
+ .description('Check config, credentials, and backend connectivity')
336
+ .option('--json', 'emit the result as JSON on stdout (prose to stderr)')
337
+ .option('-c, --config <path>', 'path to lionrapid.yml')
338
+ .action(async (options) => {
339
+ try {
340
+ const res = await runDoctor({ cwd: process.cwd(), config: options.config });
341
+ const out = options.json ? console.error : console.log;
342
+ for (const c of res.checks)
343
+ out(`${c.ok ? '✓' : '✖'} ${c.name}: ${c.detail}`);
344
+ out(res.ok ? '✓ all checks passed' : '✖ some checks failed');
345
+ if (options.json)
346
+ emitJson('doctor', res.ok, res);
347
+ if (!res.ok)
348
+ process.exit(ExitCode.VALIDATION);
349
+ }
350
+ catch (err) {
351
+ fail(err, { json: options.json, command: 'doctor' });
352
+ }
353
+ });
354
+ return program;
355
+ }
356
+ /* Run only when executed directly as a binary (never when imported by tests). */
357
+ if (import.meta.url === `file://${process.argv[1]}`) {
358
+ buildProgram()
359
+ .parseAsync(process.argv)
360
+ .catch((err) => {
361
+ console.error(err instanceof Error ? err.message : String(err));
362
+ process.exit(1);
363
+ });
364
+ }
365
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Shared command bootstrap: locate + load the config, resolve the API key, and
3
+ * build the API client. Kept separate from the commander wiring so command
4
+ * logic can be driven with a fake client in tests.
5
+ */
6
+ import { type LionRapidConfig } from '../config.js';
7
+ import { LionRapidApiClient } from '../api-client.js';
8
+ export interface ContextOptions {
9
+ config?: string;
10
+ cwd?: string;
11
+ }
12
+ export interface CliContext {
13
+ config: LionRapidConfig;
14
+ client: LionRapidApiClient;
15
+ cwd: string;
16
+ }
17
+ export interface OfflineContext {
18
+ config: LionRapidConfig;
19
+ cwd: string;
20
+ }
21
+ /** Load + validate config only (no API key) — for offline commands like `types`. */
22
+ export declare function loadOfflineContext(opts?: ContextOptions): OfflineContext;
23
+ /** Load config + resolve the API key + build the client — for networked commands. */
24
+ export declare function loadContext(opts?: ContextOptions): CliContext;
25
+ /** Read LIONRAPID_RETRIES (a non-negative integer) if set; otherwise the client default. */
26
+ export declare function resolveRetries(): number | undefined;
27
+ export declare function chunk<T>(items: T[], size: number): T[][];
28
+ /** Default parallel in-flight requests for fan-out work (pull). */
29
+ export declare const DEFAULT_CONCURRENCY = 6;
30
+ /** Read LIONRAPID_CONCURRENCY (a positive integer) if set; else the default. */
31
+ export declare function resolveConcurrency(): number;
32
+ /**
33
+ * Run `fn` over `items` with at most `limit` promises in flight, preserving
34
+ * input order in the results. No dependency — a fixed pool of workers pulling
35
+ * from a shared cursor.
36
+ */
37
+ export declare function mapLimit<T, R>(items: T[], limit: number, fn: (item: T, index: number) => Promise<R>): Promise<R[]>;
38
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,eAAe,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,cAAmB,GAAG,cAAc,CAS5E;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,IAAI,GAAE,cAAmB,GAAG,UAAU,CAYjE;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAKnD;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAIxD;AAED,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,gFAAgF;AAChF,wBAAgB,kBAAkB,IAAI,MAAM,CAI3C;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,CAAC,EACjC,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,EAAE,CAAC,CAWd"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Shared command bootstrap: locate + load the config, resolve the API key, and
3
+ * build the API client. Kept separate from the commander wiring so command
4
+ * logic can be driven with a fake client in tests.
5
+ */
6
+ import { findConfigPath, loadConfig, resolveApiKey, ConfigError, } from '../config.js';
7
+ import { LionRapidApiClient } from '../api-client.js';
8
+ /** Load + validate config only (no API key) — for offline commands like `types`. */
9
+ export function loadOfflineContext(opts = {}) {
10
+ const cwd = opts.cwd ?? process.cwd();
11
+ const path = opts.config ?? findConfigPath(cwd);
12
+ if (!path) {
13
+ throw new ConfigError('No lionrapid.yml found in this directory. Run `lionrapid init` to create one.');
14
+ }
15
+ return { config: loadConfig(path), cwd };
16
+ }
17
+ /** Load config + resolve the API key + build the client — for networked commands. */
18
+ export function loadContext(opts = {}) {
19
+ const { config, cwd } = loadOfflineContext(opts);
20
+ const apiKey = resolveApiKey({ server: config.server });
21
+ // Optional editor session token (es_...) for publishing (mark-ready).
22
+ const editorToken = process.env['LIONRAPID_EDITOR_TOKEN']?.trim() || undefined;
23
+ const client = new LionRapidApiClient({
24
+ baseUrl: config.server,
25
+ apiKey,
26
+ editorToken,
27
+ retries: resolveRetries(),
28
+ });
29
+ return { config, client, cwd };
30
+ }
31
+ /** Read LIONRAPID_RETRIES (a non-negative integer) if set; otherwise the client default. */
32
+ export function resolveRetries() {
33
+ const raw = process.env['LIONRAPID_RETRIES']?.trim();
34
+ if (!raw)
35
+ return undefined;
36
+ const n = Number(raw);
37
+ return Number.isInteger(n) && n >= 0 ? n : undefined;
38
+ }
39
+ export function chunk(items, size) {
40
+ const out = [];
41
+ for (let i = 0; i < items.length; i += size)
42
+ out.push(items.slice(i, i + size));
43
+ return out;
44
+ }
45
+ /** Default parallel in-flight requests for fan-out work (pull). */
46
+ export const DEFAULT_CONCURRENCY = 6;
47
+ /** Read LIONRAPID_CONCURRENCY (a positive integer) if set; else the default. */
48
+ export function resolveConcurrency() {
49
+ const raw = process.env['LIONRAPID_CONCURRENCY']?.trim();
50
+ const n = raw ? Number(raw) : NaN;
51
+ return Number.isInteger(n) && n > 0 ? n : DEFAULT_CONCURRENCY;
52
+ }
53
+ /**
54
+ * Run `fn` over `items` with at most `limit` promises in flight, preserving
55
+ * input order in the results. No dependency — a fixed pool of workers pulling
56
+ * from a shared cursor.
57
+ */
58
+ export async function mapLimit(items, limit, fn) {
59
+ const results = new Array(items.length);
60
+ let cursor = 0;
61
+ const size = Math.max(1, Math.min(limit, items.length || 1));
62
+ const worker = async () => {
63
+ for (let i = cursor++; i < items.length; i = cursor++) {
64
+ results[i] = await fn(items[i], i);
65
+ }
66
+ };
67
+ await Promise.all(Array.from({ length: size }, worker));
68
+ return results;
69
+ }
70
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `doctor` — preflight the local setup and the backend connection, reporting
3
+ * each check independently so a misconfigured project gets an actionable list
4
+ * instead of a single stack trace. Never throws: every stage is caught and
5
+ * turned into a failed check.
6
+ *
7
+ * Checks: config found + valid → API key resolvable → server reachable + the
8
+ * token works (ping) → declared source files present.
9
+ */
10
+ import { type FetchImpl } from '../api-client.js';
11
+ export interface DoctorCheck {
12
+ name: string;
13
+ ok: boolean;
14
+ detail: string;
15
+ }
16
+ export interface DoctorResult {
17
+ ok: boolean;
18
+ checks: DoctorCheck[];
19
+ }
20
+ export interface DoctorOptions {
21
+ cwd: string;
22
+ config?: string;
23
+ /** Injectable fetch for tests; defaults to the client's global fetch. */
24
+ fetchImpl?: FetchImpl;
25
+ }
26
+ export declare function runDoctor(opts: DoctorOptions): Promise<DoctorResult>;
27
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAMD,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAsE1E"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * `doctor` — preflight the local setup and the backend connection, reporting
3
+ * each check independently so a misconfigured project gets an actionable list
4
+ * instead of a single stack trace. Never throws: every stage is caught and
5
+ * turned into a failed check.
6
+ *
7
+ * Checks: config found + valid → API key resolvable → server reachable + the
8
+ * token works (ping) → declared source files present.
9
+ */
10
+ import { existsSync } from 'node:fs';
11
+ import { resolve } from 'node:path';
12
+ import { findConfigPath, loadConfig, resolveApiKey, } from '../config.js';
13
+ import { LionRapidApiClient } from '../api-client.js';
14
+ function msg(err) {
15
+ return err instanceof Error ? err.message.split('\n')[0] : String(err);
16
+ }
17
+ export async function runDoctor(opts) {
18
+ const checks = [];
19
+ // 1. Config present + valid.
20
+ let config;
21
+ try {
22
+ const path = opts.config ?? findConfigPath(opts.cwd);
23
+ if (!path) {
24
+ checks.push({
25
+ name: 'config',
26
+ ok: false,
27
+ detail: 'no lionrapid.yml found — run `lionrapid init`',
28
+ });
29
+ }
30
+ else {
31
+ config = loadConfig(path);
32
+ checks.push({
33
+ name: 'config',
34
+ ok: true,
35
+ detail: `${path} · ${config.files.length} file entr${config.files.length === 1 ? 'y' : 'ies'}, ${config.targetLocales.length} target locale(s)`,
36
+ });
37
+ }
38
+ }
39
+ catch (err) {
40
+ checks.push({ name: 'config', ok: false, detail: msg(err) });
41
+ }
42
+ // 2. API key resolvable (never print the key itself).
43
+ let apiKey;
44
+ try {
45
+ apiKey = resolveApiKey({ server: config?.server });
46
+ checks.push({ name: 'apiKey', ok: true, detail: 'resolved from env/credentials' });
47
+ }
48
+ catch (err) {
49
+ checks.push({ name: 'apiKey', ok: false, detail: msg(err) });
50
+ }
51
+ // 3. Server reachable + token accepted (no retries — doctor wants fast feedback).
52
+ if (config && apiKey) {
53
+ try {
54
+ const client = new LionRapidApiClient({
55
+ baseUrl: config.server,
56
+ apiKey,
57
+ retries: 0,
58
+ fetchImpl: opts.fetchImpl,
59
+ });
60
+ const res = await client.ping();
61
+ checks.push({
62
+ name: 'server',
63
+ ok: true,
64
+ detail: `${config.server} reachable · ${res.isPmAdmin ? 'pm-admin' : 'integration'} token`,
65
+ });
66
+ }
67
+ catch (err) {
68
+ checks.push({ name: 'server', ok: false, detail: msg(err) });
69
+ }
70
+ }
71
+ else {
72
+ checks.push({ name: 'server', ok: false, detail: 'skipped — needs config + API key' });
73
+ }
74
+ // 4. Declared source files exist on disk.
75
+ if (config) {
76
+ const missing = config.files.filter((f) => !existsSync(resolve(opts.cwd, f.source)));
77
+ checks.push({
78
+ name: 'sources',
79
+ ok: missing.length === 0,
80
+ detail: missing.length === 0
81
+ ? `${config.files.length} source file(s) present`
82
+ : `${missing.length} missing: ${missing.map((f) => f.source).join(', ')}`,
83
+ });
84
+ }
85
+ return { ok: checks.every((c) => c.ok), checks };
86
+ }
87
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}