@tiangong-lca/cli 0.0.3 → 0.0.5
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/README.md +31 -23
- package/bin/tiangong.js +15 -2
- package/dist/src/cli.js +255 -7
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-command.js +141 -0
- package/dist/src/lib/dataset-command.js.map +1 -0
- package/dist/src/lib/flow-publish-version.js +23 -19
- package/dist/src/lib/flow-publish-version.js.map +1 -1
- package/dist/src/lib/http.js +19 -0
- package/dist/src/lib/http.js.map +1 -1
- package/dist/src/lib/package-version.js +23 -0
- package/dist/src/lib/package-version.js.map +1 -0
- package/dist/src/lib/process-list.js +337 -0
- package/dist/src/lib/process-list.js.map +1 -0
- package/dist/src/lib/process-save-draft-run.js +325 -0
- package/dist/src/lib/process-save-draft-run.js.map +1 -0
- package/dist/src/lib/process-save-draft.js +165 -0
- package/dist/src/lib/process-save-draft.js.map +1 -0
- package/dist/src/lib/publish.js +28 -10
- package/dist/src/lib/publish.js.map +1 -1
- package/dist/src/lib/remote.js +2 -2
- package/dist/src/lib/remote.js.map +1 -1
- package/dist/src/lib/review-process.js +180 -9
- package/dist/src/lib/review-process.js.map +1 -1
- package/dist/src/lib/supabase-client.js +5 -2
- package/dist/src/lib/supabase-client.js.map +1 -1
- package/dist/src/lib/supabase-json-ordered-write.js +24 -21
- package/dist/src/lib/supabase-json-ordered-write.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { CliError } from './errors.js';
|
|
2
|
+
import { normalizeStateCodeList, normalizeTokenList } from './flow-read.js';
|
|
3
|
+
import { normalizeSupabaseProcessPayload, requireSupabaseRestRuntime } from './supabase-rest.js';
|
|
4
|
+
import { createSupabaseDataClient, runSupabaseArrayQuery } from './supabase-client.js';
|
|
5
|
+
import { createSupabaseDataRuntime } from './supabase-session.js';
|
|
6
|
+
const PROCESS_LIST_TIMEOUT_MS = 10_000;
|
|
7
|
+
const DEFAULT_PROCESS_LIST_LIMIT = 100;
|
|
8
|
+
const DEFAULT_PROCESS_LIST_PAGE_SIZE = 100;
|
|
9
|
+
const DEFAULT_PROCESS_LIST_ORDER = 'id.asc,version.asc';
|
|
10
|
+
const DEFAULT_PROCESS_LIST_MAX_ATTEMPTS = 3;
|
|
11
|
+
function isRecord(value) {
|
|
12
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
13
|
+
}
|
|
14
|
+
function normalizeToken(value) {
|
|
15
|
+
if (typeof value !== 'string') {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const trimmed = value.trim();
|
|
19
|
+
if (!trimmed) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return trimmed;
|
|
23
|
+
}
|
|
24
|
+
function nowIso(now = new Date()) {
|
|
25
|
+
return now.toISOString();
|
|
26
|
+
}
|
|
27
|
+
function toPositiveInteger(value, label, code) {
|
|
28
|
+
if (!Number.isInteger(value) || value <= 0) {
|
|
29
|
+
throw new CliError(`Expected ${label} to be a positive integer.`, {
|
|
30
|
+
code,
|
|
31
|
+
exitCode: 2,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
function toNonNegativeInteger(value, label, code) {
|
|
37
|
+
if (!Number.isInteger(value) || value < 0) {
|
|
38
|
+
throw new CliError(`Expected ${label} to be a non-negative integer.`, {
|
|
39
|
+
code,
|
|
40
|
+
exitCode: 2,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
function optionalPositiveInteger(value) {
|
|
46
|
+
return Number.isInteger(value) && value > 0 ? value : null;
|
|
47
|
+
}
|
|
48
|
+
function optionalNonNegativeInteger(value) {
|
|
49
|
+
return Number.isInteger(value) && value >= 0 ? value : null;
|
|
50
|
+
}
|
|
51
|
+
function buildProcessListUrl(restBaseUrl, filters) {
|
|
52
|
+
const url = new URL(`${restBaseUrl.replace(/\/+$/u, '')}/processes`);
|
|
53
|
+
url.searchParams.set('select', 'id,version,user_id,state_code,modified_at,json');
|
|
54
|
+
const ids = normalizeTokenList(filters.ids);
|
|
55
|
+
if (ids.length === 1) {
|
|
56
|
+
url.searchParams.set('id', `eq.${ids[0]}`);
|
|
57
|
+
}
|
|
58
|
+
else if (ids.length > 1) {
|
|
59
|
+
url.searchParams.set('id', `in.(${ids.join(',')})`);
|
|
60
|
+
}
|
|
61
|
+
if (typeof filters.version === 'string' && filters.version.trim()) {
|
|
62
|
+
url.searchParams.set('version', `eq.${filters.version.trim()}`);
|
|
63
|
+
}
|
|
64
|
+
if (typeof filters.userId === 'string' && filters.userId.trim()) {
|
|
65
|
+
url.searchParams.set('user_id', `eq.${filters.userId.trim()}`);
|
|
66
|
+
}
|
|
67
|
+
const stateCodes = normalizeStateCodeList(filters.stateCodes);
|
|
68
|
+
if (stateCodes.length === 1) {
|
|
69
|
+
url.searchParams.set('state_code', `eq.${stateCodes[0]}`);
|
|
70
|
+
}
|
|
71
|
+
else if (stateCodes.length > 1) {
|
|
72
|
+
url.searchParams.set('state_code', `in.(${stateCodes.join(',')})`);
|
|
73
|
+
}
|
|
74
|
+
if (typeof filters.order === 'string' && filters.order.trim()) {
|
|
75
|
+
url.searchParams.set('order', filters.order.trim());
|
|
76
|
+
}
|
|
77
|
+
if (Number.isInteger(filters.limit) && filters.limit > 0) {
|
|
78
|
+
url.searchParams.set('limit', String(filters.limit));
|
|
79
|
+
}
|
|
80
|
+
if (Number.isInteger(filters.offset) && filters.offset >= 0) {
|
|
81
|
+
url.searchParams.set('offset', String(filters.offset));
|
|
82
|
+
}
|
|
83
|
+
return url.toString();
|
|
84
|
+
}
|
|
85
|
+
function parseProcessRows(payload, url) {
|
|
86
|
+
if (!Array.isArray(payload)) {
|
|
87
|
+
throw new CliError(`Supabase REST response was not a JSON array for ${url}`, {
|
|
88
|
+
code: 'SUPABASE_REST_RESPONSE_INVALID',
|
|
89
|
+
exitCode: 1,
|
|
90
|
+
details: payload,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return payload.map((item, index) => {
|
|
94
|
+
if (!isRecord(item)) {
|
|
95
|
+
throw new CliError(`Supabase REST row ${index} was not a JSON object for ${url}`, {
|
|
96
|
+
code: 'SUPABASE_REST_RESPONSE_INVALID',
|
|
97
|
+
exitCode: 1,
|
|
98
|
+
details: item,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
id: typeof item.id === 'string' ? item.id : '',
|
|
103
|
+
version: typeof item.version === 'string' ? item.version : '',
|
|
104
|
+
user_id: typeof item.user_id === 'string' ? item.user_id : null,
|
|
105
|
+
state_code: typeof item.state_code === 'number' ? item.state_code : null,
|
|
106
|
+
modified_at: typeof item.modified_at === 'string' ? item.modified_at : null,
|
|
107
|
+
json: item.json,
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
function applyOrder(query, orderValue) {
|
|
112
|
+
const normalizedOrder = typeof orderValue === 'string' ? orderValue.trim() : '';
|
|
113
|
+
if (!normalizedOrder) {
|
|
114
|
+
return query;
|
|
115
|
+
}
|
|
116
|
+
let nextQuery = query;
|
|
117
|
+
for (const rawToken of normalizedOrder.split(',')) {
|
|
118
|
+
const token = rawToken.trim();
|
|
119
|
+
if (!token) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const [column, direction, nulls] = token.split('.');
|
|
123
|
+
if (!column) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
nextQuery = nextQuery.order(column, {
|
|
127
|
+
ascending: direction !== 'desc',
|
|
128
|
+
nullsFirst: nulls === 'nullsfirst' ? true : nulls === 'nullslast' ? false : undefined,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return nextQuery;
|
|
132
|
+
}
|
|
133
|
+
async function listProcessRows(options) {
|
|
134
|
+
const { client, restBaseUrl } = createSupabaseDataClient(options.runtime, options.fetchImpl, options.timeoutMs);
|
|
135
|
+
const sourceUrl = buildProcessListUrl(restBaseUrl, options.filters);
|
|
136
|
+
let query = client.from('processes').select('id,version,user_id,state_code,modified_at,json');
|
|
137
|
+
const ids = normalizeTokenList(options.filters.ids);
|
|
138
|
+
if (ids.length === 1) {
|
|
139
|
+
query = query.eq('id', ids[0]);
|
|
140
|
+
}
|
|
141
|
+
else if (ids.length > 1) {
|
|
142
|
+
query = query.filter('id', 'in', `(${ids.join(',')})`);
|
|
143
|
+
}
|
|
144
|
+
if (typeof options.filters.version === 'string' && options.filters.version.trim()) {
|
|
145
|
+
query = query.eq('version', options.filters.version.trim());
|
|
146
|
+
}
|
|
147
|
+
if (typeof options.filters.userId === 'string' && options.filters.userId.trim()) {
|
|
148
|
+
query = query.eq('user_id', options.filters.userId.trim());
|
|
149
|
+
}
|
|
150
|
+
const stateCodes = normalizeStateCodeList(options.filters.stateCodes);
|
|
151
|
+
if (stateCodes.length === 1) {
|
|
152
|
+
query = query.eq('state_code', stateCodes[0]);
|
|
153
|
+
}
|
|
154
|
+
else if (stateCodes.length > 1) {
|
|
155
|
+
query = query.filter('state_code', 'in', `(${stateCodes.join(',')})`);
|
|
156
|
+
}
|
|
157
|
+
query = applyOrder(query, options.filters.order);
|
|
158
|
+
const limit = optionalPositiveInteger(options.filters.limit);
|
|
159
|
+
const offset = optionalNonNegativeInteger(options.filters.offset);
|
|
160
|
+
if (limit !== null) {
|
|
161
|
+
query = query.limit(limit);
|
|
162
|
+
if (offset !== null) {
|
|
163
|
+
query.url.searchParams.set('offset', String(offset));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const payload = await runSupabaseArrayQuery(query, sourceUrl);
|
|
167
|
+
return {
|
|
168
|
+
rows: parseProcessRows(payload, sourceUrl),
|
|
169
|
+
sourceUrl,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function isRetryableError(error) {
|
|
173
|
+
return !(error instanceof CliError && error.exitCode === 2);
|
|
174
|
+
}
|
|
175
|
+
async function listProcessRowsWithRetry(options) {
|
|
176
|
+
for (let attempt = 1;; attempt += 1) {
|
|
177
|
+
try {
|
|
178
|
+
return await listProcessRows(options);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (attempt >= options.maxAttempts || !isRetryableError(error)) {
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
export async function runProcessList(options) {
|
|
188
|
+
const ids = normalizeTokenList(options.ids);
|
|
189
|
+
const requestedVersion = normalizeToken(options.version ?? null);
|
|
190
|
+
const requestedUserId = normalizeToken(options.userId ?? null);
|
|
191
|
+
const requestedStateCodes = normalizeStateCodeList(options.stateCodes);
|
|
192
|
+
const all = Boolean(options.all);
|
|
193
|
+
const order = normalizeToken(options.order ?? null) ?? DEFAULT_PROCESS_LIST_ORDER;
|
|
194
|
+
if (all && options.limit !== null && options.limit !== undefined) {
|
|
195
|
+
throw new CliError('Cannot combine --all with --limit.', {
|
|
196
|
+
code: 'PROCESS_LIST_ALL_LIMIT_CONFLICT',
|
|
197
|
+
exitCode: 2,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
if (all && options.offset !== null && options.offset !== undefined) {
|
|
201
|
+
throw new CliError('Cannot combine --all with --offset.', {
|
|
202
|
+
code: 'PROCESS_LIST_ALL_OFFSET_CONFLICT',
|
|
203
|
+
exitCode: 2,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
if (all &&
|
|
207
|
+
ids.length === 0 &&
|
|
208
|
+
requestedVersion === null &&
|
|
209
|
+
requestedUserId === null &&
|
|
210
|
+
requestedStateCodes.length === 0) {
|
|
211
|
+
throw new CliError('Refusing to run --all without at least one narrowing filter.', {
|
|
212
|
+
code: 'PROCESS_LIST_ALL_FILTER_REQUIRED',
|
|
213
|
+
exitCode: 2,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
217
|
+
const timeoutMs = options.timeoutMs ?? PROCESS_LIST_TIMEOUT_MS;
|
|
218
|
+
const maxAttempts = toPositiveInteger(options.maxAttempts ?? DEFAULT_PROCESS_LIST_MAX_ATTEMPTS, 'process list retry count', 'PROCESS_LIST_MAX_ATTEMPTS_INVALID');
|
|
219
|
+
const runtime = createSupabaseDataRuntime({
|
|
220
|
+
runtime: requireSupabaseRestRuntime(options.env ?? process.env),
|
|
221
|
+
fetchImpl,
|
|
222
|
+
timeoutMs,
|
|
223
|
+
now: options.now,
|
|
224
|
+
});
|
|
225
|
+
const sourceUrls = [];
|
|
226
|
+
const rows = [];
|
|
227
|
+
if (all) {
|
|
228
|
+
const pageSizeValue = options.pageSize ?? DEFAULT_PROCESS_LIST_PAGE_SIZE;
|
|
229
|
+
const pageSize = toPositiveInteger(pageSizeValue, '--page-size', 'PROCESS_LIST_PAGE_SIZE_INVALID');
|
|
230
|
+
let currentOffset = 0;
|
|
231
|
+
while (true) {
|
|
232
|
+
const page = await listProcessRowsWithRetry({
|
|
233
|
+
runtime,
|
|
234
|
+
filters: {
|
|
235
|
+
ids,
|
|
236
|
+
version: requestedVersion,
|
|
237
|
+
userId: requestedUserId,
|
|
238
|
+
stateCodes: requestedStateCodes,
|
|
239
|
+
order,
|
|
240
|
+
limit: pageSize,
|
|
241
|
+
offset: currentOffset,
|
|
242
|
+
},
|
|
243
|
+
timeoutMs,
|
|
244
|
+
fetchImpl,
|
|
245
|
+
maxAttempts,
|
|
246
|
+
});
|
|
247
|
+
sourceUrls.push(page.sourceUrl);
|
|
248
|
+
rows.push(...page.rows.map((row) => ({
|
|
249
|
+
id: row.id,
|
|
250
|
+
version: row.version,
|
|
251
|
+
user_id: row.user_id,
|
|
252
|
+
state_code: row.state_code,
|
|
253
|
+
modified_at: row.modified_at,
|
|
254
|
+
process: normalizeSupabaseProcessPayload(row.json, `${row.id}@${row.version}`),
|
|
255
|
+
})));
|
|
256
|
+
if (page.rows.length < pageSize) {
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
currentOffset += pageSize;
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
schema_version: 1,
|
|
263
|
+
generated_at_utc: nowIso(options.now),
|
|
264
|
+
status: 'listed_remote_processes',
|
|
265
|
+
filters: {
|
|
266
|
+
ids,
|
|
267
|
+
requested_version: requestedVersion,
|
|
268
|
+
requested_user_id: requestedUserId,
|
|
269
|
+
requested_state_codes: requestedStateCodes,
|
|
270
|
+
order,
|
|
271
|
+
all: true,
|
|
272
|
+
limit: null,
|
|
273
|
+
offset: 0,
|
|
274
|
+
page_size: pageSize,
|
|
275
|
+
},
|
|
276
|
+
count: rows.length,
|
|
277
|
+
source_urls: sourceUrls,
|
|
278
|
+
rows,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
const limit = toPositiveInteger(options.limit ?? DEFAULT_PROCESS_LIST_LIMIT, '--limit', 'PROCESS_LIST_LIMIT_INVALID');
|
|
282
|
+
const offset = toNonNegativeInteger(options.offset ?? 0, '--offset', 'PROCESS_LIST_OFFSET_INVALID');
|
|
283
|
+
const page = await listProcessRowsWithRetry({
|
|
284
|
+
runtime,
|
|
285
|
+
filters: {
|
|
286
|
+
ids,
|
|
287
|
+
version: requestedVersion,
|
|
288
|
+
userId: requestedUserId,
|
|
289
|
+
stateCodes: requestedStateCodes,
|
|
290
|
+
order,
|
|
291
|
+
limit,
|
|
292
|
+
offset,
|
|
293
|
+
},
|
|
294
|
+
timeoutMs,
|
|
295
|
+
fetchImpl,
|
|
296
|
+
maxAttempts,
|
|
297
|
+
});
|
|
298
|
+
return {
|
|
299
|
+
schema_version: 1,
|
|
300
|
+
generated_at_utc: nowIso(options.now),
|
|
301
|
+
status: 'listed_remote_processes',
|
|
302
|
+
filters: {
|
|
303
|
+
ids,
|
|
304
|
+
requested_version: requestedVersion,
|
|
305
|
+
requested_user_id: requestedUserId,
|
|
306
|
+
requested_state_codes: requestedStateCodes,
|
|
307
|
+
order,
|
|
308
|
+
all: false,
|
|
309
|
+
limit,
|
|
310
|
+
offset,
|
|
311
|
+
page_size: null,
|
|
312
|
+
},
|
|
313
|
+
count: page.rows.length,
|
|
314
|
+
source_urls: [page.sourceUrl],
|
|
315
|
+
rows: page.rows.map((row) => ({
|
|
316
|
+
id: row.id,
|
|
317
|
+
version: row.version,
|
|
318
|
+
user_id: row.user_id,
|
|
319
|
+
state_code: row.state_code,
|
|
320
|
+
modified_at: row.modified_at,
|
|
321
|
+
process: normalizeSupabaseProcessPayload(row.json, `${row.id}@${row.version}`),
|
|
322
|
+
})),
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
export const __testInternals = {
|
|
326
|
+
applyOrder,
|
|
327
|
+
buildProcessListUrl,
|
|
328
|
+
isRetryableError,
|
|
329
|
+
normalizeToken,
|
|
330
|
+
nowIso,
|
|
331
|
+
optionalNonNegativeInteger,
|
|
332
|
+
optionalPositiveInteger,
|
|
333
|
+
parseProcessRows,
|
|
334
|
+
toNonNegativeInteger,
|
|
335
|
+
toPositiveInteger,
|
|
336
|
+
};
|
|
337
|
+
//# sourceMappingURL=process-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-list.js","sourceRoot":"","sources":["../../../src/lib/process-list.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport { normalizeStateCodeList, normalizeTokenList } from './flow-read.js';\nimport type { FetchLike } from './http.js';\nimport { normalizeSupabaseProcessPayload, requireSupabaseRestRuntime } from './supabase-rest.js';\nimport { createSupabaseDataClient, runSupabaseArrayQuery } from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst PROCESS_LIST_TIMEOUT_MS = 10_000;\nconst DEFAULT_PROCESS_LIST_LIMIT = 100;\nconst DEFAULT_PROCESS_LIST_PAGE_SIZE = 100;\nconst DEFAULT_PROCESS_LIST_ORDER = 'id.asc,version.asc';\nconst DEFAULT_PROCESS_LIST_MAX_ATTEMPTS = 3;\n\ntype ProcessListQueryFilters = {\n ids?: string[];\n version?: string | null;\n userId?: string | null;\n stateCodes?: number[];\n order?: string | null;\n limit?: number | null;\n offset?: number | null;\n};\n\ntype SupabaseProcessListRow = {\n id: string;\n version: string;\n user_id: string | null;\n state_code: number | null;\n modified_at: string | null;\n json: unknown;\n};\n\ntype QueryWithUrl = {\n url: URL;\n limit: (count: number) => QueryWithUrl;\n};\n\nexport type RunProcessListOptions = {\n ids?: string[];\n version?: string | null;\n userId?: string | null;\n stateCodes?: number[];\n limit?: number | null;\n offset?: number | null;\n all?: boolean;\n pageSize?: number | null;\n order?: string | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n maxAttempts?: number | null;\n};\n\nexport type ProcessListReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'listed_remote_processes';\n filters: {\n ids: string[];\n requested_version: string | null;\n requested_user_id: string | null;\n requested_state_codes: number[];\n order: string;\n all: boolean;\n limit: number | null;\n offset: number;\n page_size: number | null;\n };\n count: number;\n source_urls: string[];\n rows: Array<{\n id: string;\n version: string;\n user_id: string | null;\n state_code: number | null;\n modified_at: string | null;\n process: JsonObject;\n }>;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeToken(value: string | null | undefined): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed;\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction toPositiveInteger(value: number | null | undefined, label: string, code: string): number {\n if (!Number.isInteger(value) || (value as number) <= 0) {\n throw new CliError(`Expected ${label} to be a positive integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value as number;\n}\n\nfunction toNonNegativeInteger(\n value: number | null | undefined,\n label: string,\n code: string,\n): number {\n if (!Number.isInteger(value) || (value as number) < 0) {\n throw new CliError(`Expected ${label} to be a non-negative integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value as number;\n}\n\nfunction optionalPositiveInteger(value: number | null | undefined): number | null {\n return Number.isInteger(value) && (value as number) > 0 ? (value as number) : null;\n}\n\nfunction optionalNonNegativeInteger(value: number | null | undefined): number | null {\n return Number.isInteger(value) && (value as number) >= 0 ? (value as number) : null;\n}\n\nfunction buildProcessListUrl(restBaseUrl: string, filters: ProcessListQueryFilters): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/processes`);\n url.searchParams.set('select', 'id,version,user_id,state_code,modified_at,json');\n\n const ids = normalizeTokenList(filters.ids);\n if (ids.length === 1) {\n url.searchParams.set('id', `eq.${ids[0]}`);\n } else if (ids.length > 1) {\n url.searchParams.set('id', `in.(${ids.join(',')})`);\n }\n\n if (typeof filters.version === 'string' && filters.version.trim()) {\n url.searchParams.set('version', `eq.${filters.version.trim()}`);\n }\n\n if (typeof filters.userId === 'string' && filters.userId.trim()) {\n url.searchParams.set('user_id', `eq.${filters.userId.trim()}`);\n }\n\n const stateCodes = normalizeStateCodeList(filters.stateCodes);\n if (stateCodes.length === 1) {\n url.searchParams.set('state_code', `eq.${stateCodes[0]}`);\n } else if (stateCodes.length > 1) {\n url.searchParams.set('state_code', `in.(${stateCodes.join(',')})`);\n }\n\n if (typeof filters.order === 'string' && filters.order.trim()) {\n url.searchParams.set('order', filters.order.trim());\n }\n\n if (Number.isInteger(filters.limit) && (filters.limit as number) > 0) {\n url.searchParams.set('limit', String(filters.limit));\n }\n\n if (Number.isInteger(filters.offset) && (filters.offset as number) >= 0) {\n url.searchParams.set('offset', String(filters.offset));\n }\n\n return url.toString();\n}\n\nfunction parseProcessRows(payload: unknown, url: string): SupabaseProcessListRow[] {\n if (!Array.isArray(payload)) {\n throw new CliError(`Supabase REST response was not a JSON array for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload.map((item, index) => {\n if (!isRecord(item)) {\n throw new CliError(`Supabase REST row ${index} was not a JSON object for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: item,\n });\n }\n\n return {\n id: typeof item.id === 'string' ? item.id : '',\n version: typeof item.version === 'string' ? item.version : '',\n user_id: typeof item.user_id === 'string' ? item.user_id : null,\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n modified_at: typeof item.modified_at === 'string' ? item.modified_at : null,\n json: item.json,\n };\n });\n}\n\nfunction applyOrder<Query extends { order: (column: string, options?: object) => Query }>(\n query: Query,\n orderValue: string | null | undefined,\n): Query {\n const normalizedOrder = typeof orderValue === 'string' ? orderValue.trim() : '';\n if (!normalizedOrder) {\n return query;\n }\n\n let nextQuery = query;\n for (const rawToken of normalizedOrder.split(',')) {\n const token = rawToken.trim();\n if (!token) {\n continue;\n }\n\n const [column, direction, nulls] = token.split('.');\n if (!column) {\n continue;\n }\n\n nextQuery = nextQuery.order(column, {\n ascending: direction !== 'desc',\n nullsFirst: nulls === 'nullsfirst' ? true : nulls === 'nullslast' ? false : undefined,\n });\n }\n\n return nextQuery;\n}\n\nasync function listProcessRows(options: {\n runtime: ReturnType<typeof createSupabaseDataRuntime>;\n filters: ProcessListQueryFilters;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<{ rows: SupabaseProcessListRow[]; sourceUrl: string }> {\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const sourceUrl = buildProcessListUrl(restBaseUrl, options.filters);\n let query = client.from('processes').select('id,version,user_id,state_code,modified_at,json');\n\n const ids = normalizeTokenList(options.filters.ids);\n if (ids.length === 1) {\n query = query.eq('id', ids[0] as string);\n } else if (ids.length > 1) {\n query = query.filter('id', 'in', `(${ids.join(',')})`);\n }\n\n if (typeof options.filters.version === 'string' && options.filters.version.trim()) {\n query = query.eq('version', options.filters.version.trim());\n }\n\n if (typeof options.filters.userId === 'string' && options.filters.userId.trim()) {\n query = query.eq('user_id', options.filters.userId.trim());\n }\n\n const stateCodes = normalizeStateCodeList(options.filters.stateCodes);\n if (stateCodes.length === 1) {\n query = query.eq('state_code', stateCodes[0] as number);\n } else if (stateCodes.length > 1) {\n query = query.filter('state_code', 'in', `(${stateCodes.join(',')})`);\n }\n\n query = applyOrder(query, options.filters.order);\n\n const limit = optionalPositiveInteger(options.filters.limit);\n const offset = optionalNonNegativeInteger(options.filters.offset);\n\n if (limit !== null) {\n query = query.limit(limit);\n if (offset !== null) {\n (query as unknown as QueryWithUrl).url.searchParams.set('offset', String(offset));\n }\n }\n\n const payload = await runSupabaseArrayQuery(query, sourceUrl);\n return {\n rows: parseProcessRows(payload, sourceUrl),\n sourceUrl,\n };\n}\n\nfunction isRetryableError(error: unknown): boolean {\n return !(error instanceof CliError && error.exitCode === 2);\n}\n\nasync function listProcessRowsWithRetry(options: {\n runtime: ReturnType<typeof createSupabaseDataRuntime>;\n filters: ProcessListQueryFilters;\n timeoutMs: number;\n fetchImpl: FetchLike;\n maxAttempts: number;\n}): Promise<{ rows: SupabaseProcessListRow[]; sourceUrl: string }> {\n for (let attempt = 1; ; attempt += 1) {\n try {\n return await listProcessRows(options);\n } catch (error) {\n if (attempt >= options.maxAttempts || !isRetryableError(error)) {\n throw error;\n }\n }\n }\n}\n\nexport async function runProcessList(options: RunProcessListOptions): Promise<ProcessListReport> {\n const ids = normalizeTokenList(options.ids);\n const requestedVersion = normalizeToken(options.version ?? null);\n const requestedUserId = normalizeToken(options.userId ?? null);\n const requestedStateCodes = normalizeStateCodeList(options.stateCodes);\n const all = Boolean(options.all);\n const order = normalizeToken(options.order ?? null) ?? DEFAULT_PROCESS_LIST_ORDER;\n\n if (all && options.limit !== null && options.limit !== undefined) {\n throw new CliError('Cannot combine --all with --limit.', {\n code: 'PROCESS_LIST_ALL_LIMIT_CONFLICT',\n exitCode: 2,\n });\n }\n\n if (all && options.offset !== null && options.offset !== undefined) {\n throw new CliError('Cannot combine --all with --offset.', {\n code: 'PROCESS_LIST_ALL_OFFSET_CONFLICT',\n exitCode: 2,\n });\n }\n\n if (\n all &&\n ids.length === 0 &&\n requestedVersion === null &&\n requestedUserId === null &&\n requestedStateCodes.length === 0\n ) {\n throw new CliError('Refusing to run --all without at least one narrowing filter.', {\n code: 'PROCESS_LIST_ALL_FILTER_REQUIRED',\n exitCode: 2,\n });\n }\n\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? PROCESS_LIST_TIMEOUT_MS;\n const maxAttempts = toPositiveInteger(\n options.maxAttempts ?? DEFAULT_PROCESS_LIST_MAX_ATTEMPTS,\n 'process list retry count',\n 'PROCESS_LIST_MAX_ATTEMPTS_INVALID',\n );\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n });\n const sourceUrls: string[] = [];\n const rows: ProcessListReport['rows'] = [];\n\n if (all) {\n const pageSizeValue = options.pageSize ?? DEFAULT_PROCESS_LIST_PAGE_SIZE;\n const pageSize = toPositiveInteger(\n pageSizeValue,\n '--page-size',\n 'PROCESS_LIST_PAGE_SIZE_INVALID',\n );\n let currentOffset = 0;\n while (true) {\n const page = await listProcessRowsWithRetry({\n runtime,\n filters: {\n ids,\n version: requestedVersion,\n userId: requestedUserId,\n stateCodes: requestedStateCodes,\n order,\n limit: pageSize,\n offset: currentOffset,\n },\n timeoutMs,\n fetchImpl,\n maxAttempts,\n });\n sourceUrls.push(page.sourceUrl);\n rows.push(\n ...page.rows.map((row) => ({\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: row.state_code,\n modified_at: row.modified_at,\n process: normalizeSupabaseProcessPayload(row.json, `${row.id}@${row.version}`),\n })),\n );\n if (page.rows.length < pageSize) {\n break;\n }\n currentOffset += pageSize;\n }\n\n return {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: 'listed_remote_processes',\n filters: {\n ids,\n requested_version: requestedVersion,\n requested_user_id: requestedUserId,\n requested_state_codes: requestedStateCodes,\n order,\n all: true,\n limit: null,\n offset: 0,\n page_size: pageSize,\n },\n count: rows.length,\n source_urls: sourceUrls,\n rows,\n };\n }\n\n const limit = toPositiveInteger(\n options.limit ?? DEFAULT_PROCESS_LIST_LIMIT,\n '--limit',\n 'PROCESS_LIST_LIMIT_INVALID',\n );\n const offset = toNonNegativeInteger(\n options.offset ?? 0,\n '--offset',\n 'PROCESS_LIST_OFFSET_INVALID',\n );\n const page = await listProcessRowsWithRetry({\n runtime,\n filters: {\n ids,\n version: requestedVersion,\n userId: requestedUserId,\n stateCodes: requestedStateCodes,\n order,\n limit,\n offset,\n },\n timeoutMs,\n fetchImpl,\n maxAttempts,\n });\n\n return {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: 'listed_remote_processes',\n filters: {\n ids,\n requested_version: requestedVersion,\n requested_user_id: requestedUserId,\n requested_state_codes: requestedStateCodes,\n order,\n all: false,\n limit,\n offset,\n page_size: null,\n },\n count: page.rows.length,\n source_urls: [page.sourceUrl],\n rows: page.rows.map((row) => ({\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: row.state_code,\n modified_at: row.modified_at,\n process: normalizeSupabaseProcessPayload(row.json, `${row.id}@${row.version}`),\n })),\n };\n}\n\nexport const __testInternals = {\n applyOrder,\n buildProcessListUrl,\n isRetryableError,\n normalizeToken,\n nowIso,\n optionalNonNegativeInteger,\n optionalPositiveInteger,\n parseProcessRows,\n toNonNegativeInteger,\n toPositiveInteger,\n};\n"]}
|