@tiangong-lca/cli 0.1.6 → 0.1.7
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 +3 -13
- package/dist/src/cli.js +20 -36
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/auth-identity-receipt.d.ts +1 -2
- package/dist/src/lib/auth-identity-receipt.js +3 -20
- package/dist/src/lib/auth-identity-receipt.js.map +1 -1
- package/dist/src/lib/credential-safety.d.ts +7 -0
- package/dist/src/lib/credential-safety.js +28 -0
- package/dist/src/lib/credential-safety.js.map +1 -0
- package/dist/src/lib/dataset-save-draft-run.js +3 -1
- package/dist/src/lib/dataset-save-draft-run.js.map +1 -1
- package/dist/src/lib/env.d.ts +0 -2
- package/dist/src/lib/env.js +11 -19
- package/dist/src/lib/env.js.map +1 -1
- package/dist/src/lib/flow-publish-reviewed-data.js +1 -1
- package/dist/src/lib/flow-publish-reviewed-data.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-resulting-process.js +2 -6
- package/dist/src/lib/lifecyclemodel-resulting-process.js.map +1 -1
- package/dist/src/lib/process-refresh-references.js +1 -1
- package/dist/src/lib/process-refresh-references.js.map +1 -1
- package/dist/src/lib/process-scope-statistics.js +1 -1
- package/dist/src/lib/process-scope-statistics.js.map +1 -1
- package/dist/src/lib/supabase-client.d.ts +1 -3
- package/dist/src/lib/supabase-client.js +5 -15
- package/dist/src/lib/supabase-client.js.map +1 -1
- package/dist/src/lib/supabase-session.d.ts +5 -14
- package/dist/src/lib/supabase-session.js +34 -113
- package/dist/src/lib/supabase-session.js.map +1 -1
- package/package.json +1 -2
- package/dist/src/lib/user-api-key.d.ts +0 -16
- package/dist/src/lib/user-api-key.js +0 -75
- package/dist/src/lib/user-api-key.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-scope-statistics.js","sourceRoot":"","sources":["../../../src/lib/process-scope-statistics.ts"],"names":[],"mappings":"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","sourcesContent":["// data-api-relations: processes\nimport path from 'node:path';\nimport {\n readJsonArtifact,\n readJsonLinesArtifact,\n writeJsonArtifact,\n writeJsonLinesArtifact,\n writeTextArtifact,\n} from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike, ResponseLike } from './http.js';\nimport {\n deriveSupabaseProjectBaseUrl,\n deriveSupabaseRestBaseUrl,\n requireSupabaseRestRuntime,\n} from './supabase-client.js';\nimport {\n applyDataApiProfileHeaders,\n buildDataApiUrl,\n resolveDataApiCapability,\n} from './supabase-data-api-contract.js';\nimport { resolveSupabaseUserSession } from './supabase-session.js';\nimport { redactEmail } from './user-api-key.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nconst DEFAULT_STATE_CODES = [0, 100] as const;\nconst DEFAULT_PAGE_SIZE = 200;\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 4;\n\ntype ProcessScopeStatisticsScope = 'visible' | 'current-user';\n\ntype SnapshotRow = {\n id: string;\n version: string;\n state_code: number | null;\n user_id: string | null;\n modified_at: string | null;\n model_id: string | null;\n json: JsonRecord;\n};\n\ntype ClassificationEntry = {\n level: number;\n text: string;\n};\n\ntype StatisticsMetadata = {\n userId: string | null;\n maskedUserEmail: string | null;\n totalRowsReportedByRemote: number | null;\n};\n\ntype StatisticsOptions = {\n scope: ProcessScopeStatisticsScope;\n stateCodes: number[];\n};\n\ntype CountRecord = {\n count: number;\n [key: string]: unknown;\n};\n\nexport type RunProcessScopeStatisticsOptions = {\n outDir: string;\n scope?: ProcessScopeStatisticsScope;\n stateCodes?: number[];\n pageSize?: number | null;\n reuseSnapshot?: boolean;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n maxRetries?: number;\n now?: Date;\n};\n\nexport type ProcessScopeStatisticsReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_process_scope_statistics';\n out_dir: string;\n scope: ProcessScopeStatisticsScope;\n state_codes: number[];\n total_process_rows: number;\n domain_count_primary: number;\n domain_count_leaf: number;\n craft_count: number;\n unit_process_rows: number;\n product_count: number;\n files: {\n snapshot_manifest: string;\n snapshot_rows: string;\n process_scope_summary: string;\n domain_summary: string;\n craft_summary: string;\n product_summary: string;\n type_of_dataset_summary: string;\n report: string;\n report_zh: string;\n };\n};\n\ntype ProcessScopeStatisticsSummary = {\n schema_version: 1;\n generated_at_utc: string;\n scope: ProcessScopeStatisticsScope;\n state_codes: number[];\n user_id: string | null;\n masked_user_email: string | null;\n total_process_rows: number;\n total_rows_reported_by_remote: number | null;\n rows_by_state_code: Record<string, number>;\n distinct_visible_owner_user_ids: number;\n domain_count_primary: number;\n domain_count_leaf: number;\n craft_count: number;\n unit_process_rows: number;\n unit_process_share: number;\n product_count: number;\n products_with_flow_id: number;\n products_without_flow_id: number;\n rows_missing_classification: number;\n rows_missing_craft: number;\n rows_missing_product: number;\n rows_missing_reference_exchange: number;\n metric_definitions: Record<string, string>;\n};\n\ntype ProcessScopeStatisticsArtifacts = {\n summary: ProcessScopeStatisticsSummary;\n domainPrimarySummary: Array<{\n domain: string;\n count: number;\n sample_path?: string;\n }>;\n domainLeafSummary: Array<{\n domain: string;\n count: number;\n sample_path?: string;\n }>;\n craftSummary: Array<{\n craft_signature: string;\n label: string;\n count: number;\n source_kind: string;\n }>;\n productSummary: Array<{\n product_key: string;\n label: string;\n count: number;\n stable_flow_id: string;\n stable_flow_version: string;\n source_kind: string;\n }>;\n typeOfDataSetSummary: Array<{\n type_of_dataset: string;\n count: number;\n }>;\n craftSourceSummary: Array<{\n source_kind: string;\n count: number;\n }>;\n productSourceSummary: Array<{\n source_kind: string;\n count: number;\n }>;\n};\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction trimText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction normalizeOptionalToken(value: unknown): string | null {\n const trimmed = trimText(value);\n return trimmed ? trimmed : null;\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction toPositiveInteger(value: number | null | undefined, label: string, code: string): number {\n if (!Number.isInteger(value) || (value as number) <= 0) {\n throw new CliError(`Expected ${label} to be a positive integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value as number;\n}\n\nfunction normalizeStateCodes(value: readonly number[] | undefined): number[] {\n if (!Array.isArray(value) || value.length === 0) {\n return [...DEFAULT_STATE_CODES];\n }\n\n const seen = new Set<number>();\n const normalized: number[] = [];\n for (const entry of value) {\n if (!Number.isInteger(entry) || entry < 0) {\n throw new CliError('Expected --state-codes to contain only non-negative integers.', {\n code: 'PROCESS_SCOPE_STATE_CODES_INVALID',\n exitCode: 2,\n });\n }\n if (!seen.has(entry)) {\n normalized.push(entry);\n seen.add(entry);\n }\n }\n if (normalized.length === 0) {\n throw new CliError('--state-codes must contain at least one state code.', {\n code: 'PROCESS_SCOPE_STATE_CODES_REQUIRED',\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nfunction ensureScope(value: string | undefined): ProcessScopeStatisticsScope {\n if (value === undefined || value === 'visible') {\n return 'visible';\n }\n if (value === 'current-user') {\n return 'current-user';\n }\n throw new CliError(\"Expected --scope to be either 'visible' or 'current-user'.\", {\n code: 'PROCESS_SCOPE_SCOPE_INVALID',\n exitCode: 2,\n });\n}\n\nasync function parseJsonResponse(response: ResponseLike, label: string): Promise<unknown> {\n const text = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n if (!text.trim()) {\n return null;\n }\n if (!contentType.includes('application/json')) {\n return text;\n }\n try {\n return JSON.parse(text);\n } catch (error) {\n throw new CliError(`${label} returned invalid JSON.`, {\n code: 'PROCESS_SCOPE_REMOTE_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n}\n\nasync function fetchJsonWithRetry(options: {\n url: string;\n init: RequestInit;\n label: string;\n fetchImpl: FetchLike;\n timeoutMs: number;\n maxRetries: number;\n}): Promise<{ status: number; headers: Headers; body: unknown }> {\n let lastError: unknown = null;\n\n for (let attempt = 1; attempt <= options.maxRetries; attempt += 1) {\n try {\n const response = await options.fetchImpl(options.url, {\n ...options.init,\n signal: AbortSignal.timeout(options.timeoutMs),\n });\n const body = await parseJsonResponse(response, options.label);\n if (!response.ok) {\n throw new CliError(`${options.label} failed with ${response.status}.`, {\n code: 'PROCESS_SCOPE_REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: {\n status: response.status,\n body,\n url: options.url,\n },\n });\n }\n return {\n status: response.status,\n headers: new Headers({\n 'content-range': response.headers.get('content-range') ?? '',\n 'content-type': response.headers.get('content-type') ?? '',\n }),\n body,\n };\n } catch (error) {\n lastError = error;\n if (attempt >= options.maxRetries) {\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, attempt * 1_500));\n }\n }\n\n if (lastError instanceof CliError) {\n throw lastError;\n }\n\n throw new CliError(`${options.label} failed after ${options.maxRetries} attempt(s).`, {\n code: 'PROCESS_SCOPE_REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: String(lastError),\n });\n}\n\nasync function resolveCurrentUserId(options: {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n now: Date;\n maxRetries: number;\n}): Promise<string> {\n const runtime = requireSupabaseRestRuntime(options.env);\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n now: options.now,\n });\n const body = await fetchJsonWithRetry({\n url: `${deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl)}/auth/v1/user`,\n init: {\n method: 'GET',\n headers: {\n apikey: runtime.publishableKey,\n Authorization: `Bearer ${session.accessToken}`,\n Accept: 'application/json',\n },\n },\n label: 'supabase current-user lookup',\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n maxRetries: options.maxRetries,\n });\n\n const userId = isRecord(body.body) ? normalizeOptionalToken(body.body.id) : null;\n if (!userId) {\n throw new CliError('Supabase current-user lookup succeeded without a user id.', {\n code: 'PROCESS_SCOPE_CURRENT_USER_ID_MISSING',\n exitCode: 1,\n });\n }\n return userId;\n}\n\nasync function fetchProcessRows(options: {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n maxRetries: number;\n scope: ProcessScopeStatisticsScope;\n stateCodes: number[];\n pageSize: number;\n userId: string | null;\n}): Promise<{ rows: SnapshotRow[]; total: number | null }> {\n const runtime = requireSupabaseRestRuntime(options.env);\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n const projectBaseUrl = deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl);\n const processCapability = resolveDataApiCapability({\n kind: 'relation',\n name: 'processes',\n env: options.env,\n });\n const rows: SnapshotRow[] = [];\n let total = 0;\n\n for (const stateCode of options.stateCodes) {\n let stateTotal: number | null = null;\n let cursorId = '';\n\n while (true) {\n const url = new URL(\n buildDataApiUrl(deriveSupabaseRestBaseUrl(projectBaseUrl), processCapability),\n );\n url.searchParams.set('select', 'id,version,state_code,user_id,modified_at,model_id,json');\n url.searchParams.set('state_code', `eq.${stateCode}`);\n if (options.scope === 'current-user') {\n url.searchParams.set('user_id', `eq.${options.userId ?? ''}`);\n }\n if (cursorId) {\n url.searchParams.set('id', `gt.${cursorId}`);\n }\n url.searchParams.set('order', 'id.asc');\n url.searchParams.set('limit', String(options.pageSize));\n\n const page = await fetchJsonWithRetry({\n url: url.toString(),\n init: {\n method: 'GET',\n headers: applyDataApiProfileHeaders(\n {\n apikey: runtime.publishableKey,\n Authorization: `Bearer ${session.accessToken}`,\n Accept: 'application/json',\n ...(stateTotal === null ? { Prefer: 'count=exact' } : {}),\n },\n processCapability,\n ),\n },\n label: `process scope statistics page fetch (state_code=${stateCode})`,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n maxRetries: options.maxRetries,\n });\n\n const pageRows = Array.isArray(page.body) ? page.body : [];\n const normalizedRows = pageRows\n .map((row) => normalizeSnapshotRow(row))\n .filter((row): row is SnapshotRow => row !== null);\n rows.push(...normalizedRows);\n\n if (stateTotal === null) {\n const match = page.headers.get('content-range')?.match(/\\/(\\d+)$/u) ?? null;\n stateTotal = match ? Number.parseInt(match[1]!, 10) : null;\n if (stateTotal !== null) {\n total += stateTotal;\n }\n }\n\n if (normalizedRows.length < options.pageSize) {\n break;\n }\n\n const lastRow = normalizedRows[normalizedRows.length - 1]!;\n cursorId = lastRow.id;\n }\n }\n\n return {\n rows,\n total: total || null,\n };\n}\n\nfunction normalizeSnapshotRow(value: unknown): SnapshotRow | null {\n if (!isRecord(value)) {\n return null;\n }\n const id = normalizeOptionalToken(value.id);\n const version = normalizeOptionalToken(value.version);\n const payload = normalizePayload(value.json);\n if (!id || !version || !payload) {\n return null;\n }\n return {\n id,\n version,\n state_code: typeof value.state_code === 'number' ? value.state_code : null,\n user_id: normalizeOptionalToken(value.user_id),\n modified_at: normalizeOptionalToken(value.modified_at),\n model_id: normalizeOptionalToken(value.model_id),\n json: payload,\n };\n}\n\nfunction normalizePayload(value: unknown): JsonRecord | null {\n if (isRecord(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim()) {\n try {\n const parsed = JSON.parse(value);\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n }\n return null;\n}\n\nfunction getLangList(value: unknown): JsonRecord[] {\n if (value === null || value === undefined || value === '') {\n return [];\n }\n if (Array.isArray(value)) {\n return value.filter((item): item is JsonRecord => isRecord(item));\n }\n if (isRecord(value)) {\n const langString = value['common:langString'];\n if (Array.isArray(langString)) {\n return langString.filter((item): item is JsonRecord => isRecord(item));\n }\n if (isRecord(langString)) {\n return [langString];\n }\n if (typeof value['#text'] === 'string' || typeof value['@xml:lang'] === 'string') {\n return [value];\n }\n }\n if (typeof value === 'string') {\n return [{ '@xml:lang': 'en', '#text': value }];\n }\n return [];\n}\n\nfunction getLangText(value: unknown, lang: string | null): string {\n const list = getLangList(value);\n const exact =\n lang === null\n ? null\n : list.find(\n (item) =>\n trimText(item['@xml:lang']).toLowerCase() === lang.toLowerCase() &&\n trimText(item['#text']),\n );\n const fallback = list.find((item) => trimText(item['#text']));\n return trimText((exact ?? fallback)?.['#text']);\n}\n\nfunction getAnyLangText(value: unknown): string {\n return getLangText(value, null);\n}\n\nfunction asArray(value: unknown): unknown[] {\n if (value === null || value === undefined || value === '') {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n\nfunction extractClassificationEntries(dataSetInformation: JsonRecord): ClassificationEntry[] {\n const classes = asArray(\n (dataSetInformation.classificationInformation as JsonRecord | undefined)?.[\n 'common:classification'\n ] &&\n (\n (dataSetInformation.classificationInformation as JsonRecord)['common:classification'] as\n JsonRecord | undefined\n )?.['common:class'],\n );\n\n return classes\n .map((entry) => {\n if (!isRecord(entry)) {\n return null;\n }\n const level = Number.parseInt(trimText(entry['@level']) || '0', 10);\n const text = trimText(entry['#text']);\n if (!text) {\n return null;\n }\n return { level, text };\n })\n .filter((entry): entry is ClassificationEntry => entry !== null)\n .sort((left, right) => left.level - right.level);\n}\n\nfunction normalizeSignature(text: string): string {\n return trimText(text)\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[\\u3000\\u00a0]/gu, ' ')\n .replace(/[,,;;::()()[\\]{}<>|/\\\\]+/gu, ' ')\n .replace(/\\s+/gu, ' ')\n .trim();\n}\n\nfunction firstClause(text: string): string {\n const normalized = trimText(text);\n if (!normalized) {\n return '';\n }\n const [first] = normalized.split(/[.;;。]/u);\n return first.trim();\n}\n\nfunction renderProcessName(name: JsonRecord): string {\n const parts = [\n getLangText(name.baseName, 'en') ||\n getLangText(name.baseName, 'zh') ||\n getAnyLangText(name.baseName),\n getLangText(name.treatmentStandardsRoutes, 'en') ||\n getLangText(name.treatmentStandardsRoutes, 'zh') ||\n getAnyLangText(name.treatmentStandardsRoutes),\n getLangText(name.mixAndLocationTypes, 'en') ||\n getLangText(name.mixAndLocationTypes, 'zh') ||\n getAnyLangText(name.mixAndLocationTypes),\n getLangText(name.functionalUnitFlowProperties, 'en') ||\n getLangText(name.functionalUnitFlowProperties, 'zh') ||\n getAnyLangText(name.functionalUnitFlowProperties),\n ].filter((part) => trimText(part));\n\n return parts.join('; ');\n}\n\nfunction extractCraftCandidate(\n dataSetInformation: JsonRecord,\n technology: JsonRecord,\n): {\n source_kind: string;\n label: string;\n signature: string;\n} {\n const name = isRecord(dataSetInformation.name) ? dataSetInformation.name : {};\n const candidates = [\n {\n source_kind: 'treatmentStandardsRoutes',\n label:\n getLangText(name.treatmentStandardsRoutes, 'en') ||\n getLangText(name.treatmentStandardsRoutes, 'zh') ||\n getAnyLangText(name.treatmentStandardsRoutes),\n },\n {\n source_kind: 'technologyDescriptionAndIncludedProcesses',\n label:\n firstClause(getLangText(technology.technologyDescriptionAndIncludedProcesses, 'en')) ||\n firstClause(getLangText(technology.technologyDescriptionAndIncludedProcesses, 'zh')) ||\n firstClause(getAnyLangText(technology.technologyDescriptionAndIncludedProcesses)),\n },\n {\n source_kind: 'baseName',\n label:\n getLangText(name.baseName, 'en') ||\n getLangText(name.baseName, 'zh') ||\n getAnyLangText(name.baseName),\n },\n ];\n\n for (const candidate of candidates) {\n if (trimText(candidate.label)) {\n return {\n ...candidate,\n signature: normalizeSignature(candidate.label),\n };\n }\n }\n\n return {\n source_kind: 'missing',\n label: '',\n signature: '',\n };\n}\n\nfunction extractReferenceProduct(\n processDataSet: JsonRecord,\n dataSetInformation: JsonRecord,\n): {\n key: string;\n stable_flow_id: string;\n stable_flow_version: string;\n label: string;\n source_kind: string;\n missing_reference_exchange: boolean;\n} {\n const processInformation = isRecord(processDataSet.processInformation)\n ? processDataSet.processInformation\n : {};\n const quantRef = isRecord(processInformation.quantitativeReference)\n ? processInformation.quantitativeReference\n : {};\n const refInternalId = trimText(quantRef.referenceToReferenceFlow);\n const exchangesBlock = isRecord(processDataSet.exchanges) ? processDataSet.exchanges : {};\n const exchanges = asArray(exchangesBlock.exchange);\n const refExchange = exchanges.find(\n (exchange) => isRecord(exchange) && trimText(exchange['@dataSetInternalID']) === refInternalId,\n );\n const exchange = isRecord(refExchange) ? refExchange : null;\n const flowRef =\n exchange && isRecord(exchange.referenceToFlowDataSet) ? exchange.referenceToFlowDataSet : {};\n\n const flowRefId = trimText(flowRef['@refObjectId']);\n const flowRefVersion = trimText(flowRef['@version']);\n const shortDescription =\n getLangText(flowRef['common:shortDescription'], 'en') ||\n getLangText(flowRef['common:shortDescription'], 'zh') ||\n getAnyLangText(flowRef['common:shortDescription']);\n const name = isRecord(dataSetInformation.name) ? dataSetInformation.name : {};\n const fallbackBaseName =\n getLangText(name.baseName, 'en') ||\n getLangText(name.baseName, 'zh') ||\n getAnyLangText(name.baseName);\n const fallbackProcessName = renderProcessName(name);\n\n if (flowRefId) {\n return {\n key: `flow:${flowRefId}`,\n stable_flow_id: flowRefId,\n stable_flow_version: flowRefVersion,\n label: shortDescription || fallbackProcessName || flowRefId,\n source_kind: 'reference_flow_id',\n missing_reference_exchange: exchange === null,\n };\n }\n\n if (shortDescription) {\n return {\n key: `label:${normalizeSignature(shortDescription)}`,\n stable_flow_id: '',\n stable_flow_version: '',\n label: shortDescription,\n source_kind: 'reference_flow_short_description',\n missing_reference_exchange: exchange === null,\n };\n }\n\n if (fallbackBaseName) {\n return {\n key: `base:${normalizeSignature(fallbackBaseName)}`,\n stable_flow_id: '',\n stable_flow_version: '',\n label: fallbackBaseName,\n source_kind: 'process_base_name',\n missing_reference_exchange: exchange === null,\n };\n }\n\n return {\n key: '',\n stable_flow_id: '',\n stable_flow_version: '',\n label: '',\n source_kind: 'missing',\n missing_reference_exchange: exchange === null,\n };\n}\n\nfunction incrementCount(\n map: Map<string, CountRecord>,\n key: string,\n seed: Record<string, unknown> = {},\n): void {\n const existing = map.get(key) ?? {\n count: 0,\n ...seed,\n };\n existing.count += 1;\n map.set(key, existing);\n}\n\nfunction toSortedArray(map: Map<string, CountRecord>): Array<{ key: string } & CountRecord> {\n return [...map.entries()]\n .map(([key, value]) => ({\n key,\n ...value,\n }))\n .sort((left, right) => right.count - left.count || left.key.localeCompare(right.key));\n}\n\nfunction calculateStatistics(\n rows: SnapshotRow[],\n options: StatisticsOptions,\n metadata: StatisticsMetadata,\n generatedAtUtc: string,\n): ProcessScopeStatisticsArtifacts {\n const stateCodeCounts = new Map<string, CountRecord>();\n const typeOfDataSetCounts = new Map<string, CountRecord>();\n const domainPrimaryCounts = new Map<string, CountRecord>();\n const domainLeafCounts = new Map<string, CountRecord>();\n const craftCounts = new Map<string, CountRecord>();\n const craftSourceCounts = new Map<string, CountRecord>();\n const productCounts = new Map<string, CountRecord>();\n const productSourceCounts = new Map<string, CountRecord>();\n const ownerCounts = new Map<string, CountRecord>();\n\n let rowsMissingClassification = 0;\n let rowsMissingCraft = 0;\n let rowsMissingProduct = 0;\n let rowsMissingReferenceExchange = 0;\n let unitProcessRows = 0;\n\n for (const row of rows) {\n incrementCount(stateCodeCounts, String(row.state_code ?? 'null'));\n incrementCount(ownerCounts, row.user_id ?? 'missing');\n\n const processDataSet = isRecord(row.json.processDataSet) ? row.json.processDataSet : {};\n const processInformation = isRecord(processDataSet.processInformation)\n ? processDataSet.processInformation\n : {};\n const dataSetInformation = isRecord(processInformation.dataSetInformation)\n ? processInformation.dataSetInformation\n : {};\n const technology = isRecord(processInformation.technology) ? processInformation.technology : {};\n const modellingAndValidation = isRecord(processDataSet.modellingAndValidation)\n ? processDataSet.modellingAndValidation\n : {};\n const lciMethod = isRecord(modellingAndValidation.LCIMethodAndAllocation)\n ? modellingAndValidation.LCIMethodAndAllocation\n : {};\n\n const typeOfDataSet = trimText(lciMethod.typeOfDataSet) || 'missing';\n incrementCount(typeOfDataSetCounts, typeOfDataSet);\n if (typeOfDataSet.toLowerCase().includes('unit process')) {\n unitProcessRows += 1;\n }\n\n const classificationEntries = extractClassificationEntries(dataSetInformation);\n const primaryDomain =\n classificationEntries.find((entry) => entry.level === 1)?.text ??\n classificationEntries[classificationEntries.length - 1]?.text ??\n '';\n const leafDomain = classificationEntries[classificationEntries.length - 1]?.text ?? '';\n if (primaryDomain) {\n incrementCount(domainPrimaryCounts, primaryDomain, {\n sample_path: classificationEntries.map((entry) => entry.text).join(' > '),\n });\n } else {\n rowsMissingClassification += 1;\n }\n if (leafDomain) {\n incrementCount(domainLeafCounts, leafDomain, {\n sample_path: classificationEntries.map((entry) => entry.text).join(' > '),\n });\n }\n\n const craft = extractCraftCandidate(dataSetInformation, technology);\n if (craft.signature) {\n incrementCount(craftCounts, craft.signature, {\n label: craft.label,\n source_kind: craft.source_kind,\n });\n incrementCount(craftSourceCounts, craft.source_kind);\n } else {\n rowsMissingCraft += 1;\n }\n\n const product = extractReferenceProduct(processDataSet, dataSetInformation);\n if (product.key) {\n incrementCount(productCounts, product.key, {\n label: product.label,\n stable_flow_id: product.stable_flow_id,\n stable_flow_version: product.stable_flow_version,\n source_kind: product.source_kind,\n });\n incrementCount(productSourceCounts, product.source_kind);\n } else {\n rowsMissingProduct += 1;\n }\n if (product.missing_reference_exchange) {\n rowsMissingReferenceExchange += 1;\n }\n }\n\n const domainPrimarySummary = toSortedArray(domainPrimaryCounts).map((item) => ({\n domain: item.key,\n count: item.count,\n sample_path: item.sample_path as string | undefined,\n }));\n const domainLeafSummary = toSortedArray(domainLeafCounts).map((item) => ({\n domain: item.key,\n count: item.count,\n sample_path: item.sample_path as string | undefined,\n }));\n const craftSummary = toSortedArray(craftCounts).map((item) => ({\n craft_signature: item.key,\n label: item.label as string,\n count: item.count,\n source_kind: item.source_kind as string,\n }));\n const productSummary = toSortedArray(productCounts).map((item) => ({\n product_key: item.key,\n label: item.label as string,\n count: item.count,\n stable_flow_id: item.stable_flow_id as string,\n stable_flow_version: item.stable_flow_version as string,\n source_kind: item.source_kind as string,\n }));\n const typeOfDataSetSummary = toSortedArray(typeOfDataSetCounts).map((item) => ({\n type_of_dataset: item.key,\n count: item.count,\n }));\n\n return {\n summary: {\n schema_version: 1,\n generated_at_utc: generatedAtUtc,\n scope: options.scope,\n state_codes: options.stateCodes,\n user_id: metadata.userId,\n masked_user_email: metadata.maskedUserEmail,\n total_process_rows: rows.length,\n total_rows_reported_by_remote: metadata.totalRowsReportedByRemote,\n rows_by_state_code: Object.fromEntries(\n [...stateCodeCounts.entries()].map(([key, value]) => [key, value.count]),\n ),\n distinct_visible_owner_user_ids: ownerCounts.size,\n domain_count_primary: domainPrimaryCounts.size,\n domain_count_leaf: domainLeafCounts.size,\n craft_count: craftCounts.size,\n unit_process_rows: unitProcessRows,\n unit_process_share: rows.length === 0 ? 0 : unitProcessRows / rows.length,\n product_count: productCounts.size,\n products_with_flow_id: productSummary.filter((item) => item.stable_flow_id).length,\n products_without_flow_id: productSummary.filter((item) => !item.stable_flow_id).length,\n rows_missing_classification: rowsMissingClassification,\n rows_missing_craft: rowsMissingCraft,\n rows_missing_product: rowsMissingProduct,\n rows_missing_reference_exchange: rowsMissingReferenceExchange,\n metric_definitions: {\n domain_count_primary:\n 'Unique level-1 classification text; fallback to the deepest available classification when level 1 is missing.',\n craft_count:\n 'Unique normalized craft or route signatures derived from treatmentStandardsRoutes, or fallback technology/base-name text.',\n unit_process_rows: 'Rows whose typeOfDataSet contains the phrase \"Unit process\".',\n product_count:\n 'Unique reference products, keyed by reference flow ID when present and by normalized label fallback otherwise.',\n },\n },\n domainPrimarySummary,\n domainLeafSummary,\n craftSummary,\n productSummary,\n typeOfDataSetSummary,\n craftSourceSummary: toSortedArray(craftSourceCounts).map((item) => ({\n source_kind: item.key,\n count: item.count,\n })),\n productSourceSummary: toSortedArray(productSourceCounts).map((item) => ({\n source_kind: item.key,\n count: item.count,\n })),\n };\n}\n\nfunction escapePipe(value: unknown): string {\n return String(value ?? '').replace(/\\|/gu, '\\\\|');\n}\n\nfunction renderMarkdownReport(\n statistics: ProcessScopeStatisticsArtifacts,\n reportLang: 'en' | 'zh',\n): string {\n const isZh = reportLang === 'zh';\n const summary = statistics.summary;\n const lines: string[] = [];\n\n lines.push(isZh ? '# Process 覆盖统计' : '# Process Scope Statistics');\n lines.push('');\n lines.push(\n isZh ? `统计时间:${summary.generated_at_utc}` : `Generated at: ${summary.generated_at_utc}`,\n );\n lines.push(\n isZh\n ? `范围:\\`scope=${summary.scope}\\`, \\`state_codes=${summary.state_codes.join(',')}\\``\n : `Scope: \\`scope=${summary.scope}\\`, \\`state_codes=${summary.state_codes.join(',')}\\``,\n );\n lines.push('');\n lines.push(isZh ? '## 核心结果' : '## Headline Metrics');\n lines.push('');\n lines.push(\n `- ${isZh ? '总 process 行数' : 'Total process rows'}: \\`${summary.total_process_rows}\\``,\n );\n lines.push(\n `- ${isZh ? '可见 owner 数' : 'Distinct visible owners'}: \\`${summary.distinct_visible_owner_user_ids}\\``,\n );\n lines.push(\n `- ${isZh ? '领域数量(一级分类口径)' : 'Domain count (primary definition)'}: \\`${summary.domain_count_primary}\\``,\n );\n lines.push(\n `- ${isZh ? '领域数量(叶子分类口径)' : 'Domain count (leaf classification)'}: \\`${summary.domain_count_leaf}\\``,\n );\n lines.push(`- ${isZh ? '工艺/路线数量' : 'Craft / route count'}: \\`${summary.craft_count}\\``);\n lines.push(`- ${isZh ? '单元过程行数' : 'Unit-process rows'}: \\`${summary.unit_process_rows}\\``);\n lines.push(`- ${isZh ? '产品数量' : 'Product count'}: \\`${summary.product_count}\\``);\n lines.push('');\n lines.push(isZh ? '## 状态分布' : '## State-code Distribution');\n lines.push('');\n Object.entries(summary.rows_by_state_code).forEach(([stateCode, count]) => {\n lines.push(`- \\`state_code=${stateCode}\\`: \\`${count}\\``);\n });\n lines.push('');\n lines.push(isZh ? '## 统计口径' : '## Metric Definitions');\n lines.push('');\n lines.push(\n `- ${isZh ? '领域' : 'Domain'}: ${\n isZh\n ? '优先使用 classification level=1;若缺失,则回退到最深层分类。'\n : 'Prefer classification level 1; fall back to the deepest available classification when level 1 is missing.'\n }`,\n );\n lines.push(\n `- ${isZh ? '工艺' : 'Craft'}: ${\n isZh\n ? '优先使用 `treatmentStandardsRoutes`;为空时回退到技术说明首句,再回退到 `baseName`。'\n : 'Prefer `treatmentStandardsRoutes`; fall back to the first clause of technology text, then to `baseName`.'\n }`,\n );\n lines.push(\n `- ${isZh ? '单元过程' : 'Unit process'}: ${\n isZh\n ? '以 `typeOfDataSet` 是否包含 `Unit process` 为准。'\n : 'Rows are counted when `typeOfDataSet` contains `Unit process`.'\n }`,\n );\n lines.push(\n `- ${isZh ? '产品' : 'Product'}: ${\n isZh\n ? '优先按 reference flow UUID 聚合;缺失时回退到 reference flow 短描述,再回退到 process base name。'\n : 'Prefer reference-flow UUIDs; fall back to reference-flow short descriptions, then to process base names.'\n }`,\n );\n lines.push('');\n\n lines.push(isZh ? '## Top 领域' : '## Top Domains');\n lines.push('');\n lines.push(`| ${isZh ? '领域' : 'Domain'} | ${isZh ? '数量' : 'Count'} |`);\n lines.push('| --- | --- |');\n statistics.domainPrimarySummary.slice(0, 15).forEach((item) => {\n lines.push(`| ${escapePipe(item.domain)} | ${item.count} |`);\n });\n lines.push('');\n\n lines.push(isZh ? '## Top 工艺/路线' : '## Top Crafts / Routes');\n lines.push('');\n lines.push(\n `| ${isZh ? '工艺/路线' : 'Craft / Route'} | ${isZh ? '数量' : 'Count'} | ${isZh ? '来源' : 'Source'} |`,\n );\n lines.push('| --- | --- | --- |');\n statistics.craftSummary.slice(0, 15).forEach((item) => {\n lines.push(`| ${escapePipe(item.label)} | ${item.count} | ${item.source_kind} |`);\n });\n lines.push('');\n\n lines.push(isZh ? '## Top 产品' : '## Top Products');\n lines.push('');\n lines.push(\n `| ${isZh ? '产品' : 'Product'} | ${isZh ? '数量' : 'Count'} | ${isZh ? '标识来源' : 'Key source'} |`,\n );\n lines.push('| --- | --- | --- |');\n statistics.productSummary.slice(0, 15).forEach((item) => {\n lines.push(`| ${escapePipe(item.label)} | ${item.count} | ${item.source_kind} |`);\n });\n lines.push('');\n\n return `${lines.join('\\n')}\\n`;\n}\n\nfunction readSnapshotRows(filePath: string): SnapshotRow[] {\n return readJsonLinesArtifact(filePath)\n .map((row) => normalizeSnapshotRow(row))\n .filter((row): row is SnapshotRow => row !== null);\n}\n\nfunction readSnapshotManifest(filePath: string): JsonRecord | null {\n const value = readJsonArtifact(filePath);\n return isRecord(value) ? value : null;\n}\n\nexport async function runProcessScopeStatistics(\n options: RunProcessScopeStatisticsOptions,\n): Promise<ProcessScopeStatisticsReport> {\n const outDir = trimText(options.outDir);\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'PROCESS_SCOPE_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n const scope = ensureScope(options.scope);\n const stateCodes = normalizeStateCodes(options.stateCodes);\n const pageSize = toPositiveInteger(\n options.pageSize ?? DEFAULT_PAGE_SIZE,\n '--page-size',\n 'PROCESS_SCOPE_PAGE_SIZE_INVALID',\n );\n const timeoutMs = toPositiveInteger(\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n '--timeout-ms',\n 'PROCESS_SCOPE_TIMEOUT_INVALID',\n );\n const maxRetries = toPositiveInteger(\n options.maxRetries ?? DEFAULT_MAX_RETRIES,\n 'process scope statistics retry count',\n 'PROCESS_SCOPE_MAX_RETRIES_INVALID',\n );\n\n const resolvedOutDir = path.resolve(outDir);\n const snapshotRowsPath = path.join(resolvedOutDir, 'inputs', 'processes.snapshot.rows.jsonl');\n const snapshotManifestPath = path.join(\n resolvedOutDir,\n 'inputs',\n 'processes.snapshot.manifest.json',\n );\n const generatedAtUtc = nowIso(options.now);\n\n let rows: SnapshotRow[];\n let metadata: StatisticsMetadata;\n\n if (options.reuseSnapshot) {\n rows = readSnapshotRows(snapshotRowsPath);\n const manifest = readSnapshotManifest(snapshotManifestPath);\n metadata = {\n userId: normalizeOptionalToken(manifest?.user_id),\n maskedUserEmail: normalizeOptionalToken(manifest?.masked_user_email),\n totalRowsReportedByRemote:\n typeof manifest?.total_rows === 'number' ? manifest.total_rows : rows.length,\n };\n } else {\n const env = options.env ?? process.env;\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const restRuntime = requireSupabaseRestRuntime(env);\n const session = await resolveSupabaseUserSession({\n runtime: restRuntime,\n fetchImpl,\n timeoutMs,\n now: options.now ?? new Date(),\n });\n const userId =\n scope === 'current-user'\n ? await resolveCurrentUserId({\n env,\n fetchImpl,\n timeoutMs,\n now: options.now ?? new Date(),\n maxRetries,\n })\n : null;\n const snapshot = await fetchProcessRows({\n env,\n fetchImpl,\n timeoutMs,\n maxRetries,\n scope,\n stateCodes,\n pageSize,\n userId,\n });\n rows = snapshot.rows;\n metadata = {\n userId,\n maskedUserEmail: redactEmail(session.userEmail),\n totalRowsReportedByRemote: snapshot.total ?? rows.length,\n };\n\n writeJsonLinesArtifact(snapshotRowsPath, rows);\n writeJsonArtifact(snapshotManifestPath, {\n schema_version: 1,\n generated_at_utc: generatedAtUtc,\n masked_user_email: metadata.maskedUserEmail,\n user_id: metadata.userId,\n scope,\n state_codes: stateCodes,\n page_size: pageSize,\n total_rows: metadata.totalRowsReportedByRemote,\n });\n }\n\n const statistics = calculateStatistics(\n rows,\n {\n scope,\n stateCodes,\n },\n metadata,\n generatedAtUtc,\n );\n\n const summaryPath = path.join(resolvedOutDir, 'outputs', 'process-scope-summary.json');\n const domainPath = path.join(resolvedOutDir, 'outputs', 'domain-summary.json');\n const craftPath = path.join(resolvedOutDir, 'outputs', 'craft-summary.json');\n const productPath = path.join(resolvedOutDir, 'outputs', 'product-summary.json');\n const datasetTypePath = path.join(resolvedOutDir, 'outputs', 'type-of-dataset-summary.json');\n const reportPath = path.join(resolvedOutDir, 'reports', 'process-scope-statistics.md');\n const reportZhPath = path.join(resolvedOutDir, 'reports', 'process-scope-statistics.zh-CN.md');\n\n writeJsonArtifact(summaryPath, statistics.summary);\n writeJsonArtifact(domainPath, {\n primary: statistics.domainPrimarySummary,\n leaf: statistics.domainLeafSummary,\n });\n writeJsonArtifact(craftPath, {\n craft_summary: statistics.craftSummary,\n source_summary: statistics.craftSourceSummary,\n });\n writeJsonArtifact(productPath, {\n product_summary: statistics.productSummary,\n source_summary: statistics.productSourceSummary,\n });\n writeJsonArtifact(datasetTypePath, statistics.typeOfDataSetSummary);\n writeTextArtifact(reportPath, renderMarkdownReport(statistics, 'en'));\n writeTextArtifact(reportZhPath, renderMarkdownReport(statistics, 'zh'));\n\n return {\n schema_version: 1,\n generated_at_utc: generatedAtUtc,\n status: 'completed_process_scope_statistics',\n out_dir: resolvedOutDir,\n scope,\n state_codes: stateCodes,\n total_process_rows: statistics.summary.total_process_rows,\n domain_count_primary: statistics.summary.domain_count_primary,\n domain_count_leaf: statistics.summary.domain_count_leaf,\n craft_count: statistics.summary.craft_count,\n unit_process_rows: statistics.summary.unit_process_rows,\n product_count: statistics.summary.product_count,\n files: {\n snapshot_manifest: snapshotManifestPath,\n snapshot_rows: snapshotRowsPath,\n process_scope_summary: summaryPath,\n domain_summary: domainPath,\n craft_summary: craftPath,\n product_summary: productPath,\n type_of_dataset_summary: datasetTypePath,\n report: reportPath,\n report_zh: reportZhPath,\n },\n };\n}\n\nexport const __testInternals = {\n calculateStatistics,\n ensureScope,\n escapePipe,\n extractClassificationEntries,\n extractCraftCandidate,\n extractReferenceProduct,\n fetchJsonWithRetry,\n fetchProcessRows,\n getAnyLangText,\n getLangList,\n getLangText,\n normalizePayload,\n normalizeSignature,\n normalizeSnapshotRow,\n normalizeStateCodes,\n parseJsonResponse,\n readSnapshotManifest,\n resolveCurrentUserId,\n renderMarkdownReport,\n toPositiveInteger,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"process-scope-statistics.js","sourceRoot":"","sources":["../../../src/lib/process-scope-statistics.ts"],"names":[],"mappings":"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","sourcesContent":["// data-api-relations: processes\nimport path from 'node:path';\nimport {\n readJsonArtifact,\n readJsonLinesArtifact,\n writeJsonArtifact,\n writeJsonLinesArtifact,\n writeTextArtifact,\n} from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike, ResponseLike } from './http.js';\nimport {\n deriveSupabaseProjectBaseUrl,\n deriveSupabaseRestBaseUrl,\n requireSupabaseRestRuntime,\n} from './supabase-client.js';\nimport {\n applyDataApiProfileHeaders,\n buildDataApiUrl,\n resolveDataApiCapability,\n} from './supabase-data-api-contract.js';\nimport { resolveSupabaseUserSession } from './supabase-session.js';\nimport { redactEmail } from './credential-safety.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nconst DEFAULT_STATE_CODES = [0, 100] as const;\nconst DEFAULT_PAGE_SIZE = 200;\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 4;\n\ntype ProcessScopeStatisticsScope = 'visible' | 'current-user';\n\ntype SnapshotRow = {\n id: string;\n version: string;\n state_code: number | null;\n user_id: string | null;\n modified_at: string | null;\n model_id: string | null;\n json: JsonRecord;\n};\n\ntype ClassificationEntry = {\n level: number;\n text: string;\n};\n\ntype StatisticsMetadata = {\n userId: string | null;\n maskedUserEmail: string | null;\n totalRowsReportedByRemote: number | null;\n};\n\ntype StatisticsOptions = {\n scope: ProcessScopeStatisticsScope;\n stateCodes: number[];\n};\n\ntype CountRecord = {\n count: number;\n [key: string]: unknown;\n};\n\nexport type RunProcessScopeStatisticsOptions = {\n outDir: string;\n scope?: ProcessScopeStatisticsScope;\n stateCodes?: number[];\n pageSize?: number | null;\n reuseSnapshot?: boolean;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n maxRetries?: number;\n now?: Date;\n};\n\nexport type ProcessScopeStatisticsReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_process_scope_statistics';\n out_dir: string;\n scope: ProcessScopeStatisticsScope;\n state_codes: number[];\n total_process_rows: number;\n domain_count_primary: number;\n domain_count_leaf: number;\n craft_count: number;\n unit_process_rows: number;\n product_count: number;\n files: {\n snapshot_manifest: string;\n snapshot_rows: string;\n process_scope_summary: string;\n domain_summary: string;\n craft_summary: string;\n product_summary: string;\n type_of_dataset_summary: string;\n report: string;\n report_zh: string;\n };\n};\n\ntype ProcessScopeStatisticsSummary = {\n schema_version: 1;\n generated_at_utc: string;\n scope: ProcessScopeStatisticsScope;\n state_codes: number[];\n user_id: string | null;\n masked_user_email: string | null;\n total_process_rows: number;\n total_rows_reported_by_remote: number | null;\n rows_by_state_code: Record<string, number>;\n distinct_visible_owner_user_ids: number;\n domain_count_primary: number;\n domain_count_leaf: number;\n craft_count: number;\n unit_process_rows: number;\n unit_process_share: number;\n product_count: number;\n products_with_flow_id: number;\n products_without_flow_id: number;\n rows_missing_classification: number;\n rows_missing_craft: number;\n rows_missing_product: number;\n rows_missing_reference_exchange: number;\n metric_definitions: Record<string, string>;\n};\n\ntype ProcessScopeStatisticsArtifacts = {\n summary: ProcessScopeStatisticsSummary;\n domainPrimarySummary: Array<{\n domain: string;\n count: number;\n sample_path?: string;\n }>;\n domainLeafSummary: Array<{\n domain: string;\n count: number;\n sample_path?: string;\n }>;\n craftSummary: Array<{\n craft_signature: string;\n label: string;\n count: number;\n source_kind: string;\n }>;\n productSummary: Array<{\n product_key: string;\n label: string;\n count: number;\n stable_flow_id: string;\n stable_flow_version: string;\n source_kind: string;\n }>;\n typeOfDataSetSummary: Array<{\n type_of_dataset: string;\n count: number;\n }>;\n craftSourceSummary: Array<{\n source_kind: string;\n count: number;\n }>;\n productSourceSummary: Array<{\n source_kind: string;\n count: number;\n }>;\n};\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction trimText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction normalizeOptionalToken(value: unknown): string | null {\n const trimmed = trimText(value);\n return trimmed ? trimmed : null;\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction toPositiveInteger(value: number | null | undefined, label: string, code: string): number {\n if (!Number.isInteger(value) || (value as number) <= 0) {\n throw new CliError(`Expected ${label} to be a positive integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value as number;\n}\n\nfunction normalizeStateCodes(value: readonly number[] | undefined): number[] {\n if (!Array.isArray(value) || value.length === 0) {\n return [...DEFAULT_STATE_CODES];\n }\n\n const seen = new Set<number>();\n const normalized: number[] = [];\n for (const entry of value) {\n if (!Number.isInteger(entry) || entry < 0) {\n throw new CliError('Expected --state-codes to contain only non-negative integers.', {\n code: 'PROCESS_SCOPE_STATE_CODES_INVALID',\n exitCode: 2,\n });\n }\n if (!seen.has(entry)) {\n normalized.push(entry);\n seen.add(entry);\n }\n }\n if (normalized.length === 0) {\n throw new CliError('--state-codes must contain at least one state code.', {\n code: 'PROCESS_SCOPE_STATE_CODES_REQUIRED',\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nfunction ensureScope(value: string | undefined): ProcessScopeStatisticsScope {\n if (value === undefined || value === 'visible') {\n return 'visible';\n }\n if (value === 'current-user') {\n return 'current-user';\n }\n throw new CliError(\"Expected --scope to be either 'visible' or 'current-user'.\", {\n code: 'PROCESS_SCOPE_SCOPE_INVALID',\n exitCode: 2,\n });\n}\n\nasync function parseJsonResponse(response: ResponseLike, label: string): Promise<unknown> {\n const text = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n if (!text.trim()) {\n return null;\n }\n if (!contentType.includes('application/json')) {\n return text;\n }\n try {\n return JSON.parse(text);\n } catch (error) {\n throw new CliError(`${label} returned invalid JSON.`, {\n code: 'PROCESS_SCOPE_REMOTE_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n}\n\nasync function fetchJsonWithRetry(options: {\n url: string;\n init: RequestInit;\n label: string;\n fetchImpl: FetchLike;\n timeoutMs: number;\n maxRetries: number;\n}): Promise<{ status: number; headers: Headers; body: unknown }> {\n let lastError: unknown = null;\n\n for (let attempt = 1; attempt <= options.maxRetries; attempt += 1) {\n try {\n const response = await options.fetchImpl(options.url, {\n ...options.init,\n signal: AbortSignal.timeout(options.timeoutMs),\n });\n const body = await parseJsonResponse(response, options.label);\n if (!response.ok) {\n throw new CliError(`${options.label} failed with ${response.status}.`, {\n code: 'PROCESS_SCOPE_REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: {\n status: response.status,\n body,\n url: options.url,\n },\n });\n }\n return {\n status: response.status,\n headers: new Headers({\n 'content-range': response.headers.get('content-range') ?? '',\n 'content-type': response.headers.get('content-type') ?? '',\n }),\n body,\n };\n } catch (error) {\n lastError = error;\n if (attempt >= options.maxRetries) {\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, attempt * 1_500));\n }\n }\n\n if (lastError instanceof CliError) {\n throw lastError;\n }\n\n throw new CliError(`${options.label} failed after ${options.maxRetries} attempt(s).`, {\n code: 'PROCESS_SCOPE_REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: String(lastError),\n });\n}\n\nasync function resolveCurrentUserId(options: {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n now: Date;\n maxRetries: number;\n}): Promise<string> {\n const runtime = requireSupabaseRestRuntime(options.env);\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n now: options.now,\n });\n const body = await fetchJsonWithRetry({\n url: `${deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl)}/auth/v1/user`,\n init: {\n method: 'GET',\n headers: {\n apikey: runtime.publishableKey,\n Authorization: `Bearer ${session.accessToken}`,\n Accept: 'application/json',\n },\n },\n label: 'supabase current-user lookup',\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n maxRetries: options.maxRetries,\n });\n\n const userId = isRecord(body.body) ? normalizeOptionalToken(body.body.id) : null;\n if (!userId) {\n throw new CliError('Supabase current-user lookup succeeded without a user id.', {\n code: 'PROCESS_SCOPE_CURRENT_USER_ID_MISSING',\n exitCode: 1,\n });\n }\n return userId;\n}\n\nasync function fetchProcessRows(options: {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n maxRetries: number;\n scope: ProcessScopeStatisticsScope;\n stateCodes: number[];\n pageSize: number;\n userId: string | null;\n}): Promise<{ rows: SnapshotRow[]; total: number | null }> {\n const runtime = requireSupabaseRestRuntime(options.env);\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n const projectBaseUrl = deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl);\n const processCapability = resolveDataApiCapability({\n kind: 'relation',\n name: 'processes',\n env: options.env,\n });\n const rows: SnapshotRow[] = [];\n let total = 0;\n\n for (const stateCode of options.stateCodes) {\n let stateTotal: number | null = null;\n let cursorId = '';\n\n while (true) {\n const url = new URL(\n buildDataApiUrl(deriveSupabaseRestBaseUrl(projectBaseUrl), processCapability),\n );\n url.searchParams.set('select', 'id,version,state_code,user_id,modified_at,model_id,json');\n url.searchParams.set('state_code', `eq.${stateCode}`);\n if (options.scope === 'current-user') {\n url.searchParams.set('user_id', `eq.${options.userId ?? ''}`);\n }\n if (cursorId) {\n url.searchParams.set('id', `gt.${cursorId}`);\n }\n url.searchParams.set('order', 'id.asc');\n url.searchParams.set('limit', String(options.pageSize));\n\n const page = await fetchJsonWithRetry({\n url: url.toString(),\n init: {\n method: 'GET',\n headers: applyDataApiProfileHeaders(\n {\n apikey: runtime.publishableKey,\n Authorization: `Bearer ${session.accessToken}`,\n Accept: 'application/json',\n ...(stateTotal === null ? { Prefer: 'count=exact' } : {}),\n },\n processCapability,\n ),\n },\n label: `process scope statistics page fetch (state_code=${stateCode})`,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n maxRetries: options.maxRetries,\n });\n\n const pageRows = Array.isArray(page.body) ? page.body : [];\n const normalizedRows = pageRows\n .map((row) => normalizeSnapshotRow(row))\n .filter((row): row is SnapshotRow => row !== null);\n rows.push(...normalizedRows);\n\n if (stateTotal === null) {\n const match = page.headers.get('content-range')?.match(/\\/(\\d+)$/u) ?? null;\n stateTotal = match ? Number.parseInt(match[1]!, 10) : null;\n if (stateTotal !== null) {\n total += stateTotal;\n }\n }\n\n if (normalizedRows.length < options.pageSize) {\n break;\n }\n\n const lastRow = normalizedRows[normalizedRows.length - 1]!;\n cursorId = lastRow.id;\n }\n }\n\n return {\n rows,\n total: total || null,\n };\n}\n\nfunction normalizeSnapshotRow(value: unknown): SnapshotRow | null {\n if (!isRecord(value)) {\n return null;\n }\n const id = normalizeOptionalToken(value.id);\n const version = normalizeOptionalToken(value.version);\n const payload = normalizePayload(value.json);\n if (!id || !version || !payload) {\n return null;\n }\n return {\n id,\n version,\n state_code: typeof value.state_code === 'number' ? value.state_code : null,\n user_id: normalizeOptionalToken(value.user_id),\n modified_at: normalizeOptionalToken(value.modified_at),\n model_id: normalizeOptionalToken(value.model_id),\n json: payload,\n };\n}\n\nfunction normalizePayload(value: unknown): JsonRecord | null {\n if (isRecord(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim()) {\n try {\n const parsed = JSON.parse(value);\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n }\n return null;\n}\n\nfunction getLangList(value: unknown): JsonRecord[] {\n if (value === null || value === undefined || value === '') {\n return [];\n }\n if (Array.isArray(value)) {\n return value.filter((item): item is JsonRecord => isRecord(item));\n }\n if (isRecord(value)) {\n const langString = value['common:langString'];\n if (Array.isArray(langString)) {\n return langString.filter((item): item is JsonRecord => isRecord(item));\n }\n if (isRecord(langString)) {\n return [langString];\n }\n if (typeof value['#text'] === 'string' || typeof value['@xml:lang'] === 'string') {\n return [value];\n }\n }\n if (typeof value === 'string') {\n return [{ '@xml:lang': 'en', '#text': value }];\n }\n return [];\n}\n\nfunction getLangText(value: unknown, lang: string | null): string {\n const list = getLangList(value);\n const exact =\n lang === null\n ? null\n : list.find(\n (item) =>\n trimText(item['@xml:lang']).toLowerCase() === lang.toLowerCase() &&\n trimText(item['#text']),\n );\n const fallback = list.find((item) => trimText(item['#text']));\n return trimText((exact ?? fallback)?.['#text']);\n}\n\nfunction getAnyLangText(value: unknown): string {\n return getLangText(value, null);\n}\n\nfunction asArray(value: unknown): unknown[] {\n if (value === null || value === undefined || value === '') {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n\nfunction extractClassificationEntries(dataSetInformation: JsonRecord): ClassificationEntry[] {\n const classes = asArray(\n (dataSetInformation.classificationInformation as JsonRecord | undefined)?.[\n 'common:classification'\n ] &&\n (\n (dataSetInformation.classificationInformation as JsonRecord)['common:classification'] as\n JsonRecord | undefined\n )?.['common:class'],\n );\n\n return classes\n .map((entry) => {\n if (!isRecord(entry)) {\n return null;\n }\n const level = Number.parseInt(trimText(entry['@level']) || '0', 10);\n const text = trimText(entry['#text']);\n if (!text) {\n return null;\n }\n return { level, text };\n })\n .filter((entry): entry is ClassificationEntry => entry !== null)\n .sort((left, right) => left.level - right.level);\n}\n\nfunction normalizeSignature(text: string): string {\n return trimText(text)\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[\\u3000\\u00a0]/gu, ' ')\n .replace(/[,,;;::()()[\\]{}<>|/\\\\]+/gu, ' ')\n .replace(/\\s+/gu, ' ')\n .trim();\n}\n\nfunction firstClause(text: string): string {\n const normalized = trimText(text);\n if (!normalized) {\n return '';\n }\n const [first] = normalized.split(/[.;;。]/u);\n return first.trim();\n}\n\nfunction renderProcessName(name: JsonRecord): string {\n const parts = [\n getLangText(name.baseName, 'en') ||\n getLangText(name.baseName, 'zh') ||\n getAnyLangText(name.baseName),\n getLangText(name.treatmentStandardsRoutes, 'en') ||\n getLangText(name.treatmentStandardsRoutes, 'zh') ||\n getAnyLangText(name.treatmentStandardsRoutes),\n getLangText(name.mixAndLocationTypes, 'en') ||\n getLangText(name.mixAndLocationTypes, 'zh') ||\n getAnyLangText(name.mixAndLocationTypes),\n getLangText(name.functionalUnitFlowProperties, 'en') ||\n getLangText(name.functionalUnitFlowProperties, 'zh') ||\n getAnyLangText(name.functionalUnitFlowProperties),\n ].filter((part) => trimText(part));\n\n return parts.join('; ');\n}\n\nfunction extractCraftCandidate(\n dataSetInformation: JsonRecord,\n technology: JsonRecord,\n): {\n source_kind: string;\n label: string;\n signature: string;\n} {\n const name = isRecord(dataSetInformation.name) ? dataSetInformation.name : {};\n const candidates = [\n {\n source_kind: 'treatmentStandardsRoutes',\n label:\n getLangText(name.treatmentStandardsRoutes, 'en') ||\n getLangText(name.treatmentStandardsRoutes, 'zh') ||\n getAnyLangText(name.treatmentStandardsRoutes),\n },\n {\n source_kind: 'technologyDescriptionAndIncludedProcesses',\n label:\n firstClause(getLangText(technology.technologyDescriptionAndIncludedProcesses, 'en')) ||\n firstClause(getLangText(technology.technologyDescriptionAndIncludedProcesses, 'zh')) ||\n firstClause(getAnyLangText(technology.technologyDescriptionAndIncludedProcesses)),\n },\n {\n source_kind: 'baseName',\n label:\n getLangText(name.baseName, 'en') ||\n getLangText(name.baseName, 'zh') ||\n getAnyLangText(name.baseName),\n },\n ];\n\n for (const candidate of candidates) {\n if (trimText(candidate.label)) {\n return {\n ...candidate,\n signature: normalizeSignature(candidate.label),\n };\n }\n }\n\n return {\n source_kind: 'missing',\n label: '',\n signature: '',\n };\n}\n\nfunction extractReferenceProduct(\n processDataSet: JsonRecord,\n dataSetInformation: JsonRecord,\n): {\n key: string;\n stable_flow_id: string;\n stable_flow_version: string;\n label: string;\n source_kind: string;\n missing_reference_exchange: boolean;\n} {\n const processInformation = isRecord(processDataSet.processInformation)\n ? processDataSet.processInformation\n : {};\n const quantRef = isRecord(processInformation.quantitativeReference)\n ? processInformation.quantitativeReference\n : {};\n const refInternalId = trimText(quantRef.referenceToReferenceFlow);\n const exchangesBlock = isRecord(processDataSet.exchanges) ? processDataSet.exchanges : {};\n const exchanges = asArray(exchangesBlock.exchange);\n const refExchange = exchanges.find(\n (exchange) => isRecord(exchange) && trimText(exchange['@dataSetInternalID']) === refInternalId,\n );\n const exchange = isRecord(refExchange) ? refExchange : null;\n const flowRef =\n exchange && isRecord(exchange.referenceToFlowDataSet) ? exchange.referenceToFlowDataSet : {};\n\n const flowRefId = trimText(flowRef['@refObjectId']);\n const flowRefVersion = trimText(flowRef['@version']);\n const shortDescription =\n getLangText(flowRef['common:shortDescription'], 'en') ||\n getLangText(flowRef['common:shortDescription'], 'zh') ||\n getAnyLangText(flowRef['common:shortDescription']);\n const name = isRecord(dataSetInformation.name) ? dataSetInformation.name : {};\n const fallbackBaseName =\n getLangText(name.baseName, 'en') ||\n getLangText(name.baseName, 'zh') ||\n getAnyLangText(name.baseName);\n const fallbackProcessName = renderProcessName(name);\n\n if (flowRefId) {\n return {\n key: `flow:${flowRefId}`,\n stable_flow_id: flowRefId,\n stable_flow_version: flowRefVersion,\n label: shortDescription || fallbackProcessName || flowRefId,\n source_kind: 'reference_flow_id',\n missing_reference_exchange: exchange === null,\n };\n }\n\n if (shortDescription) {\n return {\n key: `label:${normalizeSignature(shortDescription)}`,\n stable_flow_id: '',\n stable_flow_version: '',\n label: shortDescription,\n source_kind: 'reference_flow_short_description',\n missing_reference_exchange: exchange === null,\n };\n }\n\n if (fallbackBaseName) {\n return {\n key: `base:${normalizeSignature(fallbackBaseName)}`,\n stable_flow_id: '',\n stable_flow_version: '',\n label: fallbackBaseName,\n source_kind: 'process_base_name',\n missing_reference_exchange: exchange === null,\n };\n }\n\n return {\n key: '',\n stable_flow_id: '',\n stable_flow_version: '',\n label: '',\n source_kind: 'missing',\n missing_reference_exchange: exchange === null,\n };\n}\n\nfunction incrementCount(\n map: Map<string, CountRecord>,\n key: string,\n seed: Record<string, unknown> = {},\n): void {\n const existing = map.get(key) ?? {\n count: 0,\n ...seed,\n };\n existing.count += 1;\n map.set(key, existing);\n}\n\nfunction toSortedArray(map: Map<string, CountRecord>): Array<{ key: string } & CountRecord> {\n return [...map.entries()]\n .map(([key, value]) => ({\n key,\n ...value,\n }))\n .sort((left, right) => right.count - left.count || left.key.localeCompare(right.key));\n}\n\nfunction calculateStatistics(\n rows: SnapshotRow[],\n options: StatisticsOptions,\n metadata: StatisticsMetadata,\n generatedAtUtc: string,\n): ProcessScopeStatisticsArtifacts {\n const stateCodeCounts = new Map<string, CountRecord>();\n const typeOfDataSetCounts = new Map<string, CountRecord>();\n const domainPrimaryCounts = new Map<string, CountRecord>();\n const domainLeafCounts = new Map<string, CountRecord>();\n const craftCounts = new Map<string, CountRecord>();\n const craftSourceCounts = new Map<string, CountRecord>();\n const productCounts = new Map<string, CountRecord>();\n const productSourceCounts = new Map<string, CountRecord>();\n const ownerCounts = new Map<string, CountRecord>();\n\n let rowsMissingClassification = 0;\n let rowsMissingCraft = 0;\n let rowsMissingProduct = 0;\n let rowsMissingReferenceExchange = 0;\n let unitProcessRows = 0;\n\n for (const row of rows) {\n incrementCount(stateCodeCounts, String(row.state_code ?? 'null'));\n incrementCount(ownerCounts, row.user_id ?? 'missing');\n\n const processDataSet = isRecord(row.json.processDataSet) ? row.json.processDataSet : {};\n const processInformation = isRecord(processDataSet.processInformation)\n ? processDataSet.processInformation\n : {};\n const dataSetInformation = isRecord(processInformation.dataSetInformation)\n ? processInformation.dataSetInformation\n : {};\n const technology = isRecord(processInformation.technology) ? processInformation.technology : {};\n const modellingAndValidation = isRecord(processDataSet.modellingAndValidation)\n ? processDataSet.modellingAndValidation\n : {};\n const lciMethod = isRecord(modellingAndValidation.LCIMethodAndAllocation)\n ? modellingAndValidation.LCIMethodAndAllocation\n : {};\n\n const typeOfDataSet = trimText(lciMethod.typeOfDataSet) || 'missing';\n incrementCount(typeOfDataSetCounts, typeOfDataSet);\n if (typeOfDataSet.toLowerCase().includes('unit process')) {\n unitProcessRows += 1;\n }\n\n const classificationEntries = extractClassificationEntries(dataSetInformation);\n const primaryDomain =\n classificationEntries.find((entry) => entry.level === 1)?.text ??\n classificationEntries[classificationEntries.length - 1]?.text ??\n '';\n const leafDomain = classificationEntries[classificationEntries.length - 1]?.text ?? '';\n if (primaryDomain) {\n incrementCount(domainPrimaryCounts, primaryDomain, {\n sample_path: classificationEntries.map((entry) => entry.text).join(' > '),\n });\n } else {\n rowsMissingClassification += 1;\n }\n if (leafDomain) {\n incrementCount(domainLeafCounts, leafDomain, {\n sample_path: classificationEntries.map((entry) => entry.text).join(' > '),\n });\n }\n\n const craft = extractCraftCandidate(dataSetInformation, technology);\n if (craft.signature) {\n incrementCount(craftCounts, craft.signature, {\n label: craft.label,\n source_kind: craft.source_kind,\n });\n incrementCount(craftSourceCounts, craft.source_kind);\n } else {\n rowsMissingCraft += 1;\n }\n\n const product = extractReferenceProduct(processDataSet, dataSetInformation);\n if (product.key) {\n incrementCount(productCounts, product.key, {\n label: product.label,\n stable_flow_id: product.stable_flow_id,\n stable_flow_version: product.stable_flow_version,\n source_kind: product.source_kind,\n });\n incrementCount(productSourceCounts, product.source_kind);\n } else {\n rowsMissingProduct += 1;\n }\n if (product.missing_reference_exchange) {\n rowsMissingReferenceExchange += 1;\n }\n }\n\n const domainPrimarySummary = toSortedArray(domainPrimaryCounts).map((item) => ({\n domain: item.key,\n count: item.count,\n sample_path: item.sample_path as string | undefined,\n }));\n const domainLeafSummary = toSortedArray(domainLeafCounts).map((item) => ({\n domain: item.key,\n count: item.count,\n sample_path: item.sample_path as string | undefined,\n }));\n const craftSummary = toSortedArray(craftCounts).map((item) => ({\n craft_signature: item.key,\n label: item.label as string,\n count: item.count,\n source_kind: item.source_kind as string,\n }));\n const productSummary = toSortedArray(productCounts).map((item) => ({\n product_key: item.key,\n label: item.label as string,\n count: item.count,\n stable_flow_id: item.stable_flow_id as string,\n stable_flow_version: item.stable_flow_version as string,\n source_kind: item.source_kind as string,\n }));\n const typeOfDataSetSummary = toSortedArray(typeOfDataSetCounts).map((item) => ({\n type_of_dataset: item.key,\n count: item.count,\n }));\n\n return {\n summary: {\n schema_version: 1,\n generated_at_utc: generatedAtUtc,\n scope: options.scope,\n state_codes: options.stateCodes,\n user_id: metadata.userId,\n masked_user_email: metadata.maskedUserEmail,\n total_process_rows: rows.length,\n total_rows_reported_by_remote: metadata.totalRowsReportedByRemote,\n rows_by_state_code: Object.fromEntries(\n [...stateCodeCounts.entries()].map(([key, value]) => [key, value.count]),\n ),\n distinct_visible_owner_user_ids: ownerCounts.size,\n domain_count_primary: domainPrimaryCounts.size,\n domain_count_leaf: domainLeafCounts.size,\n craft_count: craftCounts.size,\n unit_process_rows: unitProcessRows,\n unit_process_share: rows.length === 0 ? 0 : unitProcessRows / rows.length,\n product_count: productCounts.size,\n products_with_flow_id: productSummary.filter((item) => item.stable_flow_id).length,\n products_without_flow_id: productSummary.filter((item) => !item.stable_flow_id).length,\n rows_missing_classification: rowsMissingClassification,\n rows_missing_craft: rowsMissingCraft,\n rows_missing_product: rowsMissingProduct,\n rows_missing_reference_exchange: rowsMissingReferenceExchange,\n metric_definitions: {\n domain_count_primary:\n 'Unique level-1 classification text; fallback to the deepest available classification when level 1 is missing.',\n craft_count:\n 'Unique normalized craft or route signatures derived from treatmentStandardsRoutes, or fallback technology/base-name text.',\n unit_process_rows: 'Rows whose typeOfDataSet contains the phrase \"Unit process\".',\n product_count:\n 'Unique reference products, keyed by reference flow ID when present and by normalized label fallback otherwise.',\n },\n },\n domainPrimarySummary,\n domainLeafSummary,\n craftSummary,\n productSummary,\n typeOfDataSetSummary,\n craftSourceSummary: toSortedArray(craftSourceCounts).map((item) => ({\n source_kind: item.key,\n count: item.count,\n })),\n productSourceSummary: toSortedArray(productSourceCounts).map((item) => ({\n source_kind: item.key,\n count: item.count,\n })),\n };\n}\n\nfunction escapePipe(value: unknown): string {\n return String(value ?? '').replace(/\\|/gu, '\\\\|');\n}\n\nfunction renderMarkdownReport(\n statistics: ProcessScopeStatisticsArtifacts,\n reportLang: 'en' | 'zh',\n): string {\n const isZh = reportLang === 'zh';\n const summary = statistics.summary;\n const lines: string[] = [];\n\n lines.push(isZh ? '# Process 覆盖统计' : '# Process Scope Statistics');\n lines.push('');\n lines.push(\n isZh ? `统计时间:${summary.generated_at_utc}` : `Generated at: ${summary.generated_at_utc}`,\n );\n lines.push(\n isZh\n ? `范围:\\`scope=${summary.scope}\\`, \\`state_codes=${summary.state_codes.join(',')}\\``\n : `Scope: \\`scope=${summary.scope}\\`, \\`state_codes=${summary.state_codes.join(',')}\\``,\n );\n lines.push('');\n lines.push(isZh ? '## 核心结果' : '## Headline Metrics');\n lines.push('');\n lines.push(\n `- ${isZh ? '总 process 行数' : 'Total process rows'}: \\`${summary.total_process_rows}\\``,\n );\n lines.push(\n `- ${isZh ? '可见 owner 数' : 'Distinct visible owners'}: \\`${summary.distinct_visible_owner_user_ids}\\``,\n );\n lines.push(\n `- ${isZh ? '领域数量(一级分类口径)' : 'Domain count (primary definition)'}: \\`${summary.domain_count_primary}\\``,\n );\n lines.push(\n `- ${isZh ? '领域数量(叶子分类口径)' : 'Domain count (leaf classification)'}: \\`${summary.domain_count_leaf}\\``,\n );\n lines.push(`- ${isZh ? '工艺/路线数量' : 'Craft / route count'}: \\`${summary.craft_count}\\``);\n lines.push(`- ${isZh ? '单元过程行数' : 'Unit-process rows'}: \\`${summary.unit_process_rows}\\``);\n lines.push(`- ${isZh ? '产品数量' : 'Product count'}: \\`${summary.product_count}\\``);\n lines.push('');\n lines.push(isZh ? '## 状态分布' : '## State-code Distribution');\n lines.push('');\n Object.entries(summary.rows_by_state_code).forEach(([stateCode, count]) => {\n lines.push(`- \\`state_code=${stateCode}\\`: \\`${count}\\``);\n });\n lines.push('');\n lines.push(isZh ? '## 统计口径' : '## Metric Definitions');\n lines.push('');\n lines.push(\n `- ${isZh ? '领域' : 'Domain'}: ${\n isZh\n ? '优先使用 classification level=1;若缺失,则回退到最深层分类。'\n : 'Prefer classification level 1; fall back to the deepest available classification when level 1 is missing.'\n }`,\n );\n lines.push(\n `- ${isZh ? '工艺' : 'Craft'}: ${\n isZh\n ? '优先使用 `treatmentStandardsRoutes`;为空时回退到技术说明首句,再回退到 `baseName`。'\n : 'Prefer `treatmentStandardsRoutes`; fall back to the first clause of technology text, then to `baseName`.'\n }`,\n );\n lines.push(\n `- ${isZh ? '单元过程' : 'Unit process'}: ${\n isZh\n ? '以 `typeOfDataSet` 是否包含 `Unit process` 为准。'\n : 'Rows are counted when `typeOfDataSet` contains `Unit process`.'\n }`,\n );\n lines.push(\n `- ${isZh ? '产品' : 'Product'}: ${\n isZh\n ? '优先按 reference flow UUID 聚合;缺失时回退到 reference flow 短描述,再回退到 process base name。'\n : 'Prefer reference-flow UUIDs; fall back to reference-flow short descriptions, then to process base names.'\n }`,\n );\n lines.push('');\n\n lines.push(isZh ? '## Top 领域' : '## Top Domains');\n lines.push('');\n lines.push(`| ${isZh ? '领域' : 'Domain'} | ${isZh ? '数量' : 'Count'} |`);\n lines.push('| --- | --- |');\n statistics.domainPrimarySummary.slice(0, 15).forEach((item) => {\n lines.push(`| ${escapePipe(item.domain)} | ${item.count} |`);\n });\n lines.push('');\n\n lines.push(isZh ? '## Top 工艺/路线' : '## Top Crafts / Routes');\n lines.push('');\n lines.push(\n `| ${isZh ? '工艺/路线' : 'Craft / Route'} | ${isZh ? '数量' : 'Count'} | ${isZh ? '来源' : 'Source'} |`,\n );\n lines.push('| --- | --- | --- |');\n statistics.craftSummary.slice(0, 15).forEach((item) => {\n lines.push(`| ${escapePipe(item.label)} | ${item.count} | ${item.source_kind} |`);\n });\n lines.push('');\n\n lines.push(isZh ? '## Top 产品' : '## Top Products');\n lines.push('');\n lines.push(\n `| ${isZh ? '产品' : 'Product'} | ${isZh ? '数量' : 'Count'} | ${isZh ? '标识来源' : 'Key source'} |`,\n );\n lines.push('| --- | --- | --- |');\n statistics.productSummary.slice(0, 15).forEach((item) => {\n lines.push(`| ${escapePipe(item.label)} | ${item.count} | ${item.source_kind} |`);\n });\n lines.push('');\n\n return `${lines.join('\\n')}\\n`;\n}\n\nfunction readSnapshotRows(filePath: string): SnapshotRow[] {\n return readJsonLinesArtifact(filePath)\n .map((row) => normalizeSnapshotRow(row))\n .filter((row): row is SnapshotRow => row !== null);\n}\n\nfunction readSnapshotManifest(filePath: string): JsonRecord | null {\n const value = readJsonArtifact(filePath);\n return isRecord(value) ? value : null;\n}\n\nexport async function runProcessScopeStatistics(\n options: RunProcessScopeStatisticsOptions,\n): Promise<ProcessScopeStatisticsReport> {\n const outDir = trimText(options.outDir);\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'PROCESS_SCOPE_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n const scope = ensureScope(options.scope);\n const stateCodes = normalizeStateCodes(options.stateCodes);\n const pageSize = toPositiveInteger(\n options.pageSize ?? DEFAULT_PAGE_SIZE,\n '--page-size',\n 'PROCESS_SCOPE_PAGE_SIZE_INVALID',\n );\n const timeoutMs = toPositiveInteger(\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n '--timeout-ms',\n 'PROCESS_SCOPE_TIMEOUT_INVALID',\n );\n const maxRetries = toPositiveInteger(\n options.maxRetries ?? DEFAULT_MAX_RETRIES,\n 'process scope statistics retry count',\n 'PROCESS_SCOPE_MAX_RETRIES_INVALID',\n );\n\n const resolvedOutDir = path.resolve(outDir);\n const snapshotRowsPath = path.join(resolvedOutDir, 'inputs', 'processes.snapshot.rows.jsonl');\n const snapshotManifestPath = path.join(\n resolvedOutDir,\n 'inputs',\n 'processes.snapshot.manifest.json',\n );\n const generatedAtUtc = nowIso(options.now);\n\n let rows: SnapshotRow[];\n let metadata: StatisticsMetadata;\n\n if (options.reuseSnapshot) {\n rows = readSnapshotRows(snapshotRowsPath);\n const manifest = readSnapshotManifest(snapshotManifestPath);\n metadata = {\n userId: normalizeOptionalToken(manifest?.user_id),\n maskedUserEmail: normalizeOptionalToken(manifest?.masked_user_email),\n totalRowsReportedByRemote:\n typeof manifest?.total_rows === 'number' ? manifest.total_rows : rows.length,\n };\n } else {\n const env = options.env ?? process.env;\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const restRuntime = requireSupabaseRestRuntime(env);\n const session = await resolveSupabaseUserSession({\n runtime: restRuntime,\n fetchImpl,\n timeoutMs,\n now: options.now ?? new Date(),\n });\n const userId =\n scope === 'current-user'\n ? await resolveCurrentUserId({\n env,\n fetchImpl,\n timeoutMs,\n now: options.now ?? new Date(),\n maxRetries,\n })\n : null;\n const snapshot = await fetchProcessRows({\n env,\n fetchImpl,\n timeoutMs,\n maxRetries,\n scope,\n stateCodes,\n pageSize,\n userId,\n });\n rows = snapshot.rows;\n metadata = {\n userId,\n maskedUserEmail: redactEmail(session.userEmail),\n totalRowsReportedByRemote: snapshot.total ?? rows.length,\n };\n\n writeJsonLinesArtifact(snapshotRowsPath, rows);\n writeJsonArtifact(snapshotManifestPath, {\n schema_version: 1,\n generated_at_utc: generatedAtUtc,\n masked_user_email: metadata.maskedUserEmail,\n user_id: metadata.userId,\n scope,\n state_codes: stateCodes,\n page_size: pageSize,\n total_rows: metadata.totalRowsReportedByRemote,\n });\n }\n\n const statistics = calculateStatistics(\n rows,\n {\n scope,\n stateCodes,\n },\n metadata,\n generatedAtUtc,\n );\n\n const summaryPath = path.join(resolvedOutDir, 'outputs', 'process-scope-summary.json');\n const domainPath = path.join(resolvedOutDir, 'outputs', 'domain-summary.json');\n const craftPath = path.join(resolvedOutDir, 'outputs', 'craft-summary.json');\n const productPath = path.join(resolvedOutDir, 'outputs', 'product-summary.json');\n const datasetTypePath = path.join(resolvedOutDir, 'outputs', 'type-of-dataset-summary.json');\n const reportPath = path.join(resolvedOutDir, 'reports', 'process-scope-statistics.md');\n const reportZhPath = path.join(resolvedOutDir, 'reports', 'process-scope-statistics.zh-CN.md');\n\n writeJsonArtifact(summaryPath, statistics.summary);\n writeJsonArtifact(domainPath, {\n primary: statistics.domainPrimarySummary,\n leaf: statistics.domainLeafSummary,\n });\n writeJsonArtifact(craftPath, {\n craft_summary: statistics.craftSummary,\n source_summary: statistics.craftSourceSummary,\n });\n writeJsonArtifact(productPath, {\n product_summary: statistics.productSummary,\n source_summary: statistics.productSourceSummary,\n });\n writeJsonArtifact(datasetTypePath, statistics.typeOfDataSetSummary);\n writeTextArtifact(reportPath, renderMarkdownReport(statistics, 'en'));\n writeTextArtifact(reportZhPath, renderMarkdownReport(statistics, 'zh'));\n\n return {\n schema_version: 1,\n generated_at_utc: generatedAtUtc,\n status: 'completed_process_scope_statistics',\n out_dir: resolvedOutDir,\n scope,\n state_codes: stateCodes,\n total_process_rows: statistics.summary.total_process_rows,\n domain_count_primary: statistics.summary.domain_count_primary,\n domain_count_leaf: statistics.summary.domain_count_leaf,\n craft_count: statistics.summary.craft_count,\n unit_process_rows: statistics.summary.unit_process_rows,\n product_count: statistics.summary.product_count,\n files: {\n snapshot_manifest: snapshotManifestPath,\n snapshot_rows: snapshotRowsPath,\n process_scope_summary: summaryPath,\n domain_summary: domainPath,\n craft_summary: craftPath,\n product_summary: productPath,\n type_of_dataset_summary: datasetTypePath,\n report: reportPath,\n report_zh: reportZhPath,\n },\n };\n}\n\nexport const __testInternals = {\n calculateStatistics,\n ensureScope,\n escapePipe,\n extractClassificationEntries,\n extractCraftCandidate,\n extractReferenceProduct,\n fetchJsonWithRetry,\n fetchProcessRows,\n getAnyLangText,\n getLangList,\n getLangText,\n normalizePayload,\n normalizeSignature,\n normalizeSnapshotRow,\n normalizeStateCodes,\n parseJsonResponse,\n readSnapshotManifest,\n resolveCurrentUserId,\n renderMarkdownReport,\n toPositiveInteger,\n};\n"]}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { type PostgrestError } from '@supabase/supabase-js';
|
|
2
2
|
import type { FetchLike } from './http.js';
|
|
3
|
-
export type SupabaseAuthMode = 'oauth' | 'access_token'
|
|
3
|
+
export type SupabaseAuthMode = 'oauth' | 'access_token';
|
|
4
4
|
export type SupabaseRestRuntime = {
|
|
5
5
|
apiBaseUrl: string;
|
|
6
6
|
authMode: SupabaseAuthMode;
|
|
7
|
-
userApiKey: string | null;
|
|
8
7
|
oauthClientId: string | null;
|
|
9
8
|
oauthRedirectUri: string | null;
|
|
10
9
|
accessToken: string | null;
|
|
@@ -25,7 +24,6 @@ declare function resolveSupabaseAuthMode(options: {
|
|
|
25
24
|
configuredMode: string;
|
|
26
25
|
oauthClientId: string;
|
|
27
26
|
accessToken: string;
|
|
28
|
-
userApiKey: string;
|
|
29
27
|
}): SupabaseAuthMode | null;
|
|
30
28
|
export declare function requireSupabaseRestRuntime(env: NodeJS.ProcessEnv): SupabaseRestRuntime;
|
|
31
29
|
export declare function deriveSupabaseProjectBaseUrl(apiBaseUrl: string): string;
|
|
@@ -28,23 +28,21 @@ function resolveSupabaseAuthMode(options) {
|
|
|
28
28
|
return 'oauth';
|
|
29
29
|
case 'access-token':
|
|
30
30
|
return 'access_token';
|
|
31
|
-
case 'legacy-user-api-key':
|
|
32
|
-
return 'legacy_user_api_key';
|
|
33
31
|
default:
|
|
34
|
-
throw new CliError('TIANGONG_LCA_AUTH_MODE must be oauth
|
|
32
|
+
throw new CliError('TIANGONG_LCA_AUTH_MODE must be oauth or access-token.', {
|
|
33
|
+
code: 'SUPABASE_AUTH_MODE_INVALID',
|
|
34
|
+
exitCode: 2,
|
|
35
|
+
});
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
if (options.accessToken)
|
|
38
39
|
return 'access_token';
|
|
39
40
|
if (options.oauthClientId)
|
|
40
41
|
return 'oauth';
|
|
41
|
-
if (options.userApiKey)
|
|
42
|
-
return 'legacy_user_api_key';
|
|
43
42
|
return null;
|
|
44
43
|
}
|
|
45
44
|
export function requireSupabaseRestRuntime(env) {
|
|
46
45
|
const apiBaseUrl = trimToken(env.TIANGONG_LCA_API_BASE_URL);
|
|
47
|
-
const userApiKey = trimToken(env.TIANGONG_LCA_API_KEY);
|
|
48
46
|
const oauthClientId = trimToken(env.TIANGONG_LCA_OAUTH_CLIENT_ID);
|
|
49
47
|
const accessToken = trimToken(env.TIANGONG_LCA_ACCESS_TOKEN);
|
|
50
48
|
const configuredAuthMode = trimToken(env.TIANGONG_LCA_AUTH_MODE);
|
|
@@ -57,13 +55,12 @@ export function requireSupabaseRestRuntime(env) {
|
|
|
57
55
|
configuredMode: configuredAuthMode,
|
|
58
56
|
oauthClientId,
|
|
59
57
|
accessToken,
|
|
60
|
-
userApiKey,
|
|
61
58
|
});
|
|
62
59
|
if (!apiBaseUrl) {
|
|
63
60
|
missing.push('TIANGONG_LCA_API_BASE_URL');
|
|
64
61
|
}
|
|
65
62
|
if (!authMode) {
|
|
66
|
-
missing.push('TIANGONG_LCA_OAUTH_CLIENT_ID or TIANGONG_LCA_ACCESS_TOKEN
|
|
63
|
+
missing.push('TIANGONG_LCA_OAUTH_CLIENT_ID or TIANGONG_LCA_ACCESS_TOKEN');
|
|
67
64
|
}
|
|
68
65
|
if (!publishableKey) {
|
|
69
66
|
missing.push('TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY');
|
|
@@ -88,12 +85,6 @@ export function requireSupabaseRestRuntime(env) {
|
|
|
88
85
|
exitCode: 2,
|
|
89
86
|
});
|
|
90
87
|
}
|
|
91
|
-
if (resolvedAuthMode === 'legacy_user_api_key' && !userApiKey) {
|
|
92
|
-
throw new CliError('Legacy auth mode requires TIANGONG_LCA_API_KEY.', {
|
|
93
|
-
code: 'SUPABASE_LEGACY_API_KEY_REQUIRED',
|
|
94
|
-
exitCode: 2,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
88
|
const normalizedOAuthClientId = resolvedAuthMode === 'oauth' ? requireOAuthClientId(oauthClientId) : null;
|
|
98
89
|
const normalizedOAuthRedirectUri = resolvedAuthMode === 'oauth'
|
|
99
90
|
? requireOAuthLoopbackRedirectUri(trimToken(env.TIANGONG_LCA_OAUTH_REDIRECT_URI) || DEFAULT_OAUTH_REDIRECT_URI).redirectUri
|
|
@@ -101,7 +92,6 @@ export function requireSupabaseRestRuntime(env) {
|
|
|
101
92
|
return {
|
|
102
93
|
apiBaseUrl,
|
|
103
94
|
authMode: resolvedAuthMode,
|
|
104
|
-
userApiKey: resolvedAuthMode === 'legacy_user_api_key' ? userApiKey : null,
|
|
105
95
|
oauthClientId: normalizedOAuthClientId,
|
|
106
96
|
oauthRedirectUri: normalizedOAuthRedirectUri,
|
|
107
97
|
accessToken: resolvedAuthMode === 'access_token' ? accessToken : null,
|
|
@@ -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';\nimport { DEFAULT_OAUTH_REDIRECT_URI, requireOAuthLoopbackRedirectUri } from './oauth-loopback.js';\nimport { requireOAuthClientId } from './oauth-pkce.js';\nimport { isDataApiAuthRefreshReplaySafe } from './supabase-data-api-replay.js';\n\nexport type SupabaseAuthMode = 'oauth' | 'access_token' | 'legacy_user_api_key';\n\nexport type SupabaseRestRuntime = {\n apiBaseUrl: string;\n authMode: SupabaseAuthMode;\n userApiKey: string | null;\n oauthClientId: string | null;\n oauthRedirectUri: string | null;\n accessToken: string | null;\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\nfunction resolveSupabaseAuthMode(options: {\n configuredMode: string;\n oauthClientId: string;\n accessToken: string;\n userApiKey: string;\n}): SupabaseAuthMode | null {\n const configuredMode = options.configuredMode.trim().toLowerCase();\n if (configuredMode) {\n switch (configuredMode) {\n case 'oauth':\n return 'oauth';\n case 'access-token':\n return 'access_token';\n case 'legacy-user-api-key':\n return 'legacy_user_api_key';\n default:\n throw new CliError(\n 'TIANGONG_LCA_AUTH_MODE must be oauth, access-token, or legacy-user-api-key.',\n { code: 'SUPABASE_AUTH_MODE_INVALID', exitCode: 2 },\n );\n }\n }\n\n if (options.accessToken) return 'access_token';\n if (options.oauthClientId) return 'oauth';\n if (options.userApiKey) return 'legacy_user_api_key';\n return null;\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 oauthClientId = trimToken(env.TIANGONG_LCA_OAUTH_CLIENT_ID);\n const accessToken = trimToken(env.TIANGONG_LCA_ACCESS_TOKEN);\n const configuredAuthMode = trimToken(env.TIANGONG_LCA_AUTH_MODE);\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 const authMode = resolveSupabaseAuthMode({\n configuredMode: configuredAuthMode,\n oauthClientId,\n accessToken,\n userApiKey,\n });\n\n if (!apiBaseUrl) {\n missing.push('TIANGONG_LCA_API_BASE_URL');\n }\n\n if (!authMode) {\n missing.push(\n 'TIANGONG_LCA_OAUTH_CLIENT_ID or TIANGONG_LCA_ACCESS_TOKEN or TIANGONG_LCA_API_KEY',\n );\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 const resolvedAuthMode = authMode as SupabaseAuthMode;\n\n if (resolvedAuthMode === 'oauth' && !oauthClientId) {\n throw new CliError('OAuth auth mode requires TIANGONG_LCA_OAUTH_CLIENT_ID.', {\n code: 'SUPABASE_OAUTH_CLIENT_ID_REQUIRED',\n exitCode: 2,\n });\n }\n if (resolvedAuthMode === 'access_token' && !accessToken) {\n throw new CliError('Access-token auth mode requires TIANGONG_LCA_ACCESS_TOKEN.', {\n code: 'SUPABASE_ACCESS_TOKEN_REQUIRED',\n exitCode: 2,\n });\n }\n if (resolvedAuthMode === 'legacy_user_api_key' && !userApiKey) {\n throw new CliError('Legacy auth mode requires TIANGONG_LCA_API_KEY.', {\n code: 'SUPABASE_LEGACY_API_KEY_REQUIRED',\n exitCode: 2,\n });\n }\n\n const normalizedOAuthClientId =\n resolvedAuthMode === 'oauth' ? requireOAuthClientId(oauthClientId) : null;\n const normalizedOAuthRedirectUri =\n resolvedAuthMode === 'oauth'\n ? requireOAuthLoopbackRedirectUri(\n trimToken(env.TIANGONG_LCA_OAUTH_REDIRECT_URI) || DEFAULT_OAUTH_REDIRECT_URI,\n ).redirectUri\n : null;\n\n return {\n apiBaseUrl,\n authMode: resolvedAuthMode,\n userApiKey: resolvedAuthMode === 'legacy_user_api_key' ? userApiKey : null,\n oauthClientId: normalizedOAuthClientId,\n oauthRedirectUri: normalizedOAuthRedirectUri,\n accessToken: resolvedAuthMode === 'access_token' ? accessToken : null,\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 const method = (\n init?.method ?? (input instanceof Request ? input.method : 'GET')\n ).toUpperCase();\n const replaySafe = isDataApiAuthRefreshReplaySafe({\n url: typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url,\n method,\n });\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 replaySafe &&\n [401, 403].includes(responseLike.status) &&\n typeof runtime.refreshAccessToken === 'function'\n ) {\n const refreshedAccessToken = await runtime.refreshAccessToken();\n responseLike = await performFetch(\n input,\n {\n ...init,\n headers: buildResolvedHeaders(\n init?.headers,\n runtime.publishableKey,\n refreshedAccessToken,\n ),\n },\n fetchImpl,\n timeoutMs,\n );\n }\n\n return toResponse(responseLike, init?.method);\n };\n}\n\ntype SupabaseQueryResult<T> = {\n data: T | null;\n error: PostgrestError | null;\n status: number;\n};\n\nfunction formatPostgrestError(error: PostgrestError): {\n code: string | null;\n message: string;\n details: string | null;\n hint: string | null;\n} {\n return {\n code: typeof error.code === 'string' ? error.code : null,\n message: error.message,\n details: typeof error.details === 'string' ? error.details : null,\n hint: typeof error.hint === 'string' ? error.hint : null,\n };\n}\n\nfunction isPostgrestInvalidJsonError(error: PostgrestError, status: number): boolean {\n const code = trimToken(error.code);\n const message = trimToken(error.message);\n if (code) {\n return false;\n }\n\n if (status === 0 && /^SyntaxError:/u.test(message)) {\n return true;\n }\n\n return status >= 200 && status < 300;\n}\n\nfunction postgrestInvalidJsonDetails(error: PostgrestError): string {\n return trimToken(error.details) || trimToken(error.message) || 'invalid JSON response';\n}\n\nexport async function runSupabaseArrayQuery<T>(\n queryPromise: PromiseLike<SupabaseQueryResult<T[]>>,\n sourceUrl: string,\n): Promise<T[]> {\n const data = await runSupabaseQuery(queryPromise, sourceUrl);\n return (data ?? []) as T[];\n}\n\nexport async function runSupabaseQuery<T>(\n queryPromise: PromiseLike<SupabaseQueryResult<T>>,\n sourceUrl: string,\n): Promise<T | null> {\n try {\n const result = await queryPromise;\n if (result.error) {\n if (isPostgrestInvalidJsonError(result.error, result.status)) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: postgrestInvalidJsonDetails(result.error),\n });\n }\n\n throw new CliError(`HTTP ${result.status} returned from ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: formatPostgrestError(result.error),\n });\n }\n return result.data;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n\n if (error instanceof SyntaxError) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: error.message,\n });\n }\n\n throw new CliError(`Supabase request failed for ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nexport async function runSupabaseMutation(\n queryPromise: PromiseLike<{\n error: PostgrestError | null;\n status: number;\n }>,\n sourceUrl: string,\n): Promise<void> {\n try {\n const result = await queryPromise;\n if (result.error) {\n if (isPostgrestInvalidJsonError(result.error, result.status)) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: postgrestInvalidJsonDetails(result.error),\n });\n }\n\n throw new CliError(`HTTP ${result.status} returned from ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: formatPostgrestError(result.error),\n });\n }\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n\n if (error instanceof SyntaxError) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: error.message,\n });\n }\n\n throw new CliError(`Supabase request failed for ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nexport function createSupabaseDataClient(\n runtime: SupabaseDataRuntime,\n fetchImpl: FetchLike,\n timeoutMs: number,\n) {\n const projectBaseUrl = deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl);\n\n return {\n client: createClient(projectBaseUrl, runtime.publishableKey, {\n db: {\n // Core entity access is deliberately pinned to public. Never rely on\n // supabase-js/PostgREST's implicit default schema.\n schema: 'public',\n },\n auth: {\n autoRefreshToken: false,\n persistSession: false,\n detectSessionInUrl: false,\n },\n global: {\n fetch: createSupabaseFetch(fetchImpl, timeoutMs, runtime),\n },\n }),\n restBaseUrl: deriveSupabaseRestBaseUrl(projectBaseUrl),\n functionsBaseUrl: deriveSupabaseFunctionsBaseUrl(projectBaseUrl),\n };\n}\n\nexport const __testInternals = {\n postgrestInvalidJsonDetails,\n parseBooleanEnv,\n resolveSupabaseAuthMode,\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';\nimport { DEFAULT_OAUTH_REDIRECT_URI, requireOAuthLoopbackRedirectUri } from './oauth-loopback.js';\nimport { requireOAuthClientId } from './oauth-pkce.js';\nimport { isDataApiAuthRefreshReplaySafe } from './supabase-data-api-replay.js';\n\nexport type SupabaseAuthMode = 'oauth' | 'access_token';\n\nexport type SupabaseRestRuntime = {\n apiBaseUrl: string;\n authMode: SupabaseAuthMode;\n oauthClientId: string | null;\n oauthRedirectUri: string | null;\n accessToken: string | null;\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\nfunction resolveSupabaseAuthMode(options: {\n configuredMode: string;\n oauthClientId: string;\n accessToken: string;\n}): SupabaseAuthMode | null {\n const configuredMode = options.configuredMode.trim().toLowerCase();\n if (configuredMode) {\n switch (configuredMode) {\n case 'oauth':\n return 'oauth';\n case 'access-token':\n return 'access_token';\n default:\n throw new CliError('TIANGONG_LCA_AUTH_MODE must be oauth or access-token.', {\n code: 'SUPABASE_AUTH_MODE_INVALID',\n exitCode: 2,\n });\n }\n }\n\n if (options.accessToken) return 'access_token';\n if (options.oauthClientId) return 'oauth';\n return null;\n}\n\nexport function requireSupabaseRestRuntime(env: NodeJS.ProcessEnv): SupabaseRestRuntime {\n const apiBaseUrl = trimToken(env.TIANGONG_LCA_API_BASE_URL);\n const oauthClientId = trimToken(env.TIANGONG_LCA_OAUTH_CLIENT_ID);\n const accessToken = trimToken(env.TIANGONG_LCA_ACCESS_TOKEN);\n const configuredAuthMode = trimToken(env.TIANGONG_LCA_AUTH_MODE);\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 const authMode = resolveSupabaseAuthMode({\n configuredMode: configuredAuthMode,\n oauthClientId,\n accessToken,\n });\n\n if (!apiBaseUrl) {\n missing.push('TIANGONG_LCA_API_BASE_URL');\n }\n\n if (!authMode) {\n missing.push('TIANGONG_LCA_OAUTH_CLIENT_ID or TIANGONG_LCA_ACCESS_TOKEN');\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 const resolvedAuthMode = authMode as SupabaseAuthMode;\n\n if (resolvedAuthMode === 'oauth' && !oauthClientId) {\n throw new CliError('OAuth auth mode requires TIANGONG_LCA_OAUTH_CLIENT_ID.', {\n code: 'SUPABASE_OAUTH_CLIENT_ID_REQUIRED',\n exitCode: 2,\n });\n }\n if (resolvedAuthMode === 'access_token' && !accessToken) {\n throw new CliError('Access-token auth mode requires TIANGONG_LCA_ACCESS_TOKEN.', {\n code: 'SUPABASE_ACCESS_TOKEN_REQUIRED',\n exitCode: 2,\n });\n }\n const normalizedOAuthClientId =\n resolvedAuthMode === 'oauth' ? requireOAuthClientId(oauthClientId) : null;\n const normalizedOAuthRedirectUri =\n resolvedAuthMode === 'oauth'\n ? requireOAuthLoopbackRedirectUri(\n trimToken(env.TIANGONG_LCA_OAUTH_REDIRECT_URI) || DEFAULT_OAUTH_REDIRECT_URI,\n ).redirectUri\n : null;\n\n return {\n apiBaseUrl,\n authMode: resolvedAuthMode,\n oauthClientId: normalizedOAuthClientId,\n oauthRedirectUri: normalizedOAuthRedirectUri,\n accessToken: resolvedAuthMode === 'access_token' ? accessToken : null,\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 const method = (\n init?.method ?? (input instanceof Request ? input.method : 'GET')\n ).toUpperCase();\n const replaySafe = isDataApiAuthRefreshReplaySafe({\n url: typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url,\n method,\n });\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 replaySafe &&\n [401, 403].includes(responseLike.status) &&\n typeof runtime.refreshAccessToken === 'function'\n ) {\n const refreshedAccessToken = await runtime.refreshAccessToken();\n responseLike = await performFetch(\n input,\n {\n ...init,\n headers: buildResolvedHeaders(\n init?.headers,\n runtime.publishableKey,\n refreshedAccessToken,\n ),\n },\n fetchImpl,\n timeoutMs,\n );\n }\n\n return toResponse(responseLike, init?.method);\n };\n}\n\ntype SupabaseQueryResult<T> = {\n data: T | null;\n error: PostgrestError | null;\n status: number;\n};\n\nfunction formatPostgrestError(error: PostgrestError): {\n code: string | null;\n message: string;\n details: string | null;\n hint: string | null;\n} {\n return {\n code: typeof error.code === 'string' ? error.code : null,\n message: error.message,\n details: typeof error.details === 'string' ? error.details : null,\n hint: typeof error.hint === 'string' ? error.hint : null,\n };\n}\n\nfunction isPostgrestInvalidJsonError(error: PostgrestError, status: number): boolean {\n const code = trimToken(error.code);\n const message = trimToken(error.message);\n if (code) {\n return false;\n }\n\n if (status === 0 && /^SyntaxError:/u.test(message)) {\n return true;\n }\n\n return status >= 200 && status < 300;\n}\n\nfunction postgrestInvalidJsonDetails(error: PostgrestError): string {\n return trimToken(error.details) || trimToken(error.message) || 'invalid JSON response';\n}\n\nexport async function runSupabaseArrayQuery<T>(\n queryPromise: PromiseLike<SupabaseQueryResult<T[]>>,\n sourceUrl: string,\n): Promise<T[]> {\n const data = await runSupabaseQuery(queryPromise, sourceUrl);\n return (data ?? []) as T[];\n}\n\nexport async function runSupabaseQuery<T>(\n queryPromise: PromiseLike<SupabaseQueryResult<T>>,\n sourceUrl: string,\n): Promise<T | null> {\n try {\n const result = await queryPromise;\n if (result.error) {\n if (isPostgrestInvalidJsonError(result.error, result.status)) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: postgrestInvalidJsonDetails(result.error),\n });\n }\n\n throw new CliError(`HTTP ${result.status} returned from ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: formatPostgrestError(result.error),\n });\n }\n return result.data;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n\n if (error instanceof SyntaxError) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: error.message,\n });\n }\n\n throw new CliError(`Supabase request failed for ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nexport async function runSupabaseMutation(\n queryPromise: PromiseLike<{\n error: PostgrestError | null;\n status: number;\n }>,\n sourceUrl: string,\n): Promise<void> {\n try {\n const result = await queryPromise;\n if (result.error) {\n if (isPostgrestInvalidJsonError(result.error, result.status)) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: postgrestInvalidJsonDetails(result.error),\n });\n }\n\n throw new CliError(`HTTP ${result.status} returned from ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: formatPostgrestError(result.error),\n });\n }\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n\n if (error instanceof SyntaxError) {\n throw new CliError(`Remote response was not valid JSON for ${sourceUrl}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: error.message,\n });\n }\n\n throw new CliError(`Supabase request failed for ${sourceUrl}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nexport function createSupabaseDataClient(\n runtime: SupabaseDataRuntime,\n fetchImpl: FetchLike,\n timeoutMs: number,\n) {\n const projectBaseUrl = deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl);\n\n return {\n client: createClient(projectBaseUrl, runtime.publishableKey, {\n db: {\n // Core entity access is deliberately pinned to public. Never rely on\n // supabase-js/PostgREST's implicit default schema.\n schema: 'public',\n },\n auth: {\n autoRefreshToken: false,\n persistSession: false,\n detectSessionInUrl: false,\n },\n global: {\n fetch: createSupabaseFetch(fetchImpl, timeoutMs, runtime),\n },\n }),\n restBaseUrl: deriveSupabaseRestBaseUrl(projectBaseUrl),\n functionsBaseUrl: deriveSupabaseFunctionsBaseUrl(projectBaseUrl),\n };\n}\n\nexport const __testInternals = {\n postgrestInvalidJsonDetails,\n parseBooleanEnv,\n resolveSupabaseAuthMode,\n trimToken,\n};\n"]}
|