@tiangong-lca/cli 0.0.21 → 0.0.23

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset-maintenance-contract.js","sourceRoot":"","sources":["../../../src/lib/dataset-maintenance-contract.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from 'node:crypto';\nimport { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { inspectMaintenanceSupportPayload } from './dataset-maintenance-support-validation.js';\nimport {\n isDatasetMaintenanceSnapshotCompleteness,\n type DatasetMaintenanceSnapshotCompleteness,\n} from './dataset-maintenance-pagination.js';\nimport { CliError } from './errors.js';\n\nexport type JsonObject = Record<string, unknown>;\n\nexport const MAINTENANCE_MUTABLE_TABLES = ['contacts', 'sources', 'flows', 'processes'] as const;\n\nexport const MAINTENANCE_SUPPORT_TABLES = ['unitgroups', 'flowproperties'] as const;\n\nexport const MAINTENANCE_SCAN_TABLES = [\n ...MAINTENANCE_MUTABLE_TABLES,\n 'lifecyclemodels',\n ...MAINTENANCE_SUPPORT_TABLES,\n] as const;\n\nexport type DatasetMaintenanceMutableTable = (typeof MAINTENANCE_MUTABLE_TABLES)[number];\nexport type DatasetMaintenanceSupportTable = (typeof MAINTENANCE_SUPPORT_TABLES)[number];\nexport type DatasetMaintenanceActionTable = DatasetMaintenanceMutableTable | 'flowproperties';\nexport type DatasetMaintenanceScanTable = (typeof MAINTENANCE_SCAN_TABLES)[number];\nexport type DatasetMaintenanceOperation =\n | 'delete'\n | 'retire'\n | 'redo-import'\n | 'repair-references'\n | 'merge-support-aliases';\nexport type DatasetMaintenanceActionKind = 'save_draft' | 'delete' | 'update_json_ordered';\nexport type DatasetMaintenanceTargetMode = 'owner_draft';\n\nexport type DatasetMaintenanceAliasDimension = 'time' | 'length_time';\n\nexport type DatasetMaintenanceEntityRef = {\n id: string;\n version: string;\n};\n\nexport type DatasetMaintenanceAliasBatch = {\n batch_id: string;\n dimension: DatasetMaintenanceAliasDimension;\n factor: string;\n source: {\n unitgroup: DatasetMaintenanceEntityRef;\n flowproperty: DatasetMaintenanceEntityRef;\n };\n target: {\n unitgroup: DatasetMaintenanceEntityRef;\n flowproperty: DatasetMaintenanceEntityRef;\n };\n};\n\nexport type DatasetMaintenanceExchangeInstance = {\n exchange_index: number;\n data_set_internal_id: string;\n flow_id: string;\n flow_version: string;\n direction: 'Input' | 'Output';\n before_exchange_sha256: string;\n before_mean_amount: string;\n before_resulting_amount: string;\n};\n\nexport type DatasetMaintenanceAliasMutation =\n | { kind: 'flowproperty_unitgroup_reference' }\n | {\n kind: 'flow_flowproperty_reference';\n flow_property_internal_id: string;\n source_flowproperty_id: string;\n source_flowproperty_version: string;\n }\n | {\n kind: 'process_exchange_amounts';\n exchanges: Array<{\n index: number;\n internal_id: string;\n flow_id: string;\n flow_version: string;\n direction: 'Input' | 'Output';\n before_exchange_sha256: string;\n }>;\n };\n\nexport type DatasetMaintenanceScopeAction = {\n action_id: string;\n action: DatasetMaintenanceActionKind;\n table: DatasetMaintenanceActionTable;\n id: string;\n version: string;\n expected_user_id: string;\n expected_state_code: 0;\n reason_code: string;\n reason: string;\n evidence: unknown[];\n batch_id?: string;\n exchange_instances?: DatasetMaintenanceExchangeInstance[];\n desired_payload_path?: string;\n expected_before_sha256?: string;\n};\n\nexport type DatasetMaintenanceScope = {\n schema_version: 1;\n task_id: string;\n operation: DatasetMaintenanceOperation;\n account: {\n user_id: string;\n email?: string;\n };\n source_import_run_id?: string;\n source_lineage?: unknown;\n target_mode?: DatasetMaintenanceTargetMode;\n alias_batches?: DatasetMaintenanceAliasBatch[];\n actions: DatasetMaintenanceScopeAction[];\n};\n\nexport type DatasetMaintenanceRemoteRow = {\n table: DatasetMaintenanceScanTable;\n id: string;\n version: string;\n user_id: string | null;\n state_code: number | null;\n modified_at: string | null;\n json_ordered: JsonObject | null;\n model_id: string | null;\n rule_verification: boolean | null;\n};\n\nexport type DatasetMaintenanceRowSnapshot = DatasetMaintenanceRemoteRow & {\n row_sha256: string;\n payload_sha256: string | null;\n};\n\nexport type DatasetMaintenanceBlocker = {\n code: string;\n message: string;\n action_id?: string;\n table?: DatasetMaintenanceScanTable;\n id?: string;\n version?: string;\n details?: unknown;\n};\n\nexport type DatasetMaintenanceProtectedRow = {\n table: DatasetMaintenanceScanTable;\n id: string;\n version: string;\n modified_at: string | null;\n row_sha256: string;\n payload_sha256: string | null;\n reason: 'non_action_visible_row' | 'blocked_action_row';\n};\n\nexport type DatasetMaintenanceReferenceImpact = {\n target_action_id: string;\n target_table: DatasetMaintenanceActionTable;\n target_id: string;\n target_version: string;\n phase: 'current' | 'projected';\n source_table: DatasetMaintenanceScanTable;\n source_id: string;\n source_version: string;\n reference_path: string;\n reference_version: string | null;\n};\n\nexport type DatasetMaintenancePlanAction = DatasetMaintenanceScopeAction & {\n ordinal: number;\n status: 'ready' | 'blocked';\n before: DatasetMaintenanceRowSnapshot | null;\n desired_payload: {\n path: string;\n sha256: string;\n } | null;\n blockers: DatasetMaintenanceBlocker[];\n alias_mutation?: DatasetMaintenanceAliasMutation;\n rollback: {\n strategy:\n | 'save_before_snapshot'\n | 'restore_deleted_before_snapshot'\n | 'restore_atomic_alias_before_snapshot';\n before_payload_sha256: string | null;\n before_payload: JsonObject | null;\n model_id: string | null;\n rule_verification: boolean | null;\n };\n};\n\nexport type DatasetMaintenanceAliasExchangeRewrite = DatasetMaintenanceExchangeInstance & {\n action_id: string;\n process_id: string;\n process_version: string;\n after_mean_amount: string;\n after_resulting_amount: string;\n after_exchange_sha256: string;\n};\n\nexport type DatasetMaintenanceAliasBatchPlan = DatasetMaintenanceAliasBatch & {\n action_ids: string[];\n target_snapshots: {\n unitgroup: DatasetMaintenanceRowSnapshot | null;\n flowproperty: DatasetMaintenanceRowSnapshot | null;\n source_unitgroup: DatasetMaintenanceRowSnapshot | null;\n };\n conversion_evidence: {\n source_unitgroup_payload_sha256: string | null;\n source_reference_unit: JsonObject | null;\n target_conversion_unit: JsonObject | null;\n };\n exchange_rewrites: DatasetMaintenanceAliasExchangeRewrite[];\n summary: {\n rows: number;\n flowproperties: number;\n flows: number;\n processes: number;\n exchanges: number;\n amount_fields: number;\n unrelated_exchanges: number;\n };\n postconditions: {\n source_unitgroup_incoming_refs: number;\n source_flowproperty_flow_refs: number;\n target_flow_refs: number;\n target_exchange_refs: number;\n };\n};\n\nexport type DatasetMaintenancePlan = {\n schema_version: 1;\n generated_at_utc: string;\n task_id: string;\n operation: DatasetMaintenanceOperation;\n operation_id: string;\n account: {\n user_id: string;\n email: string | null;\n };\n source_import_run_id: string | null;\n source_lineage: unknown;\n target_mode: DatasetMaintenanceTargetMode | null;\n status: 'ready' | 'blocked';\n scope_sha256: string;\n visible_snapshot_sha256: string;\n snapshot_completeness?: DatasetMaintenanceSnapshotCompleteness<DatasetMaintenanceScanTable>;\n projected_reference_sha256: string;\n plan_sha256: string;\n summary: {\n actions: number;\n save_draft: number;\n delete: number;\n update_json_ordered?: number;\n atomic_batches?: number;\n scaled_exchanges?: number;\n scaled_amount_fields?: number;\n unrelated_exchanges_preserved?: number;\n protected_rows: number;\n blockers: number;\n current_reference_impacts: number;\n projected_reference_impacts: number;\n };\n artifacts: {\n maintenance_scope: string;\n rls_visible_snapshot: string;\n protected_rows: string;\n reference_impact_report: string;\n maintenance_plan: string;\n dry_run_report: string;\n payload_dir: string;\n exchange_rewrite_plan?: string;\n };\n actions: DatasetMaintenancePlanAction[];\n alias_batches?: DatasetMaintenanceAliasBatchPlan[];\n protected_rows: DatasetMaintenanceProtectedRow[];\n blockers: DatasetMaintenanceBlocker[];\n};\n\nexport type DatasetMaintenanceProgressEntry = {\n schema_version: 1;\n plan_sha256: string;\n operation_id: string;\n action_id: string;\n action: DatasetMaintenanceActionKind;\n table: DatasetMaintenanceActionTable;\n id: string;\n version: string;\n reason_code: string;\n audit_context: {\n plan_sha256: string;\n operation_id: string;\n action_id: string;\n reason_code: string;\n source: 'tiangong-lca dataset maintenance apply';\n target_mode?: DatasetMaintenanceTargetMode;\n };\n actor: {\n user_id: string;\n email: string;\n };\n started_at_utc: string;\n ended_at_utc: string;\n before_sha256: string;\n after_sha256: string | null;\n remote_result_sha256: string | null;\n result: 'success' | 'failed';\n error: string | null;\n rollback: DatasetMaintenancePlanAction['rollback'];\n batch_id?: string;\n target_mode?: DatasetMaintenanceTargetMode;\n batch_request_sha256?: string;\n database_audit_id?: string;\n summary_audit_id?: string;\n plan_request_sha256?: string;\n plan_summary_audit_id?: string;\n};\n\nfunction token(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const normalized = value.trim();\n return normalized || null;\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function stableJsonValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(stableJsonValue);\n }\n if (isJsonObject(value)) {\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, stableJsonValue(value[key])]),\n );\n }\n return value;\n}\n\nexport function stableJsonText(value: unknown): string {\n return JSON.stringify(stableJsonValue(value));\n}\n\nexport function sha256Text(value: string): string {\n return crypto.createHash('sha256').update(value).digest('hex');\n}\n\nexport function sha256Json(value: unknown): string {\n return sha256Text(stableJsonText(value));\n}\n\nexport function snapshotRemoteRow(row: DatasetMaintenanceRemoteRow): DatasetMaintenanceRowSnapshot {\n return {\n ...row,\n row_sha256: sha256Json(row),\n payload_sha256: row.json_ordered ? sha256Json(row.json_ordered) : null,\n };\n}\n\nexport function maintenanceRowKey(row: {\n table: DatasetMaintenanceScanTable;\n id: string;\n version: string;\n}): string {\n return `${row.table}\\u0000${row.id}\\u0000${row.version}`;\n}\n\nfunction requireToken(value: unknown, label: string): string {\n const normalized = token(value);\n if (!normalized) {\n throw new CliError(`Maintenance scope ${label} must be a non-empty string.`, {\n code: 'DATASET_MAINTENANCE_SCOPE_INVALID',\n exitCode: 2,\n details: { field: label },\n });\n }\n return normalized;\n}\n\nfunction parseEntityRef(value: unknown, label: string): DatasetMaintenanceEntityRef {\n if (!isJsonObject(value)) {\n throw new CliError(`Maintenance scope ${label} must be an object.`, {\n code: 'DATASET_MAINTENANCE_SCOPE_INVALID',\n exitCode: 2,\n });\n }\n return {\n id: requireToken(value.id, `${label}.id`),\n version: requireToken(value.version, `${label}.version`),\n };\n}\n\nfunction parseAliasBatch(value: unknown, index: number): DatasetMaintenanceAliasBatch {\n const label = `alias_batches[${index}]`;\n if (!isJsonObject(value) || !isJsonObject(value.source) || !isJsonObject(value.target)) {\n throw new CliError(`Maintenance scope ${label} must include source and target objects.`, {\n code: 'DATASET_MAINTENANCE_SCOPE_INVALID',\n exitCode: 2,\n });\n }\n const dimension = requireToken(value.dimension, `${label}.dimension`);\n const factors: Record<DatasetMaintenanceAliasDimension, string> = {\n time: '0.00011415525114155251',\n length_time: '1000',\n };\n if (!(dimension in factors)) {\n throw new CliError(`Unsupported alias-rewrite dimension: ${dimension}`, {\n code: 'DATASET_MAINTENANCE_ALIAS_DIMENSION_INVALID',\n exitCode: 2,\n });\n }\n const factor = requireToken(value.factor, `${label}.factor`);\n if (factor !== factors[dimension as DatasetMaintenanceAliasDimension]) {\n throw new CliError(`Alias-rewrite factor does not match dimension ${dimension}.`, {\n code: 'DATASET_MAINTENANCE_ALIAS_FACTOR_INVALID',\n exitCode: 2,\n });\n }\n return {\n batch_id: requireToken(value.batch_id, `${label}.batch_id`),\n dimension: dimension as DatasetMaintenanceAliasDimension,\n factor,\n source: {\n unitgroup: parseEntityRef(value.source.unitgroup, `${label}.source.unitgroup`),\n flowproperty: parseEntityRef(value.source.flowproperty, `${label}.source.flowproperty`),\n },\n target: {\n unitgroup: parseEntityRef(value.target.unitgroup, `${label}.target.unitgroup`),\n flowproperty: parseEntityRef(value.target.flowproperty, `${label}.target.flowproperty`),\n },\n };\n}\n\nfunction parseExchangeInstance(\n value: unknown,\n actionIndex: number,\n exchangeIndex: number,\n): DatasetMaintenanceExchangeInstance {\n const label = `actions[${actionIndex}].exchange_instances[${exchangeIndex}]`;\n if (\n !isJsonObject(value) ||\n typeof value.exchange_index !== 'number' ||\n !Number.isInteger(value.exchange_index) ||\n value.exchange_index < 0\n ) {\n throw new CliError(\n `Maintenance scope ${label}.exchange_index must be a non-negative integer.`,\n {\n code: 'DATASET_MAINTENANCE_SCOPE_INVALID',\n exitCode: 2,\n },\n );\n }\n const beforeExchangeSha256 = requireToken(\n value.before_exchange_sha256,\n `${label}.before_exchange_sha256`,\n );\n if (!/^[a-f0-9]{64}$/u.test(beforeExchangeSha256)) {\n throw new CliError(`Maintenance scope ${label}.before_exchange_sha256 is invalid.`, {\n code: 'DATASET_MAINTENANCE_SCOPE_INVALID',\n exitCode: 2,\n });\n }\n const direction = requireToken(value.direction, `${label}.direction`);\n if (!['Input', 'Output'].includes(direction)) {\n throw new CliError(`Maintenance scope ${label}.direction must be Input or Output.`, {\n code: 'DATASET_MAINTENANCE_SCOPE_INVALID',\n exitCode: 2,\n });\n }\n return {\n exchange_index: value.exchange_index as number,\n data_set_internal_id: requireToken(value.data_set_internal_id, `${label}.data_set_internal_id`),\n flow_id: requireToken(value.flow_id, `${label}.flow_id`),\n flow_version: requireToken(value.flow_version, `${label}.flow_version`),\n direction: direction as 'Input' | 'Output',\n before_exchange_sha256: beforeExchangeSha256,\n before_mean_amount: requireToken(value.before_mean_amount, `${label}.before_mean_amount`),\n before_resulting_amount: requireToken(\n value.before_resulting_amount,\n `${label}.before_resulting_amount`,\n ),\n };\n}\n\nfunction parseAction(\n value: unknown,\n index: number,\n accountUserId: string,\n operation: DatasetMaintenanceOperation,\n): DatasetMaintenanceScopeAction {\n if (!isJsonObject(value)) {\n throw new CliError(`Maintenance scope action ${index} must be an object.`, {\n code: 'DATASET_MAINTENANCE_SCOPE_INVALID',\n exitCode: 2,\n });\n }\n const action = requireToken(value.action, `actions[${index}].action`);\n const table = requireToken(value.table, `actions[${index}].table`);\n if (!['save_draft', 'delete', 'update_json_ordered'].includes(action)) {\n throw new CliError(`Unsupported maintenance action: ${action}`, {\n code: 'DATASET_MAINTENANCE_ACTION_UNSUPPORTED',\n exitCode: 2,\n });\n }\n const aliasAction = action === 'update_json_ordered';\n const allowedTable = aliasAction\n ? ['flowproperties', 'flows', 'processes'].includes(table)\n : (MAINTENANCE_MUTABLE_TABLES as readonly string[]).includes(table);\n if (!allowedTable) {\n throw new CliError(\n `Maintenance cannot mutate protected or unsupported dataset table: ${table}`,\n {\n code: 'DATASET_MAINTENANCE_TABLE_PROTECTED',\n exitCode: 2,\n },\n );\n }\n if (\n (operation === 'merge-support-aliases' && !aliasAction) ||\n (operation !== 'merge-support-aliases' && aliasAction)\n ) {\n throw new CliError(`Maintenance operation ${operation} cannot contain ${action} actions.`, {\n code: 'DATASET_MAINTENANCE_OPERATION_ACTION_MISMATCH',\n exitCode: 2,\n });\n }\n if (value.expected_state_code !== 0) {\n throw new CliError(`Maintenance action ${index} must require expected_state_code=0.`, {\n code: 'DATASET_MAINTENANCE_NON_DRAFT_FORBIDDEN',\n exitCode: 2,\n });\n }\n const expectedUserId = requireToken(value.expected_user_id, `actions[${index}].expected_user_id`);\n if (expectedUserId !== accountUserId) {\n throw new CliError(`Maintenance action ${index} owner does not match scope account.`, {\n code: 'DATASET_MAINTENANCE_SCOPE_OWNER_MISMATCH',\n exitCode: 2,\n });\n }\n if (!Array.isArray(value.evidence)) {\n throw new CliError(`Maintenance action ${index} evidence must be an array.`, {\n code: 'DATASET_MAINTENANCE_SCOPE_INVALID',\n exitCode: 2,\n });\n }\n const desiredPayloadPath = token(value.desired_payload_path);\n if (action === 'save_draft' && !desiredPayloadPath) {\n throw new CliError(`Maintenance save_draft action ${index} requires desired_payload_path.`, {\n code: 'DATASET_MAINTENANCE_DESIRED_PAYLOAD_REQUIRED',\n exitCode: 2,\n });\n }\n if (action !== 'save_draft' && desiredPayloadPath) {\n throw new CliError(\n `Maintenance ${action} action ${index} cannot include desired_payload_path.`,\n {\n code: 'DATASET_MAINTENANCE_DESIRED_PAYLOAD_FORBIDDEN',\n exitCode: 2,\n },\n );\n }\n const batchId = token(value.batch_id);\n if (aliasAction !== Boolean(batchId)) {\n throw new CliError(\n aliasAction\n ? `Maintenance alias action ${index} requires batch_id.`\n : `Maintenance non-alias action ${index} cannot include batch_id.`,\n {\n code: 'DATASET_MAINTENANCE_ALIAS_BATCH_BINDING_INVALID',\n exitCode: 2,\n },\n );\n }\n const exchangeInstances = Array.isArray(value.exchange_instances)\n ? value.exchange_instances.map((entry, exchangeIndex) =>\n parseExchangeInstance(entry, index, exchangeIndex),\n )\n : [];\n if (\n aliasAction &&\n ((table === 'processes' && exchangeInstances.length === 0) ||\n (table !== 'processes' && exchangeInstances.length > 0))\n ) {\n throw new CliError(\n `Alias action ${index} exchange_instances must be non-empty only for processes.`,\n {\n code: 'DATASET_MAINTENANCE_ALIAS_EXCHANGE_SCOPE_INVALID',\n exitCode: 2,\n },\n );\n }\n if (!aliasAction && 'exchange_instances' in value) {\n throw new CliError(`Maintenance non-alias action ${index} cannot include exchange_instances.`, {\n code: 'DATASET_MAINTENANCE_ALIAS_EXCHANGE_SCOPE_INVALID',\n exitCode: 2,\n });\n }\n const exchangeKeys = new Set(\n exchangeInstances.map(\n (entry) => `${entry.exchange_index}\\u0000${entry.data_set_internal_id}\\u0000${entry.flow_id}`,\n ),\n );\n if (exchangeKeys.size !== exchangeInstances.length) {\n throw new CliError(`Alias action ${index} contains duplicate exchange instances.`, {\n code: 'DATASET_MAINTENANCE_ALIAS_EXCHANGE_SCOPE_INVALID',\n exitCode: 2,\n });\n }\n const expectedBeforeSha256 = token(value.expected_before_sha256);\n if (expectedBeforeSha256 && !/^[a-f0-9]{64}$/u.test(expectedBeforeSha256)) {\n throw new CliError(`Maintenance action ${index} expected_before_sha256 is invalid.`, {\n code: 'DATASET_MAINTENANCE_SCOPE_INVALID',\n exitCode: 2,\n });\n }\n\n return {\n action_id: requireToken(value.action_id, `actions[${index}].action_id`),\n action: action as DatasetMaintenanceActionKind,\n table: table as DatasetMaintenanceActionTable,\n id: requireToken(value.id, `actions[${index}].id`),\n version: requireToken(value.version, `actions[${index}].version`),\n expected_user_id: expectedUserId,\n expected_state_code: 0,\n reason_code: requireToken(value.reason_code, `actions[${index}].reason_code`),\n reason: requireToken(value.reason, `actions[${index}].reason`),\n evidence: value.evidence,\n ...(batchId ? { batch_id: batchId } : {}),\n ...(exchangeInstances.length ? { exchange_instances: exchangeInstances } : {}),\n ...(desiredPayloadPath ? { desired_payload_path: desiredPayloadPath } : {}),\n ...(expectedBeforeSha256 ? { expected_before_sha256: expectedBeforeSha256 } : {}),\n };\n}\n\nexport function parseMaintenanceScope(\n value: unknown,\n expectedOperation?: DatasetMaintenanceOperation,\n): DatasetMaintenanceScope {\n if (!isJsonObject(value) || value.schema_version !== 1 || !isJsonObject(value.account)) {\n throw new CliError('Maintenance scope must use schema_version=1 and include account.', {\n code: 'DATASET_MAINTENANCE_SCOPE_INVALID',\n exitCode: 2,\n });\n }\n const operation = requireToken(value.operation, 'operation');\n if (\n !['delete', 'retire', 'redo-import', 'repair-references', 'merge-support-aliases'].includes(\n operation,\n )\n ) {\n throw new CliError(`Unsupported maintenance operation: ${operation}`, {\n code: 'DATASET_MAINTENANCE_OPERATION_UNSUPPORTED',\n exitCode: 2,\n });\n }\n if (expectedOperation && operation !== expectedOperation) {\n throw new CliError(\n `Scope operation ${operation} does not match requested operation ${expectedOperation}.`,\n {\n code: 'DATASET_MAINTENANCE_OPERATION_MISMATCH',\n exitCode: 2,\n },\n );\n }\n const userId = requireToken(value.account.user_id, 'account.user_id');\n if (!Array.isArray(value.actions) || value.actions.length === 0) {\n throw new CliError('Maintenance scope actions must be a non-empty array.', {\n code: 'DATASET_MAINTENANCE_SCOPE_INVALID',\n exitCode: 2,\n });\n }\n const actions = value.actions.map((entry, index) =>\n parseAction(entry, index, userId, operation as DatasetMaintenanceOperation),\n );\n const targetMode = token(value.target_mode);\n if (\n (operation === 'merge-support-aliases' && targetMode !== 'owner_draft') ||\n (operation !== 'merge-support-aliases' && targetMode !== null)\n ) {\n throw new CliError(\n 'merge-support-aliases requires target_mode=owner_draft; other operations forbid target_mode.',\n {\n code: 'DATASET_MAINTENANCE_TARGET_MODE_INVALID',\n exitCode: 2,\n details: { operation, target_mode: targetMode },\n },\n );\n }\n const aliasBatches = Array.isArray(value.alias_batches)\n ? value.alias_batches.map(parseAliasBatch)\n : [];\n if (\n (operation === 'merge-support-aliases' && aliasBatches.length !== 2) ||\n (operation !== 'merge-support-aliases' && aliasBatches.length !== 0)\n ) {\n throw new CliError(\n 'merge-support-aliases requires exactly two alias_batches; other operations forbid them.',\n {\n code: 'DATASET_MAINTENANCE_ALIAS_BATCH_SCOPE_INVALID',\n exitCode: 2,\n },\n );\n }\n if (aliasBatches.length) {\n const batchIds = new Set(aliasBatches.map((batch) => batch.batch_id));\n const dimensions = new Set(aliasBatches.map((batch) => batch.dimension));\n if (\n batchIds.size !== 2 ||\n dimensions.size !== 2 ||\n !dimensions.has('time') ||\n !dimensions.has('length_time') ||\n actions.some((action) => !action.batch_id || !batchIds.has(action.batch_id))\n ) {\n throw new CliError(\n 'Alias batches and action batch_id bindings are incomplete or duplicate.',\n {\n code: 'DATASET_MAINTENANCE_ALIAS_BATCH_SCOPE_INVALID',\n exitCode: 2,\n },\n );\n }\n }\n const actionIds = new Set<string>();\n const rowKeys = new Set<string>();\n const payloadNames = new Set<string>();\n for (const action of actions) {\n if (actionIds.has(action.action_id)) {\n throw new CliError(`Duplicate maintenance action_id: ${action.action_id}`, {\n code: 'DATASET_MAINTENANCE_ACTION_ID_DUPLICATE',\n exitCode: 2,\n });\n }\n actionIds.add(action.action_id);\n const rowKey = maintenanceRowKey(action);\n if (rowKeys.has(rowKey)) {\n throw new CliError(`Multiple maintenance actions target the same row: ${action.id}`, {\n code: 'DATASET_MAINTENANCE_TARGET_DUPLICATE',\n exitCode: 2,\n });\n }\n rowKeys.add(rowKey);\n const payloadName = safeActionFileName(action.action_id);\n if (payloadNames.has(payloadName)) {\n throw new CliError(`Maintenance action ids collide as payload filenames: ${payloadName}`, {\n code: 'DATASET_MAINTENANCE_ACTION_FILENAME_COLLISION',\n exitCode: 2,\n });\n }\n payloadNames.add(payloadName);\n }\n const email = token(value.account.email);\n const sourceImportRunId = token(value.source_import_run_id);\n return {\n schema_version: 1,\n task_id: requireToken(value.task_id, 'task_id'),\n operation: operation as DatasetMaintenanceOperation,\n account: {\n user_id: userId,\n ...(email ? { email } : {}),\n },\n ...(sourceImportRunId ? { source_import_run_id: sourceImportRunId } : {}),\n ...('source_lineage' in value ? { source_lineage: value.source_lineage } : {}),\n ...(targetMode === 'owner_draft' ? { target_mode: targetMode } : {}),\n ...(aliasBatches.length ? { alias_batches: aliasBatches } : {}),\n actions,\n };\n}\n\nexport function readJsonFile(filePath: string, label: string): unknown {\n const resolved = path.resolve(filePath);\n if (!existsSync(resolved)) {\n throw new CliError(`${label} not found: ${resolved}`, {\n code: 'DATASET_MAINTENANCE_ARTIFACT_NOT_FOUND',\n exitCode: 2,\n });\n }\n try {\n return JSON.parse(readFileSync(resolved, 'utf8'));\n } catch (error) {\n throw new CliError(`${label} is not valid JSON: ${resolved}`, {\n code: 'DATASET_MAINTENANCE_ARTIFACT_INVALID',\n exitCode: 2,\n details: String(error),\n });\n }\n}\n\nfunction writeImmutableText(filePath: string, text: string): string {\n const resolved = path.resolve(filePath);\n if (existsSync(resolved)) {\n if (readFileSync(resolved, 'utf8') === text) {\n return resolved;\n }\n throw new CliError(`Refusing to overwrite immutable maintenance artifact: ${resolved}`, {\n code: 'DATASET_MAINTENANCE_ARTIFACT_IMMUTABLE',\n exitCode: 1,\n });\n }\n mkdirSync(path.dirname(resolved), { recursive: true });\n writeFileSync(resolved, text, { encoding: 'utf8', flag: 'wx' });\n return resolved;\n}\n\nexport function writeImmutableJson(filePath: string, value: unknown): string {\n return writeImmutableText(filePath, `${stableJsonText(value)}\\n`);\n}\n\nexport function writeImmutableJsonLines(filePath: string, values: unknown[]): string {\n const text = values.length ? `${values.map(stableJsonText).join('\\n')}\\n` : '';\n return writeImmutableText(filePath, text);\n}\n\nexport function appendStableJsonLine(filePath: string, value: unknown): string {\n const resolved = path.resolve(filePath);\n mkdirSync(path.dirname(resolved), { recursive: true });\n appendFileSync(resolved, `${stableJsonText(value)}\\n`, 'utf8');\n return resolved;\n}\n\nexport function readJsonLinesIfPresent(filePath: string): unknown[] {\n const resolved = path.resolve(filePath);\n if (!existsSync(resolved)) {\n return [];\n }\n return readFileSync(resolved, 'utf8')\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n try {\n return JSON.parse(line);\n } catch (error) {\n throw new CliError(`Invalid maintenance JSONL at ${resolved}:${index + 1}`, {\n code: 'DATASET_MAINTENANCE_ARTIFACT_INVALID',\n exitCode: 1,\n details: String(error),\n });\n }\n });\n}\n\nexport function safeActionFileName(actionId: string): string {\n const safe = actionId.replace(/[^a-zA-Z0-9._-]+/gu, '_').replace(/^_+|_+$/gu, '');\n return safe || sha256Text(actionId).slice(0, 16);\n}\n\nexport function resolveMaintenancePlanArtifactPath(\n planDir: string,\n relativePath: string,\n label: string,\n): string {\n const root = path.resolve(planDir);\n if (!relativePath.trim() || path.isAbsolute(relativePath)) {\n throw new CliError(`${label} must be a relative path inside the maintenance plan directory.`, {\n code: 'DATASET_MAINTENANCE_PLAN_ARTIFACT_PATH_INVALID',\n exitCode: 2,\n details: relativePath,\n });\n }\n const resolved = path.resolve(root, relativePath);\n const withinRoot = path.relative(root, resolved);\n if (!withinRoot || withinRoot === '..' || withinRoot.startsWith(`..${path.sep}`)) {\n throw new CliError(`${label} must stay inside the maintenance plan directory.`, {\n code: 'DATASET_MAINTENANCE_PLAN_ARTIFACT_PATH_INVALID',\n exitCode: 2,\n details: relativePath,\n });\n }\n return resolved;\n}\n\nexport function computePlanSha256(plan: DatasetMaintenancePlan): string {\n const body = { ...plan, plan_sha256: '' };\n return sha256Json(body);\n}\n\nexport function parseMaintenancePlan(value: unknown): DatasetMaintenancePlan {\n if (\n !isJsonObject(value) ||\n value.schema_version !== 1 ||\n !Array.isArray(value.actions) ||\n !Array.isArray(value.protected_rows) ||\n !Array.isArray(value.blockers) ||\n !isJsonObject(value.account) ||\n !isJsonObject(value.artifacts)\n ) {\n throw new CliError('Maintenance plan is not a valid schema_version=1 plan.', {\n code: 'DATASET_MAINTENANCE_PLAN_INVALID',\n exitCode: 2,\n });\n }\n const plan = value as DatasetMaintenancePlan;\n if (\n plan.snapshot_completeness !== undefined &&\n !isDatasetMaintenanceSnapshotCompleteness(plan.snapshot_completeness, MAINTENANCE_SCAN_TABLES)\n ) {\n throw new CliError('Maintenance plan snapshot completeness proof is invalid.', {\n code: 'DATASET_MAINTENANCE_PLAN_INVALID',\n exitCode: 2,\n });\n }\n const expected = computePlanSha256(plan);\n if (plan.plan_sha256 !== expected) {\n throw new CliError('Maintenance plan hash does not match its canonical contents.', {\n code: 'DATASET_MAINTENANCE_PLAN_HASH_MISMATCH',\n exitCode: 2,\n details: { expected, received: plan.plan_sha256 },\n });\n }\n\n const normalizedScope = parseMaintenanceScope(\n {\n schema_version: 1,\n task_id: plan.task_id,\n operation: plan.operation,\n account: plan.account,\n ...(plan.source_import_run_id ? { source_import_run_id: plan.source_import_run_id } : {}),\n source_lineage: plan.source_lineage,\n ...(plan.target_mode ? { target_mode: plan.target_mode } : {}),\n ...(plan.alias_batches\n ? {\n alias_batches: plan.alias_batches.map((batch) => ({\n batch_id: batch.batch_id,\n dimension: batch.dimension,\n factor: batch.factor,\n source: batch.source,\n target: batch.target,\n })),\n }\n : {}),\n actions: plan.actions,\n },\n plan.operation,\n );\n const actionIds = new Set<string>();\n const ordinals = new Set<number>();\n for (const [index, action] of plan.actions.entries()) {\n const normalizedAction = normalizedScope.actions[index];\n if (\n !normalizedAction ||\n action.action_id !== normalizedAction.action_id ||\n !Number.isInteger(action.ordinal) ||\n action.ordinal < 0 ||\n ordinals.has(action.ordinal) ||\n !['ready', 'blocked'].includes(action.status) ||\n !Array.isArray(action.blockers) ||\n !isJsonObject(action.rollback)\n ) {\n throw new CliError('Maintenance plan contains an invalid action contract.', {\n code: 'DATASET_MAINTENANCE_PLAN_INVALID',\n exitCode: 2,\n details: { index, action_id: action.action_id },\n });\n }\n actionIds.add(action.action_id);\n ordinals.add(action.ordinal);\n if (action.status === 'ready') {\n const before = action.before;\n if (\n !isJsonObject(before) ||\n before.table !== action.table ||\n before.id !== action.id ||\n before.version !== action.version ||\n before.user_id !== action.expected_user_id ||\n before.state_code !== 0 ||\n !isJsonObject(before.json_ordered) ||\n typeof before.row_sha256 !== 'string' ||\n typeof before.payload_sha256 !== 'string' ||\n action.blockers.length > 0\n ) {\n throw new CliError('Ready maintenance plan action has an invalid before snapshot.', {\n code: 'DATASET_MAINTENANCE_PLAN_INVALID',\n exitCode: 2,\n details: { action_id: action.action_id },\n });\n }\n if (action.action === 'update_json_ordered' && !before.modified_at) {\n throw new CliError('Ready alias action requires a frozen modified_at value.', {\n code: 'DATASET_MAINTENANCE_PLAN_INVALID',\n exitCode: 2,\n details: { action_id: action.action_id },\n });\n }\n const remoteRow: DatasetMaintenanceRemoteRow = {\n table: before.table,\n id: before.id,\n version: before.version,\n user_id: before.user_id,\n state_code: before.state_code,\n modified_at: before.modified_at,\n json_ordered: before.json_ordered,\n model_id: before.model_id,\n rule_verification: before.rule_verification,\n };\n const expectedSnapshot = snapshotRemoteRow(remoteRow);\n if (\n before.row_sha256 !== expectedSnapshot.row_sha256 ||\n before.payload_sha256 !== expectedSnapshot.payload_sha256\n ) {\n throw new CliError('Ready maintenance plan action before snapshot hash is invalid.', {\n code: 'DATASET_MAINTENANCE_PLAN_INVALID',\n exitCode: 2,\n details: { action_id: action.action_id },\n });\n }\n const expectedRollbackStrategy =\n action.action === 'save_draft'\n ? 'save_before_snapshot'\n : action.action === 'delete'\n ? 'restore_deleted_before_snapshot'\n : 'restore_atomic_alias_before_snapshot';\n if (\n action.rollback.strategy !== expectedRollbackStrategy ||\n action.rollback.before_payload_sha256 !== before.payload_sha256 ||\n !isJsonObject(action.rollback.before_payload) ||\n sha256Json(action.rollback.before_payload) !== before.payload_sha256 ||\n action.rollback.model_id !== before.model_id ||\n action.rollback.rule_verification !== before.rule_verification\n ) {\n throw new CliError('Ready maintenance plan action rollback snapshot is invalid.', {\n code: 'DATASET_MAINTENANCE_PLAN_INVALID',\n exitCode: 2,\n details: { action_id: action.action_id },\n });\n }\n }\n if (\n (['save_draft', 'update_json_ordered'].includes(action.action) &&\n action.status === 'ready' &&\n (!isJsonObject(action.desired_payload) ||\n typeof action.desired_payload.path !== 'string' ||\n !/^[a-f0-9]{64}$/u.test(String(action.desired_payload.sha256)))) ||\n (!['save_draft', 'update_json_ordered'].includes(action.action) &&\n action.desired_payload !== null)\n ) {\n throw new CliError('Maintenance plan action desired payload contract is invalid.', {\n code: 'DATASET_MAINTENANCE_PLAN_INVALID',\n exitCode: 2,\n details: { action_id: action.action_id },\n });\n }\n }\n const flattenedBlockers = plan.actions.flatMap((action) => action.blockers);\n const summaryMatches =\n isJsonObject(plan.summary) &&\n plan.summary.actions === plan.actions.length &&\n plan.summary.save_draft ===\n plan.actions.filter((action) => action.action === 'save_draft').length &&\n plan.summary.delete === plan.actions.filter((action) => action.action === 'delete').length &&\n (plan.summary.update_json_ordered ?? 0) ===\n plan.actions.filter((action) => action.action === 'update_json_ordered').length &&\n (plan.summary.atomic_batches ?? 0) === (plan.alias_batches?.length ?? 0) &&\n (plan.summary.scaled_exchanges ?? 0) ===\n (plan.alias_batches?.reduce((sum, batch) => sum + batch.summary.exchanges, 0) ?? 0) &&\n (plan.summary.scaled_amount_fields ?? 0) ===\n (plan.alias_batches?.reduce((sum, batch) => sum + batch.summary.amount_fields, 0) ?? 0) &&\n (plan.summary.unrelated_exchanges_preserved ?? 0) ===\n (plan.alias_batches?.reduce((sum, batch) => sum + batch.summary.unrelated_exchanges, 0) ??\n 0) &&\n plan.summary.protected_rows === plan.protected_rows.length &&\n plan.summary.blockers === plan.blockers.length &&\n Number.isInteger(plan.summary.current_reference_impacts) &&\n plan.summary.current_reference_impacts >= 0 &&\n Number.isInteger(plan.summary.projected_reference_impacts) &&\n plan.summary.projected_reference_impacts >= 0;\n const ready =\n plan.status === 'ready' &&\n plan.blockers.length === 0 &&\n flattenedBlockers.length === 0 &&\n plan.actions.every((action) => action.status === 'ready');\n const blocked =\n plan.status === 'blocked' &&\n plan.blockers.length > 0 &&\n flattenedBlockers.length > 0 &&\n plan.actions.some((action) => action.status === 'blocked');\n if (\n actionIds.size !== plan.actions.length ||\n !summaryMatches ||\n (!ready && !blocked) ||\n sha256Json(plan.blockers) !== sha256Json(flattenedBlockers)\n ) {\n throw new CliError('Maintenance plan status or blocker contract is inconsistent.', {\n code: 'DATASET_MAINTENANCE_PLAN_INVALID',\n exitCode: 2,\n });\n }\n if (plan.operation === 'merge-support-aliases') {\n const batches = plan.alias_batches!;\n const batchActionIds = new Set(batches.flatMap((batch) => batch.action_ids));\n const expectedProfiles = {\n time: {\n factor: '0.00011415525114155251',\n rows: 25,\n flowproperties: 1,\n flows: 10,\n processes: 14,\n exchanges: 20,\n },\n length_time: {\n factor: '1000',\n rows: 27,\n flowproperties: 1,\n flows: 13,\n processes: 13,\n exchanges: 39,\n },\n } as const;\n const validAliasPlan =\n plan.target_mode === 'owner_draft' &&\n batches.length === 2 &&\n plan.artifacts.exchange_rewrite_plan === 'exchange-rewrite-plan.jsonl' &&\n batchActionIds.size === plan.actions.length &&\n batches.reduce((sum, batch) => sum + batch.action_ids.length, 0) === plan.actions.length &&\n batches.reduce((sum, batch) => sum + batch.summary.unrelated_exchanges, 0) === 309 &&\n plan.actions.every(\n (action) =>\n action.action === 'update_json_ordered' &&\n action.batch_id &&\n isJsonObject(action.alias_mutation) &&\n batches.some(\n (batch) =>\n batch.batch_id === action.batch_id && batch.action_ids.includes(action.action_id),\n ),\n ) &&\n batches.every((batch) => {\n const profile = expectedProfiles[batch.dimension];\n const actions = plan.actions.filter((action) => action.batch_id === batch.batch_id);\n const counts = {\n flowproperties: actions.filter((action) => action.table === 'flowproperties').length,\n flows: actions.filter((action) => action.table === 'flows').length,\n processes: actions.filter((action) => action.table === 'processes').length,\n };\n const targetSnapshots = [\n batch.target_snapshots.unitgroup,\n batch.target_snapshots.flowproperty,\n ];\n const sourceSnapshot = batch.target_snapshots.source_unitgroup;\n const supportPayloadsValid = (\n [\n {\n snapshot: batch.target_snapshots.unitgroup,\n table: 'unitgroups' as const,\n id: batch.target.unitgroup.id,\n version: batch.target.unitgroup.version,\n },\n {\n snapshot: batch.target_snapshots.flowproperty,\n table: 'flowproperties' as const,\n id: batch.target.flowproperty.id,\n version: batch.target.flowproperty.version,\n },\n {\n snapshot: sourceSnapshot,\n table: 'unitgroups' as const,\n id: batch.source.unitgroup.id,\n version: batch.source.unitgroup.version,\n },\n ] as const\n ).every((entry) => {\n if (!entry.snapshot?.json_ordered) return plan.status === 'blocked';\n const inspection = inspectMaintenanceSupportPayload({\n table: entry.table,\n payload: entry.snapshot.json_ordered,\n });\n return (\n inspection.identity.id === entry.id && inspection.identity.version === entry.version\n );\n });\n const snapshotsValid = (snapshots: DatasetMaintenanceRowSnapshot[]): boolean =>\n snapshots.every((snapshot) => {\n const remoteRow: DatasetMaintenanceRemoteRow = {\n table: snapshot.table,\n id: snapshot.id,\n version: snapshot.version,\n user_id: snapshot.user_id,\n state_code: snapshot.state_code,\n modified_at: snapshot.modified_at,\n json_ordered: snapshot.json_ordered,\n model_id: snapshot.model_id,\n rule_verification: snapshot.rule_verification,\n };\n const expectedSnapshot = snapshotRemoteRow(remoteRow);\n return (\n snapshot.row_sha256 === expectedSnapshot.row_sha256 &&\n snapshot.payload_sha256 === expectedSnapshot.payload_sha256\n );\n });\n const snapshotIdentityMatches = Boolean(\n batch.target_snapshots.unitgroup?.table === 'unitgroups' &&\n batch.target_snapshots.unitgroup.id === batch.target.unitgroup.id &&\n batch.target_snapshots.unitgroup.version === batch.target.unitgroup.version &&\n batch.target_snapshots.flowproperty?.table === 'flowproperties' &&\n batch.target_snapshots.flowproperty.id === batch.target.flowproperty.id &&\n batch.target_snapshots.flowproperty.version === batch.target.flowproperty.version &&\n sourceSnapshot?.table === 'unitgroups' &&\n sourceSnapshot.id === batch.source.unitgroup.id &&\n sourceSnapshot.version === batch.source.unitgroup.version,\n );\n const mutationsValid = actions.every((action) => {\n const mutation = action.alias_mutation!;\n if (action.table === 'flowproperties') {\n return (\n mutation.kind === 'flowproperty_unitgroup_reference' &&\n action.id === batch.source.flowproperty.id &&\n action.version === batch.source.flowproperty.version\n );\n }\n if (action.table === 'flows') {\n return (\n mutation.kind === 'flow_flowproperty_reference' &&\n mutation.flow_property_internal_id === '1' &&\n mutation.source_flowproperty_id === batch.source.flowproperty.id &&\n mutation.source_flowproperty_version === batch.source.flowproperty.version\n );\n }\n return (\n mutation.kind === 'process_exchange_amounts' &&\n sha256Json(mutation.exchanges) ===\n sha256Json(\n action.exchange_instances!.map((instance) => ({\n index: instance.exchange_index,\n internal_id: instance.data_set_internal_id,\n flow_id: instance.flow_id,\n flow_version: instance.flow_version,\n direction: instance.direction,\n before_exchange_sha256: instance.before_exchange_sha256,\n })),\n )\n );\n });\n const exchangeRewritesValid = batch.exchange_rewrites.every((rewrite) => {\n const action = actions.find((entry) => entry.action_id === rewrite.action_id);\n const instance = action?.exchange_instances?.find(\n (entry) =>\n entry.exchange_index === rewrite.exchange_index &&\n entry.data_set_internal_id === rewrite.data_set_internal_id &&\n entry.flow_id === rewrite.flow_id &&\n entry.flow_version === rewrite.flow_version,\n );\n return Boolean(\n action?.table === 'processes' &&\n instance &&\n rewrite.process_id === action.id &&\n rewrite.process_version === action.version &&\n rewrite.direction === instance.direction &&\n rewrite.before_exchange_sha256 === instance.before_exchange_sha256 &&\n /^[a-f0-9]{64}$/u.test(rewrite.after_exchange_sha256),\n );\n });\n return (\n profile !== undefined &&\n batch.factor === profile.factor &&\n batch.summary.rows === profile.rows &&\n counts.flowproperties === profile.flowproperties &&\n counts.flows === profile.flows &&\n counts.processes === profile.processes &&\n batch.summary.flowproperties === counts.flowproperties &&\n batch.summary.flows === counts.flows &&\n batch.summary.processes === counts.processes &&\n batch.summary.exchanges === profile.exchanges &&\n batch.postconditions.source_unitgroup_incoming_refs === 0 &&\n batch.postconditions.source_flowproperty_flow_refs === 0 &&\n batch.postconditions.target_flow_refs === (batch.dimension === 'time' ? 106 : 32) &&\n batch.postconditions.target_exchange_refs === (batch.dimension === 'time' ? 441 : 3216) &&\n batch.summary.rows === batch.action_ids.length &&\n batch.summary.amount_fields === batch.summary.exchanges * 2 &&\n batch.exchange_rewrites.length === batch.summary.exchanges &&\n snapshotIdentityMatches &&\n supportPayloadsValid &&\n mutationsValid &&\n exchangeRewritesValid &&\n (plan.status === 'blocked' ||\n (targetSnapshots.every(\n (snapshot) =>\n snapshot?.state_code === 0 &&\n snapshot.user_id === plan.account.user_id &&\n Boolean(snapshot.modified_at),\n ) &&\n sourceSnapshot?.state_code === 0 &&\n Boolean(sourceSnapshot.modified_at) &&\n sourceSnapshot.user_id === plan.account.user_id &&\n snapshotsValid([\n ...(targetSnapshots.filter(Boolean) as DatasetMaintenanceRowSnapshot[]),\n sourceSnapshot,\n ]) &&\n batch.conversion_evidence.source_unitgroup_payload_sha256 ===\n sourceSnapshot.payload_sha256 &&\n isJsonObject(batch.conversion_evidence.source_reference_unit) &&\n isJsonObject(batch.conversion_evidence.target_conversion_unit)))\n );\n });\n if (!validAliasPlan) {\n throw new CliError('Maintenance alias plan contract is inconsistent.', {\n code: 'DATASET_MAINTENANCE_PLAN_INVALID',\n exitCode: 2,\n });\n }\n }\n return plan;\n}\n"]}
@@ -0,0 +1,270 @@
1
+ import { CliError } from './errors.js';
2
+ function isRecord(value) {
3
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
4
+ }
5
+ function isIntegerBetween(value, minimum, maximum) {
6
+ return Number.isInteger(value) && Number(value) >= minimum && Number(value) <= maximum;
7
+ }
8
+ export function isDatasetMaintenanceSnapshotCompleteness(value, expectedTables) {
9
+ if (!isRecord(value))
10
+ return false;
11
+ if (value.status !== 'complete' ||
12
+ value.complete !== true ||
13
+ value.strategy !== 'postgrest_exact_count_multi_request' ||
14
+ !isIntegerBetween(value.requested_page_size, 1, 5_000) ||
15
+ !isIntegerBetween(value.page_count, expectedTables.length, Number.MAX_SAFE_INTEGER) ||
16
+ !isIntegerBetween(value.row_count, 0, Number.MAX_SAFE_INTEGER)) {
17
+ return false;
18
+ }
19
+ const entityCounts = value.entity_counts;
20
+ if (!isRecord(entityCounts))
21
+ return false;
22
+ const expectedTableSet = new Set(expectedTables);
23
+ const entityCountKeys = Object.keys(entityCounts);
24
+ if (entityCountKeys.length !== expectedTables.length ||
25
+ entityCountKeys.some((table) => !expectedTableSet.has(table))) {
26
+ return false;
27
+ }
28
+ for (const table of expectedTables) {
29
+ if (!isIntegerBetween(entityCounts[table], 0, Number.MAX_SAFE_INTEGER)) {
30
+ return false;
31
+ }
32
+ }
33
+ if (!Array.isArray(value.tables) || value.tables.length !== expectedTables.length)
34
+ return false;
35
+ const observedTables = new Set();
36
+ let pageCount = 0;
37
+ let rowCount = 0;
38
+ for (const rawTable of value.tables) {
39
+ if (!isRecord(rawTable))
40
+ return false;
41
+ const table = rawTable.table;
42
+ if (typeof table !== 'string' || !expectedTableSet.has(table) || observedTables.has(table)) {
43
+ return false;
44
+ }
45
+ if (rawTable.status !== 'complete' ||
46
+ rawTable.complete !== true ||
47
+ rawTable.strategy !== 'postgrest_exact_count' ||
48
+ rawTable.requested_page_size !== value.requested_page_size ||
49
+ !isIntegerBetween(rawTable.effective_page_size, 0, value.requested_page_size) ||
50
+ !isIntegerBetween(rawTable.pages_fetched, 1, Number.MAX_SAFE_INTEGER) ||
51
+ !isIntegerBetween(rawTable.rows_fetched, 0, Number.MAX_SAFE_INTEGER) ||
52
+ rawTable.exact_total !== rawTable.rows_fetched ||
53
+ (rawTable.rows_fetched === 0) !== (rawTable.effective_page_size === 0) ||
54
+ (rawTable.rows_fetched === 0
55
+ ? rawTable.pages_fetched !== 1
56
+ : rawTable.pages_fetched > rawTable.rows_fetched ||
57
+ rawTable.effective_page_size > rawTable.rows_fetched - rawTable.pages_fetched + 1 ||
58
+ rawTable.rows_fetched > rawTable.pages_fetched * rawTable.effective_page_size) ||
59
+ rawTable.termination_reason !== 'content_range_total_reached' ||
60
+ rawTable.content_range_verified !== true ||
61
+ rawTable.ordering_verified !== true ||
62
+ rawTable.duplicate_count !== 0 ||
63
+ rawTable.rows_fetched !== entityCounts[table]) {
64
+ return false;
65
+ }
66
+ observedTables.add(table);
67
+ pageCount += rawTable.pages_fetched;
68
+ rowCount += rawTable.rows_fetched;
69
+ }
70
+ return pageCount === value.page_count && rowCount === value.row_count;
71
+ }
72
+ export function isSnapshotCompletenessCompatible(value, baseline, expectedTables) {
73
+ if (value === undefined)
74
+ return baseline === undefined;
75
+ if (!isDatasetMaintenanceSnapshotCompleteness(value, expectedTables))
76
+ return false;
77
+ if (baseline === undefined)
78
+ return true;
79
+ return (value.row_count === baseline.row_count &&
80
+ expectedTables.every((table) => value.entity_counts[table] === baseline.entity_counts[table]));
81
+ }
82
+ function incomplete(details) {
83
+ throw new CliError('PostgREST pagination could not prove a complete maintenance snapshot.', {
84
+ code: 'DATASET_MAINTENANCE_SNAPSHOT_INCOMPLETE',
85
+ exitCode: 1,
86
+ details,
87
+ });
88
+ }
89
+ export function parseExactContentRange(value, details = {}) {
90
+ const match = value?.trim().match(/^(?:items\s+)?(?:(\d+)-(\d+)|\*)\/(\d+)$/iu);
91
+ if (!match) {
92
+ return incomplete({
93
+ ...details,
94
+ reason: 'content_range_missing_or_invalid',
95
+ content_range: value,
96
+ });
97
+ }
98
+ const start = match[1] === undefined ? null : Number.parseInt(match[1], 10);
99
+ const end = match[2] === undefined ? null : Number.parseInt(match[2], 10);
100
+ const total = Number.parseInt(match[3], 10);
101
+ if (!Number.isSafeInteger(total) ||
102
+ (start !== null &&
103
+ (end === null || !Number.isSafeInteger(start) || !Number.isSafeInteger(end))) ||
104
+ (start !== null && end < start)) {
105
+ return incomplete({ ...details, reason: 'content_range_out_of_bounds', content_range: value });
106
+ }
107
+ return { start, end, total };
108
+ }
109
+ export async function fetchCompletePostgrestPages(options) {
110
+ const rows = [];
111
+ const sourceUrls = [];
112
+ let expectedTotal = null;
113
+ let offset = 0;
114
+ let pagesFetched = 0;
115
+ let effectivePageSize = 0;
116
+ let previousIdentity = null;
117
+ while (true) {
118
+ const page = await options.fetchPage(offset);
119
+ pagesFetched += 1;
120
+ sourceUrls.push(page.source_url);
121
+ effectivePageSize = Math.max(effectivePageSize, page.rows.length);
122
+ const range = parseExactContentRange(page.content_range, {
123
+ table: options.table,
124
+ offset,
125
+ source_url: page.source_url,
126
+ });
127
+ if (expectedTotal === null) {
128
+ expectedTotal = range.total;
129
+ }
130
+ else if (range.total !== expectedTotal) {
131
+ return incomplete({
132
+ table: options.table,
133
+ offset,
134
+ source_url: page.source_url,
135
+ reason: 'exact_total_changed_between_pages',
136
+ expected_total: expectedTotal,
137
+ observed_total: range.total,
138
+ });
139
+ }
140
+ if (page.rows.length === 0) {
141
+ if (range.start !== null || offset !== 0 || range.total !== 0) {
142
+ return incomplete({
143
+ table: options.table,
144
+ offset,
145
+ source_url: page.source_url,
146
+ reason: 'empty_page_before_exact_total',
147
+ expected_total: expectedTotal,
148
+ content_range: page.content_range,
149
+ });
150
+ }
151
+ return {
152
+ rows,
153
+ source_urls: sourceUrls,
154
+ completeness: {
155
+ status: 'complete',
156
+ complete: true,
157
+ strategy: 'postgrest_exact_count',
158
+ requested_page_size: options.requestedPageSize,
159
+ effective_page_size: effectivePageSize,
160
+ pages_fetched: pagesFetched,
161
+ rows_fetched: 0,
162
+ exact_total: 0,
163
+ termination_reason: 'content_range_total_reached',
164
+ content_range_verified: true,
165
+ ordering_verified: true,
166
+ duplicate_count: 0,
167
+ },
168
+ };
169
+ }
170
+ if (page.rows.length > options.requestedPageSize ||
171
+ range.start !== offset ||
172
+ range.end !== offset + page.rows.length - 1) {
173
+ return incomplete({
174
+ table: options.table,
175
+ offset,
176
+ source_url: page.source_url,
177
+ reason: 'content_range_does_not_match_page',
178
+ requested_page_size: options.requestedPageSize,
179
+ returned_rows: page.rows.length,
180
+ content_range: page.content_range,
181
+ });
182
+ }
183
+ for (const row of page.rows) {
184
+ const identity = options.rowIdentity(row);
185
+ if (!identity) {
186
+ return incomplete({
187
+ table: options.table,
188
+ offset,
189
+ source_url: page.source_url,
190
+ reason: 'row_identity_missing',
191
+ });
192
+ }
193
+ if (previousIdentity !== null && identity <= previousIdentity) {
194
+ return incomplete({
195
+ table: options.table,
196
+ offset,
197
+ source_url: page.source_url,
198
+ reason: identity === previousIdentity ? 'duplicate_row_identity' : 'row_order_not_strict',
199
+ previous_identity: previousIdentity,
200
+ observed_identity: identity,
201
+ });
202
+ }
203
+ previousIdentity = identity;
204
+ }
205
+ rows.push(...page.rows);
206
+ const nextOffset = offset + page.rows.length;
207
+ if (nextOffset > expectedTotal) {
208
+ return incomplete({
209
+ table: options.table,
210
+ offset,
211
+ source_url: page.source_url,
212
+ reason: 'rows_exceed_exact_total',
213
+ expected_total: expectedTotal,
214
+ rows_fetched: nextOffset,
215
+ });
216
+ }
217
+ if (nextOffset === expectedTotal) {
218
+ return {
219
+ rows,
220
+ source_urls: sourceUrls,
221
+ completeness: {
222
+ status: 'complete',
223
+ complete: true,
224
+ strategy: 'postgrest_exact_count',
225
+ requested_page_size: options.requestedPageSize,
226
+ effective_page_size: effectivePageSize,
227
+ pages_fetched: pagesFetched,
228
+ rows_fetched: rows.length,
229
+ exact_total: expectedTotal,
230
+ termination_reason: 'content_range_total_reached',
231
+ content_range_verified: true,
232
+ ordering_verified: true,
233
+ duplicate_count: 0,
234
+ },
235
+ };
236
+ }
237
+ offset = nextOffset;
238
+ }
239
+ }
240
+ export function buildSnapshotCompleteness(options) {
241
+ const expectedTables = new Set(options.tables);
242
+ const observedTables = new Set(options.results.map((result) => result.table));
243
+ if (options.results.length !== options.tables.length ||
244
+ observedTables.size !== expectedTables.size ||
245
+ [...observedTables].some((table) => !expectedTables.has(table))) {
246
+ return incomplete({
247
+ reason: 'aggregate_table_set_invalid',
248
+ expected_tables: [...options.tables],
249
+ observed_tables: options.results.map((result) => result.table),
250
+ });
251
+ }
252
+ const entityCounts = Object.fromEntries(options.tables.map((table) => [
253
+ table,
254
+ options.results.find((result) => result.table === table).completeness.rows_fetched,
255
+ ]));
256
+ return {
257
+ status: 'complete',
258
+ complete: true,
259
+ strategy: 'postgrest_exact_count_multi_request',
260
+ requested_page_size: options.requestedPageSize,
261
+ page_count: options.results.reduce((sum, result) => sum + result.completeness.pages_fetched, 0),
262
+ row_count: options.results.reduce((sum, result) => sum + result.completeness.rows_fetched, 0),
263
+ entity_counts: entityCounts,
264
+ tables: options.results.map((result) => ({
265
+ table: result.table,
266
+ ...result.completeness,
267
+ })),
268
+ };
269
+ }
270
+ //# sourceMappingURL=dataset-maintenance-pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset-maintenance-pagination.js","sourceRoot":"","sources":["../../../src/lib/dataset-maintenance-pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\n\nexport type DatasetMaintenanceTableCompleteness = {\n status: 'complete';\n complete: true;\n strategy: 'postgrest_exact_count';\n requested_page_size: number;\n effective_page_size: number;\n pages_fetched: number;\n rows_fetched: number;\n exact_total: number;\n termination_reason: 'content_range_total_reached';\n content_range_verified: true;\n ordering_verified: true;\n duplicate_count: 0;\n};\n\nexport type DatasetMaintenanceSnapshotCompleteness<Table extends string = string> = {\n status: 'complete';\n complete: true;\n strategy: 'postgrest_exact_count_multi_request';\n requested_page_size: number;\n page_count: number;\n row_count: number;\n entity_counts: Record<Table, number>;\n tables: Array<{ table: Table } & DatasetMaintenanceTableCompleteness>;\n};\n\nexport type DatasetMaintenancePage<T> = {\n rows: T[];\n source_url: string;\n content_range: string | null;\n};\n\ntype ParsedContentRange = {\n start: number | null;\n end: number | null;\n total: number;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isIntegerBetween(value: unknown, minimum: number, maximum: number): value is number {\n return Number.isInteger(value) && Number(value) >= minimum && Number(value) <= maximum;\n}\n\nexport function isDatasetMaintenanceSnapshotCompleteness<Table extends string>(\n value: unknown,\n expectedTables: readonly Table[],\n): value is DatasetMaintenanceSnapshotCompleteness<Table> {\n if (!isRecord(value)) return false;\n if (\n value.status !== 'complete' ||\n value.complete !== true ||\n value.strategy !== 'postgrest_exact_count_multi_request' ||\n !isIntegerBetween(value.requested_page_size, 1, 5_000) ||\n !isIntegerBetween(value.page_count, expectedTables.length, Number.MAX_SAFE_INTEGER) ||\n !isIntegerBetween(value.row_count, 0, Number.MAX_SAFE_INTEGER)\n ) {\n return false;\n }\n\n const entityCounts = value.entity_counts;\n if (!isRecord(entityCounts)) return false;\n const expectedTableSet = new Set<string>(expectedTables);\n const entityCountKeys = Object.keys(entityCounts);\n if (\n entityCountKeys.length !== expectedTables.length ||\n entityCountKeys.some((table) => !expectedTableSet.has(table))\n ) {\n return false;\n }\n for (const table of expectedTables) {\n if (!isIntegerBetween(entityCounts[table], 0, Number.MAX_SAFE_INTEGER)) {\n return false;\n }\n }\n\n if (!Array.isArray(value.tables) || value.tables.length !== expectedTables.length) return false;\n const observedTables = new Set<string>();\n let pageCount = 0;\n let rowCount = 0;\n for (const rawTable of value.tables) {\n if (!isRecord(rawTable)) return false;\n const table = rawTable.table;\n if (typeof table !== 'string' || !expectedTableSet.has(table) || observedTables.has(table)) {\n return false;\n }\n if (\n rawTable.status !== 'complete' ||\n rawTable.complete !== true ||\n rawTable.strategy !== 'postgrest_exact_count' ||\n rawTable.requested_page_size !== value.requested_page_size ||\n !isIntegerBetween(rawTable.effective_page_size, 0, value.requested_page_size) ||\n !isIntegerBetween(rawTable.pages_fetched, 1, Number.MAX_SAFE_INTEGER) ||\n !isIntegerBetween(rawTable.rows_fetched, 0, Number.MAX_SAFE_INTEGER) ||\n rawTable.exact_total !== rawTable.rows_fetched ||\n (rawTable.rows_fetched === 0) !== (rawTable.effective_page_size === 0) ||\n (rawTable.rows_fetched === 0\n ? rawTable.pages_fetched !== 1\n : rawTable.pages_fetched > rawTable.rows_fetched ||\n rawTable.effective_page_size > rawTable.rows_fetched - rawTable.pages_fetched + 1 ||\n rawTable.rows_fetched > rawTable.pages_fetched * rawTable.effective_page_size) ||\n rawTable.termination_reason !== 'content_range_total_reached' ||\n rawTable.content_range_verified !== true ||\n rawTable.ordering_verified !== true ||\n rawTable.duplicate_count !== 0 ||\n rawTable.rows_fetched !== entityCounts[table]\n ) {\n return false;\n }\n observedTables.add(table);\n pageCount += rawTable.pages_fetched;\n rowCount += rawTable.rows_fetched;\n }\n\n return pageCount === value.page_count && rowCount === value.row_count;\n}\n\nexport function isSnapshotCompletenessCompatible<Table extends string>(\n value: unknown,\n baseline: DatasetMaintenanceSnapshotCompleteness<Table> | undefined,\n expectedTables: readonly Table[],\n): boolean {\n if (value === undefined) return baseline === undefined;\n if (!isDatasetMaintenanceSnapshotCompleteness(value, expectedTables)) return false;\n if (baseline === undefined) return true;\n return (\n value.row_count === baseline.row_count &&\n expectedTables.every((table) => value.entity_counts[table] === baseline.entity_counts[table])\n );\n}\n\nfunction incomplete(details: Record<string, unknown>): never {\n throw new CliError('PostgREST pagination could not prove a complete maintenance snapshot.', {\n code: 'DATASET_MAINTENANCE_SNAPSHOT_INCOMPLETE',\n exitCode: 1,\n details,\n });\n}\n\nexport function parseExactContentRange(\n value: string | null,\n details: Record<string, unknown> = {},\n): ParsedContentRange {\n const match = value?.trim().match(/^(?:items\\s+)?(?:(\\d+)-(\\d+)|\\*)\\/(\\d+)$/iu);\n if (!match) {\n return incomplete({\n ...details,\n reason: 'content_range_missing_or_invalid',\n content_range: value,\n });\n }\n const start = match[1] === undefined ? null : Number.parseInt(match[1], 10);\n const end = match[2] === undefined ? null : Number.parseInt(match[2], 10);\n const total = Number.parseInt(match[3]!, 10);\n if (\n !Number.isSafeInteger(total) ||\n (start !== null &&\n (end === null || !Number.isSafeInteger(start) || !Number.isSafeInteger(end))) ||\n (start !== null && end! < start)\n ) {\n return incomplete({ ...details, reason: 'content_range_out_of_bounds', content_range: value });\n }\n return { start, end, total };\n}\n\nexport async function fetchCompletePostgrestPages<T>(options: {\n table: string;\n requestedPageSize: number;\n fetchPage: (offset: number) => Promise<DatasetMaintenancePage<T>>;\n rowIdentity: (row: T) => string | null;\n}): Promise<{\n rows: T[];\n source_urls: string[];\n completeness: DatasetMaintenanceTableCompleteness;\n}> {\n const rows: T[] = [];\n const sourceUrls: string[] = [];\n let expectedTotal: number | null = null;\n let offset = 0;\n let pagesFetched = 0;\n let effectivePageSize = 0;\n let previousIdentity: string | null = null;\n\n while (true) {\n const page = await options.fetchPage(offset);\n pagesFetched += 1;\n sourceUrls.push(page.source_url);\n effectivePageSize = Math.max(effectivePageSize, page.rows.length);\n const range = parseExactContentRange(page.content_range, {\n table: options.table,\n offset,\n source_url: page.source_url,\n });\n if (expectedTotal === null) {\n expectedTotal = range.total;\n } else if (range.total !== expectedTotal) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'exact_total_changed_between_pages',\n expected_total: expectedTotal,\n observed_total: range.total,\n });\n }\n\n if (page.rows.length === 0) {\n if (range.start !== null || offset !== 0 || range.total !== 0) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'empty_page_before_exact_total',\n expected_total: expectedTotal,\n content_range: page.content_range,\n });\n }\n return {\n rows,\n source_urls: sourceUrls,\n completeness: {\n status: 'complete',\n complete: true,\n strategy: 'postgrest_exact_count',\n requested_page_size: options.requestedPageSize,\n effective_page_size: effectivePageSize,\n pages_fetched: pagesFetched,\n rows_fetched: 0,\n exact_total: 0,\n termination_reason: 'content_range_total_reached',\n content_range_verified: true,\n ordering_verified: true,\n duplicate_count: 0,\n },\n };\n }\n\n if (\n page.rows.length > options.requestedPageSize ||\n range.start !== offset ||\n range.end !== offset + page.rows.length - 1\n ) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'content_range_does_not_match_page',\n requested_page_size: options.requestedPageSize,\n returned_rows: page.rows.length,\n content_range: page.content_range,\n });\n }\n\n for (const row of page.rows) {\n const identity = options.rowIdentity(row);\n if (!identity) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'row_identity_missing',\n });\n }\n if (previousIdentity !== null && identity <= previousIdentity) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: identity === previousIdentity ? 'duplicate_row_identity' : 'row_order_not_strict',\n previous_identity: previousIdentity,\n observed_identity: identity,\n });\n }\n previousIdentity = identity;\n }\n\n rows.push(...page.rows);\n const nextOffset = offset + page.rows.length;\n if (nextOffset > expectedTotal) {\n return incomplete({\n table: options.table,\n offset,\n source_url: page.source_url,\n reason: 'rows_exceed_exact_total',\n expected_total: expectedTotal,\n rows_fetched: nextOffset,\n });\n }\n if (nextOffset === expectedTotal) {\n return {\n rows,\n source_urls: sourceUrls,\n completeness: {\n status: 'complete',\n complete: true,\n strategy: 'postgrest_exact_count',\n requested_page_size: options.requestedPageSize,\n effective_page_size: effectivePageSize,\n pages_fetched: pagesFetched,\n rows_fetched: rows.length,\n exact_total: expectedTotal,\n termination_reason: 'content_range_total_reached',\n content_range_verified: true,\n ordering_verified: true,\n duplicate_count: 0,\n },\n };\n }\n offset = nextOffset;\n }\n}\n\nexport function buildSnapshotCompleteness<Table extends string>(options: {\n tables: readonly Table[];\n requestedPageSize: number;\n results: Array<{ table: Table; completeness: DatasetMaintenanceTableCompleteness }>;\n}): DatasetMaintenanceSnapshotCompleteness<Table> {\n const expectedTables = new Set(options.tables);\n const observedTables = new Set(options.results.map((result) => result.table));\n if (\n options.results.length !== options.tables.length ||\n observedTables.size !== expectedTables.size ||\n [...observedTables].some((table) => !expectedTables.has(table))\n ) {\n return incomplete({\n reason: 'aggregate_table_set_invalid',\n expected_tables: [...options.tables],\n observed_tables: options.results.map((result) => result.table),\n });\n }\n const entityCounts = Object.fromEntries(\n options.tables.map((table) => [\n table,\n options.results.find((result) => result.table === table)!.completeness.rows_fetched,\n ]),\n ) as Record<Table, number>;\n return {\n status: 'complete',\n complete: true,\n strategy: 'postgrest_exact_count_multi_request',\n requested_page_size: options.requestedPageSize,\n page_count: options.results.reduce((sum, result) => sum + result.completeness.pages_fetched, 0),\n row_count: options.results.reduce((sum, result) => sum + result.completeness.rows_fetched, 0),\n entity_counts: entityCounts,\n tables: options.results.map((result) => ({\n table: result.table,\n ...result.completeness,\n })),\n };\n}\n"]}