@marcfargas/odoo-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 (81) hide show
  1. package/dist/cli.d.ts +27 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +152 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/accounting.d.ts +16 -0
  6. package/dist/commands/accounting.d.ts.map +1 -0
  7. package/dist/commands/accounting.js +363 -0
  8. package/dist/commands/accounting.js.map +1 -0
  9. package/dist/commands/attendance.d.ts +14 -0
  10. package/dist/commands/attendance.d.ts.map +1 -0
  11. package/dist/commands/attendance.js +339 -0
  12. package/dist/commands/attendance.js.map +1 -0
  13. package/dist/commands/config.d.ts +12 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +159 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/mail.d.ts +12 -0
  18. package/dist/commands/mail.d.ts.map +1 -0
  19. package/dist/commands/mail.js +236 -0
  20. package/dist/commands/mail.js.map +1 -0
  21. package/dist/commands/modules.d.ts +14 -0
  22. package/dist/commands/modules.d.ts.map +1 -0
  23. package/dist/commands/modules.js +351 -0
  24. package/dist/commands/modules.js.map +1 -0
  25. package/dist/commands/records.d.ts +15 -0
  26. package/dist/commands/records.d.ts.map +1 -0
  27. package/dist/commands/records.js +591 -0
  28. package/dist/commands/records.js.map +1 -0
  29. package/dist/commands/schema.d.ts +16 -0
  30. package/dist/commands/schema.d.ts.map +1 -0
  31. package/dist/commands/schema.js +381 -0
  32. package/dist/commands/schema.js.map +1 -0
  33. package/dist/commands/state.d.ts +14 -0
  34. package/dist/commands/state.d.ts.map +1 -0
  35. package/dist/commands/state.js +373 -0
  36. package/dist/commands/state.js.map +1 -0
  37. package/dist/commands/timesheets.d.ts +15 -0
  38. package/dist/commands/timesheets.d.ts.map +1 -0
  39. package/dist/commands/timesheets.js +453 -0
  40. package/dist/commands/timesheets.js.map +1 -0
  41. package/dist/commands/url.d.ts +12 -0
  42. package/dist/commands/url.d.ts.map +1 -0
  43. package/dist/commands/url.js +149 -0
  44. package/dist/commands/url.js.map +1 -0
  45. package/dist/help/extra-help.d.ts +18 -0
  46. package/dist/help/extra-help.d.ts.map +1 -0
  47. package/dist/help/extra-help.js +207 -0
  48. package/dist/help/extra-help.js.map +1 -0
  49. package/dist/middleware/auth.d.ts +29 -0
  50. package/dist/middleware/auth.d.ts.map +1 -0
  51. package/dist/middleware/auth.js +68 -0
  52. package/dist/middleware/auth.js.map +1 -0
  53. package/dist/middleware/common-params.d.ts +90 -0
  54. package/dist/middleware/common-params.d.ts.map +1 -0
  55. package/dist/middleware/common-params.js +169 -0
  56. package/dist/middleware/common-params.js.map +1 -0
  57. package/dist/middleware/safety.d.ts +30 -0
  58. package/dist/middleware/safety.d.ts.map +1 -0
  59. package/dist/middleware/safety.js +64 -0
  60. package/dist/middleware/safety.js.map +1 -0
  61. package/dist/output/errors.d.ts +69 -0
  62. package/dist/output/errors.d.ts.map +1 -0
  63. package/dist/output/errors.js +193 -0
  64. package/dist/output/errors.js.map +1 -0
  65. package/dist/output/formatter.d.ts +80 -0
  66. package/dist/output/formatter.d.ts.map +1 -0
  67. package/dist/output/formatter.js +285 -0
  68. package/dist/output/formatter.js.map +1 -0
  69. package/dist/output/stream-writer.d.ts +33 -0
  70. package/dist/output/stream-writer.d.ts.map +1 -0
  71. package/dist/output/stream-writer.js +74 -0
  72. package/dist/output/stream-writer.js.map +1 -0
  73. package/dist/parsing/domain-parser.d.ts +61 -0
  74. package/dist/parsing/domain-parser.d.ts.map +1 -0
  75. package/dist/parsing/domain-parser.js +427 -0
  76. package/dist/parsing/domain-parser.js.map +1 -0
  77. package/dist/parsing/json-arg.d.ts +48 -0
  78. package/dist/parsing/json-arg.d.ts.map +1 -0
  79. package/dist/parsing/json-arg.js +165 -0
  80. package/dist/parsing/json-arg.js.map +1 -0
  81. package/package.json +53 -0
