@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,141 @@
|
|
|
1
|
+
import { CliError } from './errors.js';
|
|
2
|
+
import { postJson, requireRemoteOkPayload } from './http.js';
|
|
3
|
+
import { buildSupabaseAuthHeaders, deriveSupabaseProjectBaseUrl, requireSupabaseRestRuntime, } from './supabase-client.js';
|
|
4
|
+
import { createSupabaseDataRuntime } from './supabase-session.js';
|
|
5
|
+
function isRecord(value) {
|
|
6
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
function trimToken(value) {
|
|
9
|
+
if (typeof value !== 'string') {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
const trimmed = value.trim();
|
|
13
|
+
return trimmed ? trimmed : null;
|
|
14
|
+
}
|
|
15
|
+
function readOptionalRuleVerification(extraData) {
|
|
16
|
+
if (!extraData) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
if ('ruleVerification' in extraData) {
|
|
20
|
+
const value = extraData.ruleVerification;
|
|
21
|
+
if (typeof value === 'boolean' || value === null) {
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
if ('rule_verification' in extraData) {
|
|
27
|
+
const value = extraData.rule_verification;
|
|
28
|
+
if (typeof value === 'boolean' || value === null) {
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
function readOptionalModelId(extraData, allowNull) {
|
|
35
|
+
if (!extraData) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
const value = extraData.modelId ?? extraData.model_id;
|
|
39
|
+
const trimmed = trimToken(value);
|
|
40
|
+
if (trimmed) {
|
|
41
|
+
return trimmed;
|
|
42
|
+
}
|
|
43
|
+
if (allowNull && value === null) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
function requireCommandSuccessPayload(payload, url) {
|
|
49
|
+
const normalized = requireRemoteOkPayload(payload, url);
|
|
50
|
+
if (!isRecord(normalized) || normalized.ok !== true) {
|
|
51
|
+
throw new CliError(`Dataset command returned an unexpected payload for ${url}`, {
|
|
52
|
+
code: 'REMOTE_RESPONSE_INVALID',
|
|
53
|
+
exitCode: 1,
|
|
54
|
+
details: normalized,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return normalized;
|
|
58
|
+
}
|
|
59
|
+
async function invokeDatasetCommand(options) {
|
|
60
|
+
const url = `${options.transport.functionsBaseUrl}/${options.commandName}`;
|
|
61
|
+
return requireCommandSuccessPayload(await postJson({
|
|
62
|
+
url,
|
|
63
|
+
headers: {
|
|
64
|
+
...buildSupabaseAuthHeaders(options.transport.publishableKey, options.transport.accessToken),
|
|
65
|
+
'Content-Type': 'application/json',
|
|
66
|
+
},
|
|
67
|
+
body: options.body,
|
|
68
|
+
timeoutMs: options.transport.timeoutMs,
|
|
69
|
+
fetchImpl: options.transport.fetchImpl,
|
|
70
|
+
}), url);
|
|
71
|
+
}
|
|
72
|
+
export function deriveSupabaseFunctionsBaseUrl(apiBaseUrl) {
|
|
73
|
+
return `${deriveSupabaseProjectBaseUrl(apiBaseUrl)}/functions/v1`;
|
|
74
|
+
}
|
|
75
|
+
export async function buildDatasetCommandTransport(options) {
|
|
76
|
+
return {
|
|
77
|
+
functionsBaseUrl: deriveSupabaseFunctionsBaseUrl(options.runtime.apiBaseUrl),
|
|
78
|
+
publishableKey: options.runtime.publishableKey,
|
|
79
|
+
accessToken: await options.runtime.getAccessToken(),
|
|
80
|
+
fetchImpl: options.fetchImpl,
|
|
81
|
+
timeoutMs: options.timeoutMs,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export async function resolveDatasetCommandTransport(options) {
|
|
85
|
+
return buildDatasetCommandTransport({
|
|
86
|
+
runtime: createSupabaseDataRuntime({
|
|
87
|
+
runtime: requireSupabaseRestRuntime(options.env),
|
|
88
|
+
fetchImpl: options.fetchImpl,
|
|
89
|
+
timeoutMs: options.timeoutMs,
|
|
90
|
+
}),
|
|
91
|
+
fetchImpl: options.fetchImpl,
|
|
92
|
+
timeoutMs: options.timeoutMs,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
export async function createDatasetRecord(options) {
|
|
96
|
+
const body = {
|
|
97
|
+
table: options.table,
|
|
98
|
+
id: options.id,
|
|
99
|
+
jsonOrdered: options.payload,
|
|
100
|
+
};
|
|
101
|
+
const modelId = readOptionalModelId(options.extraData, true);
|
|
102
|
+
if (modelId !== undefined) {
|
|
103
|
+
body.modelId = modelId;
|
|
104
|
+
}
|
|
105
|
+
const ruleVerification = readOptionalRuleVerification(options.extraData);
|
|
106
|
+
if (ruleVerification !== undefined) {
|
|
107
|
+
body.ruleVerification = ruleVerification;
|
|
108
|
+
}
|
|
109
|
+
return invokeDatasetCommand({
|
|
110
|
+
transport: options.transport,
|
|
111
|
+
commandName: 'app_dataset_create',
|
|
112
|
+
body,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
export async function saveDraftDatasetRecord(options) {
|
|
116
|
+
const body = {
|
|
117
|
+
table: options.table,
|
|
118
|
+
id: options.id,
|
|
119
|
+
version: options.version,
|
|
120
|
+
jsonOrdered: options.payload,
|
|
121
|
+
};
|
|
122
|
+
const modelId = readOptionalModelId(options.extraData, false);
|
|
123
|
+
if (modelId !== undefined) {
|
|
124
|
+
body.modelId = modelId;
|
|
125
|
+
}
|
|
126
|
+
const ruleVerification = readOptionalRuleVerification(options.extraData);
|
|
127
|
+
if (ruleVerification !== undefined) {
|
|
128
|
+
body.ruleVerification = ruleVerification;
|
|
129
|
+
}
|
|
130
|
+
return invokeDatasetCommand({
|
|
131
|
+
transport: options.transport,
|
|
132
|
+
commandName: 'app_dataset_save_draft',
|
|
133
|
+
body,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
export const __testInternals = {
|
|
137
|
+
deriveSupabaseFunctionsBaseUrl,
|
|
138
|
+
readOptionalModelId,
|
|
139
|
+
readOptionalRuleVerification,
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=dataset-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset-command.js","sourceRoot":"","sources":["../../../src/lib/dataset-command.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { postJson, requireRemoteOkPayload } from './http.js';\nimport {\n buildSupabaseAuthHeaders,\n deriveSupabaseProjectBaseUrl,\n requireSupabaseRestRuntime,\n type SupabaseDataRuntime,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type DatasetCommandTable =\n | 'contacts'\n | 'sources'\n | 'unitgroups'\n | 'flowproperties'\n | 'flows'\n | 'processes'\n | 'lifecyclemodels';\n\nexport type DatasetCommandTransport = {\n functionsBaseUrl: string;\n publishableKey: string;\n accessToken: string;\n fetchImpl: FetchLike;\n timeoutMs: number;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction trimToken(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction readOptionalRuleVerification(extraData?: JsonObject): boolean | null | undefined {\n if (!extraData) {\n return undefined;\n }\n\n if ('ruleVerification' in extraData) {\n const value = extraData.ruleVerification;\n if (typeof value === 'boolean' || value === null) {\n return value;\n }\n return undefined;\n }\n\n if ('rule_verification' in extraData) {\n const value = extraData.rule_verification;\n if (typeof value === 'boolean' || value === null) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction readOptionalModelId(\n extraData: JsonObject | undefined,\n allowNull: boolean,\n): string | null | undefined {\n if (!extraData) {\n return undefined;\n }\n\n const value = extraData.modelId ?? extraData.model_id;\n const trimmed = trimToken(value);\n if (trimmed) {\n return trimmed;\n }\n\n if (allowNull && value === null) {\n return null;\n }\n\n return undefined;\n}\n\nfunction requireCommandSuccessPayload(payload: unknown, url: string): JsonObject {\n const normalized = requireRemoteOkPayload(payload, url);\n if (!isRecord(normalized) || normalized.ok !== true) {\n throw new CliError(`Dataset command returned an unexpected payload for ${url}`, {\n code: 'REMOTE_RESPONSE_INVALID',\n exitCode: 1,\n details: normalized,\n });\n }\n\n return normalized;\n}\n\nasync function invokeDatasetCommand(options: {\n transport: DatasetCommandTransport;\n commandName: 'app_dataset_create' | 'app_dataset_save_draft';\n body: JsonObject;\n}): Promise<JsonObject> {\n const url = `${options.transport.functionsBaseUrl}/${options.commandName}`;\n return requireCommandSuccessPayload(\n await postJson({\n url,\n headers: {\n ...buildSupabaseAuthHeaders(\n options.transport.publishableKey,\n options.transport.accessToken,\n ),\n 'Content-Type': 'application/json',\n },\n body: options.body,\n timeoutMs: options.transport.timeoutMs,\n fetchImpl: options.transport.fetchImpl,\n }),\n url,\n );\n}\n\nexport function deriveSupabaseFunctionsBaseUrl(apiBaseUrl: string): string {\n return `${deriveSupabaseProjectBaseUrl(apiBaseUrl)}/functions/v1`;\n}\n\nexport async function buildDatasetCommandTransport(options: {\n runtime: SupabaseDataRuntime;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<DatasetCommandTransport> {\n return {\n functionsBaseUrl: deriveSupabaseFunctionsBaseUrl(options.runtime.apiBaseUrl),\n publishableKey: options.runtime.publishableKey,\n accessToken: await options.runtime.getAccessToken(),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n };\n}\n\nexport async function resolveDatasetCommandTransport(options: {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<DatasetCommandTransport> {\n return buildDatasetCommandTransport({\n runtime: createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n }),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n}\n\nexport async function createDatasetRecord(options: {\n transport: DatasetCommandTransport;\n table: DatasetCommandTable;\n id: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<JsonObject> {\n const body: JsonObject = {\n table: options.table,\n id: options.id,\n jsonOrdered: options.payload,\n };\n const modelId = readOptionalModelId(options.extraData, true);\n if (modelId !== undefined) {\n body.modelId = modelId;\n }\n const ruleVerification = readOptionalRuleVerification(options.extraData);\n if (ruleVerification !== undefined) {\n body.ruleVerification = ruleVerification;\n }\n\n return invokeDatasetCommand({\n transport: options.transport,\n commandName: 'app_dataset_create',\n body,\n });\n}\n\nexport async function saveDraftDatasetRecord(options: {\n transport: DatasetCommandTransport;\n table: DatasetCommandTable;\n id: string;\n version: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<JsonObject> {\n const body: JsonObject = {\n table: options.table,\n id: options.id,\n version: options.version,\n jsonOrdered: options.payload,\n };\n const modelId = readOptionalModelId(options.extraData, false);\n if (modelId !== undefined) {\n body.modelId = modelId;\n }\n const ruleVerification = readOptionalRuleVerification(options.extraData);\n if (ruleVerification !== undefined) {\n body.ruleVerification = ruleVerification;\n }\n\n return invokeDatasetCommand({\n transport: options.transport,\n commandName: 'app_dataset_save_draft',\n body,\n });\n}\n\nexport const __testInternals = {\n deriveSupabaseFunctionsBaseUrl,\n readOptionalModelId,\n readOptionalRuleVerification,\n};\n"]}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';
|
|
4
|
+
import { buildDatasetCommandTransport, createDatasetRecord, saveDraftDatasetRecord, } from './dataset-command.js';
|
|
4
5
|
import { CliError } from './errors.js';
|
|
5
6
|
import { coerceText, deepGet, isRecord, loadRowsFromFile, } from './flow-governance.js';
|
|
6
|
-
import { createSupabaseDataClient, requireSupabaseRestRuntime, runSupabaseArrayQuery,
|
|
7
|
+
import { createSupabaseDataClient, requireSupabaseRestRuntime, runSupabaseArrayQuery, } from './supabase-client.js';
|
|
7
8
|
import { createSupabaseDataRuntime } from './supabase-session.js';
|
|
8
9
|
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
9
10
|
const DEFAULT_MAX_WORKERS = 4;
|
|
@@ -266,21 +267,21 @@ function build_error_reasons(stage, error) {
|
|
|
266
267
|
];
|
|
267
268
|
}
|
|
268
269
|
async function insert_flow_version(options) {
|
|
269
|
-
|
|
270
|
-
|
|
270
|
+
await createDatasetRecord({
|
|
271
|
+
transport: options.transport,
|
|
272
|
+
table: 'flows',
|
|
271
273
|
id: options.rowId,
|
|
272
|
-
|
|
273
|
-
})
|
|
274
|
+
payload: options.payload,
|
|
275
|
+
});
|
|
274
276
|
}
|
|
275
277
|
async function update_flow_version(options) {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
.
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
.eq('version', options.version), url);
|
|
278
|
+
await saveDraftDatasetRecord({
|
|
279
|
+
transport: options.transport,
|
|
280
|
+
table: 'flows',
|
|
281
|
+
id: options.rowId,
|
|
282
|
+
version: options.version,
|
|
283
|
+
payload: options.payload,
|
|
284
|
+
});
|
|
284
285
|
}
|
|
285
286
|
async function sync_one_row(options) {
|
|
286
287
|
try {
|
|
@@ -329,8 +330,7 @@ async function sync_one_row(options) {
|
|
|
329
330
|
}
|
|
330
331
|
if (ownBefore) {
|
|
331
332
|
await update_flow_version({
|
|
332
|
-
|
|
333
|
-
restBaseUrl: options.restBaseUrl,
|
|
333
|
+
transport: options.commandTransport,
|
|
334
334
|
rowId,
|
|
335
335
|
version,
|
|
336
336
|
payload,
|
|
@@ -352,8 +352,7 @@ async function sync_one_row(options) {
|
|
|
352
352
|
}
|
|
353
353
|
try {
|
|
354
354
|
await insert_flow_version({
|
|
355
|
-
|
|
356
|
-
restBaseUrl: options.restBaseUrl,
|
|
355
|
+
transport: options.commandTransport,
|
|
357
356
|
rowId,
|
|
358
357
|
payload,
|
|
359
358
|
});
|
|
@@ -377,8 +376,7 @@ async function sync_one_row(options) {
|
|
|
377
376
|
if (ownAfter) {
|
|
378
377
|
try {
|
|
379
378
|
await update_flow_version({
|
|
380
|
-
|
|
381
|
-
restBaseUrl: options.restBaseUrl,
|
|
379
|
+
transport: options.commandTransport,
|
|
382
380
|
rowId,
|
|
383
381
|
version,
|
|
384
382
|
payload,
|
|
@@ -458,6 +456,11 @@ export async function runFlowPublishVersion(options) {
|
|
|
458
456
|
timeoutMs,
|
|
459
457
|
now,
|
|
460
458
|
});
|
|
459
|
+
const commandTransport = await buildDatasetCommandTransport({
|
|
460
|
+
runtime,
|
|
461
|
+
fetchImpl,
|
|
462
|
+
timeoutMs,
|
|
463
|
+
});
|
|
461
464
|
const { client, restBaseUrl } = createSupabaseDataClient(runtime, fetchImpl, timeoutMs);
|
|
462
465
|
const targetUserIdOverride = normalize_token(options.targetUserId ?? null);
|
|
463
466
|
const files = build_output_files(outDir);
|
|
@@ -476,6 +479,7 @@ export async function runFlowPublishVersion(options) {
|
|
|
476
479
|
mode,
|
|
477
480
|
client,
|
|
478
481
|
restBaseUrl,
|
|
482
|
+
commandTransport,
|
|
479
483
|
targetUserIdOverride,
|
|
480
484
|
}));
|
|
481
485
|
const successes = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-publish-version.js","sourceRoot":"","sources":["../../../src/lib/flow-publish-version.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport {\n coerceText,\n deepGet,\n isRecord,\n loadRowsFromFile,\n type JsonRecord,\n} from './flow-governance.js';\nimport type { FetchLike, ResponseLike } from './http.js';\nimport {\n createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n runSupabaseMutation,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_MAX_WORKERS = 4;\nconst LEGACY_OUTPUT_PREFIX = 'flows_tidas_sdk_plus_classification';\n\ntype FlowPublishMode = 'dry_run' | 'commit';\ntype FlowPublishOperation =\n | 'would_insert'\n | 'would_update_existing'\n | 'insert'\n | 'update_existing'\n | 'update_after_insert_error';\n\ntype FlowPublishFailureReason = {\n validator: 'remote_rest';\n stage: string;\n path: string;\n message: string;\n code: string;\n visible_user_id?: string;\n visible_state_code?: string;\n};\n\ntype VisibleFlowRow = {\n id: string;\n version: string;\n user_id: string;\n state_code: number | null;\n};\n\ntype SupabaseDataClient = ReturnType<typeof createSupabaseDataClient>['client'];\n\ntype FlowPublishFailureRow = {\n id: unknown;\n user_id: unknown;\n json_ordered: JsonRecord;\n reason: FlowPublishFailureReason[];\n state_code: unknown;\n};\n\ntype FlowPublishSuccessRow = {\n id: string;\n version: string;\n operation: FlowPublishOperation;\n};\n\ntype FlowPublishFiles = {\n successList: string;\n remoteFailed: string;\n report: string;\n};\n\ntype FlowPublishOutcome =\n | {\n status: 'success';\n success: FlowPublishSuccessRow;\n }\n | {\n status: 'failure';\n failure: FlowPublishFailureRow;\n };\n\nexport type FlowPublishVersionReport = {\n schema_version: 1;\n generated_at_utc: string;\n status:\n | 'prepared_flow_publish_version'\n | 'completed_flow_publish_version'\n | 'completed_flow_publish_version_with_failures';\n mode: FlowPublishMode;\n input_file: string;\n out_dir: string;\n counts: {\n total_rows: number;\n success_count: number;\n failure_count: number;\n };\n operation_counts: Record<string, number>;\n max_workers: number;\n limit: number | null;\n target_user_id_override: string | null;\n files: {\n success_list: string;\n remote_failed: string;\n report: string;\n };\n};\n\nexport type RunFlowPublishVersionOptions = {\n inputFile: string;\n outDir: string;\n commit?: boolean;\n maxWorkers?: number;\n limit?: number;\n targetUserId?: string | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\nfunction normalize_token(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction assert_input_file(inputFile: string): string {\n const resolved = path.resolve(inputFile);\n if (!inputFile) {\n throw new CliError('Missing required --input-file value.', {\n code: 'FLOW_PUBLISH_VERSION_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n if (!existsSync(resolved)) {\n throw new CliError(`Flow publish-version input file not found: ${resolved}`, {\n code: 'FLOW_PUBLISH_VERSION_INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n return resolved;\n}\n\nfunction assert_out_dir(outDir: string): string {\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_PUBLISH_VERSION_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n return path.resolve(outDir);\n}\n\nfunction to_positive_integer(\n value: number | undefined,\n label: string,\n code: string,\n defaultValue: number,\n): number {\n if (value === undefined) {\n return defaultValue;\n }\n if (!Number.isInteger(value) || value <= 0) {\n throw new CliError(`Expected ${label} to be a positive integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction to_non_negative_integer(\n value: number | undefined,\n label: string,\n code: string,\n): number | null {\n if (value === undefined) {\n return null;\n }\n if (!Number.isInteger(value) || value < 0) {\n throw new CliError(`Expected ${label} to be a non-negative integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction build_output_files(outDir: string): FlowPublishFiles {\n return {\n successList: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_mcp_success_list.json`),\n remoteFailed: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_remote_validation_failed.jsonl`),\n report: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_mcp_sync_report.json`),\n };\n}\n\nfunction flow_payload(row: JsonRecord): JsonRecord {\n if (isRecord(row.json_ordered)) {\n return row.json_ordered;\n }\n if (isRecord(row.jsonOrdered)) {\n return row.jsonOrdered;\n }\n if (isRecord(row.json)) {\n return row.json;\n }\n if (isRecord(row.flowDataSet)) {\n return row;\n }\n throw new CliError(\n 'Flow row is missing json_ordered/jsonOrdered/json or a top-level flowDataSet payload.',\n {\n code: 'FLOW_PUBLISH_VERSION_PAYLOAD_REQUIRED',\n exitCode: 2,\n },\n );\n}\n\nfunction flow_id(row: JsonRecord, payload: JsonRecord): string {\n return (\n coerceText(row.id) ||\n coerceText(\n deepGet(payload, ['flowDataSet', 'flowInformation', 'dataSetInformation', 'common:UUID']),\n )\n );\n}\n\nfunction flow_version(payload: JsonRecord): string {\n const version = coerceText(\n deepGet(payload, [\n 'flowDataSet',\n 'administrativeInformation',\n 'publicationAndOwnership',\n 'common:dataSetVersion',\n ]),\n );\n if (!version) {\n throw new CliError(\n 'Flow payload is missing flowDataSet.administrativeInformation.publicationAndOwnership.common:dataSetVersion.',\n {\n code: 'FLOW_PUBLISH_VERSION_MISSING_VERSION',\n exitCode: 2,\n },\n );\n }\n return version;\n}\n\nfunction resolve_target_user_id(\n row: JsonRecord,\n targetUserIdOverride: string | null,\n): string | null {\n return normalize_token(coerceText(row.user_id)) ?? targetUserIdOverride;\n}\n\nfunction build_visible_rows_url(restBaseUrl: string, id: string, version: string): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/flows`);\n url.searchParams.set('select', 'id,version,user_id,state_code');\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction build_update_url(restBaseUrl: string, id: string, version: string): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/flows`);\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nasync function parse_response(response: ResponseLike, url: string): Promise<unknown> {\n const rawText = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n\n if (!response.ok) {\n throw new CliError(`HTTP ${response.status} returned from ${url}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: rawText,\n });\n }\n\n if (!rawText) {\n return null;\n }\n\n if (contentType.includes('application/json')) {\n try {\n return JSON.parse(rawText);\n } catch (error) {\n throw new CliError(`Remote response was not valid JSON for ${url}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n }\n\n return rawText;\n}\n\nfunction parse_visible_rows(payload: unknown, url: string): VisibleFlowRow[] {\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: coerceText(item.id),\n version: coerceText(item.version),\n user_id: coerceText(item.user_id),\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n };\n });\n}\n\nasync function visible_exact_rows(options: {\n client: SupabaseDataClient;\n restBaseUrl: string;\n id: string;\n version: string;\n}): Promise<VisibleFlowRow[]> {\n const url = build_visible_rows_url(options.restBaseUrl, options.id, options.version);\n const payload = await runSupabaseArrayQuery(\n options.client\n .from('flows')\n .select('id,version,user_id,state_code')\n .eq('id', options.id)\n .eq('version', options.version),\n url,\n );\n return parse_visible_rows(payload, url);\n}\n\nfunction own_visible_row(\n rows: VisibleFlowRow[],\n targetUserId: string | null,\n): VisibleFlowRow | null {\n if (!targetUserId) {\n return null;\n }\n return rows.find((row) => row.user_id === targetUserId) ?? null;\n}\n\nfunction visible_conflict_reasons(\n stage: string,\n visibleRows: VisibleFlowRow[],\n targetUserId: string | null,\n): FlowPublishFailureReason[] {\n if (visibleRows.length === 0) {\n return [];\n }\n\n if (!targetUserId) {\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message:\n 'Exact UUID/version is already visible, but no target user id was available to determine whether the row is writable.',\n code: 'target_user_id_required',\n },\n ];\n }\n\n return visibleRows.map((row) => ({\n validator: 'remote_rest',\n stage,\n path: '',\n message: 'Exact UUID/version is already visible but not writable under the target user.',\n code: 'exact_version_visible_not_owned',\n visible_user_id: row.user_id,\n visible_state_code: row.state_code === null ? '' : String(row.state_code),\n }));\n}\n\nfunction failure_row(\n sourceRow: JsonRecord,\n reasons: FlowPublishFailureReason[],\n): FlowPublishFailureRow {\n let payload: JsonRecord;\n try {\n payload = flow_payload(sourceRow);\n } catch {\n payload = {};\n }\n return {\n id: sourceRow.id,\n user_id: sourceRow.user_id,\n json_ordered: payload,\n reason: reasons,\n state_code: sourceRow.state_code,\n };\n}\n\nfunction build_error_reasons(stage: string, error: unknown): FlowPublishFailureReason[] {\n if (error instanceof CliError) {\n const detailText = typeof error.details === 'string' ? error.details.trim() : error.message;\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message: detailText || error.message,\n code: error.code,\n },\n ];\n }\n\n if (error instanceof Error) {\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message: error.message,\n code: error.name || 'Error',\n },\n ];\n }\n\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message: String(error),\n code: 'UnknownError',\n },\n ];\n}\n\nasync function insert_flow_version(options: {\n client: SupabaseDataClient;\n restBaseUrl: string;\n rowId: string;\n payload: JsonRecord;\n}): Promise<void> {\n const url = `${options.restBaseUrl.replace(/\\/+$/u, '')}/flows`;\n await runSupabaseMutation(\n options.client.from('flows').insert({\n id: options.rowId,\n json_ordered: options.payload,\n }),\n url,\n );\n}\n\nasync function update_flow_version(options: {\n client: SupabaseDataClient;\n restBaseUrl: string;\n rowId: string;\n version: string;\n payload: JsonRecord;\n}): Promise<void> {\n const url = build_update_url(options.restBaseUrl, options.rowId, options.version);\n await runSupabaseMutation(\n options.client\n .from('flows')\n .update({\n json_ordered: options.payload,\n })\n .eq('id', options.rowId)\n .eq('version', options.version),\n url,\n );\n}\n\nasync function sync_one_row(options: {\n row: JsonRecord;\n mode: FlowPublishMode;\n client: SupabaseDataClient;\n restBaseUrl: string;\n targetUserIdOverride: string | null;\n}): Promise<FlowPublishOutcome> {\n try {\n const payload = flow_payload(options.row);\n const rowId = flow_id(options.row, payload);\n if (!rowId) {\n throw new CliError('Flow row is missing a resolvable id/common:UUID value.', {\n code: 'FLOW_PUBLISH_VERSION_ID_REQUIRED',\n exitCode: 2,\n });\n }\n const version = flow_version(payload);\n const targetUserId = resolve_target_user_id(options.row, options.targetUserIdOverride);\n const visibleBefore = await visible_exact_rows({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n id: rowId,\n version,\n });\n const ownBefore = own_visible_row(visibleBefore, targetUserId);\n\n if (options.mode === 'dry_run') {\n if (ownBefore) {\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'would_update_existing',\n },\n };\n }\n\n if (visibleBefore.length > 0) {\n return {\n status: 'failure',\n failure: failure_row(\n options.row,\n visible_conflict_reasons('dry_run_preflight', visibleBefore, targetUserId),\n ),\n };\n }\n\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'would_insert',\n },\n };\n }\n\n if (ownBefore) {\n await update_flow_version({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n rowId,\n version,\n payload,\n });\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'update_existing',\n },\n };\n }\n\n if (visibleBefore.length > 0) {\n return {\n status: 'failure',\n failure: failure_row(\n options.row,\n visible_conflict_reasons('preflight', visibleBefore, targetUserId),\n ),\n };\n }\n\n try {\n await insert_flow_version({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n rowId,\n payload,\n });\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'insert',\n },\n };\n } catch (error) {\n const visibleAfter = await visible_exact_rows({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n id: rowId,\n version,\n });\n const ownAfter = own_visible_row(visibleAfter, targetUserId);\n if (ownAfter) {\n try {\n await update_flow_version({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n rowId,\n version,\n payload,\n });\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'update_after_insert_error',\n },\n };\n } catch (updateError) {\n return {\n status: 'failure',\n failure: failure_row(options.row, [\n ...build_error_reasons('insert', error),\n ...build_error_reasons('update_after_insert_error', updateError),\n ]),\n };\n }\n }\n\n return {\n status: 'failure',\n failure: failure_row(options.row, [\n ...build_error_reasons('insert', error),\n ...visible_conflict_reasons('post_insert_error_preflight', visibleAfter, targetUserId),\n ]),\n };\n }\n } catch (error) {\n return {\n status: 'failure',\n failure: failure_row(options.row, build_error_reasons('sync_one_unhandled', error)),\n };\n }\n}\n\nasync function map_with_concurrency<T, R>(\n items: T[],\n maxWorkers: number,\n worker: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n const workerCount = Math.min(Math.max(1, maxWorkers), Math.max(items.length, 1));\n let nextIndex = 0;\n\n async function runWorker(): Promise<void> {\n while (true) {\n const currentIndex = nextIndex;\n nextIndex += 1;\n if (currentIndex >= items.length) {\n return;\n }\n results[currentIndex] = await worker(items[currentIndex] as T, currentIndex);\n }\n }\n\n await Promise.all(Array.from({ length: workerCount }, () => runWorker()));\n return results;\n}\n\nfunction status_from_mode(\n mode: FlowPublishMode,\n failureCount: number,\n): FlowPublishVersionReport['status'] {\n if (mode === 'dry_run') {\n return 'prepared_flow_publish_version';\n }\n return failureCount > 0\n ? 'completed_flow_publish_version_with_failures'\n : 'completed_flow_publish_version';\n}\n\nexport async function runFlowPublishVersion(\n options: RunFlowPublishVersionOptions,\n): Promise<FlowPublishVersionReport> {\n const inputFile = assert_input_file(options.inputFile);\n const outDir = assert_out_dir(options.outDir);\n const mode: FlowPublishMode = options.commit ? 'commit' : 'dry_run';\n const maxWorkers = to_positive_integer(\n options.maxWorkers,\n '--max-workers',\n 'FLOW_PUBLISH_VERSION_MAX_WORKERS_INVALID',\n DEFAULT_MAX_WORKERS,\n );\n const limit = to_non_negative_integer(\n options.limit,\n '--limit',\n 'FLOW_PUBLISH_VERSION_LIMIT_INVALID',\n );\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const now = options.now ?? new Date();\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now,\n });\n const { client, restBaseUrl } = createSupabaseDataClient(runtime, fetchImpl, timeoutMs);\n const targetUserIdOverride = normalize_token(options.targetUserId ?? null);\n const files = build_output_files(outDir);\n\n let rows = loadRowsFromFile(inputFile);\n if (limit !== null && limit > 0) {\n rows = rows.slice(0, limit);\n }\n if (rows.length === 0) {\n throw new CliError(`No rows found in ${inputFile}`, {\n code: 'FLOW_PUBLISH_VERSION_EMPTY_INPUT',\n exitCode: 2,\n });\n }\n\n const outcomes = await map_with_concurrency(rows, maxWorkers, async (row) =>\n sync_one_row({\n row,\n mode,\n client,\n restBaseUrl,\n targetUserIdOverride,\n }),\n );\n\n const successes: FlowPublishSuccessRow[] = [];\n const failures: FlowPublishFailureRow[] = [];\n const operationCounts: Record<string, number> = {};\n\n for (const outcome of outcomes) {\n if (outcome.status === 'success') {\n successes.push(outcome.success);\n operationCounts[outcome.success.operation] =\n (operationCounts[outcome.success.operation] ?? 0) + 1;\n } else {\n failures.push(outcome.failure);\n }\n }\n\n await writeJsonArtifact(files.successList, successes);\n await writeJsonLinesArtifact(files.remoteFailed, failures);\n\n const report: FlowPublishVersionReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n status: status_from_mode(mode, failures.length),\n mode,\n input_file: inputFile,\n out_dir: outDir,\n counts: {\n total_rows: rows.length,\n success_count: successes.length,\n failure_count: failures.length,\n },\n operation_counts: operationCounts,\n max_workers: maxWorkers,\n limit,\n target_user_id_override: targetUserIdOverride,\n files: {\n success_list: files.successList,\n remote_failed: files.remoteFailed,\n report: files.report,\n },\n };\n\n await writeJsonArtifact(files.report, report);\n return report;\n}\n\nexport const __testInternals = {\n assert_input_file,\n assert_out_dir,\n to_positive_integer,\n to_non_negative_integer,\n build_output_files,\n flow_payload,\n flow_id,\n flow_version,\n resolve_target_user_id,\n build_visible_rows_url,\n build_update_url,\n parse_response,\n parse_visible_rows,\n visible_conflict_reasons,\n failure_row,\n build_error_reasons,\n map_with_concurrency,\n status_from_mode,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"flow-publish-version.js","sourceRoot":"","sources":["../../../src/lib/flow-publish-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACnB,sBAAsB,GAEvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EACL,UAAU,EACV,OAAO,EACP,QAAQ,EACR,gBAAgB,GAEjB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,oBAAoB,GAAG,qCAAqC,CAAC;AAkGnE,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,QAAQ,CAAC,sCAAsC,EAAE;YACzD,IAAI,EAAE,qCAAqC;YAC3C,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,QAAQ,CAAC,8CAA8C,QAAQ,EAAE,EAAE;YAC3E,IAAI,EAAE,sCAAsC;YAC5C,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,MAAc;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAAC,mCAAmC,EAAE;YACtD,IAAI,EAAE,uCAAuC;YAC7C,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAyB,EACzB,KAAa,EACb,IAAY,EACZ,YAAoB;IAEpB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,QAAQ,CAAC,YAAY,KAAK,4BAA4B,EAAE;YAChE,IAAI;YACJ,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,uBAAuB,CAC9B,KAAyB,EACzB,KAAa,EACb,IAAY;IAEZ,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,QAAQ,CAAC,YAAY,KAAK,gCAAgC,EAAE;YACpE,IAAI;YACJ,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc;IACxC,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,oBAAoB,wBAAwB,CAAC;QAC/E,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,oBAAoB,iCAAiC,CAAC;QACzF,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,oBAAoB,uBAAuB,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,GAAe;IACnC,IAAI,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/B,OAAO,GAAG,CAAC,YAAY,CAAC;IAC1B,CAAC;IACD,IAAI,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,OAAO,GAAG,CAAC,WAAW,CAAC;IACzB,CAAC;IACD,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IACD,IAAI,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,IAAI,QAAQ,CAChB,uFAAuF,EACvF;QACE,IAAI,EAAE,uCAAuC;QAC7C,QAAQ,EAAE,CAAC;KACZ,CACF,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,GAAe,EAAE,OAAmB;IACnD,OAAO,CACL,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,UAAU,CACR,OAAO,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,aAAa,CAAC,CAAC,CAC1F,CACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAAmB;IACvC,MAAM,OAAO,GAAG,UAAU,CACxB,OAAO,CAAC,OAAO,EAAE;QACf,aAAa;QACb,2BAA2B;QAC3B,yBAAyB;QACzB,uBAAuB;KACxB,CAAC,CACH,CAAC;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAChB,8GAA8G,EAC9G;YACE,IAAI,EAAE,sCAAsC;YAC5C,QAAQ,EAAE,CAAC;SACZ,CACF,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,sBAAsB,CAC7B,GAAe,EACf,oBAAmC;IAEnC,OAAO,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,oBAAoB,CAAC;AAC1E,CAAC;AAED,SAAS,sBAAsB,CAAC,WAAmB,EAAE,EAAU,EAAE,OAAe;IAC9E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IACjE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CAAC;IAChE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,OAAO,EAAE,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAC,WAAmB,EAAE,EAAU,EAAE,OAAe;IACxE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IACjE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,OAAO,EAAE,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAsB,EAAE,GAAW;IAC/D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAE/D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,QAAQ,CAAC,QAAQ,QAAQ,CAAC,MAAM,kBAAkB,GAAG,EAAE,EAAE;YACjE,IAAI,EAAE,uBAAuB;YAC7B,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,QAAQ,CAAC,0CAA0C,GAAG,EAAE,EAAE;gBAClE,IAAI,EAAE,qBAAqB;gBAC3B,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAgB,EAAE,GAAW;IACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAAC,mDAAmD,GAAG,EAAE,EAAE;YAC3E,IAAI,EAAE,gCAAgC;YACtC,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,QAAQ,CAAC,qBAAqB,KAAK,8BAA8B,GAAG,EAAE,EAAE;gBAChF,IAAI,EAAE,gCAAgC;gBACtC,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;YACjC,UAAU,EAAE,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;SACzE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAKjC;IACC,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,MAAM,qBAAqB,CACzC,OAAO,CAAC,MAAM;SACX,IAAI,CAAC,OAAO,CAAC;SACb,MAAM,CAAC,+BAA+B,CAAC;SACvC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;SACpB,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,EACjC,GAAG,CACJ,CAAC;IACF,OAAO,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,eAAe,CACtB,IAAsB,EACtB,YAA2B;IAE3B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,YAAY,CAAC,IAAI,IAAI,CAAC;AAClE,CAAC;AAED,SAAS,wBAAwB,CAC/B,KAAa,EACb,WAA6B,EAC7B,YAA2B;IAE3B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL;gBACE,SAAS,EAAE,aAAa;gBACxB,KAAK;gBACL,IAAI,EAAE,EAAE;gBACR,OAAO,EACL,sHAAsH;gBACxH,IAAI,EAAE,yBAAyB;aAChC;SACF,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/B,SAAS,EAAE,aAAa;QACxB,KAAK;QACL,IAAI,EAAE,EAAE;QACR,OAAO,EAAE,+EAA+E;QACxF,IAAI,EAAE,iCAAiC;QACvC,eAAe,EAAE,GAAG,CAAC,OAAO;QAC5B,kBAAkB,EAAE,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;KAC1E,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,WAAW,CAClB,SAAqB,EACrB,OAAmC;IAEnC,IAAI,OAAmB,CAAC;IACxB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,EAAE,CAAC;IACf,CAAC;IACD,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,YAAY,EAAE,OAAO;QACrB,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,SAAS,CAAC,UAAU;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,KAAc;IACxD,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;QAC5F,OAAO;YACL;gBACE,SAAS,EAAE,aAAa;gBACxB,KAAK;gBACL,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,UAAU,IAAI,KAAK,CAAC,OAAO;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB;SACF,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL;gBACE,SAAS,EAAE,aAAa;gBACxB,KAAK;gBACL,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,OAAO;aAC5B;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL;YACE,SAAS,EAAE,aAAa;YACxB,KAAK;YACL,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;YACtB,IAAI,EAAE,cAAc;SACrB;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,OAIlC;IACC,MAAM,mBAAmB,CAAC;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,KAAK,EAAE,OAAO;QACd,EAAE,EAAE,OAAO,CAAC,KAAK;QACjB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,OAKlC;IACC,MAAM,sBAAsB,CAAC;QAC3B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,KAAK,EAAE,OAAO;QACd,EAAE,EAAE,OAAO,CAAC,KAAK;QACjB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAO3B;IACC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,QAAQ,CAAC,wDAAwD,EAAE;gBAC3E,IAAI,EAAE,kCAAkC;gBACxC,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,YAAY,GAAG,sBAAsB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACvF,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC;YAC7C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,EAAE,EAAE,KAAK;YACT,OAAO;SACR,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,eAAe,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAE/D,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO;oBACL,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE;wBACP,EAAE,EAAE,KAAK;wBACT,OAAO;wBACP,SAAS,EAAE,uBAAuB;qBACnC;iBACF,CAAC;YACJ,CAAC;YAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO;oBACL,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE,WAAW,CAClB,OAAO,CAAC,GAAG,EACX,wBAAwB,CAAC,mBAAmB,EAAE,aAAa,EAAE,YAAY,CAAC,CAC3E;iBACF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE;oBACP,EAAE,EAAE,KAAK;oBACT,OAAO;oBACP,SAAS,EAAE,cAAc;iBAC1B;aACF,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,mBAAmB,CAAC;gBACxB,SAAS,EAAE,OAAO,CAAC,gBAAgB;gBACnC,KAAK;gBACL,OAAO;gBACP,OAAO;aACR,CAAC,CAAC;YACH,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE;oBACP,EAAE,EAAE,KAAK;oBACT,OAAO;oBACP,SAAS,EAAE,iBAAiB;iBAC7B;aACF,CAAC;QACJ,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,WAAW,CAClB,OAAO,CAAC,GAAG,EACX,wBAAwB,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,CAAC,CACnE;aACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,mBAAmB,CAAC;gBACxB,SAAS,EAAE,OAAO,CAAC,gBAAgB;gBACnC,KAAK;gBACL,OAAO;aACR,CAAC,CAAC;YACH,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE;oBACP,EAAE,EAAE,KAAK;oBACT,OAAO;oBACP,SAAS,EAAE,QAAQ;iBACpB;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC;gBAC5C,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,EAAE,EAAE,KAAK;gBACT,OAAO;aACR,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,eAAe,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAC7D,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC;oBACH,MAAM,mBAAmB,CAAC;wBACxB,SAAS,EAAE,OAAO,CAAC,gBAAgB;wBACnC,KAAK;wBACL,OAAO;wBACP,OAAO;qBACR,CAAC,CAAC;oBACH,OAAO;wBACL,MAAM,EAAE,SAAS;wBACjB,OAAO,EAAE;4BACP,EAAE,EAAE,KAAK;4BACT,OAAO;4BACP,SAAS,EAAE,2BAA2B;yBACvC;qBACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,WAAW,EAAE,CAAC;oBACrB,OAAO;wBACL,MAAM,EAAE,SAAS;wBACjB,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE;4BAChC,GAAG,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC;4BACvC,GAAG,mBAAmB,CAAC,2BAA2B,EAAE,WAAW,CAAC;yBACjE,CAAC;qBACH,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE;oBAChC,GAAG,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC;oBACvC,GAAG,wBAAwB,CAAC,6BAA6B,EAAE,YAAY,EAAE,YAAY,CAAC;iBACvF,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;SACpF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,KAAU,EACV,UAAkB,EAClB,MAA8C;IAE9C,MAAM,OAAO,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACjF,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,UAAU,SAAS;QACtB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,YAAY,GAAG,SAAS,CAAC;YAC/B,SAAS,IAAI,CAAC,CAAC;YACf,IAAI,YAAY,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjC,OAAO;YACT,CAAC;YACD,OAAO,CAAC,YAAY,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAM,EAAE,YAAY,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC1E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAqB,EACrB,YAAoB;IAEpB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,+BAA+B,CAAC;IACzC,CAAC;IACD,OAAO,YAAY,GAAG,CAAC;QACrB,CAAC,CAAC,8CAA8C;QAChD,CAAC,CAAC,gCAAgC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAqC;IAErC,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAoB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,MAAM,UAAU,GAAG,mBAAmB,CACpC,OAAO,CAAC,UAAU,EAClB,eAAe,EACf,0CAA0C,EAC1C,mBAAmB,CACpB,CAAC;IACF,MAAM,KAAK,GAAG,uBAAuB,CACnC,OAAO,CAAC,KAAK,EACb,SAAS,EACT,oCAAoC,CACrC,CAAC;IACF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAK,KAAmB,CAAC;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,yBAAyB,CAAC;QACxC,OAAO,EAAE,0BAA0B,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;QAC/D,SAAS;QACT,SAAS;QACT,GAAG;KACJ,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,MAAM,4BAA4B,CAAC;QAC1D,OAAO;QACP,SAAS;QACT,SAAS;KACV,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,wBAAwB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACxF,MAAM,oBAAoB,GAAG,eAAe,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAEzC,IAAI,IAAI,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,QAAQ,CAAC,oBAAoB,SAAS,EAAE,EAAE;YAClD,IAAI,EAAE,kCAAkC;YACxC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAC1E,YAAY,CAAC;QACX,GAAG;QACH,IAAI;QACJ,MAAM;QACN,WAAW;QACX,gBAAgB;QAChB,oBAAoB;KACrB,CAAC,CACH,CAAC;IAEF,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,MAAM,eAAe,GAA2B,EAAE,CAAC;IAEnD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAChC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;gBACxC,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,MAAM,iBAAiB,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,sBAAsB,CAAC,KAAK,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAE3D,MAAM,MAAM,GAA6B;QACvC,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;QAC3D,MAAM,EAAE,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;QAC/C,IAAI;QACJ,UAAU,EAAE,SAAS;QACrB,OAAO,EAAE,MAAM;QACf,MAAM,EAAE;YACN,UAAU,EAAE,IAAI,CAAC,MAAM;YACvB,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,aAAa,EAAE,QAAQ,CAAC,MAAM;SAC/B;QACD,gBAAgB,EAAE,eAAe;QACjC,WAAW,EAAE,UAAU;QACvB,KAAK;QACL,uBAAuB,EAAE,oBAAoB;QAC7C,KAAK,EAAE;YACL,YAAY,EAAE,KAAK,CAAC,WAAW;YAC/B,aAAa,EAAE,KAAK,CAAC,YAAY;YACjC,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB;KACF,CAAC;IAEF,MAAM,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,iBAAiB;IACjB,cAAc;IACd,mBAAmB;IACnB,uBAAuB;IACvB,kBAAkB;IAClB,YAAY;IACZ,OAAO;IACP,YAAY;IACZ,sBAAsB;IACtB,sBAAsB;IACtB,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,wBAAwB;IACxB,WAAW;IACX,mBAAmB;IACnB,oBAAoB;IACpB,gBAAgB;CACjB,CAAC","sourcesContent":["import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport {\n buildDatasetCommandTransport,\n createDatasetRecord,\n saveDraftDatasetRecord,\n type DatasetCommandTransport,\n} from './dataset-command.js';\nimport { CliError } from './errors.js';\nimport {\n coerceText,\n deepGet,\n isRecord,\n loadRowsFromFile,\n type JsonRecord,\n} from './flow-governance.js';\nimport type { FetchLike, ResponseLike } from './http.js';\nimport {\n createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_MAX_WORKERS = 4;\nconst LEGACY_OUTPUT_PREFIX = 'flows_tidas_sdk_plus_classification';\n\ntype FlowPublishMode = 'dry_run' | 'commit';\ntype FlowPublishOperation =\n | 'would_insert'\n | 'would_update_existing'\n | 'insert'\n | 'update_existing'\n | 'update_after_insert_error';\n\ntype FlowPublishFailureReason = {\n validator: 'remote_rest';\n stage: string;\n path: string;\n message: string;\n code: string;\n visible_user_id?: string;\n visible_state_code?: string;\n};\n\ntype VisibleFlowRow = {\n id: string;\n version: string;\n user_id: string;\n state_code: number | null;\n};\n\ntype SupabaseDataClient = ReturnType<typeof createSupabaseDataClient>['client'];\n\ntype FlowPublishFailureRow = {\n id: unknown;\n user_id: unknown;\n json_ordered: JsonRecord;\n reason: FlowPublishFailureReason[];\n state_code: unknown;\n};\n\ntype FlowPublishSuccessRow = {\n id: string;\n version: string;\n operation: FlowPublishOperation;\n};\n\ntype FlowPublishFiles = {\n successList: string;\n remoteFailed: string;\n report: string;\n};\n\ntype FlowPublishOutcome =\n | {\n status: 'success';\n success: FlowPublishSuccessRow;\n }\n | {\n status: 'failure';\n failure: FlowPublishFailureRow;\n };\n\nexport type FlowPublishVersionReport = {\n schema_version: 1;\n generated_at_utc: string;\n status:\n | 'prepared_flow_publish_version'\n | 'completed_flow_publish_version'\n | 'completed_flow_publish_version_with_failures';\n mode: FlowPublishMode;\n input_file: string;\n out_dir: string;\n counts: {\n total_rows: number;\n success_count: number;\n failure_count: number;\n };\n operation_counts: Record<string, number>;\n max_workers: number;\n limit: number | null;\n target_user_id_override: string | null;\n files: {\n success_list: string;\n remote_failed: string;\n report: string;\n };\n};\n\nexport type RunFlowPublishVersionOptions = {\n inputFile: string;\n outDir: string;\n commit?: boolean;\n maxWorkers?: number;\n limit?: number;\n targetUserId?: string | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\nfunction normalize_token(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction assert_input_file(inputFile: string): string {\n const resolved = path.resolve(inputFile);\n if (!inputFile) {\n throw new CliError('Missing required --input-file value.', {\n code: 'FLOW_PUBLISH_VERSION_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n if (!existsSync(resolved)) {\n throw new CliError(`Flow publish-version input file not found: ${resolved}`, {\n code: 'FLOW_PUBLISH_VERSION_INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n return resolved;\n}\n\nfunction assert_out_dir(outDir: string): string {\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_PUBLISH_VERSION_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n return path.resolve(outDir);\n}\n\nfunction to_positive_integer(\n value: number | undefined,\n label: string,\n code: string,\n defaultValue: number,\n): number {\n if (value === undefined) {\n return defaultValue;\n }\n if (!Number.isInteger(value) || value <= 0) {\n throw new CliError(`Expected ${label} to be a positive integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction to_non_negative_integer(\n value: number | undefined,\n label: string,\n code: string,\n): number | null {\n if (value === undefined) {\n return null;\n }\n if (!Number.isInteger(value) || value < 0) {\n throw new CliError(`Expected ${label} to be a non-negative integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction build_output_files(outDir: string): FlowPublishFiles {\n return {\n successList: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_mcp_success_list.json`),\n remoteFailed: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_remote_validation_failed.jsonl`),\n report: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_mcp_sync_report.json`),\n };\n}\n\nfunction flow_payload(row: JsonRecord): JsonRecord {\n if (isRecord(row.json_ordered)) {\n return row.json_ordered;\n }\n if (isRecord(row.jsonOrdered)) {\n return row.jsonOrdered;\n }\n if (isRecord(row.json)) {\n return row.json;\n }\n if (isRecord(row.flowDataSet)) {\n return row;\n }\n throw new CliError(\n 'Flow row is missing json_ordered/jsonOrdered/json or a top-level flowDataSet payload.',\n {\n code: 'FLOW_PUBLISH_VERSION_PAYLOAD_REQUIRED',\n exitCode: 2,\n },\n );\n}\n\nfunction flow_id(row: JsonRecord, payload: JsonRecord): string {\n return (\n coerceText(row.id) ||\n coerceText(\n deepGet(payload, ['flowDataSet', 'flowInformation', 'dataSetInformation', 'common:UUID']),\n )\n );\n}\n\nfunction flow_version(payload: JsonRecord): string {\n const version = coerceText(\n deepGet(payload, [\n 'flowDataSet',\n 'administrativeInformation',\n 'publicationAndOwnership',\n 'common:dataSetVersion',\n ]),\n );\n if (!version) {\n throw new CliError(\n 'Flow payload is missing flowDataSet.administrativeInformation.publicationAndOwnership.common:dataSetVersion.',\n {\n code: 'FLOW_PUBLISH_VERSION_MISSING_VERSION',\n exitCode: 2,\n },\n );\n }\n return version;\n}\n\nfunction resolve_target_user_id(\n row: JsonRecord,\n targetUserIdOverride: string | null,\n): string | null {\n return normalize_token(coerceText(row.user_id)) ?? targetUserIdOverride;\n}\n\nfunction build_visible_rows_url(restBaseUrl: string, id: string, version: string): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/flows`);\n url.searchParams.set('select', 'id,version,user_id,state_code');\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction build_update_url(restBaseUrl: string, id: string, version: string): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/flows`);\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nasync function parse_response(response: ResponseLike, url: string): Promise<unknown> {\n const rawText = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n\n if (!response.ok) {\n throw new CliError(`HTTP ${response.status} returned from ${url}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: rawText,\n });\n }\n\n if (!rawText) {\n return null;\n }\n\n if (contentType.includes('application/json')) {\n try {\n return JSON.parse(rawText);\n } catch (error) {\n throw new CliError(`Remote response was not valid JSON for ${url}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n }\n\n return rawText;\n}\n\nfunction parse_visible_rows(payload: unknown, url: string): VisibleFlowRow[] {\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: coerceText(item.id),\n version: coerceText(item.version),\n user_id: coerceText(item.user_id),\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n };\n });\n}\n\nasync function visible_exact_rows(options: {\n client: SupabaseDataClient;\n restBaseUrl: string;\n id: string;\n version: string;\n}): Promise<VisibleFlowRow[]> {\n const url = build_visible_rows_url(options.restBaseUrl, options.id, options.version);\n const payload = await runSupabaseArrayQuery(\n options.client\n .from('flows')\n .select('id,version,user_id,state_code')\n .eq('id', options.id)\n .eq('version', options.version),\n url,\n );\n return parse_visible_rows(payload, url);\n}\n\nfunction own_visible_row(\n rows: VisibleFlowRow[],\n targetUserId: string | null,\n): VisibleFlowRow | null {\n if (!targetUserId) {\n return null;\n }\n return rows.find((row) => row.user_id === targetUserId) ?? null;\n}\n\nfunction visible_conflict_reasons(\n stage: string,\n visibleRows: VisibleFlowRow[],\n targetUserId: string | null,\n): FlowPublishFailureReason[] {\n if (visibleRows.length === 0) {\n return [];\n }\n\n if (!targetUserId) {\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message:\n 'Exact UUID/version is already visible, but no target user id was available to determine whether the row is writable.',\n code: 'target_user_id_required',\n },\n ];\n }\n\n return visibleRows.map((row) => ({\n validator: 'remote_rest',\n stage,\n path: '',\n message: 'Exact UUID/version is already visible but not writable under the target user.',\n code: 'exact_version_visible_not_owned',\n visible_user_id: row.user_id,\n visible_state_code: row.state_code === null ? '' : String(row.state_code),\n }));\n}\n\nfunction failure_row(\n sourceRow: JsonRecord,\n reasons: FlowPublishFailureReason[],\n): FlowPublishFailureRow {\n let payload: JsonRecord;\n try {\n payload = flow_payload(sourceRow);\n } catch {\n payload = {};\n }\n return {\n id: sourceRow.id,\n user_id: sourceRow.user_id,\n json_ordered: payload,\n reason: reasons,\n state_code: sourceRow.state_code,\n };\n}\n\nfunction build_error_reasons(stage: string, error: unknown): FlowPublishFailureReason[] {\n if (error instanceof CliError) {\n const detailText = typeof error.details === 'string' ? error.details.trim() : error.message;\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message: detailText || error.message,\n code: error.code,\n },\n ];\n }\n\n if (error instanceof Error) {\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message: error.message,\n code: error.name || 'Error',\n },\n ];\n }\n\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message: String(error),\n code: 'UnknownError',\n },\n ];\n}\n\nasync function insert_flow_version(options: {\n transport: DatasetCommandTransport;\n rowId: string;\n payload: JsonRecord;\n}): Promise<void> {\n await createDatasetRecord({\n transport: options.transport,\n table: 'flows',\n id: options.rowId,\n payload: options.payload,\n });\n}\n\nasync function update_flow_version(options: {\n transport: DatasetCommandTransport;\n rowId: string;\n version: string;\n payload: JsonRecord;\n}): Promise<void> {\n await saveDraftDatasetRecord({\n transport: options.transport,\n table: 'flows',\n id: options.rowId,\n version: options.version,\n payload: options.payload,\n });\n}\n\nasync function sync_one_row(options: {\n row: JsonRecord;\n mode: FlowPublishMode;\n client: SupabaseDataClient;\n restBaseUrl: string;\n commandTransport: DatasetCommandTransport;\n targetUserIdOverride: string | null;\n}): Promise<FlowPublishOutcome> {\n try {\n const payload = flow_payload(options.row);\n const rowId = flow_id(options.row, payload);\n if (!rowId) {\n throw new CliError('Flow row is missing a resolvable id/common:UUID value.', {\n code: 'FLOW_PUBLISH_VERSION_ID_REQUIRED',\n exitCode: 2,\n });\n }\n const version = flow_version(payload);\n const targetUserId = resolve_target_user_id(options.row, options.targetUserIdOverride);\n const visibleBefore = await visible_exact_rows({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n id: rowId,\n version,\n });\n const ownBefore = own_visible_row(visibleBefore, targetUserId);\n\n if (options.mode === 'dry_run') {\n if (ownBefore) {\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'would_update_existing',\n },\n };\n }\n\n if (visibleBefore.length > 0) {\n return {\n status: 'failure',\n failure: failure_row(\n options.row,\n visible_conflict_reasons('dry_run_preflight', visibleBefore, targetUserId),\n ),\n };\n }\n\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'would_insert',\n },\n };\n }\n\n if (ownBefore) {\n await update_flow_version({\n transport: options.commandTransport,\n rowId,\n version,\n payload,\n });\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'update_existing',\n },\n };\n }\n\n if (visibleBefore.length > 0) {\n return {\n status: 'failure',\n failure: failure_row(\n options.row,\n visible_conflict_reasons('preflight', visibleBefore, targetUserId),\n ),\n };\n }\n\n try {\n await insert_flow_version({\n transport: options.commandTransport,\n rowId,\n payload,\n });\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'insert',\n },\n };\n } catch (error) {\n const visibleAfter = await visible_exact_rows({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n id: rowId,\n version,\n });\n const ownAfter = own_visible_row(visibleAfter, targetUserId);\n if (ownAfter) {\n try {\n await update_flow_version({\n transport: options.commandTransport,\n rowId,\n version,\n payload,\n });\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'update_after_insert_error',\n },\n };\n } catch (updateError) {\n return {\n status: 'failure',\n failure: failure_row(options.row, [\n ...build_error_reasons('insert', error),\n ...build_error_reasons('update_after_insert_error', updateError),\n ]),\n };\n }\n }\n\n return {\n status: 'failure',\n failure: failure_row(options.row, [\n ...build_error_reasons('insert', error),\n ...visible_conflict_reasons('post_insert_error_preflight', visibleAfter, targetUserId),\n ]),\n };\n }\n } catch (error) {\n return {\n status: 'failure',\n failure: failure_row(options.row, build_error_reasons('sync_one_unhandled', error)),\n };\n }\n}\n\nasync function map_with_concurrency<T, R>(\n items: T[],\n maxWorkers: number,\n worker: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n const workerCount = Math.min(Math.max(1, maxWorkers), Math.max(items.length, 1));\n let nextIndex = 0;\n\n async function runWorker(): Promise<void> {\n while (true) {\n const currentIndex = nextIndex;\n nextIndex += 1;\n if (currentIndex >= items.length) {\n return;\n }\n results[currentIndex] = await worker(items[currentIndex] as T, currentIndex);\n }\n }\n\n await Promise.all(Array.from({ length: workerCount }, () => runWorker()));\n return results;\n}\n\nfunction status_from_mode(\n mode: FlowPublishMode,\n failureCount: number,\n): FlowPublishVersionReport['status'] {\n if (mode === 'dry_run') {\n return 'prepared_flow_publish_version';\n }\n return failureCount > 0\n ? 'completed_flow_publish_version_with_failures'\n : 'completed_flow_publish_version';\n}\n\nexport async function runFlowPublishVersion(\n options: RunFlowPublishVersionOptions,\n): Promise<FlowPublishVersionReport> {\n const inputFile = assert_input_file(options.inputFile);\n const outDir = assert_out_dir(options.outDir);\n const mode: FlowPublishMode = options.commit ? 'commit' : 'dry_run';\n const maxWorkers = to_positive_integer(\n options.maxWorkers,\n '--max-workers',\n 'FLOW_PUBLISH_VERSION_MAX_WORKERS_INVALID',\n DEFAULT_MAX_WORKERS,\n );\n const limit = to_non_negative_integer(\n options.limit,\n '--limit',\n 'FLOW_PUBLISH_VERSION_LIMIT_INVALID',\n );\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const now = options.now ?? new Date();\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now,\n });\n const commandTransport = await buildDatasetCommandTransport({\n runtime,\n fetchImpl,\n timeoutMs,\n });\n const { client, restBaseUrl } = createSupabaseDataClient(runtime, fetchImpl, timeoutMs);\n const targetUserIdOverride = normalize_token(options.targetUserId ?? null);\n const files = build_output_files(outDir);\n\n let rows = loadRowsFromFile(inputFile);\n if (limit !== null && limit > 0) {\n rows = rows.slice(0, limit);\n }\n if (rows.length === 0) {\n throw new CliError(`No rows found in ${inputFile}`, {\n code: 'FLOW_PUBLISH_VERSION_EMPTY_INPUT',\n exitCode: 2,\n });\n }\n\n const outcomes = await map_with_concurrency(rows, maxWorkers, async (row) =>\n sync_one_row({\n row,\n mode,\n client,\n restBaseUrl,\n commandTransport,\n targetUserIdOverride,\n }),\n );\n\n const successes: FlowPublishSuccessRow[] = [];\n const failures: FlowPublishFailureRow[] = [];\n const operationCounts: Record<string, number> = {};\n\n for (const outcome of outcomes) {\n if (outcome.status === 'success') {\n successes.push(outcome.success);\n operationCounts[outcome.success.operation] =\n (operationCounts[outcome.success.operation] ?? 0) + 1;\n } else {\n failures.push(outcome.failure);\n }\n }\n\n await writeJsonArtifact(files.successList, successes);\n await writeJsonLinesArtifact(files.remoteFailed, failures);\n\n const report: FlowPublishVersionReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n status: status_from_mode(mode, failures.length),\n mode,\n input_file: inputFile,\n out_dir: outDir,\n counts: {\n total_rows: rows.length,\n success_count: successes.length,\n failure_count: failures.length,\n },\n operation_counts: operationCounts,\n max_workers: maxWorkers,\n limit,\n target_user_id_override: targetUserIdOverride,\n files: {\n success_list: files.successList,\n remote_failed: files.remoteFailed,\n report: files.report,\n },\n };\n\n await writeJsonArtifact(files.report, report);\n return report;\n}\n\nexport const __testInternals = {\n assert_input_file,\n assert_out_dir,\n to_positive_integer,\n to_non_negative_integer,\n build_output_files,\n flow_payload,\n flow_id,\n flow_version,\n resolve_target_user_id,\n build_visible_rows_url,\n build_update_url,\n parse_response,\n parse_visible_rows,\n visible_conflict_reasons,\n failure_row,\n build_error_reasons,\n map_with_concurrency,\n status_from_mode,\n};\n"]}
|
package/dist/src/lib/http.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { CliError } from './errors.js';
|
|
2
|
+
function isRecord(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
2
5
|
async function parseResponse(response, url) {
|
|
3
6
|
const rawText = await response.text();
|
|
4
7
|
const contentType = response.headers.get('content-type') ?? '';
|
|
@@ -23,6 +26,22 @@ async function parseResponse(response, url) {
|
|
|
23
26
|
}
|
|
24
27
|
return rawText;
|
|
25
28
|
}
|
|
29
|
+
export function requireRemoteOkPayload(payload, url) {
|
|
30
|
+
if (!isRecord(payload) || payload.ok !== false) {
|
|
31
|
+
return payload;
|
|
32
|
+
}
|
|
33
|
+
const code = typeof payload.code === 'string' && payload.code.trim()
|
|
34
|
+
? payload.code.trim()
|
|
35
|
+
: 'REMOTE_APPLICATION_ERROR';
|
|
36
|
+
const message = typeof payload.message === 'string' && payload.message.trim()
|
|
37
|
+
? payload.message.trim()
|
|
38
|
+
: `Remote application response returned ok:false for ${url}`;
|
|
39
|
+
throw new CliError(message, {
|
|
40
|
+
code,
|
|
41
|
+
exitCode: 1,
|
|
42
|
+
details: payload,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
26
45
|
export async function postJson(options) {
|
|
27
46
|
const signal = AbortSignal.timeout(options.timeoutMs);
|
|
28
47
|
const response = await options.fetchImpl(options.url, {
|
package/dist/src/lib/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/lib/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/lib/http.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type ResponseLike = {\n ok: boolean;\n status: number;\n headers: {\n get(name: string): string | null;\n };\n text(): Promise<string>;\n};\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<ResponseLike>;\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nasync function parseResponse(response: ResponseLike, url: string): Promise<unknown> {\n const rawText = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n\n if (!response.ok) {\n throw new CliError(`HTTP ${response.status} returned from ${url}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: rawText,\n });\n }\n\n if (contentType.includes('application/json')) {\n try {\n return JSON.parse(rawText);\n } catch (error) {\n throw new CliError(`Remote response was not valid JSON for ${url}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n }\n\n return rawText;\n}\n\nexport function requireRemoteOkPayload(payload: unknown, url: string): unknown {\n if (!isRecord(payload) || payload.ok !== false) {\n return payload;\n }\n\n const code =\n typeof payload.code === 'string' && payload.code.trim()\n ? payload.code.trim()\n : 'REMOTE_APPLICATION_ERROR';\n const message =\n typeof payload.message === 'string' && payload.message.trim()\n ? payload.message.trim()\n : `Remote application response returned ok:false for ${url}`;\n\n throw new CliError(message, {\n code,\n exitCode: 1,\n details: payload,\n });\n}\n\nexport async function postJson(options: {\n url: string;\n headers: Record<string, string>;\n body: unknown;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<unknown> {\n const signal = AbortSignal.timeout(options.timeoutMs);\n const response = await options.fetchImpl(options.url, {\n method: 'POST',\n headers: options.headers,\n body: JSON.stringify(options.body),\n signal,\n });\n\n return parseResponse(response, options.url);\n}\n\nexport async function getJson(options: {\n url: string;\n headers: Record<string, string>;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<unknown> {\n const signal = AbortSignal.timeout(options.timeoutMs);\n const response = await options.fetchImpl(options.url, {\n method: 'GET',\n headers: options.headers,\n signal,\n });\n\n return parseResponse(response, options.url);\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
const PACKAGE_JSON_CANDIDATES = ['../package.json', '../../package.json'];
|
|
3
|
+
function parsePackageVersion(candidate, readText) {
|
|
4
|
+
try {
|
|
5
|
+
const payload = JSON.parse(readText(candidate));
|
|
6
|
+
return typeof payload.version === 'string' && payload.version.length > 0
|
|
7
|
+
? payload.version
|
|
8
|
+
: null;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function loadCliPackageVersion(importMetaUrl = import.meta.url, readText = (url) => readFileSync(url, 'utf8')) {
|
|
15
|
+
for (const relativePath of PACKAGE_JSON_CANDIDATES) {
|
|
16
|
+
const version = parsePackageVersion(new URL(relativePath, importMetaUrl), readText);
|
|
17
|
+
if (version) {
|
|
18
|
+
return version;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
throw new Error('Could not resolve CLI package version from package.json.');
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=package-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-version.js","sourceRoot":"","sources":["../../../src/lib/package-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,uBAAuB,GAAG,CAAC,iBAAiB,EAAE,oBAAoB,CAAU,CAAC;AAInF,SAAS,mBAAmB,CAAC,SAAc,EAAE,QAA8B;IACzE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAA0B,CAAC;QACzE,OAAO,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACtE,CAAC,CAAC,OAAO,CAAC,OAAO;YACjB,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,gBAAwB,MAAM,CAAC,IAAI,CAAC,GAAG,EACvC,WAAiC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC;IAEnE,KAAK,MAAM,YAAY,IAAI,uBAAuB,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;QACpF,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["import { readFileSync } from 'node:fs';\n\nconst PACKAGE_JSON_CANDIDATES = ['../package.json', '../../package.json'] as const;\n\ntype PackageVersionReader = (url: URL) => string;\n\nfunction parsePackageVersion(candidate: URL, readText: PackageVersionReader): string | null {\n try {\n const payload = JSON.parse(readText(candidate)) as { version?: unknown };\n return typeof payload.version === 'string' && payload.version.length > 0\n ? payload.version\n : null;\n } catch {\n return null;\n }\n}\n\nexport function loadCliPackageVersion(\n importMetaUrl: string = import.meta.url,\n readText: PackageVersionReader = (url) => readFileSync(url, 'utf8'),\n): string {\n for (const relativePath of PACKAGE_JSON_CANDIDATES) {\n const version = parsePackageVersion(new URL(relativePath, importMetaUrl), readText);\n if (version) {\n return version;\n }\n }\n\n throw new Error('Could not resolve CLI package version from package.json.');\n}\n"]}
|