@switchbot/openapi-cli 1.1.0 → 1.2.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 (90) hide show
  1. package/README.md +174 -18
  2. package/dist/api/client.d.ts +7 -1
  3. package/dist/api/client.js +44 -8
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/commands/batch.d.ts +2 -0
  6. package/dist/commands/batch.js +252 -0
  7. package/dist/commands/batch.js.map +1 -0
  8. package/dist/commands/cache.d.ts +2 -0
  9. package/dist/commands/cache.js +108 -0
  10. package/dist/commands/cache.js.map +1 -0
  11. package/dist/commands/capabilities.d.ts +2 -0
  12. package/dist/commands/capabilities.js +91 -0
  13. package/dist/commands/capabilities.js.map +1 -0
  14. package/dist/commands/catalog.d.ts +2 -0
  15. package/dist/commands/catalog.js +291 -0
  16. package/dist/commands/catalog.js.map +1 -0
  17. package/dist/commands/config.js +123 -10
  18. package/dist/commands/config.js.map +1 -1
  19. package/dist/commands/devices.js +234 -147
  20. package/dist/commands/devices.js.map +1 -1
  21. package/dist/commands/doctor.d.ts +2 -0
  22. package/dist/commands/doctor.js +147 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/events.d.ts +15 -0
  25. package/dist/commands/events.js +188 -0
  26. package/dist/commands/events.js.map +1 -0
  27. package/dist/commands/explain.d.ts +2 -0
  28. package/dist/commands/explain.js +137 -0
  29. package/dist/commands/explain.js.map +1 -0
  30. package/dist/commands/history.d.ts +2 -0
  31. package/dist/commands/history.js +104 -0
  32. package/dist/commands/history.js.map +1 -0
  33. package/dist/commands/mcp.d.ts +4 -0
  34. package/dist/commands/mcp.js +386 -0
  35. package/dist/commands/mcp.js.map +1 -0
  36. package/dist/commands/plan.d.ts +37 -0
  37. package/dist/commands/plan.js +344 -0
  38. package/dist/commands/plan.js.map +1 -0
  39. package/dist/commands/quota.d.ts +2 -0
  40. package/dist/commands/quota.js +77 -0
  41. package/dist/commands/quota.js.map +1 -0
  42. package/dist/commands/scenes.js +19 -13
  43. package/dist/commands/scenes.js.map +1 -1
  44. package/dist/commands/schema.d.ts +2 -0
  45. package/dist/commands/schema.js +77 -0
  46. package/dist/commands/schema.js.map +1 -0
  47. package/dist/commands/watch.d.ts +2 -0
  48. package/dist/commands/watch.js +161 -0
  49. package/dist/commands/watch.js.map +1 -0
  50. package/dist/commands/webhook.js +37 -22
  51. package/dist/commands/webhook.js.map +1 -1
  52. package/dist/config.d.ts +11 -0
  53. package/dist/config.js +32 -6
  54. package/dist/config.js.map +1 -1
  55. package/dist/devices/cache.d.ts +50 -0
  56. package/dist/devices/cache.js +152 -1
  57. package/dist/devices/cache.js.map +1 -1
  58. package/dist/devices/catalog.d.ts +49 -0
  59. package/dist/devices/catalog.js +362 -92
  60. package/dist/devices/catalog.js.map +1 -1
  61. package/dist/index.js +31 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/lib/devices.d.ts +144 -0
  64. package/dist/lib/devices.js +329 -0
  65. package/dist/lib/devices.js.map +1 -0
  66. package/dist/lib/scenes.d.ts +7 -0
  67. package/dist/lib/scenes.js +11 -0
  68. package/dist/lib/scenes.js.map +1 -0
  69. package/dist/utils/audit.d.ts +13 -0
  70. package/dist/utils/audit.js +43 -0
  71. package/dist/utils/audit.js.map +1 -0
  72. package/dist/utils/filter.d.ts +45 -0
  73. package/dist/utils/filter.js +96 -0
  74. package/dist/utils/filter.js.map +1 -0
  75. package/dist/utils/flags.d.ts +42 -0
  76. package/dist/utils/flags.js +108 -0
  77. package/dist/utils/flags.js.map +1 -1
  78. package/dist/utils/format.d.ts +9 -0
  79. package/dist/utils/format.js +109 -0
  80. package/dist/utils/format.js.map +1 -0
  81. package/dist/utils/output.d.ts +11 -0
  82. package/dist/utils/output.js +37 -6
  83. package/dist/utils/output.js.map +1 -1
  84. package/dist/utils/quota.d.ts +48 -0
  85. package/dist/utils/quota.js +144 -0
  86. package/dist/utils/quota.js.map +1 -0
  87. package/dist/utils/retry.d.ts +23 -0
  88. package/dist/utils/retry.js +60 -0
  89. package/dist/utils/retry.js.map +1 -0
  90. package/package.json +4 -1
