@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
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Extract typed parameters from an ICU MessageFormat string.
3
+ *
4
+ * Ported and adapted from the old `@lionrapid/types` inference, but driven by
5
+ * the message text itself (the realigned CLI derives types from your source
6
+ * files, not a separate schema endpoint):
7
+ * - `{count, plural, …}` / `selectordinal` / `number` → `number`
8
+ * - `{gender, select, male{…} female{…} other{…}}` → `'male' | 'female'`
9
+ * (plus `| (string & {})` unless strict)
10
+ * - `{when, date|time, …}` → `Date | string`
11
+ * - bare `{name}` → heuristic (`count`→number, `is*`→boolean, `*Id`→string|number,
12
+ * `*date*`→Date|string, else `string`)
13
+ */
14
+ export class IcuError extends Error {
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = 'IcuError';
18
+ }
19
+ }
20
+ /** Specificity ranking so a name seen multiple ways resolves to the richest type. */
21
+ const RANK = { string: 0, boolean: 1, 'string | number': 1 };
22
+ function heuristicType(name) {
23
+ if (name === 'count' || name.endsWith('Count') || name.endsWith('count'))
24
+ return 'number';
25
+ if (name.startsWith('is') ||
26
+ name.startsWith('has') ||
27
+ name.startsWith('can') ||
28
+ name.endsWith('enabled') ||
29
+ name.endsWith('visible') ||
30
+ name.endsWith('active')) {
31
+ return 'boolean';
32
+ }
33
+ if (name === 'id' || name.endsWith('Id') || name.endsWith('_id'))
34
+ return 'string | number';
35
+ const lower = name.toLowerCase();
36
+ if (lower.includes('date') || lower.includes('time') || lower.includes('timestamp')) {
37
+ return 'Date | string';
38
+ }
39
+ return 'string';
40
+ }
41
+ /** Read the balanced `{ … }` block that starts at `open` (index of `{`). */
42
+ function readBlock(text, open) {
43
+ let depth = 0;
44
+ for (let i = open; i < text.length; i += 1) {
45
+ if (text[i] === '{')
46
+ depth += 1;
47
+ else if (text[i] === '}') {
48
+ depth -= 1;
49
+ if (depth === 0)
50
+ return { body: text.slice(open + 1, i), end: i };
51
+ }
52
+ }
53
+ return { body: text.slice(open + 1), end: text.length };
54
+ }
55
+ /** Extract top-level select option labels (excluding `other`). */
56
+ function selectOptions(body) {
57
+ // body looks like: `gender, select, male{…} female{…} other{…}` — strip the
58
+ // `name, select,` prefix so parsing starts at the first option label.
59
+ const prefix = body.match(/^\s*\w+\s*,\s*select\s*,/);
60
+ const rest = prefix ? body.slice(prefix[0].length) : body;
61
+ const options = [];
62
+ let i = 0;
63
+ while (i < rest.length) {
64
+ while (i < rest.length && /\s/.test(rest[i]))
65
+ i += 1;
66
+ let label = '';
67
+ while (i < rest.length && !/[\s{}]/.test(rest[i]))
68
+ label += rest[i++];
69
+ while (i < rest.length && /\s/.test(rest[i]))
70
+ i += 1;
71
+ if (label && rest[i] === '{') {
72
+ if (label !== 'other')
73
+ options.push(label);
74
+ let depth = 1;
75
+ i += 1;
76
+ while (i < rest.length && depth > 0) {
77
+ if (rest[i] === '{')
78
+ depth += 1;
79
+ else if (rest[i] === '}')
80
+ depth -= 1;
81
+ i += 1;
82
+ }
83
+ }
84
+ else {
85
+ i += 1;
86
+ }
87
+ }
88
+ return options;
89
+ }
90
+ export function extractParams(text, strictIcu = false) {
91
+ const found = new Map();
92
+ const consider = (name, type) => {
93
+ const prev = found.get(name);
94
+ if (prev === undefined) {
95
+ found.set(name, type);
96
+ return;
97
+ }
98
+ // Prefer a more specific type; numbers/unions beat the string heuristics.
99
+ const prevRank = RANK[prev] ?? 2;
100
+ const nextRank = RANK[type] ?? 2;
101
+ if (nextRank > prevRank)
102
+ found.set(name, type);
103
+ };
104
+ for (let i = 0; i < text.length; i += 1) {
105
+ if (text[i] !== '{')
106
+ continue;
107
+ const { body, end } = readBlock(text, i);
108
+ const m = body.match(/^\s*(\w+)\s*(?:,\s*(\w+))?/);
109
+ if (!m)
110
+ continue;
111
+ const name = m[1];
112
+ const kind = m[2];
113
+ if (kind === 'plural' || kind === 'selectordinal' || kind === 'number') {
114
+ if ((kind === 'plural' || kind === 'selectordinal') && !/(^|\s)other\s*\{/.test(body)) {
115
+ const msg = `ICU "${kind}" for "${name}" is missing the required "other" arm.`;
116
+ if (strictIcu)
117
+ throw new IcuError(msg);
118
+ }
119
+ consider(name, 'number');
120
+ }
121
+ else if (kind === 'select') {
122
+ if (!/(^|\s)other\s*\{/.test(body)) {
123
+ const msg = `ICU "select" for "${name}" is missing the required "other" arm.`;
124
+ if (strictIcu)
125
+ throw new IcuError(msg);
126
+ }
127
+ const opts = selectOptions(body);
128
+ if (opts.length > 0) {
129
+ const literals = opts.map((o) => `'${o}'`).join(' | ');
130
+ consider(name, strictIcu ? literals : `${literals} | (string & {})`);
131
+ }
132
+ else {
133
+ consider(name, 'string');
134
+ }
135
+ }
136
+ else if (kind === 'date' || kind === 'time') {
137
+ consider(name, 'Date | string');
138
+ }
139
+ else if (!kind) {
140
+ consider(name, heuristicType(name));
141
+ }
142
+ // Continue scanning *inside* the block too (nested placeholders) — the
143
+ // outer loop naturally visits inner `{` because we don't skip past `end`.
144
+ void end;
145
+ }
146
+ return [...found.entries()].map(([name, type]) => ({ name, type }));
147
+ }
148
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/types-gen/extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Generate a `.d.ts` that augments `@lionrapid/core`'s `TranslationKeys` so
3
+ * `t('key', params)` is compile-time checked. Output is deterministic (keys
4
+ * sorted) and built with plain string templates — no Handlebars dependency.
5
+ */
6
+ export interface GenerateDtsOptions {
7
+ strictIcu?: boolean;
8
+ }
9
+ export declare function generateDts(keyTexts: Map<string, string>, options?: GenerateDtsOptions): string;
10
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/types-gen/generate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAMD,wBAAgB,WAAW,CACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,OAAO,GAAE,kBAAuB,GAC/B,MAAM,CA6BR"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Generate a `.d.ts` that augments `@lionrapid/core`'s `TranslationKeys` so
3
+ * `t('key', params)` is compile-time checked. Output is deterministic (keys
4
+ * sorted) and built with plain string templates — no Handlebars dependency.
5
+ */
6
+ import { extractParams } from './extract.js';
7
+ function escapeKey(key) {
8
+ return key.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
9
+ }
10
+ export function generateDts(keyTexts, options = {}) {
11
+ const keys = [...keyTexts.keys()].sort();
12
+ const lines = [
13
+ '/**',
14
+ ' * 🦁 LionRapid Translation Types — AUTO-GENERATED. Do not edit by hand.',
15
+ ' * Regenerate with `lionrapid types generate` (or `lionrapid pull --types`).',
16
+ ` * ${keys.length} translation key(s).`,
17
+ ' */',
18
+ '',
19
+ "declare module '@lionrapid/core' {",
20
+ ' interface TranslationKeys {',
21
+ ];
22
+ for (const key of keys) {
23
+ const params = extractParams(keyTexts.get(key), options.strictIcu);
24
+ if (params.length === 0) {
25
+ lines.push(` '${escapeKey(key)}': Record<string, never>;`);
26
+ }
27
+ else {
28
+ const body = params.map((p) => `${p.name}: ${p.type}`).join('; ');
29
+ lines.push(` '${escapeKey(key)}': { ${body} };`);
30
+ }
31
+ }
32
+ lines.push(' }');
33
+ lines.push('}');
34
+ lines.push('');
35
+ lines.push("export type AvailableKeys = keyof import('@lionrapid/core').TranslationKeys;");
36
+ lines.push('');
37
+ return lines.join('\n');
38
+ }
39
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/types-gen/generate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAM7C,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,QAA6B,EAC7B,UAA8B,EAAE;IAEhC,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,MAAM,KAAK,GAAa;QACtB,KAAK;QACL,0EAA0E;QAC1E,8EAA8E;QAC9E,MAAM,IAAI,CAAC,MAAM,sBAAsB;QACvC,KAAK;QACL,EAAE;QACF,oCAAoC;QACpC,+BAA+B;KAChC,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,QAAQ,SAAS,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,QAAQ,SAAS,CAAC,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;IAC3F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@lionrapid/cli",
3
+ "version": "0.1.0",
4
+ "description": "LionRapid CLI — sync translation files (iOS, Android, Flutter, JSON, YAML, PO) with the LionRapid backend",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "lionrapid": "./dist/cli.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ },
16
+ "./package.json": "./package.json"
17
+ },
18
+ "scripts": {
19
+ "build": "dotenv -e ../../.env.production -- tsc -b",
20
+ "dev": "dotenv -e ../../.env.development -- tsc -b --watch",
21
+ "clean": "rm -rf dist tsconfig.tsbuildinfo .turbo coverage",
22
+ "test": "dotenv -e ../../.env.test -- vitest run --passWithNoTests",
23
+ "test:watch": "dotenv -e ../../.env.test -- vitest",
24
+ "test:coverage": "dotenv -e ../../.env.test -- vitest run --coverage",
25
+ "typecheck": "dotenv -e ../../.env.development -- tsc --noEmit",
26
+ "lint": "eslint src --ext .ts --max-warnings 0",
27
+ "lint:fix": "eslint src --ext .ts --fix",
28
+ "prepublishOnly": "npm run clean && npm run build"
29
+ },
30
+ "dependencies": {
31
+ "@lionrapid/core": "*",
32
+ "commander": "^12.0.0",
33
+ "typescript": "^5.3.3",
34
+ "yaml": "^2.4.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^20.11.0",
38
+ "@vitest/coverage-v8": "^1.6.1",
39
+ "dotenv-cli": "^7.3.0",
40
+ "vitest": "^1.6.1"
41
+ },
42
+ "files": [
43
+ "dist",
44
+ "README.md"
45
+ ],
46
+ "engines": {
47
+ "node": ">=18.0.0"
48
+ },
49
+ "keywords": [
50
+ "i18n",
51
+ "l10n",
52
+ "cli",
53
+ "lionrapid",
54
+ "translation",
55
+ "ios",
56
+ "android",
57
+ "flutter",
58
+ "localization"
59
+ ],
60
+ "author": "Janrau B",
61
+ "license": "MIT",
62
+ "publishConfig": {
63
+ "registry": "https://registry.npmjs.org",
64
+ "access": "public"
65
+ },
66
+ "repository": {
67
+ "type": "git",
68
+ "url": "git+https://github.com/Hatamoto/tm-integration.git",
69
+ "directory": "packages/cli"
70
+ }
71
+ }