monday-cli 0.7.0 → 0.8.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.
- package/CHANGELOG.md +250 -0
- package/README.md +87 -45
- package/dist/api/assets.d.ts +3 -3
- package/dist/api/board-metadata.d.ts +7 -4
- package/dist/api/board-metadata.d.ts.map +1 -1
- package/dist/api/board-metadata.js +21 -6
- package/dist/api/board-metadata.js.map +1 -1
- package/dist/api/column-types.d.ts +14 -7
- package/dist/api/column-types.d.ts.map +1 -1
- package/dist/api/column-types.js +14 -7
- package/dist/api/column-types.js.map +1 -1
- package/dist/api/error-decoration.d.ts +124 -0
- package/dist/api/error-decoration.d.ts.map +1 -0
- package/dist/api/error-decoration.js +161 -0
- package/dist/api/error-decoration.js.map +1 -0
- package/dist/api/fetch-transport-helpers.d.ts +97 -0
- package/dist/api/fetch-transport-helpers.d.ts.map +1 -0
- package/dist/api/fetch-transport-helpers.js +175 -0
- package/dist/api/fetch-transport-helpers.js.map +1 -0
- package/dist/api/file-column-set.d.ts +388 -82
- package/dist/api/file-column-set.d.ts.map +1 -1
- package/dist/api/file-column-set.js +466 -88
- package/dist/api/file-column-set.js.map +1 -1
- package/dist/api/multipart-transport.d.ts +95 -60
- package/dist/api/multipart-transport.d.ts.map +1 -1
- package/dist/api/multipart-transport.js +102 -120
- package/dist/api/multipart-transport.js.map +1 -1
- package/dist/api/transport.d.ts.map +1 -1
- package/dist/api/transport.js +2 -99
- package/dist/api/transport.js.map +1 -1
- package/dist/cli/program.js +1 -1
- package/dist/cli/program.js.map +1 -1
- package/dist/commands/auth/login.js +1 -1
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/logout.js +1 -1
- package/dist/commands/auth/logout.js.map +1 -1
- package/dist/commands/board/column-create.d.ts +20 -2
- package/dist/commands/board/column-create.d.ts.map +1 -1
- package/dist/commands/board/column-create.js +191 -20
- package/dist/commands/board/column-create.js.map +1 -1
- package/dist/commands/board/describe.d.ts +5 -3
- package/dist/commands/board/describe.d.ts.map +1 -1
- package/dist/commands/board/describe.js +12 -4
- package/dist/commands/board/describe.js.map +1 -1
- package/dist/commands/completion.js +1 -1
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/dev/configure.js +1 -1
- package/dist/commands/dev/configure.js.map +1 -1
- package/dist/commands/dev/discover.js +1 -1
- package/dist/commands/dev/discover.js.map +1 -1
- package/dist/commands/dev/doctor.js +1 -1
- package/dist/commands/dev/doctor.js.map +1 -1
- package/dist/commands/dev/epic/items.js +2 -2
- package/dist/commands/dev/epic/items.js.map +1 -1
- package/dist/commands/dev/epic/list.js +2 -2
- package/dist/commands/dev/epic/list.js.map +1 -1
- package/dist/commands/dev/release/list.js +2 -2
- package/dist/commands/dev/release/list.js.map +1 -1
- package/dist/commands/dev/sprint/current.js +2 -2
- package/dist/commands/dev/sprint/current.js.map +1 -1
- package/dist/commands/dev/sprint/items.js +2 -2
- package/dist/commands/dev/sprint/items.js.map +1 -1
- package/dist/commands/dev/sprint/list.js +2 -2
- package/dist/commands/dev/sprint/list.js.map +1 -1
- package/dist/commands/dev/task/block.js +2 -2
- package/dist/commands/dev/task/block.js.map +1 -1
- package/dist/commands/dev/task/done.js +2 -2
- package/dist/commands/dev/task/done.js.map +1 -1
- package/dist/commands/dev/task/list.js +2 -2
- package/dist/commands/dev/task/list.js.map +1 -1
- package/dist/commands/dev/task/start.js +2 -2
- package/dist/commands/dev/task/start.js.map +1 -1
- package/dist/commands/doc/get.js +1 -1
- package/dist/commands/doc/get.js.map +1 -1
- package/dist/commands/doc/list.js +1 -1
- package/dist/commands/doc/list.js.map +1 -1
- package/dist/commands/emit.d.ts.map +1 -1
- package/dist/commands/emit.js +19 -16
- package/dist/commands/emit.js.map +1 -1
- package/dist/commands/item/clear.d.ts.map +1 -1
- package/dist/commands/item/clear.js +15 -41
- package/dist/commands/item/clear.js.map +1 -1
- package/dist/commands/item/create.d.ts +93 -1
- package/dist/commands/item/create.d.ts.map +1 -1
- package/dist/commands/item/create.js +474 -53
- package/dist/commands/item/create.js.map +1 -1
- package/dist/commands/item/search.js +7 -7
- package/dist/commands/item/search.js.map +1 -1
- package/dist/commands/item/set.d.ts +1 -0
- package/dist/commands/item/set.d.ts.map +1 -1
- package/dist/commands/item/set.js +94 -1
- package/dist/commands/item/set.js.map +1 -1
- package/dist/commands/item/time-track/start.js +2 -2
- package/dist/commands/item/time-track/start.js.map +1 -1
- package/dist/commands/item/time-track/stop.js +2 -2
- package/dist/commands/item/time-track/stop.js.map +1 -1
- package/dist/commands/item/update.d.ts +128 -11
- package/dist/commands/item/update.d.ts.map +1 -1
- package/dist/commands/item/update.js +784 -82
- package/dist/commands/item/update.js.map +1 -1
- package/dist/commands/item/upload.js +5 -5
- package/dist/commands/item/upload.js.map +1 -1
- package/dist/commands/item/watch.js +2 -2
- package/dist/commands/item/watch.js.map +1 -1
- package/dist/commands/notification/send.js +1 -1
- package/dist/commands/notification/send.js.map +1 -1
- package/dist/commands/update/upload.js +3 -3
- package/dist/commands/update/upload.js.map +1 -1
- package/dist/commands/user/team-add-members.js +1 -1
- package/dist/commands/user/team-add-members.js.map +1 -1
- package/dist/commands/user/team-create.js +1 -1
- package/dist/commands/user/team-create.js.map +1 -1
- package/dist/commands/user/team-remove-members.js +1 -1
- package/dist/commands/user/team-remove-members.js.map +1 -1
- package/dist/commands/webhook/create.js +1 -1
- package/dist/commands/webhook/create.js.map +1 -1
- package/dist/commands/webhook/delete.js +1 -1
- package/dist/commands/webhook/delete.js.map +1 -1
- package/dist/commands/webhook/list.js +1 -1
- package/dist/commands/webhook/list.js.map +1 -1
- package/dist/utils/file-source.d.ts +109 -0
- package/dist/utils/file-source.d.ts.map +1 -1
- package/dist/utils/file-source.js +123 -0
- package/dist/utils/file-source.js.map +1 -1
- package/dist/utils/output/select.d.ts +22 -0
- package/dist/utils/output/select.d.ts.map +1 -1
- package/dist/utils/output/select.js +30 -0
- package/dist/utils/output/select.js.map +1 -1
- package/dist/utils/output/table.d.ts +10 -0
- package/dist/utils/output/table.d.ts.map +1 -1
- package/dist/utils/output/table.js +40 -3
- package/dist/utils/output/table.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared fetch-transport helpers (R-v0.8-NEW-11, v0.8). Both transport
|
|
3
|
+
* seams — the JSON `client.request`-over-`fetch` seam in
|
|
4
|
+
* `transport.ts` and the multipart `add_file_to_column`-over-`/v2/file`
|
|
5
|
+
* seam in `multipart-transport.ts` — need the same four primitives:
|
|
6
|
+
* a URL-/token-free fetch-error descriptor, an abort-vs-real-error
|
|
7
|
+
* discriminator, a `Headers` → record flattener, and an N-way
|
|
8
|
+
* `AbortSignal` combiner. Before this lift each module carried a
|
|
9
|
+
* verbatim-or-near-verbatim private copy; the multipart docstrings
|
|
10
|
+
* literally read "Mirrors `transport.ts:describeFetchError`" /
|
|
11
|
+
* "Mirrors `transport.ts:combineSignals`".
|
|
12
|
+
*
|
|
13
|
+
* **Why consolidate — not just tidy-up dedupe:**
|
|
14
|
+
*
|
|
15
|
+
* 1. **One test set covers the shared defensive branches once.** The
|
|
16
|
+
* `describeFetchError` TLS `UNABLE_TO_*` arm + `combineSignals`'s
|
|
17
|
+
* empty-input guard were uncovered in BOTH copies — duplicated
|
|
18
|
+
* uncovered branches that dragged global branch coverage below the
|
|
19
|
+
* 95.45% floor (R-v0.8-NEW-10, CI red). A single direct unit test
|
|
20
|
+
* on the shared module exercises every arm once instead of
|
|
21
|
+
* relying on two transports to drive each copy through `fetch`.
|
|
22
|
+
* 2. **The two `combineSignals` had already DRIFTED.**
|
|
23
|
+
* `transport.ts` hedged behind `typeof AbortSignal.any ===
|
|
24
|
+
* 'function'` + a legacy Node-<19 controller fallback;
|
|
25
|
+
* `multipart-transport.ts` assumed `AbortSignal.any` exists. The
|
|
26
|
+
* lift keeps `transport.ts`'s fallback — the safer SUPERSET — so a
|
|
27
|
+
* downstream embedder on an older Node still gets correct signal
|
|
28
|
+
* combination (R-v0.8-NEW-11 over-fit watch: the divergence is
|
|
29
|
+
* real, not cosmetic; do NOT collapse to multipart's narrower
|
|
30
|
+
* form).
|
|
31
|
+
* 3. **The fetch-error vocabulary is a contract surface.** Agents
|
|
32
|
+
* reading either transport's `error.message` see the SAME
|
|
33
|
+
* `connection refused` / `dns lookup failed` / `tls error`
|
|
34
|
+
* strings regardless of which seam issued the call — convergence
|
|
35
|
+
* was already an explicit goal in the old multipart docstring
|
|
36
|
+
* ("keep messaging stable across the JSON + multipart paths").
|
|
37
|
+
*
|
|
38
|
+
* This is helper-sharing, NOT a merge of the two transport seams —
|
|
39
|
+
* they keep separate modules + separate `Transport` /
|
|
40
|
+
* `MultipartTransport` interfaces per their different bodies (JSON
|
|
41
|
+
* `body: JSON.stringify(...)` vs `FormData` multipart). See
|
|
42
|
+
* `docs/architecture.md` "Wire-vs-CLI semantics documentation
|
|
43
|
+
* conventions" (R-NEW-41) for why the seams stay split.
|
|
44
|
+
*/
|
|
45
|
+
import { errorCode } from '../utils/errors.js';
|
|
46
|
+
/**
|
|
47
|
+
* True for `fetch` rejections that mean "the request was aborted"
|
|
48
|
+
* (caller cancellation OR `AbortSignal.timeout`) rather than a real
|
|
49
|
+
* network failure. Callers use it to discriminate timeout from
|
|
50
|
+
* network_error: the timeout signal won iff the caller's own signal
|
|
51
|
+
* didn't fire first.
|
|
52
|
+
*/
|
|
53
|
+
export const isAbortError = (err) => {
|
|
54
|
+
if (err instanceof Error) {
|
|
55
|
+
return err.name === 'AbortError' || err.name === 'TimeoutError';
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Builds a generic, URL-free message for a thrown `fetch` exception.
|
|
61
|
+
*
|
|
62
|
+
* Why not `err.message`. Node's undici embeds the request URL into
|
|
63
|
+
* the messages of common transport errors — `ECONNREFUSED https://
|
|
64
|
+
* api.example/v2?token=...`, `getaddrinfo ENOTFOUND api.example`, etc.
|
|
65
|
+
* If `MONDAY_API_URL` is misconfigured to carry the token (or any
|
|
66
|
+
* other secret), the literal token lands in `ApiError.message`. The
|
|
67
|
+
* runner's redactor would catch it on emit, but `security.md` forbids
|
|
68
|
+
* the token entering `Error.message` in the first place — the rule is
|
|
69
|
+
* defence-in-depth, not "we'll fix it downstream". The original error
|
|
70
|
+
* is still attached via `cause`, which a future debug log surfaces
|
|
71
|
+
* through `redact()` (key + value scan) rather than verbatim.
|
|
72
|
+
*
|
|
73
|
+
* Maps the common shapes to short, stable codes:
|
|
74
|
+
* - DNS / hostname unresolvable → `dns lookup failed`
|
|
75
|
+
* - ECONNREFUSED / ECONNRESET → `connection refused`
|
|
76
|
+
* - SSL/TLS issue → `tls error`
|
|
77
|
+
* - generic Error → `fetch failed`
|
|
78
|
+
* - non-Error throw → `fetch failed`
|
|
79
|
+
*/
|
|
80
|
+
export const describeFetchError = (err) => {
|
|
81
|
+
if (err instanceof Error) {
|
|
82
|
+
const code = errorCode(err);
|
|
83
|
+
if (code !== undefined) {
|
|
84
|
+
if (code.startsWith('ENOTFOUND') || code.startsWith('EAI_')) {
|
|
85
|
+
return 'fetch failed: dns lookup failed';
|
|
86
|
+
}
|
|
87
|
+
if (code === 'ECONNREFUSED' || code === 'ECONNRESET') {
|
|
88
|
+
return 'fetch failed: connection refused';
|
|
89
|
+
}
|
|
90
|
+
if (code === 'CERT_HAS_EXPIRED' || code.startsWith('UNABLE_TO_')) {
|
|
91
|
+
return 'fetch failed: tls error';
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Sniff the message for the same common shapes when err.code
|
|
95
|
+
// isn't surfaced (older fetch impls, wrapped TypeErrors).
|
|
96
|
+
const lower = err.message.toLowerCase();
|
|
97
|
+
if (lower.includes('econnrefused') || lower.includes('connection refused')) {
|
|
98
|
+
return 'fetch failed: connection refused';
|
|
99
|
+
}
|
|
100
|
+
if (lower.includes('enotfound') ||
|
|
101
|
+
lower.includes('eai_again') ||
|
|
102
|
+
lower.includes('getaddrinfo')) {
|
|
103
|
+
return 'fetch failed: dns lookup failed';
|
|
104
|
+
}
|
|
105
|
+
return 'fetch failed';
|
|
106
|
+
}
|
|
107
|
+
return 'fetch failed';
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Flattens a `fetch` `Headers` instance into a plain record so the
|
|
111
|
+
* transport's `TransportResponse` / `MultipartTransportResponse` carry
|
|
112
|
+
* an inert snapshot (not a live `Headers` object) past the transport
|
|
113
|
+
* boundary.
|
|
114
|
+
*/
|
|
115
|
+
export const headersToRecord = (headers) => {
|
|
116
|
+
const out = {};
|
|
117
|
+
headers.forEach((value, key) => {
|
|
118
|
+
out[key] = value;
|
|
119
|
+
});
|
|
120
|
+
return out;
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Combines N optional `AbortSignal`s into one. The repo's Node 22+ pin
|
|
124
|
+
* always provides the platform `AbortSignal.any`, so that is the live,
|
|
125
|
+
* tested path; a legacy controller fallback ({@link combineSignalsLegacy})
|
|
126
|
+
* is kept for hypothetical downstream embedders on Node < 19.
|
|
127
|
+
*
|
|
128
|
+
* The fallback is `transport.ts`'s original — the safer SUPERSET kept
|
|
129
|
+
* deliberately over `multipart-transport.ts`'s narrower "assume
|
|
130
|
+
* `AbortSignal.any` exists" form (R-v0.8-NEW-11 over-fit watch). Only
|
|
131
|
+
* the feature-detect guard + the unreachable fallback are c8-ignored;
|
|
132
|
+
* the reachable `AbortSignal.any(real)` path stays counted so a
|
|
133
|
+
* regression in the multi-signal combination surfaces in coverage
|
|
134
|
+
* (Codex R1 P2-1).
|
|
135
|
+
*/
|
|
136
|
+
export const combineSignals = (...signals) => {
|
|
137
|
+
const real = signals.filter((s) => s !== undefined);
|
|
138
|
+
const [first, ...rest] = real;
|
|
139
|
+
if (first === undefined) {
|
|
140
|
+
return new AbortController().signal;
|
|
141
|
+
}
|
|
142
|
+
if (rest.length === 0) {
|
|
143
|
+
return first;
|
|
144
|
+
}
|
|
145
|
+
// Node 22+ always has `AbortSignal.any`; the feature-detect guard +
|
|
146
|
+
// its legacy branch are unreachable on the pin, so the guard line is
|
|
147
|
+
// c8-ignored — but `AbortSignal.any(real)` below is NOT, so the
|
|
148
|
+
// multi-signal path is still coverage-counted.
|
|
149
|
+
/* c8 ignore next 3 */
|
|
150
|
+
if (typeof AbortSignal.any !== 'function') {
|
|
151
|
+
return combineSignalsLegacy(real);
|
|
152
|
+
}
|
|
153
|
+
return AbortSignal.any(real);
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* Pre-`AbortSignal.any` controller fallback (Node < 19). Unreachable on
|
|
157
|
+
* the repo's Node 22+ pin — kept as the safer superset for downstream
|
|
158
|
+
* embedders and c8-ignored as a block (testing.md block-wrap rule).
|
|
159
|
+
*/
|
|
160
|
+
/* c8 ignore start */
|
|
161
|
+
const combineSignalsLegacy = (real) => {
|
|
162
|
+
const ctrl = new AbortController();
|
|
163
|
+
for (const s of real) {
|
|
164
|
+
if (s.aborted) {
|
|
165
|
+
ctrl.abort(s.reason);
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
s.addEventListener('abort', () => {
|
|
169
|
+
ctrl.abort(s.reason);
|
|
170
|
+
}, { once: true });
|
|
171
|
+
}
|
|
172
|
+
return ctrl.signal;
|
|
173
|
+
};
|
|
174
|
+
/* c8 ignore stop */
|
|
175
|
+
//# sourceMappingURL=fetch-transport-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-transport-helpers.js","sourceRoot":"","sources":["../../src/api/fetch-transport-helpers.ts"],"names":[],"mappings":"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"}
|