@@ -0,0 +1,11 @@
1
+ import { createClient } from '../api/client.js';
2
+ export async function fetchScenes(client) {
3
+ const c = client ?? createClient();
4
+ const res = await c.get('/v1.1/scenes');
5
+ return res.data.body;
6
+ }
7
+ export async function executeScene(sceneId, client) {
8
+ const c = client ?? createClient();
9
+ await c.post(`/v1.1/scenes/${sceneId}/execute`);
10
+ }
11
+ //# sourceMappingURL=scenes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenes.js","sourceRoot":"","sources":["../../src/lib/scenes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOhD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAsB;IACtD,MAAM,CAAC,GAAG,MAAM,IAAI,YAAY,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,CAAoB,cAAc,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,MAAsB;IACxE,MAAM,CAAC,GAAG,MAAM,IAAI,YAAY,EAAE,CAAC;IACnC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,OAAO,UAAU,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface AuditEntry {
2
+ t: string;
3
+ kind: 'command';
4
+ deviceId: string;
5
+ command: string;
6
+ parameter: unknown;
7
+ commandType: 'command' | 'customize';
8
+ dryRun: boolean;
9
+ result?: 'ok' | 'error';
10
+ error?: string;
11
+ }
12
+ export declare function writeAudit(entry: AuditEntry): void;
13
+ export declare function readAudit(file: string): AuditEntry[];
@@ -0,0 +1,43 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { getAuditLog } from './flags.js';
4
+ function resolveAuditPath() {
5
+ const flag = getAuditLog();
6
+ if (flag === null)
7
+ return null;
8
+ return path.resolve(flag);
9
+ }
10
+ export function writeAudit(entry) {
11
+ const file = resolveAuditPath();
12
+ if (!file)
13
+ return;
14
+ const dir = path.dirname(file);
15
+ try {
16
+ if (!fs.existsSync(dir)) {
17
+ fs.mkdirSync(dir, { recursive: true });
18
+ }
19
+ fs.appendFileSync(file, JSON.stringify(entry) + '\n');
20
+ }
21
+ catch {
22
+ // Best-effort — never let audit failures break the actual command.
23
+ }
24
+ }
25
+ export function readAudit(file) {
26
+ if (!fs.existsSync(file))
27
+ return [];
28
+ const raw = fs.readFileSync(file, 'utf-8');
29
+ const out = [];
30
+ for (const line of raw.split(/\r?\n/)) {
31
+ const trimmed = line.trim();
32
+ if (!trimmed)
33
+ continue;
34
+ try {
35
+ out.push(JSON.parse(trimmed));
36
+ }
37
+ catch {
38
+ // skip malformed lines
39
+ }
40
+ }
41
+ return out;
42
+ }
43
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/utils/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAczC,SAAS,gBAAgB;IACvB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAiB;IAC1C,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { Device, InfraredDevice } from '../lib/devices.js';
2
+ /**
3
+ * A parsed filter clause. Each clause is an (op, key, value) triple that runs
4
+ * against a candidate device. All clauses from a single expression are AND-ed.
5
+ */
6
+ export interface FilterClause {
7
+ key: 'type' | 'family' | 'room' | 'category';
8
+ op: '=' | '~=';
9
+ value: string;
10
+ }
11
+ export declare class FilterSyntaxError extends Error {
12
+ constructor(message: string);
13
+ }
14
+ /**
15
+ * Parse a filter expression like "type=Bot,family=Home" into discrete clauses.
16
+ *
17
+ * Grammar:
18
+ * expr := clause ("," clause)*
19
+ * clause := KEY OP VALUE
20
+ * KEY := type | family | room | category
21
+ * OP := "=" | "~="
22
+ * VALUE := any non-empty string (no comma — split at the clause boundary)
23
+ *
24
+ * Whitespace around keys / values is trimmed. Empty expressions return [].
25
+ */
26
+ export declare function parseFilter(expr: string | undefined): FilterClause[];
27
+ interface FilterableDevice {
28
+ deviceId: string;
29
+ type: string;
30
+ family?: string;
31
+ room?: string;
32
+ category: 'physical' | 'ir';
33
+ }
34
+ /**
35
+ * Apply the parsed clauses to a mixed list of physical devices + IR remotes.
36
+ * Returns the deviceIds of the entries that satisfy every clause.
37
+ *
38
+ * `hubLocation` (optional) allows family/room filters to match IR remotes by
39
+ * the Hub-inherited location.
40
+ */
41
+ export declare function applyFilter(clauses: FilterClause[], deviceList: Device[], infraredRemoteList: InfraredDevice[], hubLocation?: Map<string, {
42
+ family?: string;
43
+ room?: string;
44
+ }>): FilterableDevice[];
45
+ export {};
@@ -0,0 +1,96 @@
1
+ export class FilterSyntaxError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'FilterSyntaxError';
5
+ }
6
+ }
7
+ const VALID_KEYS = ['type', 'family', 'room', 'category'];
8
+ /**
9
+ * Parse a filter expression like "type=Bot,family=Home" into discrete clauses.
10
+ *
11
+ * Grammar:
12
+ * expr := clause ("," clause)*
13
+ * clause := KEY OP VALUE
14
+ * KEY := type | family | room | category
15
+ * OP := "=" | "~="
16
+ * VALUE := any non-empty string (no comma — split at the clause boundary)
17
+ *
18
+ * Whitespace around keys / values is trimmed. Empty expressions return [].
19
+ */
20
+ export function parseFilter(expr) {
21
+ if (!expr)
22
+ return [];
23
+ const parts = expr.split(',').map((p) => p.trim()).filter((p) => p.length > 0);
24
+ const clauses = [];
25
+ for (const part of parts) {
26
+ const m = /^([a-zA-Z_]+)\s*(~=|=)\s*(.+)$/.exec(part);
27
+ if (!m) {
28
+ throw new FilterSyntaxError(`Invalid filter clause "${part}" — expected "<key>=<value>" or "<key>~=<pattern>"`);
29
+ }
30
+ const key = m[1];
31
+ const op = m[2];
32
+ const value = m[3].trim();
33
+ if (!VALID_KEYS.includes(key)) {
34
+ throw new FilterSyntaxError(`Unknown filter key "${key}" — supported: ${VALID_KEYS.join(', ')}`);
35
+ }
36
+ if (!value) {
37
+ throw new FilterSyntaxError(`Empty value for filter clause "${part}"`);
38
+ }
39
+ clauses.push({ key, op, value });
40
+ }
41
+ return clauses;
42
+ }
43
+ /** Normalize a physical / IR device entry to the shape the filter matcher expects. */
44
+ function toFilterable(d, isPhysical, hubLocation) {
45
+ if (isPhysical) {
46
+ const p = d;
47
+ return {
48
+ deviceId: p.deviceId,
49
+ type: p.deviceType ?? '',
50
+ family: p.familyName ?? undefined,
51
+ room: p.roomName ?? undefined,
52
+ category: 'physical',
53
+ };
54
+ }
55
+ const ir = d;
56
+ const inherited = hubLocation?.get(ir.hubDeviceId);
57
+ return {
58
+ deviceId: ir.deviceId,
59
+ type: ir.remoteType ?? '',
60
+ family: inherited?.family,
61
+ room: inherited?.room,
62
+ category: 'ir',
63
+ };
64
+ }
65
+ function matches(d, clause) {
66
+ const candidate = clause.key === 'type'
67
+ ? d.type
68
+ : clause.key === 'family'
69
+ ? d.family
70
+ : clause.key === 'room'
71
+ ? d.room
72
+ : d.category;
73
+ if (candidate === undefined)
74
+ return false;
75
+ if (clause.op === '=')
76
+ return candidate.toLowerCase() === clause.value.toLowerCase();
77
+ // '~=' — case-insensitive substring match on the candidate.
78
+ return candidate.toLowerCase().includes(clause.value.toLowerCase());
79
+ }
80
+ /**
81
+ * Apply the parsed clauses to a mixed list of physical devices + IR remotes.
82
+ * Returns the deviceIds of the entries that satisfy every clause.
83
+ *
84
+ * `hubLocation` (optional) allows family/room filters to match IR remotes by
85
+ * the Hub-inherited location.
86
+ */
87
+ export function applyFilter(clauses, deviceList, infraredRemoteList, hubLocation) {
88
+ const candidates = [
89
+ ...deviceList.map((d) => toFilterable(d, true)),
90
+ ...infraredRemoteList.map((d) => toFilterable(d, false, hubLocation)),
91
+ ];
92
+ if (clauses.length === 0)
93
+ return candidates;
94
+ return candidates.filter((c) => clauses.every((clause) => matches(c, clause)));
95
+ }
96
+ //# sourceMappingURL=filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/utils/filter.ts"],"names":[],"mappings":"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"}
@@ -8,3 +8,45 @@ export declare function isDryRun(): boolean;
8
8
  export declare function getTimeout(): number;
