@tiangong-lca/cli 0.0.2 → 0.0.4
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 +131 -309
- package/dist/src/cli.js +158 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-command.js +122 -0
- package/dist/src/lib/dataset-command.js.map +1 -0
- package/dist/src/lib/flow-fetch-rows.js +235 -0
- package/dist/src/lib/flow-fetch-rows.js.map +1 -0
- package/dist/src/lib/flow-materialize-decisions.js +421 -0
- package/dist/src/lib/flow-materialize-decisions.js.map +1 -0
- package/dist/src/lib/flow-publish-version.js +23 -19
- package/dist/src/lib/flow-publish-version.js.map +1 -1
- package/dist/src/lib/remote.js +2 -2
- package/dist/src/lib/remote.js.map +1 -1
- package/dist/src/lib/supabase-client.js +5 -2
- package/dist/src/lib/supabase-client.js.map +1 -1
- package/dist/src/lib/supabase-json-ordered-write.js +42 -21
- package/dist/src/lib/supabase-json-ordered-write.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-publish-version.js","sourceRoot":"","sources":["../../../src/lib/flow-publish-version.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport {\n coerceText,\n deepGet,\n isRecord,\n loadRowsFromFile,\n type JsonRecord,\n} from './flow-governance.js';\nimport type { FetchLike, ResponseLike } from './http.js';\nimport {\n createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n runSupabaseMutation,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_MAX_WORKERS = 4;\nconst LEGACY_OUTPUT_PREFIX = 'flows_tidas_sdk_plus_classification';\n\ntype FlowPublishMode = 'dry_run' | 'commit';\ntype FlowPublishOperation =\n | 'would_insert'\n | 'would_update_existing'\n | 'insert'\n | 'update_existing'\n | 'update_after_insert_error';\n\ntype FlowPublishFailureReason = {\n validator: 'remote_rest';\n stage: string;\n path: string;\n message: string;\n code: string;\n visible_user_id?: string;\n visible_state_code?: string;\n};\n\ntype VisibleFlowRow = {\n id: string;\n version: string;\n user_id: string;\n state_code: number | null;\n};\n\ntype SupabaseDataClient = ReturnType<typeof createSupabaseDataClient>['client'];\n\ntype FlowPublishFailureRow = {\n id: unknown;\n user_id: unknown;\n json_ordered: JsonRecord;\n reason: FlowPublishFailureReason[];\n state_code: unknown;\n};\n\ntype FlowPublishSuccessRow = {\n id: string;\n version: string;\n operation: FlowPublishOperation;\n};\n\ntype FlowPublishFiles = {\n successList: string;\n remoteFailed: string;\n report: string;\n};\n\ntype FlowPublishOutcome =\n | {\n status: 'success';\n success: FlowPublishSuccessRow;\n }\n | {\n status: 'failure';\n failure: FlowPublishFailureRow;\n };\n\nexport type FlowPublishVersionReport = {\n schema_version: 1;\n generated_at_utc: string;\n status:\n | 'prepared_flow_publish_version'\n | 'completed_flow_publish_version'\n | 'completed_flow_publish_version_with_failures';\n mode: FlowPublishMode;\n input_file: string;\n out_dir: string;\n counts: {\n total_rows: number;\n success_count: number;\n failure_count: number;\n };\n operation_counts: Record<string, number>;\n max_workers: number;\n limit: number | null;\n target_user_id_override: string | null;\n files: {\n success_list: string;\n remote_failed: string;\n report: string;\n };\n};\n\nexport type RunFlowPublishVersionOptions = {\n inputFile: string;\n outDir: string;\n commit?: boolean;\n maxWorkers?: number;\n limit?: number;\n targetUserId?: string | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\nfunction normalize_token(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction assert_input_file(inputFile: string): string {\n const resolved = path.resolve(inputFile);\n if (!inputFile) {\n throw new CliError('Missing required --input-file value.', {\n code: 'FLOW_PUBLISH_VERSION_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n if (!existsSync(resolved)) {\n throw new CliError(`Flow publish-version input file not found: ${resolved}`, {\n code: 'FLOW_PUBLISH_VERSION_INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n return resolved;\n}\n\nfunction assert_out_dir(outDir: string): string {\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_PUBLISH_VERSION_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n return path.resolve(outDir);\n}\n\nfunction to_positive_integer(\n value: number | undefined,\n label: string,\n code: string,\n defaultValue: number,\n): number {\n if (value === undefined) {\n return defaultValue;\n }\n if (!Number.isInteger(value) || value <= 0) {\n throw new CliError(`Expected ${label} to be a positive integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction to_non_negative_integer(\n value: number | undefined,\n label: string,\n code: string,\n): number | null {\n if (value === undefined) {\n return null;\n }\n if (!Number.isInteger(value) || value < 0) {\n throw new CliError(`Expected ${label} to be a non-negative integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction build_output_files(outDir: string): FlowPublishFiles {\n return {\n successList: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_mcp_success_list.json`),\n remoteFailed: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_remote_validation_failed.jsonl`),\n report: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_mcp_sync_report.json`),\n };\n}\n\nfunction flow_payload(row: JsonRecord): JsonRecord {\n if (isRecord(row.json_ordered)) {\n return row.json_ordered;\n }\n if (isRecord(row.jsonOrdered)) {\n return row.jsonOrdered;\n }\n if (isRecord(row.json)) {\n return row.json;\n }\n if (isRecord(row.flowDataSet)) {\n return row;\n }\n throw new CliError(\n 'Flow row is missing json_ordered/jsonOrdered/json or a top-level flowDataSet payload.',\n {\n code: 'FLOW_PUBLISH_VERSION_PAYLOAD_REQUIRED',\n exitCode: 2,\n },\n );\n}\n\nfunction flow_id(row: JsonRecord, payload: JsonRecord): string {\n return (\n coerceText(row.id) ||\n coerceText(\n deepGet(payload, ['flowDataSet', 'flowInformation', 'dataSetInformation', 'common:UUID']),\n )\n );\n}\n\nfunction flow_version(payload: JsonRecord): string {\n const version = coerceText(\n deepGet(payload, [\n 'flowDataSet',\n 'administrativeInformation',\n 'publicationAndOwnership',\n 'common:dataSetVersion',\n ]),\n );\n if (!version) {\n throw new CliError(\n 'Flow payload is missing flowDataSet.administrativeInformation.publicationAndOwnership.common:dataSetVersion.',\n {\n code: 'FLOW_PUBLISH_VERSION_MISSING_VERSION',\n exitCode: 2,\n },\n );\n }\n return version;\n}\n\nfunction resolve_target_user_id(\n row: JsonRecord,\n targetUserIdOverride: string | null,\n): string | null {\n return normalize_token(coerceText(row.user_id)) ?? targetUserIdOverride;\n}\n\nfunction build_visible_rows_url(restBaseUrl: string, id: string, version: string): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/flows`);\n url.searchParams.set('select', 'id,version,user_id,state_code');\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction build_update_url(restBaseUrl: string, id: string, version: string): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/flows`);\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nasync function parse_response(response: ResponseLike, url: string): Promise<unknown> {\n const rawText = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n\n if (!response.ok) {\n throw new CliError(`HTTP ${response.status} returned from ${url}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: rawText,\n });\n }\n\n if (!rawText) {\n return null;\n }\n\n if (contentType.includes('application/json')) {\n try {\n return JSON.parse(rawText);\n } catch (error) {\n throw new CliError(`Remote response was not valid JSON for ${url}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n }\n\n return rawText;\n}\n\nfunction parse_visible_rows(payload: unknown, url: string): VisibleFlowRow[] {\n if (!Array.isArray(payload)) {\n throw new CliError(`Supabase REST response was not a JSON array for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload.map((item, index) => {\n if (!isRecord(item)) {\n throw new CliError(`Supabase REST row ${index} was not a JSON object for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: item,\n });\n }\n\n return {\n id: coerceText(item.id),\n version: coerceText(item.version),\n user_id: coerceText(item.user_id),\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n };\n });\n}\n\nasync function visible_exact_rows(options: {\n client: SupabaseDataClient;\n restBaseUrl: string;\n id: string;\n version: string;\n}): Promise<VisibleFlowRow[]> {\n const url = build_visible_rows_url(options.restBaseUrl, options.id, options.version);\n const payload = await runSupabaseArrayQuery(\n options.client\n .from('flows')\n .select('id,version,user_id,state_code')\n .eq('id', options.id)\n .eq('version', options.version),\n url,\n );\n return parse_visible_rows(payload, url);\n}\n\nfunction own_visible_row(\n rows: VisibleFlowRow[],\n targetUserId: string | null,\n): VisibleFlowRow | null {\n if (!targetUserId) {\n return null;\n }\n return rows.find((row) => row.user_id === targetUserId) ?? null;\n}\n\nfunction visible_conflict_reasons(\n stage: string,\n visibleRows: VisibleFlowRow[],\n targetUserId: string | null,\n): FlowPublishFailureReason[] {\n if (visibleRows.length === 0) {\n return [];\n }\n\n if (!targetUserId) {\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message:\n 'Exact UUID/version is already visible, but no target user id was available to determine whether the row is writable.',\n code: 'target_user_id_required',\n },\n ];\n }\n\n return visibleRows.map((row) => ({\n validator: 'remote_rest',\n stage,\n path: '',\n message: 'Exact UUID/version is already visible but not writable under the target user.',\n code: 'exact_version_visible_not_owned',\n visible_user_id: row.user_id,\n visible_state_code: row.state_code === null ? '' : String(row.state_code),\n }));\n}\n\nfunction failure_row(\n sourceRow: JsonRecord,\n reasons: FlowPublishFailureReason[],\n): FlowPublishFailureRow {\n let payload: JsonRecord;\n try {\n payload = flow_payload(sourceRow);\n } catch {\n payload = {};\n }\n return {\n id: sourceRow.id,\n user_id: sourceRow.user_id,\n json_ordered: payload,\n reason: reasons,\n state_code: sourceRow.state_code,\n };\n}\n\nfunction build_error_reasons(stage: string, error: unknown): FlowPublishFailureReason[] {\n if (error instanceof CliError) {\n const detailText = typeof error.details === 'string' ? error.details.trim() : error.message;\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message: detailText || error.message,\n code: error.code,\n },\n ];\n }\n\n if (error instanceof Error) {\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message: error.message,\n code: error.name || 'Error',\n },\n ];\n }\n\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message: String(error),\n code: 'UnknownError',\n },\n ];\n}\n\nasync function insert_flow_version(options: {\n client: SupabaseDataClient;\n restBaseUrl: string;\n rowId: string;\n payload: JsonRecord;\n}): Promise<void> {\n const url = `${options.restBaseUrl.replace(/\\/+$/u, '')}/flows`;\n await runSupabaseMutation(\n options.client.from('flows').insert({\n id: options.rowId,\n json_ordered: options.payload,\n }),\n url,\n );\n}\n\nasync function update_flow_version(options: {\n client: SupabaseDataClient;\n restBaseUrl: string;\n rowId: string;\n version: string;\n payload: JsonRecord;\n}): Promise<void> {\n const url = build_update_url(options.restBaseUrl, options.rowId, options.version);\n await runSupabaseMutation(\n options.client\n .from('flows')\n .update({\n json_ordered: options.payload,\n })\n .eq('id', options.rowId)\n .eq('version', options.version),\n url,\n );\n}\n\nasync function sync_one_row(options: {\n row: JsonRecord;\n mode: FlowPublishMode;\n client: SupabaseDataClient;\n restBaseUrl: string;\n targetUserIdOverride: string | null;\n}): Promise<FlowPublishOutcome> {\n try {\n const payload = flow_payload(options.row);\n const rowId = flow_id(options.row, payload);\n if (!rowId) {\n throw new CliError('Flow row is missing a resolvable id/common:UUID value.', {\n code: 'FLOW_PUBLISH_VERSION_ID_REQUIRED',\n exitCode: 2,\n });\n }\n const version = flow_version(payload);\n const targetUserId = resolve_target_user_id(options.row, options.targetUserIdOverride);\n const visibleBefore = await visible_exact_rows({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n id: rowId,\n version,\n });\n const ownBefore = own_visible_row(visibleBefore, targetUserId);\n\n if (options.mode === 'dry_run') {\n if (ownBefore) {\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'would_update_existing',\n },\n };\n }\n\n if (visibleBefore.length > 0) {\n return {\n status: 'failure',\n failure: failure_row(\n options.row,\n visible_conflict_reasons('dry_run_preflight', visibleBefore, targetUserId),\n ),\n };\n }\n\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'would_insert',\n },\n };\n }\n\n if (ownBefore) {\n await update_flow_version({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n rowId,\n version,\n payload,\n });\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'update_existing',\n },\n };\n }\n\n if (visibleBefore.length > 0) {\n return {\n status: 'failure',\n failure: failure_row(\n options.row,\n visible_conflict_reasons('preflight', visibleBefore, targetUserId),\n ),\n };\n }\n\n try {\n await insert_flow_version({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n rowId,\n payload,\n });\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'insert',\n },\n };\n } catch (error) {\n const visibleAfter = await visible_exact_rows({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n id: rowId,\n version,\n });\n const ownAfter = own_visible_row(visibleAfter, targetUserId);\n if (ownAfter) {\n try {\n await update_flow_version({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n rowId,\n version,\n payload,\n });\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'update_after_insert_error',\n },\n };\n } catch (updateError) {\n return {\n status: 'failure',\n failure: failure_row(options.row, [\n ...build_error_reasons('insert', error),\n ...build_error_reasons('update_after_insert_error', updateError),\n ]),\n };\n }\n }\n\n return {\n status: 'failure',\n failure: failure_row(options.row, [\n ...build_error_reasons('insert', error),\n ...visible_conflict_reasons('post_insert_error_preflight', visibleAfter, targetUserId),\n ]),\n };\n }\n } catch (error) {\n return {\n status: 'failure',\n failure: failure_row(options.row, build_error_reasons('sync_one_unhandled', error)),\n };\n }\n}\n\nasync function map_with_concurrency<T, R>(\n items: T[],\n maxWorkers: number,\n worker: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n const workerCount = Math.min(Math.max(1, maxWorkers), Math.max(items.length, 1));\n let nextIndex = 0;\n\n async function runWorker(): Promise<void> {\n while (true) {\n const currentIndex = nextIndex;\n nextIndex += 1;\n if (currentIndex >= items.length) {\n return;\n }\n results[currentIndex] = await worker(items[currentIndex] as T, currentIndex);\n }\n }\n\n await Promise.all(Array.from({ length: workerCount }, () => runWorker()));\n return results;\n}\n\nfunction status_from_mode(\n mode: FlowPublishMode,\n failureCount: number,\n): FlowPublishVersionReport['status'] {\n if (mode === 'dry_run') {\n return 'prepared_flow_publish_version';\n }\n return failureCount > 0\n ? 'completed_flow_publish_version_with_failures'\n : 'completed_flow_publish_version';\n}\n\nexport async function runFlowPublishVersion(\n options: RunFlowPublishVersionOptions,\n): Promise<FlowPublishVersionReport> {\n const inputFile = assert_input_file(options.inputFile);\n const outDir = assert_out_dir(options.outDir);\n const mode: FlowPublishMode = options.commit ? 'commit' : 'dry_run';\n const maxWorkers = to_positive_integer(\n options.maxWorkers,\n '--max-workers',\n 'FLOW_PUBLISH_VERSION_MAX_WORKERS_INVALID',\n DEFAULT_MAX_WORKERS,\n );\n const limit = to_non_negative_integer(\n options.limit,\n '--limit',\n 'FLOW_PUBLISH_VERSION_LIMIT_INVALID',\n );\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const now = options.now ?? new Date();\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now,\n });\n const { client, restBaseUrl } = createSupabaseDataClient(runtime, fetchImpl, timeoutMs);\n const targetUserIdOverride = normalize_token(options.targetUserId ?? null);\n const files = build_output_files(outDir);\n\n let rows = loadRowsFromFile(inputFile);\n if (limit !== null && limit > 0) {\n rows = rows.slice(0, limit);\n }\n if (rows.length === 0) {\n throw new CliError(`No rows found in ${inputFile}`, {\n code: 'FLOW_PUBLISH_VERSION_EMPTY_INPUT',\n exitCode: 2,\n });\n }\n\n const outcomes = await map_with_concurrency(rows, maxWorkers, async (row) =>\n sync_one_row({\n row,\n mode,\n client,\n restBaseUrl,\n targetUserIdOverride,\n }),\n );\n\n const successes: FlowPublishSuccessRow[] = [];\n const failures: FlowPublishFailureRow[] = [];\n const operationCounts: Record<string, number> = {};\n\n for (const outcome of outcomes) {\n if (outcome.status === 'success') {\n successes.push(outcome.success);\n operationCounts[outcome.success.operation] =\n (operationCounts[outcome.success.operation] ?? 0) + 1;\n } else {\n failures.push(outcome.failure);\n }\n }\n\n await writeJsonArtifact(files.successList, successes);\n await writeJsonLinesArtifact(files.remoteFailed, failures);\n\n const report: FlowPublishVersionReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n status: status_from_mode(mode, failures.length),\n mode,\n input_file: inputFile,\n out_dir: outDir,\n counts: {\n total_rows: rows.length,\n success_count: successes.length,\n failure_count: failures.length,\n },\n operation_counts: operationCounts,\n max_workers: maxWorkers,\n limit,\n target_user_id_override: targetUserIdOverride,\n files: {\n success_list: files.successList,\n remote_failed: files.remoteFailed,\n report: files.report,\n },\n };\n\n await writeJsonArtifact(files.report, report);\n return report;\n}\n\nexport const __testInternals = {\n assert_input_file,\n assert_out_dir,\n to_positive_integer,\n to_non_negative_integer,\n build_output_files,\n flow_payload,\n flow_id,\n flow_version,\n resolve_target_user_id,\n build_visible_rows_url,\n build_update_url,\n parse_response,\n parse_visible_rows,\n visible_conflict_reasons,\n failure_row,\n build_error_reasons,\n map_with_concurrency,\n status_from_mode,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"flow-publish-version.js","sourceRoot":"","sources":["../../../src/lib/flow-publish-version.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { createDatasetCommandClient, type DatasetCommandClient } from './dataset-command.js';\nimport { readRuntimeEnv } from './env.js';\nimport { CliError } from './errors.js';\nimport {\n coerceText,\n deepGet,\n isRecord,\n loadRowsFromFile,\n type JsonRecord,\n} from './flow-governance.js';\nimport type { FetchLike, ResponseLike } from './http.js';\nimport {\n createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_MAX_WORKERS = 4;\nconst LEGACY_OUTPUT_PREFIX = 'flows_tidas_sdk_plus_classification';\n\ntype FlowPublishMode = 'dry_run' | 'commit';\ntype FlowPublishOperation =\n | 'would_insert'\n | 'would_update_existing'\n | 'insert'\n | 'update_existing'\n | 'update_after_insert_error';\n\ntype FlowPublishFailureReason = {\n validator: 'remote_rest';\n stage: string;\n path: string;\n message: string;\n code: string;\n visible_user_id?: string;\n visible_state_code?: string;\n};\n\ntype VisibleFlowRow = {\n id: string;\n version: string;\n user_id: string;\n state_code: number | null;\n};\n\ntype SupabaseDataClient = ReturnType<typeof createSupabaseDataClient>['client'];\n\ntype FlowPublishFailureRow = {\n id: unknown;\n user_id: unknown;\n json_ordered: JsonRecord;\n reason: FlowPublishFailureReason[];\n state_code: unknown;\n};\n\ntype FlowPublishSuccessRow = {\n id: string;\n version: string;\n operation: FlowPublishOperation;\n};\n\ntype FlowPublishFiles = {\n successList: string;\n remoteFailed: string;\n report: string;\n};\n\ntype FlowPublishOutcome =\n | {\n status: 'success';\n success: FlowPublishSuccessRow;\n }\n | {\n status: 'failure';\n failure: FlowPublishFailureRow;\n };\n\nexport type FlowPublishVersionReport = {\n schema_version: 1;\n generated_at_utc: string;\n status:\n | 'prepared_flow_publish_version'\n | 'completed_flow_publish_version'\n | 'completed_flow_publish_version_with_failures';\n mode: FlowPublishMode;\n input_file: string;\n out_dir: string;\n counts: {\n total_rows: number;\n success_count: number;\n failure_count: number;\n };\n operation_counts: Record<string, number>;\n max_workers: number;\n limit: number | null;\n target_user_id_override: string | null;\n files: {\n success_list: string;\n remote_failed: string;\n report: string;\n };\n};\n\nexport type RunFlowPublishVersionOptions = {\n inputFile: string;\n outDir: string;\n commit?: boolean;\n maxWorkers?: number;\n limit?: number;\n targetUserId?: string | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\nfunction normalize_token(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction assert_input_file(inputFile: string): string {\n const resolved = path.resolve(inputFile);\n if (!inputFile) {\n throw new CliError('Missing required --input-file value.', {\n code: 'FLOW_PUBLISH_VERSION_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n if (!existsSync(resolved)) {\n throw new CliError(`Flow publish-version input file not found: ${resolved}`, {\n code: 'FLOW_PUBLISH_VERSION_INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n return resolved;\n}\n\nfunction assert_out_dir(outDir: string): string {\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_PUBLISH_VERSION_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n return path.resolve(outDir);\n}\n\nfunction to_positive_integer(\n value: number | undefined,\n label: string,\n code: string,\n defaultValue: number,\n): number {\n if (value === undefined) {\n return defaultValue;\n }\n if (!Number.isInteger(value) || value <= 0) {\n throw new CliError(`Expected ${label} to be a positive integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction to_non_negative_integer(\n value: number | undefined,\n label: string,\n code: string,\n): number | null {\n if (value === undefined) {\n return null;\n }\n if (!Number.isInteger(value) || value < 0) {\n throw new CliError(`Expected ${label} to be a non-negative integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction build_output_files(outDir: string): FlowPublishFiles {\n return {\n successList: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_mcp_success_list.json`),\n remoteFailed: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_remote_validation_failed.jsonl`),\n report: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_mcp_sync_report.json`),\n };\n}\n\nfunction flow_payload(row: JsonRecord): JsonRecord {\n if (isRecord(row.json_ordered)) {\n return row.json_ordered;\n }\n if (isRecord(row.jsonOrdered)) {\n return row.jsonOrdered;\n }\n if (isRecord(row.json)) {\n return row.json;\n }\n if (isRecord(row.flowDataSet)) {\n return row;\n }\n throw new CliError(\n 'Flow row is missing json_ordered/jsonOrdered/json or a top-level flowDataSet payload.',\n {\n code: 'FLOW_PUBLISH_VERSION_PAYLOAD_REQUIRED',\n exitCode: 2,\n },\n );\n}\n\nfunction flow_id(row: JsonRecord, payload: JsonRecord): string {\n return (\n coerceText(row.id) ||\n coerceText(\n deepGet(payload, ['flowDataSet', 'flowInformation', 'dataSetInformation', 'common:UUID']),\n )\n );\n}\n\nfunction flow_version(payload: JsonRecord): string {\n const version = coerceText(\n deepGet(payload, [\n 'flowDataSet',\n 'administrativeInformation',\n 'publicationAndOwnership',\n 'common:dataSetVersion',\n ]),\n );\n if (!version) {\n throw new CliError(\n 'Flow payload is missing flowDataSet.administrativeInformation.publicationAndOwnership.common:dataSetVersion.',\n {\n code: 'FLOW_PUBLISH_VERSION_MISSING_VERSION',\n exitCode: 2,\n },\n );\n }\n return version;\n}\n\nfunction resolve_target_user_id(\n row: JsonRecord,\n targetUserIdOverride: string | null,\n): string | null {\n return normalize_token(coerceText(row.user_id)) ?? targetUserIdOverride;\n}\n\nfunction build_visible_rows_url(restBaseUrl: string, id: string, version: string): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/flows`);\n url.searchParams.set('select', 'id,version,user_id,state_code');\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction build_update_url(restBaseUrl: string, id: string, version: string): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/flows`);\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nasync function parse_response(response: ResponseLike, url: string): Promise<unknown> {\n const rawText = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n\n if (!response.ok) {\n throw new CliError(`HTTP ${response.status} returned from ${url}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: rawText,\n });\n }\n\n if (!rawText) {\n return null;\n }\n\n if (contentType.includes('application/json')) {\n try {\n return JSON.parse(rawText);\n } catch (error) {\n throw new CliError(`Remote response was not valid JSON for ${url}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n }\n\n return rawText;\n}\n\nfunction parse_visible_rows(payload: unknown, url: string): VisibleFlowRow[] {\n if (!Array.isArray(payload)) {\n throw new CliError(`Supabase REST response was not a JSON array for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload.map((item, index) => {\n if (!isRecord(item)) {\n throw new CliError(`Supabase REST row ${index} was not a JSON object for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: item,\n });\n }\n\n return {\n id: coerceText(item.id),\n version: coerceText(item.version),\n user_id: coerceText(item.user_id),\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n };\n });\n}\n\nasync function visible_exact_rows(options: {\n client: SupabaseDataClient;\n restBaseUrl: string;\n id: string;\n version: string;\n}): Promise<VisibleFlowRow[]> {\n const url = build_visible_rows_url(options.restBaseUrl, options.id, options.version);\n const payload = await runSupabaseArrayQuery(\n options.client\n .from('flows')\n .select('id,version,user_id,state_code')\n .eq('id', options.id)\n .eq('version', options.version),\n url,\n );\n return parse_visible_rows(payload, url);\n}\n\nfunction own_visible_row(\n rows: VisibleFlowRow[],\n targetUserId: string | null,\n): VisibleFlowRow | null {\n if (!targetUserId) {\n return null;\n }\n return rows.find((row) => row.user_id === targetUserId) ?? null;\n}\n\nfunction visible_conflict_reasons(\n stage: string,\n visibleRows: VisibleFlowRow[],\n targetUserId: string | null,\n): FlowPublishFailureReason[] {\n if (visibleRows.length === 0) {\n return [];\n }\n\n if (!targetUserId) {\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message:\n 'Exact UUID/version is already visible, but no target user id was available to determine whether the row is writable.',\n code: 'target_user_id_required',\n },\n ];\n }\n\n return visibleRows.map((row) => ({\n validator: 'remote_rest',\n stage,\n path: '',\n message: 'Exact UUID/version is already visible but not writable under the target user.',\n code: 'exact_version_visible_not_owned',\n visible_user_id: row.user_id,\n visible_state_code: row.state_code === null ? '' : String(row.state_code),\n }));\n}\n\nfunction failure_row(\n sourceRow: JsonRecord,\n reasons: FlowPublishFailureReason[],\n): FlowPublishFailureRow {\n let payload: JsonRecord;\n try {\n payload = flow_payload(sourceRow);\n } catch {\n payload = {};\n }\n return {\n id: sourceRow.id,\n user_id: sourceRow.user_id,\n json_ordered: payload,\n reason: reasons,\n state_code: sourceRow.state_code,\n };\n}\n\nfunction build_error_reasons(stage: string, error: unknown): FlowPublishFailureReason[] {\n if (error instanceof CliError) {\n const detailText = typeof error.details === 'string' ? error.details.trim() : error.message;\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message: detailText || error.message,\n code: error.code,\n },\n ];\n }\n\n if (error instanceof Error) {\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message: error.message,\n code: error.name || 'Error',\n },\n ];\n }\n\n return [\n {\n validator: 'remote_rest',\n stage,\n path: '',\n message: String(error),\n code: 'UnknownError',\n },\n ];\n}\n\nasync function insert_flow_version(options: {\n commandClient: DatasetCommandClient;\n rowId: string;\n payload: JsonRecord;\n}): Promise<void> {\n await options.commandClient.create({\n table: 'flows',\n id: options.rowId,\n jsonOrdered: options.payload,\n });\n}\n\nasync function update_flow_version(options: {\n commandClient: DatasetCommandClient;\n rowId: string;\n version: string;\n payload: JsonRecord;\n}): Promise<void> {\n await options.commandClient.saveDraft({\n table: 'flows',\n id: options.rowId,\n version: options.version,\n jsonOrdered: options.payload,\n });\n}\n\nasync function sync_one_row(options: {\n row: JsonRecord;\n mode: FlowPublishMode;\n client: SupabaseDataClient;\n commandClient: DatasetCommandClient;\n restBaseUrl: string;\n targetUserIdOverride: string | null;\n}): Promise<FlowPublishOutcome> {\n try {\n const payload = flow_payload(options.row);\n const rowId = flow_id(options.row, payload);\n if (!rowId) {\n throw new CliError('Flow row is missing a resolvable id/common:UUID value.', {\n code: 'FLOW_PUBLISH_VERSION_ID_REQUIRED',\n exitCode: 2,\n });\n }\n const version = flow_version(payload);\n const targetUserId = resolve_target_user_id(options.row, options.targetUserIdOverride);\n const visibleBefore = await visible_exact_rows({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n id: rowId,\n version,\n });\n const ownBefore = own_visible_row(visibleBefore, targetUserId);\n\n if (options.mode === 'dry_run') {\n if (ownBefore) {\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'would_update_existing',\n },\n };\n }\n\n if (visibleBefore.length > 0) {\n return {\n status: 'failure',\n failure: failure_row(\n options.row,\n visible_conflict_reasons('dry_run_preflight', visibleBefore, targetUserId),\n ),\n };\n }\n\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'would_insert',\n },\n };\n }\n\n if (ownBefore) {\n await update_flow_version({\n commandClient: options.commandClient,\n rowId,\n version,\n payload,\n });\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'update_existing',\n },\n };\n }\n\n if (visibleBefore.length > 0) {\n return {\n status: 'failure',\n failure: failure_row(\n options.row,\n visible_conflict_reasons('preflight', visibleBefore, targetUserId),\n ),\n };\n }\n\n try {\n await insert_flow_version({\n commandClient: options.commandClient,\n rowId,\n payload,\n });\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'insert',\n },\n };\n } catch (error) {\n const visibleAfter = await visible_exact_rows({\n client: options.client,\n restBaseUrl: options.restBaseUrl,\n id: rowId,\n version,\n });\n const ownAfter = own_visible_row(visibleAfter, targetUserId);\n if (ownAfter) {\n try {\n await update_flow_version({\n commandClient: options.commandClient,\n rowId,\n version,\n payload,\n });\n return {\n status: 'success',\n success: {\n id: rowId,\n version,\n operation: 'update_after_insert_error',\n },\n };\n } catch (updateError) {\n return {\n status: 'failure',\n failure: failure_row(options.row, [\n ...build_error_reasons('insert', error),\n ...build_error_reasons('update_after_insert_error', updateError),\n ]),\n };\n }\n }\n\n return {\n status: 'failure',\n failure: failure_row(options.row, [\n ...build_error_reasons('insert', error),\n ...visible_conflict_reasons('post_insert_error_preflight', visibleAfter, targetUserId),\n ]),\n };\n }\n } catch (error) {\n return {\n status: 'failure',\n failure: failure_row(options.row, build_error_reasons('sync_one_unhandled', error)),\n };\n }\n}\n\nasync function map_with_concurrency<T, R>(\n items: T[],\n maxWorkers: number,\n worker: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n const workerCount = Math.min(Math.max(1, maxWorkers), Math.max(items.length, 1));\n let nextIndex = 0;\n\n async function runWorker(): Promise<void> {\n while (true) {\n const currentIndex = nextIndex;\n nextIndex += 1;\n if (currentIndex >= items.length) {\n return;\n }\n results[currentIndex] = await worker(items[currentIndex] as T, currentIndex);\n }\n }\n\n await Promise.all(Array.from({ length: workerCount }, () => runWorker()));\n return results;\n}\n\nfunction status_from_mode(\n mode: FlowPublishMode,\n failureCount: number,\n): FlowPublishVersionReport['status'] {\n if (mode === 'dry_run') {\n return 'prepared_flow_publish_version';\n }\n return failureCount > 0\n ? 'completed_flow_publish_version_with_failures'\n : 'completed_flow_publish_version';\n}\n\nexport async function runFlowPublishVersion(\n options: RunFlowPublishVersionOptions,\n): Promise<FlowPublishVersionReport> {\n const inputFile = assert_input_file(options.inputFile);\n const outDir = assert_out_dir(options.outDir);\n const mode: FlowPublishMode = options.commit ? 'commit' : 'dry_run';\n const maxWorkers = to_positive_integer(\n options.maxWorkers,\n '--max-workers',\n 'FLOW_PUBLISH_VERSION_MAX_WORKERS_INVALID',\n DEFAULT_MAX_WORKERS,\n );\n const limit = to_non_negative_integer(\n options.limit,\n '--limit',\n 'FLOW_PUBLISH_VERSION_LIMIT_INVALID',\n );\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const now = options.now ?? new Date();\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now,\n });\n const { client, restBaseUrl } = createSupabaseDataClient(runtime, fetchImpl, timeoutMs);\n const commandClient = createDatasetCommandClient({\n runtime,\n fetchImpl,\n timeoutMs,\n region: readRuntimeEnv(options.env ?? process.env).region,\n });\n const targetUserIdOverride = normalize_token(options.targetUserId ?? null);\n const files = build_output_files(outDir);\n\n let rows = loadRowsFromFile(inputFile);\n if (limit !== null && limit > 0) {\n rows = rows.slice(0, limit);\n }\n if (rows.length === 0) {\n throw new CliError(`No rows found in ${inputFile}`, {\n code: 'FLOW_PUBLISH_VERSION_EMPTY_INPUT',\n exitCode: 2,\n });\n }\n\n const outcomes = await map_with_concurrency(rows, maxWorkers, async (row) =>\n sync_one_row({\n row,\n mode,\n client,\n commandClient,\n restBaseUrl,\n targetUserIdOverride,\n }),\n );\n\n const successes: FlowPublishSuccessRow[] = [];\n const failures: FlowPublishFailureRow[] = [];\n const operationCounts: Record<string, number> = {};\n\n for (const outcome of outcomes) {\n if (outcome.status === 'success') {\n successes.push(outcome.success);\n operationCounts[outcome.success.operation] =\n (operationCounts[outcome.success.operation] ?? 0) + 1;\n } else {\n failures.push(outcome.failure);\n }\n }\n\n await writeJsonArtifact(files.successList, successes);\n await writeJsonLinesArtifact(files.remoteFailed, failures);\n\n const report: FlowPublishVersionReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n status: status_from_mode(mode, failures.length),\n mode,\n input_file: inputFile,\n out_dir: outDir,\n counts: {\n total_rows: rows.length,\n success_count: successes.length,\n failure_count: failures.length,\n },\n operation_counts: operationCounts,\n max_workers: maxWorkers,\n limit,\n target_user_id_override: targetUserIdOverride,\n files: {\n success_list: files.successList,\n remote_failed: files.remoteFailed,\n report: files.report,\n },\n };\n\n await writeJsonArtifact(files.report, report);\n return report;\n}\n\nexport const __testInternals = {\n assert_input_file,\n assert_out_dir,\n to_positive_integer,\n to_non_negative_integer,\n build_output_files,\n flow_payload,\n flow_id,\n flow_version,\n resolve_target_user_id,\n build_visible_rows_url,\n build_update_url,\n parse_response,\n parse_visible_rows,\n visible_conflict_reasons,\n failure_row,\n build_error_reasons,\n map_with_concurrency,\n status_from_mode,\n};\n"]}
|
package/dist/src/lib/remote.js
CHANGED
|
@@ -2,7 +2,7 @@ import { CliError } from './errors.js';
|
|
|
2
2
|
import { readRuntimeEnv } from './env.js';
|
|
3
3
|
import { postJson } from './http.js';
|
|
4
4
|
import { readJsonInput, stringifyJson } from './io.js';
|
|
5
|
-
import { requireSupabaseRestRuntime } from './supabase-client.js';
|
|
5
|
+
import { deriveSupabaseFunctionsBaseUrl, requireSupabaseRestRuntime } from './supabase-client.js';
|
|
6
6
|
import { resolveSupabaseUserSession } from './supabase-session.js';
|
|
7
7
|
const REMOTE_COMMANDS = {
|
|
8
8
|
'search:flow': {
|
|
@@ -27,7 +27,7 @@ const REMOTE_COMMANDS = {
|
|
|
27
27
|
},
|
|
28
28
|
};
|
|
29
29
|
function buildUrl(baseUrl, endpoint) {
|
|
30
|
-
return `${baseUrl
|
|
30
|
+
return `${deriveSupabaseFunctionsBaseUrl(baseUrl)}/${endpoint}`;
|
|
31
31
|
}
|
|
32
32
|
function buildHeaders(accessToken, includeRegion, region) {
|
|
33
33
|
const headers = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../../src/lib/remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../../src/lib/remote.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport { readRuntimeEnv } from './env.js';\nimport type { FetchLike } from './http.js';\nimport { postJson } from './http.js';\nimport { readJsonInput, stringifyJson } from './io.js';\nimport { deriveSupabaseFunctionsBaseUrl, requireSupabaseRestRuntime } from './supabase-client.js';\nimport { resolveSupabaseUserSession } from './supabase-session.js';\n\ntype RemoteCommandSpec = {\n endpoint: string;\n includeRegion: boolean;\n help: string;\n};\n\nconst REMOTE_COMMANDS: Record<string, RemoteCommandSpec> = {\n 'search:flow': {\n endpoint: 'flow_hybrid_search',\n includeRegion: true,\n help: 'tiangong search flow --input ./request.json [--dry-run] [--json]',\n },\n 'search:process': {\n endpoint: 'process_hybrid_search',\n includeRegion: true,\n help: 'tiangong search process --input ./request.json [--dry-run] [--json]',\n },\n 'search:lifecyclemodel': {\n endpoint: 'lifecyclemodel_hybrid_search',\n includeRegion: true,\n help: 'tiangong search lifecyclemodel --input ./request.json [--dry-run] [--json]',\n },\n 'admin:embedding-run': {\n endpoint: 'embedding_ft',\n includeRegion: false,\n help: 'tiangong admin embedding-run --input ./jobs.json [--dry-run] [--json]',\n },\n};\n\nexport type RemoteCommandOptions = {\n commandKey: keyof typeof REMOTE_COMMANDS;\n inputPath: string;\n env: NodeJS.ProcessEnv;\n timeoutMs: number;\n dryRun: boolean;\n compactJson: boolean;\n fetchImpl: FetchLike;\n};\n\nfunction buildUrl(baseUrl: string, endpoint: string): string {\n return `${deriveSupabaseFunctionsBaseUrl(baseUrl)}/${endpoint}`;\n}\n\nfunction buildHeaders(\n accessToken: string,\n includeRegion: boolean,\n region: string | null,\n): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n };\n if (includeRegion && region) {\n headers['x-region'] = region;\n }\n return headers;\n}\n\nexport async function executeRemoteCommand(options: RemoteCommandOptions): Promise<string> {\n const spec = REMOTE_COMMANDS[options.commandKey];\n if (!spec) {\n throw new CliError(`Unsupported remote command: ${options.commandKey}`, {\n code: 'UNSUPPORTED_REMOTE_COMMAND',\n exitCode: 2,\n });\n }\n\n const runtimeEnv = readRuntimeEnv(options.env);\n const runtime = requireSupabaseRestRuntime(options.env);\n const body = readJsonInput(options.inputPath);\n const url = buildUrl(runtime.apiBaseUrl, spec.endpoint);\n\n if (options.dryRun) {\n const dryRunHeaders = buildHeaders('****', spec.includeRegion, runtimeEnv.region);\n return stringifyJson(\n {\n dryRun: true,\n request: {\n method: 'POST',\n url,\n headers: {\n ...dryRunHeaders,\n },\n inputPath: options.inputPath,\n body,\n timeoutMs: options.timeoutMs,\n },\n },\n options.compactJson,\n );\n }\n\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n const headers = buildHeaders(session.accessToken, spec.includeRegion, runtimeEnv.region);\n const response = await postJson({\n url,\n headers,\n body,\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n });\n return stringifyJson(response, options.compactJson);\n}\n\nexport function getRemoteCommandHelp(commandKey: keyof typeof REMOTE_COMMANDS): string {\n return REMOTE_COMMANDS[commandKey].help;\n}\n"]}
|
|
@@ -80,6 +80,7 @@ export function deriveSupabaseProjectBaseUrl(apiBaseUrl) {
|
|
|
80
80
|
export function deriveSupabaseRestBaseUrl(apiBaseUrl) {
|
|
81
81
|
return `${deriveSupabaseProjectBaseUrl(apiBaseUrl)}/rest/v1`;
|
|
82
82
|
}
|
|
83
|
+
export const deriveSupabaseFunctionsBaseUrl = (apiBaseUrl) => `${deriveSupabaseProjectBaseUrl(apiBaseUrl)}/functions/v1`;
|
|
83
84
|
function mergeSignals(signal, timeoutMs) {
|
|
84
85
|
const timeoutSignal = AbortSignal.timeout(timeoutMs);
|
|
85
86
|
return signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
|
|
@@ -248,8 +249,9 @@ export async function runSupabaseMutation(queryPromise, sourceUrl) {
|
|
|
248
249
|
}
|
|
249
250
|
}
|
|
250
251
|
export function createSupabaseDataClient(runtime, fetchImpl, timeoutMs) {
|
|
252
|
+
const projectBaseUrl = deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl);
|
|
251
253
|
return {
|
|
252
|
-
client: createClient(
|
|
254
|
+
client: createClient(projectBaseUrl, runtime.publishableKey, {
|
|
253
255
|
auth: {
|
|
254
256
|
autoRefreshToken: false,
|
|
255
257
|
persistSession: false,
|
|
@@ -259,7 +261,8 @@ export function createSupabaseDataClient(runtime, fetchImpl, timeoutMs) {
|
|
|
259
261
|
fetch: createSupabaseFetch(fetchImpl, timeoutMs, runtime),
|
|
260
262
|
},
|
|
261
263
|
}),
|
|
262
|
-
restBaseUrl: deriveSupabaseRestBaseUrl(
|
|
264
|
+
restBaseUrl: deriveSupabaseRestBaseUrl(projectBaseUrl),
|
|
265
|
+
functionsBaseUrl: deriveSupabaseFunctionsBaseUrl(projectBaseUrl),
|
|
263
266
|
};
|
|
264
267
|
}
|
|
265
268
|
export const __testInternals = {
|
|
@@ -1 +1 @@
|
|
|
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\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 return {\n client: createClient(deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl), 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(runtime.apiBaseUrl),\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\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,5 +1,7 @@
|
|
|
1
|
+
import { createDatasetCommandClient } from './dataset-command.js';
|
|
2
|
+
import { readRuntimeEnv } from './env.js';
|
|
1
3
|
import { CliError } from './errors.js';
|
|
2
|
-
import { createSupabaseDataClient, requireSupabaseRestRuntime, runSupabaseArrayQuery,
|
|
4
|
+
import { createSupabaseDataClient, requireSupabaseRestRuntime, runSupabaseArrayQuery, } from './supabase-client.js';
|
|
3
5
|
import { createSupabaseDataRuntime } from './supabase-session.js';
|
|
4
6
|
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
5
7
|
function isRecord(value) {
|
|
@@ -54,23 +56,21 @@ async function exactVisibleRows(options) {
|
|
|
54
56
|
return parseVisibleRows(payload, url);
|
|
55
57
|
}
|
|
56
58
|
async function insertJsonOrderedRow(options) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
+
await options.commandClient.create({
|
|
60
|
+
table: options.table,
|
|
59
61
|
id: options.id,
|
|
60
|
-
|
|
61
|
-
...(options.extraData
|
|
62
|
-
})
|
|
62
|
+
jsonOrdered: options.payload,
|
|
63
|
+
...commandOptionsFromExtraData(options.extraData),
|
|
64
|
+
});
|
|
63
65
|
}
|
|
64
66
|
async function updateJsonOrderedRow(options) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
.
|
|
69
|
-
|
|
70
|
-
...(options.extraData
|
|
71
|
-
})
|
|
72
|
-
.eq('id', options.id)
|
|
73
|
-
.eq('version', options.version), url);
|
|
67
|
+
await options.commandClient.saveDraft({
|
|
68
|
+
table: options.table,
|
|
69
|
+
id: options.id,
|
|
70
|
+
version: options.version,
|
|
71
|
+
jsonOrdered: options.payload,
|
|
72
|
+
...commandOptionsFromExtraData(options.extraData),
|
|
73
|
+
});
|
|
74
74
|
}
|
|
75
75
|
function requireNonEmptyToken(value, label, code) {
|
|
76
76
|
const normalized = value.trim();
|
|
@@ -82,6 +82,23 @@ function requireNonEmptyToken(value, label, code) {
|
|
|
82
82
|
}
|
|
83
83
|
return normalized;
|
|
84
84
|
}
|
|
85
|
+
function commandOptionsFromExtraData(extraData) {
|
|
86
|
+
if (!extraData) {
|
|
87
|
+
return {};
|
|
88
|
+
}
|
|
89
|
+
const result = {};
|
|
90
|
+
if ('modelId' in extraData || 'model_id' in extraData) {
|
|
91
|
+
const modelIdValue = extraData.modelId ?? extraData.model_id;
|
|
92
|
+
result.modelId = modelIdValue === null ? null : trimToken(modelIdValue) || null;
|
|
93
|
+
}
|
|
94
|
+
if ('ruleVerification' in extraData || 'rule_verification' in extraData) {
|
|
95
|
+
const ruleVerificationValue = extraData.ruleVerification ?? extraData.rule_verification;
|
|
96
|
+
if (typeof ruleVerificationValue === 'boolean' || ruleVerificationValue === null) {
|
|
97
|
+
result.ruleVerification = ruleVerificationValue;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
85
102
|
export function hasSupabaseRestRuntime(env) {
|
|
86
103
|
if (!env) {
|
|
87
104
|
return false;
|
|
@@ -100,6 +117,12 @@ export async function syncSupabaseJsonOrderedRecord(options) {
|
|
|
100
117
|
timeoutMs,
|
|
101
118
|
});
|
|
102
119
|
const { client, restBaseUrl } = createSupabaseDataClient(runtime, options.fetchImpl, timeoutMs);
|
|
120
|
+
const commandClient = createDatasetCommandClient({
|
|
121
|
+
runtime,
|
|
122
|
+
fetchImpl: options.fetchImpl,
|
|
123
|
+
timeoutMs,
|
|
124
|
+
region: readRuntimeEnv(options.env).region,
|
|
125
|
+
});
|
|
103
126
|
const visibleBefore = await exactVisibleRows({
|
|
104
127
|
client,
|
|
105
128
|
restBaseUrl,
|
|
@@ -115,8 +138,7 @@ export async function syncSupabaseJsonOrderedRecord(options) {
|
|
|
115
138
|
}
|
|
116
139
|
if (visibleBefore.length > 0) {
|
|
117
140
|
await updateJsonOrderedRow({
|
|
118
|
-
|
|
119
|
-
restBaseUrl,
|
|
141
|
+
commandClient,
|
|
120
142
|
table: options.table,
|
|
121
143
|
id,
|
|
122
144
|
version,
|
|
@@ -130,8 +152,7 @@ export async function syncSupabaseJsonOrderedRecord(options) {
|
|
|
130
152
|
}
|
|
131
153
|
try {
|
|
132
154
|
await insertJsonOrderedRow({
|
|
133
|
-
|
|
134
|
-
restBaseUrl,
|
|
155
|
+
commandClient,
|
|
135
156
|
table: options.table,
|
|
136
157
|
id,
|
|
137
158
|
payload: options.payload,
|
|
@@ -160,8 +181,7 @@ export async function syncSupabaseJsonOrderedRecord(options) {
|
|
|
160
181
|
};
|
|
161
182
|
}
|
|
162
183
|
await updateJsonOrderedRow({
|
|
163
|
-
|
|
164
|
-
restBaseUrl,
|
|
184
|
+
commandClient,
|
|
165
185
|
table: options.table,
|
|
166
186
|
id,
|
|
167
187
|
version,
|
|
@@ -179,6 +199,7 @@ export const __testInternals = {
|
|
|
179
199
|
buildUpdateUrl,
|
|
180
200
|
parseVisibleRows,
|
|
181
201
|
exactVisibleRows,
|
|
202
|
+
commandOptionsFromExtraData,
|
|
182
203
|
insertJsonOrderedRow,
|
|
183
204
|
updateJsonOrderedRow,
|
|
184
205
|
requireNonEmptyToken,
|
|
@@ -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 type { FetchLike } from './http.js';\nimport {\n createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n runSupabaseMutation,\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 client: SupabaseDataClient;\n restBaseUrl: string;\n table: SupabaseJsonOrderedTable;\n id: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<void> {\n const url = `${options.restBaseUrl.replace(/\\/+$/u, '')}/${options.table}`;\n await runSupabaseMutation(\n options.client.from(options.table).insert({\n id: options.id,\n json_ordered: options.payload,\n ...(options.extraData ?? {}),\n }),\n url,\n );\n}\n\nasync function updateJsonOrderedRow(options: {\n client: SupabaseDataClient;\n restBaseUrl: string;\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<void> {\n const url = buildUpdateUrl(options.restBaseUrl, options.table, options.id, options.version);\n await runSupabaseMutation(\n options.client\n .from(options.table)\n .update({\n json_ordered: options.payload,\n ...(options.extraData ?? {}),\n })\n .eq('id', options.id)\n .eq('version', options.version),\n url,\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 { 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 client,\n restBaseUrl,\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 client,\n restBaseUrl,\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 client,\n restBaseUrl,\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":["import { createDatasetCommandClient, type DatasetCommandClient } from './dataset-command.js';\nimport { readRuntimeEnv } from './env.js';\nimport { CliError } from './errors.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 commandClient: DatasetCommandClient;\n table: SupabaseJsonOrderedTable;\n id: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<void> {\n await options.commandClient.create({\n table: options.table,\n id: options.id,\n jsonOrdered: options.payload,\n ...commandOptionsFromExtraData(options.extraData),\n });\n}\n\nasync function updateJsonOrderedRow(options: {\n commandClient: DatasetCommandClient;\n table: SupabaseJsonOrderedTable;\n id: string;\n version: string;\n payload: JsonObject;\n extraData?: JsonObject;\n}): Promise<void> {\n await options.commandClient.saveDraft({\n table: options.table,\n id: options.id,\n version: options.version,\n jsonOrdered: options.payload,\n ...commandOptionsFromExtraData(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\nfunction commandOptionsFromExtraData(extraData?: JsonObject): {\n modelId?: string | null;\n ruleVerification?: boolean | null;\n} {\n if (!extraData) {\n return {};\n }\n\n const result: {\n modelId?: string | null;\n ruleVerification?: boolean | null;\n } = {};\n\n if ('modelId' in extraData || 'model_id' in extraData) {\n const modelIdValue = extraData.modelId ?? extraData.model_id;\n result.modelId = modelIdValue === null ? null : trimToken(modelIdValue) || null;\n }\n\n if ('ruleVerification' in extraData || 'rule_verification' in extraData) {\n const ruleVerificationValue = extraData.ruleVerification ?? extraData.rule_verification;\n if (typeof ruleVerificationValue === 'boolean' || ruleVerificationValue === null) {\n result.ruleVerification = ruleVerificationValue;\n }\n }\n\n return result;\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 { client, restBaseUrl } = createSupabaseDataClient(runtime, options.fetchImpl, timeoutMs);\n const commandClient = createDatasetCommandClient({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n region: readRuntimeEnv(options.env).region,\n });\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 commandClient,\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 commandClient,\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 commandClient,\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 commandOptionsFromExtraData,\n insertJsonOrderedRow,\n updateJsonOrderedRow,\n requireNonEmptyToken,\n};\n"]}
|