@tiangong-lca/cli 0.0.17 → 0.0.19
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 +2 -2
- package/assets/tidas-schemas/tidas_processes.json +29 -9
- package/dist/src/cli.js +3 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-remote-verify.js +28 -7
- package/dist/src/lib/dataset-remote-verify.js.map +1 -1
- package/dist/src/lib/dataset-save-draft-run.js +14 -6
- package/dist/src/lib/dataset-save-draft-run.js.map +1 -1
- package/package.json +2 -2
|
@@ -614,19 +614,40 @@ export async function runDatasetRemoteVerify(options) {
|
|
|
614
614
|
: null);
|
|
615
615
|
const lookupCache = new Map();
|
|
616
616
|
const checks = [];
|
|
617
|
+
// Pre-fetch the unique remote lookups in bounded-concurrency batches. Large
|
|
618
|
+
// reference closures (e.g. a mega-process referencing 1600+ flows) would
|
|
619
|
+
// otherwise serialize into thousands of sequential round-trips and take many
|
|
620
|
+
// minutes; the loop below then simply awaits the already-in-flight cached
|
|
621
|
+
// promises, preserving the existing per-reference error handling.
|
|
622
|
+
const REMOTE_LOOKUP_CONCURRENCY = 20;
|
|
623
|
+
const prefetch = [];
|
|
624
|
+
const prefetchQueued = new Set();
|
|
625
|
+
for (const reference of references) {
|
|
626
|
+
const lookupKey = uniqueLookupKey(reference);
|
|
627
|
+
if (reference.table && reference.id && lookupKey && !prefetchQueued.has(lookupKey)) {
|
|
628
|
+
prefetchQueued.add(lookupKey);
|
|
629
|
+
prefetch.push({
|
|
630
|
+
key: lookupKey,
|
|
631
|
+
request: { table: reference.table, id: reference.id, version: reference.version },
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
for (let offset = 0; offset < prefetch.length; offset += REMOTE_LOOKUP_CONCURRENCY) {
|
|
636
|
+
const batch = prefetch.slice(offset, offset + REMOTE_LOOKUP_CONCURRENCY);
|
|
637
|
+
await Promise.all(batch.map(({ key, request }) => {
|
|
638
|
+
const promise = lookupImpl(request);
|
|
639
|
+
lookupCache.set(key, promise);
|
|
640
|
+
return promise.then(() => undefined, () => undefined);
|
|
641
|
+
}));
|
|
642
|
+
}
|
|
617
643
|
for (const reference of references) {
|
|
618
644
|
let lookup = null;
|
|
619
645
|
let lookupFailed = false;
|
|
620
646
|
const lookupKey = uniqueLookupKey(reference);
|
|
621
647
|
if (reference.table && reference.id && lookupKey) {
|
|
648
|
+
// The bounded-concurrency prefetch above populated lookupCache for every
|
|
649
|
+
// reference that passes this same guard, so the promise is always present.
|
|
622
650
|
try {
|
|
623
|
-
if (!lookupCache.has(lookupKey)) {
|
|
624
|
-
lookupCache.set(lookupKey, lookupImpl({
|
|
625
|
-
table: reference.table,
|
|
626
|
-
id: reference.id,
|
|
627
|
-
version: reference.version,
|
|
628
|
-
}));
|
|
629
|
-
}
|
|
630
651
|
lookup = await lookupCache.get(lookupKey);
|
|
631
652
|
}
|
|
632
653
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-remote-verify.js","sourceRoot":"","sources":["../../../src/lib/dataset-remote-verify.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from 'node:crypto';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n type SupabaseDataRuntime,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\nimport {\n firstNonEmpty,\n isRecord,\n readDatasetRowsInput,\n trimToken,\n unwrapDatasetPayload,\n type JsonObject,\n} from './dataset-local.js';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nexport type RemoteDatasetTable =\n | 'contacts'\n | 'flowproperties'\n | 'flows'\n | 'lciamethods'\n | 'lifecyclemodels'\n | 'processes'\n | 'sources'\n | 'unitgroups';\n\nexport type RemoteVerificationReferenceRole = 'root' | 'reference';\nexport type RemoteVerificationRootPolicy = 'existing' | 'candidate';\n\nexport type RemoteVerificationStatus =\n | 'ok'\n | 'lookup_failed'\n | 'missing_dataset'\n | 'missing_version'\n | 'unsupported_type'\n | 'version_missing'\n | 'version_outdated';\n\nexport type RemoteVerificationIssueCode =\n | RemoteVerificationStatus\n | 'owner_mismatch'\n | 'payload_mismatch'\n | 'remote_payload_missing'\n | 'state_code_mismatch';\n\nexport type RemoteDatasetReference = {\n row_index: number;\n role: RemoteVerificationReferenceRole;\n table: RemoteDatasetTable | null;\n type: string | null;\n id: string | null;\n version: string | null;\n path: string;\n short_description: string | null;\n};\n\nexport type RemoteDatasetLookupRow = {\n id: string;\n version: string | null;\n};\n\nexport type RemoteDatasetLookup = {\n exact: RemoteDatasetLookupRow | null;\n latest: RemoteDatasetLookupRow | null;\n exact_source_url: string | null;\n latest_source_url: string | null;\n};\n\nexport type RemoteDatasetPayloadLookup = {\n id: string;\n version: string | null;\n user_id: string | null;\n state_code: number | null;\n modified_at: string | null;\n payload: JsonObject | null;\n source_url: string | null;\n};\n\nexport type RemoteDatasetLookupRequest = {\n table: RemoteDatasetTable;\n id: string;\n version: string | null;\n};\n\nexport type RemoteVerificationCheck = {\n row_index: number;\n role: RemoteVerificationReferenceRole;\n table: RemoteDatasetTable | null;\n type: string | null;\n id: string | null;\n version: string | null;\n path: string;\n short_description: string | null;\n status: RemoteVerificationIssueCode;\n exact_version: string | null;\n latest_version: string | null;\n exact_source_url: string | null;\n latest_source_url: string | null;\n message: string;\n remote_user_id?: string | null;\n remote_state_code?: number | null;\n remote_modified_at?: string | null;\n local_payload_sha256?: string | null;\n remote_payload_sha256?: string | null;\n};\n\nexport type RemoteVerificationBlocker = {\n code: RemoteVerificationIssueCode;\n severity: 'error';\n message: string;\n row_index: number;\n role: RemoteVerificationReferenceRole;\n table: RemoteDatasetTable | null;\n id: string | null;\n version: string | null;\n latest_version: string | null;\n path: string;\n};\n\nexport type DatasetRemoteVerificationReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'passed_remote_verification' | 'blocked_remote_verification';\n root_policy: RemoteVerificationRootPolicy;\n input_path: string;\n out_dir: string;\n counts: {\n rows: number;\n references: number;\n checked: number;\n blockers: number;\n root_readback_checks?: number;\n root_payload_mismatches?: number;\n by_status: Record<string, number>;\n by_table: Record<RemoteDatasetTable, number>;\n };\n blockers: RemoteVerificationBlocker[];\n files: {\n report: string;\n checks: string;\n blockers: string;\n };\n};\n\nexport type RunDatasetRemoteVerifyOptions = {\n inputPath: string;\n outDir: string;\n rootPolicy?: RemoteVerificationRootPolicy;\n compareRootPayload?: boolean;\n targetUserId?: string | null;\n stateCode?: number | null;\n rawInput?: unknown;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n lookupDatasetImpl?: (request: RemoteDatasetLookupRequest) => Promise<RemoteDatasetLookup>;\n lookupRootPayloadImpl?: (\n request: RemoteDatasetLookupRequest,\n ) => Promise<RemoteDatasetPayloadLookup | null>;\n};\n\ntype RootDatasetDescriptor = {\n wrapper: string;\n table: RemoteDatasetTable;\n type: string;\n information_key: string;\n};\n\nconst ROOT_DATASET_DESCRIPTORS: RootDatasetDescriptor[] = [\n {\n wrapper: 'processDataSet',\n table: 'processes',\n type: 'process data set',\n information_key: 'processInformation',\n },\n {\n wrapper: 'flowDataSet',\n table: 'flows',\n type: 'flow data set',\n information_key: 'flowInformation',\n },\n {\n wrapper: 'lifeCycleModelDataSet',\n table: 'lifecyclemodels',\n type: 'life cycle model data set',\n information_key: 'lifeCycleModelInformation',\n },\n {\n wrapper: 'sourceDataSet',\n table: 'sources',\n type: 'source data set',\n information_key: 'sourceInformation',\n },\n {\n wrapper: 'contactDataSet',\n table: 'contacts',\n type: 'contact data set',\n information_key: 'contactInformation',\n },\n {\n wrapper: 'flowPropertyDataSet',\n table: 'flowproperties',\n type: 'flow property data set',\n information_key: 'flowPropertiesInformation',\n },\n {\n wrapper: 'unitGroupDataSet',\n table: 'unitgroups',\n type: 'unit group data set',\n information_key: 'unitGroupInformation',\n },\n {\n wrapper: 'LCIAMethodDataSet',\n table: 'lciamethods',\n type: 'LCIA method data set',\n information_key: 'LCIAMethodInformation',\n },\n];\n\nconst TABLE_ALIASES = new Map<string, RemoteDatasetTable>([\n ['contact', 'contacts'],\n ['contact data set', 'contacts'],\n ['contacts', 'contacts'],\n ['flow', 'flows'],\n ['flow data set', 'flows'],\n ['flows', 'flows'],\n ['flow property', 'flowproperties'],\n ['flow property data set', 'flowproperties'],\n ['flowproperties', 'flowproperties'],\n ['lcia method', 'lciamethods'],\n ['lcia method data set', 'lciamethods'],\n ['lciamethod', 'lciamethods'],\n ['lciamethods', 'lciamethods'],\n ['life cycle model', 'lifecyclemodels'],\n ['life cycle model data set', 'lifecyclemodels'],\n ['lifecycle model', 'lifecyclemodels'],\n ['lifecycle model data set', 'lifecyclemodels'],\n ['lifecyclemodel', 'lifecyclemodels'],\n ['lifecyclemodels', 'lifecyclemodels'],\n ['process', 'processes'],\n ['process data set', 'processes'],\n ['processes', 'processes'],\n ['source', 'sources'],\n ['source data set', 'sources'],\n ['sources', 'sources'],\n ['unit group', 'unitgroups'],\n ['unit group data set', 'unitgroups'],\n ['unitgroup', 'unitgroups'],\n ['unitgroups', 'unitgroups'],\n]);\n\nconst PATH_TABLE_HINTS: Array<[RegExp, RemoteDatasetTable]> = [\n [/referenceToFlowDataSet$/u, 'flows'],\n [/referenceToProcess$/u, 'processes'],\n [/referenceToResultingProcess$/u, 'processes'],\n [/referenceToFlowPropertyDataSet$/u, 'flowproperties'],\n [/referenceToReferenceUnitGroup$/u, 'unitgroups'],\n [/referenceToLCIAMethodDataSet$/u, 'lciamethods'],\n [/referenceToDataSource$/u, 'sources'],\n [/referenceToExternalDocumentation$/u, 'sources'],\n [/referenceToDataSetFormat$/u, 'sources'],\n [/referenceToComplianceSystem$/u, 'sources'],\n [/referenceToDataSetUseApproval$/u, 'sources'],\n [/referenceToContact$/u, 'contacts'],\n [/referenceToCommissioner$/u, 'contacts'],\n [/referenceToPersonOrEntity/u, 'contacts'],\n [/referenceToNameOfReviewerAndInstitution$/u, 'contacts'],\n];\n\nconst EMPTY_STATUS_COUNTS: Record<string, number> = {\n ok: 0,\n lookup_failed: 0,\n missing_dataset: 0,\n missing_version: 0,\n owner_mismatch: 0,\n payload_mismatch: 0,\n remote_payload_missing: 0,\n state_code_mismatch: 0,\n unsupported_type: 0,\n version_missing: 0,\n version_outdated: 0,\n};\n\nconst EMPTY_TABLE_COUNTS: Record<RemoteDatasetTable, number> = {\n contacts: 0,\n flowproperties: 0,\n flows: 0,\n lciamethods: 0,\n lifecyclemodels: 0,\n processes: 0,\n sources: 0,\n unitgroups: 0,\n};\n\nfunction requireNonEmpty(value: string, label: string, code: string): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new CliError(`Missing required ${label} value.`, {\n code,\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction textValue(value: unknown): string | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return String(value);\n }\n return trimToken(value);\n}\n\nfunction normalizeTableToken(value: string | null): string | null {\n return value ? value.trim().replace(/\\s+/gu, ' ').toLowerCase() : null;\n}\n\nfunction tableFromType(value: string | null): RemoteDatasetTable | null {\n const normalized = normalizeTableToken(value);\n return normalized ? (TABLE_ALIASES.get(normalized) ?? null) : null;\n}\n\nfunction tableFromPath(pathExpression: string): RemoteDatasetTable | null {\n const pathEnd = pathExpression.split('/').filter(Boolean).at(-1) ?? '';\n return PATH_TABLE_HINTS.find(([pattern]) => pattern.test(pathEnd))?.[1] ?? null;\n}\n\nfunction shortDescription(value: unknown): string | null {\n if (typeof value === 'string') {\n return textValue(value);\n }\n if (Array.isArray(value)) {\n for (const entry of value) {\n const text = shortDescription(entry);\n if (text) {\n return text;\n }\n }\n return null;\n }\n if (isRecord(value)) {\n return textValue(value['#text'] ?? value.text ?? value.value);\n }\n return null;\n}\n\nfunction pointerPath(basePath: string, segment: string | number): string {\n const encoded = String(segment).replace(/~/gu, '~0').replace(/\\//gu, '~1');\n return `${basePath}/${encoded}`;\n}\n\nfunction unescapePointerSegment(segment: string): string {\n return segment.replace(/~1/gu, '/').replace(/~0/gu, '~');\n}\n\nfunction isFoundryTracePath(pathExpression: string): boolean {\n const segments = pathExpression.split('/').filter(Boolean).map(unescapePointerSegment);\n return (\n segments.includes('common:other') &&\n segments.some(\n (segment) =>\n segment.startsWith('tiangongfoundry:') && segment.toLowerCase().includes('trace'),\n )\n );\n}\n\nfunction rootOf(\n payload: JsonObject,\n): { descriptor: RootDatasetDescriptor; root: JsonObject } | null {\n for (const descriptor of ROOT_DATASET_DESCRIPTORS) {\n if (isRecord(payload[descriptor.wrapper])) {\n return { descriptor, root: payload[descriptor.wrapper] as JsonObject };\n }\n }\n return null;\n}\n\nfunction rootIdentity(row: JsonObject, payload: JsonObject): RemoteDatasetReference | null {\n const root = rootOf(payload);\n if (!root) {\n return null;\n }\n const information = isRecord(root.root[root.descriptor.information_key])\n ? (root.root[root.descriptor.information_key] as JsonObject)\n : {};\n const dataSetInformation = isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.root.administrativeInformation)\n ? root.root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n\n return {\n row_index: -1,\n role: 'root',\n table: root.descriptor.table,\n type: root.descriptor.type,\n id: firstNonEmpty(row.id, row.uuid, dataSetInformation['common:UUID']),\n version: firstNonEmpty(row.version, publicationAndOwnership['common:dataSetVersion']),\n path: `/${root.descriptor.wrapper}`,\n short_description: shortDescription(dataSetInformation.name ?? dataSetInformation.shortName),\n };\n}\n\nfunction referenceFromRecord(\n rowIndex: number,\n value: JsonObject,\n pathExpression: string,\n): RemoteDatasetReference | null {\n const id = firstNonEmpty(value['@refObjectId'], value.refObjectId, value.id);\n if (!id) {\n return null;\n }\n const type = firstNonEmpty(value['@type'], value.type);\n const table = tableFromType(type) ?? tableFromPath(pathExpression);\n return {\n row_index: rowIndex,\n role: 'reference',\n table,\n type,\n id,\n version: firstNonEmpty(value['@version'], value.version),\n path: pathExpression,\n short_description: shortDescription(value['common:shortDescription']),\n };\n}\n\nfunction flowReferenceFromRecord(\n rowIndex: number,\n value: JsonObject,\n pathExpression: string,\n): RemoteDatasetReference | null {\n const id = firstNonEmpty(value['@flowUUID']);\n return id\n ? {\n row_index: rowIndex,\n role: 'reference',\n table: 'flows',\n type: 'flow data set',\n id,\n version: firstNonEmpty(value['@version'], value.version),\n path: pointerPath(pathExpression, '@flowUUID'),\n short_description: null,\n }\n : null;\n}\n\nfunction collectReferencesFromValue(\n rowIndex: number,\n value: unknown,\n pathExpression: string,\n references: RemoteDatasetReference[],\n): void {\n if (isFoundryTracePath(pathExpression)) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((entry, index) =>\n collectReferencesFromValue(rowIndex, entry, pointerPath(pathExpression, index), references),\n );\n return;\n }\n\n if (!isRecord(value)) {\n return;\n }\n\n const ref = referenceFromRecord(rowIndex, value, pathExpression);\n if (ref) {\n references.push(ref);\n }\n const flowRef = flowReferenceFromRecord(rowIndex, value, pathExpression);\n if (flowRef) {\n references.push(flowRef);\n }\n for (const [key, nested] of Object.entries(value)) {\n collectReferencesFromValue(rowIndex, nested, pointerPath(pathExpression, key), references);\n }\n}\n\nexport function collectRemoteReferences(rows: JsonObject[]): RemoteDatasetReference[] {\n const references: RemoteDatasetReference[] = [];\n rows.forEach((row, index) => {\n const payload = unwrapDatasetPayload(row);\n const root = rootIdentity(row, payload);\n if (root) {\n references.push({ ...root, row_index: index });\n }\n collectReferencesFromValue(index, payload, '', references);\n });\n return references;\n}\n\nfunction compareVersions(left: string | null, right: string | null): number {\n if (!left && !right) {\n return 0;\n }\n if (!left) {\n return -1;\n }\n if (!right) {\n return 1;\n }\n const leftParts = left.split(/[._-]/u);\n const rightParts = right.split(/[._-]/u);\n const length = Math.max(leftParts.length, rightParts.length);\n for (let index = 0; index < length; index += 1) {\n const leftPart = leftParts[index] ?? '0';\n const rightPart = rightParts[index] ?? '0';\n const leftNumber = Number(leftPart);\n const rightNumber = Number(rightPart);\n if (Number.isFinite(leftNumber) && Number.isFinite(rightNumber)) {\n if (leftNumber !== rightNumber) {\n return leftNumber > rightNumber ? 1 : -1;\n }\n } else {\n const compared = leftPart.localeCompare(rightPart);\n if (compared !== 0) {\n return compared > 0 ? 1 : -1;\n }\n }\n }\n return 0;\n}\n\nfunction buildRemoteUrl(\n restBaseUrl: string,\n table: RemoteDatasetTable,\n id: string,\n version: string | null,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('id', `eq.${id}`);\n if (version) {\n url.searchParams.set('version', `eq.${version}`);\n } else {\n url.searchParams.set('order', 'version.desc');\n url.searchParams.set('limit', '1');\n }\n return url.toString();\n}\n\nfunction normalizeRows(value: unknown): RemoteDatasetLookupRow[] {\n return Array.isArray(value)\n ? value\n .filter(isRecord)\n .map((row) => ({\n id: firstNonEmpty(row.id) ?? '',\n version: firstNonEmpty(row.version),\n }))\n .filter((row) => Boolean(row.id))\n : [];\n}\n\nfunction stableJson(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(stableJson);\n }\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, stableJson(value[key])]),\n );\n }\n return value;\n}\n\nfunction sha256Json(value: unknown): string {\n return crypto\n .createHash('sha256')\n .update(JSON.stringify(stableJson(value)))\n .digest('hex');\n}\n\nfunction buildRemotePayloadUrl(\n restBaseUrl: string,\n table: RemoteDatasetTable,\n id: string,\n version: string,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('select', 'id,version,user_id,state_code,modified_at,json,json_ordered');\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction normalizePayloadRow(value: unknown): RemoteDatasetPayloadLookup | null {\n if (!isRecord(value)) {\n return null;\n }\n const payload = isRecord(value.json_ordered)\n ? value.json_ordered\n : isRecord(value.json)\n ? value.json\n : null;\n return {\n id: firstNonEmpty(value.id) ?? '',\n version: firstNonEmpty(value.version),\n user_id: firstNonEmpty(value.user_id),\n state_code: typeof value.state_code === 'number' ? value.state_code : null,\n modified_at: firstNonEmpty(value.modified_at),\n payload: payload as JsonObject | null,\n source_url: null,\n };\n}\n\nexport async function lookupRemoteDataset(options: {\n runtime: SupabaseDataRuntime;\n fetchImpl: FetchLike;\n timeoutMs: number;\n request: RemoteDatasetLookupRequest;\n}): Promise<RemoteDatasetLookup> {\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const exactSourceUrl = options.request.version\n ? buildRemoteUrl(\n restBaseUrl,\n options.request.table,\n options.request.id,\n options.request.version,\n )\n : null;\n const latestSourceUrl = buildRemoteUrl(\n restBaseUrl,\n options.request.table,\n options.request.id,\n null,\n );\n const exactRows = options.request.version\n ? normalizeRows(\n await runSupabaseArrayQuery(\n client\n .from(options.request.table)\n .select('id,version')\n .eq('id', options.request.id)\n .eq('version', options.request.version),\n exactSourceUrl as string,\n ),\n )\n : [];\n const latestRows = normalizeRows(\n await runSupabaseArrayQuery(\n client\n .from(options.request.table)\n .select('id,version')\n .eq('id', options.request.id)\n .order('version', { ascending: false })\n .limit(1),\n latestSourceUrl,\n ),\n );\n return {\n exact: exactRows[0] ?? null,\n latest: latestRows[0] ?? null,\n exact_source_url: exactSourceUrl,\n latest_source_url: latestSourceUrl,\n };\n}\n\nasync function lookupRemoteDatasetPayload(options: {\n runtime: SupabaseDataRuntime;\n fetchImpl: FetchLike;\n timeoutMs: number;\n request: RemoteDatasetLookupRequest;\n}): Promise<RemoteDatasetPayloadLookup | null> {\n if (!options.request.version) {\n return null;\n }\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const sourceUrl = buildRemotePayloadUrl(\n restBaseUrl,\n options.request.table,\n options.request.id,\n options.request.version,\n );\n const rows = await runSupabaseArrayQuery(\n client\n .from(options.request.table)\n .select('id,version,user_id,state_code,modified_at,json,json_ordered')\n .eq('id', options.request.id)\n .eq('version', options.request.version),\n sourceUrl,\n );\n const payloadRow = normalizePayloadRow(Array.isArray(rows) ? rows[0] : null);\n return payloadRow ? { ...payloadRow, source_url: sourceUrl } : null;\n}\n\nfunction checkMessage(reference: RemoteDatasetReference, status: RemoteVerificationStatus): string {\n const label = `${reference.table ?? reference.type ?? 'unknown'}:${reference.id ?? '-'}@${\n reference.version ?? '-'\n }`;\n switch (status) {\n case 'ok':\n return `Remote dataset reference is resolvable: ${label}.`;\n case 'lookup_failed':\n return `Remote lookup failed for dataset reference: ${label}.`;\n case 'missing_dataset':\n return `Remote dataset id does not exist: ${label}.`;\n case 'missing_version':\n return `Remote dataset id exists, but the requested version does not exist: ${label}.`;\n case 'unsupported_type':\n return `Dataset reference type cannot be mapped to a TianGong table: ${label}.`;\n case 'version_missing':\n return `Dataset reference is missing @version and cannot pass publish-readiness verification: ${label}.`;\n case 'version_outdated':\n return `Requested dataset version is lower than the latest published version: ${label}.`;\n }\n}\n\nfunction classifyCheck(\n reference: RemoteDatasetReference,\n lookup: RemoteDatasetLookup | null,\n lookupFailed: boolean,\n rootPolicy: RemoteVerificationRootPolicy,\n): RemoteVerificationCheck {\n let status: RemoteVerificationStatus = 'ok';\n if (!reference.table || !reference.id) {\n status = 'unsupported_type';\n } else if (lookupFailed) {\n status = 'lookup_failed';\n } else if (!reference.version) {\n status = 'version_missing';\n } else if (reference.role === 'root' && rootPolicy === 'candidate') {\n if (!lookup?.latest) {\n status = 'ok';\n } else if (!lookup.exact) {\n status =\n compareVersions(reference.version, lookup.latest.version) > 0\n ? 'ok'\n : compareVersions(lookup.latest.version, reference.version) > 0\n ? 'version_outdated'\n : 'missing_version';\n } else if (compareVersions(lookup.latest.version, reference.version) > 0) {\n status = 'version_outdated';\n }\n } else if (!lookup?.latest) {\n status = 'missing_dataset';\n } else if (!lookup.exact) {\n status = 'missing_version';\n } else if (compareVersions(lookup.latest.version, reference.version) > 0) {\n status = 'version_outdated';\n }\n return {\n ...reference,\n status,\n exact_version: lookup?.exact?.version ?? null,\n latest_version: lookup?.latest?.version ?? null,\n exact_source_url: lookup?.exact_source_url ?? null,\n latest_source_url: lookup?.latest_source_url ?? null,\n message: checkMessage(reference, status),\n };\n}\n\nfunction blockerFromCheck(check: RemoteVerificationCheck): RemoteVerificationBlocker | null {\n return check.status === 'ok'\n ? null\n : {\n code: check.status,\n severity: 'error',\n message: check.message,\n row_index: check.row_index,\n role: check.role,\n table: check.table,\n id: check.id,\n version: check.version,\n latest_version: check.latest_version,\n path: check.path,\n };\n}\n\nfunction makeRootReadbackCheck(\n reference: RemoteDatasetReference,\n status: RemoteVerificationIssueCode,\n message: string,\n remote: RemoteDatasetPayloadLookup | null,\n hashes: {\n local: string | null;\n remote: string | null;\n } = { local: null, remote: null },\n): RemoteVerificationCheck {\n return {\n ...reference,\n path: `${reference.path}#readback`,\n status,\n exact_version: remote?.version ?? null,\n latest_version: null,\n exact_source_url: remote?.source_url ?? null,\n latest_source_url: null,\n message,\n remote_user_id: remote?.user_id ?? null,\n remote_state_code: remote?.state_code ?? null,\n remote_modified_at: remote?.modified_at ?? null,\n local_payload_sha256: hashes.local,\n remote_payload_sha256: hashes.remote,\n };\n}\n\nfunction rootReadbackChecks(options: {\n reference: RemoteDatasetReference;\n localPayload: JsonObject;\n remote: RemoteDatasetPayloadLookup | null;\n compareRootPayload: boolean;\n targetUserId: string | null;\n stateCode: number | null;\n}): RemoteVerificationCheck[] {\n const { reference, localPayload, remote, compareRootPayload, targetUserId, stateCode } = options;\n if (!remote) {\n return [\n makeRootReadbackCheck(\n reference,\n 'missing_dataset',\n `Remote root payload was not found for ${reference.table}:${reference.id}@${reference.version}.`,\n null,\n ),\n ];\n }\n\n const checks: RemoteVerificationCheck[] = [];\n if (targetUserId && remote.user_id !== targetUserId) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'owner_mismatch',\n `Remote root owner ${remote.user_id ?? '<missing>'} does not match target user ${targetUserId}.`,\n remote,\n ),\n );\n }\n if (stateCode !== null && remote.state_code !== stateCode) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'state_code_mismatch',\n `Remote root state_code ${remote.state_code ?? '<missing>'} does not match required state_code ${stateCode}.`,\n remote,\n ),\n );\n }\n\n let hashes: { local: string | null; remote: string | null } = { local: null, remote: null };\n if (compareRootPayload) {\n if (!remote.payload) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'remote_payload_missing',\n `Remote root payload is missing for ${reference.table}:${reference.id}@${reference.version}.`,\n remote,\n ),\n );\n } else {\n hashes = {\n local: sha256Json(localPayload),\n remote: sha256Json(remote.payload),\n };\n if (hashes.local !== hashes.remote) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'payload_mismatch',\n `Remote root payload hash does not match local row for ${reference.table}:${reference.id}@${reference.version}.`,\n remote,\n hashes,\n ),\n );\n }\n }\n }\n\n if (checks.length > 0) {\n return checks;\n }\n return [\n makeRootReadbackCheck(\n reference,\n 'ok',\n `Remote root readback matches required owner, state, and payload checks for ${reference.table}:${reference.id}@${reference.version}.`,\n remote,\n hashes,\n ),\n ];\n}\n\nfunction buildFiles(outDir: string): DatasetRemoteVerificationReport['files'] {\n const resolved = path.resolve(outDir);\n return {\n report: path.join(resolved, 'outputs', 'remote-verification-report.json'),\n checks: path.join(resolved, 'outputs', 'remote-verification.jsonl'),\n blockers: path.join(resolved, 'outputs', 'blockers.jsonl'),\n };\n}\n\nfunction uniqueLookupKey(reference: RemoteDatasetReference): string | null {\n return reference.table && reference.id\n ? `${reference.table}:${reference.id}:${reference.version ?? ''}`\n : null;\n}\n\nexport async function runDatasetRemoteVerify(\n options: RunDatasetRemoteVerifyOptions,\n): Promise<DatasetRemoteVerificationReport> {\n const inputPath = path.resolve(\n requireNonEmpty(options.inputPath, '--input', 'DATASET_REMOTE_VERIFY_INPUT_REQUIRED'),\n );\n const outDir = path.resolve(\n requireNonEmpty(options.outDir, '--out-dir', 'DATASET_REMOTE_VERIFY_OUT_DIR_REQUIRED'),\n );\n const rows = readDatasetRowsInput(inputPath, options.rawInput);\n const references = collectRemoteReferences(rows);\n const rootPolicy = options.rootPolicy ?? 'existing';\n const compareRootPayload = options.compareRootPayload === true;\n const targetUserId = trimToken(options.targetUserId);\n const stateCode = options.stateCode ?? null;\n const needsRootReadback = compareRootPayload || Boolean(targetUserId) || stateCode !== null;\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const runtime =\n options.lookupDatasetImpl === undefined\n ? createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n })\n : null;\n const lookupImpl =\n options.lookupDatasetImpl ??\n ((request: RemoteDatasetLookupRequest) =>\n lookupRemoteDataset({\n runtime: runtime as SupabaseDataRuntime,\n fetchImpl,\n timeoutMs,\n request,\n }));\n const rootPayloadLookupImpl =\n options.lookupRootPayloadImpl ??\n (runtime\n ? (request: RemoteDatasetLookupRequest) =>\n lookupRemoteDatasetPayload({\n runtime: runtime as SupabaseDataRuntime,\n fetchImpl,\n timeoutMs,\n request,\n })\n : null);\n const lookupCache = new Map<string, Promise<RemoteDatasetLookup>>();\n const checks: RemoteVerificationCheck[] = [];\n\n for (const reference of references) {\n let lookup: RemoteDatasetLookup | null = null;\n let lookupFailed = false;\n const lookupKey = uniqueLookupKey(reference);\n if (reference.table && reference.id && lookupKey) {\n try {\n if (!lookupCache.has(lookupKey)) {\n lookupCache.set(\n lookupKey,\n lookupImpl({\n table: reference.table,\n id: reference.id,\n version: reference.version,\n }),\n );\n }\n lookup = await lookupCache.get(lookupKey)!;\n } catch {\n lookupFailed = true;\n }\n }\n checks.push(classifyCheck(reference, lookup, lookupFailed, rootPolicy));\n }\n\n if (needsRootReadback) {\n const rootChecks = checks.filter(\n (check) =>\n check.role === 'root' &&\n check.status === 'ok' &&\n check.table &&\n check.id &&\n (compareRootPayload || rootPolicy !== 'candidate' || Boolean(check.exact_version)),\n );\n for (const check of rootChecks) {\n const localPayload = unwrapDatasetPayload(rows[check.row_index]);\n let remotePayload: RemoteDatasetPayloadLookup | null;\n try {\n if (!rootPayloadLookupImpl) {\n throw new Error('root payload lookup is not available');\n }\n remotePayload = await rootPayloadLookupImpl({\n table: check.table as RemoteDatasetTable,\n id: check.id as string,\n version: check.version,\n });\n } catch {\n checks.push(\n makeRootReadbackCheck(\n check,\n 'lookup_failed',\n `Remote root payload lookup failed for ${check.table}:${check.id}@${check.version}.`,\n null,\n ),\n );\n continue;\n }\n checks.push(\n ...rootReadbackChecks({\n reference: check,\n localPayload,\n remote: remotePayload,\n compareRootPayload,\n targetUserId,\n stateCode,\n }),\n );\n }\n }\n\n const blockers = checks\n .map(blockerFromCheck)\n .filter((blocker): blocker is RemoteVerificationBlocker => blocker !== null);\n const byStatus = { ...EMPTY_STATUS_COUNTS };\n const byTable = { ...EMPTY_TABLE_COUNTS };\n checks.forEach((check) => {\n byStatus[check.status] ??= 0;\n byStatus[check.status] += 1;\n if (check.table) {\n byTable[check.table] += 1;\n }\n });\n const rootReadbackChecksCount = checks.filter((check) => check.path.endsWith('#readback')).length;\n const rootPayloadMismatches = checks.filter(\n (check) => check.status === 'payload_mismatch',\n ).length;\n\n const files = buildFiles(outDir);\n const report: DatasetRemoteVerificationReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: blockers.length > 0 ? 'blocked_remote_verification' : 'passed_remote_verification',\n root_policy: rootPolicy,\n input_path: inputPath,\n out_dir: outDir,\n counts: {\n rows: rows.length,\n references: references.length,\n checked: checks.length,\n blockers: blockers.length,\n ...(needsRootReadback ? { root_readback_checks: rootReadbackChecksCount } : {}),\n ...(needsRootReadback ? { root_payload_mismatches: rootPayloadMismatches } : {}),\n by_status: byStatus,\n by_table: byTable,\n },\n blockers,\n files,\n };\n\n writeJsonArtifact(files.report, report);\n writeJsonLinesArtifact(files.checks, checks);\n writeJsonLinesArtifact(files.blockers, blockers);\n\n return report;\n}\n\nexport const __testInternals = {\n buildRemotePayloadUrl,\n buildRemoteUrl,\n collectRemoteReferences,\n compareVersions,\n isFoundryTracePath,\n lookupRemoteDatasetPayload,\n lookupRemoteDataset,\n makeRootReadbackCheck,\n normalizePayloadRow,\n normalizeRows,\n rootReadbackChecks,\n sha256Json,\n shortDescription,\n tableFromPath,\n tableFromType,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"dataset-remote-verify.js","sourceRoot":"","sources":["../../../src/lib/dataset-remote-verify.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from 'node:crypto';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n createSupabaseDataClient,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n type SupabaseDataRuntime,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\nimport {\n firstNonEmpty,\n isRecord,\n readDatasetRowsInput,\n trimToken,\n unwrapDatasetPayload,\n type JsonObject,\n} from './dataset-local.js';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nexport type RemoteDatasetTable =\n | 'contacts'\n | 'flowproperties'\n | 'flows'\n | 'lciamethods'\n | 'lifecyclemodels'\n | 'processes'\n | 'sources'\n | 'unitgroups';\n\nexport type RemoteVerificationReferenceRole = 'root' | 'reference';\nexport type RemoteVerificationRootPolicy = 'existing' | 'candidate';\n\nexport type RemoteVerificationStatus =\n | 'ok'\n | 'lookup_failed'\n | 'missing_dataset'\n | 'missing_version'\n | 'unsupported_type'\n | 'version_missing'\n | 'version_outdated';\n\nexport type RemoteVerificationIssueCode =\n | RemoteVerificationStatus\n | 'owner_mismatch'\n | 'payload_mismatch'\n | 'remote_payload_missing'\n | 'state_code_mismatch';\n\nexport type RemoteDatasetReference = {\n row_index: number;\n role: RemoteVerificationReferenceRole;\n table: RemoteDatasetTable | null;\n type: string | null;\n id: string | null;\n version: string | null;\n path: string;\n short_description: string | null;\n};\n\nexport type RemoteDatasetLookupRow = {\n id: string;\n version: string | null;\n};\n\nexport type RemoteDatasetLookup = {\n exact: RemoteDatasetLookupRow | null;\n latest: RemoteDatasetLookupRow | null;\n exact_source_url: string | null;\n latest_source_url: string | null;\n};\n\nexport type RemoteDatasetPayloadLookup = {\n id: string;\n version: string | null;\n user_id: string | null;\n state_code: number | null;\n modified_at: string | null;\n payload: JsonObject | null;\n source_url: string | null;\n};\n\nexport type RemoteDatasetLookupRequest = {\n table: RemoteDatasetTable;\n id: string;\n version: string | null;\n};\n\nexport type RemoteVerificationCheck = {\n row_index: number;\n role: RemoteVerificationReferenceRole;\n table: RemoteDatasetTable | null;\n type: string | null;\n id: string | null;\n version: string | null;\n path: string;\n short_description: string | null;\n status: RemoteVerificationIssueCode;\n exact_version: string | null;\n latest_version: string | null;\n exact_source_url: string | null;\n latest_source_url: string | null;\n message: string;\n remote_user_id?: string | null;\n remote_state_code?: number | null;\n remote_modified_at?: string | null;\n local_payload_sha256?: string | null;\n remote_payload_sha256?: string | null;\n};\n\nexport type RemoteVerificationBlocker = {\n code: RemoteVerificationIssueCode;\n severity: 'error';\n message: string;\n row_index: number;\n role: RemoteVerificationReferenceRole;\n table: RemoteDatasetTable | null;\n id: string | null;\n version: string | null;\n latest_version: string | null;\n path: string;\n};\n\nexport type DatasetRemoteVerificationReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'passed_remote_verification' | 'blocked_remote_verification';\n root_policy: RemoteVerificationRootPolicy;\n input_path: string;\n out_dir: string;\n counts: {\n rows: number;\n references: number;\n checked: number;\n blockers: number;\n root_readback_checks?: number;\n root_payload_mismatches?: number;\n by_status: Record<string, number>;\n by_table: Record<RemoteDatasetTable, number>;\n };\n blockers: RemoteVerificationBlocker[];\n files: {\n report: string;\n checks: string;\n blockers: string;\n };\n};\n\nexport type RunDatasetRemoteVerifyOptions = {\n inputPath: string;\n outDir: string;\n rootPolicy?: RemoteVerificationRootPolicy;\n compareRootPayload?: boolean;\n targetUserId?: string | null;\n stateCode?: number | null;\n rawInput?: unknown;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n lookupDatasetImpl?: (request: RemoteDatasetLookupRequest) => Promise<RemoteDatasetLookup>;\n lookupRootPayloadImpl?: (\n request: RemoteDatasetLookupRequest,\n ) => Promise<RemoteDatasetPayloadLookup | null>;\n};\n\ntype RootDatasetDescriptor = {\n wrapper: string;\n table: RemoteDatasetTable;\n type: string;\n information_key: string;\n};\n\nconst ROOT_DATASET_DESCRIPTORS: RootDatasetDescriptor[] = [\n {\n wrapper: 'processDataSet',\n table: 'processes',\n type: 'process data set',\n information_key: 'processInformation',\n },\n {\n wrapper: 'flowDataSet',\n table: 'flows',\n type: 'flow data set',\n information_key: 'flowInformation',\n },\n {\n wrapper: 'lifeCycleModelDataSet',\n table: 'lifecyclemodels',\n type: 'life cycle model data set',\n information_key: 'lifeCycleModelInformation',\n },\n {\n wrapper: 'sourceDataSet',\n table: 'sources',\n type: 'source data set',\n information_key: 'sourceInformation',\n },\n {\n wrapper: 'contactDataSet',\n table: 'contacts',\n type: 'contact data set',\n information_key: 'contactInformation',\n },\n {\n wrapper: 'flowPropertyDataSet',\n table: 'flowproperties',\n type: 'flow property data set',\n information_key: 'flowPropertiesInformation',\n },\n {\n wrapper: 'unitGroupDataSet',\n table: 'unitgroups',\n type: 'unit group data set',\n information_key: 'unitGroupInformation',\n },\n {\n wrapper: 'LCIAMethodDataSet',\n table: 'lciamethods',\n type: 'LCIA method data set',\n information_key: 'LCIAMethodInformation',\n },\n];\n\nconst TABLE_ALIASES = new Map<string, RemoteDatasetTable>([\n ['contact', 'contacts'],\n ['contact data set', 'contacts'],\n ['contacts', 'contacts'],\n ['flow', 'flows'],\n ['flow data set', 'flows'],\n ['flows', 'flows'],\n ['flow property', 'flowproperties'],\n ['flow property data set', 'flowproperties'],\n ['flowproperties', 'flowproperties'],\n ['lcia method', 'lciamethods'],\n ['lcia method data set', 'lciamethods'],\n ['lciamethod', 'lciamethods'],\n ['lciamethods', 'lciamethods'],\n ['life cycle model', 'lifecyclemodels'],\n ['life cycle model data set', 'lifecyclemodels'],\n ['lifecycle model', 'lifecyclemodels'],\n ['lifecycle model data set', 'lifecyclemodels'],\n ['lifecyclemodel', 'lifecyclemodels'],\n ['lifecyclemodels', 'lifecyclemodels'],\n ['process', 'processes'],\n ['process data set', 'processes'],\n ['processes', 'processes'],\n ['source', 'sources'],\n ['source data set', 'sources'],\n ['sources', 'sources'],\n ['unit group', 'unitgroups'],\n ['unit group data set', 'unitgroups'],\n ['unitgroup', 'unitgroups'],\n ['unitgroups', 'unitgroups'],\n]);\n\nconst PATH_TABLE_HINTS: Array<[RegExp, RemoteDatasetTable]> = [\n [/referenceToFlowDataSet$/u, 'flows'],\n [/referenceToProcess$/u, 'processes'],\n [/referenceToResultingProcess$/u, 'processes'],\n [/referenceToFlowPropertyDataSet$/u, 'flowproperties'],\n [/referenceToReferenceUnitGroup$/u, 'unitgroups'],\n [/referenceToLCIAMethodDataSet$/u, 'lciamethods'],\n [/referenceToDataSource$/u, 'sources'],\n [/referenceToExternalDocumentation$/u, 'sources'],\n [/referenceToDataSetFormat$/u, 'sources'],\n [/referenceToComplianceSystem$/u, 'sources'],\n [/referenceToDataSetUseApproval$/u, 'sources'],\n [/referenceToContact$/u, 'contacts'],\n [/referenceToCommissioner$/u, 'contacts'],\n [/referenceToPersonOrEntity/u, 'contacts'],\n [/referenceToNameOfReviewerAndInstitution$/u, 'contacts'],\n];\n\nconst EMPTY_STATUS_COUNTS: Record<string, number> = {\n ok: 0,\n lookup_failed: 0,\n missing_dataset: 0,\n missing_version: 0,\n owner_mismatch: 0,\n payload_mismatch: 0,\n remote_payload_missing: 0,\n state_code_mismatch: 0,\n unsupported_type: 0,\n version_missing: 0,\n version_outdated: 0,\n};\n\nconst EMPTY_TABLE_COUNTS: Record<RemoteDatasetTable, number> = {\n contacts: 0,\n flowproperties: 0,\n flows: 0,\n lciamethods: 0,\n lifecyclemodels: 0,\n processes: 0,\n sources: 0,\n unitgroups: 0,\n};\n\nfunction requireNonEmpty(value: string, label: string, code: string): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new CliError(`Missing required ${label} value.`, {\n code,\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction textValue(value: unknown): string | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return String(value);\n }\n return trimToken(value);\n}\n\nfunction normalizeTableToken(value: string | null): string | null {\n return value ? value.trim().replace(/\\s+/gu, ' ').toLowerCase() : null;\n}\n\nfunction tableFromType(value: string | null): RemoteDatasetTable | null {\n const normalized = normalizeTableToken(value);\n return normalized ? (TABLE_ALIASES.get(normalized) ?? null) : null;\n}\n\nfunction tableFromPath(pathExpression: string): RemoteDatasetTable | null {\n const pathEnd = pathExpression.split('/').filter(Boolean).at(-1) ?? '';\n return PATH_TABLE_HINTS.find(([pattern]) => pattern.test(pathEnd))?.[1] ?? null;\n}\n\nfunction shortDescription(value: unknown): string | null {\n if (typeof value === 'string') {\n return textValue(value);\n }\n if (Array.isArray(value)) {\n for (const entry of value) {\n const text = shortDescription(entry);\n if (text) {\n return text;\n }\n }\n return null;\n }\n if (isRecord(value)) {\n return textValue(value['#text'] ?? value.text ?? value.value);\n }\n return null;\n}\n\nfunction pointerPath(basePath: string, segment: string | number): string {\n const encoded = String(segment).replace(/~/gu, '~0').replace(/\\//gu, '~1');\n return `${basePath}/${encoded}`;\n}\n\nfunction unescapePointerSegment(segment: string): string {\n return segment.replace(/~1/gu, '/').replace(/~0/gu, '~');\n}\n\nfunction isFoundryTracePath(pathExpression: string): boolean {\n const segments = pathExpression.split('/').filter(Boolean).map(unescapePointerSegment);\n return (\n segments.includes('common:other') &&\n segments.some(\n (segment) =>\n segment.startsWith('tiangongfoundry:') && segment.toLowerCase().includes('trace'),\n )\n );\n}\n\nfunction rootOf(\n payload: JsonObject,\n): { descriptor: RootDatasetDescriptor; root: JsonObject } | null {\n for (const descriptor of ROOT_DATASET_DESCRIPTORS) {\n if (isRecord(payload[descriptor.wrapper])) {\n return { descriptor, root: payload[descriptor.wrapper] as JsonObject };\n }\n }\n return null;\n}\n\nfunction rootIdentity(row: JsonObject, payload: JsonObject): RemoteDatasetReference | null {\n const root = rootOf(payload);\n if (!root) {\n return null;\n }\n const information = isRecord(root.root[root.descriptor.information_key])\n ? (root.root[root.descriptor.information_key] as JsonObject)\n : {};\n const dataSetInformation = isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.root.administrativeInformation)\n ? root.root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n\n return {\n row_index: -1,\n role: 'root',\n table: root.descriptor.table,\n type: root.descriptor.type,\n id: firstNonEmpty(row.id, row.uuid, dataSetInformation['common:UUID']),\n version: firstNonEmpty(row.version, publicationAndOwnership['common:dataSetVersion']),\n path: `/${root.descriptor.wrapper}`,\n short_description: shortDescription(dataSetInformation.name ?? dataSetInformation.shortName),\n };\n}\n\nfunction referenceFromRecord(\n rowIndex: number,\n value: JsonObject,\n pathExpression: string,\n): RemoteDatasetReference | null {\n const id = firstNonEmpty(value['@refObjectId'], value.refObjectId, value.id);\n if (!id) {\n return null;\n }\n const type = firstNonEmpty(value['@type'], value.type);\n const table = tableFromType(type) ?? tableFromPath(pathExpression);\n return {\n row_index: rowIndex,\n role: 'reference',\n table,\n type,\n id,\n version: firstNonEmpty(value['@version'], value.version),\n path: pathExpression,\n short_description: shortDescription(value['common:shortDescription']),\n };\n}\n\nfunction flowReferenceFromRecord(\n rowIndex: number,\n value: JsonObject,\n pathExpression: string,\n): RemoteDatasetReference | null {\n const id = firstNonEmpty(value['@flowUUID']);\n return id\n ? {\n row_index: rowIndex,\n role: 'reference',\n table: 'flows',\n type: 'flow data set',\n id,\n version: firstNonEmpty(value['@version'], value.version),\n path: pointerPath(pathExpression, '@flowUUID'),\n short_description: null,\n }\n : null;\n}\n\nfunction collectReferencesFromValue(\n rowIndex: number,\n value: unknown,\n pathExpression: string,\n references: RemoteDatasetReference[],\n): void {\n if (isFoundryTracePath(pathExpression)) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((entry, index) =>\n collectReferencesFromValue(rowIndex, entry, pointerPath(pathExpression, index), references),\n );\n return;\n }\n\n if (!isRecord(value)) {\n return;\n }\n\n const ref = referenceFromRecord(rowIndex, value, pathExpression);\n if (ref) {\n references.push(ref);\n }\n const flowRef = flowReferenceFromRecord(rowIndex, value, pathExpression);\n if (flowRef) {\n references.push(flowRef);\n }\n for (const [key, nested] of Object.entries(value)) {\n collectReferencesFromValue(rowIndex, nested, pointerPath(pathExpression, key), references);\n }\n}\n\nexport function collectRemoteReferences(rows: JsonObject[]): RemoteDatasetReference[] {\n const references: RemoteDatasetReference[] = [];\n rows.forEach((row, index) => {\n const payload = unwrapDatasetPayload(row);\n const root = rootIdentity(row, payload);\n if (root) {\n references.push({ ...root, row_index: index });\n }\n collectReferencesFromValue(index, payload, '', references);\n });\n return references;\n}\n\nfunction compareVersions(left: string | null, right: string | null): number {\n if (!left && !right) {\n return 0;\n }\n if (!left) {\n return -1;\n }\n if (!right) {\n return 1;\n }\n const leftParts = left.split(/[._-]/u);\n const rightParts = right.split(/[._-]/u);\n const length = Math.max(leftParts.length, rightParts.length);\n for (let index = 0; index < length; index += 1) {\n const leftPart = leftParts[index] ?? '0';\n const rightPart = rightParts[index] ?? '0';\n const leftNumber = Number(leftPart);\n const rightNumber = Number(rightPart);\n if (Number.isFinite(leftNumber) && Number.isFinite(rightNumber)) {\n if (leftNumber !== rightNumber) {\n return leftNumber > rightNumber ? 1 : -1;\n }\n } else {\n const compared = leftPart.localeCompare(rightPart);\n if (compared !== 0) {\n return compared > 0 ? 1 : -1;\n }\n }\n }\n return 0;\n}\n\nfunction buildRemoteUrl(\n restBaseUrl: string,\n table: RemoteDatasetTable,\n id: string,\n version: string | null,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('id', `eq.${id}`);\n if (version) {\n url.searchParams.set('version', `eq.${version}`);\n } else {\n url.searchParams.set('order', 'version.desc');\n url.searchParams.set('limit', '1');\n }\n return url.toString();\n}\n\nfunction normalizeRows(value: unknown): RemoteDatasetLookupRow[] {\n return Array.isArray(value)\n ? value\n .filter(isRecord)\n .map((row) => ({\n id: firstNonEmpty(row.id) ?? '',\n version: firstNonEmpty(row.version),\n }))\n .filter((row) => Boolean(row.id))\n : [];\n}\n\nfunction stableJson(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(stableJson);\n }\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, stableJson(value[key])]),\n );\n }\n return value;\n}\n\nfunction sha256Json(value: unknown): string {\n return crypto\n .createHash('sha256')\n .update(JSON.stringify(stableJson(value)))\n .digest('hex');\n}\n\nfunction buildRemotePayloadUrl(\n restBaseUrl: string,\n table: RemoteDatasetTable,\n id: string,\n version: string,\n): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/${table}`);\n url.searchParams.set('select', 'id,version,user_id,state_code,modified_at,json,json_ordered');\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction normalizePayloadRow(value: unknown): RemoteDatasetPayloadLookup | null {\n if (!isRecord(value)) {\n return null;\n }\n const payload = isRecord(value.json_ordered)\n ? value.json_ordered\n : isRecord(value.json)\n ? value.json\n : null;\n return {\n id: firstNonEmpty(value.id) ?? '',\n version: firstNonEmpty(value.version),\n user_id: firstNonEmpty(value.user_id),\n state_code: typeof value.state_code === 'number' ? value.state_code : null,\n modified_at: firstNonEmpty(value.modified_at),\n payload: payload as JsonObject | null,\n source_url: null,\n };\n}\n\nexport async function lookupRemoteDataset(options: {\n runtime: SupabaseDataRuntime;\n fetchImpl: FetchLike;\n timeoutMs: number;\n request: RemoteDatasetLookupRequest;\n}): Promise<RemoteDatasetLookup> {\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const exactSourceUrl = options.request.version\n ? buildRemoteUrl(\n restBaseUrl,\n options.request.table,\n options.request.id,\n options.request.version,\n )\n : null;\n const latestSourceUrl = buildRemoteUrl(\n restBaseUrl,\n options.request.table,\n options.request.id,\n null,\n );\n const exactRows = options.request.version\n ? normalizeRows(\n await runSupabaseArrayQuery(\n client\n .from(options.request.table)\n .select('id,version')\n .eq('id', options.request.id)\n .eq('version', options.request.version),\n exactSourceUrl as string,\n ),\n )\n : [];\n const latestRows = normalizeRows(\n await runSupabaseArrayQuery(\n client\n .from(options.request.table)\n .select('id,version')\n .eq('id', options.request.id)\n .order('version', { ascending: false })\n .limit(1),\n latestSourceUrl,\n ),\n );\n return {\n exact: exactRows[0] ?? null,\n latest: latestRows[0] ?? null,\n exact_source_url: exactSourceUrl,\n latest_source_url: latestSourceUrl,\n };\n}\n\nasync function lookupRemoteDatasetPayload(options: {\n runtime: SupabaseDataRuntime;\n fetchImpl: FetchLike;\n timeoutMs: number;\n request: RemoteDatasetLookupRequest;\n}): Promise<RemoteDatasetPayloadLookup | null> {\n if (!options.request.version) {\n return null;\n }\n const { client, restBaseUrl } = createSupabaseDataClient(\n options.runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const sourceUrl = buildRemotePayloadUrl(\n restBaseUrl,\n options.request.table,\n options.request.id,\n options.request.version,\n );\n const rows = await runSupabaseArrayQuery(\n client\n .from(options.request.table)\n .select('id,version,user_id,state_code,modified_at,json,json_ordered')\n .eq('id', options.request.id)\n .eq('version', options.request.version),\n sourceUrl,\n );\n const payloadRow = normalizePayloadRow(Array.isArray(rows) ? rows[0] : null);\n return payloadRow ? { ...payloadRow, source_url: sourceUrl } : null;\n}\n\nfunction checkMessage(reference: RemoteDatasetReference, status: RemoteVerificationStatus): string {\n const label = `${reference.table ?? reference.type ?? 'unknown'}:${reference.id ?? '-'}@${\n reference.version ?? '-'\n }`;\n switch (status) {\n case 'ok':\n return `Remote dataset reference is resolvable: ${label}.`;\n case 'lookup_failed':\n return `Remote lookup failed for dataset reference: ${label}.`;\n case 'missing_dataset':\n return `Remote dataset id does not exist: ${label}.`;\n case 'missing_version':\n return `Remote dataset id exists, but the requested version does not exist: ${label}.`;\n case 'unsupported_type':\n return `Dataset reference type cannot be mapped to a TianGong table: ${label}.`;\n case 'version_missing':\n return `Dataset reference is missing @version and cannot pass publish-readiness verification: ${label}.`;\n case 'version_outdated':\n return `Requested dataset version is lower than the latest published version: ${label}.`;\n }\n}\n\nfunction classifyCheck(\n reference: RemoteDatasetReference,\n lookup: RemoteDatasetLookup | null,\n lookupFailed: boolean,\n rootPolicy: RemoteVerificationRootPolicy,\n): RemoteVerificationCheck {\n let status: RemoteVerificationStatus = 'ok';\n if (!reference.table || !reference.id) {\n status = 'unsupported_type';\n } else if (lookupFailed) {\n status = 'lookup_failed';\n } else if (!reference.version) {\n status = 'version_missing';\n } else if (reference.role === 'root' && rootPolicy === 'candidate') {\n if (!lookup?.latest) {\n status = 'ok';\n } else if (!lookup.exact) {\n status =\n compareVersions(reference.version, lookup.latest.version) > 0\n ? 'ok'\n : compareVersions(lookup.latest.version, reference.version) > 0\n ? 'version_outdated'\n : 'missing_version';\n } else if (compareVersions(lookup.latest.version, reference.version) > 0) {\n status = 'version_outdated';\n }\n } else if (!lookup?.latest) {\n status = 'missing_dataset';\n } else if (!lookup.exact) {\n status = 'missing_version';\n } else if (compareVersions(lookup.latest.version, reference.version) > 0) {\n status = 'version_outdated';\n }\n return {\n ...reference,\n status,\n exact_version: lookup?.exact?.version ?? null,\n latest_version: lookup?.latest?.version ?? null,\n exact_source_url: lookup?.exact_source_url ?? null,\n latest_source_url: lookup?.latest_source_url ?? null,\n message: checkMessage(reference, status),\n };\n}\n\nfunction blockerFromCheck(check: RemoteVerificationCheck): RemoteVerificationBlocker | null {\n return check.status === 'ok'\n ? null\n : {\n code: check.status,\n severity: 'error',\n message: check.message,\n row_index: check.row_index,\n role: check.role,\n table: check.table,\n id: check.id,\n version: check.version,\n latest_version: check.latest_version,\n path: check.path,\n };\n}\n\nfunction makeRootReadbackCheck(\n reference: RemoteDatasetReference,\n status: RemoteVerificationIssueCode,\n message: string,\n remote: RemoteDatasetPayloadLookup | null,\n hashes: {\n local: string | null;\n remote: string | null;\n } = { local: null, remote: null },\n): RemoteVerificationCheck {\n return {\n ...reference,\n path: `${reference.path}#readback`,\n status,\n exact_version: remote?.version ?? null,\n latest_version: null,\n exact_source_url: remote?.source_url ?? null,\n latest_source_url: null,\n message,\n remote_user_id: remote?.user_id ?? null,\n remote_state_code: remote?.state_code ?? null,\n remote_modified_at: remote?.modified_at ?? null,\n local_payload_sha256: hashes.local,\n remote_payload_sha256: hashes.remote,\n };\n}\n\nfunction rootReadbackChecks(options: {\n reference: RemoteDatasetReference;\n localPayload: JsonObject;\n remote: RemoteDatasetPayloadLookup | null;\n compareRootPayload: boolean;\n targetUserId: string | null;\n stateCode: number | null;\n}): RemoteVerificationCheck[] {\n const { reference, localPayload, remote, compareRootPayload, targetUserId, stateCode } = options;\n if (!remote) {\n return [\n makeRootReadbackCheck(\n reference,\n 'missing_dataset',\n `Remote root payload was not found for ${reference.table}:${reference.id}@${reference.version}.`,\n null,\n ),\n ];\n }\n\n const checks: RemoteVerificationCheck[] = [];\n if (targetUserId && remote.user_id !== targetUserId) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'owner_mismatch',\n `Remote root owner ${remote.user_id ?? '<missing>'} does not match target user ${targetUserId}.`,\n remote,\n ),\n );\n }\n if (stateCode !== null && remote.state_code !== stateCode) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'state_code_mismatch',\n `Remote root state_code ${remote.state_code ?? '<missing>'} does not match required state_code ${stateCode}.`,\n remote,\n ),\n );\n }\n\n let hashes: { local: string | null; remote: string | null } = { local: null, remote: null };\n if (compareRootPayload) {\n if (!remote.payload) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'remote_payload_missing',\n `Remote root payload is missing for ${reference.table}:${reference.id}@${reference.version}.`,\n remote,\n ),\n );\n } else {\n hashes = {\n local: sha256Json(localPayload),\n remote: sha256Json(remote.payload),\n };\n if (hashes.local !== hashes.remote) {\n checks.push(\n makeRootReadbackCheck(\n reference,\n 'payload_mismatch',\n `Remote root payload hash does not match local row for ${reference.table}:${reference.id}@${reference.version}.`,\n remote,\n hashes,\n ),\n );\n }\n }\n }\n\n if (checks.length > 0) {\n return checks;\n }\n return [\n makeRootReadbackCheck(\n reference,\n 'ok',\n `Remote root readback matches required owner, state, and payload checks for ${reference.table}:${reference.id}@${reference.version}.`,\n remote,\n hashes,\n ),\n ];\n}\n\nfunction buildFiles(outDir: string): DatasetRemoteVerificationReport['files'] {\n const resolved = path.resolve(outDir);\n return {\n report: path.join(resolved, 'outputs', 'remote-verification-report.json'),\n checks: path.join(resolved, 'outputs', 'remote-verification.jsonl'),\n blockers: path.join(resolved, 'outputs', 'blockers.jsonl'),\n };\n}\n\nfunction uniqueLookupKey(reference: RemoteDatasetReference): string | null {\n return reference.table && reference.id\n ? `${reference.table}:${reference.id}:${reference.version ?? ''}`\n : null;\n}\n\nexport async function runDatasetRemoteVerify(\n options: RunDatasetRemoteVerifyOptions,\n): Promise<DatasetRemoteVerificationReport> {\n const inputPath = path.resolve(\n requireNonEmpty(options.inputPath, '--input', 'DATASET_REMOTE_VERIFY_INPUT_REQUIRED'),\n );\n const outDir = path.resolve(\n requireNonEmpty(options.outDir, '--out-dir', 'DATASET_REMOTE_VERIFY_OUT_DIR_REQUIRED'),\n );\n const rows = readDatasetRowsInput(inputPath, options.rawInput);\n const references = collectRemoteReferences(rows);\n const rootPolicy = options.rootPolicy ?? 'existing';\n const compareRootPayload = options.compareRootPayload === true;\n const targetUserId = trimToken(options.targetUserId);\n const stateCode = options.stateCode ?? null;\n const needsRootReadback = compareRootPayload || Boolean(targetUserId) || stateCode !== null;\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const runtime =\n options.lookupDatasetImpl === undefined\n ? createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n })\n : null;\n const lookupImpl =\n options.lookupDatasetImpl ??\n ((request: RemoteDatasetLookupRequest) =>\n lookupRemoteDataset({\n runtime: runtime as SupabaseDataRuntime,\n fetchImpl,\n timeoutMs,\n request,\n }));\n const rootPayloadLookupImpl =\n options.lookupRootPayloadImpl ??\n (runtime\n ? (request: RemoteDatasetLookupRequest) =>\n lookupRemoteDatasetPayload({\n runtime: runtime as SupabaseDataRuntime,\n fetchImpl,\n timeoutMs,\n request,\n })\n : null);\n const lookupCache = new Map<string, Promise<RemoteDatasetLookup>>();\n const checks: RemoteVerificationCheck[] = [];\n\n // Pre-fetch the unique remote lookups in bounded-concurrency batches. Large\n // reference closures (e.g. a mega-process referencing 1600+ flows) would\n // otherwise serialize into thousands of sequential round-trips and take many\n // minutes; the loop below then simply awaits the already-in-flight cached\n // promises, preserving the existing per-reference error handling.\n const REMOTE_LOOKUP_CONCURRENCY = 20;\n const prefetch: Array<{ key: string; request: RemoteDatasetLookupRequest }> = [];\n const prefetchQueued = new Set<string>();\n for (const reference of references) {\n const lookupKey = uniqueLookupKey(reference);\n if (reference.table && reference.id && lookupKey && !prefetchQueued.has(lookupKey)) {\n prefetchQueued.add(lookupKey);\n prefetch.push({\n key: lookupKey,\n request: { table: reference.table, id: reference.id, version: reference.version },\n });\n }\n }\n for (let offset = 0; offset < prefetch.length; offset += REMOTE_LOOKUP_CONCURRENCY) {\n const batch = prefetch.slice(offset, offset + REMOTE_LOOKUP_CONCURRENCY);\n await Promise.all(\n batch.map(({ key, request }) => {\n const promise = lookupImpl(request);\n lookupCache.set(key, promise);\n return promise.then(\n () => undefined,\n () => undefined,\n );\n }),\n );\n }\n\n for (const reference of references) {\n let lookup: RemoteDatasetLookup | null = null;\n let lookupFailed = false;\n const lookupKey = uniqueLookupKey(reference);\n if (reference.table && reference.id && lookupKey) {\n // The bounded-concurrency prefetch above populated lookupCache for every\n // reference that passes this same guard, so the promise is always present.\n try {\n lookup = await lookupCache.get(lookupKey)!;\n } catch {\n lookupFailed = true;\n }\n }\n checks.push(classifyCheck(reference, lookup, lookupFailed, rootPolicy));\n }\n\n if (needsRootReadback) {\n const rootChecks = checks.filter(\n (check) =>\n check.role === 'root' &&\n check.status === 'ok' &&\n check.table &&\n check.id &&\n (compareRootPayload || rootPolicy !== 'candidate' || Boolean(check.exact_version)),\n );\n for (const check of rootChecks) {\n const localPayload = unwrapDatasetPayload(rows[check.row_index]);\n let remotePayload: RemoteDatasetPayloadLookup | null;\n try {\n if (!rootPayloadLookupImpl) {\n throw new Error('root payload lookup is not available');\n }\n remotePayload = await rootPayloadLookupImpl({\n table: check.table as RemoteDatasetTable,\n id: check.id as string,\n version: check.version,\n });\n } catch {\n checks.push(\n makeRootReadbackCheck(\n check,\n 'lookup_failed',\n `Remote root payload lookup failed for ${check.table}:${check.id}@${check.version}.`,\n null,\n ),\n );\n continue;\n }\n checks.push(\n ...rootReadbackChecks({\n reference: check,\n localPayload,\n remote: remotePayload,\n compareRootPayload,\n targetUserId,\n stateCode,\n }),\n );\n }\n }\n\n const blockers = checks\n .map(blockerFromCheck)\n .filter((blocker): blocker is RemoteVerificationBlocker => blocker !== null);\n const byStatus = { ...EMPTY_STATUS_COUNTS };\n const byTable = { ...EMPTY_TABLE_COUNTS };\n checks.forEach((check) => {\n byStatus[check.status] ??= 0;\n byStatus[check.status] += 1;\n if (check.table) {\n byTable[check.table] += 1;\n }\n });\n const rootReadbackChecksCount = checks.filter((check) => check.path.endsWith('#readback')).length;\n const rootPayloadMismatches = checks.filter(\n (check) => check.status === 'payload_mismatch',\n ).length;\n\n const files = buildFiles(outDir);\n const report: DatasetRemoteVerificationReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: blockers.length > 0 ? 'blocked_remote_verification' : 'passed_remote_verification',\n root_policy: rootPolicy,\n input_path: inputPath,\n out_dir: outDir,\n counts: {\n rows: rows.length,\n references: references.length,\n checked: checks.length,\n blockers: blockers.length,\n ...(needsRootReadback ? { root_readback_checks: rootReadbackChecksCount } : {}),\n ...(needsRootReadback ? { root_payload_mismatches: rootPayloadMismatches } : {}),\n by_status: byStatus,\n by_table: byTable,\n },\n blockers,\n files,\n };\n\n writeJsonArtifact(files.report, report);\n writeJsonLinesArtifact(files.checks, checks);\n writeJsonLinesArtifact(files.blockers, blockers);\n\n return report;\n}\n\nexport const __testInternals = {\n buildRemotePayloadUrl,\n buildRemoteUrl,\n collectRemoteReferences,\n compareVersions,\n isFoundryTracePath,\n lookupRemoteDatasetPayload,\n lookupRemoteDataset,\n makeRootReadbackCheck,\n normalizePayloadRow,\n normalizeRows,\n rootReadbackChecks,\n sha256Json,\n shortDescription,\n tableFromPath,\n tableFromType,\n};\n"]}
|
|
@@ -86,7 +86,7 @@ function serializeError(error) {
|
|
|
86
86
|
}
|
|
87
87
|
return { message: String(error) };
|
|
88
88
|
}
|
|
89
|
-
function normalizeType(value) {
|
|
89
|
+
function normalizeType(value, allowReferenceOnlySupport = false) {
|
|
90
90
|
const normalized = value?.trim().toLowerCase();
|
|
91
91
|
if (!normalized || normalized === 'auto') {
|
|
92
92
|
return 'auto';
|
|
@@ -101,6 +101,9 @@ function normalizeType(value) {
|
|
|
101
101
|
normalized === 'unitgroups' ||
|
|
102
102
|
normalized === 'unit-group' ||
|
|
103
103
|
normalized === 'unit-groups') {
|
|
104
|
+
if (allowReferenceOnlySupport) {
|
|
105
|
+
return 'unitgroup';
|
|
106
|
+
}
|
|
104
107
|
throw new CliError('Unit groups are reference-only support data for dataset save-draft. Select an existing database row instead of creating a custom My Data unit group.', {
|
|
105
108
|
code: 'DATASET_SAVE_DRAFT_REFERENCE_ONLY_TYPE',
|
|
106
109
|
exitCode: 2,
|
|
@@ -111,6 +114,9 @@ function normalizeType(value) {
|
|
|
111
114
|
normalized === 'flowproperties' ||
|
|
112
115
|
normalized === 'flow-property' ||
|
|
113
116
|
normalized === 'flow-properties') {
|
|
117
|
+
if (allowReferenceOnlySupport) {
|
|
118
|
+
return 'flowproperty';
|
|
119
|
+
}
|
|
114
120
|
throw new CliError('Flow properties are reference-only support data for dataset save-draft. Select an existing database row instead of creating a custom My Data flow property.', {
|
|
115
121
|
code: 'DATASET_SAVE_DRAFT_REFERENCE_ONLY_TYPE',
|
|
116
122
|
exitCode: 2,
|
|
@@ -422,7 +428,7 @@ function selectedRow(row) {
|
|
|
422
428
|
payload: row.payload,
|
|
423
429
|
};
|
|
424
430
|
}
|
|
425
|
-
function buildPreparedFailure(row) {
|
|
431
|
+
function buildPreparedFailure(row, allowReferenceOnlySupport = false) {
|
|
426
432
|
if (!row.type || !row.config) {
|
|
427
433
|
return {
|
|
428
434
|
index: row.index,
|
|
@@ -438,7 +444,7 @@ function buildPreparedFailure(row) {
|
|
|
438
444
|
},
|
|
439
445
|
};
|
|
440
446
|
}
|
|
441
|
-
if (REFERENCE_ONLY_SAVE_DRAFT_TYPES.has(row.type)) {
|
|
447
|
+
if (REFERENCE_ONLY_SAVE_DRAFT_TYPES.has(row.type) && !allowReferenceOnlySupport) {
|
|
442
448
|
return {
|
|
443
449
|
index: row.index,
|
|
444
450
|
id: row.id,
|
|
@@ -529,7 +535,9 @@ export async function runDatasetSaveDraft(options) {
|
|
|
529
535
|
const now = options.now ?? new Date();
|
|
530
536
|
const inputPath = path.resolve(options.inputPath);
|
|
531
537
|
const commit = options.commit === true;
|
|
532
|
-
const
|
|
538
|
+
const allowReferenceOnlySupport = options.allowReferenceOnlySupport === true ||
|
|
539
|
+
(options.env?.TIANGONG_ALLOW_ACCOUNT_LOCAL_SUPPORT ?? '') === '1';
|
|
540
|
+
const requestedType = normalizeType(options.type, allowReferenceOnlySupport);
|
|
533
541
|
const outDir = path.resolve(options.outDir ?? defaultOutDir(inputPath, commit, now));
|
|
534
542
|
const files = buildFiles(outDir);
|
|
535
543
|
const preparedRows = prepareRows(inputPath, options.rawInput, requestedType);
|
|
@@ -561,7 +569,7 @@ export async function runDatasetSaveDraft(options) {
|
|
|
561
569
|
const referenceOnlySupportCache = new Map();
|
|
562
570
|
const reports = [];
|
|
563
571
|
for (const row of preparedRows) {
|
|
564
|
-
const preparedFailure = buildPreparedFailure(row);
|
|
572
|
+
const preparedFailure = buildPreparedFailure(row, allowReferenceOnlySupport);
|
|
565
573
|
if (preparedFailure) {
|
|
566
574
|
reports.push(preparedFailure);
|
|
567
575
|
continue;
|
|
@@ -590,7 +598,7 @@ export async function runDatasetSaveDraft(options) {
|
|
|
590
598
|
});
|
|
591
599
|
const visibleRow = visibleRows[0] ?? null;
|
|
592
600
|
if (row.type === 'flow') {
|
|
593
|
-
if (!visibleRow && isElementaryFlowPayload(row.payload)) {
|
|
601
|
+
if (!visibleRow && isElementaryFlowPayload(row.payload) && !allowReferenceOnlySupport) {
|
|
594
602
|
reports.push({
|
|
595
603
|
...baseReport,
|
|
596
604
|
status: 'failed',
|