@tiangong-lca/cli 0.0.32 → 0.1.0

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.
Files changed (101) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -12
  3. package/assets/import-smoke/simapro.csv +20 -0
  4. package/bin/tiangong-lca.js +1 -1
  5. package/dist/src/cli.js +103 -65
  6. package/dist/src/cli.js.map +1 -1
  7. package/dist/src/lib/dataset-bilingual.js.map +1 -1
  8. package/dist/src/lib/dataset-classification.js.map +1 -1
  9. package/dist/src/lib/dataset-contract.js.map +1 -1
  10. package/dist/src/lib/dataset-evidence-search.js.map +1 -1
  11. package/dist/src/lib/dataset-import-lca.js +302 -131
  12. package/dist/src/lib/dataset-import-lca.js.map +1 -1
  13. package/dist/src/lib/dataset-maintenance-apply.js +916 -43
  14. package/dist/src/lib/dataset-maintenance-apply.js.map +1 -1
  15. package/dist/src/lib/dataset-maintenance-clear-account.js +10 -4
  16. package/dist/src/lib/dataset-maintenance-clear-account.js.map +1 -1
  17. package/dist/src/lib/dataset-maintenance-contract.js +1 -6
  18. package/dist/src/lib/dataset-maintenance-contract.js.map +1 -1
  19. package/dist/src/lib/dataset-maintenance-derivatives.js +0 -1
  20. package/dist/src/lib/dataset-maintenance-derivatives.js.map +1 -1
  21. package/dist/src/lib/dataset-maintenance-flow-identity-capture.js +1 -0
  22. package/dist/src/lib/dataset-maintenance-flow-identity-capture.js.map +1 -1
  23. package/dist/src/lib/dataset-maintenance-pagination.js.map +1 -1
  24. package/dist/src/lib/dataset-maintenance-protected-before.js.map +1 -1
  25. package/dist/src/lib/dataset-maintenance-protected-contract.js +0 -1
  26. package/dist/src/lib/dataset-maintenance-protected-contract.js.map +1 -1
  27. package/dist/src/lib/dataset-maintenance-protected-freeze.js.map +1 -1
  28. package/dist/src/lib/dataset-maintenance-protected-preparation.js +0 -2
  29. package/dist/src/lib/dataset-maintenance-protected-preparation.js.map +1 -1
  30. package/dist/src/lib/dataset-maintenance-protected-seal.js.map +1 -1
  31. package/dist/src/lib/dataset-maintenance-protected-verify.js +0 -3
  32. package/dist/src/lib/dataset-maintenance-protected-verify.js.map +1 -1
  33. package/dist/src/lib/dataset-maintenance-remote.js +68 -12
  34. package/dist/src/lib/dataset-maintenance-remote.js.map +1 -1
  35. package/dist/src/lib/dataset-maintenance-verify.js +1 -2
  36. package/dist/src/lib/dataset-maintenance-verify.js.map +1 -1
  37. package/dist/src/lib/dataset-remote-refresh.js.map +1 -1
  38. package/dist/src/lib/dataset-remote-verify.js +2 -0
  39. package/dist/src/lib/dataset-remote-verify.js.map +1 -1
  40. package/dist/src/lib/dataset-save-draft-run.js +2 -0
  41. package/dist/src/lib/dataset-save-draft-run.js.map +1 -1
  42. package/dist/src/lib/flow-build-alias-map.js.map +1 -1
  43. package/dist/src/lib/flow-fetch-rows.js.map +1 -1
  44. package/dist/src/lib/flow-get.js.map +1 -1
  45. package/dist/src/lib/flow-governance.js.map +1 -1
  46. package/dist/src/lib/flow-list.js +1 -0
  47. package/dist/src/lib/flow-list.js.map +1 -1
  48. package/dist/src/lib/flow-payload-validation.js.map +1 -1
  49. package/dist/src/lib/flow-publish-version.js +1 -0
  50. package/dist/src/lib/flow-publish-version.js.map +1 -1
  51. package/dist/src/lib/flow-read.js +1 -0
  52. package/dist/src/lib/flow-read.js.map +1 -1
  53. package/dist/src/lib/flow-regen-product.js.map +1 -1
  54. package/dist/src/lib/flow-remediate.js.map +1 -1
  55. package/dist/src/lib/identity-preflight.js +4 -10
  56. package/dist/src/lib/identity-preflight.js.map +1 -1
  57. package/dist/src/lib/lifecyclemodel-bundle-save.js +1 -0
  58. package/dist/src/lib/lifecyclemodel-bundle-save.js.map +1 -1
  59. package/dist/src/lib/lifecyclemodel-orchestrate.js.map +1 -1
  60. package/dist/src/lib/lifecyclemodel-publish-resulting-process.js.map +1 -1
  61. package/dist/src/lib/lifecyclemodel-resulting-process.js.map +1 -1
  62. package/dist/src/lib/lifecyclemodel-save-draft-run.js.map +1 -1
  63. package/dist/src/lib/lifecyclemodel-validate-build.js.map +1 -1
  64. package/dist/src/lib/package-version.js.map +1 -1
  65. package/dist/src/lib/process-auto-build.js.map +1 -1
  66. package/dist/src/lib/process-dedup-review.js +14 -7
  67. package/dist/src/lib/process-dedup-review.js.map +1 -1
  68. package/dist/src/lib/process-flow-build-plan.js +111 -30
  69. package/dist/src/lib/process-flow-build-plan.js.map +1 -1
  70. package/dist/src/lib/process-get.js +1 -0
  71. package/dist/src/lib/process-get.js.map +1 -1
  72. package/dist/src/lib/process-list.js +1 -0
  73. package/dist/src/lib/process-list.js.map +1 -1
  74. package/dist/src/lib/process-payload-validation.js.map +1 -1
  75. package/dist/src/lib/process-qa.js.map +1 -1
  76. package/dist/src/lib/process-refresh-references.js +15 -10
  77. package/dist/src/lib/process-refresh-references.js.map +1 -1
  78. package/dist/src/lib/process-save-draft.js +9 -3
  79. package/dist/src/lib/process-save-draft.js.map +1 -1
  80. package/dist/src/lib/process-scope-statistics.js +11 -4
  81. package/dist/src/lib/process-scope-statistics.js.map +1 -1
  82. package/dist/src/lib/process-verify-rows.js.map +1 -1
  83. package/dist/src/lib/publish.js.map +1 -1
  84. package/dist/src/lib/run.js.map +1 -1
  85. package/dist/src/lib/supabase-client.js +13 -1
  86. package/dist/src/lib/supabase-client.js.map +1 -1
  87. package/dist/src/lib/supabase-data-api-contract.js +328 -0
  88. package/dist/src/lib/supabase-data-api-contract.js.map +1 -0
  89. package/dist/src/lib/supabase-data-api-replay.js +69 -0
  90. package/dist/src/lib/supabase-data-api-replay.js.map +1 -0
  91. package/dist/src/lib/supabase-json-ordered-write.js +2 -0
  92. package/dist/src/lib/supabase-json-ordered-write.js.map +1 -1
  93. package/dist/src/lib/supabase-rest.js +1 -0
  94. package/dist/src/lib/supabase-rest.js.map +1 -1
  95. package/dist/src/lib/tidas-sdk-package-validator.js +5 -5
  96. package/dist/src/lib/tidas-sdk-package-validator.js.map +1 -1
  97. package/dist/src/lib/validation.js.map +1 -1
  98. package/dist/src/main.js.map +1 -1
  99. package/package.json +40 -40
  100. package/dist/scripts/assert-full-coverage.js +0 -77
  101. package/dist/scripts/assert-full-coverage.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"flow-build-alias-map.js","sourceRoot":"","sources":["../../../src/lib/flow-build-alias-map.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport {\n extractFlowRecord,\n isRecord,\n loadRowsFromFile,\n normalizeText,\n type FlowRecord,\n type JsonRecord,\n} from './flow-governance.js';\n\ntype FlowIndex = {\n records: FlowRecord[];\n byUuid: Record<string, FlowRecord[]>;\n byUuidVersion: Record<string, FlowRecord>;\n byName: Record<string, FlowRecord[]>;\n};\n\nexport type FlowBuildAliasMapFiles = {\n out_dir: string;\n alias_plan: string;\n alias_plan_jsonl: string;\n flow_alias_map: string;\n manual_review_queue: string;\n summary: string;\n};\n\nexport type FlowBuildAliasMapSummary = {\n old_flow_count: number;\n new_flow_count: number;\n alias_entries_versioned: number;\n alias_entries_uuid_only: number;\n manual_review_count: number;\n decision_counts: Record<string, number>;\n};\n\nexport type FlowAliasPlanAction = {\n old_flow_id: string;\n old_flow_version: string;\n old_flow_name: string;\n old_flow_type: string;\n decision: 'no_alias_needed' | 'alias_map_entry' | 'manual_review';\n reason: string;\n target_flow_id?: string;\n target_flow_version?: string;\n target_flow_name?: string;\n target_flow_type?: string;\n candidate_refs?: Array<Record<string, string>>;\n};\n\nexport type FlowBuildAliasMapReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_local_flow_build_alias_map';\n old_flow_files: string[];\n new_flow_files: string[];\n seed_alias_map_file: string | null;\n out_dir: string;\n summary: FlowBuildAliasMapSummary;\n files: FlowBuildAliasMapFiles;\n};\n\nexport type RunFlowBuildAliasMapOptions = {\n oldFlowFiles: string[];\n newFlowFiles: string[];\n seedAliasMapFile?: string | null;\n outDir: string;\n};\n\ntype FlowBuildAliasMapDeps = {\n now?: () => Date;\n};\n\nfunction assertInputFile(inputFile: string, requiredCode: string, missingCode: string): string {\n if (!inputFile) {\n throw new CliError('Missing required input file value.', {\n code: requiredCode,\n exitCode: 2,\n });\n }\n\n const resolved = path.resolve(inputFile);\n if (!existsSync(resolved)) {\n throw new CliError(`Input file not found: ${resolved}`, {\n code: missingCode,\n exitCode: 2,\n });\n }\n\n return resolved;\n}\n\nfunction assertInputFiles(\n inputFiles: string[],\n requiredCode: string,\n missingCode: string,\n): string[] {\n if (!inputFiles.length) {\n throw new CliError('At least one input file is required.', {\n code: requiredCode,\n exitCode: 2,\n });\n }\n\n return inputFiles.map((inputFile) => assertInputFile(inputFile, requiredCode, missingCode));\n}\n\nfunction assertOutDir(outDir: string): string {\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_BUILD_ALIAS_MAP_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n return path.resolve(outDir);\n}\n\nfunction readJsonObjectFile(\n filePath: string,\n requiredCode: string,\n missingCode: string,\n invalidCode: string,\n): JsonRecord {\n const resolved = assertInputFile(filePath, requiredCode, missingCode);\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(resolved, 'utf8'));\n } catch (error) {\n throw new CliError(`Expected JSON object file: ${resolved}`, {\n code: invalidCode,\n exitCode: 2,\n details: String(error),\n });\n }\n\n if (!isRecord(parsed)) {\n throw new CliError(`Expected JSON object file: ${resolved}`, {\n code: invalidCode,\n exitCode: 2,\n });\n }\n\n return parsed;\n}\n\nfunction buildFlowIndex(rows: JsonRecord[]): FlowIndex {\n const byUuid: Record<string, FlowRecord[]> = {};\n const byUuidVersion: Record<string, FlowRecord> = {};\n const byName: Record<string, FlowRecord[]> = {};\n const records: FlowRecord[] = [];\n\n for (const row of rows) {\n const record = extractFlowRecord(row);\n records.push(record);\n byUuid[record.id] ??= [];\n byUuid[record.id].push(record);\n byUuidVersion[`${record.id}@${record.version}`] = record;\n const normalizedName = normalizeText(record.name);\n byName[normalizedName] ??= [];\n byName[normalizedName].push(record);\n }\n\n return {\n records,\n byUuid,\n byUuidVersion,\n byName,\n };\n}\n\nfunction aliasLookup(\n aliasMap: JsonRecord,\n flowUuid: string,\n flowVersion: string | null,\n): JsonRecord | null {\n const versionedKey = flowVersion ? `${flowUuid}@${flowVersion}` : null;\n for (const key of [versionedKey, flowUuid]) {\n if (!key) {\n continue;\n }\n const candidate = aliasMap[key];\n if (isRecord(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction candidateRef(record: FlowRecord, includeType = false): Record<string, string> {\n return {\n id: record.id,\n version: record.version,\n name: record.name,\n ...(includeType ? { flow_type: record.flowType } : {}),\n };\n}\n\nfunction planAlias(\n oldRecord: FlowRecord,\n newIndex: FlowIndex,\n seedAliasMap: JsonRecord,\n): FlowAliasPlanAction {\n const base: FlowAliasPlanAction = {\n old_flow_id: oldRecord.id,\n old_flow_version: oldRecord.version,\n old_flow_name: oldRecord.name,\n old_flow_type: oldRecord.flowType,\n decision: 'manual_review',\n reason: 'no_deterministic_match',\n };\n\n const existingTarget = newIndex.byUuidVersion[`${oldRecord.id}@${oldRecord.version}`];\n if (existingTarget) {\n return {\n ...base,\n decision: 'no_alias_needed',\n reason: 'already_present_in_target',\n target_flow_id: existingTarget.id,\n target_flow_version: existingTarget.version,\n };\n }\n\n const seededTarget = aliasLookup(seedAliasMap, oldRecord.id, oldRecord.version || null);\n if (seededTarget) {\n const targetRecord =\n newIndex.byUuidVersion[\n `${String(seededTarget.id ?? '')}@${String(seededTarget.version ?? '')}`\n ];\n if (targetRecord) {\n return {\n ...base,\n decision: 'alias_map_entry',\n reason: 'seed_alias_map',\n target_flow_id: targetRecord.id,\n target_flow_version: targetRecord.version,\n target_flow_name: targetRecord.name,\n target_flow_type: targetRecord.flowType,\n };\n }\n }\n\n const sameUuidCandidates = newIndex.byUuid[oldRecord.id] ?? [];\n if (sameUuidCandidates.length === 1) {\n const candidate = sameUuidCandidates[0];\n return {\n ...base,\n decision: 'alias_map_entry',\n reason: 'same_uuid_single_target_version',\n target_flow_id: candidate.id,\n target_flow_version: candidate.version,\n target_flow_name: candidate.name,\n target_flow_type: candidate.flowType,\n };\n }\n\n if (sameUuidCandidates.length > 1) {\n return {\n ...base,\n decision: 'manual_review',\n reason: 'same_uuid_multiple_target_versions',\n candidate_refs: sameUuidCandidates.map((candidate) => candidateRef(candidate)),\n };\n }\n\n const byName = newIndex.byName[normalizeText(oldRecord.name)] ?? [];\n const nameAndTypeCandidates = byName.filter(\n (candidate) => candidate.flowType === oldRecord.flowType,\n );\n if (nameAndTypeCandidates.length === 1) {\n const candidate = nameAndTypeCandidates[0];\n return {\n ...base,\n decision: 'alias_map_entry',\n reason: 'unique_exact_name_and_type_match',\n target_flow_id: candidate.id,\n target_flow_version: candidate.version,\n target_flow_name: candidate.name,\n target_flow_type: candidate.flowType,\n };\n }\n\n if (nameAndTypeCandidates.length > 1) {\n return {\n ...base,\n decision: 'manual_review',\n reason: 'ambiguous_name_and_type_match',\n candidate_refs: nameAndTypeCandidates.map((candidate) => candidateRef(candidate)),\n };\n }\n\n if (byName.length > 0) {\n return {\n ...base,\n decision: 'manual_review',\n reason: 'name_match_flow_type_mismatch',\n candidate_refs: byName.map((candidate) => candidateRef(candidate, true)),\n };\n }\n\n return base;\n}\n\nfunction buildDecisionCounts(actions: FlowAliasPlanAction[]): Record<string, number> {\n const counts: Record<string, number> = {};\n actions.forEach((action) => {\n counts[action.decision] = (counts[action.decision] ?? 0) + 1;\n });\n return counts;\n}\n\nfunction buildOutputFiles(outDir: string): FlowBuildAliasMapFiles {\n return {\n out_dir: outDir,\n alias_plan: path.join(outDir, 'alias-plan.json'),\n alias_plan_jsonl: path.join(outDir, 'alias-plan.jsonl'),\n flow_alias_map: path.join(outDir, 'flow-alias-map.json'),\n manual_review_queue: path.join(outDir, 'manual-review-queue.jsonl'),\n summary: path.join(outDir, 'alias-summary.json'),\n };\n}\n\nexport async function runFlowBuildAliasMap(\n options: RunFlowBuildAliasMapOptions,\n deps: FlowBuildAliasMapDeps = {},\n): Promise<FlowBuildAliasMapReport> {\n const oldFlowFiles = assertInputFiles(\n options.oldFlowFiles ?? [],\n 'FLOW_BUILD_ALIAS_MAP_OLD_FLOW_FILES_REQUIRED',\n 'FLOW_BUILD_ALIAS_MAP_OLD_FLOW_FILE_NOT_FOUND',\n );\n const newFlowFiles = assertInputFiles(\n options.newFlowFiles ?? [],\n 'FLOW_BUILD_ALIAS_MAP_NEW_FLOW_FILES_REQUIRED',\n 'FLOW_BUILD_ALIAS_MAP_NEW_FLOW_FILE_NOT_FOUND',\n );\n const seedAliasMapFile = options.seedAliasMapFile\n ? assertInputFile(\n options.seedAliasMapFile,\n 'FLOW_BUILD_ALIAS_MAP_SEED_ALIAS_MAP_REQUIRED',\n 'FLOW_BUILD_ALIAS_MAP_SEED_ALIAS_MAP_NOT_FOUND',\n )\n : null;\n const outDir = assertOutDir(options.outDir);\n const now = deps.now ?? (() => new Date());\n const files = buildOutputFiles(outDir);\n\n const oldRows = oldFlowFiles.flatMap((filePath) => loadRowsFromFile(filePath));\n const newRows = newFlowFiles.flatMap((filePath) => loadRowsFromFile(filePath));\n const oldIndex = buildFlowIndex(oldRows);\n const newIndex = buildFlowIndex(newRows);\n const seedAliasMap = seedAliasMapFile\n ? readJsonObjectFile(\n seedAliasMapFile,\n 'FLOW_BUILD_ALIAS_MAP_SEED_ALIAS_MAP_REQUIRED',\n 'FLOW_BUILD_ALIAS_MAP_SEED_ALIAS_MAP_NOT_FOUND',\n 'FLOW_BUILD_ALIAS_MAP_SEED_ALIAS_MAP_INVALID',\n )\n : {};\n\n const aliasPlan: FlowAliasPlanAction[] = [];\n const manualQueue: FlowAliasPlanAction[] = [];\n const versionAliasMap: Record<string, JsonRecord> = {};\n const uuidTargets: Record<string, Set<string>> = {};\n\n oldIndex.records.forEach((oldRecord) => {\n const action = planAlias(oldRecord, newIndex, seedAliasMap);\n aliasPlan.push(action);\n\n if (\n action.decision === 'alias_map_entry' &&\n action.target_flow_id &&\n action.target_flow_version\n ) {\n const target = {\n id: action.target_flow_id,\n version: action.target_flow_version,\n reason: action.reason,\n } satisfies JsonRecord;\n versionAliasMap[`${oldRecord.id}@${oldRecord.version}`] = target;\n uuidTargets[oldRecord.id] ??= new Set<string>();\n uuidTargets[oldRecord.id].add(`${action.target_flow_id}@${action.target_flow_version}`);\n return;\n }\n\n if (action.decision === 'manual_review') {\n manualQueue.push(action);\n }\n });\n\n const flowAliasMap: Record<string, JsonRecord> = {\n ...versionAliasMap,\n };\n Object.entries(uuidTargets).forEach(([oldUuid, targets]) => {\n if (targets.size !== 1) {\n return;\n }\n const [targetId, targetVersion] = [...targets][0].split('@', 2);\n flowAliasMap[oldUuid] = {\n id: targetId,\n version: targetVersion,\n reason: 'all_versions_share_same_target',\n };\n });\n\n const summary: FlowBuildAliasMapSummary = {\n old_flow_count: oldIndex.records.length,\n new_flow_count: newIndex.records.length,\n alias_entries_versioned: Object.keys(versionAliasMap).length,\n alias_entries_uuid_only: Object.keys(flowAliasMap).length - Object.keys(versionAliasMap).length,\n manual_review_count: manualQueue.length,\n decision_counts: buildDecisionCounts(aliasPlan),\n };\n\n writeJsonArtifact(files.alias_plan, aliasPlan);\n writeJsonLinesArtifact(files.alias_plan_jsonl, aliasPlan);\n writeJsonArtifact(files.flow_alias_map, flowAliasMap);\n writeJsonLinesArtifact(files.manual_review_queue, manualQueue);\n writeJsonArtifact(files.summary, summary);\n\n return {\n schema_version: 1,\n generated_at_utc: now().toISOString(),\n status: 'completed_local_flow_build_alias_map',\n old_flow_files: oldFlowFiles,\n new_flow_files: newFlowFiles,\n seed_alias_map_file: seedAliasMapFile,\n out_dir: outDir,\n summary,\n files,\n };\n}\n\nexport const __testInternals = {\n assertInputFile,\n assertInputFiles,\n assertOutDir,\n readJsonObjectFile,\n buildFlowIndex,\n aliasLookup,\n candidateRef,\n planAlias,\n buildDecisionCounts,\n buildOutputFiles,\n};\n"]}
