@tiangong-lca/cli 0.0.32 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +33 -12
- package/assets/import-smoke/simapro.csv +20 -0
- package/bin/tiangong-lca.js +1 -1
- package/dist/src/cli.js +103 -65
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-bilingual.js.map +1 -1
- package/dist/src/lib/dataset-classification.js.map +1 -1
- package/dist/src/lib/dataset-contract.js.map +1 -1
- package/dist/src/lib/dataset-evidence-search.js.map +1 -1
- package/dist/src/lib/dataset-import-lca.js +302 -131
- package/dist/src/lib/dataset-import-lca.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-apply.js +916 -43
- package/dist/src/lib/dataset-maintenance-apply.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-clear-account.js +10 -4
- package/dist/src/lib/dataset-maintenance-clear-account.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-contract.js +1 -6
- package/dist/src/lib/dataset-maintenance-contract.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-derivatives.js +0 -1
- package/dist/src/lib/dataset-maintenance-derivatives.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-flow-identity-capture.js +1 -0
- package/dist/src/lib/dataset-maintenance-flow-identity-capture.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-pagination.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-protected-before.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-protected-contract.js +0 -1
- package/dist/src/lib/dataset-maintenance-protected-contract.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-protected-freeze.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-protected-preparation.js +0 -2
- package/dist/src/lib/dataset-maintenance-protected-preparation.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-protected-seal.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-protected-verify.js +0 -3
- package/dist/src/lib/dataset-maintenance-protected-verify.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-remote.js +68 -12
- package/dist/src/lib/dataset-maintenance-remote.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-verify.js +1 -2
- package/dist/src/lib/dataset-maintenance-verify.js.map +1 -1
- package/dist/src/lib/dataset-remote-refresh.js.map +1 -1
- package/dist/src/lib/dataset-remote-verify.js +2 -0
- package/dist/src/lib/dataset-remote-verify.js.map +1 -1
- package/dist/src/lib/dataset-save-draft-run.js +2 -0
- package/dist/src/lib/dataset-save-draft-run.js.map +1 -1
- package/dist/src/lib/flow-build-alias-map.js.map +1 -1
- package/dist/src/lib/flow-fetch-rows.js.map +1 -1
- package/dist/src/lib/flow-get.js.map +1 -1
- package/dist/src/lib/flow-governance.js.map +1 -1
- package/dist/src/lib/flow-list.js +1 -0
- package/dist/src/lib/flow-list.js.map +1 -1
- package/dist/src/lib/flow-payload-validation.js.map +1 -1
- package/dist/src/lib/flow-publish-version.js +1 -0
- package/dist/src/lib/flow-publish-version.js.map +1 -1
- package/dist/src/lib/flow-read.js +1 -0
- package/dist/src/lib/flow-read.js.map +1 -1
- package/dist/src/lib/flow-regen-product.js.map +1 -1
- package/dist/src/lib/flow-remediate.js.map +1 -1
- package/dist/src/lib/identity-preflight.js +4 -10
- package/dist/src/lib/identity-preflight.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-bundle-save.js +1 -0
- package/dist/src/lib/lifecyclemodel-bundle-save.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-orchestrate.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-publish-resulting-process.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-resulting-process.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-save-draft-run.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-validate-build.js.map +1 -1
- package/dist/src/lib/package-version.js.map +1 -1
- package/dist/src/lib/process-auto-build.js.map +1 -1
- package/dist/src/lib/process-dedup-review.js +14 -7
- package/dist/src/lib/process-dedup-review.js.map +1 -1
- package/dist/src/lib/process-flow-build-plan.js +111 -30
- package/dist/src/lib/process-flow-build-plan.js.map +1 -1
- package/dist/src/lib/process-get.js +1 -0
- package/dist/src/lib/process-get.js.map +1 -1
- package/dist/src/lib/process-list.js +1 -0
- package/dist/src/lib/process-list.js.map +1 -1
- package/dist/src/lib/process-payload-validation.js.map +1 -1
- package/dist/src/lib/process-qa.js.map +1 -1
- package/dist/src/lib/process-refresh-references.js +15 -10
- package/dist/src/lib/process-refresh-references.js.map +1 -1
- package/dist/src/lib/process-save-draft.js +9 -3
- package/dist/src/lib/process-save-draft.js.map +1 -1
- package/dist/src/lib/process-scope-statistics.js +11 -4
- package/dist/src/lib/process-scope-statistics.js.map +1 -1
- package/dist/src/lib/process-verify-rows.js.map +1 -1
- package/dist/src/lib/publish.js.map +1 -1
- package/dist/src/lib/run.js.map +1 -1
- package/dist/src/lib/supabase-client.js +13 -1
- package/dist/src/lib/supabase-client.js.map +1 -1
- package/dist/src/lib/supabase-data-api-contract.js +328 -0
- package/dist/src/lib/supabase-data-api-contract.js.map +1 -0
- package/dist/src/lib/supabase-data-api-replay.js +69 -0
- package/dist/src/lib/supabase-data-api-replay.js.map +1 -0
- package/dist/src/lib/supabase-json-ordered-write.js +2 -0
- package/dist/src/lib/supabase-json-ordered-write.js.map +1 -1
- package/dist/src/lib/supabase-rest.js +1 -0
- package/dist/src/lib/supabase-rest.js.map +1 -1
- package/dist/src/lib/tidas-sdk-package-validator.js +5 -5
- package/dist/src/lib/tidas-sdk-package-validator.js.map +1 -1
- package/dist/src/lib/validation.js.map +1 -1
- package/dist/src/main.js.map +1 -1
- package/package.json +40 -40
- package/dist/scripts/assert-full-coverage.js +0 -77
- package/dist/scripts/assert-full-coverage.js.map +0 -1
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { CliError } from './errors.js';
|
|
2
|
+
import { DATA_API_RPC_REPLAY_CLASSIFICATION } from './supabase-data-api-replay.js';
|
|
3
|
+
export { DATA_API_RPC_REPLAY_CLASSIFICATION, isDataApiAuthRefreshReplaySafe, } from './supabase-data-api-replay.js';
|
|
4
|
+
export const DATA_API_PROFILE_ENV = 'TIANGONG_LCA_DATA_API_PROFILE';
|
|
5
|
+
export const DATA_API_PROFILES = ['api-contract-v1'];
|
|
6
|
+
export const CORE_PUBLIC_RELATIONS = [
|
|
7
|
+
'contacts',
|
|
8
|
+
'flowproperties',
|
|
9
|
+
'flows',
|
|
10
|
+
'ilcd',
|
|
11
|
+
'lciamethods',
|
|
12
|
+
'lifecyclemodels',
|
|
13
|
+
'processes',
|
|
14
|
+
'sources',
|
|
15
|
+
'unitgroups',
|
|
16
|
+
];
|
|
17
|
+
export const DATA_API_RELATION_CONSUMERS = {
|
|
18
|
+
contacts: [
|
|
19
|
+
'src/lib/dataset-save-draft-run.ts',
|
|
20
|
+
'src/lib/dataset-remote-verify.ts',
|
|
21
|
+
'src/lib/dataset-maintenance-remote.ts',
|
|
22
|
+
'src/lib/process-refresh-references.ts',
|
|
23
|
+
'src/lib/dataset-maintenance-clear-account.ts',
|
|
24
|
+
],
|
|
25
|
+
flowproperties: [
|
|
26
|
+
'src/lib/dataset-save-draft-run.ts',
|
|
27
|
+
'src/lib/dataset-remote-verify.ts',
|
|
28
|
+
'src/lib/dataset-maintenance-remote.ts',
|
|
29
|
+
'src/lib/dataset-maintenance-flow-identity-capture.ts',
|
|
30
|
+
'src/lib/process-refresh-references.ts',
|
|
31
|
+
],
|
|
32
|
+
flows: [
|
|
33
|
+
'src/lib/flow-read.ts',
|
|
34
|
+
'src/lib/flow-list.ts',
|
|
35
|
+
'src/lib/flow-publish-version.ts',
|
|
36
|
+
'src/lib/dataset-save-draft-run.ts',
|
|
37
|
+
'src/lib/dataset-remote-verify.ts',
|
|
38
|
+
'src/lib/dataset-maintenance-remote.ts',
|
|
39
|
+
'src/lib/dataset-maintenance-flow-identity-capture.ts',
|
|
40
|
+
'src/lib/process-refresh-references.ts',
|
|
41
|
+
'src/lib/dataset-maintenance-clear-account.ts',
|
|
42
|
+
],
|
|
43
|
+
ilcd: [],
|
|
44
|
+
lciamethods: [
|
|
45
|
+
'src/lib/dataset-remote-verify.ts',
|
|
46
|
+
'src/lib/dataset-maintenance-remote.ts',
|
|
47
|
+
'src/lib/process-refresh-references.ts',
|
|
48
|
+
],
|
|
49
|
+
lifecyclemodels: [
|
|
50
|
+
'src/lib/lifecyclemodel-bundle-save.ts',
|
|
51
|
+
'src/lib/process-dedup-review.ts',
|
|
52
|
+
'src/lib/dataset-remote-verify.ts',
|
|
53
|
+
'src/lib/dataset-maintenance-remote.ts',
|
|
54
|
+
'src/lib/supabase-json-ordered-write.ts',
|
|
55
|
+
'src/lib/dataset-maintenance-clear-account.ts',
|
|
56
|
+
],
|
|
57
|
+
processes: [
|
|
58
|
+
'src/lib/process-get.ts',
|
|
59
|
+
'src/lib/process-list.ts',
|
|
60
|
+
'src/lib/process-save-draft.ts',
|
|
61
|
+
'src/lib/process-scope-statistics.ts',
|
|
62
|
+
'src/lib/process-dedup-review.ts',
|
|
63
|
+
'src/lib/process-refresh-references.ts',
|
|
64
|
+
'src/lib/dataset-save-draft-run.ts',
|
|
65
|
+
'src/lib/dataset-remote-verify.ts',
|
|
66
|
+
'src/lib/dataset-maintenance-remote.ts',
|
|
67
|
+
'src/lib/supabase-json-ordered-write.ts',
|
|
68
|
+
'src/lib/supabase-rest.ts',
|
|
69
|
+
'src/lib/dataset-maintenance-clear-account.ts',
|
|
70
|
+
],
|
|
71
|
+
sources: [
|
|
72
|
+
'src/lib/dataset-save-draft-run.ts',
|
|
73
|
+
'src/lib/dataset-remote-verify.ts',
|
|
74
|
+
'src/lib/dataset-maintenance-remote.ts',
|
|
75
|
+
'src/lib/supabase-json-ordered-write.ts',
|
|
76
|
+
'src/lib/process-refresh-references.ts',
|
|
77
|
+
'src/lib/dataset-maintenance-clear-account.ts',
|
|
78
|
+
],
|
|
79
|
+
unitgroups: [
|
|
80
|
+
'src/lib/dataset-save-draft-run.ts',
|
|
81
|
+
'src/lib/dataset-remote-verify.ts',
|
|
82
|
+
'src/lib/dataset-maintenance-remote.ts',
|
|
83
|
+
'src/lib/dataset-maintenance-flow-identity-capture.ts',
|
|
84
|
+
'src/lib/process-refresh-references.ts',
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
export const DATA_API_RPC_TARGETS = {
|
|
88
|
+
cmd_dataset_alias_execution_admit_guarded: {
|
|
89
|
+
targetSchema: 'api',
|
|
90
|
+
signature: 'api.cmd_dataset_alias_execution_admit_guarded(p_request jsonb)',
|
|
91
|
+
},
|
|
92
|
+
cmd_dataset_alias_execution_gate_guarded: {
|
|
93
|
+
targetSchema: 'api',
|
|
94
|
+
signature: 'api.cmd_dataset_alias_execution_gate_guarded(p_request_id uuid, p_preflight_token text, p_gate_name text)',
|
|
95
|
+
},
|
|
96
|
+
cmd_dataset_alias_execution_preflight_guarded: {
|
|
97
|
+
targetSchema: 'api',
|
|
98
|
+
signature: 'api.cmd_dataset_alias_execution_preflight_guarded(p_request jsonb)',
|
|
99
|
+
},
|
|
100
|
+
cmd_dataset_alias_execution_read: {
|
|
101
|
+
targetSchema: 'api',
|
|
102
|
+
signature: 'api.cmd_dataset_alias_execution_read(p_request_id uuid)',
|
|
103
|
+
},
|
|
104
|
+
cmd_dataset_delete: {
|
|
105
|
+
targetSchema: 'api',
|
|
106
|
+
signature: 'api.cmd_dataset_delete(p_table text, p_id uuid, p_version text, p_audit jsonb)',
|
|
107
|
+
},
|
|
108
|
+
cmd_dataset_derivative_rebuild_plan_guarded: {
|
|
109
|
+
targetSchema: 'api',
|
|
110
|
+
signature: 'api.cmd_dataset_derivative_rebuild_plan_guarded(p_plan jsonb)',
|
|
111
|
+
},
|
|
112
|
+
cmd_dataset_derivative_rebuild_read: {
|
|
113
|
+
targetSchema: 'api',
|
|
114
|
+
signature: 'api.cmd_dataset_derivative_rebuild_read(p_request_id uuid)',
|
|
115
|
+
},
|
|
116
|
+
cmd_dataset_derivative_rebuild_snapshot: {
|
|
117
|
+
targetSchema: 'api',
|
|
118
|
+
signature: 'api.cmd_dataset_derivative_rebuild_snapshot(p_table text, p_id uuid, p_version text)',
|
|
119
|
+
},
|
|
120
|
+
cmd_dataset_flow_identity_capture_attest_guarded: {
|
|
121
|
+
targetSchema: 'api',
|
|
122
|
+
signature: 'api.cmd_dataset_flow_identity_capture_attest_guarded(p_request jsonb)',
|
|
123
|
+
},
|
|
124
|
+
cmd_dataset_flow_identity_process_rewrite_guarded: {
|
|
125
|
+
targetSchema: 'api',
|
|
126
|
+
signature: 'api.cmd_dataset_flow_identity_process_rewrite_guarded(p_scope_id uuid, p_request jsonb, p_authorization jsonb)',
|
|
127
|
+
},
|
|
128
|
+
cmd_dataset_flow_identity_scope_finalize_guarded: {
|
|
129
|
+
targetSchema: 'api',
|
|
130
|
+
signature: 'api.cmd_dataset_flow_identity_scope_finalize_guarded(p_scope_id uuid, p_request jsonb, p_authorization jsonb)',
|
|
131
|
+
},
|
|
132
|
+
cmd_dataset_flow_identity_scope_lookup: {
|
|
133
|
+
targetSchema: 'api',
|
|
134
|
+
signature: 'api.cmd_dataset_flow_identity_scope_lookup(p_request jsonb)',
|
|
135
|
+
},
|
|
136
|
+
cmd_dataset_flow_identity_scope_preflight_guarded: {
|
|
137
|
+
targetSchema: 'api',
|
|
138
|
+
signature: 'api.cmd_dataset_flow_identity_scope_preflight_guarded(p_request jsonb)',
|
|
139
|
+
},
|
|
140
|
+
cmd_dataset_flow_identity_scope_read: {
|
|
141
|
+
targetSchema: 'api',
|
|
142
|
+
signature: 'api.cmd_dataset_flow_identity_scope_read(p_scope_id uuid)',
|
|
143
|
+
},
|
|
144
|
+
cmd_dataset_flow_identity_scope_recover_guarded: {
|
|
145
|
+
targetSchema: 'api',
|
|
146
|
+
signature: 'api.cmd_dataset_flow_identity_scope_recover_guarded(p_scope_id uuid, p_request jsonb)',
|
|
147
|
+
},
|
|
148
|
+
cmd_dataset_save_draft: {
|
|
149
|
+
targetSchema: 'api',
|
|
150
|
+
signature: 'api.cmd_dataset_save_draft(p_table text, p_id uuid, p_version text, p_json_ordered jsonb, p_model_id uuid, p_rule_verification boolean, p_audit jsonb)',
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
export const DATA_API_CONTRACT = {
|
|
154
|
+
schemaVersion: 'tiangong-lca-cli.data-api-contract.v1',
|
|
155
|
+
databaseContract: {
|
|
156
|
+
repository: 'tiangong-lca/database-engine',
|
|
157
|
+
databaseCommit: '0a97cc761f8127ca379ab7d4df4395dab255707a',
|
|
158
|
+
migrationHead: '20260807103000',
|
|
159
|
+
migrationSetGitTreeSha: '116c1f08b5490eec630f997403b07c3fcb830a69',
|
|
160
|
+
contractMigrations: {
|
|
161
|
+
fullSchemaCutover: {
|
|
162
|
+
path: 'supabase/migrations/20260805130000_full_schema_cutover.sql',
|
|
163
|
+
sha256: 'd409022fb25d9313d17b0f76216ca6e4abbfce7d6c5b6e74c869314d1c7e5afb',
|
|
164
|
+
},
|
|
165
|
+
apiContractClosure: {
|
|
166
|
+
path: 'supabase/migrations/20260806160000_api_contract_closure.sql',
|
|
167
|
+
sha256: 'e0e7aec8e03d70c60ee0d5c2b332ce73fa7b4b229725c9a9fcb0e1a1d7e8c511',
|
|
168
|
+
},
|
|
169
|
+
migrationHead: {
|
|
170
|
+
path: 'supabase/migrations/20260807103000_data_product_consumer_facades.sql',
|
|
171
|
+
sha256: 'd7fe990d487a75a8aecced5af580d27f176e74ac00f18e7fa6e6d88733152646',
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
contractReady: true,
|
|
175
|
+
snapshotRole: 'frozen-post-cutover-api-contract',
|
|
176
|
+
provenanceIssue: 'tiangong-lca/database-engine#422',
|
|
177
|
+
publicCoreTableCount: 9,
|
|
178
|
+
publicRoutineCount: 0,
|
|
179
|
+
},
|
|
180
|
+
profiles: {
|
|
181
|
+
'api-contract-v1': {
|
|
182
|
+
phase: 'contract',
|
|
183
|
+
description: 'Frozen api RPC profile for database-engine migration head 20260807103000.',
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
corePublicRelations: CORE_PUBLIC_RELATIONS,
|
|
187
|
+
relationConsumers: DATA_API_RELATION_CONSUMERS,
|
|
188
|
+
views: [],
|
|
189
|
+
rpcs: DATA_API_RPC_TARGETS,
|
|
190
|
+
rpcReplayClassification: DATA_API_RPC_REPLAY_CLASSIFICATION,
|
|
191
|
+
cliRolePolicy: {
|
|
192
|
+
anon: 'deny',
|
|
193
|
+
authenticated: 'allow',
|
|
194
|
+
service_role: 'deny',
|
|
195
|
+
},
|
|
196
|
+
retryPolicy: {
|
|
197
|
+
reads: 'GET/HEAD and manifest-classified read RPCs permit one auth-refresh replay only after 401/403',
|
|
198
|
+
mutations: 'no automatic transport retry; recovery must use the capability idempotency/read path',
|
|
199
|
+
},
|
|
200
|
+
retiredCapabilities: [
|
|
201
|
+
{
|
|
202
|
+
capability: 'rpc:cmd_dataset_alias_plan_guarded',
|
|
203
|
+
targetSchema: 'private',
|
|
204
|
+
reason: 'The whole-plan executor is private. Authenticated CLI execution uses the frozen alias execution preflight/gate/admit/read api capabilities.',
|
|
205
|
+
},
|
|
206
|
+
],
|
|
207
|
+
blockers: [],
|
|
208
|
+
};
|
|
209
|
+
function isCorePublicRelation(value) {
|
|
210
|
+
return CORE_PUBLIC_RELATIONS.includes(value);
|
|
211
|
+
}
|
|
212
|
+
function isDataApiRpc(value) {
|
|
213
|
+
return Object.hasOwn(DATA_API_RPC_TARGETS, value);
|
|
214
|
+
}
|
|
215
|
+
export function resolveDataApiProfile(env = process.env) {
|
|
216
|
+
const value = env[DATA_API_PROFILE_ENV]?.trim() || 'api-contract-v1';
|
|
217
|
+
if (DATA_API_PROFILES.includes(value)) {
|
|
218
|
+
return value;
|
|
219
|
+
}
|
|
220
|
+
throw new CliError(`Unsupported ${DATA_API_PROFILE_ENV}: ${value}`, {
|
|
221
|
+
code: 'DATA_API_PROFILE_INVALID',
|
|
222
|
+
exitCode: 2,
|
|
223
|
+
details: { supported: DATA_API_PROFILES },
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
function assertCliRole(role) {
|
|
227
|
+
if (role !== 'authenticated') {
|
|
228
|
+
throw new CliError(`The CLI Data API adapter does not accept the ${role} role.`, {
|
|
229
|
+
code: 'DATA_API_ROLE_FORBIDDEN',
|
|
230
|
+
exitCode: 2,
|
|
231
|
+
details: { role, allowed_roles: ['authenticated'] },
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
export function resolveDataApiCapability(options) {
|
|
236
|
+
const profile = options.profile ?? resolveDataApiProfile(options.env);
|
|
237
|
+
const role = options.role ?? 'authenticated';
|
|
238
|
+
assertCliRole(role);
|
|
239
|
+
if (options.kind === 'relation') {
|
|
240
|
+
if (!isCorePublicRelation(options.name)) {
|
|
241
|
+
throw new CliError(`Unmanifested Data API relation: ${options.name}`, {
|
|
242
|
+
code: 'DATA_API_CAPABILITY_UNMANIFESTED',
|
|
243
|
+
exitCode: 2,
|
|
244
|
+
details: { kind: options.kind, name: options.name },
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
kind: 'relation',
|
|
249
|
+
name: options.name,
|
|
250
|
+
schema: 'public',
|
|
251
|
+
profile,
|
|
252
|
+
role,
|
|
253
|
+
signature: null,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
if (!isDataApiRpc(options.name)) {
|
|
257
|
+
throw new CliError(`Unmanifested Data API RPC: ${options.name}`, {
|
|
258
|
+
code: 'DATA_API_CAPABILITY_UNMANIFESTED',
|
|
259
|
+
exitCode: 2,
|
|
260
|
+
details: { kind: options.kind, name: options.name },
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
const target = DATA_API_RPC_TARGETS[options.name];
|
|
264
|
+
return {
|
|
265
|
+
kind: 'rpc',
|
|
266
|
+
name: options.name,
|
|
267
|
+
schema: 'api',
|
|
268
|
+
profile,
|
|
269
|
+
role,
|
|
270
|
+
signature: target.signature,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
export function applyDataApiProfileHeaders(headers, capability, method = 'GET') {
|
|
274
|
+
const resolved = new Headers(headers);
|
|
275
|
+
const normalizedMethod = method.toUpperCase();
|
|
276
|
+
if (normalizedMethod === 'GET' || normalizedMethod === 'HEAD') {
|
|
277
|
+
resolved.set('Accept-Profile', capability.schema);
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
resolved.set('Content-Profile', capability.schema);
|
|
281
|
+
}
|
|
282
|
+
return Object.fromEntries(resolved.entries());
|
|
283
|
+
}
|
|
284
|
+
export function resolveDataApiCapabilityFromUrl(options) {
|
|
285
|
+
const parsed = new URL(options.url);
|
|
286
|
+
const marker = '/rest/v1/';
|
|
287
|
+
const markerIndex = parsed.pathname.indexOf(marker);
|
|
288
|
+
if (markerIndex < 0) {
|
|
289
|
+
throw new CliError(`URL is not a Supabase Data API route: ${options.url}`, {
|
|
290
|
+
code: 'DATA_API_URL_INVALID',
|
|
291
|
+
exitCode: 2,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
const segments = parsed.pathname
|
|
295
|
+
.slice(markerIndex + marker.length)
|
|
296
|
+
.split('/')
|
|
297
|
+
.filter(Boolean);
|
|
298
|
+
if (segments[0] === 'rpc' && segments[1]) {
|
|
299
|
+
return resolveDataApiCapability({
|
|
300
|
+
kind: 'rpc',
|
|
301
|
+
name: segments[1],
|
|
302
|
+
env: options.env,
|
|
303
|
+
profile: options.profile,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
if (segments[0]) {
|
|
307
|
+
return resolveDataApiCapability({
|
|
308
|
+
kind: 'relation',
|
|
309
|
+
name: segments[0],
|
|
310
|
+
env: options.env,
|
|
311
|
+
profile: options.profile,
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
throw new CliError(`Data API URL has no relation or RPC name: ${options.url}`, {
|
|
315
|
+
code: 'DATA_API_URL_INVALID',
|
|
316
|
+
exitCode: 2,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
export function isDataApiUrl(url) {
|
|
320
|
+
return new URL(url).pathname.includes('/rest/v1/');
|
|
321
|
+
}
|
|
322
|
+
export function buildDataApiUrl(restBaseUrl, capability) {
|
|
323
|
+
const base = restBaseUrl.replace(/\/+$/u, '');
|
|
324
|
+
return capability.kind === 'rpc'
|
|
325
|
+
? `${base}/rpc/${capability.name}`
|
|
326
|
+
: `${base}/${capability.name}`;
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=supabase-data-api-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-data-api-contract.js","sourceRoot":"","sources":["../../../src/lib/supabase-data-api-contract.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport { DATA_API_RPC_REPLAY_CLASSIFICATION } from './supabase-data-api-replay.js';\nexport {\n DATA_API_RPC_REPLAY_CLASSIFICATION,\n isDataApiAuthRefreshReplaySafe,\n} from './supabase-data-api-replay.js';\n\nexport const DATA_API_PROFILE_ENV = 'TIANGONG_LCA_DATA_API_PROFILE';\nexport const DATA_API_PROFILES = ['api-contract-v1'] as const;\nexport type DataApiProfile = (typeof DATA_API_PROFILES)[number];\nexport type DataApiRole = 'anon' | 'authenticated' | 'service_role';\n\nexport const CORE_PUBLIC_RELATIONS = [\n 'contacts',\n 'flowproperties',\n 'flows',\n 'ilcd',\n 'lciamethods',\n 'lifecyclemodels',\n 'processes',\n 'sources',\n 'unitgroups',\n] as const;\nexport type CorePublicRelation = (typeof CORE_PUBLIC_RELATIONS)[number];\n\nexport const DATA_API_RELATION_CONSUMERS = {\n contacts: [\n 'src/lib/dataset-save-draft-run.ts',\n 'src/lib/dataset-remote-verify.ts',\n 'src/lib/dataset-maintenance-remote.ts',\n 'src/lib/process-refresh-references.ts',\n 'src/lib/dataset-maintenance-clear-account.ts',\n ],\n flowproperties: [\n 'src/lib/dataset-save-draft-run.ts',\n 'src/lib/dataset-remote-verify.ts',\n 'src/lib/dataset-maintenance-remote.ts',\n 'src/lib/dataset-maintenance-flow-identity-capture.ts',\n 'src/lib/process-refresh-references.ts',\n ],\n flows: [\n 'src/lib/flow-read.ts',\n 'src/lib/flow-list.ts',\n 'src/lib/flow-publish-version.ts',\n 'src/lib/dataset-save-draft-run.ts',\n 'src/lib/dataset-remote-verify.ts',\n 'src/lib/dataset-maintenance-remote.ts',\n 'src/lib/dataset-maintenance-flow-identity-capture.ts',\n 'src/lib/process-refresh-references.ts',\n 'src/lib/dataset-maintenance-clear-account.ts',\n ],\n ilcd: [],\n lciamethods: [\n 'src/lib/dataset-remote-verify.ts',\n 'src/lib/dataset-maintenance-remote.ts',\n 'src/lib/process-refresh-references.ts',\n ],\n lifecyclemodels: [\n 'src/lib/lifecyclemodel-bundle-save.ts',\n 'src/lib/process-dedup-review.ts',\n 'src/lib/dataset-remote-verify.ts',\n 'src/lib/dataset-maintenance-remote.ts',\n 'src/lib/supabase-json-ordered-write.ts',\n 'src/lib/dataset-maintenance-clear-account.ts',\n ],\n processes: [\n 'src/lib/process-get.ts',\n 'src/lib/process-list.ts',\n 'src/lib/process-save-draft.ts',\n 'src/lib/process-scope-statistics.ts',\n 'src/lib/process-dedup-review.ts',\n 'src/lib/process-refresh-references.ts',\n 'src/lib/dataset-save-draft-run.ts',\n 'src/lib/dataset-remote-verify.ts',\n 'src/lib/dataset-maintenance-remote.ts',\n 'src/lib/supabase-json-ordered-write.ts',\n 'src/lib/supabase-rest.ts',\n 'src/lib/dataset-maintenance-clear-account.ts',\n ],\n sources: [\n 'src/lib/dataset-save-draft-run.ts',\n 'src/lib/dataset-remote-verify.ts',\n 'src/lib/dataset-maintenance-remote.ts',\n 'src/lib/supabase-json-ordered-write.ts',\n 'src/lib/process-refresh-references.ts',\n 'src/lib/dataset-maintenance-clear-account.ts',\n ],\n unitgroups: [\n 'src/lib/dataset-save-draft-run.ts',\n 'src/lib/dataset-remote-verify.ts',\n 'src/lib/dataset-maintenance-remote.ts',\n 'src/lib/dataset-maintenance-flow-identity-capture.ts',\n 'src/lib/process-refresh-references.ts',\n ],\n} as const satisfies Record<CorePublicRelation, readonly string[]>;\n\ntype RpcTarget = {\n targetSchema: 'api';\n signature: string;\n};\n\nexport const DATA_API_RPC_TARGETS = {\n cmd_dataset_alias_execution_admit_guarded: {\n targetSchema: 'api',\n signature: 'api.cmd_dataset_alias_execution_admit_guarded(p_request jsonb)',\n },\n cmd_dataset_alias_execution_gate_guarded: {\n targetSchema: 'api',\n signature:\n 'api.cmd_dataset_alias_execution_gate_guarded(p_request_id uuid, p_preflight_token text, p_gate_name text)',\n },\n cmd_dataset_alias_execution_preflight_guarded: {\n targetSchema: 'api',\n signature: 'api.cmd_dataset_alias_execution_preflight_guarded(p_request jsonb)',\n },\n cmd_dataset_alias_execution_read: {\n targetSchema: 'api',\n signature: 'api.cmd_dataset_alias_execution_read(p_request_id uuid)',\n },\n cmd_dataset_delete: {\n targetSchema: 'api',\n signature: 'api.cmd_dataset_delete(p_table text, p_id uuid, p_version text, p_audit jsonb)',\n },\n cmd_dataset_derivative_rebuild_plan_guarded: {\n targetSchema: 'api',\n signature: 'api.cmd_dataset_derivative_rebuild_plan_guarded(p_plan jsonb)',\n },\n cmd_dataset_derivative_rebuild_read: {\n targetSchema: 'api',\n signature: 'api.cmd_dataset_derivative_rebuild_read(p_request_id uuid)',\n },\n cmd_dataset_derivative_rebuild_snapshot: {\n targetSchema: 'api',\n signature:\n 'api.cmd_dataset_derivative_rebuild_snapshot(p_table text, p_id uuid, p_version text)',\n },\n cmd_dataset_flow_identity_capture_attest_guarded: {\n targetSchema: 'api',\n signature: 'api.cmd_dataset_flow_identity_capture_attest_guarded(p_request jsonb)',\n },\n cmd_dataset_flow_identity_process_rewrite_guarded: {\n targetSchema: 'api',\n signature:\n 'api.cmd_dataset_flow_identity_process_rewrite_guarded(p_scope_id uuid, p_request jsonb, p_authorization jsonb)',\n },\n cmd_dataset_flow_identity_scope_finalize_guarded: {\n targetSchema: 'api',\n signature:\n 'api.cmd_dataset_flow_identity_scope_finalize_guarded(p_scope_id uuid, p_request jsonb, p_authorization jsonb)',\n },\n cmd_dataset_flow_identity_scope_lookup: {\n targetSchema: 'api',\n signature: 'api.cmd_dataset_flow_identity_scope_lookup(p_request jsonb)',\n },\n cmd_dataset_flow_identity_scope_preflight_guarded: {\n targetSchema: 'api',\n signature: 'api.cmd_dataset_flow_identity_scope_preflight_guarded(p_request jsonb)',\n },\n cmd_dataset_flow_identity_scope_read: {\n targetSchema: 'api',\n signature: 'api.cmd_dataset_flow_identity_scope_read(p_scope_id uuid)',\n },\n cmd_dataset_flow_identity_scope_recover_guarded: {\n targetSchema: 'api',\n signature:\n 'api.cmd_dataset_flow_identity_scope_recover_guarded(p_scope_id uuid, p_request jsonb)',\n },\n cmd_dataset_save_draft: {\n targetSchema: 'api',\n signature:\n 'api.cmd_dataset_save_draft(p_table text, p_id uuid, p_version text, p_json_ordered jsonb, p_model_id uuid, p_rule_verification boolean, p_audit jsonb)',\n },\n} as const satisfies Record<string, RpcTarget>;\n\nexport type DataApiRpc = keyof typeof DATA_API_RPC_TARGETS;\n\nexport const DATA_API_CONTRACT = {\n schemaVersion: 'tiangong-lca-cli.data-api-contract.v1',\n databaseContract: {\n repository: 'tiangong-lca/database-engine',\n databaseCommit: '0a97cc761f8127ca379ab7d4df4395dab255707a',\n migrationHead: '20260807103000',\n migrationSetGitTreeSha: '116c1f08b5490eec630f997403b07c3fcb830a69',\n contractMigrations: {\n fullSchemaCutover: {\n path: 'supabase/migrations/20260805130000_full_schema_cutover.sql',\n sha256: 'd409022fb25d9313d17b0f76216ca6e4abbfce7d6c5b6e74c869314d1c7e5afb',\n },\n apiContractClosure: {\n path: 'supabase/migrations/20260806160000_api_contract_closure.sql',\n sha256: 'e0e7aec8e03d70c60ee0d5c2b332ce73fa7b4b229725c9a9fcb0e1a1d7e8c511',\n },\n migrationHead: {\n path: 'supabase/migrations/20260807103000_data_product_consumer_facades.sql',\n sha256: 'd7fe990d487a75a8aecced5af580d27f176e74ac00f18e7fa6e6d88733152646',\n },\n },\n contractReady: true,\n snapshotRole: 'frozen-post-cutover-api-contract',\n provenanceIssue: 'tiangong-lca/database-engine#422',\n publicCoreTableCount: 9,\n publicRoutineCount: 0,\n },\n profiles: {\n 'api-contract-v1': {\n phase: 'contract',\n description: 'Frozen api RPC profile for database-engine migration head 20260807103000.',\n },\n },\n corePublicRelations: CORE_PUBLIC_RELATIONS,\n relationConsumers: DATA_API_RELATION_CONSUMERS,\n views: [],\n rpcs: DATA_API_RPC_TARGETS,\n rpcReplayClassification: DATA_API_RPC_REPLAY_CLASSIFICATION,\n cliRolePolicy: {\n anon: 'deny',\n authenticated: 'allow',\n service_role: 'deny',\n },\n retryPolicy: {\n reads:\n 'GET/HEAD and manifest-classified read RPCs permit one auth-refresh replay only after 401/403',\n mutations:\n 'no automatic transport retry; recovery must use the capability idempotency/read path',\n },\n retiredCapabilities: [\n {\n capability: 'rpc:cmd_dataset_alias_plan_guarded',\n targetSchema: 'private',\n reason:\n 'The whole-plan executor is private. Authenticated CLI execution uses the frozen alias execution preflight/gate/admit/read api capabilities.',\n },\n ],\n blockers: [],\n} as const;\n\nexport type ResolvedDataApiCapability = {\n kind: 'relation' | 'rpc';\n name: string;\n schema: 'public' | 'api';\n profile: DataApiProfile;\n role: DataApiRole;\n signature: string | null;\n};\n\nfunction isCorePublicRelation(value: string): value is CorePublicRelation {\n return (CORE_PUBLIC_RELATIONS as readonly string[]).includes(value);\n}\n\nfunction isDataApiRpc(value: string): value is DataApiRpc {\n return Object.hasOwn(DATA_API_RPC_TARGETS, value);\n}\n\nexport function resolveDataApiProfile(env: NodeJS.ProcessEnv = process.env): DataApiProfile {\n const value = env[DATA_API_PROFILE_ENV]?.trim() || 'api-contract-v1';\n if ((DATA_API_PROFILES as readonly string[]).includes(value)) {\n return value as DataApiProfile;\n }\n throw new CliError(`Unsupported ${DATA_API_PROFILE_ENV}: ${value}`, {\n code: 'DATA_API_PROFILE_INVALID',\n exitCode: 2,\n details: { supported: DATA_API_PROFILES },\n });\n}\n\nfunction assertCliRole(role: DataApiRole): void {\n if (role !== 'authenticated') {\n throw new CliError(`The CLI Data API adapter does not accept the ${role} role.`, {\n code: 'DATA_API_ROLE_FORBIDDEN',\n exitCode: 2,\n details: { role, allowed_roles: ['authenticated'] },\n });\n }\n}\n\nexport function resolveDataApiCapability(options: {\n kind: 'relation' | 'rpc';\n name: string;\n env?: NodeJS.ProcessEnv;\n profile?: DataApiProfile;\n role?: DataApiRole;\n}): ResolvedDataApiCapability {\n const profile = options.profile ?? resolveDataApiProfile(options.env);\n const role = options.role ?? 'authenticated';\n assertCliRole(role);\n\n if (options.kind === 'relation') {\n if (!isCorePublicRelation(options.name)) {\n throw new CliError(`Unmanifested Data API relation: ${options.name}`, {\n code: 'DATA_API_CAPABILITY_UNMANIFESTED',\n exitCode: 2,\n details: { kind: options.kind, name: options.name },\n });\n }\n return {\n kind: 'relation',\n name: options.name,\n schema: 'public',\n profile,\n role,\n signature: null,\n };\n }\n\n if (!isDataApiRpc(options.name)) {\n throw new CliError(`Unmanifested Data API RPC: ${options.name}`, {\n code: 'DATA_API_CAPABILITY_UNMANIFESTED',\n exitCode: 2,\n details: { kind: options.kind, name: options.name },\n });\n }\n const target = DATA_API_RPC_TARGETS[options.name];\n return {\n kind: 'rpc',\n name: options.name,\n schema: 'api',\n profile,\n role,\n signature: target.signature,\n };\n}\n\nexport function applyDataApiProfileHeaders(\n headers: HeadersInit | undefined,\n capability: ResolvedDataApiCapability,\n method = 'GET',\n): Record<string, string> {\n const resolved = new Headers(headers);\n const normalizedMethod = method.toUpperCase();\n if (normalizedMethod === 'GET' || normalizedMethod === 'HEAD') {\n resolved.set('Accept-Profile', capability.schema);\n } else {\n resolved.set('Content-Profile', capability.schema);\n }\n return Object.fromEntries(resolved.entries());\n}\n\nexport function resolveDataApiCapabilityFromUrl(options: {\n url: string;\n method?: string;\n env?: NodeJS.ProcessEnv;\n profile?: DataApiProfile;\n}): ResolvedDataApiCapability {\n const parsed = new URL(options.url);\n const marker = '/rest/v1/';\n const markerIndex = parsed.pathname.indexOf(marker);\n if (markerIndex < 0) {\n throw new CliError(`URL is not a Supabase Data API route: ${options.url}`, {\n code: 'DATA_API_URL_INVALID',\n exitCode: 2,\n });\n }\n const segments = parsed.pathname\n .slice(markerIndex + marker.length)\n .split('/')\n .filter(Boolean);\n if (segments[0] === 'rpc' && segments[1]) {\n return resolveDataApiCapability({\n kind: 'rpc',\n name: segments[1],\n env: options.env,\n profile: options.profile,\n });\n }\n if (segments[0]) {\n return resolveDataApiCapability({\n kind: 'relation',\n name: segments[0],\n env: options.env,\n profile: options.profile,\n });\n }\n throw new CliError(`Data API URL has no relation or RPC name: ${options.url}`, {\n code: 'DATA_API_URL_INVALID',\n exitCode: 2,\n });\n}\n\nexport function isDataApiUrl(url: string): boolean {\n return new URL(url).pathname.includes('/rest/v1/');\n}\n\nexport function buildDataApiUrl(\n restBaseUrl: string,\n capability: Pick<ResolvedDataApiCapability, 'kind' | 'name'>,\n): string {\n const base = restBaseUrl.replace(/\\/+$/u, '');\n return capability.kind === 'rpc'\n ? `${base}/rpc/${capability.name}`\n : `${base}/${capability.name}`;\n}\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export const DATA_API_RPC_REPLAY_CLASSIFICATION = {
|
|
2
|
+
cmd_dataset_alias_execution_admit_guarded: { operation: 'mutation', authRefreshReplay: 'never' },
|
|
3
|
+
cmd_dataset_alias_execution_gate_guarded: { operation: 'mutation', authRefreshReplay: 'never' },
|
|
4
|
+
cmd_dataset_alias_execution_preflight_guarded: {
|
|
5
|
+
operation: 'mutation',
|
|
6
|
+
authRefreshReplay: 'never',
|
|
7
|
+
},
|
|
8
|
+
cmd_dataset_alias_execution_read: {
|
|
9
|
+
operation: 'read',
|
|
10
|
+
authRefreshReplay: 'once-after-401-403',
|
|
11
|
+
},
|
|
12
|
+
cmd_dataset_delete: { operation: 'mutation', authRefreshReplay: 'never' },
|
|
13
|
+
cmd_dataset_derivative_rebuild_plan_guarded: {
|
|
14
|
+
operation: 'mutation',
|
|
15
|
+
authRefreshReplay: 'never',
|
|
16
|
+
},
|
|
17
|
+
cmd_dataset_derivative_rebuild_read: {
|
|
18
|
+
operation: 'read',
|
|
19
|
+
authRefreshReplay: 'once-after-401-403',
|
|
20
|
+
},
|
|
21
|
+
cmd_dataset_derivative_rebuild_snapshot: {
|
|
22
|
+
operation: 'read',
|
|
23
|
+
authRefreshReplay: 'once-after-401-403',
|
|
24
|
+
},
|
|
25
|
+
cmd_dataset_flow_identity_capture_attest_guarded: {
|
|
26
|
+
operation: 'mutation',
|
|
27
|
+
authRefreshReplay: 'never',
|
|
28
|
+
},
|
|
29
|
+
cmd_dataset_flow_identity_process_rewrite_guarded: {
|
|
30
|
+
operation: 'mutation',
|
|
31
|
+
authRefreshReplay: 'never',
|
|
32
|
+
},
|
|
33
|
+
cmd_dataset_flow_identity_scope_finalize_guarded: {
|
|
34
|
+
operation: 'mutation',
|
|
35
|
+
authRefreshReplay: 'never',
|
|
36
|
+
},
|
|
37
|
+
cmd_dataset_flow_identity_scope_lookup: {
|
|
38
|
+
operation: 'read',
|
|
39
|
+
authRefreshReplay: 'once-after-401-403',
|
|
40
|
+
},
|
|
41
|
+
cmd_dataset_flow_identity_scope_preflight_guarded: {
|
|
42
|
+
operation: 'mutation',
|
|
43
|
+
authRefreshReplay: 'never',
|
|
44
|
+
},
|
|
45
|
+
cmd_dataset_flow_identity_scope_read: {
|
|
46
|
+
operation: 'read',
|
|
47
|
+
authRefreshReplay: 'once-after-401-403',
|
|
48
|
+
},
|
|
49
|
+
cmd_dataset_flow_identity_scope_recover_guarded: {
|
|
50
|
+
operation: 'mutation',
|
|
51
|
+
authRefreshReplay: 'never',
|
|
52
|
+
},
|
|
53
|
+
cmd_dataset_save_draft: { operation: 'mutation', authRefreshReplay: 'never' },
|
|
54
|
+
};
|
|
55
|
+
export function isDataApiAuthRefreshReplaySafe(options) {
|
|
56
|
+
const method = options.method.toUpperCase();
|
|
57
|
+
if (method === 'GET' || method === 'HEAD')
|
|
58
|
+
return true;
|
|
59
|
+
if (method !== 'POST')
|
|
60
|
+
return false;
|
|
61
|
+
const parsed = new URL(options.url);
|
|
62
|
+
const match = parsed.pathname.match(/\/rest\/v1\/rpc\/([^/]+)\/?$/u);
|
|
63
|
+
const rpc = match?.[1];
|
|
64
|
+
if (!rpc || !Object.hasOwn(DATA_API_RPC_REPLAY_CLASSIFICATION, rpc))
|
|
65
|
+
return false;
|
|
66
|
+
const classification = DATA_API_RPC_REPLAY_CLASSIFICATION[rpc];
|
|
67
|
+
return (classification.operation === 'read' && classification.authRefreshReplay === 'once-after-401-403');
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=supabase-data-api-replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-data-api-replay.js","sourceRoot":"","sources":["../../../src/lib/supabase-data-api-replay.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,yCAAyC,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE;IAChG,wCAAwC,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE;IAC/F,6CAA6C,EAAE;QAC7C,SAAS,EAAE,UAAU;QACrB,iBAAiB,EAAE,OAAO;KAC3B;IACD,gCAAgC,EAAE;QAChC,SAAS,EAAE,MAAM;QACjB,iBAAiB,EAAE,oBAAoB;KACxC;IACD,kBAAkB,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE;IACzE,2CAA2C,EAAE;QAC3C,SAAS,EAAE,UAAU;QACrB,iBAAiB,EAAE,OAAO;KAC3B;IACD,mCAAmC,EAAE;QACnC,SAAS,EAAE,MAAM;QACjB,iBAAiB,EAAE,oBAAoB;KACxC;IACD,uCAAuC,EAAE;QACvC,SAAS,EAAE,MAAM;QACjB,iBAAiB,EAAE,oBAAoB;KACxC;IACD,gDAAgD,EAAE;QAChD,SAAS,EAAE,UAAU;QACrB,iBAAiB,EAAE,OAAO;KAC3B;IACD,iDAAiD,EAAE;QACjD,SAAS,EAAE,UAAU;QACrB,iBAAiB,EAAE,OAAO;KAC3B;IACD,gDAAgD,EAAE;QAChD,SAAS,EAAE,UAAU;QACrB,iBAAiB,EAAE,OAAO;KAC3B;IACD,sCAAsC,EAAE;QACtC,SAAS,EAAE,MAAM;QACjB,iBAAiB,EAAE,oBAAoB;KACxC;IACD,iDAAiD,EAAE;QACjD,SAAS,EAAE,UAAU;QACrB,iBAAiB,EAAE,OAAO;KAC3B;IACD,oCAAoC,EAAE;QACpC,SAAS,EAAE,MAAM;QACjB,iBAAiB,EAAE,oBAAoB;KACxC;IACD,+CAA+C,EAAE;QAC/C,SAAS,EAAE,UAAU;QACrB,iBAAiB,EAAE,OAAO;KAC3B;IACD,sBAAsB,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE;CACnB,CAAC;AAE7D,MAAM,UAAU,8BAA8B,CAAC,OAAwC;IACrF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAEpC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,kCAAkC,EAAE,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAClF,MAAM,cAAc,GAClB,kCAAkC,CAAC,GAAsD,CAAC,CAAC;IAC7F,OAAO,CACL,cAAc,CAAC,SAAS,KAAK,MAAM,IAAI,cAAc,CAAC,iBAAiB,KAAK,oBAAoB,CACjG,CAAC;AACJ,CAAC","sourcesContent":["export type RpcReplayClassification = {\n operation: 'read' | 'mutation';\n authRefreshReplay: 'once-after-401-403' | 'never';\n};\n\nexport const DATA_API_RPC_REPLAY_CLASSIFICATION = {\n cmd_dataset_alias_execution_admit_guarded: { operation: 'mutation', authRefreshReplay: 'never' },\n cmd_dataset_alias_execution_gate_guarded: { operation: 'mutation', authRefreshReplay: 'never' },\n cmd_dataset_alias_execution_preflight_guarded: {\n operation: 'mutation',\n authRefreshReplay: 'never',\n },\n cmd_dataset_alias_execution_read: {\n operation: 'read',\n authRefreshReplay: 'once-after-401-403',\n },\n cmd_dataset_delete: { operation: 'mutation', authRefreshReplay: 'never' },\n cmd_dataset_derivative_rebuild_plan_guarded: {\n operation: 'mutation',\n authRefreshReplay: 'never',\n },\n cmd_dataset_derivative_rebuild_read: {\n operation: 'read',\n authRefreshReplay: 'once-after-401-403',\n },\n cmd_dataset_derivative_rebuild_snapshot: {\n operation: 'read',\n authRefreshReplay: 'once-after-401-403',\n },\n cmd_dataset_flow_identity_capture_attest_guarded: {\n operation: 'mutation',\n authRefreshReplay: 'never',\n },\n cmd_dataset_flow_identity_process_rewrite_guarded: {\n operation: 'mutation',\n authRefreshReplay: 'never',\n },\n cmd_dataset_flow_identity_scope_finalize_guarded: {\n operation: 'mutation',\n authRefreshReplay: 'never',\n },\n cmd_dataset_flow_identity_scope_lookup: {\n operation: 'read',\n authRefreshReplay: 'once-after-401-403',\n },\n cmd_dataset_flow_identity_scope_preflight_guarded: {\n operation: 'mutation',\n authRefreshReplay: 'never',\n },\n cmd_dataset_flow_identity_scope_read: {\n operation: 'read',\n authRefreshReplay: 'once-after-401-403',\n },\n cmd_dataset_flow_identity_scope_recover_guarded: {\n operation: 'mutation',\n authRefreshReplay: 'never',\n },\n cmd_dataset_save_draft: { operation: 'mutation', authRefreshReplay: 'never' },\n} as const satisfies Record<string, RpcReplayClassification>;\n\nexport function isDataApiAuthRefreshReplaySafe(options: { url: string; method: string }): boolean {\n const method = options.method.toUpperCase();\n if (method === 'GET' || method === 'HEAD') return true;\n if (method !== 'POST') return false;\n\n const parsed = new URL(options.url);\n const match = parsed.pathname.match(/\\/rest\\/v1\\/rpc\\/([^/]+)\\/?$/u);\n const rpc = match?.[1];\n if (!rpc || !Object.hasOwn(DATA_API_RPC_REPLAY_CLASSIFICATION, rpc)) return false;\n const classification =\n DATA_API_RPC_REPLAY_CLASSIFICATION[rpc as keyof typeof DATA_API_RPC_REPLAY_CLASSIFICATION];\n return (\n classification.operation === 'read' && classification.authRefreshReplay === 'once-after-401-403'\n );\n}\n"]}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// data-api-relations: lifecyclemodels, processes, sources
|
|
2
|
+
// data-api-dynamic-relation-expression: options.table
|
|
1
3
|
import { CliError } from './errors.js';
|
|
2
4
|
import { buildDatasetCommandTransport, createDatasetRecord, saveDraftDatasetRecord, } from './dataset-command.js';
|
|
3
5
|
import { createSupabaseDataClient, requireSupabaseRestRuntime, runSupabaseArrayQuery, } from './supabase-client.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-json-ordered-write.js","sourceRoot":"","sources":["../../../src/lib/supabase-json-ordered-write.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport {\n buildDatasetCommandTransport,\n createDatasetRecord,\n saveDraftDatasetRecord,\n type DatasetCommandTransport,\n} from './dataset-command.js';\nimport type { FetchLike } from './http.js';\nimport {\n createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nexport type SupabaseJsonOrderedTable = 'lifecyclemodels' | 'processes' | 'sources';\nexport type SupabaseJsonOrderedWriteMode = 'upsert_current_version' | 'append_only_insert';\nexport type SupabaseJsonOrderedWriteOperation =\n | 'insert'\n | 'update_existing'\n | 'update_after_insert_error'\n | 'skipped_existing';\n\nexport type SupabaseJsonOrderedWriteResult = {\n status: 'success';\n operation: SupabaseJsonOrderedWriteOperation;\n};\n\ntype VisibleRow = {\n id: string;\n version: string;\n state_code: number | null;\n};\n\ntype SupabaseDataClient = ReturnType<typeof createSupabaseDataClient>['client'];\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 {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction buildSelectUrl(\n restBaseUrl: string,\n table: SupabaseJsonOrderedTable,\n id: string,\n version: string,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('select', 'id,version,state_code');\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction buildUpdateUrl(\n restBaseUrl: string,\n table: SupabaseJsonOrderedTable,\n id: string,\n version: string,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction parseVisibleRows(payload: unknown, url: string): VisibleRow[] {\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: trimToken(item.id),\n version: trimToken(item.version),\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n };\n });\n}\n\nasync function exactVisibleRows(options: {\n client: SupabaseDataClient;\n restBaseUrl: string;\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n}): Promise<VisibleRow[]> {\n const url = buildSelectUrl(options.restBaseUrl, options.table, options.id, options.version);\n const payload = await runSupabaseArrayQuery(\n options.client\n .from(options.table)\n .select('id,version,state_code')\n .eq('id', options.id)\n .eq('version', options.version),\n url,\n );\n return parseVisibleRows(payload, url);\n}\n\nasync function insertJsonOrderedRow(options: {\n transport: DatasetCommandTransport;\n table: SupabaseJsonOrderedTable;\n id: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<void> {\n await createDatasetRecord({\n transport: options.transport,\n table: options.table,\n id: options.id,\n payload: options.payload,\n extraData: options.extraData,\n });\n}\n\nasync function updateJsonOrderedRow(options: {\n transport: DatasetCommandTransport;\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<void> {\n await saveDraftDatasetRecord({\n transport: options.transport,\n table: options.table,\n id: options.id,\n version: options.version,\n payload: options.payload,\n extraData: options.extraData,\n });\n}\n\nfunction requireNonEmptyToken(value: string, label: string, code: string): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new CliError(`Missing required ${label}.`, {\n code,\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nexport function hasSupabaseRestRuntime(env: NodeJS.ProcessEnv | undefined): boolean {\n if (!env) {\n return false;\n }\n\n return Boolean(\n trimToken(env.TIANGONG_LCA_API_BASE_URL) &&\n trimToken(env.TIANGONG_LCA_API_KEY) &&\n trimToken(env.TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY),\n );\n}\n\nexport async function syncSupabaseJsonOrderedRecord(options: {\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n payload: JsonObject;\n writeMode: SupabaseJsonOrderedWriteMode;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs?: number;\n extraData?: JsonObject;\n}): Promise<SupabaseJsonOrderedWriteResult> {\n const id = requireNonEmptyToken(options.id, 'dataset id', 'SUPABASE_JSON_ORDERED_ID_REQUIRED');\n const version = requireNonEmptyToken(\n options.version,\n 'dataset version',\n 'SUPABASE_JSON_ORDERED_VERSION_REQUIRED',\n );\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env),\n fetchImpl: options.fetchImpl,\n timeoutMs,\n });\n const commandTransport = await buildDatasetCommandTransport({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n });\n const { client, restBaseUrl } = createSupabaseDataClient(runtime, options.fetchImpl, timeoutMs);\n\n const visibleBefore = await exactVisibleRows({\n client,\n restBaseUrl,\n table: options.table,\n id,\n version,\n });\n\n if (options.writeMode === 'append_only_insert' && visibleBefore.length > 0) {\n return {\n status: 'success',\n operation: 'skipped_existing',\n };\n }\n\n if (visibleBefore.length > 0) {\n await updateJsonOrderedRow({\n transport: commandTransport,\n table: options.table,\n id,\n version,\n payload: options.payload,\n extraData: options.extraData,\n });\n return {\n status: 'success',\n operation: 'update_existing',\n };\n }\n\n try {\n await insertJsonOrderedRow({\n transport: commandTransport,\n table: options.table,\n id,\n payload: options.payload,\n extraData: options.extraData,\n });\n return {\n status: 'success',\n operation: 'insert',\n };\n } catch (error) {\n const visibleAfter = await exactVisibleRows({\n client,\n restBaseUrl,\n table: options.table,\n id,\n version,\n });\n\n if (visibleAfter.length === 0) {\n throw error;\n }\n\n if (options.writeMode === 'append_only_insert') {\n return {\n status: 'success',\n operation: 'skipped_existing',\n };\n }\n\n await updateJsonOrderedRow({\n transport: commandTransport,\n table: options.table,\n id,\n version,\n payload: options.payload,\n extraData: options.extraData,\n });\n return {\n status: 'success',\n operation: 'update_after_insert_error',\n };\n }\n}\n\nexport const __testInternals = {\n buildSelectUrl,\n buildUpdateUrl,\n parseVisibleRows,\n exactVisibleRows,\n insertJsonOrderedRow,\n updateJsonOrderedRow,\n requireNonEmptyToken,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"supabase-json-ordered-write.js","sourceRoot":"","sources":["../../../src/lib/supabase-json-ordered-write.ts"],"names":[],"mappings":"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","sourcesContent":["// data-api-relations: lifecyclemodels, processes, sources\n// data-api-dynamic-relation-expression: options.table\nimport { CliError } from './errors.js';\nimport {\n buildDatasetCommandTransport,\n createDatasetRecord,\n saveDraftDatasetRecord,\n type DatasetCommandTransport,\n} from './dataset-command.js';\nimport type { FetchLike } from './http.js';\nimport {\n createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nexport type SupabaseJsonOrderedTable = 'lifecyclemodels' | 'processes' | 'sources';\nexport type SupabaseJsonOrderedWriteMode = 'upsert_current_version' | 'append_only_insert';\nexport type SupabaseJsonOrderedWriteOperation =\n | 'insert'\n | 'update_existing'\n | 'update_after_insert_error'\n | 'skipped_existing';\n\nexport type SupabaseJsonOrderedWriteResult = {\n status: 'success';\n operation: SupabaseJsonOrderedWriteOperation;\n};\n\ntype VisibleRow = {\n id: string;\n version: string;\n state_code: number | null;\n};\n\ntype SupabaseDataClient = ReturnType<typeof createSupabaseDataClient>['client'];\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 {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction buildSelectUrl(\n restBaseUrl: string,\n table: SupabaseJsonOrderedTable,\n id: string,\n version: string,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('select', 'id,version,state_code');\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction buildUpdateUrl(\n restBaseUrl: string,\n table: SupabaseJsonOrderedTable,\n id: string,\n version: string,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction parseVisibleRows(payload: unknown, url: string): VisibleRow[] {\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: trimToken(item.id),\n version: trimToken(item.version),\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n };\n });\n}\n\nasync function exactVisibleRows(options: {\n client: SupabaseDataClient;\n restBaseUrl: string;\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n}): Promise<VisibleRow[]> {\n const url = buildSelectUrl(options.restBaseUrl, options.table, options.id, options.version);\n const payload = await runSupabaseArrayQuery(\n options.client\n .from(options.table)\n .select('id,version,state_code')\n .eq('id', options.id)\n .eq('version', options.version),\n url,\n );\n return parseVisibleRows(payload, url);\n}\n\nasync function insertJsonOrderedRow(options: {\n transport: DatasetCommandTransport;\n table: SupabaseJsonOrderedTable;\n id: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<void> {\n await createDatasetRecord({\n transport: options.transport,\n table: options.table,\n id: options.id,\n payload: options.payload,\n extraData: options.extraData,\n });\n}\n\nasync function updateJsonOrderedRow(options: {\n transport: DatasetCommandTransport;\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<void> {\n await saveDraftDatasetRecord({\n transport: options.transport,\n table: options.table,\n id: options.id,\n version: options.version,\n payload: options.payload,\n extraData: options.extraData,\n });\n}\n\nfunction requireNonEmptyToken(value: string, label: string, code: string): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new CliError(`Missing required ${label}.`, {\n code,\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nexport function hasSupabaseRestRuntime(env: NodeJS.ProcessEnv | undefined): boolean {\n if (!env) {\n return false;\n }\n\n return Boolean(\n trimToken(env.TIANGONG_LCA_API_BASE_URL) &&\n trimToken(env.TIANGONG_LCA_API_KEY) &&\n trimToken(env.TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY),\n );\n}\n\nexport async function syncSupabaseJsonOrderedRecord(options: {\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n payload: JsonObject;\n writeMode: SupabaseJsonOrderedWriteMode;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs?: number;\n extraData?: JsonObject;\n}): Promise<SupabaseJsonOrderedWriteResult> {\n const id = requireNonEmptyToken(options.id, 'dataset id', 'SUPABASE_JSON_ORDERED_ID_REQUIRED');\n const version = requireNonEmptyToken(\n options.version,\n 'dataset version',\n 'SUPABASE_JSON_ORDERED_VERSION_REQUIRED',\n );\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env),\n fetchImpl: options.fetchImpl,\n timeoutMs,\n });\n const commandTransport = await buildDatasetCommandTransport({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n });\n const { client, restBaseUrl } = createSupabaseDataClient(runtime, options.fetchImpl, timeoutMs);\n\n const visibleBefore = await exactVisibleRows({\n client,\n restBaseUrl,\n table: options.table,\n id,\n version,\n });\n\n if (options.writeMode === 'append_only_insert' && visibleBefore.length > 0) {\n return {\n status: 'success',\n operation: 'skipped_existing',\n };\n }\n\n if (visibleBefore.length > 0) {\n await updateJsonOrderedRow({\n transport: commandTransport,\n table: options.table,\n id,\n version,\n payload: options.payload,\n extraData: options.extraData,\n });\n return {\n status: 'success',\n operation: 'update_existing',\n };\n }\n\n try {\n await insertJsonOrderedRow({\n transport: commandTransport,\n table: options.table,\n id,\n payload: options.payload,\n extraData: options.extraData,\n });\n return {\n status: 'success',\n operation: 'insert',\n };\n } catch (error) {\n const visibleAfter = await exactVisibleRows({\n client,\n restBaseUrl,\n table: options.table,\n id,\n version,\n });\n\n if (visibleAfter.length === 0) {\n throw error;\n }\n\n if (options.writeMode === 'append_only_insert') {\n return {\n status: 'success',\n operation: 'skipped_existing',\n };\n }\n\n await updateJsonOrderedRow({\n transport: commandTransport,\n table: options.table,\n id,\n version,\n payload: options.payload,\n extraData: options.extraData,\n });\n return {\n status: 'success',\n operation: 'update_after_insert_error',\n };\n }\n}\n\nexport const __testInternals = {\n buildSelectUrl,\n buildUpdateUrl,\n parseVisibleRows,\n exactVisibleRows,\n insertJsonOrderedRow,\n updateJsonOrderedRow,\n requireNonEmptyToken,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-rest.js","sourceRoot":"","sources":["../../../src/lib/supabase-rest.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n createSupabaseDataClient,\n deriveSupabaseRestBaseUrl,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n type SupabaseDataRuntime,\n} from './supabase-client.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type SupabaseProcessRow = {\n id: string;\n version: string;\n json: unknown;\n modified_at: string | null;\n state_code: number | null;\n};\n\nexport type SupabaseProcessLookup = {\n row: SupabaseProcessRow;\n sourceUrl: string;\n resolution:\n | 'remote_supabase_exact'\n | 'remote_supabase_latest'\n | 'remote_supabase_latest_fallback';\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction buildProcessUrl(\n restBaseUrl: string,\n options: {\n id: string;\n version?: string | null;\n latestOnly?: boolean;\n },\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/processes`);\n url.searchParams.set('select', 'id,version,json,modified_at,state_code');\n url.searchParams.set('id', `eq.${options.id}`);\n\n if (options.version) {\n url.searchParams.set('version', `eq.${options.version}`);\n } else if (options.latestOnly) {\n url.searchParams.set('order', 'version.desc');\n url.searchParams.set('limit', '1');\n }\n\n return url.toString();\n}\n\nfunction parseRows(payload: unknown, url: string): SupabaseProcessRow[] {\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 json: item.json,\n modified_at: typeof item.modified_at === 'string' ? item.modified_at : null,\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n };\n });\n}\n\nfunction normalizeSupabaseProcessPayload(payload: unknown, lookupKey: string): JsonObject {\n if (typeof payload === 'string') {\n try {\n const parsed = JSON.parse(payload);\n if (!isRecord(parsed)) {\n throw new CliError(`Supabase REST payload was not a JSON object for ${lookupKey}.`, {\n code: 'SUPABASE_REST_PAYLOAD_INVALID',\n exitCode: 1,\n details: parsed,\n });\n }\n return parsed;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n\n throw new CliError(`Supabase REST payload was not valid JSON for ${lookupKey}.`, {\n code: 'SUPABASE_REST_PAYLOAD_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n }\n\n if (!isRecord(payload)) {\n throw new CliError(`Supabase REST payload was missing json for ${lookupKey}.`, {\n code: 'SUPABASE_REST_PAYLOAD_MISSING',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload;\n}\n\nasync function fetchExactOrLatestProcessRow(options: {\n runtime: SupabaseDataRuntime;\n id: string;\n version?: string | null;\n timeoutMs: number;\n fetchImpl: FetchLike;\n fallbackToLatest?: boolean;\n}): Promise<SupabaseProcessLookup | null> {\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n\n if (!options.version) {\n const latestUrl = buildProcessUrl(restBaseUrl, {\n id: options.id,\n latestOnly: true,\n });\n const latestRows = parseRows(\n await runSupabaseArrayQuery(\n client\n .from('processes')\n .select('id,version,json,modified_at,state_code')\n .eq('id', options.id)\n .order('version', { ascending: false })\n .limit(1),\n latestUrl,\n ),\n latestUrl,\n );\n\n if (latestRows.length === 0) {\n return null;\n }\n\n return {\n row: latestRows[0] as SupabaseProcessRow,\n sourceUrl: latestUrl,\n resolution: 'remote_supabase_latest',\n };\n }\n\n const exactUrl = buildProcessUrl(restBaseUrl, {\n id: options.id,\n version: options.version,\n });\n const exactRows = parseRows(\n await runSupabaseArrayQuery(\n client\n .from('processes')\n .select('id,version,json,modified_at,state_code')\n .eq('id', options.id)\n .eq('version', options.version),\n exactUrl,\n ),\n exactUrl,\n );\n\n if (exactRows.length > 0) {\n return {\n row: exactRows[0] as SupabaseProcessRow,\n sourceUrl: exactUrl,\n resolution: 'remote_supabase_exact',\n };\n }\n\n if (!options.fallbackToLatest) {\n return null;\n }\n\n const latestUrl = buildProcessUrl(restBaseUrl, {\n id: options.id,\n latestOnly: true,\n });\n const latestRows = parseRows(\n await runSupabaseArrayQuery(\n client\n .from('processes')\n .select('id,version,json,modified_at,state_code')\n .eq('id', options.id)\n .order('version', { ascending: false })\n .limit(1),\n latestUrl,\n ),\n latestUrl,\n );\n\n if (latestRows.length === 0) {\n return null;\n }\n\n return {\n row: latestRows[0] as SupabaseProcessRow,\n sourceUrl: latestUrl,\n resolution: 'remote_supabase_latest_fallback',\n };\n}\n\nexport {\n requireSupabaseRestRuntime,\n deriveSupabaseRestBaseUrl,\n normalizeSupabaseProcessPayload,\n fetchExactOrLatestProcessRow,\n};\n\nexport type { SupabaseDataRuntime };\n"]}
|
|
1
|
+
{"version":3,"file":"supabase-rest.js","sourceRoot":"","sources":["../../../src/lib/supabase-rest.ts"],"names":[],"mappings":"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","sourcesContent":["// data-api-relations: processes\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n createSupabaseDataClient,\n deriveSupabaseRestBaseUrl,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n type SupabaseDataRuntime,\n} from './supabase-client.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type SupabaseProcessRow = {\n id: string;\n version: string;\n json: unknown;\n modified_at: string | null;\n state_code: number | null;\n};\n\nexport type SupabaseProcessLookup = {\n row: SupabaseProcessRow;\n sourceUrl: string;\n resolution:\n | 'remote_supabase_exact'\n | 'remote_supabase_latest'\n | 'remote_supabase_latest_fallback';\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction buildProcessUrl(\n restBaseUrl: string,\n options: {\n id: string;\n version?: string | null;\n latestOnly?: boolean;\n },\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/processes`);\n url.searchParams.set('select', 'id,version,json,modified_at,state_code');\n url.searchParams.set('id', `eq.${options.id}`);\n\n if (options.version) {\n url.searchParams.set('version', `eq.${options.version}`);\n } else if (options.latestOnly) {\n url.searchParams.set('order', 'version.desc');\n url.searchParams.set('limit', '1');\n }\n\n return url.toString();\n}\n\nfunction parseRows(payload: unknown, url: string): SupabaseProcessRow[] {\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 json: item.json,\n modified_at: typeof item.modified_at === 'string' ? item.modified_at : null,\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n };\n });\n}\n\nfunction normalizeSupabaseProcessPayload(payload: unknown, lookupKey: string): JsonObject {\n if (typeof payload === 'string') {\n try {\n const parsed = JSON.parse(payload);\n if (!isRecord(parsed)) {\n throw new CliError(`Supabase REST payload was not a JSON object for ${lookupKey}.`, {\n code: 'SUPABASE_REST_PAYLOAD_INVALID',\n exitCode: 1,\n details: parsed,\n });\n }\n return parsed;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n\n throw new CliError(`Supabase REST payload was not valid JSON for ${lookupKey}.`, {\n code: 'SUPABASE_REST_PAYLOAD_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n }\n\n if (!isRecord(payload)) {\n throw new CliError(`Supabase REST payload was missing json for ${lookupKey}.`, {\n code: 'SUPABASE_REST_PAYLOAD_MISSING',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload;\n}\n\nasync function fetchExactOrLatestProcessRow(options: {\n runtime: SupabaseDataRuntime;\n id: string;\n version?: string | null;\n timeoutMs: number;\n fetchImpl: FetchLike;\n fallbackToLatest?: boolean;\n}): Promise<SupabaseProcessLookup | null> {\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n\n if (!options.version) {\n const latestUrl = buildProcessUrl(restBaseUrl, {\n id: options.id,\n latestOnly: true,\n });\n const latestRows = parseRows(\n await runSupabaseArrayQuery(\n client\n .from('processes')\n .select('id,version,json,modified_at,state_code')\n .eq('id', options.id)\n .order('version', { ascending: false })\n .limit(1),\n latestUrl,\n ),\n latestUrl,\n );\n\n if (latestRows.length === 0) {\n return null;\n }\n\n return {\n row: latestRows[0] as SupabaseProcessRow,\n sourceUrl: latestUrl,\n resolution: 'remote_supabase_latest',\n };\n }\n\n const exactUrl = buildProcessUrl(restBaseUrl, {\n id: options.id,\n version: options.version,\n });\n const exactRows = parseRows(\n await runSupabaseArrayQuery(\n client\n .from('processes')\n .select('id,version,json,modified_at,state_code')\n .eq('id', options.id)\n .eq('version', options.version),\n exactUrl,\n ),\n exactUrl,\n );\n\n if (exactRows.length > 0) {\n return {\n row: exactRows[0] as SupabaseProcessRow,\n sourceUrl: exactUrl,\n resolution: 'remote_supabase_exact',\n };\n }\n\n if (!options.fallbackToLatest) {\n return null;\n }\n\n const latestUrl = buildProcessUrl(restBaseUrl, {\n id: options.id,\n latestOnly: true,\n });\n const latestRows = parseRows(\n await runSupabaseArrayQuery(\n client\n .from('processes')\n .select('id,version,json,modified_at,state_code')\n .eq('id', options.id)\n .order('version', { ascending: false })\n .limit(1),\n latestUrl,\n ),\n latestUrl,\n );\n\n if (latestRows.length === 0) {\n return null;\n }\n\n return {\n row: latestRows[0] as SupabaseProcessRow,\n sourceUrl: latestUrl,\n resolution: 'remote_supabase_latest_fallback',\n };\n}\n\nexport {\n requireSupabaseRestRuntime,\n deriveSupabaseRestBaseUrl,\n normalizeSupabaseProcessPayload,\n fetchExactOrLatestProcessRow,\n};\n\nexport type { SupabaseDataRuntime };\n"]}
|
|
@@ -144,7 +144,7 @@ function makeIssue(category, filePath, location, message, issueCode = 'schema_er
|
|
|
144
144
|
context: {},
|
|
145
145
|
};
|
|
146
146
|
}
|
|
147
|
-
function validateElementaryFlowsClassificationHierarchy(classItems) {
|
|
147
|
+
export function validateElementaryFlowsClassificationHierarchy(classItems) {
|
|
148
148
|
const errors = [];
|
|
149
149
|
classItems.forEach((item, index) => {
|
|
150
150
|
const level = Number(item['@level']);
|
|
@@ -161,7 +161,7 @@ function validateElementaryFlowsClassificationHierarchy(classItems) {
|
|
|
161
161
|
}
|
|
162
162
|
return errors;
|
|
163
163
|
}
|
|
164
|
-
function validateProductFlowsClassificationHierarchy(classItems) {
|
|
164
|
+
export function validateProductFlowsClassificationHierarchy(classItems) {
|
|
165
165
|
const errors = [];
|
|
166
166
|
classItems.forEach((item, index) => {
|
|
167
167
|
const level = Number(item['@level']);
|
|
@@ -178,7 +178,7 @@ function validateProductFlowsClassificationHierarchy(classItems) {
|
|
|
178
178
|
}
|
|
179
179
|
return errors;
|
|
180
180
|
}
|
|
181
|
-
function validateProcessesClassificationHierarchy(classItems) {
|
|
181
|
+
export function validateProcessesClassificationHierarchy(classItems) {
|
|
182
182
|
const errors = [];
|
|
183
183
|
const level0ToLevel1Mapping = {
|
|
184
184
|
A: ['01', '02', '03'],
|
|
@@ -344,14 +344,14 @@ function collectFlowSchemaGapIssues(jsonItem, category, filePath) {
|
|
|
344
344
|
}
|
|
345
345
|
return [];
|
|
346
346
|
}
|
|
347
|
-
function collectClassificationIssues(jsonItem, category, filePath) {
|
|
347
|
+
export function collectClassificationIssues(jsonItem, category, filePath) {
|
|
348
348
|
const issues = [];
|
|
349
349
|
const root = asRecord(jsonItem);
|
|
350
350
|
try {
|
|
351
351
|
if (category === 'flows') {
|
|
352
352
|
const flowDataSet = asRecord(root?.flowDataSet);
|
|
353
353
|
const dataSetType = asRecord(asRecord(flowDataSet?.modellingAndValidation)?.LCIMethod)?.['typeOfDataSet'];
|
|
354
|
-
if (dataSetType === 'Product flow') {
|
|
354
|
+
if (dataSetType === 'Product flow' || dataSetType === 'Waste flow') {
|
|
355
355
|
const items = asRecord(asRecord(asRecord(asRecord(flowDataSet?.flowInformation)?.dataSetInformation)
|
|
356
356
|
?.classificationInformation)?.['common:classification'])?.['common:class'];
|
|
357
357
|
if (Array.isArray(items)) {
|