@tiangong-lca/cli 0.0.11 → 0.0.13
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 +18 -7
- package/assets/tidas-schemas/tidas_contacts.json +312 -0
- package/assets/tidas-schemas/tidas_contacts_category.json +126 -0
- package/assets/tidas-schemas/tidas_data_types.json +359 -0
- package/assets/tidas-schemas/tidas_flowproperties.json +303 -0
- package/assets/tidas-schemas/tidas_flowproperties_category.json +61 -0
- package/assets/tidas-schemas/tidas_flows.json +809 -0
- package/assets/tidas-schemas/tidas_flows_elementary_category.json +720 -0
- package/assets/tidas-schemas/tidas_flows_product_category.json +59623 -0
- package/assets/tidas-schemas/tidas_lciamethods.json +1326 -0
- package/assets/tidas-schemas/tidas_lciamethods_category.json +685 -0
- package/assets/tidas-schemas/tidas_lifecyclemodels.json +1374 -0
- package/assets/tidas-schemas/tidas_locations_category.json +2593 -0
- package/assets/tidas-schemas/tidas_processes.json +1646 -0
- package/assets/tidas-schemas/tidas_processes_category.json +10795 -0
- package/assets/tidas-schemas/tidas_sources.json +228 -0
- package/assets/tidas-schemas/tidas_sources_category.json +100 -0
- package/assets/tidas-schemas/tidas_unitgroups.json +338 -0
- package/assets/tidas-schemas/tidas_unitgroups_category.json +61 -0
- package/dist/src/cli.js +847 -13
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-classification.js +947 -0
- package/dist/src/lib/dataset-classification.js.map +1 -0
- package/dist/src/lib/dataset-command.js +11 -0
- package/dist/src/lib/dataset-command.js.map +1 -1
- package/dist/src/lib/dataset-contract.js +2 -0
- package/dist/src/lib/dataset-contract.js.map +1 -1
- package/dist/src/lib/dataset-curation-queue.js +359 -2
- package/dist/src/lib/dataset-curation-queue.js.map +1 -1
- package/dist/src/lib/dataset-import-lca.js +18 -0
- package/dist/src/lib/dataset-import-lca.js.map +1 -1
- package/dist/src/lib/dataset-local.js +94 -1
- package/dist/src/lib/dataset-local.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-clear-account.js +506 -0
- package/dist/src/lib/dataset-maintenance-clear-account.js.map +1 -0
- package/dist/src/lib/dataset-patch.js +797 -0
- package/dist/src/lib/dataset-patch.js.map +1 -0
- package/dist/src/lib/dataset-remote-verify.js +188 -3
- package/dist/src/lib/dataset-remote-verify.js.map +1 -1
- package/dist/src/lib/dataset-save-draft-run.js +725 -0
- package/dist/src/lib/dataset-save-draft-run.js.map +1 -0
- package/dist/src/lib/dataset-validate.js +32 -2
- package/dist/src/lib/dataset-validate.js.map +1 -1
- package/dist/src/lib/flow-publish-version.js +7 -2
- package/dist/src/lib/flow-publish-version.js.map +1 -1
- package/dist/src/lib/flow-qa.js +8 -0
- package/dist/src/lib/flow-qa.js.map +1 -1
- package/dist/src/lib/identity-preflight.js +895 -117
- package/dist/src/lib/identity-preflight.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-qa.js +159 -34
- package/dist/src/lib/lifecyclemodel-qa.js.map +1 -1
- package/dist/src/lib/process-required-fields.js +62 -12
- package/dist/src/lib/process-required-fields.js.map +1 -1
- package/dist/src/lib/process-save-draft-run.js +10 -0
- package/dist/src/lib/process-save-draft-run.js.map +1 -1
- package/dist/src/lib/process-save-draft.js +59 -3
- package/dist/src/lib/process-save-draft.js.map +1 -1
- package/dist/src/lib/supabase-client.js +19 -8
- package/dist/src/lib/supabase-client.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-save-draft.js","sourceRoot":"","sources":["../../../src/lib/process-save-draft.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 createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\nimport {\n syncSupabaseJsonOrderedRecord,\n type SupabaseJsonOrderedWriteResult,\n} from './supabase-json-ordered-write.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\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\nexport type VisibleProcessRow = {\n id: string;\n version: string;\n user_id: string | null;\n state_code: number | null;\n};\n\nexport type ProcessSaveDraftRpcResult = {\n ok: true;\n [key: string]: unknown;\n};\n\nexport type ProcessStateAwareWriteResult =\n | SupabaseJsonOrderedWriteResult\n | {\n status: 'success';\n operation: 'save_draft';\n write_path: 'cmd_dataset_save_draft';\n rpc_result: ProcessSaveDraftRpcResult;\n visible_row: VisibleProcessRow;\n };\n\nexport type SyncStateAwareProcessRecordOptions = {\n id: string;\n version: string;\n payload: JsonObject;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs?: number;\n audit?: JsonObject;\n modelId?: string | null;\n};\n\nfunction buildVisibleRowsUrl(restBaseUrl: string, id: string, version: string): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/processes`);\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 parseVisibleRows(payload: unknown, url: string): VisibleProcessRow[] {\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 user_id: trimToken(item.user_id),\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n };\n });\n}\n\nasync function exactVisibleRows(options: {\n id: string;\n version: string;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<{\n rows: VisibleProcessRow[];\n restBaseUrl: string;\n accessToken: string;\n publishableKey: string;\n}> {\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n const { client, restBaseUrl } = createSupabaseDataClient(\n runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const url = buildVisibleRowsUrl(restBaseUrl, options.id, options.version);\n const payload = await runSupabaseArrayQuery(\n client\n .from('processes')\n .select('id,version,user_id,state_code')\n .eq('id', options.id)\n .eq('version', options.version),\n url,\n );\n\n return {\n rows: parseVisibleRows(payload, url),\n restBaseUrl,\n accessToken: await runtime.getAccessToken(),\n publishableKey: runtime.publishableKey,\n };\n}\n\nfunction visibleDraftRow(rows: VisibleProcessRow[]): VisibleProcessRow | null {\n return rows.find((row) => row.state_code === 0) ?? null;\n}\n\nfunction buildUnsupportedVisibleRowError(\n id: string,\n version: string,\n rows: VisibleProcessRow[],\n): CliError {\n const primaryRow = rows[0] ?? null;\n const stateCode =\n primaryRow?.state_code === null || primaryRow?.state_code === undefined\n ? 'unknown'\n : String(primaryRow.state_code);\n const visibleOwner = primaryRow?.user_id ?? 'unknown';\n\n return new CliError(\n `Process ${id}@${version} is already visible but cannot use save-draft because the visible row is not a current-user draft (state_code=${stateCode}, visible_owner=${visibleOwner}).`,\n {\n code: 'PUBLISH_PROCESS_SAVE_DRAFT_UNSUPPORTED_VISIBLE_ROW',\n exitCode: 1,\n details: {\n id,\n version,\n visible_rows: rows,\n },\n },\n );\n}\n\nasync function saveDraft(options: {\n restBaseUrl: string;\n publishableKey: string;\n accessToken: string;\n id: string;\n version: string;\n payload: JsonObject;\n timeoutMs: number;\n fetchImpl: FetchLike;\n audit?: JsonObject;\n modelId?: string | null;\n}): Promise<ProcessSaveDraftRpcResult> {\n const url = `${options.restBaseUrl.replace(/\\/+$/u, '')}/rpc/cmd_dataset_save_draft`;\n const payload = requireRemoteOkPayload(\n await postJson({\n url,\n headers: {\n ...buildSupabaseAuthHeaders(options.publishableKey, options.accessToken),\n 'Content-Type': 'application/json',\n },\n body: {\n p_table: 'processes',\n p_id: options.id,\n p_version: options.version,\n p_json_ordered: options.payload,\n p_model_id: options.modelId ?? null,\n p_audit: options.audit ?? null,\n },\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n }),\n url,\n );\n\n if (!isRecord(payload) || payload.ok !== true) {\n throw new CliError(`Process save-draft RPC returned an unexpected payload for ${url}`, {\n code: 'REMOTE_RESPONSE_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload as ProcessSaveDraftRpcResult;\n}\n\nexport async function syncStateAwareProcessRecord(\n options: SyncStateAwareProcessRecordOptions,\n): Promise<ProcessStateAwareWriteResult> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const visible = await exactVisibleRows({\n id: options.id,\n version: options.version,\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n });\n const draftRow = visibleDraftRow(visible.rows);\n\n if (!draftRow) {\n if (visible.rows.length > 0) {\n throw buildUnsupportedVisibleRowError(options.id, options.version, visible.rows);\n }\n\n return syncSupabaseJsonOrderedRecord({\n table: 'processes',\n id: options.id,\n version: options.version,\n payload: options.payload,\n writeMode: 'upsert_current_version',\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n });\n }\n\n return {\n status: 'success',\n operation: 'save_draft',\n write_path: 'cmd_dataset_save_draft',\n rpc_result: await saveDraft({\n restBaseUrl: visible.restBaseUrl,\n publishableKey: visible.publishableKey,\n accessToken: visible.accessToken,\n id: options.id,\n version: options.version,\n payload: options.payload,\n timeoutMs,\n fetchImpl: options.fetchImpl,\n audit: options.audit,\n modelId: options.modelId,\n }),\n visible_row: draftRow,\n };\n}\n\nexport const __testInternals = {\n buildVisibleRowsUrl,\n parseVisibleRows,\n visibleDraftRow,\n buildUnsupportedVisibleRowError,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"process-save-draft.js","sourceRoot":"","sources":["../../../src/lib/process-save-draft.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { getJson, postJson, requireRemoteOkPayload } from './http.js';\nimport {\n buildSupabaseAuthHeaders,\n createSupabaseDataClient,\n deriveSupabaseProjectBaseUrl,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\nimport {\n syncSupabaseJsonOrderedRecord,\n type SupabaseJsonOrderedWriteResult,\n} from './supabase-json-ordered-write.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\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\nexport type VisibleProcessRow = {\n id: string;\n version: string;\n user_id: string | null;\n state_code: number | null;\n};\n\nexport type ProcessSaveDraftRpcResult = {\n ok: true;\n [key: string]: unknown;\n};\n\nexport type ProcessStateAwareWriteResult =\n | SupabaseJsonOrderedWriteResult\n | {\n status: 'success';\n operation: 'save_draft';\n write_path: 'cmd_dataset_save_draft';\n rpc_result: ProcessSaveDraftRpcResult;\n visible_row: VisibleProcessRow;\n };\n\nexport type SyncStateAwareProcessRecordOptions = {\n id: string;\n version: string;\n payload: JsonObject;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs?: number;\n audit?: JsonObject;\n modelId?: string | null;\n targetUserId?: string | null;\n};\n\nfunction buildVisibleRowsUrl(restBaseUrl: string, id: string, version: string): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/processes`);\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 parseVisibleRows(payload: unknown, url: string): VisibleProcessRow[] {\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 user_id: trimToken(item.user_id),\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n };\n });\n}\n\nasync function exactVisibleRows(options: {\n id: string;\n version: string;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<{\n rows: VisibleProcessRow[];\n restBaseUrl: string;\n accessToken: string;\n publishableKey: string;\n}> {\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n const { client, restBaseUrl } = createSupabaseDataClient(\n runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const url = buildVisibleRowsUrl(restBaseUrl, options.id, options.version);\n const payload = await runSupabaseArrayQuery(\n client\n .from('processes')\n .select('id,version,user_id,state_code')\n .eq('id', options.id)\n .eq('version', options.version),\n url,\n );\n\n return {\n rows: parseVisibleRows(payload, url),\n restBaseUrl,\n accessToken: await runtime.getAccessToken(),\n publishableKey: runtime.publishableKey,\n };\n}\n\nfunction visibleDraftRow(rows: VisibleProcessRow[]): VisibleProcessRow | null {\n return rows.find((row) => row.state_code === 0) ?? null;\n}\n\nfunction visibleDraftRowForTarget(\n rows: VisibleProcessRow[],\n targetUserId: string | null,\n): VisibleProcessRow | null {\n if (!targetUserId) {\n return visibleDraftRow(rows);\n }\n return rows.find((row) => row.state_code === 0 && row.user_id === targetUserId) ?? null;\n}\n\nfunction buildCurrentUserUrl(restBaseUrl: string): string {\n return `${deriveSupabaseProjectBaseUrl(restBaseUrl)}/auth/v1/user`;\n}\n\nasync function currentUserId(options: {\n restBaseUrl: string;\n publishableKey: string;\n accessToken: string;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<string> {\n const url = buildCurrentUserUrl(options.restBaseUrl);\n const payload = await getJson({\n url,\n headers: buildSupabaseAuthHeaders(options.publishableKey, options.accessToken),\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n });\n const userId = isRecord(payload) ? trimToken(payload.id) : null;\n if (!userId) {\n throw new CliError('Supabase current-user lookup succeeded without a user id.', {\n code: 'PROCESS_SAVE_DRAFT_CURRENT_USER_ID_MISSING',\n exitCode: 1,\n details: payload,\n });\n }\n return userId;\n}\n\nfunction assertTargetUserMatchesCurrent(options: {\n targetUserId: string | null;\n currentUserId: string;\n}): void {\n if (!options.targetUserId) {\n return;\n }\n if (options.currentUserId !== options.targetUserId) {\n throw new CliError(\n `Process save-draft target user ${options.targetUserId} does not match current CLI auth user ${options.currentUserId}.`,\n {\n code: 'PROCESS_SAVE_DRAFT_TARGET_USER_MISMATCH',\n exitCode: 1,\n details: {\n target_user_id: options.targetUserId,\n current_user_id: options.currentUserId,\n },\n },\n );\n }\n}\n\nfunction buildUnsupportedVisibleRowError(\n id: string,\n version: string,\n rows: VisibleProcessRow[],\n): CliError {\n const primaryRow = rows[0] ?? null;\n const stateCode =\n primaryRow?.state_code === null || primaryRow?.state_code === undefined\n ? 'unknown'\n : String(primaryRow.state_code);\n const visibleOwner = primaryRow?.user_id ?? 'unknown';\n\n return new CliError(\n `Process ${id}@${version} is already visible but cannot use save-draft because the visible row is not a current-user draft (state_code=${stateCode}, visible_owner=${visibleOwner}).`,\n {\n code: 'PUBLISH_PROCESS_SAVE_DRAFT_UNSUPPORTED_VISIBLE_ROW',\n exitCode: 1,\n details: {\n id,\n version,\n visible_rows: rows,\n },\n },\n );\n}\n\nasync function saveDraft(options: {\n restBaseUrl: string;\n publishableKey: string;\n accessToken: string;\n id: string;\n version: string;\n payload: JsonObject;\n timeoutMs: number;\n fetchImpl: FetchLike;\n audit?: JsonObject;\n modelId?: string | null;\n}): Promise<ProcessSaveDraftRpcResult> {\n const url = `${options.restBaseUrl.replace(/\\/+$/u, '')}/rpc/cmd_dataset_save_draft`;\n const payload = requireRemoteOkPayload(\n await postJson({\n url,\n headers: {\n ...buildSupabaseAuthHeaders(options.publishableKey, options.accessToken),\n 'Content-Type': 'application/json',\n },\n body: {\n p_table: 'processes',\n p_id: options.id,\n p_version: options.version,\n p_json_ordered: options.payload,\n p_model_id: options.modelId ?? null,\n p_audit: options.audit ?? null,\n },\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n }),\n url,\n );\n\n if (!isRecord(payload) || payload.ok !== true) {\n throw new CliError(`Process save-draft RPC returned an unexpected payload for ${url}`, {\n code: 'REMOTE_RESPONSE_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload as ProcessSaveDraftRpcResult;\n}\n\nexport async function syncStateAwareProcessRecord(\n options: SyncStateAwareProcessRecordOptions,\n): Promise<ProcessStateAwareWriteResult> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const targetUserId = trimToken(options.targetUserId);\n const visible = await exactVisibleRows({\n id: options.id,\n version: options.version,\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n });\n if (targetUserId) {\n const userId = await currentUserId({\n restBaseUrl: visible.restBaseUrl,\n publishableKey: visible.publishableKey,\n accessToken: visible.accessToken,\n timeoutMs,\n fetchImpl: options.fetchImpl,\n });\n assertTargetUserMatchesCurrent({ targetUserId, currentUserId: userId });\n }\n\n const draftRow = visibleDraftRowForTarget(visible.rows, targetUserId);\n\n if (!draftRow) {\n if (visible.rows.length > 0) {\n throw buildUnsupportedVisibleRowError(options.id, options.version, visible.rows);\n }\n\n return syncSupabaseJsonOrderedRecord({\n table: 'processes',\n id: options.id,\n version: options.version,\n payload: options.payload,\n writeMode: 'upsert_current_version',\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n });\n }\n\n return {\n status: 'success',\n operation: 'save_draft',\n write_path: 'cmd_dataset_save_draft',\n rpc_result: await saveDraft({\n restBaseUrl: visible.restBaseUrl,\n publishableKey: visible.publishableKey,\n accessToken: visible.accessToken,\n id: options.id,\n version: options.version,\n payload: options.payload,\n timeoutMs,\n fetchImpl: options.fetchImpl,\n audit: options.audit,\n modelId: options.modelId,\n }),\n visible_row: draftRow,\n };\n}\n\nexport const __testInternals = {\n buildVisibleRowsUrl,\n buildCurrentUserUrl,\n parseVisibleRows,\n visibleDraftRow,\n visibleDraftRowForTarget,\n assertTargetUserMatchesCurrent,\n buildUnsupportedVisibleRowError,\n};\n"]}
|
|
@@ -167,6 +167,20 @@ function formatPostgrestError(error) {
|
|
|
167
167
|
hint: typeof error.hint === 'string' ? error.hint : null,
|
|
168
168
|
};
|
|
169
169
|
}
|
|
170
|
+
function isPostgrestInvalidJsonError(error, status) {
|
|
171
|
+
const code = trimToken(error.code);
|
|
172
|
+
const message = trimToken(error.message);
|
|
173
|
+
if (code) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
if (status === 0 && /^SyntaxError:/u.test(message)) {
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
return status >= 200 && status < 300;
|
|
180
|
+
}
|
|
181
|
+
function postgrestInvalidJsonDetails(error) {
|
|
182
|
+
return trimToken(error.details) || trimToken(error.message) || 'invalid JSON response';
|
|
183
|
+
}
|
|
170
184
|
export async function runSupabaseArrayQuery(queryPromise, sourceUrl) {
|
|
171
185
|
const data = await runSupabaseQuery(queryPromise, sourceUrl);
|
|
172
186
|
return (data ?? []);
|
|
@@ -175,13 +189,11 @@ export async function runSupabaseQuery(queryPromise, sourceUrl) {
|
|
|
175
189
|
try {
|
|
176
190
|
const result = await queryPromise;
|
|
177
191
|
if (result.error) {
|
|
178
|
-
if (result.status
|
|
179
|
-
result.error.code === '' &&
|
|
180
|
-
/^SyntaxError:/u.test(result.error.message)) {
|
|
192
|
+
if (isPostgrestInvalidJsonError(result.error, result.status)) {
|
|
181
193
|
throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {
|
|
182
194
|
code: 'REMOTE_INVALID_JSON',
|
|
183
195
|
exitCode: 1,
|
|
184
|
-
details: result.error
|
|
196
|
+
details: postgrestInvalidJsonDetails(result.error),
|
|
185
197
|
});
|
|
186
198
|
}
|
|
187
199
|
throw new CliError(`HTTP ${result.status} returned from ${sourceUrl}`, {
|
|
@@ -214,13 +226,11 @@ export async function runSupabaseMutation(queryPromise, sourceUrl) {
|
|
|
214
226
|
try {
|
|
215
227
|
const result = await queryPromise;
|
|
216
228
|
if (result.error) {
|
|
217
|
-
if (result.status
|
|
218
|
-
result.error.code === '' &&
|
|
219
|
-
/^SyntaxError:/u.test(result.error.message)) {
|
|
229
|
+
if (isPostgrestInvalidJsonError(result.error, result.status)) {
|
|
220
230
|
throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {
|
|
221
231
|
code: 'REMOTE_INVALID_JSON',
|
|
222
232
|
exitCode: 1,
|
|
223
|
-
details: result.error
|
|
233
|
+
details: postgrestInvalidJsonDetails(result.error),
|
|
224
234
|
});
|
|
225
235
|
}
|
|
226
236
|
throw new CliError(`HTTP ${result.status} returned from ${sourceUrl}`, {
|
|
@@ -266,6 +276,7 @@ export function createSupabaseDataClient(runtime, fetchImpl, timeoutMs) {
|
|
|
266
276
|
};
|
|
267
277
|
}
|
|
268
278
|
export const __testInternals = {
|
|
279
|
+
postgrestInvalidJsonDetails,
|
|
269
280
|
parseBooleanEnv,
|
|
270
281
|
trimToken,
|
|
271
282
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-client.js","sourceRoot":"","sources":["../../../src/lib/supabase-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAmBvC,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QACnC,KAAK,GAAG,CAAC;QACT,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK,CAAC;QACX,KAAK,IAAI;YACP,OAAO,IAAI,CAAC;QACd;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAsB;IAC/D,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,IAAI,CAAC;IACrE,MAAM,mBAAmB,GAAG,eAAe,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACpF,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACnE,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,QAAQ,CAAC,sCAAsC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;YAC7E,IAAI,EAAE,4BAA4B;YAClC,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,OAAO,EAAE;SACrB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,UAAU;QACV,UAAU;QACV,cAAc;QACd,WAAW;QACX,mBAAmB;QACnB,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkB;IAC1C,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,QAAQ,CAAC,yDAAyD,EAAE;YAC5E,IAAI,EAAE,gCAAgC;YACtC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,UAAkB;IAC7D,MAAM,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAEhD,IAAI,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACzC,OAAO,UAAU,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,OAAO,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,IAAI,QAAQ,CAChB,8JAA8J,EAC9J;QACE,IAAI,EAAE,gCAAgC;QACtC,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,UAAU;KACpB,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAAkB;IAC1D,OAAO,GAAG,4BAA4B,CAAC,UAAU,CAAC,UAAU,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,UAAkB,EAAU,EAAE,CAC3E,GAAG,4BAA4B,CAAC,UAAU,CAAC,eAAe,CAAC;AAE7D,SAAS,YAAY,CAAC,MAAsC,EAAE,SAAiB;IAC7E,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,cAAsB,EACtB,WAAmB;IAEnB,OAAO;QACL,MAAM,EAAE,kBAAkB;QAC1B,aAAa,EAAE,UAAU,WAAW,EAAE;QACtC,MAAM,EAAE,cAAc;KACvB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,YAA0B,EAC1B,MAA0B;IAE1B,IAAI,YAAY,YAAY,QAAQ,EAAE,CAAC;QACrC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACnE,MAAM,cAAc,GAClB,YAAY,CAAC,EAAE;QACf,MAAM,KAAK,SAAS;QACpB,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAC/C,IAAI,CAAC,MAAM,GAAG,CAAC;QACf,CAAC,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACvC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,KAAK,MAAM,UAAU,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE;QAClC,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAC3B,WAAoC,EACpC,cAAsB,EACtB,WAAmB;IAEnB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,wBAAwB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAE1E,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE;QAC1D,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,KAAwB,EACxB,IAA6B,EAC7B,SAAoB,EACpB,SAAiB;IAEjB,MAAM,GAAG,GACP,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IAE1F,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,CAAC,GAAG,EAAE;YAC1B,GAAG,IAAI;YACP,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,SAAoB,EACpB,SAAiB,EACjB,OAA6B;IAE7B,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YAC3E,OAAO,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;QACnD,IAAI,YAAY,GAAG,MAAM,YAAY,CACnC,KAAK,EACL;YACE,GAAG,IAAI;YACP,OAAO,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC;SAClF,EACD,SAAS,EACT,SAAS,CACV,CAAC;QAEF,IACE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC;YACxC,OAAO,OAAO,CAAC,kBAAkB,KAAK,UAAU,EAChD,CAAC;YACD,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAChE,YAAY,GAAG,MAAM,YAAY,CAC/B,KAAK,EACL;gBACE,GAAG,IAAI;gBACP,OAAO,EAAE,oBAAoB,CAC3B,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,cAAc,EACtB,oBAAoB,CACrB;aACF,EACD,SAAS,EACT,SAAS,CACV,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC,CAAC;AACJ,CAAC;AAQD,SAAS,oBAAoB,CAAC,KAAqB;IAMjD,OAAO;QACL,IAAI,EAAE,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QACxD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QACjE,IAAI,EAAE,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;KACzD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,YAAmD,EACnD,SAAiB;IAEjB,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,IAAI,EAAE,CAAQ,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,YAAiD,EACjD,SAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAClC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IACE,MAAM,CAAC,MAAM,KAAK,CAAC;gBACnB,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE;gBACxB,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAC3C,CAAC;gBACD,MAAM,IAAI,QAAQ,CAAC,0CAA0C,SAAS,EAAE,EAAE;oBACxE,IAAI,EAAE,qBAAqB;oBAC3B,QAAQ,EAAE,CAAC;oBACX,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO;iBACtD,CAAC,CAAC;YACL,CAAC;YAED,MAAM,IAAI,QAAQ,CAAC,QAAQ,MAAM,CAAC,MAAM,kBAAkB,SAAS,EAAE,EAAE;gBACrE,IAAI,EAAE,uBAAuB;gBAC7B,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC;aAC5C,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,QAAQ,CAAC,0CAA0C,SAAS,EAAE,EAAE;gBACxE,IAAI,EAAE,qBAAqB;gBAC3B,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,QAAQ,CAAC,+BAA+B,SAAS,EAAE,EAAE;YAC7D,IAAI,EAAE,uBAAuB;YAC7B,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAChE,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,YAGE,EACF,SAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAClC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IACE,MAAM,CAAC,MAAM,KAAK,CAAC;gBACnB,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE;gBACxB,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAC3C,CAAC;gBACD,MAAM,IAAI,QAAQ,CAAC,0CAA0C,SAAS,EAAE,EAAE;oBACxE,IAAI,EAAE,qBAAqB;oBAC3B,QAAQ,EAAE,CAAC;oBACX,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO;iBACtD,CAAC,CAAC;YACL,CAAC;YAED,MAAM,IAAI,QAAQ,CAAC,QAAQ,MAAM,CAAC,MAAM,kBAAkB,SAAS,EAAE,EAAE;gBACrE,IAAI,EAAE,uBAAuB;gBAC7B,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC;aAC5C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,QAAQ,CAAC,0CAA0C,SAAS,EAAE,EAAE;gBACxE,IAAI,EAAE,qBAAqB;gBAC3B,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,QAAQ,CAAC,+BAA+B,SAAS,EAAE,EAAE;YAC7D,IAAI,EAAE,uBAAuB;YAC7B,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAChE,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,OAA4B,EAC5B,SAAoB,EACpB,SAAiB;IAEjB,MAAM,cAAc,GAAG,4BAA4B,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAExE,OAAO;QACL,MAAM,EAAE,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE;YAC3D,IAAI,EAAE;gBACJ,gBAAgB,EAAE,KAAK;gBACvB,cAAc,EAAE,KAAK;gBACrB,kBAAkB,EAAE,KAAK;aAC1B;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC;aAC1D;SACF,CAAC;QACF,WAAW,EAAE,yBAAyB,CAAC,cAAc,CAAC;QACtD,gBAAgB,EAAE,8BAA8B,CAAC,cAAc,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,eAAe;IACf,SAAS;CACV,CAAC","sourcesContent":["import { createClient, type PostgrestError } from '@supabase/supabase-js';\nimport { CliError } from './errors.js';\nimport type { FetchLike, ResponseLike } from './http.js';\n\nexport type SupabaseRestRuntime = {\n apiBaseUrl: string;\n userApiKey: string;\n publishableKey: string;\n sessionFile: string | null;\n disableSessionCache: boolean;\n forceReauth: boolean;\n};\n\nexport type SupabaseDataRuntime = {\n apiBaseUrl: string;\n publishableKey: string;\n getAccessToken: () => Promise<string>;\n refreshAccessToken?: () => Promise<string>;\n};\n\nfunction trimToken(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction parseBooleanEnv(value: unknown): boolean {\n if (typeof value !== 'string') {\n return false;\n }\n\n switch (value.trim().toLowerCase()) {\n case '1':\n case 'true':\n case 'yes':\n case 'on':\n return true;\n default:\n return false;\n }\n}\n\nexport function requireSupabaseRestRuntime(env: NodeJS.ProcessEnv): SupabaseRestRuntime {\n const apiBaseUrl = trimToken(env.TIANGONG_LCA_API_BASE_URL);\n const userApiKey = trimToken(env.TIANGONG_LCA_API_KEY);\n const publishableKey = trimToken(env.TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY);\n const sessionFile = trimToken(env.TIANGONG_LCA_SESSION_FILE) || null;\n const disableSessionCache = parseBooleanEnv(env.TIANGONG_LCA_DISABLE_SESSION_CACHE);\n const forceReauth = parseBooleanEnv(env.TIANGONG_LCA_FORCE_REAUTH);\n const missing: string[] = [];\n\n if (!apiBaseUrl) {\n missing.push('TIANGONG_LCA_API_BASE_URL');\n }\n\n if (!userApiKey) {\n missing.push('TIANGONG_LCA_API_KEY');\n }\n\n if (!publishableKey) {\n missing.push('TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY');\n }\n\n if (missing.length > 0) {\n throw new CliError(`Missing Supabase REST runtime env: ${missing.join(', ')}`, {\n code: 'SUPABASE_REST_ENV_REQUIRED',\n exitCode: 2,\n details: { missing },\n });\n }\n\n return {\n apiBaseUrl,\n userApiKey,\n publishableKey,\n sessionFile,\n disableSessionCache,\n forceReauth,\n };\n}\n\nfunction normalizeBaseUrl(apiBaseUrl: string): string {\n const normalized = apiBaseUrl.trim().replace(/\\/+$/u, '');\n if (!normalized) {\n throw new CliError('Cannot derive Supabase URLs from an empty API base URL.', {\n code: 'SUPABASE_REST_BASE_URL_INVALID',\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nexport function deriveSupabaseProjectBaseUrl(apiBaseUrl: string): string {\n const normalized = normalizeBaseUrl(apiBaseUrl);\n\n if (normalized.endsWith('/functions/v1')) {\n return normalized.replace(/\\/functions\\/v1$/u, '');\n }\n\n if (normalized.endsWith('/rest/v1')) {\n return normalized.replace(/\\/rest\\/v1$/u, '');\n }\n\n if (/^https?:\\/\\/[^/]+$/u.test(normalized)) {\n return normalized;\n }\n\n throw new CliError(\n 'Cannot derive a Supabase project base URL from TIANGONG_LCA_API_BASE_URL. Use a Supabase project base URL, a /functions/v1 base URL, or a /rest/v1 base URL.',\n {\n code: 'SUPABASE_REST_BASE_URL_INVALID',\n exitCode: 2,\n details: normalized,\n },\n );\n}\n\nexport function deriveSupabaseRestBaseUrl(apiBaseUrl: string): string {\n return `${deriveSupabaseProjectBaseUrl(apiBaseUrl)}/rest/v1`;\n}\n\nexport const deriveSupabaseFunctionsBaseUrl = (apiBaseUrl: string): string =>\n `${deriveSupabaseProjectBaseUrl(apiBaseUrl)}/functions/v1`;\n\nfunction mergeSignals(signal: AbortSignal | null | undefined, timeoutMs: number): AbortSignal {\n const timeoutSignal = AbortSignal.timeout(timeoutMs);\n return signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;\n}\n\nexport function buildSupabaseAuthHeaders(\n publishableKey: string,\n accessToken: string,\n): Record<string, string> {\n return {\n Accept: 'application/json',\n Authorization: `Bearer ${accessToken}`,\n apikey: publishableKey,\n };\n}\n\nasync function toResponse(\n responseLike: ResponseLike,\n method: string | undefined,\n): Promise<Response> {\n if (responseLike instanceof Response) {\n return responseLike;\n }\n\n const body = await responseLike.text();\n const contentType = responseLike.headers.get('content-type') ?? '';\n const normalizedBody =\n responseLike.ok &&\n method !== undefined &&\n !['GET', 'HEAD'].includes(method.toUpperCase()) &&\n body.length > 0 &&\n !contentType.includes('application/json')\n ? ''\n : body;\n const headers = new Headers();\n for (const headerName of ['content-type', 'content-range', 'location']) {\n const value = responseLike.headers.get(headerName);\n if (value) {\n headers.set(headerName, value);\n }\n }\n\n return new Response(normalizedBody, {\n status: responseLike.status,\n headers,\n });\n}\n\nfunction buildResolvedHeaders(\n initHeaders: HeadersInit | undefined,\n publishableKey: string,\n accessToken: string,\n): Headers {\n const headers = new Headers(initHeaders);\n const authHeaders = buildSupabaseAuthHeaders(publishableKey, accessToken);\n\n Object.entries(authHeaders).forEach(([headerName, value]) => {\n headers.set(headerName, value);\n });\n\n return headers;\n}\n\nasync function performFetch(\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n fetchImpl: FetchLike,\n timeoutMs: number,\n): Promise<ResponseLike> {\n const url =\n typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n\n try {\n return await fetchImpl(url, {\n ...init,\n signal: mergeSignals(init?.signal, timeoutMs),\n });\n } catch (error) {\n throw error instanceof Error ? error : new Error(String(error));\n }\n}\n\nexport function createSupabaseFetch(\n fetchImpl: FetchLike,\n timeoutMs: number,\n runtime?: SupabaseDataRuntime,\n): typeof fetch {\n return async (input, init) => {\n if (!runtime) {\n const responseLike = await performFetch(input, init, fetchImpl, timeoutMs);\n return toResponse(responseLike, init?.method);\n }\n\n const accessToken = await runtime.getAccessToken();\n let responseLike = await performFetch(\n input,\n {\n ...init,\n headers: buildResolvedHeaders(init?.headers, runtime.publishableKey, accessToken),\n },\n fetchImpl,\n timeoutMs,\n );\n\n if (\n [401, 403].includes(responseLike.status) &&\n typeof runtime.refreshAccessToken === 'function'\n ) {\n const refreshedAccessToken = await runtime.refreshAccessToken();\n responseLike = await performFetch(\n input,\n {\n ...init,\n headers: buildResolvedHeaders(\n init?.headers,\n runtime.publishableKey,\n refreshedAccessToken,\n ),\n },\n fetchImpl,\n timeoutMs,\n );\n }\n\n return toResponse(responseLike, init?.method);\n };\n}\n\ntype SupabaseQueryResult<T> = {\n data: T | null;\n error: PostgrestError | null;\n status: number;\n};\n\nfunction formatPostgrestError(error: PostgrestError): {\n code: string | null;\n message: string;\n details: string | null;\n hint: string | null;\n} {\n return {\n code: typeof error.code === 'string' ? error.code : null,\n message: error.message,\n details: typeof error.details === 'string' ? error.details : null,\n hint: typeof error.hint === 'string' ? error.hint : null,\n };\n}\n\nexport async function runSupabaseArrayQuery<T>(\n queryPromise: PromiseLike<SupabaseQueryResult<T[]>>,\n sourceUrl: string,\n): Promise<T[]> {\n const data = await runSupabaseQuery(queryPromise, sourceUrl);\n return (data ?? []) as T[];\n}\n\nexport async function runSupabaseQuery<T>(\n queryPromise: PromiseLike<SupabaseQueryResult<T>>,\n sourceUrl: string,\n): Promise<T | null> {\n try {\n const result = await queryPromise;\n if (result.error) {\n if (\n result.status === 0 &&\n result.error.code === '' &&\n /^SyntaxError:/u.test(result.error.message)\n ) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: result.error.details || result.error.message,\n });\n }\n\n throw new CliError(`HTTP ${result.status} returned from ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: formatPostgrestError(result.error),\n });\n }\n return result.data;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n\n if (error instanceof SyntaxError) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: error.message,\n });\n }\n\n throw new CliError(`Supabase request failed for ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nexport async function runSupabaseMutation(\n queryPromise: PromiseLike<{\n error: PostgrestError | null;\n status: number;\n }>,\n sourceUrl: string,\n): Promise<void> {\n try {\n const result = await queryPromise;\n if (result.error) {\n if (\n result.status === 0 &&\n result.error.code === '' &&\n /^SyntaxError:/u.test(result.error.message)\n ) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: result.error.details || result.error.message,\n });\n }\n\n throw new CliError(`HTTP ${result.status} returned from ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: formatPostgrestError(result.error),\n });\n }\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n\n if (error instanceof SyntaxError) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: error.message,\n });\n }\n\n throw new CliError(`Supabase request failed for ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nexport function createSupabaseDataClient(\n runtime: SupabaseDataRuntime,\n fetchImpl: FetchLike,\n timeoutMs: number,\n) {\n const projectBaseUrl = deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl);\n\n return {\n client: createClient(projectBaseUrl, runtime.publishableKey, {\n auth: {\n autoRefreshToken: false,\n persistSession: false,\n detectSessionInUrl: false,\n },\n global: {\n fetch: createSupabaseFetch(fetchImpl, timeoutMs, runtime),\n },\n }),\n restBaseUrl: deriveSupabaseRestBaseUrl(projectBaseUrl),\n functionsBaseUrl: deriveSupabaseFunctionsBaseUrl(projectBaseUrl),\n };\n}\n\nexport const __testInternals = {\n parseBooleanEnv,\n trimToken,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"supabase-client.js","sourceRoot":"","sources":["../../../src/lib/supabase-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { createClient, type PostgrestError } from '@supabase/supabase-js';\nimport { CliError } from './errors.js';\nimport type { FetchLike, ResponseLike } from './http.js';\n\nexport type SupabaseRestRuntime = {\n apiBaseUrl: string;\n userApiKey: string;\n publishableKey: string;\n sessionFile: string | null;\n disableSessionCache: boolean;\n forceReauth: boolean;\n};\n\nexport type SupabaseDataRuntime = {\n apiBaseUrl: string;\n publishableKey: string;\n getAccessToken: () => Promise<string>;\n refreshAccessToken?: () => Promise<string>;\n};\n\nfunction trimToken(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction parseBooleanEnv(value: unknown): boolean {\n if (typeof value !== 'string') {\n return false;\n }\n\n switch (value.trim().toLowerCase()) {\n case '1':\n case 'true':\n case 'yes':\n case 'on':\n return true;\n default:\n return false;\n }\n}\n\nexport function requireSupabaseRestRuntime(env: NodeJS.ProcessEnv): SupabaseRestRuntime {\n const apiBaseUrl = trimToken(env.TIANGONG_LCA_API_BASE_URL);\n const userApiKey = trimToken(env.TIANGONG_LCA_API_KEY);\n const publishableKey = trimToken(env.TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY);\n const sessionFile = trimToken(env.TIANGONG_LCA_SESSION_FILE) || null;\n const disableSessionCache = parseBooleanEnv(env.TIANGONG_LCA_DISABLE_SESSION_CACHE);\n const forceReauth = parseBooleanEnv(env.TIANGONG_LCA_FORCE_REAUTH);\n const missing: string[] = [];\n\n if (!apiBaseUrl) {\n missing.push('TIANGONG_LCA_API_BASE_URL');\n }\n\n if (!userApiKey) {\n missing.push('TIANGONG_LCA_API_KEY');\n }\n\n if (!publishableKey) {\n missing.push('TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY');\n }\n\n if (missing.length > 0) {\n throw new CliError(`Missing Supabase REST runtime env: ${missing.join(', ')}`, {\n code: 'SUPABASE_REST_ENV_REQUIRED',\n exitCode: 2,\n details: { missing },\n });\n }\n\n return {\n apiBaseUrl,\n userApiKey,\n publishableKey,\n sessionFile,\n disableSessionCache,\n forceReauth,\n };\n}\n\nfunction normalizeBaseUrl(apiBaseUrl: string): string {\n const normalized = apiBaseUrl.trim().replace(/\\/+$/u, '');\n if (!normalized) {\n throw new CliError('Cannot derive Supabase URLs from an empty API base URL.', {\n code: 'SUPABASE_REST_BASE_URL_INVALID',\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nexport function deriveSupabaseProjectBaseUrl(apiBaseUrl: string): string {\n const normalized = normalizeBaseUrl(apiBaseUrl);\n\n if (normalized.endsWith('/functions/v1')) {\n return normalized.replace(/\\/functions\\/v1$/u, '');\n }\n\n if (normalized.endsWith('/rest/v1')) {\n return normalized.replace(/\\/rest\\/v1$/u, '');\n }\n\n if (/^https?:\\/\\/[^/]+$/u.test(normalized)) {\n return normalized;\n }\n\n throw new CliError(\n 'Cannot derive a Supabase project base URL from TIANGONG_LCA_API_BASE_URL. Use a Supabase project base URL, a /functions/v1 base URL, or a /rest/v1 base URL.',\n {\n code: 'SUPABASE_REST_BASE_URL_INVALID',\n exitCode: 2,\n details: normalized,\n },\n );\n}\n\nexport function deriveSupabaseRestBaseUrl(apiBaseUrl: string): string {\n return `${deriveSupabaseProjectBaseUrl(apiBaseUrl)}/rest/v1`;\n}\n\nexport const deriveSupabaseFunctionsBaseUrl = (apiBaseUrl: string): string =>\n `${deriveSupabaseProjectBaseUrl(apiBaseUrl)}/functions/v1`;\n\nfunction mergeSignals(signal: AbortSignal | null | undefined, timeoutMs: number): AbortSignal {\n const timeoutSignal = AbortSignal.timeout(timeoutMs);\n return signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;\n}\n\nexport function buildSupabaseAuthHeaders(\n publishableKey: string,\n accessToken: string,\n): Record<string, string> {\n return {\n Accept: 'application/json',\n Authorization: `Bearer ${accessToken}`,\n apikey: publishableKey,\n };\n}\n\nasync function toResponse(\n responseLike: ResponseLike,\n method: string | undefined,\n): Promise<Response> {\n if (responseLike instanceof Response) {\n return responseLike;\n }\n\n const body = await responseLike.text();\n const contentType = responseLike.headers.get('content-type') ?? '';\n const normalizedBody =\n responseLike.ok &&\n method !== undefined &&\n !['GET', 'HEAD'].includes(method.toUpperCase()) &&\n body.length > 0 &&\n !contentType.includes('application/json')\n ? ''\n : body;\n const headers = new Headers();\n for (const headerName of ['content-type', 'content-range', 'location']) {\n const value = responseLike.headers.get(headerName);\n if (value) {\n headers.set(headerName, value);\n }\n }\n\n return new Response(normalizedBody, {\n status: responseLike.status,\n headers,\n });\n}\n\nfunction buildResolvedHeaders(\n initHeaders: HeadersInit | undefined,\n publishableKey: string,\n accessToken: string,\n): Headers {\n const headers = new Headers(initHeaders);\n const authHeaders = buildSupabaseAuthHeaders(publishableKey, accessToken);\n\n Object.entries(authHeaders).forEach(([headerName, value]) => {\n headers.set(headerName, value);\n });\n\n return headers;\n}\n\nasync function performFetch(\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n fetchImpl: FetchLike,\n timeoutMs: number,\n): Promise<ResponseLike> {\n const url =\n typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n\n try {\n return await fetchImpl(url, {\n ...init,\n signal: mergeSignals(init?.signal, timeoutMs),\n });\n } catch (error) {\n throw error instanceof Error ? error : new Error(String(error));\n }\n}\n\nexport function createSupabaseFetch(\n fetchImpl: FetchLike,\n timeoutMs: number,\n runtime?: SupabaseDataRuntime,\n): typeof fetch {\n return async (input, init) => {\n if (!runtime) {\n const responseLike = await performFetch(input, init, fetchImpl, timeoutMs);\n return toResponse(responseLike, init?.method);\n }\n\n const accessToken = await runtime.getAccessToken();\n let responseLike = await performFetch(\n input,\n {\n ...init,\n headers: buildResolvedHeaders(init?.headers, runtime.publishableKey, accessToken),\n },\n fetchImpl,\n timeoutMs,\n );\n\n if (\n [401, 403].includes(responseLike.status) &&\n typeof runtime.refreshAccessToken === 'function'\n ) {\n const refreshedAccessToken = await runtime.refreshAccessToken();\n responseLike = await performFetch(\n input,\n {\n ...init,\n headers: buildResolvedHeaders(\n init?.headers,\n runtime.publishableKey,\n refreshedAccessToken,\n ),\n },\n fetchImpl,\n timeoutMs,\n );\n }\n\n return toResponse(responseLike, init?.method);\n };\n}\n\ntype SupabaseQueryResult<T> = {\n data: T | null;\n error: PostgrestError | null;\n status: number;\n};\n\nfunction formatPostgrestError(error: PostgrestError): {\n code: string | null;\n message: string;\n details: string | null;\n hint: string | null;\n} {\n return {\n code: typeof error.code === 'string' ? error.code : null,\n message: error.message,\n details: typeof error.details === 'string' ? error.details : null,\n hint: typeof error.hint === 'string' ? error.hint : null,\n };\n}\n\nfunction isPostgrestInvalidJsonError(error: PostgrestError, status: number): boolean {\n const code = trimToken(error.code);\n const message = trimToken(error.message);\n if (code) {\n return false;\n }\n\n if (status === 0 && /^SyntaxError:/u.test(message)) {\n return true;\n }\n\n return status >= 200 && status < 300;\n}\n\nfunction postgrestInvalidJsonDetails(error: PostgrestError): string {\n return trimToken(error.details) || trimToken(error.message) || 'invalid JSON response';\n}\n\nexport async function runSupabaseArrayQuery<T>(\n queryPromise: PromiseLike<SupabaseQueryResult<T[]>>,\n sourceUrl: string,\n): Promise<T[]> {\n const data = await runSupabaseQuery(queryPromise, sourceUrl);\n return (data ?? []) as T[];\n}\n\nexport async function runSupabaseQuery<T>(\n queryPromise: PromiseLike<SupabaseQueryResult<T>>,\n sourceUrl: string,\n): Promise<T | null> {\n try {\n const result = await queryPromise;\n if (result.error) {\n if (isPostgrestInvalidJsonError(result.error, result.status)) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: postgrestInvalidJsonDetails(result.error),\n });\n }\n\n throw new CliError(`HTTP ${result.status} returned from ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: formatPostgrestError(result.error),\n });\n }\n return result.data;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n\n if (error instanceof SyntaxError) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: error.message,\n });\n }\n\n throw new CliError(`Supabase request failed for ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nexport async function runSupabaseMutation(\n queryPromise: PromiseLike<{\n error: PostgrestError | null;\n status: number;\n }>,\n sourceUrl: string,\n): Promise<void> {\n try {\n const result = await queryPromise;\n if (result.error) {\n if (isPostgrestInvalidJsonError(result.error, result.status)) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: postgrestInvalidJsonDetails(result.error),\n });\n }\n\n throw new CliError(`HTTP ${result.status} returned from ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: formatPostgrestError(result.error),\n });\n }\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n\n if (error instanceof SyntaxError) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: error.message,\n });\n }\n\n throw new CliError(`Supabase request failed for ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nexport function createSupabaseDataClient(\n runtime: SupabaseDataRuntime,\n fetchImpl: FetchLike,\n timeoutMs: number,\n) {\n const projectBaseUrl = deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl);\n\n return {\n client: createClient(projectBaseUrl, runtime.publishableKey, {\n auth: {\n autoRefreshToken: false,\n persistSession: false,\n detectSessionInUrl: false,\n },\n global: {\n fetch: createSupabaseFetch(fetchImpl, timeoutMs, runtime),\n },\n }),\n restBaseUrl: deriveSupabaseRestBaseUrl(projectBaseUrl),\n functionsBaseUrl: deriveSupabaseFunctionsBaseUrl(projectBaseUrl),\n };\n}\n\nexport const __testInternals = {\n postgrestInvalidJsonDetails,\n parseBooleanEnv,\n trimToken,\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tiangong-lca/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
4
4
|
"description": "Unified TianGong LCA CLI with direct REST adapters and low-entropy command surface.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"tiangong-lca": "./bin/tiangong-lca.js"
|
|
16
16
|
},
|
|
17
17
|
"files": [
|
|
18
|
+
"assets/",
|
|
18
19
|
"bin/",
|
|
19
20
|
"dist/",
|
|
20
21
|
"README.md",
|