1
+ {"version":3,"file":"flow-build-alias-map.js","sourceRoot":"","sources":["../../../src/lib/flow-build-alias-map.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport {\n extractFlowRecord,\n isRecord,\n loadRowsFromFile,\n normalizeText,\n type FlowRecord,\n type JsonRecord,\n} from './flow-governance.js';\n\ntype FlowIndex = {\n records: FlowRecord[];\n byUuid: Record<string, FlowRecord[]>;\n byUuidVersion: Record<string, FlowRecord>;\n byName: Record<string, FlowRecord[]>;\n};\n\nexport type FlowBuildAliasMapFiles = {\n out_dir: string;\n alias_plan: string;\n alias_plan_jsonl: string;\n flow_alias_map: string;\n manual_review_queue: string;\n summary: string;\n};\n\nexport type FlowBuildAliasMapSummary = {\n old_flow_count: number;\n new_flow_count: number;\n alias_entries_versioned: number;\n alias_entries_uuid_only: number;\n manual_review_count: number;\n decision_counts: Record<string, number>;\n};\n\nexport type FlowAliasPlanAction = {\n old_flow_id: string;\n old_flow_version: string;\n old_flow_name: string;\n old_flow_type: string;\n decision: 'no_alias_needed' | 'alias_map_entry' | 'manual_review';\n reason: string;\n target_flow_id?: string;\n target_flow_version?: string;\n target_flow_name?: string;\n target_flow_type?: string;\n candidate_refs?: Array<Record<string, string>>;\n};\n\nexport type FlowBuildAliasMapReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_local_flow_build_alias_map';\n old_flow_files: string[];\n new_flow_files: string[];\n seed_alias_map_file: string | null;\n out_dir: string;\n summary: FlowBuildAliasMapSummary;\n files: FlowBuildAliasMapFiles;\n};\n\nexport type RunFlowBuildAliasMapOptions = {\n oldFlowFiles: string[];\n newFlowFiles: string[];\n seedAliasMapFile?: string | null;\n outDir: string;\n};\n\ntype FlowBuildAliasMapDeps = {\n now?: () => Date;\n};\n\nfunction assertInputFile(inputFile: string, requiredCode: string, missingCode: string): string {\n if (!inputFile) {\n throw new CliError('Missing required input file value.', {\n code: requiredCode,\n exitCode: 2,\n });\n }\n\n const resolved = path.resolve(inputFile);\n if (!existsSync(resolved)) {\n throw new CliError(`Input file not found: ${resolved}`, {\n code: missingCode,\n exitCode: 2,\n });\n }\n\n return resolved;\n}\n\nfunction assertInputFiles(\n inputFiles: string[],\n requiredCode: string,\n missingCode: string,\n): string[] {\n if (!inputFiles.length) {\n throw new CliError('At least one input file is required.', {\n code: requiredCode,\n exitCode: 2,\n });\n }\n\n return inputFiles.map((inputFile) => assertInputFile(inputFile, requiredCode, missingCode));\n}\n\nfunction assertOutDir(outDir: string): string {\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_BUILD_ALIAS_MAP_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n return path.resolve(outDir);\n}\n\nfunction readJsonObjectFile(\n filePath: string,\n requiredCode: string,\n missingCode: string,\n invalidCode: string,\n): JsonRecord {\n const resolved = assertInputFile(filePath, requiredCode, missingCode);\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(resolved, 'utf8'));\n } catch (error) {\n throw new CliError(`Expected JSON object file: ${resolved}`, {\n code: invalidCode,\n exitCode: 2,\n details: String(error),\n });\n }\n\n if (!isRecord(parsed)) {\n throw new CliError(`Expected JSON object file: ${resolved}`, {\n code: invalidCode,\n exitCode: 2,\n });\n }\n\n return parsed;\n}\n\nfunction buildFlowIndex(rows: JsonRecord[]): FlowIndex {\n const byUuid: Record<string, FlowRecord[]> = {};\n const byUuidVersion: Record<string, FlowRecord> = {};\n const byName: Record<string, FlowRecord[]> = {};\n const records: FlowRecord[] = [];\n\n for (const row of rows) {\n const record = extractFlowRecord(row);\n records.push(record);\n byUuid[record.id] ??= [];\n byUuid[record.id].push(record);\n byUuidVersion[`${record.id}@${record.version}`] = record;\n const normalizedName = normalizeText(record.name);\n byName[normalizedName] ??= [];\n byName[normalizedName].push(record);\n }\n\n return {\n records,\n byUuid,\n byUuidVersion,\n byName,\n };\n}\n\nfunction aliasLookup(\n aliasMap: JsonRecord,\n flowUuid: string,\n flowVersion: string | null,\n): JsonRecord | null {\n const versionedKey = flowVersion ? `${flowUuid}@${flowVersion}` : null;\n for (const key of [versionedKey, flowUuid]) {\n if (!key) {\n continue;\n }\n const candidate = aliasMap[key];\n if (isRecord(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction candidateRef(record: FlowRecord, includeType = false): Record<string, string> {\n return {\n id: record.id,\n version: record.version,\n name: record.name,\n ...(includeType ? { flow_type: record.flowType } : {}),\n };\n}\n\nfunction planAlias(\n oldRecord: FlowRecord,\n newIndex: FlowIndex,\n seedAliasMap: JsonRecord,\n): FlowAliasPlanAction {\n const base: FlowAliasPlanAction = {\n old_flow_id: oldRecord.id,\n old_flow_version: oldRecord.version,\n old_flow_name: oldRecord.name,\n old_flow_type: oldRecord.flowType,\n decision: 'manual_review',\n reason: 'no_deterministic_match',\n };\n\n const existingTarget = newIndex.byUuidVersion[`${oldRecord.id}@${oldRecord.version}`];\n if (existingTarget) {\n return {\n ...base,\n decision: 'no_alias_needed',\n reason: 'already_present_in_target',\n target_flow_id: existingTarget.id,\n target_flow_version: existingTarget.version,\n };\n }\n\n const seededTarget = aliasLookup(seedAliasMap, oldRecord.id, oldRecord.version || null);\n if (seededTarget) {\n const targetRecord =\n newIndex.byUuidVersion[\n `${String(seededTarget.id ?? '')}@${String(seededTarget.version ?? '')}`\n ];\n if (targetRecord) {\n return {\n ...base,\n decision: 'alias_map_entry',\n reason: 'seed_alias_map',\n target_flow_id: targetRecord.id,\n target_flow_version: targetRecord.version,\n target_flow_name: targetRecord.name,\n target_flow_type: targetRecord.flowType,\n };\n }\n }\n\n const sameUuidCandidates = newIndex.byUuid[oldRecord.id] ?? [];\n if (sameUuidCandidates.length === 1) {\n const candidate = sameUuidCandidates[0];\n return {\n ...base,\n decision: 'alias_map_entry',\n reason: 'same_uuid_single_target_version',\n target_flow_id: candidate.id,\n target_flow_version: candidate.version,\n target_flow_name: candidate.name,\n target_flow_type: candidate.flowType,\n };\n }\n\n if (sameUuidCandidates.length > 1) {\n return {\n ...base,\n decision: 'manual_review',\n reason: 'same_uuid_multiple_target_versions',\n candidate_refs: sameUuidCandidates.map((candidate) => candidateRef(candidate)),\n };\n }\n\n const byName = newIndex.byName[normalizeText(oldRecord.name)] ?? [];\n const nameAndTypeCandidates = byName.filter(\n (candidate) => candidate.flowType === oldRecord.flowType,\n );\n if (nameAndTypeCandidates.length === 1) {\n const candidate = nameAndTypeCandidates[0];\n return {\n ...base,\n decision: 'alias_map_entry',\n reason: 'unique_exact_name_and_type_match',\n target_flow_id: candidate.id,\n target_flow_version: candidate.version,\n target_flow_name: candidate.name,\n target_flow_type: candidate.flowType,\n };\n }\n\n if (nameAndTypeCandidates.length > 1) {\n return {\n ...base,\n decision: 'manual_review',\n reason: 'ambiguous_name_and_type_match',\n candidate_refs: nameAndTypeCandidates.map((candidate) => candidateRef(candidate)),\n };\n }\n\n if (byName.length > 0) {\n return {\n ...base,\n decision: 'manual_review',\n reason: 'name_match_flow_type_mismatch',\n candidate_refs: byName.map((candidate) => candidateRef(candidate, true)),\n };\n }\n\n return base;\n}\n\nfunction buildDecisionCounts(actions: FlowAliasPlanAction[]): Record<string, number> {\n const counts: Record<string, number> = {};\n actions.forEach((action) => {\n counts[action.decision] = (counts[action.decision] ?? 0) + 1;\n });\n return counts;\n}\n\nfunction buildOutputFiles(outDir: string): FlowBuildAliasMapFiles {\n return {\n out_dir: outDir,\n alias_plan: path.join(outDir, 'alias-plan.json'),\n alias_plan_jsonl: path.join(outDir, 'alias-plan.jsonl'),\n flow_alias_map: path.join(outDir, 'flow-alias-map.json'),\n manual_review_queue: path.join(outDir, 'manual-review-queue.jsonl'),\n summary: path.join(outDir, 'alias-summary.json'),\n };\n}\n\nexport async function runFlowBuildAliasMap(\n options: RunFlowBuildAliasMapOptions,\n deps: FlowBuildAliasMapDeps = {},\n): Promise<FlowBuildAliasMapReport> {\n const oldFlowFiles = assertInputFiles(\n options.oldFlowFiles ?? [],\n 'FLOW_BUILD_ALIAS_MAP_OLD_FLOW_FILES_REQUIRED',\n 'FLOW_BUILD_ALIAS_MAP_OLD_FLOW_FILE_NOT_FOUND',\n );\n const newFlowFiles = assertInputFiles(\n options.newFlowFiles ?? [],\n 'FLOW_BUILD_ALIAS_MAP_NEW_FLOW_FILES_REQUIRED',\n 'FLOW_BUILD_ALIAS_MAP_NEW_FLOW_FILE_NOT_FOUND',\n );\n const seedAliasMapFile = options.seedAliasMapFile\n ? assertInputFile(\n options.seedAliasMapFile,\n 'FLOW_BUILD_ALIAS_MAP_SEED_ALIAS_MAP_REQUIRED',\n 'FLOW_BUILD_ALIAS_MAP_SEED_ALIAS_MAP_NOT_FOUND',\n )\n : null;\n const outDir = assertOutDir(options.outDir);\n const now = deps.now ?? (() => new Date());\n const files = buildOutputFiles(outDir);\n\n const oldRows = oldFlowFiles.flatMap((filePath) => loadRowsFromFile(filePath));\n const newRows = newFlowFiles.flatMap((filePath) => loadRowsFromFile(filePath));\n const oldIndex = buildFlowIndex(oldRows);\n const newIndex = buildFlowIndex(newRows);\n const seedAliasMap = seedAliasMapFile\n ? readJsonObjectFile(\n seedAliasMapFile,\n 'FLOW_BUILD_ALIAS_MAP_SEED_ALIAS_MAP_REQUIRED',\n 'FLOW_BUILD_ALIAS_MAP_SEED_ALIAS_MAP_NOT_FOUND',\n 'FLOW_BUILD_ALIAS_MAP_SEED_ALIAS_MAP_INVALID',\n )\n : {};\n\n const aliasPlan: FlowAliasPlanAction[] = [];\n const manualQueue: FlowAliasPlanAction[] = [];\n const versionAliasMap: Record<string, JsonRecord> = {};\n const uuidTargets: Record<string, Set<string>> = {};\n\n oldIndex.records.forEach((oldRecord) => {\n const action = planAlias(oldRecord, newIndex, seedAliasMap);\n aliasPlan.push(action);\n\n if (\n action.decision === 'alias_map_entry' &&\n action.target_flow_id &&\n action.target_flow_version\n ) {\n const target = {\n id: action.target_flow_id,\n version: action.target_flow_version,\n reason: action.reason,\n } satisfies JsonRecord;\n versionAliasMap[`${oldRecord.id}@${oldRecord.version}`] = target;\n uuidTargets[oldRecord.id] ??= new Set<string>();\n uuidTargets[oldRecord.id].add(`${action.target_flow_id}@${action.target_flow_version}`);\n return;\n }\n\n if (action.decision === 'manual_review') {\n manualQueue.push(action);\n }\n });\n\n const flowAliasMap: Record<string, JsonRecord> = {\n ...versionAliasMap,\n };\n Object.entries(uuidTargets).forEach(([oldUuid, targets]) => {\n if (targets.size !== 1) {\n return;\n }\n const [targetId, targetVersion] = [...targets][0].split('@', 2);\n flowAliasMap[oldUuid] = {\n id: targetId,\n version: targetVersion,\n reason: 'all_versions_share_same_target',\n };\n });\n\n const summary: FlowBuildAliasMapSummary = {\n old_flow_count: oldIndex.records.length,\n new_flow_count: newIndex.records.length,\n alias_entries_versioned: Object.keys(versionAliasMap).length,\n alias_entries_uuid_only: Object.keys(flowAliasMap).length - Object.keys(versionAliasMap).length,\n manual_review_count: manualQueue.length,\n decision_counts: buildDecisionCounts(aliasPlan),\n };\n\n writeJsonArtifact(files.alias_plan, aliasPlan);\n writeJsonLinesArtifact(files.alias_plan_jsonl, aliasPlan);\n writeJsonArtifact(files.flow_alias_map, flowAliasMap);\n writeJsonLinesArtifact(files.manual_review_queue, manualQueue);\n writeJsonArtifact(files.summary, summary);\n\n return {\n schema_version: 1,\n generated_at_utc: now().toISOString(),\n status: 'completed_local_flow_build_alias_map',\n old_flow_files: oldFlowFiles,\n new_flow_files: newFlowFiles,\n seed_alias_map_file: seedAliasMapFile,\n out_dir: outDir,\n summary,\n files,\n };\n}\n\nexport const __testInternals = {\n assertInputFile,\n assertInputFiles,\n assertOutDir,\n readJsonObjectFile,\n buildFlowIndex,\n aliasLookup,\n candidateRef,\n planAlias,\n buildDecisionCounts,\n buildOutputFiles,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"flow-fetch-rows.js","sourceRoot":"","sources":["../../../src/lib/flow-fetch-rows.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport { loadRowsFromFile, type JsonRecord } from './flow-governance.js';\nimport type { FetchLike } from './http.js';\nimport {\n fetchOneFlowRow,\n normalizeSupabaseFlowPayload,\n type SupabaseFlowLookup,\n} from './flow-read.js';\nimport { requireSupabaseRestRuntime } from './supabase-rest.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\nconst FLOW_FETCH_ROWS_TIMEOUT_MS = 10_000;\n\ntype FlowFetchRef = {\n id: string;\n version: string | null;\n userId: string | null;\n stateCode: number | null;\n clusterId: string | null;\n source: string | null;\n};\n\ntype FlowFetchMaterializationContext = {\n input_index: number;\n requested_ref: {\n id: string;\n version: string | null;\n user_id: string | null;\n state_code: number | null;\n cluster_id: string | null;\n source: string | null;\n };\n resolution: SupabaseFlowLookup['resolution'];\n source_url: string;\n resolved_flow_id: string;\n resolved_version: string;\n};\n\ntype FlowFetchSummaryStatus =\n | 'completed_flow_row_materialization'\n | 'completed_flow_row_materialization_with_gaps';\n\nexport type RunFlowFetchRowsOptions = {\n refsFile: string;\n outDir: string;\n allowLatestFallback?: boolean;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\nexport type FlowFetchRowsReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: FlowFetchSummaryStatus;\n refs_file: string;\n out_dir: string;\n allow_latest_fallback: boolean;\n requested_ref_count: number;\n resolved_ref_count: number;\n qa_input_row_count: number;\n duplicate_qa_input_rows_collapsed: number;\n missing_ref_count: number;\n ambiguous_ref_count: number;\n resolution_counts: Record<SupabaseFlowLookup['resolution'], number>;\n files: {\n resolved_flow_rows: string;\n qa_input_rows: string;\n fetch_summary: string;\n missing_flow_refs: string;\n ambiguous_flow_refs: string;\n };\n};\n\nfunction normalizeToken(value: unknown): string | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n const trimmed = String(value).trim();\n return trimmed ? trimmed : null;\n}\n\nfunction normalizeOptionalNonNegativeInteger(\n value: unknown,\n label: string,\n code: string,\n): number | null {\n if (value === undefined || value === null || value === '') {\n return null;\n }\n\n const parsed =\n typeof value === 'number' && Number.isInteger(value)\n ? value\n : Number.parseInt(String(value), 10);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new CliError(`Expected ${label} to be a non-negative integer.`, {\n code,\n exitCode: 2,\n details: value,\n });\n }\n return parsed;\n}\n\nfunction normalizeFlowFetchRef(row: JsonRecord, index: number): FlowFetchRef {\n const id = normalizeToken(row.id);\n if (!id) {\n throw new CliError(`Flow ref row ${index + 1} is missing required id.`, {\n code: 'FLOW_FETCH_ROWS_REF_ID_REQUIRED',\n exitCode: 2,\n details: row,\n });\n }\n\n return {\n id,\n version: normalizeToken(row.version),\n userId: normalizeToken(row.user_id ?? row.userId),\n stateCode: normalizeOptionalNonNegativeInteger(\n row.state_code ?? row.stateCode,\n 'flow ref state_code',\n 'FLOW_FETCH_ROWS_INVALID_STATE_CODE',\n ),\n clusterId: normalizeToken(row.cluster_id ?? row.clusterId),\n source: normalizeToken(row.source),\n };\n}\n\nfunction toRequestedRefSummary(\n ref: FlowFetchRef,\n): FlowFetchMaterializationContext['requested_ref'] {\n return {\n id: ref.id,\n version: ref.version,\n user_id: ref.userId,\n state_code: ref.stateCode,\n cluster_id: ref.clusterId,\n source: ref.source,\n };\n}\n\nfunction buildMaterializedRow(\n lookup: SupabaseFlowLookup,\n context: FlowFetchMaterializationContext,\n): JsonRecord {\n const resolvedFlowId = lookup.row.id || context.requested_ref.id;\n const resolvedVersion = lookup.row.version || context.requested_ref.version || '';\n\n return {\n id: resolvedFlowId,\n version: resolvedVersion,\n user_id: lookup.row.user_id,\n state_code: lookup.row.state_code,\n modified_at: lookup.row.modified_at,\n json: normalizeSupabaseFlowPayload(lookup.row.json, `${resolvedFlowId}@${resolvedVersion}`),\n _materialization: context,\n };\n}\n\nfunction buildQaInputRow(\n row: JsonRecord,\n flowKey: string,\n contexts: FlowFetchMaterializationContext[],\n): JsonRecord {\n return {\n ...row,\n _materialization: {\n flow_key: flowKey,\n materialized_ref_count: contexts.length,\n materialized_from_refs: contexts,\n },\n };\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nexport async function runFlowFetchRows(\n options: RunFlowFetchRowsOptions,\n): Promise<FlowFetchRowsReport> {\n const refsFile = normalizeToken(options.refsFile);\n if (!refsFile) {\n throw new CliError('Missing required --refs-file value.', {\n code: 'FLOW_FETCH_ROWS_REFS_FILE_REQUIRED',\n exitCode: 2,\n });\n }\n\n const outDir = normalizeToken(options.outDir);\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_FETCH_ROWS_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n const resolvedRefsFile = path.resolve(refsFile);\n const resolvedOutDir = path.resolve(outDir);\n const allowLatestFallback = options.allowLatestFallback !== false;\n const rows = loadRowsFromFile(resolvedRefsFile);\n\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? FLOW_FETCH_ROWS_TIMEOUT_MS;\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n });\n\n const resolvedRowArtifacts: JsonRecord[] = [];\n const missingRefs: JsonRecord[] = [];\n const ambiguousRefs: JsonRecord[] = [];\n const qaInputByKey = new Map<\n string,\n { row: JsonRecord; contexts: FlowFetchMaterializationContext[] }\n >();\n const resolutionCounts: FlowFetchRowsReport['resolution_counts'] = {\n remote_supabase_exact: 0,\n remote_supabase_latest: 0,\n remote_supabase_latest_fallback: 0,\n };\n\n for (let index = 0; index < rows.length; index += 1) {\n const ref = normalizeFlowFetchRef(rows[index] as JsonRecord, index);\n const requestedRef = toRequestedRefSummary(ref);\n\n let lookup: SupabaseFlowLookup | null;\n try {\n lookup = await fetchOneFlowRow({\n runtime,\n id: ref.id,\n version: ref.version,\n userId: ref.userId,\n stateCode: ref.stateCode,\n timeoutMs,\n fetchImpl,\n fallbackToLatest: allowLatestFallback && ref.version !== null,\n });\n } catch (error) {\n if (error instanceof CliError && error.code === 'FLOW_GET_AMBIGUOUS') {\n ambiguousRefs.push({\n input_index: index,\n requested_ref: requestedRef,\n code: error.code,\n message: error.message,\n details: error.details,\n });\n continue;\n }\n throw error;\n }\n\n if (!lookup) {\n missingRefs.push({\n input_index: index,\n requested_ref: requestedRef,\n code: 'FLOW_GET_NOT_FOUND',\n message: ref.version\n ? `Could not resolve flow dataset for ${ref.id}@${ref.version}.`\n : `Could not resolve flow dataset for ${ref.id}.`,\n });\n continue;\n }\n\n resolutionCounts[lookup.resolution] += 1;\n const resolvedFlowId = lookup.row.id || ref.id;\n const resolvedVersion = lookup.row.version || ref.version || '';\n const context: FlowFetchMaterializationContext = {\n input_index: index,\n requested_ref: requestedRef,\n resolution: lookup.resolution,\n source_url: lookup.sourceUrl,\n resolved_flow_id: resolvedFlowId,\n resolved_version: resolvedVersion,\n };\n const materializedRow = buildMaterializedRow(lookup, context);\n resolvedRowArtifacts.push(materializedRow);\n\n const flowKey = `${resolvedFlowId}@${resolvedVersion}`;\n const existing = qaInputByKey.get(flowKey);\n if (existing) {\n existing.contexts.push(context);\n } else {\n qaInputByKey.set(flowKey, {\n row: materializedRow,\n contexts: [context],\n });\n }\n }\n\n const qaInputRows = [...qaInputByKey.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([flowKey, entry]) => buildQaInputRow(entry.row, flowKey, entry.contexts));\n\n const duplicateQaInputRowsCollapsed = resolvedRowArtifacts.length - qaInputRows.length;\n const unresolvedRefCount = missingRefs.length + ambiguousRefs.length;\n const status: FlowFetchSummaryStatus =\n unresolvedRefCount > 0\n ? 'completed_flow_row_materialization_with_gaps'\n : 'completed_flow_row_materialization';\n\n const resolvedRowsPath = path.join(resolvedOutDir, 'resolved-flow-rows.jsonl');\n const qaInputRowsPath = path.join(resolvedOutDir, 'qa-input-rows.jsonl');\n const missingRefsPath = path.join(resolvedOutDir, 'missing-flow-refs.jsonl');\n const ambiguousRefsPath = path.join(resolvedOutDir, 'ambiguous-flow-refs.jsonl');\n const summaryPath = path.join(resolvedOutDir, 'fetch-summary.json');\n\n writeJsonLinesArtifact(resolvedRowsPath, resolvedRowArtifacts);\n writeJsonLinesArtifact(qaInputRowsPath, qaInputRows);\n writeJsonLinesArtifact(missingRefsPath, missingRefs);\n writeJsonLinesArtifact(ambiguousRefsPath, ambiguousRefs);\n\n const report: FlowFetchRowsReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status,\n refs_file: resolvedRefsFile,\n out_dir: resolvedOutDir,\n allow_latest_fallback: allowLatestFallback,\n requested_ref_count: rows.length,\n resolved_ref_count: resolvedRowArtifacts.length,\n qa_input_row_count: qaInputRows.length,\n duplicate_qa_input_rows_collapsed: duplicateQaInputRowsCollapsed,\n missing_ref_count: missingRefs.length,\n ambiguous_ref_count: ambiguousRefs.length,\n resolution_counts: resolutionCounts,\n files: {\n resolved_flow_rows: resolvedRowsPath,\n qa_input_rows: qaInputRowsPath,\n fetch_summary: summaryPath,\n missing_flow_refs: missingRefsPath,\n ambiguous_flow_refs: ambiguousRefsPath,\n },\n };\n\n writeJsonArtifact(summaryPath, report);\n return report;\n}\n\nexport const __testInternals = {\n normalizeFlowFetchRef,\n normalizeOptionalNonNegativeInteger,\n normalizeToken,\n toRequestedRefSummary,\n};\n"]}
1
+ {"version":3,"file":"flow-fetch-rows.js","sourceRoot":"","sources":["../../../src/lib/flow-fetch-rows.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport { loadRowsFromFile, type JsonRecord } from './flow-governance.js';\nimport type { FetchLike } from './http.js';\nimport {\n fetchOneFlowRow,\n normalizeSupabaseFlowPayload,\n type SupabaseFlowLookup,\n} from './flow-read.js';\nimport { requireSupabaseRestRuntime } from './supabase-rest.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\nconst FLOW_FETCH_ROWS_TIMEOUT_MS = 10_000;\n\ntype FlowFetchRef = {\n id: string;\n version: string | null;\n userId: string | null;\n stateCode: number | null;\n clusterId: string | null;\n source: string | null;\n};\n\ntype FlowFetchMaterializationContext = {\n input_index: number;\n requested_ref: {\n id: string;\n version: string | null;\n user_id: string | null;\n state_code: number | null;\n cluster_id: string | null;\n source: string | null;\n };\n resolution: SupabaseFlowLookup['resolution'];\n source_url: string;\n resolved_flow_id: string;\n resolved_version: string;\n};\n\ntype FlowFetchSummaryStatus =\n | 'completed_flow_row_materialization'\n | 'completed_flow_row_materialization_with_gaps';\n\nexport type RunFlowFetchRowsOptions = {\n refsFile: string;\n outDir: string;\n allowLatestFallback?: boolean;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\nexport type FlowFetchRowsReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: FlowFetchSummaryStatus;\n refs_file: string;\n out_dir: string;\n allow_latest_fallback: boolean;\n requested_ref_count: number;\n resolved_ref_count: number;\n qa_input_row_count: number;\n duplicate_qa_input_rows_collapsed: number;\n missing_ref_count: number;\n ambiguous_ref_count: number;\n resolution_counts: Record<SupabaseFlowLookup['resolution'], number>;\n files: {\n resolved_flow_rows: string;\n qa_input_rows: string;\n fetch_summary: string;\n missing_flow_refs: string;\n ambiguous_flow_refs: string;\n };\n};\n\nfunction normalizeToken(value: unknown): string | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n const trimmed = String(value).trim();\n return trimmed ? trimmed : null;\n}\n\nfunction normalizeOptionalNonNegativeInteger(\n value: unknown,\n label: string,\n code: string,\n): number | null {\n if (value === undefined || value === null || value === '') {\n return null;\n }\n\n const parsed =\n typeof value === 'number' && Number.isInteger(value)\n ? value\n : Number.parseInt(String(value), 10);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new CliError(`Expected ${label} to be a non-negative integer.`, {\n code,\n exitCode: 2,\n details: value,\n });\n }\n return parsed;\n}\n\nfunction normalizeFlowFetchRef(row: JsonRecord, index: number): FlowFetchRef {\n const id = normalizeToken(row.id);\n if (!id) {\n throw new CliError(`Flow ref row ${index + 1} is missing required id.`, {\n code: 'FLOW_FETCH_ROWS_REF_ID_REQUIRED',\n exitCode: 2,\n details: row,\n });\n }\n\n return {\n id,\n version: normalizeToken(row.version),\n userId: normalizeToken(row.user_id ?? row.userId),\n stateCode: normalizeOptionalNonNegativeInteger(\n row.state_code ?? row.stateCode,\n 'flow ref state_code',\n 'FLOW_FETCH_ROWS_INVALID_STATE_CODE',\n ),\n clusterId: normalizeToken(row.cluster_id ?? row.clusterId),\n source: normalizeToken(row.source),\n };\n}\n\nfunction toRequestedRefSummary(\n ref: FlowFetchRef,\n): FlowFetchMaterializationContext['requested_ref'] {\n return {\n id: ref.id,\n version: ref.version,\n user_id: ref.userId,\n state_code: ref.stateCode,\n cluster_id: ref.clusterId,\n source: ref.source,\n };\n}\n\nfunction buildMaterializedRow(\n lookup: SupabaseFlowLookup,\n context: FlowFetchMaterializationContext,\n): JsonRecord {\n const resolvedFlowId = lookup.row.id || context.requested_ref.id;\n const resolvedVersion = lookup.row.version || context.requested_ref.version || '';\n\n return {\n id: resolvedFlowId,\n version: resolvedVersion,\n user_id: lookup.row.user_id,\n state_code: lookup.row.state_code,\n modified_at: lookup.row.modified_at,\n json: normalizeSupabaseFlowPayload(lookup.row.json, `${resolvedFlowId}@${resolvedVersion}`),\n _materialization: context,\n };\n}\n\nfunction buildQaInputRow(\n row: JsonRecord,\n flowKey: string,\n contexts: FlowFetchMaterializationContext[],\n): JsonRecord {\n return {\n ...row,\n _materialization: {\n flow_key: flowKey,\n materialized_ref_count: contexts.length,\n materialized_from_refs: contexts,\n },\n };\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nexport async function runFlowFetchRows(\n options: RunFlowFetchRowsOptions,\n): Promise<FlowFetchRowsReport> {\n const refsFile = normalizeToken(options.refsFile);\n if (!refsFile) {\n throw new CliError('Missing required --refs-file value.', {\n code: 'FLOW_FETCH_ROWS_REFS_FILE_REQUIRED',\n exitCode: 2,\n });\n }\n\n const outDir = normalizeToken(options.outDir);\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_FETCH_ROWS_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n const resolvedRefsFile = path.resolve(refsFile);\n const resolvedOutDir = path.resolve(outDir);\n const allowLatestFallback = options.allowLatestFallback !== false;\n const rows = loadRowsFromFile(resolvedRefsFile);\n\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? FLOW_FETCH_ROWS_TIMEOUT_MS;\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n });\n\n const resolvedRowArtifacts: JsonRecord[] = [];\n const missingRefs: JsonRecord[] = [];\n const ambiguousRefs: JsonRecord[] = [];\n const qaInputByKey = new Map<\n string,\n { row: JsonRecord; contexts: FlowFetchMaterializationContext[] }\n >();\n const resolutionCounts: FlowFetchRowsReport['resolution_counts'] = {\n remote_supabase_exact: 0,\n remote_supabase_latest: 0,\n remote_supabase_latest_fallback: 0,\n };\n\n for (let index = 0; index < rows.length; index += 1) {\n const ref = normalizeFlowFetchRef(rows[index] as JsonRecord, index);\n const requestedRef = toRequestedRefSummary(ref);\n\n let lookup: SupabaseFlowLookup | null;\n try {\n lookup = await fetchOneFlowRow({\n runtime,\n id: ref.id,\n version: ref.version,\n userId: ref.userId,\n stateCode: ref.stateCode,\n timeoutMs,\n fetchImpl,\n fallbackToLatest: allowLatestFallback && ref.version !== null,\n });\n } catch (error) {\n if (error instanceof CliError && error.code === 'FLOW_GET_AMBIGUOUS') {\n ambiguousRefs.push({\n input_index: index,\n requested_ref: requestedRef,\n code: error.code,\n message: error.message,\n details: error.details,\n });\n continue;\n }\n throw error;\n }\n\n if (!lookup) {\n missingRefs.push({\n input_index: index,\n requested_ref: requestedRef,\n code: 'FLOW_GET_NOT_FOUND',\n message: ref.version\n ? `Could not resolve flow dataset for ${ref.id}@${ref.version}.`\n : `Could not resolve flow dataset for ${ref.id}.`,\n });\n continue;\n }\n\n resolutionCounts[lookup.resolution] += 1;\n const resolvedFlowId = lookup.row.id || ref.id;\n const resolvedVersion = lookup.row.version || ref.version || '';\n const context: FlowFetchMaterializationContext = {\n input_index: index,\n requested_ref: requestedRef,\n resolution: lookup.resolution,\n source_url: lookup.sourceUrl,\n resolved_flow_id: resolvedFlowId,\n resolved_version: resolvedVersion,\n };\n const materializedRow = buildMaterializedRow(lookup, context);\n resolvedRowArtifacts.push(materializedRow);\n\n const flowKey = `${resolvedFlowId}@${resolvedVersion}`;\n const existing = qaInputByKey.get(flowKey);\n if (existing) {\n existing.contexts.push(context);\n } else {\n qaInputByKey.set(flowKey, {\n row: materializedRow,\n contexts: [context],\n });\n }\n }\n\n const qaInputRows = [...qaInputByKey.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([flowKey, entry]) => buildQaInputRow(entry.row, flowKey, entry.contexts));\n\n const duplicateQaInputRowsCollapsed = resolvedRowArtifacts.length - qaInputRows.length;\n const unresolvedRefCount = missingRefs.length + ambiguousRefs.length;\n const status: FlowFetchSummaryStatus =\n unresolvedRefCount > 0\n ? 'completed_flow_row_materialization_with_gaps'\n : 'completed_flow_row_materialization';\n\n const resolvedRowsPath = path.join(resolvedOutDir, 'resolved-flow-rows.jsonl');\n const qaInputRowsPath = path.join(resolvedOutDir, 'qa-input-rows.jsonl');\n const missingRefsPath = path.join(resolvedOutDir, 'missing-flow-refs.jsonl');\n const ambiguousRefsPath = path.join(resolvedOutDir, 'ambiguous-flow-refs.jsonl');\n const summaryPath = path.join(resolvedOutDir, 'fetch-summary.json');\n\n writeJsonLinesArtifact(resolvedRowsPath, resolvedRowArtifacts);\n writeJsonLinesArtifact(qaInputRowsPath, qaInputRows);\n writeJsonLinesArtifact(missingRefsPath, missingRefs);\n writeJsonLinesArtifact(ambiguousRefsPath, ambiguousRefs);\n\n const report: FlowFetchRowsReport = {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status,\n refs_file: resolvedRefsFile,\n out_dir: resolvedOutDir,\n allow_latest_fallback: allowLatestFallback,\n requested_ref_count: rows.length,\n resolved_ref_count: resolvedRowArtifacts.length,\n qa_input_row_count: qaInputRows.length,\n duplicate_qa_input_rows_collapsed: duplicateQaInputRowsCollapsed,\n missing_ref_count: missingRefs.length,\n ambiguous_ref_count: ambiguousRefs.length,\n resolution_counts: resolutionCounts,\n files: {\n resolved_flow_rows: resolvedRowsPath,\n qa_input_rows: qaInputRowsPath,\n fetch_summary: summaryPath,\n missing_flow_refs: missingRefsPath,\n ambiguous_flow_refs: ambiguousRefsPath,\n },\n };\n\n writeJsonArtifact(summaryPath, report);\n return report;\n}\n\nexport const __testInternals = {\n normalizeFlowFetchRef,\n normalizeOptionalNonNegativeInteger,\n normalizeToken,\n toRequestedRefSummary,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"flow-get.js","sourceRoot":"","sources":["../../../src/lib/flow-get.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n fetchOneFlowRow,\n normalizeSupabaseFlowPayload,\n type SupabaseFlowLookup,\n} from './flow-read.js';\nimport { requireSupabaseRestRuntime } from './supabase-rest.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst FLOW_GET_TIMEOUT_MS = 10_000;\n\nexport type RunFlowGetOptions = {\n flowId: string;\n version?: string | null;\n userId?: string | null;\n stateCode?: number | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\nexport type FlowGetReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'resolved_remote_flow';\n flow_id: string;\n requested_version: string | null;\n requested_user_id: string | null;\n requested_state_code: number | null;\n resolved_version: string;\n resolution: SupabaseFlowLookup['resolution'];\n source_url: string;\n modified_at: string | null;\n user_id: string | null;\n state_code: number | null;\n flow: JsonObject;\n};\n\nfunction normalizeToken(value: string | null | undefined): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nexport async function runFlowGet(options: RunFlowGetOptions): Promise<FlowGetReport> {\n const flowId = normalizeToken(options.flowId);\n if (!flowId) {\n throw new CliError('Missing required --id value.', {\n code: 'FLOW_ID_REQUIRED',\n exitCode: 2,\n });\n }\n\n const requestedVersion = normalizeToken(options.version ?? null);\n const requestedUserId = normalizeToken(options.userId ?? null);\n const requestedStateCode =\n Number.isInteger(options.stateCode) && (options.stateCode as number) >= 0\n ? (options.stateCode as number)\n : null;\n\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? FLOW_GET_TIMEOUT_MS;\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n });\n const lookup = await fetchOneFlowRow({\n runtime,\n id: flowId,\n version: requestedVersion,\n userId: requestedUserId,\n stateCode: requestedStateCode,\n timeoutMs,\n fetchImpl,\n fallbackToLatest: requestedVersion !== null,\n });\n\n if (!lookup) {\n throw new CliError(\n requestedVersion\n ? `Could not resolve flow dataset for ${flowId}@${requestedVersion}.`\n : `Could not resolve flow dataset for ${flowId}.`,\n {\n code: 'FLOW_GET_NOT_FOUND',\n exitCode: 2,\n details: {\n flow_id: flowId,\n version: requestedVersion,\n user_id: requestedUserId,\n state_code: requestedStateCode,\n },\n },\n );\n }\n\n return {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: 'resolved_remote_flow',\n flow_id: lookup.row.id || flowId,\n requested_version: requestedVersion,\n requested_user_id: requestedUserId,\n requested_state_code: requestedStateCode,\n resolved_version: lookup.row.version || requestedVersion || '',\n resolution: lookup.resolution,\n source_url: lookup.sourceUrl,\n modified_at: lookup.row.modified_at,\n user_id: lookup.row.user_id,\n state_code: lookup.row.state_code,\n flow: normalizeSupabaseFlowPayload(\n lookup.row.json,\n requestedVersion ? `${flowId}@${requestedVersion}` : flowId,\n ),\n };\n}\n\nexport const __testInternals = {\n normalizeToken,\n};\n"]}
1
+ {"version":3,"file":"flow-get.js","sourceRoot":"","sources":["../../../src/lib/flow-get.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n fetchOneFlowRow,\n normalizeSupabaseFlowPayload,\n type SupabaseFlowLookup,\n} from './flow-read.js';\nimport { requireSupabaseRestRuntime } from './supabase-rest.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst FLOW_GET_TIMEOUT_MS = 10_000;\n\nexport type RunFlowGetOptions = {\n flowId: string;\n version?: string | null;\n userId?: string | null;\n stateCode?: number | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\nexport type FlowGetReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'resolved_remote_flow';\n flow_id: string;\n requested_version: string | null;\n requested_user_id: string | null;\n requested_state_code: number | null;\n resolved_version: string;\n resolution: SupabaseFlowLookup['resolution'];\n source_url: string;\n modified_at: string | null;\n user_id: string | null;\n state_code: number | null;\n flow: JsonObject;\n};\n\nfunction normalizeToken(value: string | null | undefined): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nexport async function runFlowGet(options: RunFlowGetOptions): Promise<FlowGetReport> {\n const flowId = normalizeToken(options.flowId);\n if (!flowId) {\n throw new CliError('Missing required --id value.', {\n code: 'FLOW_ID_REQUIRED',\n exitCode: 2,\n });\n }\n\n const requestedVersion = normalizeToken(options.version ?? null);\n const requestedUserId = normalizeToken(options.userId ?? null);\n const requestedStateCode =\n Number.isInteger(options.stateCode) && (options.stateCode as number) >= 0\n ? (options.stateCode as number)\n : null;\n\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? FLOW_GET_TIMEOUT_MS;\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n });\n const lookup = await fetchOneFlowRow({\n runtime,\n id: flowId,\n version: requestedVersion,\n userId: requestedUserId,\n stateCode: requestedStateCode,\n timeoutMs,\n fetchImpl,\n fallbackToLatest: requestedVersion !== null,\n });\n\n if (!lookup) {\n throw new CliError(\n requestedVersion\n ? `Could not resolve flow dataset for ${flowId}@${requestedVersion}.`\n : `Could not resolve flow dataset for ${flowId}.`,\n {\n code: 'FLOW_GET_NOT_FOUND',\n exitCode: 2,\n details: {\n flow_id: flowId,\n version: requestedVersion,\n user_id: requestedUserId,\n state_code: requestedStateCode,\n },\n },\n );\n }\n\n return {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: 'resolved_remote_flow',\n flow_id: lookup.row.id || flowId,\n requested_version: requestedVersion,\n requested_user_id: requestedUserId,\n requested_state_code: requestedStateCode,\n resolved_version: lookup.row.version || requestedVersion || '',\n resolution: lookup.resolution,\n source_url: lookup.sourceUrl,\n modified_at: lookup.row.modified_at,\n user_id: lookup.row.user_id,\n state_code: lookup.row.state_code,\n flow: normalizeSupabaseFlowPayload(\n lookup.row.json,\n requestedVersion ? `${flowId}@${requestedVersion}` : flowId,\n ),\n };\n}\n\nexport const __testInternals = {\n normalizeToken,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"flow-governance.js","sourceRoot":"","sources":["../../../src/lib/flow-governance.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { CliError } from './errors.js';\n\nexport type JsonRecord = Record<string, unknown>;\n\nexport function isRecord(value: unknown): value is JsonRecord {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nexport type FlowRecord = {\n id: string;\n version: string;\n name: string;\n flowType: string;\n shortDescription: JsonRecord | null;\n row: JsonRecord;\n};\n\nexport function listify<T>(value: T | T[] | null | undefined): T[] {\n if (Array.isArray(value)) {\n return value;\n }\n\n return value === undefined || value === null ? [] : [value];\n}\n\nexport function deepGet(\n value: unknown,\n pathParts: string[],\n defaultValue: unknown = undefined,\n): unknown {\n let current: unknown = value;\n\n for (const part of pathParts) {\n if (!isRecord(current)) {\n return defaultValue;\n }\n\n current = current[part];\n if (current === undefined || current === null) {\n return defaultValue;\n }\n }\n\n return current;\n}\n\nexport function coerceText(value: unknown): string {\n if (typeof value === 'string') {\n return value.trim();\n }\n\n if (isRecord(value)) {\n if (typeof value['#text'] === 'string') {\n return String(value['#text']).trim();\n }\n\n for (const nested of Object.values(value)) {\n const candidate = coerceText(nested);\n if (candidate) {\n return candidate;\n }\n }\n\n return '';\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n const candidate = coerceText(item);\n if (candidate) {\n return candidate;\n }\n }\n\n return '';\n }\n\n return value === undefined || value === null ? '' : String(value).trim();\n}\n\nexport function firstLangEntry(value: unknown, fallback = ''): JsonRecord | null {\n if (isRecord(value) && ('#text' in value || '@xml:lang' in value)) {\n const text = coerceText(value);\n if (text) {\n return {\n '@xml:lang': coerceText(value['@xml:lang']) || 'en',\n '#text': text,\n };\n }\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n const result = firstLangEntry(item);\n if (result) {\n return result;\n }\n }\n }\n\n if (isRecord(value)) {\n for (const nested of Object.values(value)) {\n const result = firstLangEntry(nested);\n if (result) {\n return result;\n }\n }\n }\n\n return fallback\n ? {\n '@xml:lang': 'en',\n '#text': fallback,\n }\n : null;\n}\n\nexport function normalizeText(value: string): string {\n return value\n .replace(/[^0-9a-zA-Z\\u4e00-\\u9fff]+/gu, ' ')\n .replace(/\\s+/gu, ' ')\n .trim()\n .toLowerCase();\n}\n\nexport function datasetPayloadFromRow(row: JsonRecord): JsonRecord {\n if (isRecord(row.json_ordered)) {\n return row.json_ordered;\n }\n\n if (isRecord(row.json)) {\n return row.json;\n }\n\n return row;\n}\n\nexport function flowDatasetFromRow(row: JsonRecord): JsonRecord {\n const payload = datasetPayloadFromRow(row);\n return isRecord(payload.flowDataSet) ? payload.flowDataSet : payload;\n}\n\nexport function extractFlowRecord(row: JsonRecord): FlowRecord {\n const dataset = flowDatasetFromRow(row);\n const info = deepGet(dataset, ['flowInformation', 'dataSetInformation'], {}) as JsonRecord;\n const id = coerceText(row.id) || coerceText(info['common:UUID']);\n const version =\n coerceText(row.version) ||\n coerceText(\n deepGet(dataset, [\n 'administrativeInformation',\n 'publicationAndOwnership',\n 'common:dataSetVersion',\n ]),\n ) ||\n '01.00.000';\n const nameBlock =\n deepGet(info, ['name', 'baseName']) ??\n deepGet(info, ['name']) ??\n info['common:shortDescription'];\n const name = coerceText(nameBlock) || id;\n const flowType =\n coerceText(\n deepGet(dataset, ['modellingAndValidation', 'LCIMethodAndAllocation', 'typeOfDataSet']),\n ) ||\n coerceText(deepGet(dataset, ['modellingAndValidation', 'LCIMethod', 'typeOfDataSet'])) ||\n coerceText(row.typeOfDataSet);\n\n return {\n id,\n version,\n name,\n flowType,\n shortDescription: firstLangEntry(info['common:shortDescription'], name),\n row,\n };\n}\n\nexport function loadRowsFromFile(filePath: string): JsonRecord[] {\n const resolved = path.resolve(filePath);\n const text = readFileSync(resolved, 'utf8');\n\n if (resolved.endsWith('.jsonl')) {\n return text\n .split(/\\r?\\n/gu)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n const parsed = JSON.parse(line) as unknown;\n if (!isRecord(parsed)) {\n throw new CliError(`Expected JSON object rows in JSONL file: ${resolved}`, {\n code: 'FLOW_ROWS_INVALID_JSONL_ROW',\n exitCode: 2,\n });\n }\n return parsed;\n });\n }\n\n const parsed = JSON.parse(text) as unknown;\n if (!Array.isArray(parsed) || !parsed.every(isRecord)) {\n throw new CliError(`Expected JSON array of objects: ${resolved}`, {\n code: 'FLOW_ROWS_INVALID_JSON',\n exitCode: 2,\n });\n }\n\n return parsed;\n}\n\nexport const __testInternals = {\n isRecord,\n};\n"]}
1
+ {"version":3,"file":"flow-governance.js","sourceRoot":"","sources":["../../../src/lib/flow-governance.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { CliError } from './errors.js';\n\nexport type JsonRecord = Record<string, unknown>;\n\nexport function isRecord(value: unknown): value is JsonRecord {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nexport type FlowRecord = {\n id: string;\n version: string;\n name: string;\n flowType: string;\n shortDescription: JsonRecord | null;\n row: JsonRecord;\n};\n\nexport function listify<T>(value: T | T[] | null | undefined): T[] {\n if (Array.isArray(value)) {\n return value;\n }\n\n return value === undefined || value === null ? [] : [value];\n}\n\nexport function deepGet(\n value: unknown,\n pathParts: string[],\n defaultValue: unknown = undefined,\n): unknown {\n let current: unknown = value;\n\n for (const part of pathParts) {\n if (!isRecord(current)) {\n return defaultValue;\n }\n\n current = current[part];\n if (current === undefined || current === null) {\n return defaultValue;\n }\n }\n\n return current;\n}\n\nexport function coerceText(value: unknown): string {\n if (typeof value === 'string') {\n return value.trim();\n }\n\n if (isRecord(value)) {\n if (typeof value['#text'] === 'string') {\n return String(value['#text']).trim();\n }\n\n for (const nested of Object.values(value)) {\n const candidate = coerceText(nested);\n if (candidate) {\n return candidate;\n }\n }\n\n return '';\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n const candidate = coerceText(item);\n if (candidate) {\n return candidate;\n }\n }\n\n return '';\n }\n\n return value === undefined || value === null ? '' : String(value).trim();\n}\n\nexport function firstLangEntry(value: unknown, fallback = ''): JsonRecord | null {\n if (isRecord(value) && ('#text' in value || '@xml:lang' in value)) {\n const text = coerceText(value);\n if (text) {\n return {\n '@xml:lang': coerceText(value['@xml:lang']) || 'en',\n '#text': text,\n };\n }\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n const result = firstLangEntry(item);\n if (result) {\n return result;\n }\n }\n }\n\n if (isRecord(value)) {\n for (const nested of Object.values(value)) {\n const result = firstLangEntry(nested);\n if (result) {\n return result;\n }\n }\n }\n\n return fallback\n ? {\n '@xml:lang': 'en',\n '#text': fallback,\n }\n : null;\n}\n\nexport function normalizeText(value: string): string {\n return value\n .replace(/[^0-9a-zA-Z\\u4e00-\\u9fff]+/gu, ' ')\n .replace(/\\s+/gu, ' ')\n .trim()\n .toLowerCase();\n}\n\nexport function datasetPayloadFromRow(row: JsonRecord): JsonRecord {\n if (isRecord(row.json_ordered)) {\n return row.json_ordered;\n }\n\n if (isRecord(row.json)) {\n return row.json;\n }\n\n return row;\n}\n\nexport function flowDatasetFromRow(row: JsonRecord): JsonRecord {\n const payload = datasetPayloadFromRow(row);\n return isRecord(payload.flowDataSet) ? payload.flowDataSet : payload;\n}\n\nexport function extractFlowRecord(row: JsonRecord): FlowRecord {\n const dataset = flowDatasetFromRow(row);\n const info = deepGet(dataset, ['flowInformation', 'dataSetInformation'], {}) as JsonRecord;\n const id = coerceText(row.id) || coerceText(info['common:UUID']);\n const version =\n coerceText(row.version) ||\n coerceText(\n deepGet(dataset, [\n 'administrativeInformation',\n 'publicationAndOwnership',\n 'common:dataSetVersion',\n ]),\n ) ||\n '01.00.000';\n const nameBlock =\n deepGet(info, ['name', 'baseName']) ??\n deepGet(info, ['name']) ??\n info['common:shortDescription'];\n const name = coerceText(nameBlock) || id;\n const flowType =\n coerceText(\n deepGet(dataset, ['modellingAndValidation', 'LCIMethodAndAllocation', 'typeOfDataSet']),\n ) ||\n coerceText(deepGet(dataset, ['modellingAndValidation', 'LCIMethod', 'typeOfDataSet'])) ||\n coerceText(row.typeOfDataSet);\n\n return {\n id,\n version,\n name,\n flowType,\n shortDescription: firstLangEntry(info['common:shortDescription'], name),\n row,\n };\n}\n\nexport function loadRowsFromFile(filePath: string): JsonRecord[] {\n const resolved = path.resolve(filePath);\n const text = readFileSync(resolved, 'utf8');\n\n if (resolved.endsWith('.jsonl')) {\n return text\n .split(/\\r?\\n/gu)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n const parsed = JSON.parse(line) as unknown;\n if (!isRecord(parsed)) {\n throw new CliError(`Expected JSON object rows in JSONL file: ${resolved}`, {\n code: 'FLOW_ROWS_INVALID_JSONL_ROW',\n exitCode: 2,\n });\n }\n return parsed;\n });\n }\n\n const parsed = JSON.parse(text) as unknown;\n if (!Array.isArray(parsed) || !parsed.every(isRecord)) {\n throw new CliError(`Expected JSON array of objects: ${resolved}`, {\n code: 'FLOW_ROWS_INVALID_JSON',\n exitCode: 2,\n });\n }\n\n return parsed;\n}\n\nexport const __testInternals = {\n isRecord,\n};\n"]}
@@ -1,3 +1,4 @@
1
+ // data-api-relations: flows
1
2
  import { CliError } from './errors.js';
2
3
  import { listFlowRows, normalizeStateCodeList, normalizeSupabaseFlowPayload, normalizeTokenList, } from './flow-read.js';
3
4
  import { requireSupabaseRestRuntime } from './supabase-rest.js';
@@ -1 +1 @@
1
- {"version":3,"file":"flow-list.js","sourceRoot":"","sources":["../../../src/lib/flow-list.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n listFlowRows,\n normalizeStateCodeList,\n normalizeSupabaseFlowPayload,\n normalizeTokenList,\n} from './flow-read.js';\nimport { requireSupabaseRestRuntime } from './supabase-rest.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst FLOW_LIST_TIMEOUT_MS = 10_000;\nconst DEFAULT_FLOW_LIST_LIMIT = 100;\nconst DEFAULT_FLOW_LIST_PAGE_SIZE = 100;\nconst DEFAULT_FLOW_LIST_ORDER = 'id.asc,version.asc';\n\nexport type RunFlowListOptions = {\n ids?: string[];\n version?: string | null;\n userId?: string | null;\n stateCodes?: number[];\n typeOfDataset?: string[];\n limit?: number | null;\n offset?: number | null;\n all?: boolean;\n pageSize?: number | null;\n order?: string | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\nexport type FlowListReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'listed_remote_flows';\n filters: {\n ids: string[];\n requested_version: string | null;\n requested_user_id: string | null;\n requested_state_codes: number[];\n requested_type_of_dataset: string[];\n order: string;\n all: boolean;\n limit: number | null;\n offset: number;\n page_size: number | null;\n };\n count: number;\n source_urls: string[];\n rows: Array<{\n id: string;\n version: string;\n user_id: string | null;\n state_code: number | null;\n modified_at: string | null;\n flow: JsonObject;\n }>;\n};\n\nfunction normalizeToken(value: string | null | undefined): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed;\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 toNonNegativeInteger(\n value: number | null | undefined,\n label: string,\n code: string,\n): number {\n if (!Number.isInteger(value) || (value as number) < 0) {\n throw new CliError(`Expected ${label} to be a non-negative integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value as number;\n}\n\nexport async function runFlowList(options: RunFlowListOptions): Promise<FlowListReport> {\n const ids = normalizeTokenList(options.ids);\n const requestedVersion = normalizeToken(options.version ?? null);\n const requestedUserId = normalizeToken(options.userId ?? null);\n const requestedStateCodes = normalizeStateCodeList(options.stateCodes);\n const requestedTypeOfDataset = normalizeTokenList(options.typeOfDataset);\n const all = Boolean(options.all);\n const order = normalizeToken(options.order ?? null) ?? DEFAULT_FLOW_LIST_ORDER;\n\n if (all && options.limit !== null && options.limit !== undefined) {\n throw new CliError('Cannot combine --all with --limit.', {\n code: 'FLOW_LIST_ALL_LIMIT_CONFLICT',\n exitCode: 2,\n });\n }\n\n if (all && options.offset !== null && options.offset !== undefined) {\n throw new CliError('Cannot combine --all with --offset.', {\n code: 'FLOW_LIST_ALL_OFFSET_CONFLICT',\n exitCode: 2,\n });\n }\n\n if (\n all &&\n ids.length === 0 &&\n requestedVersion === null &&\n requestedUserId === null &&\n requestedStateCodes.length === 0 &&\n requestedTypeOfDataset.length === 0\n ) {\n throw new CliError('Refusing to run --all without at least one narrowing filter.', {\n code: 'FLOW_LIST_ALL_FILTER_REQUIRED',\n exitCode: 2,\n });\n }\n\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? FLOW_LIST_TIMEOUT_MS;\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n });\n const sourceUrls: string[] = [];\n\n const rows: FlowListReport['rows'] = [];\n if (all) {\n const pageSizeValue = options.pageSize ?? DEFAULT_FLOW_LIST_PAGE_SIZE;\n const pageSize = toPositiveInteger(pageSizeValue, '--page-size', 'FLOW_LIST_PAGE_SIZE_INVALID');\n let currentOffset = 0;\n while (true) {\n const page = await listFlowRows({\n runtime,\n filters: {\n ids,\n version: requestedVersion,\n userId: requestedUserId,\n stateCodes: requestedStateCodes,\n typeOfDataset: requestedTypeOfDataset,\n order,\n limit: pageSize,\n offset: currentOffset,\n },\n timeoutMs,\n fetchImpl,\n });\n sourceUrls.push(page.sourceUrl);\n rows.push(\n ...page.rows.map((row) => ({\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: row.state_code,\n modified_at: row.modified_at,\n flow: normalizeSupabaseFlowPayload(row.json, `${row.id}@${row.version}`),\n })),\n );\n if (page.rows.length < pageSize) {\n break;\n }\n currentOffset += pageSize;\n }\n\n return {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: 'listed_remote_flows',\n filters: {\n ids,\n requested_version: requestedVersion,\n requested_user_id: requestedUserId,\n requested_state_codes: requestedStateCodes,\n requested_type_of_dataset: requestedTypeOfDataset,\n order,\n all: true,\n limit: null,\n offset: 0,\n page_size: pageSize,\n },\n count: rows.length,\n source_urls: sourceUrls,\n rows,\n };\n }\n\n const limit = toPositiveInteger(\n options.limit ?? DEFAULT_FLOW_LIST_LIMIT,\n '--limit',\n 'FLOW_LIST_LIMIT_INVALID',\n );\n const offset = toNonNegativeInteger(options.offset ?? 0, '--offset', 'FLOW_LIST_OFFSET_INVALID');\n const page = await listFlowRows({\n runtime,\n filters: {\n ids,\n version: requestedVersion,\n userId: requestedUserId,\n stateCodes: requestedStateCodes,\n typeOfDataset: requestedTypeOfDataset,\n order,\n limit,\n offset,\n },\n timeoutMs,\n fetchImpl,\n });\n\n return {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: 'listed_remote_flows',\n filters: {\n ids,\n requested_version: requestedVersion,\n requested_user_id: requestedUserId,\n requested_state_codes: requestedStateCodes,\n requested_type_of_dataset: requestedTypeOfDataset,\n order,\n all: false,\n limit,\n offset,\n page_size: null,\n },\n count: page.rows.length,\n source_urls: [page.sourceUrl],\n rows: page.rows.map((row) => ({\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: row.state_code,\n modified_at: row.modified_at,\n flow: normalizeSupabaseFlowPayload(row.json, `${row.id}@${row.version}`),\n })),\n };\n}\n\nexport const __testInternals = {\n normalizeToken,\n nowIso,\n toPositiveInteger,\n toNonNegativeInteger,\n};\n"]}
1
+ {"version":3,"file":"flow-list.js","sourceRoot":"","sources":["../../../src/lib/flow-list.ts"],"names":[],"mappings":"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","sourcesContent":["// data-api-relations: flows\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n listFlowRows,\n normalizeStateCodeList,\n normalizeSupabaseFlowPayload,\n normalizeTokenList,\n} from './flow-read.js';\nimport { requireSupabaseRestRuntime } from './supabase-rest.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst FLOW_LIST_TIMEOUT_MS = 10_000;\nconst DEFAULT_FLOW_LIST_LIMIT = 100;\nconst DEFAULT_FLOW_LIST_PAGE_SIZE = 100;\nconst DEFAULT_FLOW_LIST_ORDER = 'id.asc,version.asc';\n\nexport type RunFlowListOptions = {\n ids?: string[];\n version?: string | null;\n userId?: string | null;\n stateCodes?: number[];\n typeOfDataset?: string[];\n limit?: number | null;\n offset?: number | null;\n all?: boolean;\n pageSize?: number | null;\n order?: string | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\nexport type FlowListReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'listed_remote_flows';\n filters: {\n ids: string[];\n requested_version: string | null;\n requested_user_id: string | null;\n requested_state_codes: number[];\n requested_type_of_dataset: string[];\n order: string;\n all: boolean;\n limit: number | null;\n offset: number;\n page_size: number | null;\n };\n count: number;\n source_urls: string[];\n rows: Array<{\n id: string;\n version: string;\n user_id: string | null;\n state_code: number | null;\n modified_at: string | null;\n flow: JsonObject;\n }>;\n};\n\nfunction normalizeToken(value: string | null | undefined): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed;\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 toNonNegativeInteger(\n value: number | null | undefined,\n label: string,\n code: string,\n): number {\n if (!Number.isInteger(value) || (value as number) < 0) {\n throw new CliError(`Expected ${label} to be a non-negative integer.`, {\n code,\n exitCode: 2,\n });\n }\n return value as number;\n}\n\nexport async function runFlowList(options: RunFlowListOptions): Promise<FlowListReport> {\n const ids = normalizeTokenList(options.ids);\n const requestedVersion = normalizeToken(options.version ?? null);\n const requestedUserId = normalizeToken(options.userId ?? null);\n const requestedStateCodes = normalizeStateCodeList(options.stateCodes);\n const requestedTypeOfDataset = normalizeTokenList(options.typeOfDataset);\n const all = Boolean(options.all);\n const order = normalizeToken(options.order ?? null) ?? DEFAULT_FLOW_LIST_ORDER;\n\n if (all && options.limit !== null && options.limit !== undefined) {\n throw new CliError('Cannot combine --all with --limit.', {\n code: 'FLOW_LIST_ALL_LIMIT_CONFLICT',\n exitCode: 2,\n });\n }\n\n if (all && options.offset !== null && options.offset !== undefined) {\n throw new CliError('Cannot combine --all with --offset.', {\n code: 'FLOW_LIST_ALL_OFFSET_CONFLICT',\n exitCode: 2,\n });\n }\n\n if (\n all &&\n ids.length === 0 &&\n requestedVersion === null &&\n requestedUserId === null &&\n requestedStateCodes.length === 0 &&\n requestedTypeOfDataset.length === 0\n ) {\n throw new CliError('Refusing to run --all without at least one narrowing filter.', {\n code: 'FLOW_LIST_ALL_FILTER_REQUIRED',\n exitCode: 2,\n });\n }\n\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? FLOW_LIST_TIMEOUT_MS;\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n });\n const sourceUrls: string[] = [];\n\n const rows: FlowListReport['rows'] = [];\n if (all) {\n const pageSizeValue = options.pageSize ?? DEFAULT_FLOW_LIST_PAGE_SIZE;\n const pageSize = toPositiveInteger(pageSizeValue, '--page-size', 'FLOW_LIST_PAGE_SIZE_INVALID');\n let currentOffset = 0;\n while (true) {\n const page = await listFlowRows({\n runtime,\n filters: {\n ids,\n version: requestedVersion,\n userId: requestedUserId,\n stateCodes: requestedStateCodes,\n typeOfDataset: requestedTypeOfDataset,\n order,\n limit: pageSize,\n offset: currentOffset,\n },\n timeoutMs,\n fetchImpl,\n });\n sourceUrls.push(page.sourceUrl);\n rows.push(\n ...page.rows.map((row) => ({\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: row.state_code,\n modified_at: row.modified_at,\n flow: normalizeSupabaseFlowPayload(row.json, `${row.id}@${row.version}`),\n })),\n );\n if (page.rows.length < pageSize) {\n break;\n }\n currentOffset += pageSize;\n }\n\n return {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: 'listed_remote_flows',\n filters: {\n ids,\n requested_version: requestedVersion,\n requested_user_id: requestedUserId,\n requested_state_codes: requestedStateCodes,\n requested_type_of_dataset: requestedTypeOfDataset,\n order,\n all: true,\n limit: null,\n offset: 0,\n page_size: pageSize,\n },\n count: rows.length,\n source_urls: sourceUrls,\n rows,\n };\n }\n\n const limit = toPositiveInteger(\n options.limit ?? DEFAULT_FLOW_LIST_LIMIT,\n '--limit',\n 'FLOW_LIST_LIMIT_INVALID',\n );\n const offset = toNonNegativeInteger(options.offset ?? 0, '--offset', 'FLOW_LIST_OFFSET_INVALID');\n const page = await listFlowRows({\n runtime,\n filters: {\n ids,\n version: requestedVersion,\n userId: requestedUserId,\n stateCodes: requestedStateCodes,\n typeOfDataset: requestedTypeOfDataset,\n order,\n limit,\n offset,\n },\n timeoutMs,\n fetchImpl,\n });\n\n return {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: 'listed_remote_flows',\n filters: {\n ids,\n requested_version: requestedVersion,\n requested_user_id: requestedUserId,\n requested_state_codes: requestedStateCodes,\n requested_type_of_dataset: requestedTypeOfDataset,\n order,\n all: false,\n limit,\n offset,\n page_size: null,\n },\n count: page.rows.length,\n source_urls: [page.sourceUrl],\n rows: page.rows.map((row) => ({\n id: row.id,\n version: row.version,\n user_id: row.user_id,\n state_code: row.state_code,\n modified_at: row.modified_at,\n flow: normalizeSupabaseFlowPayload(row.json, `${row.id}@${row.version}`),\n })),\n };\n}\n\nexport const __testInternals = {\n normalizeToken,\n nowIso,\n toPositiveInteger,\n toNonNegativeInteger,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"flow-payload-validation.js","sourceRoot":"","sources":["../../../src/lib/flow-payload-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AACpD,OAAO,EACL,kBAAkB,EAGlB,8BAA8B,GAC/B,MAAM,2BAA2B,CAAC;AAInC,MAAM,CAAC,MAAM,qBAAqB,GAAG,oCAAoC,CAAC;AAsB1E,SAAS,aAAa,CACpB,MAAwC,QAA4C;IAEpF,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC;IAC9B,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,GAAG,qBAAqB,+CAA+C,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,MAAgC,QAAQ;IAC9D,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAClC,OAAO,OAAO,UAAU,KAAK,UAAU,CAAC,CAAC,CAAE,UAAmC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,MAAmC;IAChF,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,oCAAoC,CAAC;IAC9C,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM;SAC1B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,2CAA2C,MAAM,CAAC,WAAW,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAmB,EACnB,SAA0B,aAAa,EAAE,EACzC,eAA4C,cAAc,EAAE;IAE5D,MAAM,OAAO,GAAG,8BAA8B,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAC9E,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,SAAS,EAAE,qBAAqB;YAChC,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC;QACpC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,mBAAmB;QAC7C,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ;KAC7B,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,EAAE,EAAE,KAAK;QACT,SAAS,EAAE,qBAAqB;QAChC,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,aAAa;IACb,cAAc;CACf,CAAC","sourcesContent":["import * as tidasSdk from '@tiangong-lca/tidas-sdk';\nimport {\n normalizeIssuePath,\n type SafeParseSchema,\n type SdkValidationFactory,\n validateSchemaWithDeepFallback,\n} from './tidas-sdk-validation.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport const FLOW_SCHEMA_VALIDATOR = '@tiangong-lca/tidas-sdk/FlowSchema';\n\nexport type FlowPayloadValidationIssue = {\n path: string;\n message: string;\n code: string;\n};\n\nexport type FlowPayloadValidationResult =\n | {\n ok: true;\n validator: string;\n issue_count: 0;\n issues: [];\n }\n | {\n ok: false;\n validator: string;\n issue_count: number;\n issues: FlowPayloadValidationIssue[];\n };\n\nfunction getFlowSchema(\n sdk: { FlowSchema?: SafeParseSchema } = tidasSdk as { FlowSchema?: SafeParseSchema },\n): SafeParseSchema {\n const schema = sdk.FlowSchema;\n if (!schema?.safeParse) {\n throw new Error(`${FLOW_SCHEMA_VALIDATOR} is unavailable in the published CLI runtime.`);\n }\n return schema;\n}\n\nfunction getFlowFactory(sdk: { createFlow?: unknown } = tidasSdk): SdkValidationFactory | null {\n const createFlow = sdk.createFlow;\n return typeof createFlow === 'function' ? (createFlow as SdkValidationFactory) : null;\n}\n\nexport function summarizeFlowPayloadValidation(result: FlowPayloadValidationResult): string {\n if (result.ok) {\n return 'local FlowSchema validation passed';\n }\n\n const preview = result.issues\n .slice(0, 3)\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join('; ');\n return `local FlowSchema validation failed with ${result.issue_count} issue(s)${preview ? ` (${preview})` : ''}`;\n}\n\nexport function validateFlowPayload(\n payload: JsonObject,\n schema: SafeParseSchema = getFlowSchema(),\n createEntity: SdkValidationFactory | null = getFlowFactory(),\n): FlowPayloadValidationResult {\n const outcome = validateSchemaWithDeepFallback(schema, payload, createEntity);\n if (outcome.success) {\n return {\n ok: true,\n validator: FLOW_SCHEMA_VALIDATOR,\n issue_count: 0,\n issues: [],\n };\n }\n\n const issues = outcome.issues.map((issue) => ({\n path: normalizeIssuePath(issue.path),\n message: issue.message ?? 'Validation failed',\n code: issue.code ?? 'custom',\n }));\n\n return {\n ok: false,\n validator: FLOW_SCHEMA_VALIDATOR,\n issue_count: issues.length,\n issues,\n };\n}\n\nexport const __testInternals = {\n getFlowSchema,\n getFlowFactory,\n};\n"]}
1
+ {"version":3,"file":"flow-payload-validation.js","sourceRoot":"","sources":["../../../src/lib/flow-payload-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AACpD,OAAO,EACL,kBAAkB,EAGlB,8BAA8B,GAC/B,MAAM,2BAA2B,CAAC;AAInC,MAAM,CAAC,MAAM,qBAAqB,GAAG,oCAAoC,CAAC;AAsB1E,SAAS,aAAa,CACpB,GAAG,GAAqC,QAA4C;IAEpF,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC;IAC9B,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,GAAG,qBAAqB,+CAA+C,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,GAAG,GAA6B,QAAQ;IAC9D,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAClC,OAAO,OAAO,UAAU,KAAK,UAAU,CAAC,CAAC,CAAE,UAAmC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,MAAmC;IAChF,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,oCAAoC,CAAC;IAC9C,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM;SAC1B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,2CAA2C,MAAM,CAAC,WAAW,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAmB,EACnB,MAAM,GAAoB,aAAa,EAAE,EACzC,YAAY,GAAgC,cAAc,EAAE;IAE5D,MAAM,OAAO,GAAG,8BAA8B,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAC9E,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,SAAS,EAAE,qBAAqB;YAChC,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC;QACpC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,mBAAmB;QAC7C,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ;KAC7B,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,EAAE,EAAE,KAAK;QACT,SAAS,EAAE,qBAAqB;QAChC,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,aAAa;IACb,cAAc;CACf,CAAC","sourcesContent":["import * as tidasSdk from '@tiangong-lca/tidas-sdk';\nimport {\n normalizeIssuePath,\n type SafeParseSchema,\n type SdkValidationFactory,\n validateSchemaWithDeepFallback,\n} from './tidas-sdk-validation.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport const FLOW_SCHEMA_VALIDATOR = '@tiangong-lca/tidas-sdk/FlowSchema';\n\nexport type FlowPayloadValidationIssue = {\n path: string;\n message: string;\n code: string;\n};\n\nexport type FlowPayloadValidationResult =\n | {\n ok: true;\n validator: string;\n issue_count: 0;\n issues: [];\n }\n | {\n ok: false;\n validator: string;\n issue_count: number;\n issues: FlowPayloadValidationIssue[];\n };\n\nfunction getFlowSchema(\n sdk: { FlowSchema?: SafeParseSchema } = tidasSdk as { FlowSchema?: SafeParseSchema },\n): SafeParseSchema {\n const schema = sdk.FlowSchema;\n if (!schema?.safeParse) {\n throw new Error(`${FLOW_SCHEMA_VALIDATOR} is unavailable in the published CLI runtime.`);\n }\n return schema;\n}\n\nfunction getFlowFactory(sdk: { createFlow?: unknown } = tidasSdk): SdkValidationFactory | null {\n const createFlow = sdk.createFlow;\n return typeof createFlow === 'function' ? (createFlow as SdkValidationFactory) : null;\n}\n\nexport function summarizeFlowPayloadValidation(result: FlowPayloadValidationResult): string {\n if (result.ok) {\n return 'local FlowSchema validation passed';\n }\n\n const preview = result.issues\n .slice(0, 3)\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join('; ');\n return `local FlowSchema validation failed with ${result.issue_count} issue(s)${preview ? ` (${preview})` : ''}`;\n}\n\nexport function validateFlowPayload(\n payload: JsonObject,\n schema: SafeParseSchema = getFlowSchema(),\n createEntity: SdkValidationFactory | null = getFlowFactory(),\n): FlowPayloadValidationResult {\n const outcome = validateSchemaWithDeepFallback(schema, payload, createEntity);\n if (outcome.success) {\n return {\n ok: true,\n validator: FLOW_SCHEMA_VALIDATOR,\n issue_count: 0,\n issues: [],\n };\n }\n\n const issues = outcome.issues.map((issue) => ({\n path: normalizeIssuePath(issue.path),\n message: issue.message ?? 'Validation failed',\n code: issue.code ?? 'custom',\n }));\n\n return {\n ok: false,\n validator: FLOW_SCHEMA_VALIDATOR,\n issue_count: issues.length,\n issues,\n };\n}\n\nexport const __testInternals = {\n getFlowSchema,\n getFlowFactory,\n};\n"]}
@@ -1,3 +1,4 @@
1
+ // data-api-relations: flows
1
2
  import { existsSync } from 'node:fs';
2
3
  import path from 'node:path';
3
4
  import { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';