@tiangong-lca/cli 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -2
- package/dist/src/cli.js +1327 -40
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-author.js +100 -0
- package/dist/src/lib/dataset-author.js.map +1 -0
- package/dist/src/lib/dataset-bilingual.js +545 -0
- package/dist/src/lib/dataset-bilingual.js.map +1 -0
- package/dist/src/lib/dataset-contract.js +350 -0
- package/dist/src/lib/dataset-contract.js.map +1 -0
- package/dist/src/lib/dataset-evidence-search.js +636 -0
- package/dist/src/lib/dataset-evidence-search.js.map +1 -0
- package/dist/src/lib/dataset-import-lca.js +171 -0
- package/dist/src/lib/dataset-import-lca.js.map +1 -0
- package/dist/src/lib/dataset-remote-refresh.js +166 -0
- package/dist/src/lib/dataset-remote-refresh.js.map +1 -0
- package/dist/src/lib/dataset-remote-verify.js +543 -0
- package/dist/src/lib/dataset-remote-verify.js.map +1 -0
- package/dist/src/lib/dataset-validate.js +63 -7
- package/dist/src/lib/dataset-validate.js.map +1 -1
- package/dist/src/lib/flow-payload-validation.js +51 -0
- package/dist/src/lib/flow-payload-validation.js.map +1 -0
- package/dist/src/lib/flow-publish-reviewed-data.js +16 -0
- package/dist/src/lib/flow-publish-reviewed-data.js.map +1 -1
- package/dist/src/lib/flow-publish-version.js +182 -12
- package/dist/src/lib/flow-publish-version.js.map +1 -1
- package/dist/src/lib/identity-preflight.js +1021 -0
- package/dist/src/lib/identity-preflight.js.map +1 -0
- package/dist/src/lib/process-auto-build.js +147 -0
- package/dist/src/lib/process-auto-build.js.map +1 -1
- package/dist/src/lib/process-dedup-review.js +51 -0
- package/dist/src/lib/process-dedup-review.js.map +1 -1
- package/dist/src/lib/process-flow-build-plan.js +1071 -0
- package/dist/src/lib/process-flow-build-plan.js.map +1 -0
- package/dist/src/lib/process-payload-validation.js +14 -7
- package/dist/src/lib/process-payload-validation.js.map +1 -1
- package/dist/src/lib/process-publish-build.js +122 -4
- package/dist/src/lib/process-publish-build.js.map +1 -1
- package/dist/src/lib/process-refresh-references.js +19 -10
- package/dist/src/lib/process-refresh-references.js.map +1 -1
- package/dist/src/lib/process-required-fields.js +810 -0
- package/dist/src/lib/process-required-fields.js.map +1 -0
- package/dist/src/lib/process-save-draft-run.js +4 -1
- package/dist/src/lib/process-save-draft-run.js.map +1 -1
- package/dist/src/lib/publish.js +100 -0
- package/dist/src/lib/publish.js.map +1 -1
- package/dist/src/lib/review-flow.js +58 -0
- package/dist/src/lib/review-flow.js.map +1 -1
- package/dist/src/lib/review-process.js +150 -2
- package/dist/src/lib/review-process.js.map +1 -1
- package/dist/src/lib/runtime-rulesets.js +283 -0
- package/dist/src/lib/runtime-rulesets.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-required-fields.js","sourceRoot":"","sources":["../../../src/lib/process-required-fields.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 {\n cloneJson,\n datasetRoot,\n firstNonEmpty,\n isRecord,\n materializeDatasetRows,\n type DatasetRowInput,\n type JsonObject,\n} from './dataset-local.js';\n\nconst ANNUAL_SUPPLY_FIELD =\n 'processDataSet.modellingAndValidation.dataSourcesTreatmentAndRepresentativeness.annualSupplyOrProductionVolume';\nconst ANNUAL_SUPPLY_ROOT_FIELD =\n 'modellingAndValidation.dataSourcesTreatmentAndRepresentativeness.annualSupplyOrProductionVolume';\nconst NUMERIC_TEXT_WITH_SUFFIX_PATTERN = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([Ee][+-]?\\d+)?\\s+\\S.*$/u;\nconst ANNUAL_PERIOD_PATTERN =\n /(?:\\/\\s*(?:year|yr|a)\\b|\\bper\\s+(?:year|annum)\\b|\\/\\s*年|每年|年度|年供应|年产)/iu;\nconst CJK_TEXT_PATTERN = /[\\p{Script=Han}]/u;\nconst NET_CALORIFIC_VALUE_ID = '93a60a56-a3c8-11da-a746-0800200c9a66';\nconst DEFAULT_COMPLIANCE_SYSTEM = {\n '@refObjectId': 'c84c4185-d1b0-44fc-823e-d2ec630c7906',\n '@type': 'source data set',\n '@uri': 'https://tiangong.earth/datasets/c84c4185-d1b0-44fc-823e-d2ec630c7906',\n '@version': '00.00.001',\n 'common:shortDescription': {\n '@xml:lang': 'en',\n '#text': 'Environmental Footprint (EF) 3.1',\n },\n} as const;\nconst DEFAULT_COMPLIANCE_DECLARATION = {\n 'common:referenceToComplianceSystem': DEFAULT_COMPLIANCE_SYSTEM,\n 'common:approvalOfOverallCompliance': 'Not defined',\n 'common:nomenclatureCompliance': 'Not defined',\n 'common:methodologicalCompliance': 'Not defined',\n 'common:reviewCompliance': 'Not defined',\n 'common:documentationCompliance': 'Not defined',\n 'common:qualityCompliance': 'Not defined',\n} as const;\nconst REQUIRED_COMPLIANCE_FIELDS = [\n 'common:approvalOfOverallCompliance',\n 'common:nomenclatureCompliance',\n 'common:methodologicalCompliance',\n 'common:reviewCompliance',\n 'common:documentationCompliance',\n 'common:qualityCompliance',\n] as const;\n\ntype AnnualSupplyStatus = 'existing' | 'completed' | 'blocked' | 'skipped';\n\nexport type ProcessRequiredFieldIssue = {\n code: string;\n message: string;\n path: string;\n};\n\nexport type ProcessRequiredFieldCompletion = {\n field_path: string;\n source: 'existing' | 'evidence' | 'placeholder_repair' | 'required_structure_repair';\n value: Array<{ '#text': string; '@xml:lang': string }>;\n amount: string | null;\n unit: string | null;\n reference_exchange_internal_id: string | null;\n basis: string;\n};\n\nexport type ProcessRequiredFieldsRowReport = {\n index: number;\n id: string | null;\n version: string | null;\n type: string | null;\n status: AnnualSupplyStatus;\n issues: ProcessRequiredFieldIssue[];\n completions: ProcessRequiredFieldCompletion[];\n};\n\nexport type ProcessRequiredFieldsReport = {\n generated_at_utc: string;\n input_path: string;\n out_path: string;\n out_dir: string | null;\n status: 'completed' | 'completed_with_blockers';\n default_unit: string;\n counts: {\n total: number;\n processes: number;\n completed: number;\n existing: number;\n blocked: number;\n skipped: number;\n };\n files: {\n output_rows: string;\n report: string | null;\n evidence: string | null;\n };\n rows: ProcessRequiredFieldsRowReport[];\n};\n\nexport type RunProcessRequiredFieldsCompleteOptions = {\n inputPath: string;\n outPath: string;\n outDir?: string | null;\n defaultUnit?: string | null;\n flowInputPath?: string | null;\n rawInput?: unknown;\n rawFlowInput?: unknown;\n now?: Date;\n};\n\ntype CompletionContext = {\n defaultUnit: string;\n flowUnitById?: Map<string, string>;\n};\n\ntype AnnualSupplyEvidenceValue = {\n value: Array<{ '#text': string; '@xml:lang': string }>;\n amount: string;\n unit: string;\n basis: string;\n};\n\nfunction normalizeUnit(value: string | null | undefined): string {\n const token = value?.trim();\n return token || 'unit';\n}\n\nfunction sourceLanguageForText(value: string, fallback = 'en'): string {\n return CJK_TEXT_PATTERN.test(value) ? 'zh' : fallback;\n}\n\nfunction textValue(value: unknown): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || null;\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n return String(value);\n }\n return null;\n}\n\nfunction asList(value: unknown): unknown[] {\n if (Array.isArray(value)) {\n return value;\n }\n return value === undefined || value === null ? [] : [value];\n}\n\nfunction valueAtPath(root: unknown, pathExpression: string): unknown {\n let current = root;\n for (const segment of pathExpression.split('.')) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\nfunction annualSupplyItems(value: unknown): Array<{ '#text': string; '@xml:lang': string }> {\n return asList(value).filter((item): item is { '#text': string; '@xml:lang': string } => {\n return (\n isRecord(item) && typeof item['#text'] === 'string' && typeof item['@xml:lang'] === 'string'\n );\n });\n}\n\nfunction isValidAnnualSupplyVolume(value: unknown): boolean {\n const items = annualSupplyItems(value);\n return (\n items.length > 0 &&\n items.every((item) => {\n const text = item['#text'].trim();\n return NUMERIC_TEXT_WITH_SUFFIX_PATTERN.test(text) && ANNUAL_PERIOD_PATTERN.test(text);\n })\n );\n}\n\nfunction isValidReview(value: unknown): boolean {\n return asList(value).some((item) => isRecord(item) && Boolean(firstNonEmpty(item['@type'])));\n}\n\nfunction isValidComplianceDeclaration(value: unknown): boolean {\n return asList(value).some((item) => {\n if (!isRecord(item)) {\n return false;\n }\n const complianceSystem = isRecord(item['common:referenceToComplianceSystem'])\n ? item['common:referenceToComplianceSystem']\n : {};\n return (\n Boolean(firstNonEmpty(complianceSystem['@refObjectId'])) &&\n REQUIRED_COMPLIANCE_FIELDS.every((field) => Boolean(firstNonEmpty(item[field])))\n );\n });\n}\n\nexport function collectProcessRequiredFieldIssues(\n payload: JsonObject,\n): ProcessRequiredFieldIssue[] {\n const root = datasetRoot(payload, 'process');\n const modelling = isRecord(root.modellingAndValidation) ? root.modellingAndValidation : {};\n const dataSources = isRecord(modelling.dataSourcesTreatmentAndRepresentativeness)\n ? modelling.dataSourcesTreatmentAndRepresentativeness\n : null;\n if (!dataSources) {\n return [\n {\n code: 'process_data_sources_treatment_missing',\n message: 'Process payload must include dataSourcesTreatmentAndRepresentativeness.',\n path: 'processDataSet.modellingAndValidation.dataSourcesTreatmentAndRepresentativeness',\n },\n ];\n }\n\n const issues: ProcessRequiredFieldIssue[] = [];\n const validation = isRecord(modelling.validation) ? modelling.validation : {};\n if (!isValidReview(validation.review)) {\n issues.push({\n code: 'process_validation_review_missing',\n message: 'Process payload must include modellingAndValidation.validation.review.',\n path: 'processDataSet.modellingAndValidation.validation.review',\n });\n }\n\n const complianceDeclarations = isRecord(modelling.complianceDeclarations)\n ? modelling.complianceDeclarations\n : {};\n if (!isValidComplianceDeclaration(complianceDeclarations.compliance)) {\n issues.push({\n code: 'process_compliance_declaration_missing',\n message:\n 'Process payload must include modellingAndValidation.complianceDeclarations.compliance.',\n path: 'processDataSet.modellingAndValidation.complianceDeclarations.compliance',\n });\n }\n\n const annualSupply = dataSources.annualSupplyOrProductionVolume;\n if (isValidAnnualSupplyVolume(annualSupply)) {\n return issues;\n }\n\n const items = annualSupplyItems(annualSupply);\n if (items.length === 0) {\n return [\n ...issues,\n {\n code: 'annual_supply_or_production_volume_missing',\n message:\n 'Process payload must include annualSupplyOrProductionVolume as numeric text with a unit or context suffix.',\n path: ANNUAL_SUPPLY_FIELD,\n },\n ];\n }\n\n if (\n items.every((item) => NUMERIC_TEXT_WITH_SUFFIX_PATTERN.test(item['#text'].trim())) &&\n items.some((item) => !ANNUAL_PERIOD_PATTERN.test(item['#text'].trim()))\n ) {\n return [\n ...issues,\n {\n code: 'annual_supply_or_production_volume_not_annualized',\n message:\n 'annualSupplyOrProductionVolume must express an annualized amount such as \"3.6 MJ/year\" or \"3.6 MJ/年\", not a reference-flow description.',\n path: ANNUAL_SUPPLY_FIELD,\n },\n ];\n }\n\n return [\n ...issues,\n {\n code: 'annual_supply_or_production_volume_invalid',\n message:\n 'annualSupplyOrProductionVolume must start with a real number followed by a unit or context suffix.',\n path: ANNUAL_SUPPLY_FIELD,\n },\n ];\n}\n\nfunction issuePath(pathSegments: Array<string | number>): string {\n return pathSegments.length > 0 ? pathSegments.map(String).join('.') : '<root>';\n}\n\nfunction collectPlaceholderIssuesFromValue(\n value: unknown,\n pathSegments: Array<string | number>,\n issues: ProcessRequiredFieldIssue[],\n): void {\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n if (\n (pathSegments.at(-1) === 'common:referenceYear' && normalized === '9999') ||\n normalized.includes('tidas_import_placeholder') ||\n normalized.includes('tidas_import_trace_v1') ||\n normalized.includes('not declared in source package') ||\n normalized.includes('source package metadata not declared') ||\n normalized === '<null>' ||\n /(^|[\\s\"'`])(?:\\/users\\/|\\/home\\/|[a-z]:\\\\)/iu.test(value) ||\n normalized.includes('placeholder.example') ||\n normalized.includes('pending confirmation') ||\n /00000000-0000-0000-0000-0000000000[0-9a-f]{2}/u.test(normalized)\n ) {\n issues.push({\n code: 'process_placeholder_content',\n message:\n 'Process payload contains placeholder or pending-confirmation content that must be replaced before save or publish.',\n path: issuePath(pathSegments),\n });\n }\n return;\n }\n\n if (typeof value === 'number') {\n if (pathSegments.at(-1) === 'common:referenceYear' && value === 9999) {\n issues.push({\n code: 'process_placeholder_content',\n message:\n 'Process payload contains placeholder or pending-confirmation content that must be replaced before save or publish.',\n path: issuePath(pathSegments),\n });\n }\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) =>\n collectPlaceholderIssuesFromValue(item, [...pathSegments, index], issues),\n );\n return;\n }\n\n if (isRecord(value)) {\n for (const [key, child] of Object.entries(value)) {\n collectPlaceholderIssuesFromValue(child, [...pathSegments, key], issues);\n }\n }\n}\n\nexport function collectProcessPlaceholderIssues(payload: JsonObject): ProcessRequiredFieldIssue[] {\n const root = datasetRoot(payload, 'process');\n const issues: ProcessRequiredFieldIssue[] = [];\n collectPlaceholderIssuesFromValue(root, ['processDataSet'], issues);\n return issues;\n}\n\nfunction hasPlaceholderContent(value: unknown): boolean {\n const issues: ProcessRequiredFieldIssue[] = [];\n collectPlaceholderIssuesFromValue(value, [], issues);\n return issues.length > 0;\n}\n\nfunction removePlaceholderField(\n parent: JsonObject,\n key: string,\n fieldPath: string,\n completions: ProcessRequiredFieldCompletion[],\n): void {\n if (!hasPlaceholderContent(parent[key])) {\n return;\n }\n delete parent[key];\n completions.push({\n field_path: fieldPath,\n source: 'placeholder_repair',\n value: [],\n amount: null,\n unit: null,\n reference_exchange_internal_id: null,\n basis:\n 'Removed placeholder review metadata because the dataset is marked Not reviewed and no completed review evidence is present.',\n });\n}\n\nfunction repairPlaceholderReviewMetadata(root: JsonObject): ProcessRequiredFieldCompletion[] {\n const modelling = isRecord(root.modellingAndValidation) ? root.modellingAndValidation : {};\n const validation = isRecord(modelling.validation) ? modelling.validation : null;\n if (!validation) {\n return [];\n }\n\n const completions: ProcessRequiredFieldCompletion[] = [];\n const validationPath = 'processDataSet.modellingAndValidation.validation';\n for (const key of [\n 'reviewDetails',\n 'common:reviewDetails',\n 'common:referenceToCompleteReviewReport',\n 'common:referenceToNameOfReviewerAndInstitution',\n ]) {\n removePlaceholderField(validation, key, `${validationPath}.${key}`, completions);\n }\n\n if (isRecord(validation.review)) {\n const reviewPath = `${validationPath}.review`;\n for (const key of [\n 'reviewDetails',\n 'common:reviewDetails',\n 'common:referenceToCompleteReviewReport',\n 'common:referenceToNameOfReviewerAndInstitution',\n ]) {\n removePlaceholderField(validation.review, key, `${reviewPath}.${key}`, completions);\n }\n }\n\n return completions;\n}\n\nfunction addRequiredStructureCompletion(\n completions: ProcessRequiredFieldCompletion[],\n fieldPath: string,\n basis: string,\n): void {\n completions.push({\n field_path: fieldPath,\n source: 'required_structure_repair',\n value: [],\n amount: null,\n unit: null,\n reference_exchange_internal_id: null,\n basis,\n });\n}\n\nfunction repairRequiredProcessStructures(root: JsonObject): ProcessRequiredFieldCompletion[] {\n const completions: ProcessRequiredFieldCompletion[] = [];\n if (!isRecord(root.modellingAndValidation)) {\n root.modellingAndValidation = {};\n }\n const modelling = root.modellingAndValidation as JsonObject;\n\n if (!isRecord(modelling.validation)) {\n modelling.validation = {};\n }\n const validation = modelling.validation as JsonObject;\n if (!isValidReview(validation.review)) {\n validation.review = {\n '@type': 'Not reviewed',\n };\n addRequiredStructureCompletion(\n completions,\n 'processDataSet.modellingAndValidation.validation.review',\n 'Inserted a conservative Not reviewed marker because UI roundtrip or source data omitted the required validation.review structure.',\n );\n }\n\n if (!isRecord(modelling.complianceDeclarations)) {\n modelling.complianceDeclarations = {};\n }\n const complianceDeclarations = modelling.complianceDeclarations as JsonObject;\n if (!isValidComplianceDeclaration(complianceDeclarations.compliance)) {\n complianceDeclarations.compliance = cloneJson(DEFAULT_COMPLIANCE_DECLARATION);\n addRequiredStructureCompletion(\n completions,\n 'processDataSet.modellingAndValidation.complianceDeclarations.compliance',\n 'Inserted a conservative Not defined compliance declaration against EF 3.1 because UI roundtrip or source data omitted the required compliance structure.',\n );\n }\n\n return completions;\n}\n\nfunction processRootForMutation(payload: JsonObject): JsonObject {\n if (isRecord(payload.processDataSet)) {\n return payload.processDataSet;\n }\n return payload;\n}\n\nfunction selectReferenceExchange(root: JsonObject): JsonObject | null {\n const exchangesRoot = isRecord(root.exchanges) ? root.exchanges : {};\n const exchanges = asList(exchangesRoot.exchange).filter(isRecord);\n const processInfo = isRecord(root.processInformation) ? root.processInformation : {};\n const quantitativeReference = isRecord(processInfo.quantitativeReference)\n ? processInfo.quantitativeReference\n : {};\n const referenceId = firstNonEmpty(quantitativeReference.referenceToReferenceFlow);\n\n const byReferenceId = referenceId\n ? exchanges.find((exchange) => firstNonEmpty(exchange['@dataSetInternalID']) === referenceId)\n : null;\n if (byReferenceId) {\n return byReferenceId;\n }\n\n return (\n exchanges.find((exchange) => exchange.quantitativeReference === true) ??\n exchanges.find(\n (exchange) => String(exchange.exchangeDirection ?? '').toLowerCase() === 'output',\n ) ??\n null\n );\n}\n\nfunction localizedTextIncludes(value: unknown, pattern: RegExp): boolean {\n return annualSupplyItems(value).some((item) => pattern.test(item['#text']));\n}\n\nfunction inferSpecificUnitFromFlowPayload(payload: JsonObject): string | null {\n const root = datasetRoot(payload, 'flow');\n const flowPropertiesRoot = isRecord(root.flowProperties) ? root.flowProperties : {};\n const flowProperties = asList(flowPropertiesRoot.flowProperty).filter(isRecord);\n for (const flowProperty of flowProperties) {\n const direct = firstNonEmpty(\n flowProperty.unit,\n flowProperty.referenceUnit,\n flowProperty.flowUnit,\n );\n if (direct) {\n return direct;\n }\n\n const flowPropertyRef = isRecord(flowProperty.referenceToFlowPropertyDataSet)\n ? flowProperty.referenceToFlowPropertyDataSet\n : {};\n const flowPropertyId = firstNonEmpty(flowPropertyRef['@refObjectId']);\n const flowPropertyText = flowPropertyRef['common:shortDescription'];\n if (\n flowPropertyId === NET_CALORIFIC_VALUE_ID ||\n localizedTextIncludes(flowPropertyText, /Net calorific|净热值/u)\n ) {\n return 'MJ';\n }\n }\n\n const flowInformation = isRecord(root.flowInformation) ? root.flowInformation : {};\n const dataSetInformation = isRecord(flowInformation.dataSetInformation)\n ? flowInformation.dataSetInformation\n : {};\n const classificationInformation = isRecord(dataSetInformation.classificationInformation)\n ? dataSetInformation.classificationInformation\n : {};\n const classification = isRecord(classificationInformation['common:classification'])\n ? classificationInformation['common:classification']\n : {};\n const classificationClasses = classification['common:class'];\n if (\n localizedTextIncludes(classificationClasses, /Electrical energy|electricity|交流电|电力|电能/iu)\n ) {\n return 'MJ';\n }\n\n return null;\n}\n\nfunction buildFlowUnitIndex(\n flowRows: DatasetRowInput[],\n fallbackUnit: string,\n): Map<string, string> {\n const index = new Map<string, string>();\n for (const row of flowRows) {\n if (row.kind !== 'flow' || !row.id) {\n continue;\n }\n const inferred = inferSpecificUnitFromFlowPayload(row.payload);\n if (inferred && inferred !== fallbackUnit) {\n index.set(row.id, inferred);\n }\n }\n return index;\n}\n\nfunction inferUnitFromReferenceExchange(\n exchange: JsonObject,\n fallbackOrContext: string | CompletionContext,\n): string {\n const context =\n typeof fallbackOrContext === 'string' ? { defaultUnit: fallbackOrContext } : fallbackOrContext;\n const fallbackUnit = context.defaultUnit;\n const flowRef = isRecord(exchange.referenceToFlowDataSet) ? exchange.referenceToFlowDataSet : {};\n const refObjectId = firstNonEmpty(flowRef['@refObjectId']);\n if (refObjectId) {\n const indexedUnit = context.flowUnitById?.get(refObjectId);\n if (indexedUnit) {\n return indexedUnit;\n }\n }\n\n const direct = firstNonEmpty(exchange.unit, exchange.referenceUnit, exchange.flowUnit);\n if (direct) {\n return direct;\n }\n\n const shortDescriptions = flowRef['common:shortDescription'];\n if (\n localizedTextIncludes(\n shortDescriptions,\n /MJ|net calorific|lower calorific|Electrical energy|electricity|净热值|低位发热|交流电|电力|电能/iu,\n )\n ) {\n return 'MJ';\n }\n\n const flowProperty = isRecord(exchange.flowProperty) ? exchange.flowProperty : {};\n const flowPropertyRef = isRecord(flowProperty.referenceToFlowPropertyDataSet)\n ? flowProperty.referenceToFlowPropertyDataSet\n : {};\n const flowPropertyId = firstNonEmpty(flowPropertyRef['@refObjectId']);\n const flowPropertyText = flowPropertyRef['common:shortDescription'];\n if (\n refObjectId === NET_CALORIFIC_VALUE_ID ||\n flowPropertyId === NET_CALORIFIC_VALUE_ID ||\n localizedTextIncludes(flowPropertyText, /Net calorific|净热值/u)\n ) {\n return 'MJ';\n }\n\n return fallbackUnit;\n}\n\nfunction buildAnnualSupplyValue(\n amount: string,\n unit: string,\n): Array<{\n '#text': string;\n '@xml:lang': string;\n}> {\n return [{ '@xml:lang': 'en', '#text': `${amount} ${unit}/year` }];\n}\n\nfunction annualSupplyTextParts(value: string): { amount: string; unit: string } | null {\n const match = /^\\s*([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[Ee][+-]?\\d+)?)\\s+(\\S.*)$/u.exec(value);\n return match ? { amount: match[1] as string, unit: (match[2] as string).trim() } : null;\n}\n\nfunction annualSupplyValueFromText(value: string): AnnualSupplyEvidenceValue | null {\n const text = value.trim();\n if (!NUMERIC_TEXT_WITH_SUFFIX_PATTERN.test(text) || !ANNUAL_PERIOD_PATTERN.test(text)) {\n return null;\n }\n const parts = annualSupplyTextParts(text) as { amount: string; unit: string };\n return {\n value: [{ '@xml:lang': sourceLanguageForText(text), '#text': text }],\n amount: parts.amount,\n unit: parts.unit,\n basis: 'Evidence provided a complete annual supply / production volume text value.',\n };\n}\n\nfunction normalizeAnnualSupplyEvidenceValue(\n candidate: unknown,\n context: CompletionContext,\n): AnnualSupplyEvidenceValue | null {\n if (typeof candidate === 'string') {\n return annualSupplyValueFromText(candidate);\n }\n\n if (typeof candidate === 'number' && Number.isFinite(candidate)) {\n const amount = String(candidate);\n return {\n value: buildAnnualSupplyValue(amount, context.defaultUnit),\n amount,\n unit: context.defaultUnit,\n basis:\n 'Evidence provided a numeric annual supply / production volume; the configured default unit was applied.',\n };\n }\n\n if (isValidAnnualSupplyVolume(candidate)) {\n const value = [\n annualSupplyItems(candidate).map((item) => ({\n '@xml:lang': item['@xml:lang'],\n '#text': item['#text'].trim(),\n }))[0]!,\n ];\n const parts = annualSupplyTextParts(value[0]!['#text']) as { amount: string; unit: string };\n return {\n value,\n amount: parts.amount,\n unit: parts.unit,\n basis:\n 'Evidence provided a validated source-language annual supply / production volume value.',\n };\n }\n\n if (!isRecord(candidate)) {\n return null;\n }\n\n for (const key of [\n 'value',\n 'text',\n 'value_text',\n 'valueText',\n 'annualSupplyOrProductionVolume',\n 'annual_supply_or_production_volume',\n ]) {\n const nested = normalizeAnnualSupplyEvidenceValue(candidate[key], context);\n if (nested) {\n return nested;\n }\n }\n\n const preferredLanguage = textValue(\n candidate.source_language ??\n candidate.sourceLanguage ??\n candidate.lang ??\n candidate['@xml:lang'],\n )?.toLowerCase();\n const english = textValue(candidate.en ?? candidate.english);\n const chinese = textValue(candidate.zh ?? candidate.chinese ?? candidate['zh-CN']);\n const localized = [\n english ? { '@xml:lang': 'en', '#text': english } : null,\n chinese ? { '@xml:lang': 'zh', '#text': chinese } : null,\n ].filter((item): item is { '#text': string; '@xml:lang': string } => Boolean(item));\n if (localized.length > 0 && isValidAnnualSupplyVolume(localized)) {\n const selected =\n localized.find((item) => item['@xml:lang'].toLowerCase() === preferredLanguage) ??\n localized[0]!;\n const value = [selected];\n const parts = annualSupplyTextParts(selected['#text']) as {\n amount: string;\n unit: string;\n };\n return {\n value,\n amount: parts.amount,\n unit: parts.unit,\n basis: 'Evidence provided a language-specific annual supply / production volume text value.',\n };\n }\n\n const amount = textValue(candidate.amount ?? candidate.value_amount ?? candidate.valueAmount);\n const unit = normalizeUnit(\n textValue(\n candidate.unit ?? candidate.uom ?? candidate.reference_unit ?? candidate.referenceUnit,\n ) ?? context.defaultUnit,\n );\n if (amount) {\n return {\n value: buildAnnualSupplyValue(amount, unit),\n amount,\n unit,\n basis:\n 'Evidence provided annual supply / production volume amount and unit as structured fields.',\n };\n }\n\n return null;\n}\n\nfunction isAnnualSupplyEvidencePath(pathExpression: string | null): boolean {\n if (!pathExpression) {\n return false;\n }\n return (\n pathExpression === ANNUAL_SUPPLY_FIELD ||\n pathExpression === ANNUAL_SUPPLY_ROOT_FIELD ||\n pathExpression.endsWith(`.${ANNUAL_SUPPLY_ROOT_FIELD}`) ||\n pathExpression.endsWith('.annualSupplyOrProductionVolume')\n );\n}\n\nfunction fieldPathFromEvidenceEntry(entry: JsonObject): string | null {\n return firstNonEmpty(\n entry.field_path,\n entry.fieldPath,\n entry.path,\n entry.field,\n entry.target_path,\n entry.targetPath,\n );\n}\n\nfunction findAnnualSupplyEvidenceEntry(\n container: unknown,\n context: CompletionContext,\n): AnnualSupplyEvidenceValue | null {\n if (!isRecord(container)) {\n return null;\n }\n\n const directPath = fieldPathFromEvidenceEntry(container);\n if (isAnnualSupplyEvidencePath(directPath)) {\n const directValue = normalizeAnnualSupplyEvidenceValue(container, context);\n if (directValue) {\n return directValue;\n }\n }\n\n for (const key of [\n 'field_values',\n 'fieldValues',\n 'field_bindings',\n 'fieldBindings',\n 'bindings',\n ]) {\n const entries = asList(container[key]).filter(isRecord);\n for (const entry of entries) {\n if (!isAnnualSupplyEvidencePath(fieldPathFromEvidenceEntry(entry))) {\n continue;\n }\n const value = normalizeAnnualSupplyEvidenceValue(entry, context);\n if (value) {\n return value;\n }\n }\n }\n\n return null;\n}\n\nfunction findAnnualSupplyEvidenceValue(\n row: JsonObject,\n payload: JsonObject,\n context: CompletionContext,\n): AnnualSupplyEvidenceValue | null {\n const explicitPaths = [\n 'annualSupplyOrProductionVolume',\n 'annual_supply_or_production_volume',\n 'required_fields.annualSupplyOrProductionVolume',\n 'requiredFields.annualSupplyOrProductionVolume',\n 'authoring.required_fields.annualSupplyOrProductionVolume',\n 'authoring.requiredFields.annualSupplyOrProductionVolume',\n 'process_authoring.required_fields.annualSupplyOrProductionVolume',\n 'processAuthoring.requiredFields.annualSupplyOrProductionVolume',\n ];\n for (const source of [row, payload]) {\n for (const explicitPath of explicitPaths) {\n const value = normalizeAnnualSupplyEvidenceValue(valueAtPath(source, explicitPath), context);\n if (value) {\n return value;\n }\n }\n }\n\n const evidencePaths = [\n 'evidence_manifest',\n 'evidenceManifest',\n 'authoring_evidence',\n 'authoringEvidence',\n 'process_authoring.evidence_manifest',\n 'processAuthoring.evidenceManifest',\n ];\n for (const source of [row, payload]) {\n for (const evidencePath of evidencePaths) {\n const value = findAnnualSupplyEvidenceEntry(valueAtPath(source, evidencePath), context);\n if (value) {\n return value;\n }\n }\n }\n\n return null;\n}\n\nfunction ensureDataSources(root: JsonObject): JsonObject {\n if (!isRecord(root.modellingAndValidation)) {\n root.modellingAndValidation = {};\n }\n const modelling = root.modellingAndValidation as JsonObject;\n if (!isRecord(modelling.dataSourcesTreatmentAndRepresentativeness)) {\n modelling.dataSourcesTreatmentAndRepresentativeness = {};\n }\n return modelling.dataSourcesTreatmentAndRepresentativeness as JsonObject;\n}\n\nfunction cloneRowWithPayload(row: DatasetRowInput): { row: JsonObject; payload: JsonObject } {\n const clonedRow = cloneJson(row.row);\n if (isRecord(clonedRow.json_ordered)) {\n return { row: clonedRow, payload: clonedRow.json_ordered };\n }\n if (isRecord(clonedRow.jsonOrdered)) {\n return { row: clonedRow, payload: clonedRow.jsonOrdered };\n }\n if (isRecord(clonedRow.json)) {\n return { row: clonedRow, payload: clonedRow.json };\n }\n if (isRecord(clonedRow.payload)) {\n return { row: clonedRow, payload: clonedRow.payload };\n }\n if (isRecord(clonedRow.process)) {\n return { row: clonedRow, payload: clonedRow.process };\n }\n return { row: clonedRow, payload: clonedRow };\n}\n\nfunction completeProcessRow(\n row: DatasetRowInput,\n context: CompletionContext,\n): { row: JsonObject; report: ProcessRequiredFieldsRowReport } {\n const { row: clonedRow, payload } = cloneRowWithPayload(row);\n if (row.kind !== 'process') {\n return {\n row: clonedRow,\n report: {\n index: row.index,\n id: row.id,\n version: row.version,\n type: row.kind,\n status: 'skipped',\n issues: [],\n completions: [],\n },\n };\n }\n\n const root = processRootForMutation(payload);\n const placeholderCompletions = repairPlaceholderReviewMetadata(root);\n const requiredStructureCompletions = repairRequiredProcessStructures(root);\n const repairCompletions = [...placeholderCompletions, ...requiredStructureCompletions];\n const existingIssues = collectProcessRequiredFieldIssues(payload);\n const placeholderIssues = collectProcessPlaceholderIssues(payload);\n\n if (existingIssues.length === 0 && placeholderIssues.length === 0) {\n return {\n row: clonedRow,\n report: {\n index: row.index,\n id: row.id,\n version: row.version,\n type: row.kind,\n status: repairCompletions.length > 0 ? 'completed' : 'existing',\n issues: [],\n completions: repairCompletions,\n },\n };\n }\n\n if (placeholderIssues.length > 0) {\n return {\n row: clonedRow,\n report: {\n index: row.index,\n id: row.id,\n version: row.version,\n type: row.kind,\n status: 'blocked',\n issues: [...existingIssues, ...placeholderIssues],\n completions: repairCompletions,\n },\n };\n }\n\n const evidenceValue = findAnnualSupplyEvidenceValue(clonedRow, payload, context);\n if (evidenceValue) {\n const dataSources = ensureDataSources(root);\n dataSources.annualSupplyOrProductionVolume = evidenceValue.value;\n const completion: ProcessRequiredFieldCompletion = {\n field_path: ANNUAL_SUPPLY_FIELD,\n source: 'evidence',\n value: evidenceValue.value,\n amount: evidenceValue.amount,\n unit: evidenceValue.unit,\n reference_exchange_internal_id: null,\n basis: evidenceValue.basis,\n };\n return {\n row: clonedRow,\n report: {\n index: row.index,\n id: row.id,\n version: row.version,\n type: row.kind,\n status: 'completed',\n issues: [],\n completions: [...repairCompletions, completion],\n },\n };\n }\n\n return {\n row: clonedRow,\n report: {\n index: row.index,\n id: row.id,\n version: row.version,\n type: row.kind,\n status: 'blocked',\n issues: [\n ...existingIssues,\n {\n code: 'annual_supply_evidence_missing',\n message:\n 'Could not complete annualSupplyOrProductionVolume because no source evidence value was provided.',\n path: ANNUAL_SUPPLY_FIELD,\n },\n ],\n completions: repairCompletions,\n },\n };\n}\n\nfunction buildFiles(outPath: string, outDir: string | null): ProcessRequiredFieldsReport['files'] {\n if (!outDir) {\n return {\n output_rows: path.resolve(outPath),\n report: null,\n evidence: null,\n };\n }\n const resolved = path.resolve(outDir);\n return {\n output_rows: path.resolve(outPath),\n report: path.join(resolved, 'outputs', 'process-required-fields-report.json'),\n evidence: path.join(resolved, 'outputs', 'process-required-fields-evidence.jsonl'),\n };\n}\n\nfunction requireOutputPath(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new CliError('Missing required --out value.', {\n code: 'PROCESS_REQUIRED_FIELDS_OUT_REQUIRED',\n exitCode: 2,\n });\n }\n return trimmed;\n}\n\nexport async function runProcessRequiredFieldsComplete(\n options: RunProcessRequiredFieldsCompleteOptions,\n): Promise<ProcessRequiredFieldsReport> {\n const outPath = requireOutputPath(options.outPath);\n const outDir = options.outDir?.trim() ? options.outDir.trim() : null;\n const defaultUnit = normalizeUnit(options.defaultUnit);\n const rows = materializeDatasetRows(options.inputPath, options.rawInput);\n const flowRows = options.flowInputPath?.trim()\n ? materializeDatasetRows(options.flowInputPath, options.rawFlowInput)\n : [];\n const flowUnitById = buildFlowUnitIndex(flowRows, defaultUnit);\n const completed = rows.map((row) => completeProcessRow(row, { defaultUnit, flowUnitById }));\n const rowReports = completed.map((item) => item.report);\n const files = buildFiles(outPath, outDir);\n const blockers = rowReports.filter((row) => row.status === 'blocked');\n\n const report: ProcessRequiredFieldsReport = {\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n input_path: path.resolve(options.inputPath),\n out_path: path.resolve(outPath),\n out_dir: outDir ? path.resolve(outDir) : null,\n status: blockers.length > 0 ? 'completed_with_blockers' : 'completed',\n default_unit: defaultUnit,\n counts: {\n total: rowReports.length,\n processes: rowReports.filter((row) => row.type === 'process').length,\n completed: rowReports.filter((row) => row.status === 'completed').length,\n existing: rowReports.filter((row) => row.status === 'existing').length,\n blocked: blockers.length,\n skipped: rowReports.filter((row) => row.status === 'skipped').length,\n },\n files,\n rows: rowReports,\n };\n\n writeJsonLinesArtifact(\n files.output_rows,\n completed.map((item) => item.row),\n );\n if (files.report) {\n writeJsonArtifact(files.report, report);\n }\n if (files.evidence) {\n writeJsonLinesArtifact(\n files.evidence,\n rowReports.flatMap((row) =>\n row.completions.map((completion) => ({\n row_index: row.index,\n dataset_id: row.id,\n dataset_version: row.version,\n ...completion,\n })),\n ),\n );\n }\n\n return report;\n}\n\nexport const __testInternals = {\n ANNUAL_SUPPLY_ROOT_FIELD,\n annualSupplyTextParts,\n annualSupplyValueFromText,\n cloneRowWithPayload,\n collectProcessRequiredFieldIssues,\n completeProcessRow,\n ensureDataSources,\n fieldPathFromEvidenceEntry,\n findAnnualSupplyEvidenceValue,\n findAnnualSupplyEvidenceEntry,\n buildFlowUnitIndex,\n inferUnitFromReferenceExchange,\n inferSpecificUnitFromFlowPayload,\n issuePath,\n isAnnualSupplyEvidencePath,\n isValidComplianceDeclaration,\n isValidAnnualSupplyVolume,\n isValidReview,\n normalizeAnnualSupplyEvidenceValue,\n repairRequiredProcessStructures,\n requireOutputPath,\n selectReferenceExchange,\n textValue,\n valueAtPath,\n};\n"]}
|
|
@@ -73,7 +73,7 @@ function looksLikePublishRequest(value) {
|
|
|
73
73
|
}
|
|
74
74
|
function loadProcessPayloadFromDatasetEntry(entry, baseDir) {
|
|
75
75
|
if (isRecord(entry)) {
|
|
76
|
-
for (const key of ['json_ordered', 'jsonOrdered', 'payload']) {
|
|
76
|
+
for (const key of ['json_ordered', 'jsonOrdered', 'payload', 'process']) {
|
|
77
77
|
const candidate = entry[key];
|
|
78
78
|
if (isRecord(candidate)) {
|
|
79
79
|
return candidate;
|
|
@@ -139,6 +139,9 @@ function processPayloadFromRow(row) {
|
|
|
139
139
|
if (isRecord(row.json)) {
|
|
140
140
|
return row.json;
|
|
141
141
|
}
|
|
142
|
+
if (isRecord(row.process)) {
|
|
143
|
+
return row.process;
|
|
144
|
+
}
|
|
142
145
|
return row;
|
|
143
146
|
}
|
|
144
147
|
function candidateFromPayload(payload, source, bundlePath, validateProcessPayloadImpl) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-save-draft-run.js","sourceRoot":"","sources":["../../../src/lib/process-save-draft-run.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 type { FetchLike } from './http.js';\nimport { readJsonInput } from './io.js';\nimport {\n summarizeProcessPayloadValidation,\n validateProcessPayload,\n type ProcessPayloadValidationResult,\n} from './process-payload-validation.js';\nimport {\n collectPublishInputs,\n normalizePublishRequest,\n type PublishCollectedDatasetEntry,\n type PublishCollectedOrigin,\n} from './publish.js';\nimport {\n syncStateAwareProcessRecord,\n type ProcessStateAwareWriteResult,\n} from './process-save-draft.js';\nimport { buildRunId, resolveRunLayout } from './run.js';\n\ntype JsonObject = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction first_non_empty(...values: unknown[]): string | null {\n for (const value of values) {\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n }\n return null;\n}\n\nfunction resolve_path(baseDir: string, value: string): string {\n return path.resolve(baseDir, value);\n}\n\nfunction serialize_error(error: unknown): { message: string } {\n if (error instanceof Error) {\n return { message: error.message };\n }\n return { message: String(error) };\n}\n\nfunction readJsonLinesInput(inputPath: string): JsonObject[] {\n const resolved = path.resolve(inputPath);\n if (!existsSync(resolved)) {\n throw new CliError(`Input file not found: ${resolved}`, {\n code: 'INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\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 const parsed = JSON.parse(line) as unknown;\n if (!isRecord(parsed)) {\n throw new CliError(\n `Expected JSON object rows in JSONL input: ${resolved} (line ${index + 1})`,\n {\n code: 'INPUT_INVALID_JSONL_ROW',\n exitCode: 2,\n },\n );\n }\n return parsed;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n throw new CliError(`Input file contains invalid JSONL at line ${index + 1}: ${resolved}`, {\n code: 'INPUT_INVALID_JSONL',\n exitCode: 2,\n details: String(error),\n });\n }\n });\n}\n\nfunction readStructuredInput(inputPath: string): unknown {\n return inputPath.toLowerCase().endsWith('.jsonl')\n ? readJsonLinesInput(inputPath)\n : readJsonInput(inputPath);\n}\n\nfunction looksLikePublishRequest(value: unknown): boolean {\n return (\n isRecord(value) &&\n ('inputs' in value || 'publish' in value || 'out_dir' in value || 'output_dir' in value)\n );\n}\n\nfunction loadProcessPayloadFromDatasetEntry(entry: unknown, baseDir: string): JsonObject {\n if (isRecord(entry)) {\n for (const key of ['json_ordered', 'jsonOrdered', 'payload'] as const) {\n const candidate = entry[key];\n if (isRecord(candidate)) {\n return candidate;\n }\n }\n\n const fileValue = first_non_empty(entry.file, entry.path);\n if (fileValue) {\n const filePath = resolve_path(baseDir, fileValue);\n const loaded = readJsonInput(filePath);\n if (!isRecord(loaded)) {\n throw new CliError(`Expected JSON object input: ${filePath}`, {\n code: 'PROCESS_SAVE_DRAFT_INPUT_NOT_OBJECT',\n exitCode: 2,\n });\n }\n return loaded;\n }\n\n return entry;\n }\n\n if (typeof entry === 'string' && entry.trim()) {\n const filePath = resolve_path(baseDir, entry);\n const loaded = readJsonInput(filePath);\n if (!isRecord(loaded)) {\n throw new CliError(`Expected JSON object input: ${filePath}`, {\n code: 'PROCESS_SAVE_DRAFT_INPUT_NOT_OBJECT',\n exitCode: 2,\n });\n }\n return loaded;\n }\n\n throw new CliError('Unsupported process save-draft dataset entry.', {\n code: 'PROCESS_SAVE_DRAFT_UNSUPPORTED_ENTRY',\n exitCode: 2,\n details: entry,\n });\n}\n\nfunction extractProcessIdentity(payload: JsonObject): [string, string] {\n const root = isRecord(payload.processDataSet) ? payload.processDataSet : payload;\n const processInformation = isRecord(root.processInformation) ? root.processInformation : {};\n const dataSetInformation = isRecord(processInformation.dataSetInformation)\n ? processInformation.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n const datasetId = first_non_empty(dataSetInformation['common:UUID']);\n const version = first_non_empty(publicationAndOwnership['common:dataSetVersion'], '01.01.000')!;\n\n if (!datasetId) {\n throw new CliError(\n 'Process payload missing processInformation.dataSetInformation.common:UUID.',\n {\n code: 'PUBLISH_PROCESS_ID_MISSING',\n exitCode: 2,\n },\n );\n }\n\n return [datasetId, version];\n}\n\nfunction processPayloadFromRow(row: JsonObject): JsonObject {\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 type ProcessSaveDraftSource = 'rows_file' | 'bundle' | 'input';\n\nexport type ProcessSaveDraftCandidate = {\n id: string | null;\n version: string | null;\n source: ProcessSaveDraftSource;\n bundle_path: string | null;\n payload: JsonObject;\n validation?: ProcessPayloadValidationResult;\n error?: { message: string };\n};\n\nexport type ProcessSaveDraftProcessReport = {\n id: string | null;\n version: string | null;\n source: ProcessSaveDraftSource;\n bundle_path: string | null;\n status: 'prepared' | 'executed' | 'failed';\n validation?: ProcessPayloadValidationResult;\n execution?: ProcessStateAwareWriteResult;\n error?: { message: string };\n};\n\nexport type ProcessSaveDraftReport = {\n generated_at_utc: string;\n input_path: string;\n input_kind: 'rows_file' | 'publish_request';\n out_dir: string;\n commit: boolean;\n mode: 'dry_run' | 'commit';\n status: 'completed' | 'completed_with_failures';\n counts: {\n selected: number;\n prepared: number;\n executed: number;\n failed: number;\n };\n files: {\n normalized_input: string;\n selected_processes: string;\n progress_jsonl: string;\n failures_jsonl: string;\n summary_json: string;\n };\n processes: ProcessSaveDraftProcessReport[];\n};\n\nexport type RunProcessSaveDraftOptions = {\n inputPath: string;\n outDir?: string | null;\n commit?: boolean | null;\n rawInput?: unknown;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n validateProcessPayloadImpl?: (payload: JsonObject) => ProcessPayloadValidationResult;\n};\n\ntype PreparedProcessSaveDraftInput = {\n inputKind: 'rows_file' | 'publish_request';\n normalizedInput: unknown;\n processes: ProcessSaveDraftCandidate[];\n};\n\nfunction candidateFromPayload(\n payload: JsonObject,\n source: ProcessSaveDraftSource,\n bundlePath: string | null,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): ProcessSaveDraftCandidate {\n try {\n const [id, version] = extractProcessIdentity(payload);\n const validation = validateProcessPayloadImpl(payload);\n if (!validation.ok) {\n return {\n id,\n version,\n source,\n bundle_path: bundlePath,\n payload,\n validation,\n error: {\n message: summarizeProcessPayloadValidation(validation),\n },\n };\n }\n return {\n id,\n version,\n source,\n bundle_path: bundlePath,\n payload,\n validation,\n };\n } catch (error) {\n return {\n id: first_non_empty(payload['@id'], payload.id),\n version: first_non_empty(payload['@version'], payload.version, '01.01.000'),\n source,\n bundle_path: bundlePath,\n payload,\n error:\n error instanceof CliError && error.code === 'PUBLISH_PROCESS_ID_MISSING'\n ? {\n message:\n 'Payload is not a canonical processDataSet wrapper; process save-draft only supports canonical process datasets.',\n }\n : serialize_error(error),\n };\n }\n}\n\nfunction sourceFromPublishOrigin(origin: PublishCollectedOrigin): ProcessSaveDraftSource {\n return origin.source === 'bundle' ? 'bundle' : 'input';\n}\n\nfunction candidateFromPublishEntry(\n entry: PublishCollectedDatasetEntry,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): ProcessSaveDraftCandidate {\n return candidateFromPayload(\n loadProcessPayloadFromDatasetEntry(entry.entry, entry.origin.base_dir),\n sourceFromPublishOrigin(entry.origin),\n entry.origin.bundle_path,\n validateProcessPayloadImpl,\n );\n}\n\nfunction prepareRowsFileInput(\n inputPath: string,\n rawInput: unknown,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): PreparedProcessSaveDraftInput {\n const rows = Array.isArray(rawInput) ? rawInput : [rawInput];\n const normalizedRows = rows.map((row, index) => {\n if (!isRecord(row)) {\n throw new CliError(\n `Expected JSON object rows in process save-draft input: ${inputPath} (index ${index})`,\n {\n code: 'PROCESS_SAVE_DRAFT_INVALID_ROW',\n exitCode: 2,\n },\n );\n }\n return row;\n });\n\n return {\n inputKind: 'rows_file',\n normalizedInput: {\n input_kind: 'rows_file',\n input_path: inputPath,\n row_count: normalizedRows.length,\n },\n processes: normalizedRows.map((row) =>\n candidateFromPayload(\n processPayloadFromRow(row),\n 'rows_file',\n null,\n validateProcessPayloadImpl,\n ),\n ),\n };\n}\n\nfunction preparePublishRequestInput(\n inputPath: string,\n rawInput: unknown,\n commit: boolean,\n now: Date,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): PreparedProcessSaveDraftInput {\n const normalized = normalizePublishRequest(rawInput, {\n requestPath: inputPath,\n commitOverride: commit,\n now,\n });\n const collected = collectPublishInputs(normalized, path.dirname(inputPath));\n\n return {\n inputKind: 'publish_request',\n normalizedInput: normalized,\n processes: collected.processes.map((entry) =>\n candidateFromPublishEntry(entry, validateProcessPayloadImpl),\n ),\n };\n}\n\nfunction prepareProcessSaveDraftInput(\n inputPath: string,\n rawInput: unknown,\n commit: boolean,\n now: Date,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): PreparedProcessSaveDraftInput {\n return looksLikePublishRequest(rawInput)\n ? preparePublishRequestInput(inputPath, rawInput, commit, now, validateProcessPayloadImpl)\n : prepareRowsFileInput(inputPath, rawInput, validateProcessPayloadImpl);\n}\n\nfunction defaultOutDir(inputPath: string, commit: boolean, now: Date): string {\n const runId = buildRunId({\n namespace: 'process_save_draft',\n operation: commit ? 'commit' : 'dry_run',\n now,\n });\n return resolveRunLayout(\n path.join(path.dirname(inputPath), 'artifacts'),\n 'process_save_draft',\n runId,\n ).runRoot;\n}\n\nfunction resolveOutDir(\n inputPath: string,\n outDir: string | null | undefined,\n commit: boolean,\n now: Date,\n): string {\n return outDir ? path.resolve(outDir) : defaultOutDir(inputPath, commit, now);\n}\n\nfunction buildFiles(outDir: string): ProcessSaveDraftReport['files'] {\n const outputDir = path.join(outDir, 'outputs', 'save-draft-rpc');\n return {\n normalized_input: path.join(outDir, 'inputs', 'normalized-input.json'),\n selected_processes: path.join(outputDir, 'selected-processes.jsonl'),\n progress_jsonl: path.join(outputDir, 'progress.jsonl'),\n failures_jsonl: path.join(outputDir, 'failures.jsonl'),\n summary_json: path.join(outputDir, 'summary.json'),\n };\n}\n\nfunction compactCandidate(candidate: ProcessSaveDraftCandidate): JsonObject {\n return {\n id: candidate.id,\n version: candidate.version,\n source: candidate.source,\n bundle_path: candidate.bundle_path,\n payload: candidate.payload,\n ...(candidate.validation ? { validation: candidate.validation } : {}),\n ...(candidate.error ? { error: candidate.error } : {}),\n };\n}\n\nexport async function runProcessSaveDraft(\n options: RunProcessSaveDraftOptions,\n): Promise<ProcessSaveDraftReport> {\n const now = options.now ?? new Date();\n const inputPath = path.resolve(options.inputPath);\n const commit = options.commit === true;\n const rawInput = options.rawInput ?? readStructuredInput(inputPath);\n const validateProcessPayloadImpl = options.validateProcessPayloadImpl ?? validateProcessPayload;\n const prepared = prepareProcessSaveDraftInput(\n inputPath,\n rawInput,\n commit,\n now,\n validateProcessPayloadImpl,\n );\n const outDir = resolveOutDir(inputPath, options.outDir, commit, now);\n const files = buildFiles(outDir);\n\n if (commit && (!options.env || !options.fetchImpl)) {\n throw new CliError('Process save-draft commit requires env and fetch runtime bindings.', {\n code: 'PROCESS_SAVE_DRAFT_RUNTIME_REQUIRED',\n exitCode: 2,\n });\n }\n\n writeJsonArtifact(files.normalized_input, prepared.normalizedInput);\n writeJsonLinesArtifact(files.selected_processes, prepared.processes.map(compactCandidate));\n\n const reports: ProcessSaveDraftProcessReport[] = [];\n for (const candidate of prepared.processes) {\n const report: ProcessSaveDraftProcessReport = {\n id: candidate.id,\n version: candidate.version,\n source: candidate.source,\n bundle_path: candidate.bundle_path,\n status: 'prepared',\n ...(candidate.validation ? { validation: candidate.validation } : {}),\n };\n\n if (candidate.error) {\n report.status = 'failed';\n report.error = candidate.error;\n reports.push(report);\n continue;\n }\n\n if (!commit) {\n reports.push(report);\n continue;\n }\n\n try {\n report.execution = await syncStateAwareProcessRecord({\n id: candidate.id!,\n version: candidate.version!,\n payload: candidate.payload,\n env: options.env!,\n fetchImpl: options.fetchImpl!,\n timeoutMs: options.timeoutMs,\n audit: {\n command: 'tiangong-lca process save-draft',\n source: candidate.source,\n bundle_path: candidate.bundle_path,\n },\n });\n report.status = 'executed';\n } catch (error) {\n report.status = 'failed';\n report.error = serialize_error(error);\n }\n\n reports.push(report);\n }\n\n const failedReports = reports.filter((report) => report.status === 'failed');\n writeJsonLinesArtifact(files.progress_jsonl, reports);\n writeJsonLinesArtifact(files.failures_jsonl, failedReports);\n\n const report: ProcessSaveDraftReport = {\n generated_at_utc: now.toISOString(),\n input_path: inputPath,\n input_kind: prepared.inputKind,\n out_dir: outDir,\n commit,\n mode: commit ? 'commit' : 'dry_run',\n status: failedReports.length > 0 ? 'completed_with_failures' : 'completed',\n counts: {\n selected: prepared.processes.length,\n prepared: reports.filter((entry) => entry.status === 'prepared').length,\n executed: reports.filter((entry) => entry.status === 'executed').length,\n failed: failedReports.length,\n },\n files,\n processes: reports,\n };\n\n writeJsonArtifact(files.summary_json, report);\n return report;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"process-save-draft-run.js","sourceRoot":"","sources":["../../../src/lib/process-save-draft-run.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 type { FetchLike } from './http.js';\nimport { readJsonInput } from './io.js';\nimport {\n summarizeProcessPayloadValidation,\n validateProcessPayload,\n type ProcessPayloadValidationResult,\n} from './process-payload-validation.js';\nimport {\n collectPublishInputs,\n normalizePublishRequest,\n type PublishCollectedDatasetEntry,\n type PublishCollectedOrigin,\n} from './publish.js';\nimport {\n syncStateAwareProcessRecord,\n type ProcessStateAwareWriteResult,\n} from './process-save-draft.js';\nimport { buildRunId, resolveRunLayout } from './run.js';\n\ntype JsonObject = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction first_non_empty(...values: unknown[]): string | null {\n for (const value of values) {\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n }\n return null;\n}\n\nfunction resolve_path(baseDir: string, value: string): string {\n return path.resolve(baseDir, value);\n}\n\nfunction serialize_error(error: unknown): { message: string } {\n if (error instanceof Error) {\n return { message: error.message };\n }\n return { message: String(error) };\n}\n\nfunction readJsonLinesInput(inputPath: string): JsonObject[] {\n const resolved = path.resolve(inputPath);\n if (!existsSync(resolved)) {\n throw new CliError(`Input file not found: ${resolved}`, {\n code: 'INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\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 const parsed = JSON.parse(line) as unknown;\n if (!isRecord(parsed)) {\n throw new CliError(\n `Expected JSON object rows in JSONL input: ${resolved} (line ${index + 1})`,\n {\n code: 'INPUT_INVALID_JSONL_ROW',\n exitCode: 2,\n },\n );\n }\n return parsed;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n throw new CliError(`Input file contains invalid JSONL at line ${index + 1}: ${resolved}`, {\n code: 'INPUT_INVALID_JSONL',\n exitCode: 2,\n details: String(error),\n });\n }\n });\n}\n\nfunction readStructuredInput(inputPath: string): unknown {\n return inputPath.toLowerCase().endsWith('.jsonl')\n ? readJsonLinesInput(inputPath)\n : readJsonInput(inputPath);\n}\n\nfunction looksLikePublishRequest(value: unknown): boolean {\n return (\n isRecord(value) &&\n ('inputs' in value || 'publish' in value || 'out_dir' in value || 'output_dir' in value)\n );\n}\n\nfunction loadProcessPayloadFromDatasetEntry(entry: unknown, baseDir: string): JsonObject {\n if (isRecord(entry)) {\n for (const key of ['json_ordered', 'jsonOrdered', 'payload', 'process'] as const) {\n const candidate = entry[key];\n if (isRecord(candidate)) {\n return candidate;\n }\n }\n\n const fileValue = first_non_empty(entry.file, entry.path);\n if (fileValue) {\n const filePath = resolve_path(baseDir, fileValue);\n const loaded = readJsonInput(filePath);\n if (!isRecord(loaded)) {\n throw new CliError(`Expected JSON object input: ${filePath}`, {\n code: 'PROCESS_SAVE_DRAFT_INPUT_NOT_OBJECT',\n exitCode: 2,\n });\n }\n return loaded;\n }\n\n return entry;\n }\n\n if (typeof entry === 'string' && entry.trim()) {\n const filePath = resolve_path(baseDir, entry);\n const loaded = readJsonInput(filePath);\n if (!isRecord(loaded)) {\n throw new CliError(`Expected JSON object input: ${filePath}`, {\n code: 'PROCESS_SAVE_DRAFT_INPUT_NOT_OBJECT',\n exitCode: 2,\n });\n }\n return loaded;\n }\n\n throw new CliError('Unsupported process save-draft dataset entry.', {\n code: 'PROCESS_SAVE_DRAFT_UNSUPPORTED_ENTRY',\n exitCode: 2,\n details: entry,\n });\n}\n\nfunction extractProcessIdentity(payload: JsonObject): [string, string] {\n const root = isRecord(payload.processDataSet) ? payload.processDataSet : payload;\n const processInformation = isRecord(root.processInformation) ? root.processInformation : {};\n const dataSetInformation = isRecord(processInformation.dataSetInformation)\n ? processInformation.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n const datasetId = first_non_empty(dataSetInformation['common:UUID']);\n const version = first_non_empty(publicationAndOwnership['common:dataSetVersion'], '01.01.000')!;\n\n if (!datasetId) {\n throw new CliError(\n 'Process payload missing processInformation.dataSetInformation.common:UUID.',\n {\n code: 'PUBLISH_PROCESS_ID_MISSING',\n exitCode: 2,\n },\n );\n }\n\n return [datasetId, version];\n}\n\nfunction processPayloadFromRow(row: JsonObject): JsonObject {\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 if (isRecord(row.process)) {\n return row.process;\n }\n\n return row;\n}\n\nexport type ProcessSaveDraftSource = 'rows_file' | 'bundle' | 'input';\n\nexport type ProcessSaveDraftCandidate = {\n id: string | null;\n version: string | null;\n source: ProcessSaveDraftSource;\n bundle_path: string | null;\n payload: JsonObject;\n validation?: ProcessPayloadValidationResult;\n error?: { message: string };\n};\n\nexport type ProcessSaveDraftProcessReport = {\n id: string | null;\n version: string | null;\n source: ProcessSaveDraftSource;\n bundle_path: string | null;\n status: 'prepared' | 'executed' | 'failed';\n validation?: ProcessPayloadValidationResult;\n execution?: ProcessStateAwareWriteResult;\n error?: { message: string };\n};\n\nexport type ProcessSaveDraftReport = {\n generated_at_utc: string;\n input_path: string;\n input_kind: 'rows_file' | 'publish_request';\n out_dir: string;\n commit: boolean;\n mode: 'dry_run' | 'commit';\n status: 'completed' | 'completed_with_failures';\n counts: {\n selected: number;\n prepared: number;\n executed: number;\n failed: number;\n };\n files: {\n normalized_input: string;\n selected_processes: string;\n progress_jsonl: string;\n failures_jsonl: string;\n summary_json: string;\n };\n processes: ProcessSaveDraftProcessReport[];\n};\n\nexport type RunProcessSaveDraftOptions = {\n inputPath: string;\n outDir?: string | null;\n commit?: boolean | null;\n rawInput?: unknown;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n validateProcessPayloadImpl?: (payload: JsonObject) => ProcessPayloadValidationResult;\n};\n\ntype PreparedProcessSaveDraftInput = {\n inputKind: 'rows_file' | 'publish_request';\n normalizedInput: unknown;\n processes: ProcessSaveDraftCandidate[];\n};\n\nfunction candidateFromPayload(\n payload: JsonObject,\n source: ProcessSaveDraftSource,\n bundlePath: string | null,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): ProcessSaveDraftCandidate {\n try {\n const [id, version] = extractProcessIdentity(payload);\n const validation = validateProcessPayloadImpl(payload);\n if (!validation.ok) {\n return {\n id,\n version,\n source,\n bundle_path: bundlePath,\n payload,\n validation,\n error: {\n message: summarizeProcessPayloadValidation(validation),\n },\n };\n }\n return {\n id,\n version,\n source,\n bundle_path: bundlePath,\n payload,\n validation,\n };\n } catch (error) {\n return {\n id: first_non_empty(payload['@id'], payload.id),\n version: first_non_empty(payload['@version'], payload.version, '01.01.000'),\n source,\n bundle_path: bundlePath,\n payload,\n error:\n error instanceof CliError && error.code === 'PUBLISH_PROCESS_ID_MISSING'\n ? {\n message:\n 'Payload is not a canonical processDataSet wrapper; process save-draft only supports canonical process datasets.',\n }\n : serialize_error(error),\n };\n }\n}\n\nfunction sourceFromPublishOrigin(origin: PublishCollectedOrigin): ProcessSaveDraftSource {\n return origin.source === 'bundle' ? 'bundle' : 'input';\n}\n\nfunction candidateFromPublishEntry(\n entry: PublishCollectedDatasetEntry,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): ProcessSaveDraftCandidate {\n return candidateFromPayload(\n loadProcessPayloadFromDatasetEntry(entry.entry, entry.origin.base_dir),\n sourceFromPublishOrigin(entry.origin),\n entry.origin.bundle_path,\n validateProcessPayloadImpl,\n );\n}\n\nfunction prepareRowsFileInput(\n inputPath: string,\n rawInput: unknown,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): PreparedProcessSaveDraftInput {\n const rows = Array.isArray(rawInput) ? rawInput : [rawInput];\n const normalizedRows = rows.map((row, index) => {\n if (!isRecord(row)) {\n throw new CliError(\n `Expected JSON object rows in process save-draft input: ${inputPath} (index ${index})`,\n {\n code: 'PROCESS_SAVE_DRAFT_INVALID_ROW',\n exitCode: 2,\n },\n );\n }\n return row;\n });\n\n return {\n inputKind: 'rows_file',\n normalizedInput: {\n input_kind: 'rows_file',\n input_path: inputPath,\n row_count: normalizedRows.length,\n },\n processes: normalizedRows.map((row) =>\n candidateFromPayload(\n processPayloadFromRow(row),\n 'rows_file',\n null,\n validateProcessPayloadImpl,\n ),\n ),\n };\n}\n\nfunction preparePublishRequestInput(\n inputPath: string,\n rawInput: unknown,\n commit: boolean,\n now: Date,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): PreparedProcessSaveDraftInput {\n const normalized = normalizePublishRequest(rawInput, {\n requestPath: inputPath,\n commitOverride: commit,\n now,\n });\n const collected = collectPublishInputs(normalized, path.dirname(inputPath));\n\n return {\n inputKind: 'publish_request',\n normalizedInput: normalized,\n processes: collected.processes.map((entry) =>\n candidateFromPublishEntry(entry, validateProcessPayloadImpl),\n ),\n };\n}\n\nfunction prepareProcessSaveDraftInput(\n inputPath: string,\n rawInput: unknown,\n commit: boolean,\n now: Date,\n validateProcessPayloadImpl: (payload: JsonObject) => ProcessPayloadValidationResult,\n): PreparedProcessSaveDraftInput {\n return looksLikePublishRequest(rawInput)\n ? preparePublishRequestInput(inputPath, rawInput, commit, now, validateProcessPayloadImpl)\n : prepareRowsFileInput(inputPath, rawInput, validateProcessPayloadImpl);\n}\n\nfunction defaultOutDir(inputPath: string, commit: boolean, now: Date): string {\n const runId = buildRunId({\n namespace: 'process_save_draft',\n operation: commit ? 'commit' : 'dry_run',\n now,\n });\n return resolveRunLayout(\n path.join(path.dirname(inputPath), 'artifacts'),\n 'process_save_draft',\n runId,\n ).runRoot;\n}\n\nfunction resolveOutDir(\n inputPath: string,\n outDir: string | null | undefined,\n commit: boolean,\n now: Date,\n): string {\n return outDir ? path.resolve(outDir) : defaultOutDir(inputPath, commit, now);\n}\n\nfunction buildFiles(outDir: string): ProcessSaveDraftReport['files'] {\n const outputDir = path.join(outDir, 'outputs', 'save-draft-rpc');\n return {\n normalized_input: path.join(outDir, 'inputs', 'normalized-input.json'),\n selected_processes: path.join(outputDir, 'selected-processes.jsonl'),\n progress_jsonl: path.join(outputDir, 'progress.jsonl'),\n failures_jsonl: path.join(outputDir, 'failures.jsonl'),\n summary_json: path.join(outputDir, 'summary.json'),\n };\n}\n\nfunction compactCandidate(candidate: ProcessSaveDraftCandidate): JsonObject {\n return {\n id: candidate.id,\n version: candidate.version,\n source: candidate.source,\n bundle_path: candidate.bundle_path,\n payload: candidate.payload,\n ...(candidate.validation ? { validation: candidate.validation } : {}),\n ...(candidate.error ? { error: candidate.error } : {}),\n };\n}\n\nexport async function runProcessSaveDraft(\n options: RunProcessSaveDraftOptions,\n): Promise<ProcessSaveDraftReport> {\n const now = options.now ?? new Date();\n const inputPath = path.resolve(options.inputPath);\n const commit = options.commit === true;\n const rawInput = options.rawInput ?? readStructuredInput(inputPath);\n const validateProcessPayloadImpl = options.validateProcessPayloadImpl ?? validateProcessPayload;\n const prepared = prepareProcessSaveDraftInput(\n inputPath,\n rawInput,\n commit,\n now,\n validateProcessPayloadImpl,\n );\n const outDir = resolveOutDir(inputPath, options.outDir, commit, now);\n const files = buildFiles(outDir);\n\n if (commit && (!options.env || !options.fetchImpl)) {\n throw new CliError('Process save-draft commit requires env and fetch runtime bindings.', {\n code: 'PROCESS_SAVE_DRAFT_RUNTIME_REQUIRED',\n exitCode: 2,\n });\n }\n\n writeJsonArtifact(files.normalized_input, prepared.normalizedInput);\n writeJsonLinesArtifact(files.selected_processes, prepared.processes.map(compactCandidate));\n\n const reports: ProcessSaveDraftProcessReport[] = [];\n for (const candidate of prepared.processes) {\n const report: ProcessSaveDraftProcessReport = {\n id: candidate.id,\n version: candidate.version,\n source: candidate.source,\n bundle_path: candidate.bundle_path,\n status: 'prepared',\n ...(candidate.validation ? { validation: candidate.validation } : {}),\n };\n\n if (candidate.error) {\n report.status = 'failed';\n report.error = candidate.error;\n reports.push(report);\n continue;\n }\n\n if (!commit) {\n reports.push(report);\n continue;\n }\n\n try {\n report.execution = await syncStateAwareProcessRecord({\n id: candidate.id!,\n version: candidate.version!,\n payload: candidate.payload,\n env: options.env!,\n fetchImpl: options.fetchImpl!,\n timeoutMs: options.timeoutMs,\n audit: {\n command: 'tiangong-lca process save-draft',\n source: candidate.source,\n bundle_path: candidate.bundle_path,\n },\n });\n report.status = 'executed';\n } catch (error) {\n report.status = 'failed';\n report.error = serialize_error(error);\n }\n\n reports.push(report);\n }\n\n const failedReports = reports.filter((report) => report.status === 'failed');\n writeJsonLinesArtifact(files.progress_jsonl, reports);\n writeJsonLinesArtifact(files.failures_jsonl, failedReports);\n\n const report: ProcessSaveDraftReport = {\n generated_at_utc: now.toISOString(),\n input_path: inputPath,\n input_kind: prepared.inputKind,\n out_dir: outDir,\n commit,\n mode: commit ? 'commit' : 'dry_run',\n status: failedReports.length > 0 ? 'completed_with_failures' : 'completed',\n counts: {\n selected: prepared.processes.length,\n prepared: reports.filter((entry) => entry.status === 'prepared').length,\n executed: reports.filter((entry) => entry.status === 'executed').length,\n failed: failedReports.length,\n },\n files,\n processes: reports,\n };\n\n writeJsonArtifact(files.summary_json, report);\n return report;\n}\n"]}
|
package/dist/src/lib/publish.js
CHANGED
|
@@ -3,12 +3,16 @@ import { CliError } from './errors.js';
|
|
|
3
3
|
import { writeJsonArtifact } from './artifacts.js';
|
|
4
4
|
import { readJsonInput } from './io.js';
|
|
5
5
|
import { syncLifecyclemodelBundleRecord, } from './lifecyclemodel-bundle-save.js';
|
|
6
|
+
import { summarizeProcessPayloadValidation, validateProcessPayload, } from './process-payload-validation.js';
|
|
6
7
|
import { syncStateAwareProcessRecord } from './process-save-draft.js';
|
|
7
8
|
import { buildRunId, resolveRunLayout } from './run.js';
|
|
9
|
+
import { getRuntimeRuleset } from './runtime-rulesets.js';
|
|
8
10
|
import { hasSupabaseRestRuntime, syncSupabaseJsonOrderedRecord, } from './supabase-json-ordered-write.js';
|
|
9
11
|
const DEFAULT_MAX_ATTEMPTS = 5;
|
|
10
12
|
const DEFAULT_RETRY_DELAY_SECONDS = 2.0;
|
|
11
13
|
const DEFAULT_DATASET_VERSION = '01.01.000';
|
|
14
|
+
const PUBLISH_VERIFICATION_RULESET_ID = 'publish-run/default';
|
|
15
|
+
const PUBLISH_VERIFICATION_RULESET_VERSION = '1';
|
|
12
16
|
function isRecord(value) {
|
|
13
17
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
14
18
|
}
|
|
@@ -359,10 +363,27 @@ async function publish_lifecyclemodels(entries, options) {
|
|
|
359
363
|
}
|
|
360
364
|
async function publish_processes(entries, options) {
|
|
361
365
|
const reports = [];
|
|
366
|
+
const validate = options.validateProcessPayloadImpl ?? validateProcessPayload;
|
|
362
367
|
for (const item of entries) {
|
|
363
368
|
const payload = load_dataset_entry(item.entry, item.origin.base_dir);
|
|
364
369
|
try {
|
|
365
370
|
const [datasetId, version] = extract_process_identity(payload);
|
|
371
|
+
const validation = validate(payload);
|
|
372
|
+
if (!validation.ok) {
|
|
373
|
+
reports.push({
|
|
374
|
+
table: 'processes',
|
|
375
|
+
id: datasetId,
|
|
376
|
+
version,
|
|
377
|
+
status: 'failed',
|
|
378
|
+
source: item.origin.source,
|
|
379
|
+
bundle_path: item.origin.bundle_path,
|
|
380
|
+
validation,
|
|
381
|
+
error: {
|
|
382
|
+
message: summarizeProcessPayloadValidation(validation),
|
|
383
|
+
},
|
|
384
|
+
});
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
366
387
|
const report = {
|
|
367
388
|
table: 'processes',
|
|
368
389
|
id: datasetId,
|
|
@@ -370,6 +391,7 @@ async function publish_processes(entries, options) {
|
|
|
370
391
|
status: 'prepared',
|
|
371
392
|
source: item.origin.source,
|
|
372
393
|
bundle_path: item.origin.bundle_path,
|
|
394
|
+
validation,
|
|
373
395
|
};
|
|
374
396
|
reports.push(await maybe_execute_dataset(report, payload, {
|
|
375
397
|
...options,
|
|
@@ -544,6 +566,66 @@ function resolve_dataset_executors(options) {
|
|
|
544
566
|
process_build_runs: explicit.process_build_runs,
|
|
545
567
|
};
|
|
546
568
|
}
|
|
569
|
+
function dataset_failure_finding(report, fallbackCode) {
|
|
570
|
+
const validationIssue = report.validation?.ok === false ? report.validation.issues[0] : null;
|
|
571
|
+
return {
|
|
572
|
+
code: validationIssue?.code ?? fallbackCode,
|
|
573
|
+
severity: 'blocker',
|
|
574
|
+
message: validationIssue?.message ??
|
|
575
|
+
report.error?.message ??
|
|
576
|
+
report.reason ??
|
|
577
|
+
'Publish dataset failed.',
|
|
578
|
+
table: report.table,
|
|
579
|
+
id: report.id,
|
|
580
|
+
version: report.version,
|
|
581
|
+
...(validationIssue?.path ? { path: validationIssue.path } : {}),
|
|
582
|
+
...(report.bundle_path !== undefined ? { bundle_path: report.bundle_path } : {}),
|
|
583
|
+
};
|
|
584
|
+
}
|
|
585
|
+
function process_build_run_failure_finding(report) {
|
|
586
|
+
return {
|
|
587
|
+
code: 'process_build_run_publish_failed',
|
|
588
|
+
severity: 'blocker',
|
|
589
|
+
message: report.error?.message ?? 'Process build run publish failed.',
|
|
590
|
+
table: 'process_build_runs',
|
|
591
|
+
id: report.run_id,
|
|
592
|
+
version: null,
|
|
593
|
+
bundle_path: report.bundle_path,
|
|
594
|
+
};
|
|
595
|
+
}
|
|
596
|
+
function build_publish_verification_report(options) {
|
|
597
|
+
const ruleset = getRuntimeRuleset('publish-run/default');
|
|
598
|
+
const datasetFindings = [
|
|
599
|
+
...options.lifecyclemodels,
|
|
600
|
+
...options.processes,
|
|
601
|
+
...options.sources,
|
|
602
|
+
].flatMap((report) => report.status === 'failed'
|
|
603
|
+
? [dataset_failure_finding(report, `${report.table}_publish_failed`)]
|
|
604
|
+
: []);
|
|
605
|
+
const processBuildRunFindings = options.processBuildRuns.flatMap((report) => report.status === 'failed' ? [process_build_run_failure_finding(report)] : []);
|
|
606
|
+
const blockers = [...datasetFindings, ...processBuildRunFindings];
|
|
607
|
+
return {
|
|
608
|
+
schema_version: 1,
|
|
609
|
+
generated_at_utc: options.now.toISOString(),
|
|
610
|
+
command: 'publish run',
|
|
611
|
+
status: blockers.length > 0 ? 'blocked' : 'passed',
|
|
612
|
+
ruleset_id: PUBLISH_VERIFICATION_RULESET_ID,
|
|
613
|
+
ruleset_version: PUBLISH_VERIFICATION_RULESET_VERSION,
|
|
614
|
+
ruleset_source_version: ruleset.source_version,
|
|
615
|
+
ruleset_rule_ids: ruleset.rule_ids,
|
|
616
|
+
commit: options.commit,
|
|
617
|
+
findings: blockers,
|
|
618
|
+
blockers,
|
|
619
|
+
next_action: blockers.length > 0 ? 'fix_blockers' : 'ready_for_commit_or_publish',
|
|
620
|
+
counts: {
|
|
621
|
+
findings: blockers.length,
|
|
622
|
+
blockers: blockers.length,
|
|
623
|
+
failed: options.failed,
|
|
624
|
+
deferred: options.deferred,
|
|
625
|
+
executed: options.executed,
|
|
626
|
+
},
|
|
627
|
+
};
|
|
628
|
+
}
|
|
547
629
|
export async function runPublish(options) {
|
|
548
630
|
const requestPath = path.resolve(options.inputPath);
|
|
549
631
|
const requestDir = path.dirname(requestPath);
|
|
@@ -562,6 +644,7 @@ export async function runPublish(options) {
|
|
|
562
644
|
normalized_request: path.join(outDir, 'normalized-request.json'),
|
|
563
645
|
collected_inputs: path.join(outDir, 'collected-inputs.json'),
|
|
564
646
|
relation_manifest: path.join(outDir, 'relation-manifest.json'),
|
|
647
|
+
verification_report: path.join(outDir, 'verification-report.json'),
|
|
565
648
|
publish_report: path.join(outDir, 'publish-report.json'),
|
|
566
649
|
};
|
|
567
650
|
writeJsonArtifact(files.normalized_request, normalized);
|
|
@@ -578,6 +661,7 @@ export async function runPublish(options) {
|
|
|
578
661
|
commit: normalized.publish.commit,
|
|
579
662
|
executor: executors.processes,
|
|
580
663
|
publish: normalized.publish,
|
|
664
|
+
validateProcessPayloadImpl: options.validateProcessPayloadImpl,
|
|
581
665
|
})
|
|
582
666
|
: [];
|
|
583
667
|
const sources = normalized.publish.publish_sources
|
|
@@ -600,6 +684,17 @@ export async function runPublish(options) {
|
|
|
600
684
|
const failed = publishEntries.filter((item) => item.status === 'failed').length;
|
|
601
685
|
const executed = publishEntries.filter((item) => item.status === 'executed').length;
|
|
602
686
|
const deferred = publishEntries.filter((item) => item.status.startsWith('deferred')).length;
|
|
687
|
+
const verification = build_publish_verification_report({
|
|
688
|
+
now,
|
|
689
|
+
commit: normalized.publish.commit,
|
|
690
|
+
failed,
|
|
691
|
+
deferred,
|
|
692
|
+
executed,
|
|
693
|
+
lifecyclemodels,
|
|
694
|
+
processes,
|
|
695
|
+
sources,
|
|
696
|
+
processBuildRuns,
|
|
697
|
+
});
|
|
603
698
|
const report = {
|
|
604
699
|
generated_at_utc: now.toISOString(),
|
|
605
700
|
request_path: requestPath,
|
|
@@ -618,13 +713,18 @@ export async function runPublish(options) {
|
|
|
618
713
|
failed,
|
|
619
714
|
},
|
|
620
715
|
files,
|
|
716
|
+
verification,
|
|
621
717
|
lifecyclemodels,
|
|
622
718
|
processes,
|
|
623
719
|
sources,
|
|
624
720
|
process_build_runs: processBuildRuns,
|
|
625
721
|
relations,
|
|
626
722
|
};
|
|
723
|
+
writeJsonArtifact(files.verification_report, verification);
|
|
627
724
|
writeJsonArtifact(files.publish_report, report);
|
|
628
725
|
return report;
|
|
629
726
|
}
|
|
727
|
+
export const __testInternals = {
|
|
728
|
+
build_publish_verification_report,
|
|
729
|
+
};
|
|
630
730
|
//# sourceMappingURL=publish.js.map
|