@tiangong-lca/cli 0.1.5 → 0.1.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"flow-fetch-rows.js","sourceRoot":"","sources":["../../../src/lib/flow-fetch-rows.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport { loadRowsFromFile, type JsonRecord } from './flow-governance.js';\nimport type { FetchLike } from './http.js';\nimport {\n fetchOneFlowRow,\n normalizeSupabaseFlowPayload,\n type SupabaseFlowLookup,\n} from './flow-read.js';\nimport { requireSupabaseRestRuntime } from './supabase-rest.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\nconst FLOW_FETCH_ROWS_TIMEOUT_MS = 10_000;\n\ntype FlowFetchRef = {\n id: string;\n version: string | null;\n userId: string | null;\n stateCode: number | null;\n clusterId: string | null;\n source: string | null;\n};\n\ntype FlowFetchMaterializationContext = {\n input_index: number;\n requested_ref: {\n id: string;\n version: string | null;\n user_id: string | null;\n state_code: number | null;\n cluster_id: string | null;\n source: string | null;\n };\n resolution: SupabaseFlowLookup['resolution'];\n source_url: string;\n resolved_flow_id: string;\n resolved_version: string;\n};\n\ntype FlowFetchSummaryStatus =\n | 'completed_flow_row_materialization'\n | 'completed_flow_row_materialization_with_gaps';\n\nexport type RunFlowFetchRowsOptions = {\n refsFile: string;\n outDir: string;\n allowLatestFallback?: boolean;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\nexport type FlowFetchRowsReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: FlowFetchSummaryStatus;\n refs_file: string;\n out_dir: string;\n allow_latest_fallback: boolean;\n requested_ref_count: number;\n resolved_ref_count: number;\n qa_input_row_count: number;\n duplicate_qa_input_rows_collapsed: number;\n missing_ref_count: number;\n ambiguous_ref_count: number;\n resolution_counts: Record<SupabaseFlowLookup['resolution'], number>;\n files: {\n resolved_flow_rows: string;\n qa_input_rows: string;\n fetch_summary: string;\n missing_flow_refs: string;\n ambiguous_flow_refs: string;\n };\n};\n\nfunction normalizeToken(value: unknown): string | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n const trimmed = String(value).trim();\n return trimmed ? trimmed : null;\n}\n\nfunction normalizeOptionalNonNegativeInteger(\n value: unknown,\n label: string,\n code: string,\n): number | null {\n if (value === undefined || value === null || value === '') {\n return null;\n }\n\n const parsed =\n typeof value === 'number' && Number.isInteger(value)\n ? value\n : Number.parseInt(String(value), 10);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new CliError(`Expected ${label} to be a non-negative integer.`, {\n code,\n exitCode: 2,\n details: value,\n });\n }\n return parsed;\n}\n\nfunction normalizeFlowFetchRef(row: JsonRecord, index: number): FlowFetchRef {\n const id = normalizeToken(row.id);\n if (!id) {\n throw new CliError(`Flow ref row ${index + 1} is missing required id.`, {\n code: 'FLOW_FETCH_ROWS_REF_ID_REQUIRED',\n exitCode: 2,\n details: row,\n });\n }\n\n return {\n id,\n version: normalizeToken(row.version),\n userId: normalizeToken(row.user_id ?? row.userId),\n stateCode: normalizeOptionalNonNegativeInteger(\n row.state_code ?? row.stateCode,\n 'flow ref state_code',\n 'FLOW_FETCH_ROWS_INVALID_STATE_CODE',\n ),\n clusterId: normalizeToken(row.cluster_id ?? row.clusterId),\n source: normalizeToken(row.source),\n };\n}\n\nfunction toRequestedRefSummary(\n ref: FlowFetchRef,\n): FlowFetchMaterializationContext['requested_ref'] {\n return {\n id: ref.id,\n version: ref.version,\n user_id: ref.userId,\n state_code: ref.stateCode,\n cluster_id: ref.clusterId,\n source: ref.source,\n };\n}\n\nfunction buildMaterializedRow(\n lookup: SupabaseFlowLookup,\n context: FlowFetchMaterializationContext,\n): JsonRecord {\n const resolvedFlowId = lookup.row.id || context.requested_ref.id;\n const resolvedVersion = lookup.row.version || context.requested_ref.version || '';\n\n return {\n id: resolvedFlowId,\n version: resolvedVersion,\n user_id: lookup.row.user_id,\n state_code: lookup.row.state_code,\n modified_at: lookup.row.modified_at,\n json: normalizeSupabaseFlowPayload(lookup.row.json, `${resolvedFlowId}@${resolvedVersion}`),\n _materialization: context,\n };\n}\n\nfunction buildQaInputRow(\n row: JsonRecord,\n flowKey: string,\n contexts: FlowFetchMaterializationContext[],\n): JsonRecord {\n return {\n ...row,\n _materialization: {\n flow_key: flowKey,\n materialized_ref_count: contexts.length,\n materialized_from_refs: contexts,\n },\n };\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nexport async function runFlowFetchRows(\n options: RunFlowFetchRowsOptions,\n): Promise<FlowFetchRowsReport> {\n const refsFile = normalizeToken(options.refsFile);\n if (!refsFile) {\n throw new CliError('Missing required --refs-file value.', {\n code: 'FLOW_FETCH_ROWS_REFS_FILE_REQUIRED',\n exitCode: 2,\n });\n }\n\n const outDir = normalizeToken(options.outDir);\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_FETCH_ROWS_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n const resolvedRefsFile = path.resolve(refsFile);\n const resolvedOutDir = path.resolve(outDir);\n const allowLatestFallback = options.allowLatestFallback !== false;\n const rows = loadRowsFromFile(resolvedRefsFile);\n\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? FLOW_FETCH_ROWS_TIMEOUT_MS;\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n });\n\n const resolvedRowArtifacts: JsonRecord[] = [];\n const missingRefs: JsonRecord[] = [];\n const ambiguousRefs: JsonRecord[] = [];\n const qaInputByKey = new Map<\n string,\n { row: JsonRecord; contexts: FlowFetchMaterializationContext[] }\n >();\n const resolutionCounts: FlowFetchRowsReport['resolution_counts'] = {\n remote_supabase_exact: 0,\n remote_supabase_latest: 0,\n remote_supabase_latest_fallback: 0,\n };\n\n for (let index = 0; index < rows.length; index += 1) {\n const ref = normalizeFlowFetchRef(rows[index] as JsonRecord, index);\n const requestedRef = toRequestedRefSummary(ref);\n\n let lookup: SupabaseFlowLookup | null;\n try {\n lookup = await fetchOneFlowRow({\n runtime,\n id: ref.id,\n version: ref.version,\n userId: ref.userId,\n stateCode: ref.stateCode,\n timeoutMs,\n fetchImpl,\n fallbackToLatest: allowLatestFallback && ref.version !== null,\n });\n } catch (error) {\n if (error instanceof CliError && error.code === 'FLOW_GET_AMBIGUOUS') {\n ambiguousRefs.push({\n input_index: index,\n requested_ref: requestedRef,\n code: error.code,\n message: error.message,\n details: error.details,\n });\n continue;\n }\n throw error;\n }\n\n if (!lookup) {\n missingRefs.push({\n input_index: index,\n requested_ref: requestedRef,\n code: 'FLOW_GET_NOT_FOUND',\n message: ref.version\n ? `Could not resolve flow dataset for ${ref.id}@${ref.version}.`\n : `Could not resolve flow dataset for ${ref.id}.`,\n });\n continue;\n }\n\n resolutionCounts[lookup.resolution] += 1;\n const resolvedFlowId = lookup.row.id || ref.id;\n const resolvedVersion = lookup.row.version || ref.version || '';\n const context: FlowFetchMaterializationContext = {\n input_index: index,\n requested_ref: requestedRef,\n resolution: lookup.resolution,\n source_url: lookup.sourceUrl,\n resolved_flow_id: resolvedFlowId,\n resolved_version: resolvedVersion,\n };\n const materializedRow = buildMaterializedRow(lookup, context);\n resolvedRowArtifacts.push(materializedRow);\n\n const flowKey = `${resolvedFlowId}@${resolvedVersion}`;\n const existing = qaInputByKey.get(flowKey);\n if (existing) {\n existing.contexts.push(context);\n } else {\n qaInputByKey.set(flowKey, {\n row: materializedRow,\n contexts: [context],\n });\n }\n }\n\n const qaInputRows = [...qaInputByKey.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([flowKey, entry]) => buildQaInputRow(entry.row, flowKey, entry.contexts));\n\n const duplicateQaInputRowsCollapsed = resolvedRowArtifacts.length - qaInputRows.length;\n const unresolvedRefCount = missingRefs.length + ambiguousRefs.length;\n const status: FlowFetchSummaryStatus =\n unresolvedRefCount > 0\n ? 'completed_flow_row_materialization_with_gaps'\n : 'completed_flow_row_materialization';\n\n const resolvedRowsPath = path.join(resolvedOutDir, 'resolved-flow-rows.jsonl');\n const qaInputRowsPath = path.join(resolvedOutDir, 'qa-input-rows.jsonl');\n const missingRefsPath = path.join(resolvedOutDir, 'missing-flow-refs.jsonl');\n const ambiguousRefsPath = path.join(resolvedOutDir, 'ambiguous-flow-refs.jsonl');\n const summaryPath = path.join(resolvedOutDir, 'fetch-summary.json');\n\n writeJsonLinesArtifact(resolvedRowsPath, resolvedRowArtifacts);\n writeJsonLinesArtifact(qaInputRowsPath, qaInputRows);\n writeJsonLinesArtifact(missingRefsPath, missingRefs);\n writeJsonLinesArtifact(ambiguousRefsPath, ambiguousRefs);\n\n const report: FlowFetchRowsReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status,\n refs_file: resolvedRefsFile,\n out_dir: resolvedOutDir,\n allow_latest_fallback: allowLatestFallback,\n requested_ref_count: rows.length,\n resolved_ref_count: resolvedRowArtifacts.length,\n qa_input_row_count: qaInputRows.length,\n duplicate_qa_input_rows_collapsed: duplicateQaInputRowsCollapsed,\n missing_ref_count: missingRefs.length,\n ambiguous_ref_count: ambiguousRefs.length,\n resolution_counts: resolutionCounts,\n files: {\n resolved_flow_rows: resolvedRowsPath,\n qa_input_rows: qaInputRowsPath,\n fetch_summary: summaryPath,\n missing_flow_refs: missingRefsPath,\n ambiguous_flow_refs: ambiguousRefsPath,\n },\n };\n\n writeJsonArtifact(summaryPath, report);\n return report;\n}\n\nexport const __testInternals = {\n normalizeFlowFetchRef,\n normalizeOptionalNonNegativeInteger,\n normalizeToken,\n toRequestedRefSummary,\n};\n"]}
1
+ {"version":3,"file":"flow-fetch-rows.js","sourceRoot":"","sources":["../../../src/lib/flow-fetch-rows.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport { loadRowsFromFile, type JsonRecord } from './flow-governance.js';\nimport type { FetchLike } from './http.js';\nimport {\n fetchOneFlowRow,\n normalizeSupabaseFlowPayload,\n type SupabaseFlowLookup,\n} from './flow-read.js';\nimport { requireSupabaseRestRuntime } from './supabase-rest.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\nconst FLOW_FETCH_ROWS_TIMEOUT_MS = 10_000;\n\ntype FlowFetchRef = {\n id: string;\n version: string | null;\n userId: string | null;\n stateCode: number | null;\n clusterId: string | null;\n source: string | null;\n};\n\ntype FlowFetchMaterializationContext = {\n input_index: number;\n requested_ref: {\n id: string;\n version: string | null;\n user_id: string | null;\n state_code: number | null;\n cluster_id: string | null;\n source: string | null;\n };\n resolution: SupabaseFlowLookup['resolution'];\n source_url: string;\n resolved_flow_id: string;\n resolved_version: string;\n};\n\ntype FlowFetchSummaryStatus =\n 'completed_flow_row_materialization' | 'completed_flow_row_materialization_with_gaps';\n\nexport type RunFlowFetchRowsOptions = {\n refsFile: string;\n outDir: string;\n allowLatestFallback?: boolean;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\nexport type FlowFetchRowsReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: FlowFetchSummaryStatus;\n refs_file: string;\n out_dir: string;\n allow_latest_fallback: boolean;\n requested_ref_count: number;\n resolved_ref_count: number;\n qa_input_row_count: number;\n duplicate_qa_input_rows_collapsed: number;\n missing_ref_count: number;\n ambiguous_ref_count: number;\n resolution_counts: Record<SupabaseFlowLookup['resolution'], number>;\n files: {\n resolved_flow_rows: string;\n qa_input_rows: string;\n fetch_summary: string;\n missing_flow_refs: string;\n ambiguous_flow_refs: string;\n };\n};\n\nfunction normalizeToken(value: unknown): string | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n const trimmed = String(value).trim();\n return trimmed ? trimmed : null;\n}\n\nfunction normalizeOptionalNonNegativeInteger(\n value: unknown,\n label: string,\n code: string,\n): number | null {\n if (value === undefined || value === null || value === '') {\n return null;\n }\n\n const parsed =\n typeof value === 'number' && Number.isInteger(value)\n ? value\n : Number.parseInt(String(value), 10);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new CliError(`Expected ${label} to be a non-negative integer.`, {\n code,\n exitCode: 2,\n details: value,\n });\n }\n return parsed;\n}\n\nfunction normalizeFlowFetchRef(row: JsonRecord, index: number): FlowFetchRef {\n const id = normalizeToken(row.id);\n if (!id) {\n throw new CliError(`Flow ref row ${index + 1} is missing required id.`, {\n code: 'FLOW_FETCH_ROWS_REF_ID_REQUIRED',\n exitCode: 2,\n details: row,\n });\n }\n\n return {\n id,\n version: normalizeToken(row.version),\n userId: normalizeToken(row.user_id ?? row.userId),\n stateCode: normalizeOptionalNonNegativeInteger(\n row.state_code ?? row.stateCode,\n 'flow ref state_code',\n 'FLOW_FETCH_ROWS_INVALID_STATE_CODE',\n ),\n clusterId: normalizeToken(row.cluster_id ?? row.clusterId),\n source: normalizeToken(row.source),\n };\n}\n\nfunction toRequestedRefSummary(\n ref: FlowFetchRef,\n): FlowFetchMaterializationContext['requested_ref'] {\n return {\n id: ref.id,\n version: ref.version,\n user_id: ref.userId,\n state_code: ref.stateCode,\n cluster_id: ref.clusterId,\n source: ref.source,\n };\n}\n\nfunction buildMaterializedRow(\n lookup: SupabaseFlowLookup,\n context: FlowFetchMaterializationContext,\n): JsonRecord {\n const resolvedFlowId = lookup.row.id || context.requested_ref.id;\n const resolvedVersion = lookup.row.version || context.requested_ref.version || '';\n\n return {\n id: resolvedFlowId,\n version: resolvedVersion,\n user_id: lookup.row.user_id,\n state_code: lookup.row.state_code,\n modified_at: lookup.row.modified_at,\n json: normalizeSupabaseFlowPayload(lookup.row.json, `${resolvedFlowId}@${resolvedVersion}`),\n _materialization: context,\n };\n}\n\nfunction buildQaInputRow(\n row: JsonRecord,\n flowKey: string,\n contexts: FlowFetchMaterializationContext[],\n): JsonRecord {\n return {\n ...row,\n _materialization: {\n flow_key: flowKey,\n materialized_ref_count: contexts.length,\n materialized_from_refs: contexts,\n },\n };\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nexport async function runFlowFetchRows(\n options: RunFlowFetchRowsOptions,\n): Promise<FlowFetchRowsReport> {\n const refsFile = normalizeToken(options.refsFile);\n if (!refsFile) {\n throw new CliError('Missing required --refs-file value.', {\n code: 'FLOW_FETCH_ROWS_REFS_FILE_REQUIRED',\n exitCode: 2,\n });\n }\n\n const outDir = normalizeToken(options.outDir);\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_FETCH_ROWS_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n const resolvedRefsFile = path.resolve(refsFile);\n const resolvedOutDir = path.resolve(outDir);\n const allowLatestFallback = options.allowLatestFallback !== false;\n const rows = loadRowsFromFile(resolvedRefsFile);\n\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? FLOW_FETCH_ROWS_TIMEOUT_MS;\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n });\n\n const resolvedRowArtifacts: JsonRecord[] = [];\n const missingRefs: JsonRecord[] = [];\n const ambiguousRefs: JsonRecord[] = [];\n const qaInputByKey = new Map<\n string,\n { row: JsonRecord; contexts: FlowFetchMaterializationContext[] }\n >();\n const resolutionCounts: FlowFetchRowsReport['resolution_counts'] = {\n remote_supabase_exact: 0,\n remote_supabase_latest: 0,\n remote_supabase_latest_fallback: 0,\n };\n\n for (let index = 0; index < rows.length; index += 1) {\n const ref = normalizeFlowFetchRef(rows[index] as JsonRecord, index);\n const requestedRef = toRequestedRefSummary(ref);\n\n let lookup: SupabaseFlowLookup | null;\n try {\n lookup = await fetchOneFlowRow({\n runtime,\n id: ref.id,\n version: ref.version,\n userId: ref.userId,\n stateCode: ref.stateCode,\n timeoutMs,\n fetchImpl,\n fallbackToLatest: allowLatestFallback && ref.version !== null,\n });\n } catch (error) {\n if (error instanceof CliError && error.code === 'FLOW_GET_AMBIGUOUS') {\n ambiguousRefs.push({\n input_index: index,\n requested_ref: requestedRef,\n code: error.code,\n message: error.message,\n details: error.details,\n });\n continue;\n }\n throw error;\n }\n\n if (!lookup) {\n missingRefs.push({\n input_index: index,\n requested_ref: requestedRef,\n code: 'FLOW_GET_NOT_FOUND',\n message: ref.version\n ? `Could not resolve flow dataset for ${ref.id}@${ref.version}.`\n : `Could not resolve flow dataset for ${ref.id}.`,\n });\n continue;\n }\n\n resolutionCounts[lookup.resolution] += 1;\n const resolvedFlowId = lookup.row.id || ref.id;\n const resolvedVersion = lookup.row.version || ref.version || '';\n const context: FlowFetchMaterializationContext = {\n input_index: index,\n requested_ref: requestedRef,\n resolution: lookup.resolution,\n source_url: lookup.sourceUrl,\n resolved_flow_id: resolvedFlowId,\n resolved_version: resolvedVersion,\n };\n const materializedRow = buildMaterializedRow(lookup, context);\n resolvedRowArtifacts.push(materializedRow);\n\n const flowKey = `${resolvedFlowId}@${resolvedVersion}`;\n const existing = qaInputByKey.get(flowKey);\n if (existing) {\n existing.contexts.push(context);\n } else {\n qaInputByKey.set(flowKey, {\n row: materializedRow,\n contexts: [context],\n });\n }\n }\n\n const qaInputRows = [...qaInputByKey.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([flowKey, entry]) => buildQaInputRow(entry.row, flowKey, entry.contexts));\n\n const duplicateQaInputRowsCollapsed = resolvedRowArtifacts.length - qaInputRows.length;\n const unresolvedRefCount = missingRefs.length + ambiguousRefs.length;\n const status: FlowFetchSummaryStatus =\n unresolvedRefCount > 0\n ? 'completed_flow_row_materialization_with_gaps'\n : 'completed_flow_row_materialization';\n\n const resolvedRowsPath = path.join(resolvedOutDir, 'resolved-flow-rows.jsonl');\n const qaInputRowsPath = path.join(resolvedOutDir, 'qa-input-rows.jsonl');\n const missingRefsPath = path.join(resolvedOutDir, 'missing-flow-refs.jsonl');\n const ambiguousRefsPath = path.join(resolvedOutDir, 'ambiguous-flow-refs.jsonl');\n const summaryPath = path.join(resolvedOutDir, 'fetch-summary.json');\n\n writeJsonLinesArtifact(resolvedRowsPath, resolvedRowArtifacts);\n writeJsonLinesArtifact(qaInputRowsPath, qaInputRows);\n writeJsonLinesArtifact(missingRefsPath, missingRefs);\n writeJsonLinesArtifact(ambiguousRefsPath, ambiguousRefs);\n\n const report: FlowFetchRowsReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status,\n refs_file: resolvedRefsFile,\n out_dir: resolvedOutDir,\n allow_latest_fallback: allowLatestFallback,\n requested_ref_count: rows.length,\n resolved_ref_count: resolvedRowArtifacts.length,\n qa_input_row_count: qaInputRows.length,\n duplicate_qa_input_rows_collapsed: duplicateQaInputRowsCollapsed,\n missing_ref_count: missingRefs.length,\n ambiguous_ref_count: ambiguousRefs.length,\n resolution_counts: resolutionCounts,\n files: {\n resolved_flow_rows: resolvedRowsPath,\n qa_input_rows: qaInputRowsPath,\n fetch_summary: summaryPath,\n missing_flow_refs: missingRefsPath,\n ambiguous_flow_refs: ambiguousRefsPath,\n },\n };\n\n writeJsonArtifact(summaryPath, report);\n return report;\n}\n\nexport const __testInternals = {\n normalizeFlowFetchRef,\n normalizeOptionalNonNegativeInteger,\n normalizeToken,\n toRequestedRefSummary,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"flow-read.js","sourceRoot":"","sources":["../../../src/lib/flow-read.ts"],"names":[],"mappings":"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","sourcesContent":["// data-api-relations: flows\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n buildSupabaseAuthHeaders,\n createSupabaseDataClient,\n runSupabaseArrayQuery,\n type SupabaseDataRuntime,\n} from './supabase-client.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst TYPE_OF_DATASET_QUERY_PATH =\n 'json->flowDataSet->modellingAndValidation->LCIMethod->>typeOfDataSet';\n\nexport type SupabaseFlowRow = {\n id: string;\n version: string;\n user_id: string | null;\n state_code: number | null;\n modified_at: string | null;\n json: unknown;\n};\n\nexport type FlowListQueryFilters = {\n ids?: string[];\n version?: string | null;\n userId?: string | null;\n stateCodes?: number[];\n typeOfDataset?: string[];\n order?: string | null;\n limit?: number | null;\n offset?: number | null;\n};\n\nexport type SupabaseFlowLookup = {\n row: SupabaseFlowRow;\n sourceUrl: string;\n resolution:\n | 'remote_supabase_exact'\n | 'remote_supabase_latest'\n | 'remote_supabase_latest_fallback';\n};\n\ntype QueryWithUrl = {\n url: URL;\n limit: (count: number) => QueryWithUrl;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction buildHeaders(publishableKey: string, accessToken: string): Record<string, string> {\n return buildSupabaseAuthHeaders(publishableKey, accessToken);\n}\n\nfunction normalizeTokenList(values: readonly string[] | undefined): string[] {\n if (!Array.isArray(values)) {\n return [];\n }\n\n const seen = new Set<string>();\n const normalized: string[] = [];\n for (const value of values) {\n const trimmed = typeof value === 'string' ? value.trim() : '';\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n normalized.push(trimmed);\n seen.add(trimmed);\n }\n return normalized;\n}\n\nfunction normalizeStateCodeList(values: readonly number[] | undefined): number[] {\n if (!Array.isArray(values)) {\n return [];\n }\n\n const seen = new Set<number>();\n const normalized: number[] = [];\n for (const value of values) {\n if (!Number.isInteger(value) || value < 0 || seen.has(value)) {\n continue;\n }\n normalized.push(value);\n seen.add(value);\n }\n return normalized;\n}\n\nfunction buildFlowListUrl(restBaseUrl: string, filters: FlowListQueryFilters): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/flows`);\n url.searchParams.set('select', 'id,version,user_id,state_code,modified_at,json');\n\n const ids = normalizeTokenList(filters.ids);\n if (ids.length === 1) {\n url.searchParams.set('id', `eq.${ids[0]}`);\n } else if (ids.length > 1) {\n url.searchParams.set('id', `in.(${ids.join(',')})`);\n }\n\n if (typeof filters.version === 'string' && filters.version.trim()) {\n url.searchParams.set('version', `eq.${filters.version.trim()}`);\n }\n\n if (typeof filters.userId === 'string' && filters.userId.trim()) {\n url.searchParams.set('user_id', `eq.${filters.userId.trim()}`);\n }\n\n const stateCodes = normalizeStateCodeList(filters.stateCodes);\n if (stateCodes.length === 1) {\n url.searchParams.set('state_code', `eq.${stateCodes[0]}`);\n } else if (stateCodes.length > 1) {\n url.searchParams.set('state_code', `in.(${stateCodes.join(',')})`);\n }\n\n const typeOfDataset = normalizeTokenList(filters.typeOfDataset);\n if (typeOfDataset.length === 1) {\n url.searchParams.set(TYPE_OF_DATASET_QUERY_PATH, `eq.${typeOfDataset[0]}`);\n } else if (typeOfDataset.length > 1) {\n url.searchParams.set(TYPE_OF_DATASET_QUERY_PATH, `in.(${typeOfDataset.join(',')})`);\n }\n\n if (typeof filters.order === 'string' && filters.order.trim()) {\n url.searchParams.set('order', filters.order.trim());\n }\n\n if (Number.isInteger(filters.limit) && (filters.limit as number) > 0) {\n url.searchParams.set('limit', String(filters.limit));\n }\n\n if (Number.isInteger(filters.offset) && (filters.offset as number) >= 0) {\n url.searchParams.set('offset', String(filters.offset));\n }\n\n return url.toString();\n}\n\nfunction parseFlowRows(payload: unknown, url: string): SupabaseFlowRow[] {\n if (!Array.isArray(payload)) {\n throw new CliError(`Supabase REST response was not a JSON array for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload.map((item, index) => {\n if (!isRecord(item)) {\n throw new CliError(`Supabase REST row ${index} was not a JSON object for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: item,\n });\n }\n\n return {\n id: typeof item.id === 'string' ? item.id : '',\n version: typeof item.version === 'string' ? item.version : '',\n user_id: typeof item.user_id === 'string' ? item.user_id : null,\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n modified_at: typeof item.modified_at === 'string' ? item.modified_at : null,\n json: item.json,\n };\n });\n}\n\nfunction normalizeSupabaseFlowPayload(payload: unknown, lookupKey: string): JsonObject {\n if (typeof payload === 'string') {\n try {\n const parsed = JSON.parse(payload);\n if (!isRecord(parsed)) {\n throw new CliError(`Supabase REST payload was not a JSON object for ${lookupKey}.`, {\n code: 'SUPABASE_REST_PAYLOAD_INVALID',\n exitCode: 1,\n details: parsed,\n });\n }\n return parsed;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n\n throw new CliError(`Supabase REST payload was not valid JSON for ${lookupKey}.`, {\n code: 'SUPABASE_REST_PAYLOAD_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n }\n\n if (!isRecord(payload)) {\n throw new CliError(`Supabase REST payload was missing json for ${lookupKey}.`, {\n code: 'SUPABASE_REST_PAYLOAD_MISSING',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload;\n}\n\nfunction applyOrder<Query extends { order: (column: string, options?: object) => Query }>(\n query: Query,\n orderValue: string | null | undefined,\n): Query {\n const normalizedOrder = typeof orderValue === 'string' ? orderValue.trim() : '';\n if (!normalizedOrder) {\n return query;\n }\n\n let nextQuery = query;\n for (const rawToken of normalizedOrder.split(',')) {\n const token = rawToken.trim();\n if (!token) {\n continue;\n }\n\n const [column, direction, nulls] = token.split('.');\n if (!column) {\n continue;\n }\n\n nextQuery = nextQuery.order(column, {\n ascending: direction !== 'desc',\n nullsFirst: nulls === 'nullsfirst' ? true : nulls === 'nullslast' ? false : undefined,\n });\n }\n\n return nextQuery;\n}\n\nasync function listFlowRows(options: {\n runtime: SupabaseDataRuntime;\n filters: FlowListQueryFilters;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<{ rows: SupabaseFlowRow[]; sourceUrl: string }> {\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const sourceUrl = buildFlowListUrl(restBaseUrl, options.filters);\n let query = client.from('flows').select('id,version,user_id,state_code,modified_at,json');\n\n const ids = normalizeTokenList(options.filters.ids);\n if (ids.length === 1) {\n query = query.eq('id', ids[0] as string);\n } else if (ids.length > 1) {\n query = query.filter('id', 'in', `(${ids.join(',')})`);\n }\n\n if (typeof options.filters.version === 'string' && options.filters.version.trim()) {\n query = query.eq('version', options.filters.version.trim());\n }\n\n if (typeof options.filters.userId === 'string' && options.filters.userId.trim()) {\n query = query.eq('user_id', options.filters.userId.trim());\n }\n\n const stateCodes = normalizeStateCodeList(options.filters.stateCodes);\n if (stateCodes.length === 1) {\n query = query.eq('state_code', stateCodes[0] as number);\n } else if (stateCodes.length > 1) {\n query = query.filter('state_code', 'in', `(${stateCodes.join(',')})`);\n }\n\n const typeOfDataset = normalizeTokenList(options.filters.typeOfDataset);\n if (typeOfDataset.length === 1) {\n query = query.filter(TYPE_OF_DATASET_QUERY_PATH, 'eq', typeOfDataset[0] as string);\n } else if (typeOfDataset.length > 1) {\n query = query.filter(TYPE_OF_DATASET_QUERY_PATH, 'in', `(${typeOfDataset.join(',')})`);\n }\n\n query = applyOrder(query, options.filters.order ?? null);\n\n const limit =\n Number.isInteger(options.filters.limit) && (options.filters.limit as number) > 0\n ? (options.filters.limit as number)\n : null;\n const offset =\n Number.isInteger(options.filters.offset) && (options.filters.offset as number) >= 0\n ? (options.filters.offset as number)\n : null;\n\n if (limit !== null && offset !== null) {\n query = query.limit(limit);\n (query as unknown as QueryWithUrl).url.searchParams.set('offset', String(offset));\n } else if (limit !== null) {\n query = query.limit(limit);\n }\n\n const rows = parseFlowRows(await runSupabaseArrayQuery(query, sourceUrl), sourceUrl);\n return { rows, sourceUrl };\n}\n\nfunction buildAmbiguousMatchDetails(rows: SupabaseFlowRow[]): Array<{\n id: string;\n version: string;\n user_id: string | null;\n state_code: number | null;\n}> {\n return rows.map((row) => ({\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: row.state_code,\n }));\n}\n\nfunction latestRowsAreAmbiguous(rows: SupabaseFlowRow[]): boolean {\n return rows.length > 1 && rows[0]?.version === rows[1]?.version;\n}\n\nasync function fetchOneFlowRow(options: {\n runtime: SupabaseDataRuntime;\n id: string;\n version?: string | null;\n userId?: string | null;\n stateCode?: number | null;\n timeoutMs: number;\n fetchImpl: FetchLike;\n fallbackToLatest?: boolean;\n}): Promise<SupabaseFlowLookup | null> {\n const stateCodes =\n Number.isInteger(options.stateCode) && (options.stateCode as number) >= 0\n ? [options.stateCode as number]\n : [];\n const sharedFilters = {\n ids: [options.id],\n userId: options.userId ?? null,\n stateCodes,\n } satisfies FlowListQueryFilters;\n\n if (options.version) {\n const exact = await listFlowRows({\n runtime: options.runtime,\n filters: {\n ...sharedFilters,\n version: options.version,\n order: 'version.desc',\n limit: 2,\n offset: 0,\n },\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n });\n\n if (exact.rows.length === 1) {\n return {\n row: exact.rows[0] as SupabaseFlowRow,\n sourceUrl: exact.sourceUrl,\n resolution: 'remote_supabase_exact',\n };\n }\n\n if (exact.rows.length > 1) {\n throw new CliError(\n `Multiple visible flow rows matched ${options.id}@${options.version}. Add a stricter --state-code or --user-id filter.`,\n {\n code: 'FLOW_GET_AMBIGUOUS',\n exitCode: 2,\n details: {\n flow_id: options.id,\n version: options.version,\n matches: buildAmbiguousMatchDetails(exact.rows),\n source_url: exact.sourceUrl,\n },\n },\n );\n }\n\n if (!options.fallbackToLatest) {\n return null;\n }\n }\n\n const latest = await listFlowRows({\n runtime: options.runtime,\n filters: {\n ...sharedFilters,\n order: 'version.desc',\n limit: 2,\n offset: 0,\n },\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n });\n\n if (latest.rows.length === 0) {\n return null;\n }\n\n if (latestRowsAreAmbiguous(latest.rows)) {\n throw new CliError(\n `Multiple visible flow rows matched the latest version for ${options.id}. Add a stricter --state-code or --user-id filter.`,\n {\n code: 'FLOW_GET_AMBIGUOUS',\n exitCode: 2,\n details: {\n flow_id: options.id,\n version: latest.rows[0].version,\n matches: buildAmbiguousMatchDetails(latest.rows),\n source_url: latest.sourceUrl,\n },\n },\n );\n }\n\n return {\n row: latest.rows[0] as SupabaseFlowRow,\n sourceUrl: latest.sourceUrl,\n resolution: options.version ? 'remote_supabase_latest_fallback' : 'remote_supabase_latest',\n };\n}\n\nexport {\n buildFlowListUrl,\n buildHeaders,\n buildAmbiguousMatchDetails,\n fetchOneFlowRow,\n latestRowsAreAmbiguous,\n listFlowRows,\n normalizeStateCodeList,\n normalizeSupabaseFlowPayload,\n normalizeTokenList,\n parseFlowRows,\n};\n\nexport const __testInternals = {\n buildFlowListUrl,\n buildHeaders,\n buildAmbiguousMatchDetails,\n latestRowsAreAmbiguous,\n normalizeStateCodeList,\n normalizeSupabaseFlowPayload,\n normalizeTokenList,\n parseFlowRows,\n};\n\nexport type { SupabaseDataRuntime };\n"]}
1
+ {"version":3,"file":"flow-read.js","sourceRoot":"","sources":["../../../src/lib/flow-read.ts"],"names":[],"mappings":"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","sourcesContent":["// data-api-relations: flows\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n buildSupabaseAuthHeaders,\n createSupabaseDataClient,\n runSupabaseArrayQuery,\n type SupabaseDataRuntime,\n} from './supabase-client.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst TYPE_OF_DATASET_QUERY_PATH =\n 'json->flowDataSet->modellingAndValidation->LCIMethod->>typeOfDataSet';\n\nexport type SupabaseFlowRow = {\n id: string;\n version: string;\n user_id: string | null;\n state_code: number | null;\n modified_at: string | null;\n json: unknown;\n};\n\nexport type FlowListQueryFilters = {\n ids?: string[];\n version?: string | null;\n userId?: string | null;\n stateCodes?: number[];\n typeOfDataset?: string[];\n order?: string | null;\n limit?: number | null;\n offset?: number | null;\n};\n\nexport type SupabaseFlowLookup = {\n row: SupabaseFlowRow;\n sourceUrl: string;\n resolution:\n 'remote_supabase_exact' | 'remote_supabase_latest' | 'remote_supabase_latest_fallback';\n};\n\ntype QueryWithUrl = {\n url: URL;\n limit: (count: number) => QueryWithUrl;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction buildHeaders(publishableKey: string, accessToken: string): Record<string, string> {\n return buildSupabaseAuthHeaders(publishableKey, accessToken);\n}\n\nfunction normalizeTokenList(values: readonly string[] | undefined): string[] {\n if (!Array.isArray(values)) {\n return [];\n }\n\n const seen = new Set<string>();\n const normalized: string[] = [];\n for (const value of values) {\n const trimmed = typeof value === 'string' ? value.trim() : '';\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n normalized.push(trimmed);\n seen.add(trimmed);\n }\n return normalized;\n}\n\nfunction normalizeStateCodeList(values: readonly number[] | undefined): number[] {\n if (!Array.isArray(values)) {\n return [];\n }\n\n const seen = new Set<number>();\n const normalized: number[] = [];\n for (const value of values) {\n if (!Number.isInteger(value) || value < 0 || seen.has(value)) {\n continue;\n }\n normalized.push(value);\n seen.add(value);\n }\n return normalized;\n}\n\nfunction buildFlowListUrl(restBaseUrl: string, filters: FlowListQueryFilters): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/flows`);\n url.searchParams.set('select', 'id,version,user_id,state_code,modified_at,json');\n\n const ids = normalizeTokenList(filters.ids);\n if (ids.length === 1) {\n url.searchParams.set('id', `eq.${ids[0]}`);\n } else if (ids.length > 1) {\n url.searchParams.set('id', `in.(${ids.join(',')})`);\n }\n\n if (typeof filters.version === 'string' && filters.version.trim()) {\n url.searchParams.set('version', `eq.${filters.version.trim()}`);\n }\n\n if (typeof filters.userId === 'string' && filters.userId.trim()) {\n url.searchParams.set('user_id', `eq.${filters.userId.trim()}`);\n }\n\n const stateCodes = normalizeStateCodeList(filters.stateCodes);\n if (stateCodes.length === 1) {\n url.searchParams.set('state_code', `eq.${stateCodes[0]}`);\n } else if (stateCodes.length > 1) {\n url.searchParams.set('state_code', `in.(${stateCodes.join(',')})`);\n }\n\n const typeOfDataset = normalizeTokenList(filters.typeOfDataset);\n if (typeOfDataset.length === 1) {\n url.searchParams.set(TYPE_OF_DATASET_QUERY_PATH, `eq.${typeOfDataset[0]}`);\n } else if (typeOfDataset.length > 1) {\n url.searchParams.set(TYPE_OF_DATASET_QUERY_PATH, `in.(${typeOfDataset.join(',')})`);\n }\n\n if (typeof filters.order === 'string' && filters.order.trim()) {\n url.searchParams.set('order', filters.order.trim());\n }\n\n if (Number.isInteger(filters.limit) && (filters.limit as number) > 0) {\n url.searchParams.set('limit', String(filters.limit));\n }\n\n if (Number.isInteger(filters.offset) && (filters.offset as number) >= 0) {\n url.searchParams.set('offset', String(filters.offset));\n }\n\n return url.toString();\n}\n\nfunction parseFlowRows(payload: unknown, url: string): SupabaseFlowRow[] {\n if (!Array.isArray(payload)) {\n throw new CliError(`Supabase REST response was not a JSON array for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload.map((item, index) => {\n if (!isRecord(item)) {\n throw new CliError(`Supabase REST row ${index} was not a JSON object for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: item,\n });\n }\n\n return {\n id: typeof item.id === 'string' ? item.id : '',\n version: typeof item.version === 'string' ? item.version : '',\n user_id: typeof item.user_id === 'string' ? item.user_id : null,\n state_code: typeof item.state_code === 'number' ? item.state_code : null,\n modified_at: typeof item.modified_at === 'string' ? item.modified_at : null,\n json: item.json,\n };\n });\n}\n\nfunction normalizeSupabaseFlowPayload(payload: unknown, lookupKey: string): JsonObject {\n if (typeof payload === 'string') {\n try {\n const parsed = JSON.parse(payload);\n if (!isRecord(parsed)) {\n throw new CliError(`Supabase REST payload was not a JSON object for ${lookupKey}.`, {\n code: 'SUPABASE_REST_PAYLOAD_INVALID',\n exitCode: 1,\n details: parsed,\n });\n }\n return parsed;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n\n throw new CliError(`Supabase REST payload was not valid JSON for ${lookupKey}.`, {\n code: 'SUPABASE_REST_PAYLOAD_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n }\n\n if (!isRecord(payload)) {\n throw new CliError(`Supabase REST payload was missing json for ${lookupKey}.`, {\n code: 'SUPABASE_REST_PAYLOAD_MISSING',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload;\n}\n\nfunction applyOrder<Query extends { order: (column: string, options?: object) => Query }>(\n query: Query,\n orderValue: string | null | undefined,\n): Query {\n const normalizedOrder = typeof orderValue === 'string' ? orderValue.trim() : '';\n if (!normalizedOrder) {\n return query;\n }\n\n let nextQuery = query;\n for (const rawToken of normalizedOrder.split(',')) {\n const token = rawToken.trim();\n if (!token) {\n continue;\n }\n\n const [column, direction, nulls] = token.split('.');\n if (!column) {\n continue;\n }\n\n nextQuery = nextQuery.order(column, {\n ascending: direction !== 'desc',\n nullsFirst: nulls === 'nullsfirst' ? true : nulls === 'nullslast' ? false : undefined,\n });\n }\n\n return nextQuery;\n}\n\nasync function listFlowRows(options: {\n runtime: SupabaseDataRuntime;\n filters: FlowListQueryFilters;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<{ rows: SupabaseFlowRow[]; sourceUrl: string }> {\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const sourceUrl = buildFlowListUrl(restBaseUrl, options.filters);\n let query = client.from('flows').select('id,version,user_id,state_code,modified_at,json');\n\n const ids = normalizeTokenList(options.filters.ids);\n if (ids.length === 1) {\n query = query.eq('id', ids[0] as string);\n } else if (ids.length > 1) {\n query = query.filter('id', 'in', `(${ids.join(',')})`);\n }\n\n if (typeof options.filters.version === 'string' && options.filters.version.trim()) {\n query = query.eq('version', options.filters.version.trim());\n }\n\n if (typeof options.filters.userId === 'string' && options.filters.userId.trim()) {\n query = query.eq('user_id', options.filters.userId.trim());\n }\n\n const stateCodes = normalizeStateCodeList(options.filters.stateCodes);\n if (stateCodes.length === 1) {\n query = query.eq('state_code', stateCodes[0] as number);\n } else if (stateCodes.length > 1) {\n query = query.filter('state_code', 'in', `(${stateCodes.join(',')})`);\n }\n\n const typeOfDataset = normalizeTokenList(options.filters.typeOfDataset);\n if (typeOfDataset.length === 1) {\n query = query.filter(TYPE_OF_DATASET_QUERY_PATH, 'eq', typeOfDataset[0] as string);\n } else if (typeOfDataset.length > 1) {\n query = query.filter(TYPE_OF_DATASET_QUERY_PATH, 'in', `(${typeOfDataset.join(',')})`);\n }\n\n query = applyOrder(query, options.filters.order ?? null);\n\n const limit =\n Number.isInteger(options.filters.limit) && (options.filters.limit as number) > 0\n ? (options.filters.limit as number)\n : null;\n const offset =\n Number.isInteger(options.filters.offset) && (options.filters.offset as number) >= 0\n ? (options.filters.offset as number)\n : null;\n\n if (limit !== null && offset !== null) {\n query = query.limit(limit);\n (query as unknown as QueryWithUrl).url.searchParams.set('offset', String(offset));\n } else if (limit !== null) {\n query = query.limit(limit);\n }\n\n const rows = parseFlowRows(await runSupabaseArrayQuery(query, sourceUrl), sourceUrl);\n return { rows, sourceUrl };\n}\n\nfunction buildAmbiguousMatchDetails(rows: SupabaseFlowRow[]): Array<{\n id: string;\n version: string;\n user_id: string | null;\n state_code: number | null;\n}> {\n return rows.map((row) => ({\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: row.state_code,\n }));\n}\n\nfunction latestRowsAreAmbiguous(rows: SupabaseFlowRow[]): boolean {\n return rows.length > 1 && rows[0]?.version === rows[1]?.version;\n}\n\nasync function fetchOneFlowRow(options: {\n runtime: SupabaseDataRuntime;\n id: string;\n version?: string | null;\n userId?: string | null;\n stateCode?: number | null;\n timeoutMs: number;\n fetchImpl: FetchLike;\n fallbackToLatest?: boolean;\n}): Promise<SupabaseFlowLookup | null> {\n const stateCodes =\n Number.isInteger(options.stateCode) && (options.stateCode as number) >= 0\n ? [options.stateCode as number]\n : [];\n const sharedFilters = {\n ids: [options.id],\n userId: options.userId ?? null,\n stateCodes,\n } satisfies FlowListQueryFilters;\n\n if (options.version) {\n const exact = await listFlowRows({\n runtime: options.runtime,\n filters: {\n ...sharedFilters,\n version: options.version,\n order: 'version.desc',\n limit: 2,\n offset: 0,\n },\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n });\n\n if (exact.rows.length === 1) {\n return {\n row: exact.rows[0] as SupabaseFlowRow,\n sourceUrl: exact.sourceUrl,\n resolution: 'remote_supabase_exact',\n };\n }\n\n if (exact.rows.length > 1) {\n throw new CliError(\n `Multiple visible flow rows matched ${options.id}@${options.version}. Add a stricter --state-code or --user-id filter.`,\n {\n code: 'FLOW_GET_AMBIGUOUS',\n exitCode: 2,\n details: {\n flow_id: options.id,\n version: options.version,\n matches: buildAmbiguousMatchDetails(exact.rows),\n source_url: exact.sourceUrl,\n },\n },\n );\n }\n\n if (!options.fallbackToLatest) {\n return null;\n }\n }\n\n const latest = await listFlowRows({\n runtime: options.runtime,\n filters: {\n ...sharedFilters,\n order: 'version.desc',\n limit: 2,\n offset: 0,\n },\n timeoutMs: options.timeoutMs,\n fetchImpl: options.fetchImpl,\n });\n\n if (latest.rows.length === 0) {\n return null;\n }\n\n if (latestRowsAreAmbiguous(latest.rows)) {\n throw new CliError(\n `Multiple visible flow rows matched the latest version for ${options.id}. Add a stricter --state-code or --user-id filter.`,\n {\n code: 'FLOW_GET_AMBIGUOUS',\n exitCode: 2,\n details: {\n flow_id: options.id,\n version: latest.rows[0].version,\n matches: buildAmbiguousMatchDetails(latest.rows),\n source_url: latest.sourceUrl,\n },\n },\n );\n }\n\n return {\n row: latest.rows[0] as SupabaseFlowRow,\n sourceUrl: latest.sourceUrl,\n resolution: options.version ? 'remote_supabase_latest_fallback' : 'remote_supabase_latest',\n };\n}\n\nexport {\n buildFlowListUrl,\n buildHeaders,\n buildAmbiguousMatchDetails,\n fetchOneFlowRow,\n latestRowsAreAmbiguous,\n listFlowRows,\n normalizeStateCodeList,\n normalizeSupabaseFlowPayload,\n normalizeTokenList,\n parseFlowRows,\n};\n\nexport const __testInternals = {\n buildFlowListUrl,\n buildHeaders,\n buildAmbiguousMatchDetails,\n latestRowsAreAmbiguous,\n normalizeStateCodeList,\n normalizeSupabaseFlowPayload,\n normalizeTokenList,\n parseFlowRows,\n};\n\nexport type { SupabaseDataRuntime };\n"]}