@@ -0,0 +1,427 @@
1
+ "use strict";
2
+ /**
3
+ * Odoo domain parser — tokenizer + recursive descent parser.
4
+ *
5
+ * Parses the Python-literal subset used in Odoo domain expressions:
6
+ *
7
+ * '[("stage_id.name","=","Won"),("active","=",True)]'
8
+ * '["|",("name","ilike","acme"),("ref","ilike","acme")]'
9
+ *
10
+ * Converts Python literals to JSON-compatible values:
11
+ * True → true
12
+ * False → false
13
+ * None → null
14
+ * (a,b) → [a, b] (tuples become arrays)
15
+ *
16
+ * Three input paths:
17
+ * parseDomainArg() - from --domain flag (Python literal syntax)
18
+ * parseDomainJson() - from --domain-json flag (strict JSON)
19
+ * parseFilterArgs() - from --filter K=V pairs (simple equality)
20
+ */
21
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ var desc = Object.getOwnPropertyDescriptor(m, k);
24
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
25
+ desc = { enumerable: true, get: function() { return m[k]; } };
26
+ }
27
+ Object.defineProperty(o, k2, desc);
28
+ }) : (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ o[k2] = m[k];
31
+ }));
32
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
33
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
34
+ }) : function(o, v) {
35
+ o["default"] = v;
36
+ });
37
+ var __importStar = (this && this.__importStar) || (function () {
38
+ var ownKeys = function(o) {
39
+ ownKeys = Object.getOwnPropertyNames || function (o) {
40
+ var ar = [];
41
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
42
+ return ar;
43
+ };
44
+ return ownKeys(o);
45
+ };
46
+ return function (mod) {
47
+ if (mod && mod.__esModule) return mod;
48
+ var result = {};
49
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
50
+ __setModuleDefault(result, mod);
51
+ return result;
52
+ };
53
+ })();
54
+ var __importDefault = (this && this.__importDefault) || function (mod) {
55
+ return (mod && mod.__esModule) ? mod : { "default": mod };
56
+ };
57
+ Object.defineProperty(exports, "__esModule", { value: true });
58
+ exports.DomainParseError = void 0;
59
+ exports.parseDomainArg = parseDomainArg;
60
+ exports.parseDomainJson = parseDomainJson;
61
+ exports.parseFilterArgs = parseFilterArgs;
62
+ exports.combineDomains = combineDomains;
63
+ exports.readDomainFile = readDomainFile;
64
+ const debug_1 = __importDefault(require("debug"));
65
+ const log = (0, debug_1.default)('odoo-cli:domain-parser');
66
+ // ── Errors ──────────────────────────────────────────────────────────
67
+ class DomainParseError extends Error {
68
+ position;
69
+ input;
70
+ constructor(message, position, input) {
71
+ const posHint = position !== undefined && input !== undefined
72
+ ? `\n at position ${position}: ...${input.slice(Math.max(0, position - 10), position + 10)}...`
73
+ : '';
74
+ super(message + posHint);
75
+ this.position = position;
76
+ this.input = input;
77
+ this.name = 'DomainParseError';
78
+ }
79
+ }
80
+ exports.DomainParseError = DomainParseError;
81
+ function tokenize(input) {
82
+ const tokens = [];
83
+ let i = 0;
84
+ while (i < input.length) {
85
+ // Skip whitespace
86
+ if (/\s/.test(input[i])) {
87
+ i++;
88
+ continue;
89
+ }
90
+ // Single-char tokens
91
+ if (input[i] === '[') {
92
+ tokens.push({ type: 'LBRACKET', value: '[', pos: i });
93
+ i++;
94
+ continue;
95
+ }
96
+ if (input[i] === ']') {
97
+ tokens.push({ type: 'RBRACKET', value: ']', pos: i });
98
+ i++;
99
+ continue;
100
+ }
101
+ if (input[i] === '(') {
102
+ tokens.push({ type: 'LPAREN', value: '(', pos: i });
103
+ i++;
104
+ continue;
105
+ }
106
+ if (input[i] === ')') {
107
+ tokens.push({ type: 'RPAREN', value: ')', pos: i });
108
+ i++;
109
+ continue;
110
+ }
111
+ if (input[i] === ',') {
112
+ tokens.push({ type: 'COMMA', value: ',', pos: i });
113
+ i++;
114
+ continue;
115
+ }
116
+ // String literals — single or double quoted
117
+ if (input[i] === '"' || input[i] === "'") {
118
+ const quote = input[i];
119
+ const start = i;
120
+ i++;
121
+ let str = '';
122
+ while (i < input.length) {
123
+ if (input[i] === '\\' && i + 1 < input.length) {
124
+ const esc = input[i + 1];
125
+ switch (esc) {
126
+ case 'n':
127
+ str += '\n';
128
+ break;
129
+ case 't':
130
+ str += '\t';
131
+ break;
132
+ case 'r':
133
+ str += '\r';
134
+ break;
135
+ case '\\':
136
+ str += '\\';
137
+ break;
138
+ case "'":
139
+ str += "'";
140
+ break;
141
+ case '"':
142
+ str += '"';
143
+ break;
144
+ default:
145
+ str += esc;
146
+ }
147
+ i += 2;
148
+ continue;
149
+ }
150
+ if (input[i] === quote) {
151
+ i++;
152
+ break;
153
+ }
154
+ str += input[i];
155
+ i++;
156
+ }
157
+ tokens.push({ type: 'STRING', value: str, pos: start });
158
+ continue;
159
+ }
160
+ // Numbers (including negative)
161
+ if (/[-\d]/.test(input[i]) && (input[i] !== '-' || /\d/.test(input[i + 1] ?? ''))) {
162
+ const start = i;
163
+ let num = '';
164
+ if (input[i] === '-') {
165
+ num += '-';
166
+ i++;
167
+ }
168
+ while (i < input.length && /[\d.]/.test(input[i])) {
169
+ num += input[i];
170
+ i++;
171
+ }
172
+ tokens.push({ type: 'NUMBER', value: num, pos: start });
173
+ continue;
174
+ }
175
+ // Identifiers: True, False, None, operators like &, |, !
176
+ if (/[a-zA-Z_&|!]/.test(input[i])) {
177
+ const start = i;
178
+ let ident = '';
179
+ while (i < input.length && /[a-zA-Z0-9_.&|!]/.test(input[i])) {
180
+ ident += input[i];
181
+ i++;
182
+ }
183
+ tokens.push({ type: 'IDENT', value: ident, pos: start });
184
+ continue;
185
+ }
186
+ throw new DomainParseError(`Unexpected character '${input[i]}'`, i, input);
187
+ }
188
+ tokens.push({ type: 'EOF', value: '', pos: input.length });
189
+ return tokens;
190
+ }
191
+ // ── Parser ───────────────────────────────────────────────────────────
192
+ class Parser {
193
+ input;
194
+ tokens;
195
+ pos = 0;
196
+ constructor(input, tokens) {
197
+ this.input = input;
198
+ this.tokens = tokens;
199
+ }
200
+ peek() {
201
+ return this.tokens[this.pos];
202
+ }
203
+ consume() {
204
+ return this.tokens[this.pos++];
205
+ }
206
+ expect(type) {
207
+ const tok = this.peek();
208
+ if (tok.type !== type) {
209
+ throw new DomainParseError(`Expected ${type} but got ${tok.type} ('${tok.value}')`, tok.pos, this.input);
210
+ }
211
+ return this.consume();
212
+ }
213
+ parseValue() {
214
+ const tok = this.peek();
215
+ switch (tok.type) {
216
+ case 'LBRACKET':
217
+ return this.parseList();
218
+ case 'LPAREN':
219
+ return this.parseTuple();
220
+ case 'STRING':
221
+ this.consume();
222
+ return tok.value;
223
+ case 'NUMBER': {
224
+ this.consume();
225
+ const n = tok.value.includes('.') ? parseFloat(tok.value) : parseInt(tok.value, 10);
226
+ if (isNaN(n))
227
+ throw new DomainParseError(`Invalid number '${tok.value}'`, tok.pos, this.input);
228
+ return n;
229
+ }
230
+ case 'IDENT': {
231
+ this.consume();
232
+ switch (tok.value) {
233
+ case 'True':
234
+ return true;
235
+ case 'False':
236
+ return false;
237
+ case 'None':
238
+ return null;
239
+ // Logic operators are valid as strings in domains
240
+ case '&':
241
+ case '|':
242
+ case '!':
243
+ return tok.value;
244
+ default:
245
+ // Could be a bare identifier used as a string in some edge cases
246
+ return tok.value;
247
+ }
248
+ }
249
+ default:
250
+ throw new DomainParseError(`Unexpected token ${tok.type} ('${tok.value}')`, tok.pos, this.input);
251
+ }
252
+ }
253
+ parseList() {
254
+ this.expect('LBRACKET');
255
+ const items = [];
256
+ if (this.peek().type === 'RBRACKET') {
257
+ this.consume();
258
+ return items;
259
+ }
260
+ items.push(this.parseValue());
261
+ while (this.peek().type === 'COMMA') {
262
+ this.consume();
263
+ // Trailing comma
264
+ if (this.peek().type === 'RBRACKET')
265
+ break;
266
+ items.push(this.parseValue());
267
+ }
268
+ this.expect('RBRACKET');
269
+ return items;
270
+ }
271
+ parseTuple() {
272
+ // Tuples → arrays (same as list but with parens)
273
+ this.expect('LPAREN');
274
+ const items = [];
275
+ if (this.peek().type === 'RPAREN') {
276
+ this.consume();
277
+ return items;
278
+ }
279
+ items.push(this.parseValue());
280
+ while (this.peek().type === 'COMMA') {
281
+ this.consume();
282
+ if (this.peek().type === 'RPAREN')
283
+ break;
284
+ items.push(this.parseValue());
285
+ }
286
+ this.expect('RPAREN');
287
+ return items;
288
+ }
289
+ parse() {
290
+ const result = this.parseList();
291
+ if (this.peek().type !== 'EOF') {
292
+ const tok = this.peek();
293
+ throw new DomainParseError(`Unexpected token after domain end: ${tok.type} ('${tok.value}')`, tok.pos, this.input);
294
+ }
295
+ return result;
296
+ }
297
+ }
298
+ // ── Public API ───────────────────────────────────────────────────────
299
+ /**
300
+ * Parse an Odoo domain string (Python literal syntax) into a JSON array.
301
+ *
302
+ * @example
303
+ * parseDomainArg('[("name","ilike","acme"),("active","=",True)]')
304
+ * // → [["name","ilike","acme"],["active","=",true]]
305
+ */
306
+ function parseDomainArg(input) {
307
+ log('Parsing domain: %s', input);
308
+ const trimmed = input.trim();
309
+ if (!trimmed)
310
+ return [];
311
+ try {
312
+ const tokens = tokenize(trimmed);
313
+ const parser = new Parser(trimmed, tokens);
314
+ const result = parser.parse();
315
+ if (!Array.isArray(result)) {
316
+ throw new DomainParseError('Domain must be a list', 0, trimmed);
317
+ }
318
+ log('Parsed domain: %O', result);
319
+ return result;
320
+ }
321
+ catch (err) {
322
+ if (err instanceof DomainParseError)
323
+ throw err;
324
+ throw new DomainParseError(`Failed to parse domain: ${err instanceof Error ? err.message : String(err)}`, 0, trimmed);
325
+ }
326
+ }
327
+ /**
328
+ * Parse a strict JSON domain string.
329
+ *
330
+ * @example
331
+ * parseDomainJson('[["name","ilike","acme"]]')
332
+ */
333
+ function parseDomainJson(input) {
334
+ log('Parsing JSON domain: %s', input);
335
+ const trimmed = input.trim();
336
+ if (!trimmed)
337
+ return [];
338
+ let parsed;
339
+ try {
340
+ parsed = JSON.parse(trimmed);
341
+ }
342
+ catch (err) {
343
+ throw new DomainParseError(`Invalid JSON domain: ${err instanceof Error ? err.message : String(err)}`);
344
+ }
345
+ if (!Array.isArray(parsed)) {
346
+ throw new DomainParseError('Domain must be a JSON array');
347
+ }
348
+ return parsed;
349
+ }
350
+ /**
351
+ * Parse --filter K=V pairs into domain terms.
352
+ *
353
+ * Type inference:
354
+ * "true"/"false" → boolean
355
+ * all-digit string → integer
356
+ * otherwise → string
357
+ *
358
+ * @example
359
+ * parseFilterArgs(['active=true', 'state=sale'])
360
+ * // → [['active','=',true],['state','=','sale']]
361
+ */
362
+ function parseFilterArgs(filters) {
363
+ return filters.map((f) => {
364
+ const eqIdx = f.indexOf('=');
365
+ if (eqIdx === -1) {
366
+ throw new DomainParseError(`Invalid --filter format (expected K=V): '${f}'`);
367
+ }
368
+ const key = f.slice(0, eqIdx).trim();
369
+ const rawVal = f.slice(eqIdx + 1);
370
+ let value;
371
+ if (rawVal === 'true')
372
+ value = true;
373
+ else if (rawVal === 'false')
374
+ value = false;
375
+ else if (/^\d+$/.test(rawVal))
376
+ value = parseInt(rawVal, 10);
377
+ else
378
+ value = rawVal;
379
+ return [key, '=', value];
380
+ });
381
+ }
382
+ /**
383
+ * Combine a base domain with filter terms (AND).
384
+ */
385
+ function combineDomains(baseDomain, filterTerms) {
386
+ if (filterTerms.length === 0)
387
+ return baseDomain;
388
+ return [...baseDomain, ...filterTerms];
389
+ }
390
+ /**
391
+ * Read domain from a file path. '-' reads from stdin.
392
+ */
393
+ async function readDomainFile(filePath) {
394
+ const { readFileSync } = await Promise.resolve().then(() => __importStar(require('fs')));
395
+ let content;
396
+ if (filePath === '-') {
397
+ // Read from stdin
398
+ content = await readStdin();
399
+ }
400
+ else {
401
+ try {
402
+ content = readFileSync(filePath, 'utf8');
403
+ }
404
+ catch (err) {
405
+ throw new DomainParseError(`Cannot read domain file '${filePath}': ${err instanceof Error ? err.message : String(err)}`);
406
+ }
407
+ }
408
+ const trimmed = content.trim();
409
+ // Try JSON first (standard): JSON true/false/null must not be corrupted by Python-literal parser.
410
+ // Fall back to Python-literal syntax only if JSON.parse fails.
411
+ try {
412
+ return parseDomainJson(trimmed);
413
+ }
414
+ catch {
415
+ // fall back to Python-literal syntax (handles True/False/None)
416
+ }
417
+ return parseDomainArg(trimmed);
418
+ }
419
+ function readStdin() {
420
+ return new Promise((resolve, reject) => {
421
+ const chunks = [];
422
+ process.stdin.on('data', (chunk) => chunks.push(chunk));
423
+ process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
424
+ process.stdin.on('error', reject);
425
+ });
426
+ }
427
+ //# sourceMappingURL=domain-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-parser.js","sourceRoot":"","sources":["../../src/parsing/domain-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Robust JSON parsing helpers with actionable error messages.
3
+ *
4
+ * Used for --data, --kwargs, --args, --context flags.
5
+ */
6
+ export declare class JsonArgError extends Error {
7
+ readonly source: string;
8
+ readonly cause?: Error | undefined;
9
+ constructor(message: string, source: string, cause?: Error | undefined);
10
+ }
11
+ /**
12
+ * Parse a JSON string argument with a helpful error message.
13
+ *
14
+ * @param raw - Raw string from CLI flag
15
+ * @param flag - Flag name for error context (e.g., '--data')
16
+ */
17
+ export declare function parseJsonArg(raw: string, flag?: string): Record<string, any>;
18
+ /**
19
+ * Parse a JSON array argument.
20
+ *
21
+ * @param raw - Raw string from CLI flag
22
+ * @param flag - Flag name for error context (e.g., '--args')
23
+ */
24
+ export declare function parseJsonArray(raw: string, flag?: string): any[];
25
+ /**
26
+ * Read JSON from a file path, or stdin when filePath is '-'.
27
+ *
28
+ * @param filePath - File path or '-' for stdin
29
+ * @param flag - Flag name for error context
30
+ */
31
+ export declare function readJsonFile(filePath: string, flag?: string): Promise<Record<string, any>>;
32
+ /**
33
+ * Read stdin as a string.
34
+ */
35
+ export declare function readStdin(): Promise<string>;
36
+ /**
37
+ * Read a text message from a file or stdin.
38
+ */
39
+ export declare function readMessageFile(filePath: string): Promise<string>;
40
+ /**
41
+ * Parse hours from "1.5" or "1:30" format.
42
+ */
43
+ export declare function parseHours(raw: string): number;
44
+ /**
45
+ * Parse comma-separated IDs into an array of numbers.
46
+ */
47
+ export declare function parseIds(raw: string): number[];
48
+ //# sourceMappingURL=json-arg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-arg.d.ts","sourceRoot":"","sources":["../../src/parsing/json-arg.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,qBAAa,YAAa,SAAQ,KAAK;aAGnB,MAAM,EAAE,MAAM;aACd,KAAK,CAAC,EAAE,KAAK;gBAF7B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAoBtF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAiB,GAAG,GAAG,EAAE,CAiB1E;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAsB,GAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAiB9B;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAW3C;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYvE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmB9C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAU9C"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ /**
3
+ * Robust JSON parsing helpers with actionable error messages.
4
+ *
5
+ * Used for --data, --kwargs, --args, --context flags.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.JsonArgError = void 0;
12
+ exports.parseJsonArg = parseJsonArg;
13
+ exports.parseJsonArray = parseJsonArray;
14
+ exports.readJsonFile = readJsonFile;
15
+ exports.readStdin = readStdin;
16
+ exports.readMessageFile = readMessageFile;
17
+ exports.parseHours = parseHours;
18
+ exports.parseIds = parseIds;
19
+ const debug_1 = __importDefault(require("debug"));
20
+ const fs_1 = require("fs");
21
+ const log = (0, debug_1.default)('odoo-cli:json-arg');
22
+ class JsonArgError extends Error {
23
+ source;
24
+ cause;
25
+ constructor(message, source, cause) {
26
+ super(message);
27
+ this.source = source;
28
+ this.cause = cause;
29
+ this.name = 'JsonArgError';
30
+ }
31
+ }
32
+ exports.JsonArgError = JsonArgError;
33
+ /**
34
+ * Parse a JSON string argument with a helpful error message.
35
+ *
36
+ * @param raw - Raw string from CLI flag
37
+ * @param flag - Flag name for error context (e.g., '--data')
38
+ */
39
+ function parseJsonArg(raw, flag = '--data') {
40
+ log('Parsing JSON arg for %s: %s', flag, raw);
41
+ try {
42
+ const parsed = JSON.parse(raw);
43
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
44
+ throw new JsonArgError(`${flag} must be a JSON object (got ${Array.isArray(parsed) ? 'array' : typeof parsed})`, raw);
45
+ }
46
+ return parsed;
47
+ }
48
+ catch (err) {
49
+ if (err instanceof JsonArgError)
50
+ throw err;
51
+ const syntaxErr = err instanceof SyntaxError ? err : undefined;
52
+ throw new JsonArgError(`Invalid JSON for ${flag}: ${syntaxErr?.message ?? String(err)}\n Got: ${raw.slice(0, 200)}`, raw, syntaxErr);
53
+ }
54
+ }
55
+ /**
56
+ * Parse a JSON array argument.
57
+ *
58
+ * @param raw - Raw string from CLI flag
59
+ * @param flag - Flag name for error context (e.g., '--args')
60
+ */
61
+ function parseJsonArray(raw, flag = '--args') {
62
+ log('Parsing JSON array arg for %s: %s', flag, raw);
63
+ try {
64
+ const parsed = JSON.parse(raw);
65
+ if (!Array.isArray(parsed)) {
66
+ throw new JsonArgError(`${flag} must be a JSON array (got ${typeof parsed})`, raw);
67
+ }
68
+ return parsed;
69
+ }
70
+ catch (err) {
71
+ if (err instanceof JsonArgError)
72
+ throw err;
73
+ const syntaxErr = err instanceof SyntaxError ? err : undefined;
74
+ throw new JsonArgError(`Invalid JSON array for ${flag}: ${syntaxErr?.message ?? String(err)}\n Got: ${raw.slice(0, 200)}`, raw, syntaxErr);
75
+ }
76
+ }
77
+ /**
78
+ * Read JSON from a file path, or stdin when filePath is '-'.
79
+ *
80
+ * @param filePath - File path or '-' for stdin
81
+ * @param flag - Flag name for error context
82
+ */
83
+ async function readJsonFile(filePath, flag = '--data-file') {
84
+ let content;
85
+ if (filePath === '-') {
86
+ content = await readStdin();
87
+ }
88
+ else {
89
+ try {
90
+ content = (0, fs_1.readFileSync)(filePath, 'utf8');
91
+ }
92
+ catch (err) {
93
+ throw new JsonArgError(`Cannot read ${flag} from '${filePath}': ${err instanceof Error ? err.message : String(err)}`, filePath);
94
+ }
95
+ }
96
+ return parseJsonArg(content.trim(), flag);
97
+ }
98
+ /**
99
+ * Read stdin as a string.
100
+ */
101
+ function readStdin() {
102
+ return new Promise((resolve, reject) => {
103
+ if (process.stdin.isTTY) {
104
+ resolve('');
105
+ return;
106
+ }
107
+ const chunks = [];
108
+ process.stdin.on('data', (chunk) => chunks.push(chunk));
109
+ process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
110
+ process.stdin.on('error', reject);
111
+ });
112
+ }
113
+ /**
114
+ * Read a text message from a file or stdin.
115
+ */
116
+ async function readMessageFile(filePath) {
117
+ if (filePath === '-') {
118
+ return readStdin();
119
+ }
120
+ try {
121
+ return (0, fs_1.readFileSync)(filePath, 'utf8');
122
+ }
123
+ catch (err) {
124
+ throw new JsonArgError(`Cannot read message from '${filePath}': ${err instanceof Error ? err.message : String(err)}`, filePath);
125
+ }
126
+ }
127
+ /**
128
+ * Parse hours from "1.5" or "1:30" format.
129
+ */
130
+ function parseHours(raw) {
131
+ const trimmed = raw.trim();
132
+ if (trimmed.includes(':')) {
133
+ const parts = trimmed.split(':');
134
+ if (parts.length !== 2) {
135
+ throw new JsonArgError(`Invalid hours format '${raw}': use H:MM or decimal`, raw);
136
+ }
137
+ const h = parseInt(parts[0], 10);
138
+ const m = parseInt(parts[1], 10);
139
+ if (isNaN(h) || isNaN(m) || m < 0 || m >= 60) {
140
+ throw new JsonArgError(`Invalid hours format '${raw}': minutes must be 0-59`, raw);
141
+ }
142
+ return h + m / 60;
143
+ }
144
+ const n = parseFloat(trimmed);
145
+ if (isNaN(n) || n < 0) {
146
+ throw new JsonArgError(`Invalid hours value '${raw}': must be a positive number`, raw);
147
+ }
148
+ return n;
149
+ }
150
+ /**
151
+ * Parse comma-separated IDs into an array of numbers.
152
+ */
153
+ function parseIds(raw) {
154
+ return raw
155
+ .split(',')
156
+ .map((s) => s.trim())
157
+ .filter(Boolean)
158
+ .map((s) => {
159
+ const n = parseInt(s, 10);
160
+ if (isNaN(n))
161
+ throw new JsonArgError(`Invalid ID '${s}': must be a positive integer`, raw);
162
+ return n;
163
+ });
164
+ }
165
+ //# sourceMappingURL=json-arg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-arg.js","sourceRoot":"","sources":["../../src/parsing/json-arg.ts"],"names":[],"mappings":"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"}