@lionrapid/cli 0.2.0 → 0.2.2

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 (98) hide show
  1. package/CHANGELOG.md +191 -0
  2. package/README.md +38 -3
  3. package/dist/adapters/android-xml.js +29 -6
  4. package/dist/adapters/json.d.ts +2 -2
  5. package/dist/adapters/json.js +4 -3
  6. package/dist/adapters/nested.d.ts +7 -1
  7. package/dist/adapters/nested.js +23 -2
  8. package/dist/adapters/types.d.ts +2 -0
  9. package/dist/adapters/yaml.js +3 -3
  10. package/dist/api-client.d.ts +32 -0
  11. package/dist/api-client.js +106 -6
  12. package/dist/cli.d.ts +1 -2
  13. package/dist/cli.js +240 -21
  14. package/dist/commands/context.d.ts +9 -0
  15. package/dist/commands/context.js +28 -2
  16. package/dist/commands/doctor.d.ts +2 -1
  17. package/dist/commands/doctor.js +8 -4
  18. package/dist/commands/init.d.ts +44 -0
  19. package/dist/commands/init.js +0 -0
  20. package/dist/commands/login.d.ts +47 -0
  21. package/dist/commands/login.js +110 -0
  22. package/dist/commands/pull.d.ts +22 -0
  23. package/dist/commands/pull.js +140 -21
  24. package/dist/commands/push.d.ts +2 -0
  25. package/dist/commands/push.js +39 -16
  26. package/dist/commands/snapshot.js +3 -2
  27. package/dist/commands/types.js +2 -1
  28. package/dist/commands/validate.d.ts +5 -2
  29. package/dist/commands/validate.js +15 -2
  30. package/dist/config.d.ts +46 -1
  31. package/dist/config.js +209 -14
  32. package/dist/types-gen/extract.js +7 -1
  33. package/dist/types-gen/generate.js +9 -1
  34. package/package.json +2 -1
  35. package/dist/adapters/android-xml.d.ts.map +0 -1
  36. package/dist/adapters/android-xml.js.map +0 -1
  37. package/dist/adapters/arb.d.ts.map +0 -1
  38. package/dist/adapters/arb.js.map +0 -1
  39. package/dist/adapters/content.d.ts.map +0 -1
  40. package/dist/adapters/content.js.map +0 -1
  41. package/dist/adapters/index.d.ts.map +0 -1
  42. package/dist/adapters/index.js.map +0 -1
  43. package/dist/adapters/ios-strings.d.ts.map +0 -1
  44. package/dist/adapters/ios-strings.js.map +0 -1
  45. package/dist/adapters/json.d.ts.map +0 -1
  46. package/dist/adapters/json.js.map +0 -1
  47. package/dist/adapters/nested.d.ts.map +0 -1
  48. package/dist/adapters/nested.js.map +0 -1
  49. package/dist/adapters/po.d.ts.map +0 -1
  50. package/dist/adapters/po.js.map +0 -1
  51. package/dist/adapters/types.d.ts.map +0 -1
  52. package/dist/adapters/types.js.map +0 -1
  53. package/dist/adapters/xcstrings.d.ts.map +0 -1
  54. package/dist/adapters/xcstrings.js.map +0 -1
  55. package/dist/adapters/xliff.d.ts.map +0 -1
  56. package/dist/adapters/xliff.js.map +0 -1
  57. package/dist/adapters/yaml.d.ts.map +0 -1
  58. package/dist/adapters/yaml.js.map +0 -1
  59. package/dist/api-client.d.ts.map +0 -1
  60. package/dist/api-client.js.map +0 -1
  61. package/dist/cli.d.ts.map +0 -1
  62. package/dist/cli.js.map +0 -1
  63. package/dist/commands/context.d.ts.map +0 -1
  64. package/dist/commands/context.js.map +0 -1
  65. package/dist/commands/doctor.d.ts.map +0 -1
  66. package/dist/commands/doctor.js.map +0 -1
  67. package/dist/commands/init.d.ts.map +0 -1
  68. package/dist/commands/init.js.map +0 -1
  69. package/dist/commands/pull.d.ts.map +0 -1
  70. package/dist/commands/pull.js.map +0 -1
  71. package/dist/commands/push.d.ts.map +0 -1
  72. package/dist/commands/push.js.map +0 -1
  73. package/dist/commands/scan.d.ts.map +0 -1
  74. package/dist/commands/scan.js.map +0 -1
  75. package/dist/commands/snapshot.d.ts.map +0 -1
  76. package/dist/commands/snapshot.js.map +0 -1
  77. package/dist/commands/types.d.ts.map +0 -1
  78. package/dist/commands/types.js.map +0 -1
  79. package/dist/commands/validate.d.ts.map +0 -1
  80. package/dist/commands/validate.js.map +0 -1
  81. package/dist/config.d.ts.map +0 -1
  82. package/dist/config.js.map +0 -1
  83. package/dist/exit-codes.d.ts.map +0 -1
  84. package/dist/exit-codes.js.map +0 -1
  85. package/dist/index.d.ts.map +0 -1
  86. package/dist/index.js.map +0 -1
  87. package/dist/output.d.ts.map +0 -1
  88. package/dist/output.js.map +0 -1
  89. package/dist/scan/canonical.d.ts.map +0 -1
  90. package/dist/scan/canonical.js.map +0 -1
  91. package/dist/scan/discover.d.ts.map +0 -1
  92. package/dist/scan/discover.js.map +0 -1
  93. package/dist/scan/scanner.d.ts.map +0 -1
  94. package/dist/scan/scanner.js.map +0 -1
  95. package/dist/types-gen/extract.d.ts.map +0 -1
  96. package/dist/types-gen/extract.js.map +0 -1
  97. package/dist/types-gen/generate.d.ts.map +0 -1
  98. package/dist/types-gen/generate.js.map +0 -1