9
9
  /** Override for the credentials file path. */
10
10
  export declare function getConfigPath(): string | undefined;
11
+ /** Named profile → ~/.switchbot/profiles/<name>.json. */
12
+ export declare function getProfile(): string | undefined;
13
+ /**
14
+ * Audit log path. `--audit-log <path>` enables JSONL append on every mutating
15
+ * command; default path is ~/.switchbot/audit.log when `--audit-log` is given
16
+ * without a value. Returns null when the flag is absent.
17
+ */
18
+ export declare function getAuditLog(): string | null;
19
+ /**
20
+ * Max 429 retries before surfacing the error. Default 3. `--no-retry`
21
+ * disables retries entirely; `--retry-on-429 <n>` overrides the count.
22
+ */
23
+ export declare function getRetryOn429(): number;
24
+ /** Backoff strategy for 429 retries. Default 'exponential'. */
25
+ export declare function getBackoffStrategy(): 'linear' | 'exponential';
26
+ /**
27
+ * Whether local quota counting is disabled. Quota counting is best-effort
28
+ * (see src/utils/quota.ts) — this lets scripts opt out entirely when even
29
+ * best-effort file I/O is unwelcome.
30
+ */
31
+ export declare function isQuotaDisabled(): boolean;
32
+ /**
33
+ * Cache TTL controls. Values:
34
+ * - `--no-cache` → disable cache for all reads
35
+ * - `--cache off` → same as `--no-cache`
36
+ * - `--cache auto` (default) → list cache on (1h), status cache off
37
+ * - `--cache 5m` | `--cache 1h` → enable both stores with the given TTL
38
+ * - numeric millisecond values are also accepted
39
+ */
40
+ export interface CacheMode {
41
+ /** TTL for the device-list cache, in ms. 0/undefined = off. */
42
+ listTtlMs: number;
43
+ /** TTL for the device-status cache, in ms. 0/undefined = off. */
44
+ statusTtlMs: number;
45
+ }
46
+ declare function parseDurationToMs(v: string): number | null;
47
+ export { parseDurationToMs };
48
+ /** The --format flag value, or undefined when absent. */
49
+ export declare function getFormat(): string | undefined;
50
+ /** Comma-separated --fields value, split into an array. */
51
+ export declare function getFields(): string[] | undefined;
52
+ export declare function getCacheMode(): CacheMode;
@@ -31,4 +31,112 @@ export function getTimeout() {
31
31
  export function getConfigPath() {
32
32
  return getFlagValue('--config');
33
33
  }
34
+ /** Named profile → ~/.switchbot/profiles/<name>.json. */
35
+ export function getProfile() {
36
+ return getFlagValue('--profile');
37
+ }
38
+ /**
39
+ * Audit log path. `--audit-log <path>` enables JSONL append on every mutating
40
+ * command; default path is ~/.switchbot/audit.log when `--audit-log` is given
41
+ * without a value. Returns null when the flag is absent.
42
+ */
43
+ export function getAuditLog() {
44
+ const idx = process.argv.indexOf('--audit-log');
45
+ if (idx === -1)
46
+ return null;
47
+ const next = process.argv[idx + 1];
48
+ if (!next || next.startsWith('-')) {
49
+ // bare --audit-log → default location
50
+ return `${process.env.HOME ?? process.env.USERPROFILE ?? '.'}/.switchbot/audit.log`;
51
+ }
52
+ return next;
53
+ }
54
+ /**
55
+ * Max 429 retries before surfacing the error. Default 3. `--no-retry`
56
+ * disables retries entirely; `--retry-on-429 <n>` overrides the count.
57
+ */
58
+ export function getRetryOn429() {
59
+ if (process.argv.includes('--no-retry'))
60
+ return 0;
61
+ const v = getFlagValue('--retry-on-429');
62
+ if (v === undefined)
63
+ return 3;
64
+ const n = Number(v);
65
+ if (!Number.isFinite(n) || n < 0)
66
+ return 3;
67
+ return Math.floor(n);
68
+ }
69
+ /** Backoff strategy for 429 retries. Default 'exponential'. */
70
+ export function getBackoffStrategy() {
71
+ const v = getFlagValue('--backoff');
72
+ if (v === 'linear')
73
+ return 'linear';
74
+ return 'exponential';
75
+ }
76
+ /**
77
+ * Whether local quota counting is disabled. Quota counting is best-effort
78
+ * (see src/utils/quota.ts) — this lets scripts opt out entirely when even
79
+ * best-effort file I/O is unwelcome.
80
+ */
81
+ export function isQuotaDisabled() {
82
+ return process.argv.includes('--no-quota');
83
+ }
84
+ const DEFAULT_LIST_TTL_MS = 60 * 60 * 1000;
85
+ function parseDurationToMs(v) {
86
+ const m = /^(\d+)(ms|s|m|h)?$/.exec(v.trim().toLowerCase());
87
+ if (!m)
88
+ return null;
89
+ const n = Number(m[1]);
90
+ if (!Number.isFinite(n) || n < 0)
91
+ return null;
92
+ const unit = m[2] ?? 'ms';
93
+ switch (unit) {
94
+ case 'ms': return n;
95
+ case 's': return n * 1000;
96
+ case 'm': return n * 60 * 1000;
97
+ case 'h': return n * 60 * 60 * 1000;
98
+ default: return null;
99
+ }
100
+ }
101
+ export { parseDurationToMs };
102
+ /** The --format flag value, or undefined when absent. */
103
+ export function getFormat() {
104
+ return getFlagValue('--format');
105
+ }
106
+ /** Comma-separated --fields value, split into an array. */
107
+ export function getFields() {
108
+ const v = getFlagValue('--fields');
109
+ if (!v)
110
+ return undefined;
111
+ return v.split(',').map((f) => f.trim()).filter(Boolean);
112
+ }
113
+ export function getCacheMode() {
114
+ if (process.argv.includes('--no-cache')) {
115
+ return { listTtlMs: 0, statusTtlMs: 0 };
116
+ }
117
+ // Individual TTL overrides take precedence over the combined --cache flag.
118
+ const listFlag = getFlagValue('--cache-list');
119
+ const statusFlag = getFlagValue('--cache-status');
120
+ if (listFlag !== undefined || statusFlag !== undefined) {
121
+ const listTtlMs = listFlag !== undefined
122
+ ? (parseDurationToMs(listFlag) ?? DEFAULT_LIST_TTL_MS)
123
+ : DEFAULT_LIST_TTL_MS;
124
+ const statusTtlMs = statusFlag !== undefined
125
+ ? (parseDurationToMs(statusFlag) ?? 0)
126
+ : 0;
127
+ return { listTtlMs, statusTtlMs };
128
+ }
129
+ const v = getFlagValue('--cache');
130
+ if (!v || v === 'auto') {
131
+ return { listTtlMs: DEFAULT_LIST_TTL_MS, statusTtlMs: 0 };
132
+ }
133
+ if (v === 'off') {
134
+ return { listTtlMs: 0, statusTtlMs: 0 };
135
+ }
136
+ const ms = parseDurationToMs(v);
137
+ if (ms === null || ms === 0) {
138
+ return { listTtlMs: DEFAULT_LIST_TTL_MS, statusTtlMs: 0 };
139
+ }
140
+ return { listTtlMs: ms, statusTtlMs: ms };
141
+ }
34
142
  //# sourceMappingURL=flags.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,SAAS,YAAY,CAAC,GAAG,SAAmB;IAC1C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAChD,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC5C,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACtB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACjD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,aAAa;IAC3B,OAAO,YAAY,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type OutputFormat = 'table' | 'json' | 'jsonl' | 'tsv' | 'yaml' | 'id';
2
+ export declare function parseFormat(flag: string | undefined): OutputFormat;
3
+ export declare function resolveFormat(): OutputFormat;
4
+ export declare function resolveFields(): string[] | undefined;
5
+ export declare function filterFields(headers: string[], rows: unknown[][], fields: string[] | undefined): {
6
+ headers: string[];
7
+ rows: unknown[][];
8
+ };
9
+ export declare function renderRows(headers: string[], rows: unknown[][], format: OutputFormat, fields?: string[]): void;
@@ -0,0 +1,109 @@
1
+ import { printTable, printJson, isJsonMode, UsageError } from './output.js';
2
+ import { getFormat, getFields } from './flags.js';
3
+ import { dump as yamlDump } from 'js-yaml';
4
+ export function parseFormat(flag) {
5
+ if (!flag)
6
+ return 'table';
7
+ const lower = flag.toLowerCase();
8
+ switch (lower) {
9
+ case 'table': return 'table';
10
+ case 'json': return 'json';
11
+ case 'jsonl': return 'jsonl';
12
+ case 'tsv': return 'tsv';
13
+ case 'yaml': return 'yaml';
14
+ case 'id': return 'id';
15
+ default: {
16
+ const msg = `Unknown --format "${flag}". Expected: table, json, jsonl, tsv, yaml, id.`;
17
+ if (isJsonMode()) {
18
+ console.error(JSON.stringify({ error: { code: 2, kind: 'usage', message: msg } }));
19
+ }
20
+ else {
21
+ console.error(msg);
22
+ }
23
+ process.exit(2);
24
+ }
25
+ }
26
+ }
27
+ export function resolveFormat() {
28
+ if (process.argv.includes('--json'))
29
+ return 'json';
30
+ return parseFormat(getFormat());
31
+ }
32
+ export function resolveFields() {
33
+ return getFields();
34
+ }
35
+ export function filterFields(headers, rows, fields) {
36
+ if (!fields || fields.length === 0)
37
+ return { headers, rows };
38
+ const unknown = fields.filter((f) => !headers.includes(f));
39
+ if (unknown.length > 0) {
40
+ throw new UsageError(`Unknown field(s): ${unknown.map((f) => `"${f}"`).join(', ')}. ` +
41
+ `Allowed: ${headers.map((f) => `"${f}"`).join(', ')}.`);
42
+ }
43
+ const indices = fields.map((f) => headers.indexOf(f));
44
+ return {
45
+ headers: indices.map((i) => headers[i]),
46
+ rows: rows.map((row) => indices.map((i) => row[i])),
47
+ };
48
+ }
49
+ function cellToString(cell) {
50
+ if (cell === null || cell === undefined)
51
+ return '';
52
+ if (typeof cell === 'boolean')
53
+ return cell ? 'true' : 'false';
54
+ if (typeof cell === 'object')
55
+ return JSON.stringify(cell);
56
+ return String(cell);
57
+ }
58
+ function rowToObject(headers, row) {
59
+ const obj = {};
60
+ for (let i = 0; i < headers.length; i++) {
61
+ obj[headers[i]] = row[i] ?? null;
62
+ }
63
+ return obj;
64
+ }
65
+ export function renderRows(headers, rows, format, fields) {
66
+ const filtered = filterFields(headers, rows, fields);
67
+ const h = filtered.headers;
68
+ const r = filtered.rows;
69
+ switch (format) {
70
+ case 'table':
71
+ printTable(h, r);
72
+ break;
73
+ case 'json':
74
+ printJson(r.map((row) => rowToObject(h, row)));
75
+ break;
76
+ case 'jsonl':
77
+ for (const row of r) {
78
+ console.log(JSON.stringify(rowToObject(h, row)));
79
+ }
80
+ break;
81
+ case 'tsv':
82
+ console.log(h.join('\t'));
83
+ for (const row of r) {
84
+ console.log(row.map(cellToString).join('\t'));
85
+ }
86
+ break;
87
+ case 'yaml':
88
+ for (const row of r) {
89
+ const obj = rowToObject(h, row);
90
+ console.log('---');
91
+ console.log(yamlDump(obj, { lineWidth: -1 }).trimEnd());
92
+ }
93
+ break;
94
+ case 'id': {
95
+ const idIdx = h.indexOf('deviceId') !== -1 ? h.indexOf('deviceId')
96
+ : h.indexOf('sceneId') !== -1 ? h.indexOf('sceneId')
97
+ : -1;
98
+ if (idIdx === -1) {
99
+ throw new UsageError(`--format=id requires a "deviceId" or "sceneId" column. ` +
100
+ `This command outputs: ${h.map((c) => `"${c}"`).join(', ')}.`);
101
+ }
102
+ for (const row of r) {
103
+ console.log(cellToString(row[idIdx]));
104
+ }
105
+ break;
106
+ }
107
+ }
108
+ }
109
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,15 @@ export declare function isJsonMode(): boolean;
2
2
  export declare function printJson(data: unknown): void;
3
3
  export declare function printTable(headers: string[], rows: (string | number | boolean | null | undefined)[][]): void;
4
4
  export declare function printKeyValue(data: Record<string, unknown>): void;
5
+ export declare class UsageError extends Error {
6
+ constructor(message: string);
7
+ }
8
+ export interface ErrorPayload {
9
+ code: number;
10
+ kind: 'usage' | 'api' | 'runtime';
11
+ message: string;
12
+ hint?: string;
13
+ retryable?: boolean;
14
+ }
15
+ export declare function buildErrorPayload(error: unknown): ErrorPayload;
5
16
  export declare function handleError(error: unknown): never;
@@ -1,8 +1,9 @@
1
1
  import Table from 'cli-table3';
2
2
  import chalk from 'chalk';
3
3
  import { ApiError, DryRunSignal } from '../api/client.js';
4
+ import { getFormat } from './flags.js';
4
5
  export function isJsonMode() {
5
- return process.argv.includes('--json');
6
+ return process.argv.includes('--json') || getFormat() === 'json';
6
7
  }
7
8
  export function printJson(data) {
8
9
  console.log(JSON.stringify(data, null, 2));
@@ -37,18 +38,48 @@ export function printKeyValue(data) {
37
38
  }
38
39
  console.log(table.toString());
39
40
  }
41
+ export class UsageError extends Error {
42
+ constructor(message) {
43
+ super(message);
44
+ this.name = 'UsageError';
45
+ }
46
+ }
47
+ export function buildErrorPayload(error) {
48
+ if (error instanceof UsageError) {
49
+ return { code: 2, kind: 'usage', message: error.message };
50
+ }
51
+ const code = error instanceof ApiError ? error.code : 1;
52
+ const kind = error instanceof ApiError ? 'api' : 'runtime';
53
+ const message = error instanceof Error ? error.message : 'An unknown error occurred';
54
+ const hint = error instanceof ApiError ? (error.hint ?? errorHint(error.code)) : null;
55
+ const retryable = error instanceof ApiError ? error.retryable : false;
56
+ const payload = { code, kind, message };
57
+ if (hint)
58
+ payload.hint = hint;
59
+ if (retryable)
60
+ payload.retryable = true;
61
+ return payload;
62
+ }
40
63
  export function handleError(error) {
41
64
  if (error instanceof DryRunSignal) {
42
65
  process.exit(0);
43
66
  }
67
+ const payload = buildErrorPayload(error);
68
+ if (isJsonMode()) {
69
+ console.error(JSON.stringify({ error: payload }));
70
+ process.exit(payload.code === 2 ? 2 : 1);
71
+ }
72
+ if (payload.kind === 'usage') {
73
+ console.error(payload.message);
74
+ process.exit(2);
75
+ }
44
76
  if (error instanceof ApiError) {
45
- console.error(chalk.red(`Error (code ${error.code}): ${error.message}`));
46
- const hint = errorHint(error.code);
47
- if (hint)
48
- console.error(chalk.grey(`Hint: ${hint}`));
77
+ console.error(chalk.red(`Error (code ${error.code}): ${payload.message}`));
78
+ if (payload.hint)
79
+ console.error(chalk.grey(`Hint: ${payload.hint}`));
49
80
  }
50
81
  else if (error instanceof Error) {
51
- console.error(chalk.red(`Error: ${error.message}`));
82
+ console.error(chalk.red(`Error: ${payload.message}`));
52
83
  }
53
84
  else {
54
85
  console.error(chalk.red('An unknown error occurred'));
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}