@@ -9,12 +9,13 @@
9
9
  */
10
10
  import type { LionRapidConfig } from '../config.js';
11
11
  import type { LionRapidApiClient } from '../api-client.js';
12
- export type ValidateIssueType = 'missing' | 'empty' | 'orphan';
12
+ export type ValidateIssueType = 'missing' | 'empty' | 'orphan' | 'locked';
13
13
  export interface ValidateIssue {
14
14
  locale: string;
15
15
  namespace: string;
16
16
  type: ValidateIssueType;
17
- key: string;
17
+ /** Absent for namespace-level issues (`locked`). */
18
+ key?: string;
18
19
  }
19
20
  export interface ValidateResult {
20
21
  ok: boolean;
@@ -23,6 +24,8 @@ export interface ValidateResult {
23
24
  }
24
25
  export interface ValidateOptions {
25
26
  cwd: string;
27
+ /** Treat locked (423) namespaces as a warning instead of a failure. */
28
+ allowLocked?: boolean;
26
29
  }
27
30
  export declare function runValidate(config: LionRapidConfig, client: LionRapidApiClient, opts: ValidateOptions): Promise<ValidateResult>;
28
31
  //# sourceMappingURL=validate.d.ts.map
@@ -29,6 +29,12 @@ export async function runValidate(config, client, opts) {
29
29
  for (const locale of config.targetLocales) {
30
30
  for (const [namespace, sourceKeys] of sourceByNs) {
31
31
  const bundle = await client.getNamespace(locale, namespace);
32
+ // A locked (423) namespace has nothing approved for delivery yet — one
33
+ // namespace-level issue, not N spurious `missing` per source key.
34
+ if (bundle.locked) {
35
+ issues.push({ locale, namespace, type: 'locked' });
36
+ continue;
37
+ }
32
38
  const translations = bundle.translations;
33
39
  const have = new Set(Object.keys(translations));
34
40
  for (const key of sourceKeys) {
@@ -36,13 +42,20 @@ export async function runValidate(config, client, opts) {
36
42
  issues.push({ locale, namespace, type: 'missing', key });
37
43
  }
38
44
  for (const [key, value] of Object.entries(translations)) {
39
- if (!value.text.trim())
45
+ // Defensive: a value that isn't a real ContentUnit counts as empty
46
+ // rather than crashing the run (the client normalizes these, but
47
+ // `validate` is also driven directly in tests and by embedders).
48
+ if (typeof value?.text !== 'string' || !value.text.trim()) {
40
49
  issues.push({ locale, namespace, type: 'empty', key });
50
+ }
41
51
  if (!sourceKeys.has(key))
42
52
  issues.push({ locale, namespace, type: 'orphan', key });
43
53
  }
44
54
  }
45
55
  }
46
- return { ok: issues.length === 0, sourceKeys: totalSourceKeys, issues };
56
+ // `locked` fails by default (nothing is deliverable); `allowLocked`
57
+ // downgrades it so brand-new namespaces don't block CI.
58
+ const blocking = opts.allowLocked ? issues.filter((i) => i.type !== 'locked') : issues;
59
+ return { ok: blocking.length === 0, sourceKeys: totalSourceKeys, issues };
47
60
  }
48
61
  //# sourceMappingURL=validate.js.map
package/dist/config.d.ts CHANGED
@@ -17,14 +17,29 @@ export type FileFormat = (typeof FILE_FORMATS)[number];
17
17
  * `target` path is one shared file and does not need a `{locale}` placeholder.
18
18
  */
19
19
  export declare const MULTI_LOCALE_FORMATS: ReadonlySet<FileFormat>;
20
- /** One source→target file mapping. `target` carries a `{locale}` placeholder. */
20
+ /**
21
+ * One source→target file mapping. `target` carries a `{locale}` placeholder.
22
+ *
23
+ * `source` may be a glob (`*`/`?`, e.g. `locales/en/*.json`); then `target`
24
+ * and `namespace` must carry a `{basename}` token, and the entry expands at
25
+ * config load ({@link expandGlobEntries}) into one concrete entry per matched
26
+ * file with `{basename}` replaced by the file's extension-less name.
27
+ */
21
28
  export interface FileEntry {
22
29
  format: FileFormat;
23
30
  source: string;
24
31
  target: string;
25
32
  /** Optional per-entry namespace override (defaults to the top-level namespace). */
26
33
  namespace?: string;
34
+ /**
35
+ * Write dotted keys flat on `pull` (JSON/YAML only): a pushed `hero.title`
36
+ * stays `"hero.title"` instead of re-nesting into `{hero: {title}}`, so
37
+ * flat-keyed consumers (CMS imports, webhook payloads) round-trip.
38
+ */
39
+ flat?: boolean;
27
40
  }
41
+ /** True when a `files[].source` is a glob pattern rather than a concrete path. */
42
+ export declare function isGlobSource(source: string): boolean;
28
43
  export interface LionRapidConfig {
29
44
  project: string;
30
45
  server: string;
@@ -60,8 +75,33 @@ export declare class ApiKeyError extends Error {
60
75
  export declare function findConfigPath(cwd?: string): string | null;
61
76
  /** Parse + validate a YAML config string into a typed config. */
62
77
  export declare function parseConfig(rawYaml: string): LionRapidConfig;
78
+ /**
79
+ * Expand glob `files` entries into one concrete entry per matched file: the
80
+ * match's extension-less basename substitutes the `{basename}` token in
81
+ * `target` and `namespace`. Non-glob entries pass through untouched; matches
82
+ * come back sorted (deterministic expansion). A glob matching nothing warns
83
+ * instead of silently vanishing — a typo'd pattern must not no-op a push.
84
+ *
85
+ * Called at config load (loadOfflineContext / doctor), so every command
86
+ * downstream only ever sees concrete entries.
87
+ */
88
+ export declare function expandGlobEntries(files: FileEntry[], cwd: string, warn?: (message: string) => void): FileEntry[];
63
89
  /** Read + parse + validate the config at `path`. */
64
90
  export declare function loadConfig(path: string): LionRapidConfig;
91
+ /** Where the CLI reads/writes credentials: `~/.lionrapid/credentials`. */
92
+ export declare function defaultCredentialsPath(): string;
93
+ /**
94
+ * Reject a key that can't travel in an HTTP header (fetch encodes headers as
95
+ * Latin-1 and throws an obscure ByteString error otherwise). The classic case
96
+ * is copying the dashboard's truncated key display, `sk_eng_…last4` — that
97
+ * ellipsis is U+2026, not part of the key.
98
+ */
99
+ export declare function assertKeyCharset(key: string): string;
100
+ /**
101
+ * Server URLs that have a scoped entry in the credentials file. Lets `init`
102
+ * default its server to the one you just logged into instead of asking again.
103
+ */
104
+ export declare function listCredentialServers(credentialsPath?: string): string[];
65
105
  export interface ResolveApiKeyOptions {
66
106
  /** Environment to read `LIONRAPID_API_KEY` from (defaults to process.env). */
67
107
  env?: NodeJS.ProcessEnv;
@@ -75,6 +115,11 @@ export interface ResolveApiKeyOptions {
75
115
  * 1. `LIONRAPID_API_KEY` environment variable
76
116
  * 2. credentials file (JSON: `{ "default": "sk_...", "<server>": "sk_..." }`)
77
117
  * The key is never read from `lionrapid.yml` (which is committed to git).
118
+ *
119
+ * Trust rule: the `default` credential is only handed out for recognized
120
+ * LionRapid hosts (`*.lionrapid.com`) and localhost. Any other server needs
121
+ * its own server-scoped entry — otherwise a committed lionrapid.yml pointing
122
+ * at an attacker host would exfiltrate the key of anyone running `push`.
78
123
  */
79
124
  export declare function resolveApiKey(opts?: ResolveApiKeyOptions): string;
80
125
  //# sourceMappingURL=config.d.ts.map
package/dist/config.js CHANGED
@@ -9,10 +9,11 @@
9
9
  * - `parseConfig(string)` is split from `loadConfig(path)` so the validator is
10
10
  * unit-testable without touching the filesystem.
11
11
  */
12
- import { existsSync, readFileSync } from 'node:fs';
12
+ import { existsSync, readFileSync, statSync } from 'node:fs';
13
13
  import { homedir } from 'node:os';
14
- import { join } from 'node:path';
14
+ import { basename, join } from 'node:path';
15
15
  import { parse as parseYaml } from 'yaml';
16
+ import { discoverFiles } from './scan/discover.js';
16
17
  /** Translation file formats the CLI can parse/serialize. */
17
18
  export const FILE_FORMATS = [
18
19
  'json',
@@ -29,6 +30,10 @@ export const FILE_FORMATS = [
29
30
  * `target` path is one shared file and does not need a `{locale}` placeholder.
30
31
  */
31
32
  export const MULTI_LOCALE_FORMATS = new Set(['xcstrings']);
33
+ /** True when a `files[].source` is a glob pattern rather than a concrete path. */
34
+ export function isGlobSource(source) {
35
+ return /[*?]/.test(source);
36
+ }
32
37
  /** Thrown when `lionrapid.yml` is missing, unparseable, or invalid. */
33
38
  export class ConfigError extends Error {
34
39
  issues;
@@ -49,6 +54,39 @@ export class ApiKeyError extends Error {
49
54
  }
50
55
  }
51
56
  const CONFIG_FILENAMES = ['lionrapid.yml', 'lionrapid.yaml'];
57
+ /** Hostnames allowed to use plain `http://` (local development only). */
58
+ const LOCAL_HOSTS = new Set(['localhost', '127.0.0.1', '[::1]']);
59
+ /**
60
+ * Hosts trusted to receive the credentials-file `default` key. Any other host
61
+ * needs an explicit server-scoped credentials entry — a committed lionrapid.yml
62
+ * must not be able to route the default key to an arbitrary server.
63
+ */
64
+ function isTrustedDefaultHost(server) {
65
+ let url;
66
+ try {
67
+ url = new URL(server);
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ const host = url.hostname;
73
+ return host === 'lionrapid.com' || host.endsWith('.lionrapid.com') || LOCAL_HOSTS.has(host);
74
+ }
75
+ /** Validate the `server` config value; returns an issue message or null if OK. */
76
+ function validateServerUrl(server) {
77
+ let url;
78
+ try {
79
+ url = new URL(server);
80
+ }
81
+ catch {
82
+ return 'must be a valid https:// URL (e.g. https://api.lionrapid.com)';
83
+ }
84
+ if (url.protocol === 'https:')
85
+ return null;
86
+ if (url.protocol === 'http:' && LOCAL_HOSTS.has(url.hostname))
87
+ return null;
88
+ return 'must be an https:// URL (plain http:// is allowed only for localhost)';
89
+ }
52
90
  /** Locate the config file in `cwd`, returning its path or null. */
53
91
  export function findConfigPath(cwd = process.cwd()) {
54
92
  for (const name of CONFIG_FILENAMES) {
@@ -77,11 +115,10 @@ function validateConfig(raw) {
77
115
  if (!isNonEmptyString(raw['server'])) {
78
116
  issues.push({ path: 'server', message: 'required non-empty string' });
79
117
  }
80
- else if (!/^https?:\/\//.test(raw['server'])) {
81
- issues.push({
82
- path: 'server',
83
- message: 'must be an http(s) URL (e.g. https://api.lionrapid.com)',
84
- });
118
+ else {
119
+ const serverIssue = validateServerUrl(raw['server']);
120
+ if (serverIssue)
121
+ issues.push({ path: 'server', message: serverIssue });
85
122
  }
86
123
  if (!isNonEmptyString(raw['sourceLocale'])) {
87
124
  issues.push({ path: 'sourceLocale', message: 'required non-empty string' });
@@ -195,16 +232,79 @@ function validateConfig(raw) {
195
232
  entryNs = entry['namespace'];
196
233
  }
197
234
  }
235
+ // flat (optional): only JSON/YAML re-nest dotted keys on serialize, so
236
+ // the flag is meaningless (and likely a config mistake) anywhere else.
237
+ let entryFlat;
238
+ if (entry['flat'] !== undefined) {
239
+ if (typeof entry['flat'] !== 'boolean') {
240
+ issues.push({ path: `${base}.flat`, message: 'must be a boolean when set' });
241
+ }
242
+ else if (validFormat && format !== 'json' && format !== 'yaml') {
243
+ issues.push({
244
+ path: `${base}.flat`,
245
+ message: `only meaningful for json/yaml (${String(format)} output is always flat)`,
246
+ });
247
+ }
248
+ else {
249
+ entryFlat = entry['flat'];
250
+ }
251
+ }
252
+ // Glob sources: {basename} must appear in target AND namespace (else the
253
+ // expansion is ambiguous — every match would collide); a concrete source
254
+ // must not use the token at all.
255
+ const src = entry['source'];
256
+ const tgt = entry['target'];
257
+ const glob = isNonEmptyString(src) && isGlobSource(src);
258
+ const srcHasBase = isNonEmptyString(src) && src.includes('{basename}');
259
+ const tgtHasBase = isNonEmptyString(tgt) && tgt.includes('{basename}');
260
+ const nsHasBase = entryNs?.includes('{basename}') ?? false;
261
+ if (srcHasBase) {
262
+ issues.push({
263
+ path: `${base}.source`,
264
+ message: 'the "{basename}" token is only valid in target/namespace',
265
+ });
266
+ }
267
+ if (glob) {
268
+ if (isNonEmptyString(tgt) && !tgtHasBase) {
269
+ issues.push({
270
+ path: `${base}.target`,
271
+ message: 'must contain the "{basename}" token when source is a glob',
272
+ });
273
+ }
274
+ if (!nsHasBase) {
275
+ issues.push({
276
+ path: `${base}.namespace`,
277
+ message: 'required for a glob source and must contain the "{basename}" token',
278
+ });
279
+ }
280
+ }
281
+ else {
282
+ if (tgtHasBase) {
283
+ issues.push({
284
+ path: `${base}.target`,
285
+ message: 'the "{basename}" token is only valid when source is a glob',
286
+ });
287
+ }
288
+ if (nsHasBase) {
289
+ issues.push({
290
+ path: `${base}.namespace`,
291
+ message: 'the "{basename}" token is only valid when source is a glob',
292
+ });
293
+ }
294
+ }
198
295
  // Only push a typed entry if its required fields are sound.
199
296
  if (validFormat &&
200
297
  isNonEmptyString(entry['source']) &&
201
298
  isNonEmptyString(entry['target']) &&
202
- (isMultiLocale || entry['target'].includes('{locale}'))) {
299
+ (isMultiLocale || entry['target'].includes('{locale}')) &&
300
+ !srcHasBase &&
301
+ (glob ? tgtHasBase && nsHasBase : !tgtHasBase && !nsHasBase)) {
203
302
  files.push({
204
303
  format: format,
205
304
  source: entry['source'],
206
305
  target: entry['target'],
207
306
  ...(entryNs ? { namespace: entryNs } : {}),
307
+ ...(entryFlat !== undefined ? { flat: entryFlat } : {}),
208
308
  });
209
309
  }
210
310
  });
@@ -238,6 +338,41 @@ export function parseConfig(rawYaml) {
238
338
  }
239
339
  return validateConfig(parsed);
240
340
  }
341
+ /**
342
+ * Expand glob `files` entries into one concrete entry per matched file: the
343
+ * match's extension-less basename substitutes the `{basename}` token in
344
+ * `target` and `namespace`. Non-glob entries pass through untouched; matches
345
+ * come back sorted (deterministic expansion). A glob matching nothing warns
346
+ * instead of silently vanishing — a typo'd pattern must not no-op a push.
347
+ *
348
+ * Called at config load (loadOfflineContext / doctor), so every command
349
+ * downstream only ever sees concrete entries.
350
+ */
351
+ export function expandGlobEntries(files, cwd, warn = (m) => console.error(m)) {
352
+ const out = [];
353
+ for (const entry of files) {
354
+ if (!isGlobSource(entry.source)) {
355
+ out.push(entry);
356
+ continue;
357
+ }
358
+ const matches = discoverFiles(cwd, { include: [entry.source] });
359
+ if (matches.length === 0) {
360
+ warn(`warning: files entry "${entry.source}" matched no files`);
361
+ continue;
362
+ }
363
+ for (const rel of matches) {
364
+ const base = basename(rel).replace(/\.[^.]*$/, '');
365
+ out.push({
366
+ format: entry.format,
367
+ source: rel,
368
+ target: entry.target.replaceAll('{basename}', base),
369
+ namespace: (entry.namespace ?? '{basename}').replaceAll('{basename}', base),
370
+ ...(entry.flat !== undefined ? { flat: entry.flat } : {}),
371
+ });
372
+ }
373
+ }
374
+ return out;
375
+ }
241
376
  /** Read + parse + validate the config at `path`. */
242
377
  export function loadConfig(path) {
243
378
  if (!existsSync(path)) {
@@ -245,19 +380,74 @@ export function loadConfig(path) {
245
380
  }
246
381
  return parseConfig(readFileSync(path, 'utf8'));
247
382
  }
383
+ /** Where the CLI reads/writes credentials: `~/.lionrapid/credentials`. */
384
+ export function defaultCredentialsPath() {
385
+ return join(homedir(), '.lionrapid', 'credentials');
386
+ }
387
+ /** Paths already warned about this process — the perms warning fires once per file. */
388
+ const warnedPerms = new Set();
389
+ /** Warn (once per path) when the credentials file is readable by group/other. */
390
+ function warnIfWorldReadable(path) {
391
+ if (process.platform === 'win32' || warnedPerms.has(path))
392
+ return;
393
+ if ((statSync(path).mode & 0o077) !== 0) {
394
+ warnedPerms.add(path);
395
+ console.error(`warning: ${path} is readable by other users — run: chmod 600 ${path}`);
396
+ }
397
+ }
398
+ /**
399
+ * Reject a key that can't travel in an HTTP header (fetch encodes headers as
400
+ * Latin-1 and throws an obscure ByteString error otherwise). The classic case
401
+ * is copying the dashboard's truncated key display, `sk_eng_…last4` — that
402
+ * ellipsis is U+2026, not part of the key.
403
+ */
404
+ export function assertKeyCharset(key) {
405
+ const bad = /[^\x21-\x7e]/.exec(key);
406
+ if (bad) {
407
+ const c = bad[0];
408
+ const cp = c.codePointAt(0).toString(16).padStart(4, '0').toUpperCase();
409
+ throw new ApiKeyError(`The API key contains a character that can't be sent in an HTTP header: '${c}' (U+${cp}). ` +
410
+ 'This usually means a truncated display value was copied — paste the full key.');
411
+ }
412
+ return key;
413
+ }
414
+ /**
415
+ * Server URLs that have a scoped entry in the credentials file. Lets `init`
416
+ * default its server to the one you just logged into instead of asking again.
417
+ */
418
+ export function listCredentialServers(credentialsPath) {
419
+ const path = credentialsPath ?? defaultCredentialsPath();
420
+ if (!existsSync(path))
421
+ return [];
422
+ try {
423
+ const creds = JSON.parse(readFileSync(path, 'utf8'));
424
+ if (!isRecord(creds))
425
+ return [];
426
+ return Object.keys(creds).filter((k) => k !== 'default' && isNonEmptyString(creds[k]));
427
+ }
428
+ catch {
429
+ return [];
430
+ }
431
+ }
248
432
  /**
249
433
  * Resolve the API key. Precedence:
250
434
  * 1. `LIONRAPID_API_KEY` environment variable
251
435
  * 2. credentials file (JSON: `{ "default": "sk_...", "<server>": "sk_..." }`)
252
436
  * The key is never read from `lionrapid.yml` (which is committed to git).
437
+ *
438
+ * Trust rule: the `default` credential is only handed out for recognized
439
+ * LionRapid hosts (`*.lionrapid.com`) and localhost. Any other server needs
440
+ * its own server-scoped entry — otherwise a committed lionrapid.yml pointing
441
+ * at an attacker host would exfiltrate the key of anyone running `push`.
253
442
  */
254
443
  export function resolveApiKey(opts = {}) {
255
444
  const env = opts.env ?? process.env;
256
445
  const fromEnv = env['LIONRAPID_API_KEY'];
257
446
  if (isNonEmptyString(fromEnv))
258
- return fromEnv.trim();
259
- const credentialsPath = opts.credentialsPath ?? join(homedir(), '.lionrapid', 'credentials');
447
+ return assertKeyCharset(fromEnv.trim());
448
+ const credentialsPath = opts.credentialsPath ?? defaultCredentialsPath();
260
449
  if (existsSync(credentialsPath)) {
450
+ warnIfWorldReadable(credentialsPath);
261
451
  let creds;
262
452
  try {
263
453
  creds = JSON.parse(readFileSync(credentialsPath, 'utf8'));
@@ -267,11 +457,16 @@ export function resolveApiKey(opts = {}) {
267
457
  }
268
458
  if (isRecord(creds)) {
269
459
  const scoped = opts.server ? creds[opts.server] : undefined;
270
- const fallback = creds['default'];
271
460
  if (isNonEmptyString(scoped))
272
- return scoped.trim();
273
- if (isNonEmptyString(fallback))
274
- return fallback.trim();
461
+ return assertKeyCharset(scoped.trim());
462
+ const fallback = creds['default'];
463
+ if (isNonEmptyString(fallback)) {
464
+ if (!opts.server || isTrustedDefaultHost(opts.server)) {
465
+ return assertKeyCharset(fallback.trim());
466
+ }
467
+ throw new ApiKeyError(`Refusing to send the "default" credential to unrecognized host ${opts.server}. ` +
468
+ `Add a server-scoped key for it first: lionrapid login --server ${opts.server}`);
469
+ }
275
470
  }
276
471
  }
277
472
  throw new ApiKeyError('No API key found. Set LIONRAPID_API_KEY or add it to ~/.lionrapid/credentials.');
@@ -52,6 +52,12 @@ function readBlock(text, open) {
52
52
  }
53
53
  return { body: text.slice(open + 1), end: text.length };
54
54
  }
55
+ /**
56
+ * Only identifier-shaped labels may reach type position — with `types --server`
57
+ * the message text is server-controlled, and anything looser could break out of
58
+ * the `'label'` literal in the generated .d.ts.
59
+ */
60
+ const SAFE_LABEL_RE = /^[A-Za-z0-9_]+$/;
55
61
  /** Extract top-level select option labels (excluding `other`). */
56
62
  function selectOptions(body) {
57
63
  // body looks like: `gender, select, male{…} female{…} other{…}` — strip the
@@ -69,7 +75,7 @@ function selectOptions(body) {
69
75
  while (i < rest.length && /\s/.test(rest[i]))
70
76
  i += 1;
71
77
  if (label && rest[i] === '{') {
72
- if (label !== 'other')
78
+ if (label !== 'other' && SAFE_LABEL_RE.test(label))
73
79
  options.push(label);
74
80
  let depth = 1;
75
81
  i += 1;
@@ -5,7 +5,15 @@
5
5
  */
6
6
  import { extractParams } from './extract.js';
7
7
  function escapeKey(key) {
8
- return key.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
8
+ return (key
9
+ .replace(/\\/g, '\\\\')
10
+ .replace(/'/g, "\\'")
11
+ // Control chars and JS line terminators (incl. U+2028/29) would break out
12
+ // of the quoted key — keys are server-controlled under `types --server`.
13
+ // eslint-disable-next-line no-control-regex
14
+ .replace(/[\u0000-\u001f\u007f\u2028\u2029]/g, (c) => {
15
+ return `\\u${c.charCodeAt(0).toString(16).padStart(4, '0')}`;
16
+ }));
9
17
  }
10
18
  export function generateDts(keyTexts, options = {}) {
11
19
  const keys = [...keyTexts.keys()].sort();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lionrapid/cli",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "LionRapid CLI — sync translation files (iOS, Android, Flutter, JSON, YAML, PO) with the LionRapid backend",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -41,6 +41,7 @@
41
41
  },
42
42
  "files": [
43
43
  "dist",
44
+ "!dist/**/*.map",
44
45
  "README.md",
45
46
  "CHANGELOG.md"
46
47
  ],
@@ -1 +0,0 @@
1
- {"version":3,"file":"android-xml.d.ts","sourceRoot":"","sources":["../../src/adapters/android-xml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAmCpF,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,MAAM,gBAA0B;IAEzC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE;IA8B1C,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,MAAM;CAwC5E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"android-xml.js","sourceRoot":"","sources":["../../src/adapters/android-xml.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"arb.d.ts","sourceRoot":"","sources":["../../src/adapters/arb.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGpF,qBAAa,UAAW,YAAW,aAAa;IAC9C,QAAQ,CAAC,MAAM,QAAkB;IAEjC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAoB1C,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM;CAM3E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"arb.js","sourceRoot":"","sources":["../../src/adapters/arb.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,OAAO,UAAU;IACZ,MAAM,GAAG,KAAc,CAAC;IAEjC,KAAK,CAAC,OAAe;QACnB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO,EAAE,CAAC;QAC9B,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,GAAG,GAAuB,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,EAAE,CAAC;YAC3E,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,6BAA6B;YAChE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS,CAAC,OAA2B,EAAE,OAA0B;QAC/D,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,IAAI,OAAO,EAAE,MAAM;YAAE,GAAG,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,OAAO;YAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3E,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/adapters/content.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAgC,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAMjF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAGvD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAGzD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/adapters/content.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAoB,MAAM,iBAAiB,CAAC;AAEjF,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;AAClC,MAAM,UAAU,GAAG,IAAI,cAAc,EAAE,CAAC;AACxC,MAAM,OAAO,GAAG,SAAS,CAAC;AAE1B,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACrD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAiB;IAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAC5E,OAAO,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAqBhD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,CAQ5D;AAED,wBAAgB,gBAAgB,IAAI,UAAU,EAAE,CAE/C;AAED,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAA4B;IAClD,CAAC,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;IAC3B,CAAC,KAAK,EAAE,IAAI,UAAU,EAAE,CAAC;IACzB,CAAC,aAAa,EAAE,IAAI,iBAAiB,EAAE,CAAC;IACxC,CAAC,aAAa,EAAE,IAAI,iBAAiB,EAAE,CAAC;IACxC,CAAC,WAAW,EAAE,IAAI,gBAAgB,EAAE,CAAC;IACrC,CAAC,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;IAC3B,CAAC,IAAI,EAAE,IAAI,SAAS,EAAE,CAAC;IACvB,CAAC,OAAO,EAAE,IAAI,YAAY,EAAE,CAAC;CAC9B,CAAC,CAAC;AAEH,MAAM,UAAU,UAAU,CAAC,MAAkB;IAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,0BAA0B,MAAM,qBAAqB,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxF,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ios-strings.d.ts","sourceRoot":"","sources":["../../src/adapters/ios-strings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAwBlE,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,MAAM,gBAA0B;IAEzC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAa1C,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM;CAQ/C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ios-strings.js","sourceRoot":"","sources":["../../src/adapters/ios-strings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,QAAQ,GACZ,oFAAoF,CAAC;AAEvF,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE;QAC1C,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAC3B,OAAO,CAAC,CAAC,CAAC,kBAAkB;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,CAAC;SACL,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,OAAO,iBAAiB;IACnB,MAAM,GAAG,aAAsB,CAAC;IAEzC,KAAK,CAAC,OAAe;QACnB,MAAM,GAAG,GAAuB,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC;gBACP,GAAG,EAAE,QAAQ,CAAC,MAAO,CAAC;gBACtB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,QAAS,CAAC,CAAC;gBACzC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CAAC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS,CAAC,OAA2B;QACnC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,CAAC;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/adapters/json.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGlE,qBAAa,WAAY,YAAW,aAAa;IAC/C,QAAQ,CAAC,MAAM,SAAmB;IAElC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAiB1C,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM;CAG/C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/adapters/json.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,OAAO,WAAW;IACb,MAAM,GAAG,MAAe,CAAC;IAElC,KAAK,CAAC,OAAe;QACnB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO,EAAE,CAAC;QAC9B,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,GAAG,GAAuB,EAAE,CAAC;QACnC,aAAa,CAAC,IAA+B,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS,CAAC,OAA2B;QACnC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IACnE,CAAC;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"nested.d.ts","sourceRoot":"","sources":["../../src/adapters/nested.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,gBAAgB,EAAE,GACtB,IAAI,CAYN;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAerF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"nested.js","sourceRoot":"","sources":["../../src/adapters/nested.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,UAAU,aAAa,CAC3B,GAA4B,EAC5B,MAAc,EACd,GAAuB;IAEvB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,KAAK,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACxC,aAAa,CAAC,CAA4B,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAA2B;IAC1D,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACvB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC1D,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAClB,CAAC;YACD,IAAI,GAAG,IAAI,CAAC,IAAI,CAA4B,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"po.d.ts","sourceRoot":"","sources":["../../src/adapters/po.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA8ClE,qBAAa,SAAU,YAAW,aAAa;IAC7C,QAAQ,CAAC,MAAM,OAAiB;IAEhC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAuF1C,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM;CA6C/C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"po.js","sourceRoot":"","sources":["../../src/adapters/po.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,kFAAkF;AAClF,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,WAAW,CAAC;IACnB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,gBAAgB,EAAE,CAAC;IACnE,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAC3E,qEAAqE;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,WAAW,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5F"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"xcstrings.d.ts","sourceRoot":"","sources":["../../src/adapters/xcstrings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA4ClG,qBAAa,gBAAiB,YAAW,aAAa;IACpD,QAAQ,CAAC,MAAM,cAAwB;IACvC,QAAQ,CAAC,WAAW,QAAQ;IAE5B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,gBAAgB,EAAE;IAqBlE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAazF,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM;CAQ3E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"xcstrings.js","sourceRoot":"","sources":["../../src/adapters/xcstrings.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"xliff.d.ts","sourceRoot":"","sources":["../../src/adapters/xliff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA+BpF,qBAAa,YAAa,YAAW,aAAa;IAChD,QAAQ,CAAC,MAAM,UAAoB;IAEnC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAkB1C,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM;CAoB3E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"xliff.js","sourceRoot":"","sources":["../../src/adapters/xliff.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../src/adapters/yaml.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAOlG,qBAAa,WAAY,YAAW,aAAa;IAC/C,QAAQ,CAAC,MAAM,SAAmB;IAElC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,gBAAgB,EAAE;IA2BlE,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM;CAK3E"}