@tiangong-lca/cli 0.0.32 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -12
  3. package/assets/import-smoke/simapro.csv +20 -0
  4. package/bin/tiangong-lca.js +1 -1
  5. package/dist/src/cli.js +103 -65
  6. package/dist/src/cli.js.map +1 -1
  7. package/dist/src/lib/dataset-bilingual.js.map +1 -1
  8. package/dist/src/lib/dataset-classification.js.map +1 -1
  9. package/dist/src/lib/dataset-contract.js.map +1 -1
  10. package/dist/src/lib/dataset-evidence-search.js.map +1 -1
  11. package/dist/src/lib/dataset-import-lca.js +302 -131
  12. package/dist/src/lib/dataset-import-lca.js.map +1 -1
  13. package/dist/src/lib/dataset-maintenance-apply.js +916 -43
  14. package/dist/src/lib/dataset-maintenance-apply.js.map +1 -1
  15. package/dist/src/lib/dataset-maintenance-clear-account.js +10 -4
  16. package/dist/src/lib/dataset-maintenance-clear-account.js.map +1 -1
  17. package/dist/src/lib/dataset-maintenance-contract.js +1 -6
  18. package/dist/src/lib/dataset-maintenance-contract.js.map +1 -1
  19. package/dist/src/lib/dataset-maintenance-derivatives.js +0 -1
  20. package/dist/src/lib/dataset-maintenance-derivatives.js.map +1 -1
  21. package/dist/src/lib/dataset-maintenance-flow-identity-capture.js +1 -0
  22. package/dist/src/lib/dataset-maintenance-flow-identity-capture.js.map +1 -1
  23. package/dist/src/lib/dataset-maintenance-pagination.js.map +1 -1
  24. package/dist/src/lib/dataset-maintenance-protected-before.js.map +1 -1
  25. package/dist/src/lib/dataset-maintenance-protected-contract.js +0 -1
  26. package/dist/src/lib/dataset-maintenance-protected-contract.js.map +1 -1
  27. package/dist/src/lib/dataset-maintenance-protected-freeze.js.map +1 -1
  28. package/dist/src/lib/dataset-maintenance-protected-preparation.js +0 -2
  29. package/dist/src/lib/dataset-maintenance-protected-preparation.js.map +1 -1
  30. package/dist/src/lib/dataset-maintenance-protected-seal.js.map +1 -1
  31. package/dist/src/lib/dataset-maintenance-protected-verify.js +0 -3
  32. package/dist/src/lib/dataset-maintenance-protected-verify.js.map +1 -1
  33. package/dist/src/lib/dataset-maintenance-remote.js +68 -12
  34. package/dist/src/lib/dataset-maintenance-remote.js.map +1 -1
  35. package/dist/src/lib/dataset-maintenance-verify.js +1 -2
  36. package/dist/src/lib/dataset-maintenance-verify.js.map +1 -1
  37. package/dist/src/lib/dataset-remote-refresh.js.map +1 -1
  38. package/dist/src/lib/dataset-remote-verify.js +2 -0
  39. package/dist/src/lib/dataset-remote-verify.js.map +1 -1
  40. package/dist/src/lib/dataset-save-draft-run.js +2 -0
  41. package/dist/src/lib/dataset-save-draft-run.js.map +1 -1
  42. package/dist/src/lib/flow-build-alias-map.js.map +1 -1
  43. package/dist/src/lib/flow-fetch-rows.js.map +1 -1
  44. package/dist/src/lib/flow-get.js.map +1 -1
  45. package/dist/src/lib/flow-governance.js.map +1 -1
  46. package/dist/src/lib/flow-list.js +1 -0
  47. package/dist/src/lib/flow-list.js.map +1 -1
  48. package/dist/src/lib/flow-payload-validation.js.map +1 -1
  49. package/dist/src/lib/flow-publish-version.js +1 -0
  50. package/dist/src/lib/flow-publish-version.js.map +1 -1
  51. package/dist/src/lib/flow-read.js +1 -0
  52. package/dist/src/lib/flow-read.js.map +1 -1
  53. package/dist/src/lib/flow-regen-product.js.map +1 -1
  54. package/dist/src/lib/flow-remediate.js.map +1 -1
  55. package/dist/src/lib/identity-preflight.js +4 -10
  56. package/dist/src/lib/identity-preflight.js.map +1 -1
  57. package/dist/src/lib/lifecyclemodel-bundle-save.js +1 -0
  58. package/dist/src/lib/lifecyclemodel-bundle-save.js.map +1 -1
  59. package/dist/src/lib/lifecyclemodel-orchestrate.js.map +1 -1
  60. package/dist/src/lib/lifecyclemodel-publish-resulting-process.js.map +1 -1
  61. package/dist/src/lib/lifecyclemodel-resulting-process.js.map +1 -1
  62. package/dist/src/lib/lifecyclemodel-save-draft-run.js.map +1 -1
  63. package/dist/src/lib/lifecyclemodel-validate-build.js.map +1 -1
  64. package/dist/src/lib/package-version.js.map +1 -1
  65. package/dist/src/lib/process-auto-build.js.map +1 -1
  66. package/dist/src/lib/process-dedup-review.js +14 -7
  67. package/dist/src/lib/process-dedup-review.js.map +1 -1
  68. package/dist/src/lib/process-flow-build-plan.js +111 -30
  69. package/dist/src/lib/process-flow-build-plan.js.map +1 -1
  70. package/dist/src/lib/process-get.js +1 -0
  71. package/dist/src/lib/process-get.js.map +1 -1
  72. package/dist/src/lib/process-list.js +1 -0
  73. package/dist/src/lib/process-list.js.map +1 -1
  74. package/dist/src/lib/process-payload-validation.js.map +1 -1
  75. package/dist/src/lib/process-qa.js.map +1 -1
  76. package/dist/src/lib/process-refresh-references.js +15 -10
  77. package/dist/src/lib/process-refresh-references.js.map +1 -1
  78. package/dist/src/lib/process-save-draft.js +9 -3
  79. package/dist/src/lib/process-save-draft.js.map +1 -1
  80. package/dist/src/lib/process-scope-statistics.js +11 -4
  81. package/dist/src/lib/process-scope-statistics.js.map +1 -1
  82. package/dist/src/lib/process-verify-rows.js.map +1 -1
  83. package/dist/src/lib/publish.js.map +1 -1
  84. package/dist/src/lib/run.js.map +1 -1
  85. package/dist/src/lib/supabase-client.js +13 -1
  86. package/dist/src/lib/supabase-client.js.map +1 -1
  87. package/dist/src/lib/supabase-data-api-contract.js +328 -0
  88. package/dist/src/lib/supabase-data-api-contract.js.map +1 -0
  89. package/dist/src/lib/supabase-data-api-replay.js +69 -0
  90. package/dist/src/lib/supabase-data-api-replay.js.map +1 -0
  91. package/dist/src/lib/supabase-json-ordered-write.js +2 -0
  92. package/dist/src/lib/supabase-json-ordered-write.js.map +1 -1
  93. package/dist/src/lib/supabase-rest.js +1 -0
  94. package/dist/src/lib/supabase-rest.js.map +1 -1
  95. package/dist/src/lib/tidas-sdk-package-validator.js +5 -5
  96. package/dist/src/lib/tidas-sdk-package-validator.js.map +1 -1
  97. package/dist/src/lib/validation.js.map +1 -1
  98. package/dist/src/main.js.map +1 -1
  99. package/package.json +40 -40
  100. package/dist/scripts/assert-full-coverage.js +0 -77
  101. package/dist/scripts/assert-full-coverage.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tidas-sdk-package-validator.js","sourceRoot":"","sources":["../../../src/lib/tidas-sdk-package-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport {\n type SafeParseIssue,\n type SafeParseSchema,\n type SdkValidationFactory,\n validateSchemaWithDeepFallback,\n} from './tidas-sdk-validation.js';\nimport { TIDAS_LANGUAGE_CODE_SET } from './tidas-languages.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type ValidationSeverity = 'error' | 'warning' | 'info';\n\nexport type ValidationIssue = {\n issue_code: string;\n severity: ValidationSeverity;\n category: string;\n file_path: string;\n message: string;\n location: string;\n context: Record<string, unknown>;\n};\n\ntype ValidationSummary = {\n issue_count: number;\n error_count: number;\n warning_count: number;\n info_count: number;\n};\n\ntype CategoryValidationReport = {\n category: string;\n ok: boolean;\n summary: ValidationSummary;\n issues: ValidationIssue[];\n};\n\nexport type PackageValidationReport = {\n input_dir: string;\n ok: boolean;\n summary: ValidationSummary & { category_count: number };\n categories: CategoryValidationReport[];\n issues: ValidationIssue[];\n};\n\ntype SupportedCategory =\n | 'contacts'\n | 'flowproperties'\n | 'flows'\n | 'lciamethods'\n | 'lifecyclemodels'\n | 'processes'\n | 'sources'\n | 'unitgroups';\n\ntype TidasSdkPublicModule = {\n ContactSchema?: SafeParseSchema;\n FlowPropertySchema?: SafeParseSchema;\n FlowSchema?: SafeParseSchema;\n LCIAMethodSchema?: SafeParseSchema;\n LifeCycleModelSchema?: SafeParseSchema;\n ProcessSchema?: SafeParseSchema;\n SourceSchema?: SafeParseSchema;\n UnitGroupSchema?: SafeParseSchema;\n createContact?: SdkValidationFactory;\n createFlowProperty?: SdkValidationFactory;\n createFlow?: SdkValidationFactory;\n createLCIAMethod?: SdkValidationFactory;\n createLifeCycleModel?: SdkValidationFactory;\n createProcess?: SdkValidationFactory;\n createSource?: SdkValidationFactory;\n createUnitGroup?: SdkValidationFactory;\n};\n\nconst SUPPORTED_CATEGORIES: SupportedCategory[] = [\n 'contacts',\n 'flowproperties',\n 'flows',\n 'lciamethods',\n 'lifecyclemodels',\n 'processes',\n 'sources',\n 'unitgroups',\n];\n\nconst CATEGORY_SCHEMA_EXPORTS: Record<SupportedCategory, keyof TidasSdkPublicModule> = {\n contacts: 'ContactSchema',\n flowproperties: 'FlowPropertySchema',\n flows: 'FlowSchema',\n lciamethods: 'LCIAMethodSchema',\n lifecyclemodels: 'LifeCycleModelSchema',\n processes: 'ProcessSchema',\n sources: 'SourceSchema',\n unitgroups: 'UnitGroupSchema',\n};\n\nconst CATEGORY_FACTORY_EXPORTS: Record<SupportedCategory, keyof TidasSdkPublicModule> = {\n contacts: 'createContact',\n flowproperties: 'createFlowProperty',\n flows: 'createFlow',\n lciamethods: 'createLCIAMethod',\n lifecyclemodels: 'createLifeCycleModel',\n processes: 'createProcess',\n sources: 'createSource',\n unitgroups: 'createUnitGroup',\n};\n\nconst CHINESE_CHARACTER_RE = /[\\u3400-\\u4DBF\\u4E00-\\u9FFF\\uF900-\\uFAFF]/u;\n\nfunction summarizeIssues(issues: ValidationIssue[]): ValidationSummary {\n const errorCount = issues.filter((issue) => issue.severity === 'error').length;\n const warningCount = issues.filter((issue) => issue.severity === 'warning').length;\n const infoCount = issues.filter((issue) => issue.severity === 'info').length;\n\n return {\n issue_count: issues.length,\n error_count: errorCount,\n warning_count: warningCount,\n info_count: infoCount,\n };\n}\n\nfunction buildCategoryReport(\n category: string,\n issues: ValidationIssue[],\n): CategoryValidationReport {\n return {\n category,\n ok: issues.length === 0,\n summary: summarizeIssues(issues),\n issues,\n };\n}\n\nfunction buildPackageReport(\n inputDir: string,\n categoryReports: CategoryValidationReport[],\n): PackageValidationReport {\n const issues = categoryReports.flatMap((report) => report.issues);\n const summary = summarizeIssues(issues);\n\n return {\n input_dir: inputDir,\n ok: issues.length === 0,\n summary: {\n category_count: categoryReports.length,\n ...summary,\n },\n categories: categoryReports,\n issues,\n };\n}\n\nfunction asRecord(value: unknown): JsonObject | null {\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as JsonObject) : null;\n}\n\nfunction ensureArray<T>(value: T | T[] | undefined | null): T[] {\n if (Array.isArray(value)) {\n return value;\n }\n if (value === undefined || value === null) {\n return [];\n }\n return [value];\n}\n\nfunction toLocation(pathParts: Array<string | number> | undefined): string {\n if (!Array.isArray(pathParts) || pathParts.length === 0) {\n return '<root>';\n }\n return pathParts.join('/');\n}\n\nfunction createInvalidJsonIssue(\n category: string,\n filePath: string,\n error: unknown,\n): ValidationIssue {\n return {\n issue_code: 'invalid_json',\n severity: 'error',\n category,\n file_path: filePath,\n location: '<root>',\n message: `Invalid JSON: ${\n error instanceof Error ? error.name : 'Error'\n }: ${error instanceof Error ? error.message : String(error)}`,\n context: {},\n };\n}\n\nfunction createValidationErrorIssue(\n category: string,\n filePath: string,\n error: unknown,\n): ValidationIssue {\n return {\n issue_code: 'validation_error',\n severity: 'error',\n category,\n file_path: filePath,\n location: '<root>',\n message: `Validation error: ${error instanceof Error ? error.message : String(error)}`,\n context: {},\n };\n}\n\nfunction createSchemaIssue(\n category: string,\n filePath: string,\n issue: SafeParseIssue,\n): ValidationIssue {\n const location = toLocation(issue.path);\n return {\n issue_code: 'schema_error',\n severity: 'error',\n category,\n file_path: filePath,\n location,\n message: `Schema Error at ${location}: ${issue.message ?? 'Validation failed'}`,\n context: {\n validator: issue.code ?? 'custom',\n },\n };\n}\n\nfunction dedupeIssues(issues: ValidationIssue[]): ValidationIssue[] {\n const seen = new Set<string>();\n const deduped: ValidationIssue[] = [];\n\n for (const issue of issues) {\n const key = `${issue.issue_code}|${issue.file_path}|${issue.location}|${issue.message}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n deduped.push(issue);\n }\n\n return deduped;\n}\n\nfunction makeIssue(\n category: string,\n filePath: string,\n location: string,\n message: string,\n issueCode = 'schema_error',\n): ValidationIssue {\n return {\n issue_code: issueCode,\n severity: 'error',\n category,\n file_path: filePath,\n location,\n message,\n context: {},\n };\n}\n\nfunction validateElementaryFlowsClassificationHierarchy(\n classItems: Array<Record<string, unknown>>,\n): string[] {\n const errors: string[] = [];\n\n classItems.forEach((item, index) => {\n const level = Number(item['@level']);\n if (level !== index) {\n errors.push(\n `Elementary flow classification level sorting error: at index ${index}, expected level ${index}, got ${level}`,\n );\n }\n });\n\n for (let index = 1; index < classItems.length; index += 1) {\n const parentId = String(classItems[index - 1]?.['@catId'] ?? '');\n const childId = String(classItems[index]?.['@catId'] ?? '');\n if (!childId.startsWith(parentId)) {\n errors.push(\n `Elementary flow classification code error: child code '${childId}' does not start with parent code '${parentId}'`,\n );\n }\n }\n\n return errors;\n}\n\nfunction validateProductFlowsClassificationHierarchy(\n classItems: Array<Record<string, unknown>>,\n): string[] {\n const errors: string[] = [];\n\n classItems.forEach((item, index) => {\n const level = Number(item['@level']);\n if (level !== index) {\n errors.push(\n `Product flow classification level sorting error: at index ${index}, expected level ${index}, got ${level}`,\n );\n }\n });\n\n for (let index = 1; index < classItems.length; index += 1) {\n const parentId = String(classItems[index - 1]?.['@classId'] ?? '');\n const childId = String(classItems[index]?.['@classId'] ?? '');\n if (!childId.startsWith(parentId)) {\n errors.push(\n `Product flow classification code error: child code '${childId}' does not start with parent code '${parentId}'`,\n );\n }\n }\n\n return errors;\n}\n\nfunction validateProcessesClassificationHierarchy(\n classItems: Array<Record<string, unknown>>,\n): string[] {\n const errors: string[] = [];\n const level0ToLevel1Mapping: Record<string, string[]> = {\n A: ['01', '02', '03'],\n B: ['05', '06', '07', '08', '09'],\n C: Array.from({ length: 24 }, (_, index) => String(index + 10).padStart(2, '0')),\n D: ['35'],\n E: ['36', '37', '38', '39'],\n F: ['41', '42', '43'],\n G: ['46', '47'],\n H: ['49', '50', '51', '52', '53'],\n I: ['55', '56'],\n J: ['58', '59', '60'],\n K: ['61', '62', '63'],\n L: ['64', '65', '66'],\n M: ['68'],\n N: ['69', '70', '71', '72', '73', '74', '75'],\n O: ['77', '78', '79', '80', '81', '82'],\n P: ['84'],\n Q: ['85'],\n R: ['86', '87', '88'],\n S: ['90', '91', '92', '93'],\n T: ['94', '95', '96'],\n U: ['97', '98'],\n V: ['99'],\n };\n\n classItems.forEach((item, index) => {\n const level = Number(item['@level']);\n if (level !== index) {\n errors.push(\n `Processes classification level sorting error: at index ${index}, expected level ${index}, got ${level}`,\n );\n }\n });\n\n for (let index = 1; index < classItems.length; index += 1) {\n const parent = classItems[index - 1] ?? {};\n const child = classItems[index] ?? {};\n const parentLevel = Number(parent['@level']);\n const childLevel = Number(child['@level']);\n const parentId = String(parent['@classId'] ?? '');\n const childId = String(child['@classId'] ?? '');\n\n if (parentLevel === 0 && childLevel === 1) {\n const validCodes = level0ToLevel1Mapping[parentId] ?? [];\n if (!validCodes.includes(childId)) {\n errors.push(\n `Processes classification code error: level 1 code '${childId}' does not correspond to level 0 code '${parentId}'`,\n );\n }\n continue;\n }\n\n if (!childId.startsWith(parentId)) {\n errors.push(\n `Processes classification code error: child code '${childId}' does not start with parent code '${parentId}'`,\n );\n }\n }\n\n return errors;\n}\n\nfunction validateSourcesClassificationHierarchy(\n classItems: Array<Record<string, unknown>> | Record<string, unknown> | undefined,\n): string[] {\n const normalizedItems = ensureArray(classItems);\n const errors: string[] = [];\n\n normalizedItems.forEach((item, index) => {\n const level = Number(item['@level']);\n if (!Number.isFinite(level)) {\n errors.push(\n `Sources classification level parsing error: missing or invalid '@level' at index ${index}`,\n );\n return;\n }\n if (level !== index) {\n errors.push(\n `Sources classification level sorting error: at index ${index}, expected level ${index}, got ${level}`,\n );\n }\n });\n\n for (let index = 1; index < normalizedItems.length; index += 1) {\n const parentId = normalizedItems[index - 1]?.['@classId'];\n const childId = normalizedItems[index]?.['@classId'];\n if (typeof parentId !== 'string' || typeof childId !== 'string') {\n errors.push(\n `Sources classification code error: missing '@classId' for parent index ${index - 1} or child index ${index}`,\n );\n continue;\n }\n if (!childId.startsWith(parentId)) {\n errors.push(\n `Sources classification code error: child code '${childId}' does not start with parent code '${parentId}'`,\n );\n }\n }\n\n return errors;\n}\n\nfunction validateLocalizedTextLanguageConstraints(node: unknown, currentPath = ''): string[] {\n const errors: string[] = [];\n const currentNode = asRecord(node);\n\n if (currentNode) {\n const language = currentNode['@xml:lang'];\n const text = currentNode['#text'];\n const location = currentPath || '<root>';\n\n if (typeof language === 'string') {\n if (!TIDAS_LANGUAGE_CODE_SET.has(language)) {\n errors.push(\n `Localized text error at ${location}: @xml:lang '${language}' is not a TIDAS Languages enumeration value`,\n );\n }\n }\n\n if (typeof language === 'string' && typeof text === 'string') {\n const hasChinese = CHINESE_CHARACTER_RE.test(text);\n\n if (language === 'zh' && !hasChinese) {\n errors.push(\n `Localized text error at ${location}: @xml:lang '${language}' must include at least one Chinese character`,\n );\n }\n\n if (language === 'en' && hasChinese) {\n errors.push(\n `Localized text error at ${location}: @xml:lang '${language}' must not contain Chinese characters`,\n );\n }\n }\n\n for (const [key, value] of Object.entries(currentNode)) {\n const childPath = currentPath ? `${currentPath}/${key}` : key;\n errors.push(...validateLocalizedTextLanguageConstraints(value, childPath));\n }\n return errors;\n }\n\n if (Array.isArray(node)) {\n node.forEach((value, index) => {\n const childPath = currentPath ? `${currentPath}/${index}` : String(index);\n errors.push(...validateLocalizedTextLanguageConstraints(value, childPath));\n });\n }\n\n return errors;\n}\n\nfunction collectFlowClassificationStructureIssues(\n items: unknown,\n category: string,\n filePath: string,\n locationBase: string,\n requiredIdKey: '@classId' | '@catId',\n): ValidationIssue[] {\n if (!Array.isArray(items)) {\n return [];\n }\n\n const issues: ValidationIssue[] = [];\n\n items.forEach((item, index) => {\n const record = asRecord(item);\n if (!record) {\n return;\n }\n\n for (const fieldName of ['@level', requiredIdKey, '#text'] as const) {\n if (record[fieldName] !== undefined) {\n continue;\n }\n\n issues.push(\n makeIssue(\n category,\n filePath,\n `${locationBase}/${index}`,\n `Schema Error at ${locationBase}/${index}: '${fieldName}' is a required property`,\n ),\n );\n }\n });\n\n return issues;\n}\n\nfunction extractLocalizedTextLocation(message: string): string {\n if (!message.startsWith('Localized text error at ') || !message.includes(':')) {\n return '<root>';\n }\n\n const location = message.slice('Localized text error at '.length).split(':', 1)[0];\n return location.length > 0 ? location : '<root>';\n}\n\nfunction collectLocalizedTextIssues(\n jsonItem: unknown,\n category: string,\n filePath: string,\n): ValidationIssue[] {\n return validateLocalizedTextLanguageConstraints(jsonItem).map((message) => {\n return makeIssue(\n category,\n filePath,\n extractLocalizedTextLocation(message),\n message,\n message.includes('is not a TIDAS Languages enumeration value')\n ? 'localized_text_language_not_in_tidas_enum'\n : 'localized_text_language_error',\n );\n });\n}\n\nfunction collectFlowSchemaGapIssues(\n jsonItem: unknown,\n category: string,\n filePath: string,\n): ValidationIssue[] {\n if (category !== 'flows') {\n return [];\n }\n\n const flowDataSet = asRecord(asRecord(jsonItem)?.flowDataSet);\n const modellingAndValidation = asRecord(flowDataSet?.modellingAndValidation);\n const lciMethod = asRecord(modellingAndValidation?.LCIMethod);\n const dataSetType = lciMethod?.typeOfDataSet;\n const dataSetInformation = asRecord(asRecord(flowDataSet?.flowInformation)?.dataSetInformation);\n const classificationInformation = asRecord(dataSetInformation?.classificationInformation);\n\n if (dataSetType === 'Product flow') {\n const classes = asRecord(classificationInformation?.['common:classification'])?.[\n 'common:class'\n ];\n return collectFlowClassificationStructureIssues(\n classes,\n category,\n filePath,\n 'flowDataSet/flowInformation/dataSetInformation/classificationInformation/common:classification/common:class',\n '@classId',\n );\n }\n\n if (dataSetType === 'Elementary flow') {\n const categories = asRecord(\n classificationInformation?.['common:elementaryFlowCategorization'],\n )?.['common:category'];\n\n return collectFlowClassificationStructureIssues(\n categories,\n category,\n filePath,\n 'flowDataSet/flowInformation/dataSetInformation/classificationInformation/common:elementaryFlowCategorization/common:category',\n '@catId',\n );\n }\n\n return [];\n}\n\nfunction collectClassificationIssues(\n jsonItem: unknown,\n category: string,\n filePath: string,\n): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n const root = asRecord(jsonItem);\n\n try {\n if (category === 'flows') {\n const flowDataSet = asRecord(root?.flowDataSet);\n const dataSetType = asRecord(asRecord(flowDataSet?.modellingAndValidation)?.LCIMethod)?.[\n 'typeOfDataSet'\n ];\n\n if (dataSetType === 'Product flow') {\n const items = asRecord(\n asRecord(\n asRecord(asRecord(flowDataSet?.flowInformation)?.dataSetInformation)\n ?.classificationInformation,\n )?.['common:classification'],\n )?.['common:class'];\n\n if (Array.isArray(items)) {\n issues.push(\n ...validateProductFlowsClassificationHierarchy(\n items.filter((item): item is Record<string, unknown> => Boolean(asRecord(item))),\n ).map((message) =>\n makeIssue(category, filePath, '<root>', message, 'classification_hierarchy_error'),\n ),\n );\n }\n } else if (dataSetType === 'Elementary flow') {\n const items = asRecord(\n asRecord(\n asRecord(asRecord(flowDataSet?.flowInformation)?.dataSetInformation)\n ?.classificationInformation,\n )?.['common:elementaryFlowCategorization'],\n )?.['common:category'];\n\n if (Array.isArray(items)) {\n issues.push(\n ...validateElementaryFlowsClassificationHierarchy(\n items.filter((item): item is Record<string, unknown> => Boolean(asRecord(item))),\n ).map((message) =>\n makeIssue(category, filePath, '<root>', message, 'classification_hierarchy_error'),\n ),\n );\n }\n }\n } else if (category === 'processes') {\n const items = asRecord(\n asRecord(asRecord(asRecord(root?.processDataSet)?.processInformation)?.dataSetInformation)\n ?.classificationInformation,\n )?.['common:classification'];\n\n const classes = asRecord(items)?.['common:class'];\n if (Array.isArray(classes)) {\n issues.push(\n ...validateProcessesClassificationHierarchy(\n classes.filter((item): item is Record<string, unknown> => Boolean(asRecord(item))),\n ).map((message) =>\n makeIssue(category, filePath, '<root>', message, 'classification_hierarchy_error'),\n ),\n );\n }\n } else if (category === 'lifecyclemodels') {\n const items = asRecord(\n asRecord(asRecord(root?.lifecycleModelDataSet)?.lifecycleModelInformation)\n ?.dataSetInformation,\n )?.classificationInformation;\n\n const classes = asRecord(asRecord(items)?.['common:classification'])?.['common:class'];\n if (Array.isArray(classes)) {\n issues.push(\n ...validateProcessesClassificationHierarchy(\n classes.filter((item): item is Record<string, unknown> => Boolean(asRecord(item))),\n ).map((message) =>\n makeIssue(category, filePath, '<root>', message, 'classification_hierarchy_error'),\n ),\n );\n }\n } else if (category === 'sources') {\n const classes = asRecord(\n asRecord(asRecord(asRecord(root?.sourceDataSet)?.sourceInformation)?.dataSetInformation)\n ?.classificationInformation,\n );\n issues.push(\n ...validateSourcesClassificationHierarchy(\n asRecord(asRecord(classes)?.['common:classification'])?.['common:class'] as\n | Array<Record<string, unknown>>\n | Record<string, unknown>\n | undefined,\n ).map((message) =>\n makeIssue(category, filePath, '<root>', message, 'classification_hierarchy_error'),\n ),\n );\n }\n } catch {\n return issues;\n }\n\n return issues;\n}\n\nfunction collectSchemaIssues(\n schema: SafeParseSchema,\n jsonItem: unknown,\n category: SupportedCategory,\n filePath: string,\n createEntity: SdkValidationFactory | null = null,\n): ValidationIssue[] {\n try {\n const result = validateSchemaWithDeepFallback(schema, jsonItem, createEntity);\n if (result.success) {\n return [];\n }\n\n const rawIssues = result.issues;\n if (rawIssues.length === 0) {\n return [createValidationErrorIssue(category, filePath, 'Schema validation failed')];\n }\n\n return rawIssues.map((issue) => createSchemaIssue(category, filePath, issue));\n } catch (error) {\n return [createValidationErrorIssue(category, filePath, error)];\n }\n}\n\nfunction categoryValidate(\n jsonFilePath: string,\n category: SupportedCategory,\n schema: SafeParseSchema,\n createEntity: SdkValidationFactory | null = null,\n emitLogs = true,\n): CategoryValidationReport {\n const issues: ValidationIssue[] = [];\n\n for (const fileName of readdirSync(jsonFilePath).sort()) {\n if (!fileName.endsWith('.json')) {\n continue;\n }\n\n const fullPath = path.join(jsonFilePath, fileName);\n let jsonItem: unknown;\n\n try {\n jsonItem = JSON.parse(readFileSync(fullPath, 'utf8')) as unknown;\n } catch (error) {\n issues.push(createInvalidJsonIssue(category, fullPath, error));\n continue;\n }\n\n const itemIssues = dedupeIssues([\n ...collectSchemaIssues(schema, jsonItem, category, fullPath, createEntity),\n ...collectFlowSchemaGapIssues(jsonItem, category, fullPath),\n ...collectLocalizedTextIssues(jsonItem, category, fullPath),\n ...collectClassificationIssues(jsonItem, category, fullPath),\n ]);\n\n issues.push(...itemIssues);\n\n if (!emitLogs) {\n continue;\n }\n\n if (itemIssues.length === 0) {\n console.info(`INFO: ${fullPath} PASSED.`);\n continue;\n }\n\n itemIssues.forEach((issue) => {\n console.error(`ERROR: ${fullPath} ${issue.message}`);\n });\n }\n\n return buildCategoryReport(category, issues);\n}\n\nfunction isSafeParseSchema(value: unknown): value is SafeParseSchema {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'safeParse' in value &&\n typeof (value as { safeParse?: unknown }).safeParse === 'function'\n );\n}\n\nfunction resolveCategorySchemas(\n moduleExports: TidasSdkPublicModule,\n): Map<\n SupportedCategory,\n { schema: SafeParseSchema; createEntity: SdkValidationFactory | null }\n> | null {\n const schemas = new Map<\n SupportedCategory,\n { schema: SafeParseSchema; createEntity: SdkValidationFactory | null }\n >();\n\n for (const category of SUPPORTED_CATEGORIES) {\n const exportName = CATEGORY_SCHEMA_EXPORTS[category];\n const schema = moduleExports[exportName];\n if (!isSafeParseSchema(schema)) {\n return null;\n }\n const factoryName = CATEGORY_FACTORY_EXPORTS[category];\n const createEntity = moduleExports[factoryName];\n schemas.set(category, {\n schema,\n createEntity: typeof createEntity === 'function' ? createEntity : null,\n });\n }\n\n return schemas;\n}\n\nexport function createTidasSdkPackageValidator(\n moduleExports: TidasSdkPublicModule,\n location: string,\n): {\n location: string;\n validatePackageDir: (inputDir: string, emitLogs?: boolean) => PackageValidationReport;\n} | null {\n const schemas = resolveCategorySchemas(moduleExports);\n if (!schemas) {\n return null;\n }\n\n return {\n location,\n validatePackageDir(inputDir: string, emitLogs = false): PackageValidationReport {\n const categoryReports = SUPPORTED_CATEGORIES.flatMap((category) => {\n const categoryDir = path.join(inputDir, category);\n const validator = schemas.get(category);\n if (!validator || !existsSync(categoryDir)) {\n return [];\n }\n\n return [\n categoryValidate(\n categoryDir,\n category,\n validator.schema,\n validator.createEntity,\n emitLogs,\n ),\n ];\n });\n\n return buildPackageReport(inputDir, categoryReports);\n },\n };\n}\n\nexport const __testInternals = {\n summarizeIssues,\n buildCategoryReport,\n buildPackageReport,\n asRecord,\n ensureArray,\n toLocation,\n createInvalidJsonIssue,\n createValidationErrorIssue,\n createSchemaIssue,\n dedupeIssues,\n makeIssue,\n validateElementaryFlowsClassificationHierarchy,\n validateProductFlowsClassificationHierarchy,\n validateProcessesClassificationHierarchy,\n validateSourcesClassificationHierarchy,\n validateLocalizedTextLanguageConstraints,\n collectFlowClassificationStructureIssues,\n extractLocalizedTextLocation,\n collectLocalizedTextIssues,\n collectFlowSchemaGapIssues,\n collectClassificationIssues,\n collectSchemaIssues,\n categoryValidate,\n CATEGORY_FACTORY_EXPORTS,\n resolveCategorySchemas,\n};\n"]}
1
+ {"version":3,"file":"tidas-sdk-package-validator.js","sourceRoot":"","sources":["../../../src/lib/tidas-sdk-package-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport {\n type SafeParseIssue,\n type SafeParseSchema,\n type SdkValidationFactory,\n validateSchemaWithDeepFallback,\n} from './tidas-sdk-validation.js';\nimport { TIDAS_LANGUAGE_CODE_SET } from './tidas-languages.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type ValidationSeverity = 'error' | 'warning' | 'info';\n\nexport type ValidationIssue = {\n issue_code: string;\n severity: ValidationSeverity;\n category: string;\n file_path: string;\n message: string;\n location: string;\n context: Record<string, unknown>;\n};\n\ntype ValidationSummary = {\n issue_count: number;\n error_count: number;\n warning_count: number;\n info_count: number;\n};\n\ntype CategoryValidationReport = {\n category: string;\n ok: boolean;\n summary: ValidationSummary;\n issues: ValidationIssue[];\n};\n\nexport type PackageValidationReport = {\n input_dir: string;\n ok: boolean;\n summary: ValidationSummary & { category_count: number };\n categories: CategoryValidationReport[];\n issues: ValidationIssue[];\n};\n\ntype SupportedCategory =\n | 'contacts'\n | 'flowproperties'\n | 'flows'\n | 'lciamethods'\n | 'lifecyclemodels'\n | 'processes'\n | 'sources'\n | 'unitgroups';\n\ntype TidasSdkPublicModule = {\n ContactSchema?: SafeParseSchema;\n FlowPropertySchema?: SafeParseSchema;\n FlowSchema?: SafeParseSchema;\n LCIAMethodSchema?: SafeParseSchema;\n LifeCycleModelSchema?: SafeParseSchema;\n ProcessSchema?: SafeParseSchema;\n SourceSchema?: SafeParseSchema;\n UnitGroupSchema?: SafeParseSchema;\n createContact?: SdkValidationFactory;\n createFlowProperty?: SdkValidationFactory;\n createFlow?: SdkValidationFactory;\n createLCIAMethod?: SdkValidationFactory;\n createLifeCycleModel?: SdkValidationFactory;\n createProcess?: SdkValidationFactory;\n createSource?: SdkValidationFactory;\n createUnitGroup?: SdkValidationFactory;\n};\n\nconst SUPPORTED_CATEGORIES: SupportedCategory[] = [\n 'contacts',\n 'flowproperties',\n 'flows',\n 'lciamethods',\n 'lifecyclemodels',\n 'processes',\n 'sources',\n 'unitgroups',\n];\n\nconst CATEGORY_SCHEMA_EXPORTS: Record<SupportedCategory, keyof TidasSdkPublicModule> = {\n contacts: 'ContactSchema',\n flowproperties: 'FlowPropertySchema',\n flows: 'FlowSchema',\n lciamethods: 'LCIAMethodSchema',\n lifecyclemodels: 'LifeCycleModelSchema',\n processes: 'ProcessSchema',\n sources: 'SourceSchema',\n unitgroups: 'UnitGroupSchema',\n};\n\nconst CATEGORY_FACTORY_EXPORTS: Record<SupportedCategory, keyof TidasSdkPublicModule> = {\n contacts: 'createContact',\n flowproperties: 'createFlowProperty',\n flows: 'createFlow',\n lciamethods: 'createLCIAMethod',\n lifecyclemodels: 'createLifeCycleModel',\n processes: 'createProcess',\n sources: 'createSource',\n unitgroups: 'createUnitGroup',\n};\n\nconst CHINESE_CHARACTER_RE = /[\\u3400-\\u4DBF\\u4E00-\\u9FFF\\uF900-\\uFAFF]/u;\n\nfunction summarizeIssues(issues: ValidationIssue[]): ValidationSummary {\n const errorCount = issues.filter((issue) => issue.severity === 'error').length;\n const warningCount = issues.filter((issue) => issue.severity === 'warning').length;\n const infoCount = issues.filter((issue) => issue.severity === 'info').length;\n\n return {\n issue_count: issues.length,\n error_count: errorCount,\n warning_count: warningCount,\n info_count: infoCount,\n };\n}\n\nfunction buildCategoryReport(\n category: string,\n issues: ValidationIssue[],\n): CategoryValidationReport {\n return {\n category,\n ok: issues.length === 0,\n summary: summarizeIssues(issues),\n issues,\n };\n}\n\nfunction buildPackageReport(\n inputDir: string,\n categoryReports: CategoryValidationReport[],\n): PackageValidationReport {\n const issues = categoryReports.flatMap((report) => report.issues);\n const summary = summarizeIssues(issues);\n\n return {\n input_dir: inputDir,\n ok: issues.length === 0,\n summary: {\n category_count: categoryReports.length,\n ...summary,\n },\n categories: categoryReports,\n issues,\n };\n}\n\nfunction asRecord(value: unknown): JsonObject | null {\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as JsonObject) : null;\n}\n\nfunction ensureArray<T>(value: T | T[] | undefined | null): T[] {\n if (Array.isArray(value)) {\n return value;\n }\n if (value === undefined || value === null) {\n return [];\n }\n return [value];\n}\n\nfunction toLocation(pathParts: Array<string | number> | undefined): string {\n if (!Array.isArray(pathParts) || pathParts.length === 0) {\n return '<root>';\n }\n return pathParts.join('/');\n}\n\nfunction createInvalidJsonIssue(\n category: string,\n filePath: string,\n error: unknown,\n): ValidationIssue {\n return {\n issue_code: 'invalid_json',\n severity: 'error',\n category,\n file_path: filePath,\n location: '<root>',\n message: `Invalid JSON: ${\n error instanceof Error ? error.name : 'Error'\n }: ${error instanceof Error ? error.message : String(error)}`,\n context: {},\n };\n}\n\nfunction createValidationErrorIssue(\n category: string,\n filePath: string,\n error: unknown,\n): ValidationIssue {\n return {\n issue_code: 'validation_error',\n severity: 'error',\n category,\n file_path: filePath,\n location: '<root>',\n message: `Validation error: ${error instanceof Error ? error.message : String(error)}`,\n context: {},\n };\n}\n\nfunction createSchemaIssue(\n category: string,\n filePath: string,\n issue: SafeParseIssue,\n): ValidationIssue {\n const location = toLocation(issue.path);\n return {\n issue_code: 'schema_error',\n severity: 'error',\n category,\n file_path: filePath,\n location,\n message: `Schema Error at ${location}: ${issue.message ?? 'Validation failed'}`,\n context: {\n validator: issue.code ?? 'custom',\n },\n };\n}\n\nfunction dedupeIssues(issues: ValidationIssue[]): ValidationIssue[] {\n const seen = new Set<string>();\n const deduped: ValidationIssue[] = [];\n\n for (const issue of issues) {\n const key = `${issue.issue_code}|${issue.file_path}|${issue.location}|${issue.message}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n deduped.push(issue);\n }\n\n return deduped;\n}\n\nfunction makeIssue(\n category: string,\n filePath: string,\n location: string,\n message: string,\n issueCode = 'schema_error',\n): ValidationIssue {\n return {\n issue_code: issueCode,\n severity: 'error',\n category,\n file_path: filePath,\n location,\n message,\n context: {},\n };\n}\n\nexport function validateElementaryFlowsClassificationHierarchy(\n classItems: Array<Record<string, unknown>>,\n): string[] {\n const errors: string[] = [];\n\n classItems.forEach((item, index) => {\n const level = Number(item['@level']);\n if (level !== index) {\n errors.push(\n `Elementary flow classification level sorting error: at index ${index}, expected level ${index}, got ${level}`,\n );\n }\n });\n\n for (let index = 1; index < classItems.length; index += 1) {\n const parentId = String(classItems[index - 1]?.['@catId'] ?? '');\n const childId = String(classItems[index]?.['@catId'] ?? '');\n if (!childId.startsWith(parentId)) {\n errors.push(\n `Elementary flow classification code error: child code '${childId}' does not start with parent code '${parentId}'`,\n );\n }\n }\n\n return errors;\n}\n\nexport function validateProductFlowsClassificationHierarchy(\n classItems: Array<Record<string, unknown>>,\n): string[] {\n const errors: string[] = [];\n\n classItems.forEach((item, index) => {\n const level = Number(item['@level']);\n if (level !== index) {\n errors.push(\n `Product flow classification level sorting error: at index ${index}, expected level ${index}, got ${level}`,\n );\n }\n });\n\n for (let index = 1; index < classItems.length; index += 1) {\n const parentId = String(classItems[index - 1]?.['@classId'] ?? '');\n const childId = String(classItems[index]?.['@classId'] ?? '');\n if (!childId.startsWith(parentId)) {\n errors.push(\n `Product flow classification code error: child code '${childId}' does not start with parent code '${parentId}'`,\n );\n }\n }\n\n return errors;\n}\n\nexport function validateProcessesClassificationHierarchy(\n classItems: Array<Record<string, unknown>>,\n): string[] {\n const errors: string[] = [];\n const level0ToLevel1Mapping: Record<string, string[]> = {\n A: ['01', '02', '03'],\n B: ['05', '06', '07', '08', '09'],\n C: Array.from({ length: 24 }, (_, index) => String(index + 10).padStart(2, '0')),\n D: ['35'],\n E: ['36', '37', '38', '39'],\n F: ['41', '42', '43'],\n G: ['46', '47'],\n H: ['49', '50', '51', '52', '53'],\n I: ['55', '56'],\n J: ['58', '59', '60'],\n K: ['61', '62', '63'],\n L: ['64', '65', '66'],\n M: ['68'],\n N: ['69', '70', '71', '72', '73', '74', '75'],\n O: ['77', '78', '79', '80', '81', '82'],\n P: ['84'],\n Q: ['85'],\n R: ['86', '87', '88'],\n S: ['90', '91', '92', '93'],\n T: ['94', '95', '96'],\n U: ['97', '98'],\n V: ['99'],\n };\n\n classItems.forEach((item, index) => {\n const level = Number(item['@level']);\n if (level !== index) {\n errors.push(\n `Processes classification level sorting error: at index ${index}, expected level ${index}, got ${level}`,\n );\n }\n });\n\n for (let index = 1; index < classItems.length; index += 1) {\n const parent = classItems[index - 1] ?? {};\n const child = classItems[index] ?? {};\n const parentLevel = Number(parent['@level']);\n const childLevel = Number(child['@level']);\n const parentId = String(parent['@classId'] ?? '');\n const childId = String(child['@classId'] ?? '');\n\n if (parentLevel === 0 && childLevel === 1) {\n const validCodes = level0ToLevel1Mapping[parentId] ?? [];\n if (!validCodes.includes(childId)) {\n errors.push(\n `Processes classification code error: level 1 code '${childId}' does not correspond to level 0 code '${parentId}'`,\n );\n }\n continue;\n }\n\n if (!childId.startsWith(parentId)) {\n errors.push(\n `Processes classification code error: child code '${childId}' does not start with parent code '${parentId}'`,\n );\n }\n }\n\n return errors;\n}\n\nfunction validateSourcesClassificationHierarchy(\n classItems: Array<Record<string, unknown>> | Record<string, unknown> | undefined,\n): string[] {\n const normalizedItems = ensureArray(classItems);\n const errors: string[] = [];\n\n normalizedItems.forEach((item, index) => {\n const level = Number(item['@level']);\n if (!Number.isFinite(level)) {\n errors.push(\n `Sources classification level parsing error: missing or invalid '@level' at index ${index}`,\n );\n return;\n }\n if (level !== index) {\n errors.push(\n `Sources classification level sorting error: at index ${index}, expected level ${index}, got ${level}`,\n );\n }\n });\n\n for (let index = 1; index < normalizedItems.length; index += 1) {\n const parentId = normalizedItems[index - 1]?.['@classId'];\n const childId = normalizedItems[index]?.['@classId'];\n if (typeof parentId !== 'string' || typeof childId !== 'string') {\n errors.push(\n `Sources classification code error: missing '@classId' for parent index ${index - 1} or child index ${index}`,\n );\n continue;\n }\n if (!childId.startsWith(parentId)) {\n errors.push(\n `Sources classification code error: child code '${childId}' does not start with parent code '${parentId}'`,\n );\n }\n }\n\n return errors;\n}\n\nfunction validateLocalizedTextLanguageConstraints(node: unknown, currentPath = ''): string[] {\n const errors: string[] = [];\n const currentNode = asRecord(node);\n\n if (currentNode) {\n const language = currentNode['@xml:lang'];\n const text = currentNode['#text'];\n const location = currentPath || '<root>';\n\n if (typeof language === 'string') {\n if (!TIDAS_LANGUAGE_CODE_SET.has(language)) {\n errors.push(\n `Localized text error at ${location}: @xml:lang '${language}' is not a TIDAS Languages enumeration value`,\n );\n }\n }\n\n if (typeof language === 'string' && typeof text === 'string') {\n const hasChinese = CHINESE_CHARACTER_RE.test(text);\n\n if (language === 'zh' && !hasChinese) {\n errors.push(\n `Localized text error at ${location}: @xml:lang '${language}' must include at least one Chinese character`,\n );\n }\n\n if (language === 'en' && hasChinese) {\n errors.push(\n `Localized text error at ${location}: @xml:lang '${language}' must not contain Chinese characters`,\n );\n }\n }\n\n for (const [key, value] of Object.entries(currentNode)) {\n const childPath = currentPath ? `${currentPath}/${key}` : key;\n errors.push(...validateLocalizedTextLanguageConstraints(value, childPath));\n }\n return errors;\n }\n\n if (Array.isArray(node)) {\n node.forEach((value, index) => {\n const childPath = currentPath ? `${currentPath}/${index}` : String(index);\n errors.push(...validateLocalizedTextLanguageConstraints(value, childPath));\n });\n }\n\n return errors;\n}\n\nfunction collectFlowClassificationStructureIssues(\n items: unknown,\n category: string,\n filePath: string,\n locationBase: string,\n requiredIdKey: '@classId' | '@catId',\n): ValidationIssue[] {\n if (!Array.isArray(items)) {\n return [];\n }\n\n const issues: ValidationIssue[] = [];\n\n items.forEach((item, index) => {\n const record = asRecord(item);\n if (!record) {\n return;\n }\n\n for (const fieldName of ['@level', requiredIdKey, '#text'] as const) {\n if (record[fieldName] !== undefined) {\n continue;\n }\n\n issues.push(\n makeIssue(\n category,\n filePath,\n `${locationBase}/${index}`,\n `Schema Error at ${locationBase}/${index}: '${fieldName}' is a required property`,\n ),\n );\n }\n });\n\n return issues;\n}\n\nfunction extractLocalizedTextLocation(message: string): string {\n if (!message.startsWith('Localized text error at ') || !message.includes(':')) {\n return '<root>';\n }\n\n const location = message.slice('Localized text error at '.length).split(':', 1)[0];\n return location.length > 0 ? location : '<root>';\n}\n\nfunction collectLocalizedTextIssues(\n jsonItem: unknown,\n category: string,\n filePath: string,\n): ValidationIssue[] {\n return validateLocalizedTextLanguageConstraints(jsonItem).map((message) => {\n return makeIssue(\n category,\n filePath,\n extractLocalizedTextLocation(message),\n message,\n message.includes('is not a TIDAS Languages enumeration value')\n ? 'localized_text_language_not_in_tidas_enum'\n : 'localized_text_language_error',\n );\n });\n}\n\nfunction collectFlowSchemaGapIssues(\n jsonItem: unknown,\n category: string,\n filePath: string,\n): ValidationIssue[] {\n if (category !== 'flows') {\n return [];\n }\n\n const flowDataSet = asRecord(asRecord(jsonItem)?.flowDataSet);\n const modellingAndValidation = asRecord(flowDataSet?.modellingAndValidation);\n const lciMethod = asRecord(modellingAndValidation?.LCIMethod);\n const dataSetType = lciMethod?.typeOfDataSet;\n const dataSetInformation = asRecord(asRecord(flowDataSet?.flowInformation)?.dataSetInformation);\n const classificationInformation = asRecord(dataSetInformation?.classificationInformation);\n\n if (dataSetType === 'Product flow') {\n const classes = asRecord(classificationInformation?.['common:classification'])?.[\n 'common:class'\n ];\n return collectFlowClassificationStructureIssues(\n classes,\n category,\n filePath,\n 'flowDataSet/flowInformation/dataSetInformation/classificationInformation/common:classification/common:class',\n '@classId',\n );\n }\n\n if (dataSetType === 'Elementary flow') {\n const categories = asRecord(\n classificationInformation?.['common:elementaryFlowCategorization'],\n )?.['common:category'];\n\n return collectFlowClassificationStructureIssues(\n categories,\n category,\n filePath,\n 'flowDataSet/flowInformation/dataSetInformation/classificationInformation/common:elementaryFlowCategorization/common:category',\n '@catId',\n );\n }\n\n return [];\n}\n\nexport function collectClassificationIssues(\n jsonItem: unknown,\n category: string,\n filePath: string,\n): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n const root = asRecord(jsonItem);\n\n try {\n if (category === 'flows') {\n const flowDataSet = asRecord(root?.flowDataSet);\n const dataSetType = asRecord(asRecord(flowDataSet?.modellingAndValidation)?.LCIMethod)?.[\n 'typeOfDataSet'\n ];\n\n if (dataSetType === 'Product flow' || dataSetType === 'Waste flow') {\n const items = asRecord(\n asRecord(\n asRecord(asRecord(flowDataSet?.flowInformation)?.dataSetInformation)\n ?.classificationInformation,\n )?.['common:classification'],\n )?.['common:class'];\n\n if (Array.isArray(items)) {\n issues.push(\n ...validateProductFlowsClassificationHierarchy(\n items.filter((item): item is Record<string, unknown> => Boolean(asRecord(item))),\n ).map((message) =>\n makeIssue(category, filePath, '<root>', message, 'classification_hierarchy_error'),\n ),\n );\n }\n } else if (dataSetType === 'Elementary flow') {\n const items = asRecord(\n asRecord(\n asRecord(asRecord(flowDataSet?.flowInformation)?.dataSetInformation)\n ?.classificationInformation,\n )?.['common:elementaryFlowCategorization'],\n )?.['common:category'];\n\n if (Array.isArray(items)) {\n issues.push(\n ...validateElementaryFlowsClassificationHierarchy(\n items.filter((item): item is Record<string, unknown> => Boolean(asRecord(item))),\n ).map((message) =>\n makeIssue(category, filePath, '<root>', message, 'classification_hierarchy_error'),\n ),\n );\n }\n }\n } else if (category === 'processes') {\n const items = asRecord(\n asRecord(asRecord(asRecord(root?.processDataSet)?.processInformation)?.dataSetInformation)\n ?.classificationInformation,\n )?.['common:classification'];\n\n const classes = asRecord(items)?.['common:class'];\n if (Array.isArray(classes)) {\n issues.push(\n ...validateProcessesClassificationHierarchy(\n classes.filter((item): item is Record<string, unknown> => Boolean(asRecord(item))),\n ).map((message) =>\n makeIssue(category, filePath, '<root>', message, 'classification_hierarchy_error'),\n ),\n );\n }\n } else if (category === 'lifecyclemodels') {\n const items = asRecord(\n asRecord(asRecord(root?.lifecycleModelDataSet)?.lifecycleModelInformation)\n ?.dataSetInformation,\n )?.classificationInformation;\n\n const classes = asRecord(asRecord(items)?.['common:classification'])?.['common:class'];\n if (Array.isArray(classes)) {\n issues.push(\n ...validateProcessesClassificationHierarchy(\n classes.filter((item): item is Record<string, unknown> => Boolean(asRecord(item))),\n ).map((message) =>\n makeIssue(category, filePath, '<root>', message, 'classification_hierarchy_error'),\n ),\n );\n }\n } else if (category === 'sources') {\n const classes = asRecord(\n asRecord(asRecord(asRecord(root?.sourceDataSet)?.sourceInformation)?.dataSetInformation)\n ?.classificationInformation,\n );\n issues.push(\n ...validateSourcesClassificationHierarchy(\n asRecord(asRecord(classes)?.['common:classification'])?.['common:class'] as\n | Array<Record<string, unknown>>\n | Record<string, unknown>\n | undefined,\n ).map((message) =>\n makeIssue(category, filePath, '<root>', message, 'classification_hierarchy_error'),\n ),\n );\n }\n } catch {\n return issues;\n }\n\n return issues;\n}\n\nfunction collectSchemaIssues(\n schema: SafeParseSchema,\n jsonItem: unknown,\n category: SupportedCategory,\n filePath: string,\n createEntity: SdkValidationFactory | null = null,\n): ValidationIssue[] {\n try {\n const result = validateSchemaWithDeepFallback(schema, jsonItem, createEntity);\n if (result.success) {\n return [];\n }\n\n const rawIssues = result.issues;\n if (rawIssues.length === 0) {\n return [createValidationErrorIssue(category, filePath, 'Schema validation failed')];\n }\n\n return rawIssues.map((issue) => createSchemaIssue(category, filePath, issue));\n } catch (error) {\n return [createValidationErrorIssue(category, filePath, error)];\n }\n}\n\nfunction categoryValidate(\n jsonFilePath: string,\n category: SupportedCategory,\n schema: SafeParseSchema,\n createEntity: SdkValidationFactory | null = null,\n emitLogs = true,\n): CategoryValidationReport {\n const issues: ValidationIssue[] = [];\n\n for (const fileName of readdirSync(jsonFilePath).sort()) {\n if (!fileName.endsWith('.json')) {\n continue;\n }\n\n const fullPath = path.join(jsonFilePath, fileName);\n let jsonItem: unknown;\n\n try {\n jsonItem = JSON.parse(readFileSync(fullPath, 'utf8')) as unknown;\n } catch (error) {\n issues.push(createInvalidJsonIssue(category, fullPath, error));\n continue;\n }\n\n const itemIssues = dedupeIssues([\n ...collectSchemaIssues(schema, jsonItem, category, fullPath, createEntity),\n ...collectFlowSchemaGapIssues(jsonItem, category, fullPath),\n ...collectLocalizedTextIssues(jsonItem, category, fullPath),\n ...collectClassificationIssues(jsonItem, category, fullPath),\n ]);\n\n issues.push(...itemIssues);\n\n if (!emitLogs) {\n continue;\n }\n\n if (itemIssues.length === 0) {\n console.info(`INFO: ${fullPath} PASSED.`);\n continue;\n }\n\n itemIssues.forEach((issue) => {\n console.error(`ERROR: ${fullPath} ${issue.message}`);\n });\n }\n\n return buildCategoryReport(category, issues);\n}\n\nfunction isSafeParseSchema(value: unknown): value is SafeParseSchema {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'safeParse' in value &&\n typeof (value as { safeParse?: unknown }).safeParse === 'function'\n );\n}\n\nfunction resolveCategorySchemas(\n moduleExports: TidasSdkPublicModule,\n): Map<\n SupportedCategory,\n { schema: SafeParseSchema; createEntity: SdkValidationFactory | null }\n> | null {\n const schemas = new Map<\n SupportedCategory,\n { schema: SafeParseSchema; createEntity: SdkValidationFactory | null }\n >();\n\n for (const category of SUPPORTED_CATEGORIES) {\n const exportName = CATEGORY_SCHEMA_EXPORTS[category];\n const schema = moduleExports[exportName];\n if (!isSafeParseSchema(schema)) {\n return null;\n }\n const factoryName = CATEGORY_FACTORY_EXPORTS[category];\n const createEntity = moduleExports[factoryName];\n schemas.set(category, {\n schema,\n createEntity: typeof createEntity === 'function' ? createEntity : null,\n });\n }\n\n return schemas;\n}\n\nexport function createTidasSdkPackageValidator(\n moduleExports: TidasSdkPublicModule,\n location: string,\n): {\n location: string;\n validatePackageDir: (inputDir: string, emitLogs?: boolean) => PackageValidationReport;\n} | null {\n const schemas = resolveCategorySchemas(moduleExports);\n if (!schemas) {\n return null;\n }\n\n return {\n location,\n validatePackageDir(inputDir: string, emitLogs = false): PackageValidationReport {\n const categoryReports = SUPPORTED_CATEGORIES.flatMap((category) => {\n const categoryDir = path.join(inputDir, category);\n const validator = schemas.get(category);\n if (!validator || !existsSync(categoryDir)) {\n return [];\n }\n\n return [\n categoryValidate(\n categoryDir,\n category,\n validator.schema,\n validator.createEntity,\n emitLogs,\n ),\n ];\n });\n\n return buildPackageReport(inputDir, categoryReports);\n },\n };\n}\n\nexport const __testInternals = {\n summarizeIssues,\n buildCategoryReport,\n buildPackageReport,\n asRecord,\n ensureArray,\n toLocation,\n createInvalidJsonIssue,\n createValidationErrorIssue,\n createSchemaIssue,\n dedupeIssues,\n makeIssue,\n validateElementaryFlowsClassificationHierarchy,\n validateProductFlowsClassificationHierarchy,\n validateProcessesClassificationHierarchy,\n validateSourcesClassificationHierarchy,\n validateLocalizedTextLanguageConstraints,\n collectFlowClassificationStructureIssues,\n extractLocalizedTextLocation,\n collectLocalizedTextIssues,\n collectFlowSchemaGapIssues,\n collectClassificationIssues,\n collectSchemaIssues,\n categoryValidate,\n CATEGORY_FACTORY_EXPORTS,\n resolveCategorySchemas,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAIlF,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,eAAe,CAAC,MAAyB;IAChD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAC/E,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACnF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAE7E,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE,YAAY;QAC3B,UAAU,EAAE,SAAS;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO;YACL,UAAU,EAAE,kBAAkB;YAC9B,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,SAAS;YACnB,SAAS,EAAE,WAAW;YACtB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;YACpB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GACZ,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO;QAC/E,CAAC,CAAC,GAAG,CAAC,QAAQ;QACd,CAAC,CAAC,OAAO,CAAC;IAEd,OAAO;QACL,UAAU,EAAE,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB;QACpF,QAAQ;QACR,QAAQ,EAAE,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QACrE,SAAS,EAAE,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;QAC1E,OAAO,EAAE,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QAC5E,QAAQ,EAAE,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;QACpE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;KAClD,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAY;IAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAErF,OAAO;QACL,QAAQ,EAAE,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QAC3E,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QACvB,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC;QAChC,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAY,EAAE,QAAgB;IAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;QACjD,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,uBAAuB,CAAC;QAChD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEjE,OAAO;QACL,SAAS,EAAE,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;QAC7E,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QACvB,OAAO,EAAE;YACP,cAAc,EAAE,UAAU,CAAC,MAAM;YACjC,GAAG,eAAe,CAAC,MAAM,CAAC;SAC3B;QACD,UAAU;QACV,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,IAAI,UAAU,GAAG,QAAQ,CAAC;IAE1B,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YACtD,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO,CAAC,yBAAyB,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAyB;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,QAAQ,CAAC,6CAA6C,EAAE;QAChE,IAAI,EAAE,2BAA2B;QACjC,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,QAAQ,CAAC,qCAAqC,EAAE;YACxD,IAAI,EAAE,+BAA+B;YACrC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,QAAQ,CAAC,yCAAyC,QAAQ,EAAE,EAAE;YACtE,IAAI,EAAE,gCAAgC;YACtC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,QAAQ,CAAC,6CAA6C,QAAQ,EAAE,EAAE;YAC1E,IAAI,EAAE,gCAAgC;YACtC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAkFD,MAAM,UAAU,8BAA8B,CAC5C,SAAyC,EACzC,UAAoB;IAKpB,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAEjC,CAAC;YACF,IAAI,OAAO,MAAM,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;gBACpD,OAAO;oBACL,QAAQ,EAAE,SAAS;oBACnB,kBAAkB,EAAE,MAAM,CAAC,kBAGf;iBACb,CAAC;YACJ,CAAC;YAED,MAAM,gBAAgB,GAAG,8BAA8B,CACrD,MAA8D,EAC9D,SAAS,CACV,CAAC;YACF,IAAI,gBAAgB,EAAE,CAAC;gBACrB,OAAO,gBAAgB,CAAC;YAC1B,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,wDAAwD,SAAS,EAAE,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,MAAM,IAAI,QAAQ,CAAC,2DAA2D,EAAE;QAC9E,IAAI,EAAE,4BAA4B;QAClC,QAAQ,EAAE,CAAC;QACX,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB;IAInC,OAAO,8BAA8B,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC;AAChG,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,QAAgB,EAChB,IAAoB;IAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,qBAAqB,CAAC,EAAE,CAAC;IAClE,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE/F,OAAO;QACL,MAAM,EAAE,KAAK;QACb,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;QACnC,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA6B,EAC7B,OAAuB,EAAE;IAEzB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,OAAO,GAAgC,CAAC,MAAM,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACtF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChF,MAAM,WAAW,GAAwB;QACvC,SAAS,EAAE,QAAQ;QACnB,IAAI;QACJ,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE;YACP,YAAY,EAAE,OAAO,CAAC,MAAM;YAC5B,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM;YACtD,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM;SAC5D;QACD,KAAK,EAAE;YACL,MAAM,EAAE,UAAU;SACnB;QACD,OAAO;QACP,UAAU,EAAE,IAAI;KACjB,CAAC;IAEF,IAAI,UAAU,EAAE,CAAC;QACf,iBAAiB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC","sourcesContent":["import { existsSync, statSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { CliError } from './errors.js';\nimport { writeJsonArtifact } from './artifacts.js';\nimport { createTidasSdkPackageValidator } from './tidas-sdk-package-validator.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 summarizeIssues(issues: ValidationIssue[]): ValidationSummary {\n const errorCount = issues.filter((issue) => issue.severity === 'error').length;\n const warningCount = issues.filter((issue) => issue.severity === 'warning').length;\n const infoCount = issues.filter((issue) => issue.severity === 'info').length;\n\n return {\n issue_count: issues.length,\n error_count: errorCount,\n warning_count: warningCount,\n info_count: infoCount,\n };\n}\n\nfunction normalizeIssue(raw: unknown): ValidationIssue {\n if (!isRecord(raw)) {\n return {\n issue_code: 'validation_issue',\n severity: 'error',\n category: 'unknown',\n file_path: '<unknown>',\n message: String(raw),\n location: '<root>',\n context: {},\n };\n }\n\n const severity =\n raw.severity === 'warning' || raw.severity === 'info' || raw.severity === 'error'\n ? raw.severity\n : 'error';\n\n return {\n issue_code: typeof raw.issue_code === 'string' ? raw.issue_code : 'validation_issue',\n severity,\n category: typeof raw.category === 'string' ? raw.category : 'unknown',\n file_path: typeof raw.file_path === 'string' ? raw.file_path : '<unknown>',\n message: typeof raw.message === 'string' ? raw.message : JSON.stringify(raw),\n location: typeof raw.location === 'string' ? raw.location : '<root>',\n context: isRecord(raw.context) ? raw.context : {},\n };\n}\n\nfunction normalizeCategoryReport(raw: unknown): CategoryValidationReport {\n const record = isRecord(raw) ? raw : {};\n const issues = Array.isArray(record.issues) ? record.issues.map(normalizeIssue) : [];\n\n return {\n category: typeof record.category === 'string' ? record.category : 'unknown',\n ok: issues.length === 0,\n summary: summarizeIssues(issues),\n issues,\n };\n}\n\nfunction normalizePackageReport(raw: unknown, inputDir: string): PackageValidationReport {\n const record = isRecord(raw) ? raw : {};\n const categories = Array.isArray(record.categories)\n ? record.categories.map(normalizeCategoryReport)\n : [];\n const issues = categories.flatMap((category) => category.issues);\n\n return {\n input_dir: typeof record.input_dir === 'string' ? record.input_dir : inputDir,\n ok: issues.length === 0,\n summary: {\n category_count: categories.length,\n ...summarizeIssues(issues),\n },\n categories,\n issues,\n };\n}\n\nexport function resolveRepoRootFrom(startDir: string): string {\n let currentDir = startDir;\n\n while (true) {\n if (existsSync(path.join(currentDir, 'package.json'))) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n return process.cwd();\n }\n currentDir = parentDir;\n }\n}\n\nfunction build_sdk_candidates(): string[] {\n return ['@tiangong-lca/tidas-sdk'];\n}\n\nfunction normalizeValidationMode(value: string | undefined): ValidationMode {\n if (!value) {\n return 'auto';\n }\n if (value === 'auto' || value === 'sdk') {\n return value;\n }\n throw new CliError('Expected --engine to be one of auto or sdk.', {\n code: 'VALIDATION_INVALID_ENGINE',\n exitCode: 2,\n details: value,\n });\n}\n\nfunction assert_input_dir(inputDir: string): string {\n if (!inputDir) {\n throw new CliError('Missing required --input-dir value.', {\n code: 'VALIDATION_INPUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n const resolved = path.resolve(inputDir);\n if (!existsSync(resolved)) {\n throw new CliError(`Validation input directory not found: ${resolved}`, {\n code: 'VALIDATION_INPUT_DIR_NOT_FOUND',\n exitCode: 2,\n });\n }\n\n if (!statSync(resolved).isDirectory()) {\n throw new CliError(`Validation input path is not a directory: ${resolved}`, {\n code: 'VALIDATION_INPUT_NOT_DIRECTORY',\n exitCode: 2,\n });\n }\n\n return resolved;\n}\nexport type ValidationSeverity = 'error' | 'warning' | 'info';\n\nexport type ValidationIssue = {\n issue_code: string;\n severity: ValidationSeverity;\n category: string;\n file_path: string;\n message: string;\n location: string;\n context: Record<string, unknown>;\n};\n\nexport type ValidationSummary = {\n issue_count: number;\n error_count: number;\n warning_count: number;\n info_count: number;\n};\n\nexport type CategoryValidationReport = {\n category: string;\n ok: boolean;\n summary: ValidationSummary;\n issues: ValidationIssue[];\n};\n\nexport type PackageValidationReport = {\n input_dir: string;\n ok: boolean;\n summary: ValidationSummary & { category_count: number };\n categories: CategoryValidationReport[];\n issues: ValidationIssue[];\n};\n\nexport type ValidationEngine = 'sdk';\nexport type ValidationMode = 'auto' | 'sdk';\n\nexport type ValidationExecutionReport = {\n engine: ValidationEngine;\n ok: boolean;\n duration_ms: number;\n location: string;\n report: PackageValidationReport;\n command?: string[];\n command_exit_code?: number | null;\n};\n\nexport type ValidationComparison = {\n equivalent: boolean;\n differences: string[];\n};\n\nexport type ValidationRunReport = {\n input_dir: string;\n mode: ValidationMode;\n ok: boolean;\n summary: {\n engine_count: number;\n ok_count: number;\n failed_count: number;\n };\n files: {\n report: string | null;\n };\n reports: ValidationExecutionReport[];\n comparison: ValidationComparison | null;\n};\n\nexport type RunValidationOptions = {\n inputDir: string;\n engine?: string;\n reportFile?: string | null;\n};\n\nexport type ValidationDeps = {\n loadSdkModule?: () => {\n location: string;\n validatePackageDir: (inputDir: string, emitLogs?: boolean) => unknown;\n };\n};\n\nexport function resolveSdkModuleFromCandidates(\n requireFn: (candidate: string) => unknown,\n candidates: string[],\n): {\n location: string;\n validatePackageDir: (inputDir: string, emitLogs?: boolean) => unknown;\n} {\n const details: string[] = [];\n\n for (const candidate of candidates) {\n try {\n const loaded = requireFn(candidate) as Record<string, unknown> & {\n validatePackageDir?: unknown;\n };\n if (typeof loaded.validatePackageDir === 'function') {\n return {\n location: candidate,\n validatePackageDir: loaded.validatePackageDir as (\n inputDir: string,\n emitLogs?: boolean,\n ) => unknown,\n };\n }\n\n const packageValidator = createTidasSdkPackageValidator(\n loaded as Parameters<typeof createTidasSdkPackageValidator>[0],\n candidate,\n );\n if (packageValidator) {\n return packageValidator;\n }\n\n details.push(`Candidate missing direct package validation exports: ${candidate}`);\n } catch (error) {\n details.push(`${candidate}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n throw new CliError('Unable to resolve the direct tidas-sdk package validator.', {\n code: 'VALIDATION_SDK_UNAVAILABLE',\n exitCode: 2,\n details,\n });\n}\n\nexport function resolveLocalSdkModule(): {\n location: string;\n validatePackageDir: (inputDir: string, emitLogs?: boolean) => unknown;\n} {\n return resolveSdkModuleFromCandidates(createRequire(import.meta.url), build_sdk_candidates());\n}\n\nasync function runSdkValidation(\n inputDir: string,\n deps: ValidationDeps,\n): Promise<ValidationExecutionReport> {\n const startedAt = Date.now();\n const sdkModule = (deps.loadSdkModule ?? resolveLocalSdkModule)();\n const report = normalizePackageReport(sdkModule.validatePackageDir(inputDir, false), inputDir);\n\n return {\n engine: 'sdk',\n ok: report.ok,\n duration_ms: Date.now() - startedAt,\n location: sdkModule.location,\n report,\n };\n}\n\nexport async function runValidation(\n options: RunValidationOptions,\n deps: ValidationDeps = {},\n): Promise<ValidationRunReport> {\n const inputDir = assert_input_dir(options.inputDir);\n const mode = normalizeValidationMode(options.engine);\n const reports: ValidationExecutionReport[] = [await runSdkValidation(inputDir, deps)];\n const reportFile = options.reportFile ? path.resolve(options.reportFile) : null;\n const finalReport: ValidationRunReport = {\n input_dir: inputDir,\n mode,\n ok: reports.every((report) => report.ok),\n summary: {\n engine_count: reports.length,\n ok_count: reports.filter((report) => report.ok).length,\n failed_count: reports.filter((report) => !report.ok).length,\n },\n files: {\n report: reportFile,\n },\n reports,\n comparison: null,\n };\n\n if (reportFile) {\n writeJsonArtifact(reportFile, finalReport);\n }\n\n return finalReport;\n}\n"]}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/lib/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, statSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { CliError } from './errors.js';\nimport { writeJsonArtifact } from './artifacts.js';\nimport { createTidasSdkPackageValidator } from './tidas-sdk-package-validator.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 summarizeIssues(issues: ValidationIssue[]): ValidationSummary {\n const errorCount = issues.filter((issue) => issue.severity === 'error').length;\n const warningCount = issues.filter((issue) => issue.severity === 'warning').length;\n const infoCount = issues.filter((issue) => issue.severity === 'info').length;\n\n return {\n issue_count: issues.length,\n error_count: errorCount,\n warning_count: warningCount,\n info_count: infoCount,\n };\n}\n\nfunction normalizeIssue(raw: unknown): ValidationIssue {\n if (!isRecord(raw)) {\n return {\n issue_code: 'validation_issue',\n severity: 'error',\n category: 'unknown',\n file_path: '<unknown>',\n message: String(raw),\n location: '<root>',\n context: {},\n };\n }\n\n const severity =\n raw.severity === 'warning' || raw.severity === 'info' || raw.severity === 'error'\n ? raw.severity\n : 'error';\n\n return {\n issue_code: typeof raw.issue_code === 'string' ? raw.issue_code : 'validation_issue',\n severity,\n category: typeof raw.category === 'string' ? raw.category : 'unknown',\n file_path: typeof raw.file_path === 'string' ? raw.file_path : '<unknown>',\n message: typeof raw.message === 'string' ? raw.message : JSON.stringify(raw),\n location: typeof raw.location === 'string' ? raw.location : '<root>',\n context: isRecord(raw.context) ? raw.context : {},\n };\n}\n\nfunction normalizeCategoryReport(raw: unknown): CategoryValidationReport {\n const record = isRecord(raw) ? raw : {};\n const issues = Array.isArray(record.issues) ? record.issues.map(normalizeIssue) : [];\n\n return {\n category: typeof record.category === 'string' ? record.category : 'unknown',\n ok: issues.length === 0,\n summary: summarizeIssues(issues),\n issues,\n };\n}\n\nfunction normalizePackageReport(raw: unknown, inputDir: string): PackageValidationReport {\n const record = isRecord(raw) ? raw : {};\n const categories = Array.isArray(record.categories)\n ? record.categories.map(normalizeCategoryReport)\n : [];\n const issues = categories.flatMap((category) => category.issues);\n\n return {\n input_dir: typeof record.input_dir === 'string' ? record.input_dir : inputDir,\n ok: issues.length === 0,\n summary: {\n category_count: categories.length,\n ...summarizeIssues(issues),\n },\n categories,\n issues,\n };\n}\n\nexport function resolveRepoRootFrom(startDir: string): string {\n let currentDir = startDir;\n\n while (true) {\n if (existsSync(path.join(currentDir, 'package.json'))) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n return process.cwd();\n }\n currentDir = parentDir;\n }\n}\n\nfunction build_sdk_candidates(): string[] {\n return ['@tiangong-lca/tidas-sdk'];\n}\n\nfunction normalizeValidationMode(value: string | undefined): ValidationMode {\n if (!value) {\n return 'auto';\n }\n if (value === 'auto' || value === 'sdk') {\n return value;\n }\n throw new CliError('Expected --engine to be one of auto or sdk.', {\n code: 'VALIDATION_INVALID_ENGINE',\n exitCode: 2,\n details: value,\n });\n}\n\nfunction assert_input_dir(inputDir: string): string {\n if (!inputDir) {\n throw new CliError('Missing required --input-dir value.', {\n code: 'VALIDATION_INPUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n const resolved = path.resolve(inputDir);\n if (!existsSync(resolved)) {\n throw new CliError(`Validation input directory not found: ${resolved}`, {\n code: 'VALIDATION_INPUT_DIR_NOT_FOUND',\n exitCode: 2,\n });\n }\n\n if (!statSync(resolved).isDirectory()) {\n throw new CliError(`Validation input path is not a directory: ${resolved}`, {\n code: 'VALIDATION_INPUT_NOT_DIRECTORY',\n exitCode: 2,\n });\n }\n\n return resolved;\n}\nexport type ValidationSeverity = 'error' | 'warning' | 'info';\n\nexport type ValidationIssue = {\n issue_code: string;\n severity: ValidationSeverity;\n category: string;\n file_path: string;\n message: string;\n location: string;\n context: Record<string, unknown>;\n};\n\nexport type ValidationSummary = {\n issue_count: number;\n error_count: number;\n warning_count: number;\n info_count: number;\n};\n\nexport type CategoryValidationReport = {\n category: string;\n ok: boolean;\n summary: ValidationSummary;\n issues: ValidationIssue[];\n};\n\nexport type PackageValidationReport = {\n input_dir: string;\n ok: boolean;\n summary: ValidationSummary & { category_count: number };\n categories: CategoryValidationReport[];\n issues: ValidationIssue[];\n};\n\nexport type ValidationEngine = 'sdk';\nexport type ValidationMode = 'auto' | 'sdk';\n\nexport type ValidationExecutionReport = {\n engine: ValidationEngine;\n ok: boolean;\n duration_ms: number;\n location: string;\n report: PackageValidationReport;\n command?: string[];\n command_exit_code?: number | null;\n};\n\nexport type ValidationComparison = {\n equivalent: boolean;\n differences: string[];\n};\n\nexport type ValidationRunReport = {\n input_dir: string;\n mode: ValidationMode;\n ok: boolean;\n summary: {\n engine_count: number;\n ok_count: number;\n failed_count: number;\n };\n files: {\n report: string | null;\n };\n reports: ValidationExecutionReport[];\n comparison: ValidationComparison | null;\n};\n\nexport type RunValidationOptions = {\n inputDir: string;\n engine?: string;\n reportFile?: string | null;\n};\n\nexport type ValidationDeps = {\n loadSdkModule?: () => {\n location: string;\n validatePackageDir: (inputDir: string, emitLogs?: boolean) => unknown;\n };\n};\n\nexport function resolveSdkModuleFromCandidates(\n requireFn: (candidate: string) => unknown,\n candidates: string[],\n): {\n location: string;\n validatePackageDir: (inputDir: string, emitLogs?: boolean) => unknown;\n} {\n const details: string[] = [];\n\n for (const candidate of candidates) {\n try {\n const loaded = requireFn(candidate) as Record<string, unknown> & {\n validatePackageDir?: unknown;\n };\n if (typeof loaded.validatePackageDir === 'function') {\n return {\n location: candidate,\n validatePackageDir: loaded.validatePackageDir as (\n inputDir: string,\n emitLogs?: boolean,\n ) => unknown,\n };\n }\n\n const packageValidator = createTidasSdkPackageValidator(\n loaded as Parameters<typeof createTidasSdkPackageValidator>[0],\n candidate,\n );\n if (packageValidator) {\n return packageValidator;\n }\n\n details.push(`Candidate missing direct package validation exports: ${candidate}`);\n } catch (error) {\n details.push(`${candidate}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n throw new CliError('Unable to resolve the direct tidas-sdk package validator.', {\n code: 'VALIDATION_SDK_UNAVAILABLE',\n exitCode: 2,\n details,\n });\n}\n\nexport function resolveLocalSdkModule(): {\n location: string;\n validatePackageDir: (inputDir: string, emitLogs?: boolean) => unknown;\n} {\n return resolveSdkModuleFromCandidates(createRequire(import.meta.url), build_sdk_candidates());\n}\n\nasync function runSdkValidation(\n inputDir: string,\n deps: ValidationDeps,\n): Promise<ValidationExecutionReport> {\n const startedAt = Date.now();\n const sdkModule = (deps.loadSdkModule ?? resolveLocalSdkModule)();\n const report = normalizePackageReport(sdkModule.validatePackageDir(inputDir, false), inputDir);\n\n return {\n engine: 'sdk',\n ok: report.ok,\n duration_ms: Date.now() - startedAt,\n location: sdkModule.location,\n report,\n };\n}\n\nexport async function runValidation(\n options: RunValidationOptions,\n deps: ValidationDeps = {},\n): Promise<ValidationRunReport> {\n const inputDir = assert_input_dir(options.inputDir);\n const mode = normalizeValidationMode(options.engine);\n const reports: ValidationExecutionReport[] = [await runSdkValidation(inputDir, deps)];\n const reportFile = options.reportFile ? path.resolve(options.reportFile) : null;\n const finalReport: ValidationRunReport = {\n input_dir: inputDir,\n mode,\n ok: reports.every((report) => report.ok),\n summary: {\n engine_count: reports.length,\n ok_count: reports.filter((report) => report.ok).length,\n failed_count: reports.filter((report) => !report.ok).length,\n },\n files: {\n report: reportFile,\n },\n reports,\n comparison: null,\n };\n\n if (reportFile) {\n writeJsonArtifact(reportFile, finalReport);\n }\n\n return finalReport;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc,EAAE,MAAyB,OAAO,CAAC,GAAG;IAC7E,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE;QACpC,GAAG;QACH,YAAY;QACZ,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,aAAqB,EAAE,KAAyB;IAC5E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,aAAa,KAAK,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAiB,OAAO,CAAC,IAAI,EAC7B,MAAyB,OAAO,CAAC,GAAG,EACpC,gBAAwB,MAAM,CAAC,IAAI,CAAC,GAAG;IAEvC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAChD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,mBAAmB,EAAE,CAAC","sourcesContent":["#!/usr/bin/env node\n\nimport path from 'node:path';\nimport process from 'node:process';\nimport { pathToFileURL } from 'node:url';\nimport { executeCli } from './cli.js';\nimport { loadDotEnv } from './lib/dotenv.js';\n\nexport async function main(argv: string[], env: NodeJS.ProcessEnv = process.env): Promise<number> {\n const dotEnvStatus = loadDotEnv(process.cwd(), env);\n const result = await executeCli(argv, {\n env,\n dotEnvStatus,\n fetchImpl: fetch,\n });\n\n if (result.stdout) {\n process.stdout.write(result.stdout);\n }\n if (result.stderr) {\n process.stderr.write(result.stderr);\n }\n return result.exitCode;\n}\n\nexport function isDirectEntry(importMetaUrl: string, argv1: string | undefined): boolean {\n if (!argv1) {\n return false;\n }\n return importMetaUrl === pathToFileURL(path.resolve(argv1)).href;\n}\n\nexport async function maybeRunFromProcess(\n argv: string[] = process.argv,\n env: NodeJS.ProcessEnv = process.env,\n importMetaUrl: string = import.meta.url,\n): Promise<number | null> {\n const entryPath = argv[1];\n if (!isDirectEntry(importMetaUrl, entryPath)) {\n return null;\n }\n\n const exitCode = await main(argv.slice(2), env);\n process.exitCode = exitCode;\n return exitCode;\n}\n\nawait maybeRunFromProcess();\n"]}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG;IAC7E,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE;QACpC,GAAG;QACH,YAAY;QACZ,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,aAAqB,EAAE,KAAyB;IAC5E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,aAAa,KAAK,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAI,GAAa,OAAO,CAAC,IAAI,EAC7B,GAAG,GAAsB,OAAO,CAAC,GAAG,EACpC,aAAa,GAAW,OAAO,IAAI,CAAC,GAAG;IAEvC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAChD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,mBAAmB,EAAE,CAAC","sourcesContent":["#!/usr/bin/env node\n\nimport path from 'node:path';\nimport process from 'node:process';\nimport { pathToFileURL } from 'node:url';\nimport { executeCli } from './cli.js';\nimport { loadDotEnv } from './lib/dotenv.js';\n\nexport async function main(argv: string[], env: NodeJS.ProcessEnv = process.env): Promise<number> {\n const dotEnvStatus = loadDotEnv(process.cwd(), env);\n const result = await executeCli(argv, {\n env,\n dotEnvStatus,\n fetchImpl: fetch,\n });\n\n if (result.stdout) {\n process.stdout.write(result.stdout);\n }\n if (result.stderr) {\n process.stderr.write(result.stderr);\n }\n return result.exitCode;\n}\n\nexport function isDirectEntry(importMetaUrl: string, argv1: string | undefined): boolean {\n if (!argv1) {\n return false;\n }\n return importMetaUrl === pathToFileURL(path.resolve(argv1)).href;\n}\n\nexport async function maybeRunFromProcess(\n argv: string[] = process.argv,\n env: NodeJS.ProcessEnv = process.env,\n importMetaUrl: string = import.meta.url,\n): Promise<number | null> {\n const entryPath = argv[1];\n if (!isDirectEntry(importMetaUrl, entryPath)) {\n return null;\n }\n\n const exitCode = await main(argv.slice(2), env);\n process.exitCode = exitCode;\n return exitCode;\n}\n\nawait maybeRunFromProcess();\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tiangong-lca/cli",
3
- "version": "0.0.32",
3
+ "version": "0.1.0",
4
4
  "description": "Unified TianGong LCA CLI with direct REST adapters and low-entropy command surface.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -17,44 +17,23 @@
17
17
  "files": [
18
18
  "assets/",
19
19
  "bin/",
20
- "dist/",
20
+ "dist/src/",
21
21
  "README.md",
22
22
  "LICENSE"
23
23
  ],
24
24
  "publishConfig": {
25
- "access": "public"
26
- },
27
- "scripts": {
28
- "start": "npm run build && node ./bin/tiangong-lca.js",
29
- "dev": "tsx watch src/main.ts",
30
- "typecheck": "npm run tsc",
31
- "tsc": "tsc --noEmit",
32
- "lint": "npm run lint:js && npm run lint:prettier && npm run lint:coverage-guards && npm run tsc",
33
- "lint-staged": "lint-staged",
34
- "lint-staged:js": "eslint --ext .js,.jsx,.ts,.tsx ",
35
- "lint:deprecated": "node ./scripts/lint-deprecated.cjs src test scripts",
36
- "lint:coverage-guards": "node ./scripts/assert-no-coverage-ignore.cjs",
37
- "lint:js": "eslint --cache --ext .js,.jsx,.ts,.tsx,.cjs,.mjs --format=stylish ./src ./test ./scripts ./bin && npm run lint:deprecated",
38
- "lint:prettier": "prettier --check \"{src,test,docs,scripts,bin}/**/*.{js,cjs,mjs,jsx,tsx,ts,md,json}\" \"*.{js,cjs,mjs,jsx,tsx,ts,md,json}\"",
39
- "prettier": "prettier --write \"{src,test,docs,scripts,bin}/**/*.{js,cjs,mjs,jsx,tsx,ts,md,json}\" \"*.{js,cjs,mjs,jsx,tsx,ts,md,json}\"",
40
- "build": "tsc -p tsconfig.build.json",
41
- "prepare": "npm run build",
42
- "test": "npm run build && node --import tsx --test",
43
- "test:coverage": "npm run build && node ./scripts/run-test-coverage.cjs",
44
- "test:coverage:assert-full": "node ./dist/scripts/assert-full-coverage.js",
45
- "prepush:gate": "npm run lint && npm run test:coverage && npm run test:coverage:assert-full",
46
- "release:check-tag": "node ./scripts/ci/check-release-tag.cjs cli",
47
- "release:assert-unpublished": "node ./scripts/ci/release-version.cjs assert-unpublished",
48
- "clean": "node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\""
25
+ "access": "public",
26
+ "registry": "https://registry.npmjs.org/"
49
27
  },
50
28
  "lint-staged": {
51
- "**/*.{js,jsx,ts,tsx,cjs,mjs}": "npm run lint-staged:js --",
29
+ "**/*.{js,jsx,ts,tsx,cjs,mjs}": "oxlint --type-aware --format=stylish --deny-warnings",
52
30
  "**/*.{js,cjs,mjs,jsx,tsx,ts,md,json}": [
53
31
  "prettier --write"
54
32
  ]
55
33
  },
56
34
  "engines": {
57
- "node": ">=24 <25"
35
+ "node": ">=24 <25",
36
+ "pnpm": "11.23.0"
58
37
  },
59
38
  "keywords": [
60
39
  "tiangong-lca",
@@ -64,19 +43,40 @@
64
43
  ],
65
44
  "license": "MIT",
66
45
  "devDependencies": {
67
- "@eslint/js": "^10.0.1",
68
- "@types/node": "^24.12.2",
69
- "c8": "^11.0.0",
70
- "eslint": "^10.2.0",
71
- "globals": "^17.4.0",
72
- "lint-staged": "^16.4.0",
73
- "prettier": "^3.8.1",
74
- "tsx": "^4.21.0",
75
- "typescript": "^5.9.3",
76
- "typescript-eslint": "^8.58.0"
46
+ "@types/node": "^24.13.3",
47
+ "c8": "^12.0.0",
48
+ "lint-staged": "^17.3.0",
49
+ "oxlint": "^1.80.0",
50
+ "oxlint-tsgolint": "^7.0.2001",
51
+ "prettier": "3.8.1",
52
+ "tsx": "^4.23.12",
53
+ "typescript": "^7.0.2"
77
54
  },
78
55
  "dependencies": {
79
56
  "@supabase/supabase-js": "^2.101.1",
80
- "@tiangong-lca/tidas-sdk": "^0.1.45"
57
+ "@tiangong-lca/tidas-sdk": "^0.2.0"
58
+ },
59
+ "scripts": {
60
+ "start": "pnpm build && node ./bin/tiangong-lca.js",
61
+ "dev": "pnpm exec tsx watch src/main.ts",
62
+ "typecheck": "pnpm exec tsc --noEmit",
63
+ "tsc": "pnpm typecheck",
64
+ "lint": "pnpm lint:oxlint && pnpm lint:prettier && pnpm lint:coverage-guards && pnpm lint:data-api-consumers && pnpm typecheck",
65
+ "lint-staged": "pnpm exec lint-staged",
66
+ "lint:coverage-guards": "node ./scripts/assert-no-coverage-ignore.cjs",
67
+ "lint:data-api-consumers": "pnpm exec tsx ./scripts/scan-data-api-consumers.ts",
68
+ "lint:oxlint": "pnpm exec oxlint --type-aware --format=stylish --deny-warnings ./src ./test ./scripts ./bin",
69
+ "lint:prettier": "pnpm exec prettier --check \"{src,test,docs,scripts,bin}/**/*.{js,cjs,mjs,jsx,tsx,ts,md,json}\" \"*.{js,cjs,mjs,jsx,tsx,ts,md,json}\"",
70
+ "prettier": "pnpm exec prettier --write \"{src,test,docs,scripts,bin}/**/*.{js,cjs,mjs,jsx,tsx,ts,md,json}\" \"*.{js,cjs,mjs,jsx,tsx,ts,md,json}\"",
71
+ "prebuild": "pnpm clean",
72
+ "build": "pnpm exec tsc -p tsconfig.build.json",
73
+ "test": "pnpm build && node --import tsx --test",
74
+ "test:package": "node --test test/toolchain-contract.test.mjs",
75
+ "test:coverage": "pnpm build && node ./scripts/run-test-coverage.cjs",
76
+ "test:coverage:assert-full": "node ./dist/scripts/assert-full-coverage.js",
77
+ "prepush:gate": "pnpm lint && pnpm test:package && pnpm test:coverage && pnpm test:coverage:assert-full",
78
+ "release:check-tag": "node ./scripts/ci/check-release-tag.cjs cli",
79
+ "release:assert-unpublished": "node ./scripts/ci/release-version.cjs assert-unpublished",
80
+ "clean": "node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\""
81
81
  }
82
- }
82
+ }
@@ -1,77 +0,0 @@
1
- import { readdirSync, readFileSync } from 'node:fs';
2
- import path from 'node:path';
3
- const COVERAGE_METRIC_KEYS = ['lines', 'statements', 'functions', 'branches'];
4
- function listTrackedSourceFiles(rootDir, relativeDir) {
5
- const absoluteDir = path.join(rootDir, relativeDir);
6
- const entries = readdirSync(absoluteDir, { withFileTypes: true });
7
- const files = [];
8
- for (const entry of entries) {
9
- const relativePath = path.join(relativeDir, entry.name);
10
- if (entry.isDirectory()) {
11
- files.push(...listTrackedSourceFiles(rootDir, relativePath));
12
- continue;
13
- }
14
- if (relativePath.endsWith('.d.ts')) {
15
- continue;
16
- }
17
- if (relativePath.endsWith('.ts') || relativePath.endsWith('.js')) {
18
- files.push(path.join(rootDir, relativePath));
19
- }
20
- }
21
- return files;
22
- }
23
- function isCoverageMetric(value) {
24
- return Boolean(value &&
25
- typeof value === 'object' &&
26
- typeof value.total === 'number' &&
27
- typeof value.covered === 'number' &&
28
- typeof value.skipped === 'number' &&
29
- typeof value.pct === 'number');
30
- }
31
- function isCoverageFileSummary(value) {
32
- if (!value || typeof value !== 'object') {
33
- return false;
34
- }
35
- return COVERAGE_METRIC_KEYS.every((key) => isCoverageMetric(value[key]));
36
- }
37
- function aggregateCoverage(entries) {
38
- return Object.fromEntries(COVERAGE_METRIC_KEYS.map((key) => {
39
- const total = entries.reduce((sum, entry) => sum + entry[key].total, 0);
40
- const covered = entries.reduce((sum, entry) => sum + entry[key].covered, 0);
41
- const skipped = entries.reduce((sum, entry) => sum + entry[key].skipped, 0);
42
- return [
43
- key,
44
- {
45
- total,
46
- covered,
47
- skipped,
48
- pct: total === 0 ? 100 : (covered / total) * 100,
49
- },
50
- ];
51
- }));
52
- }
53
- const summaryPath = path.join(process.cwd(), 'coverage', 'coverage-summary.json');
54
- const summary = JSON.parse(readFileSync(summaryPath, 'utf8'));
55
- const coveredFiles = new Set(Object.keys(summary).filter((key) => key !== 'total'));
56
- const expectedFiles = listTrackedSourceFiles(process.cwd(), 'src');
57
- const expectedCoverageEntries = expectedFiles.map((filePath) => {
58
- const coverageEntry = summary[filePath];
59
- if (!isCoverageFileSummary(coverageEntry)) {
60
- throw new Error(`Expected coverage summary to include ${filePath}, but it was missing.`);
61
- }
62
- return coverageEntry;
63
- });
64
- const aggregate = aggregateCoverage(expectedCoverageEntries);
65
- for (const key of COVERAGE_METRIC_KEYS) {
66
- const value = aggregate[key];
67
- if (value.covered !== value.total || value.pct !== 100) {
68
- throw new Error(`Expected ${key} coverage across src files to equal 100 but received ${value.pct} (${value.covered}/${value.total}).`);
69
- }
70
- }
71
- for (const filePath of expectedFiles) {
72
- if (!coveredFiles.has(filePath)) {
73
- throw new Error(`Expected coverage summary to include ${filePath}, but it was missing.`);
74
- }
75
- }
76
- process.stdout.write('Coverage assertion passed: 100% on lines, statements, functions, and branches across src files.\n');
77
- //# sourceMappingURL=assert-full-coverage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assert-full-coverage.js","sourceRoot":"","sources":["../../scripts/assert-full-coverage.ts"],"names":[],"mappings":"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","sourcesContent":["import { readdirSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\n\ntype CoverageMetric = {\n total: number;\n covered: number;\n skipped: number;\n pct: number;\n};\n\ntype CoverageMetricKey = 'lines' | 'statements' | 'functions' | 'branches';\n\ntype CoverageFileSummary = Record<CoverageMetricKey, CoverageMetric>;\n\ntype CoverageSummary = {\n total: CoverageFileSummary;\n} & Record<string, unknown>;\n\nconst COVERAGE_METRIC_KEYS: CoverageMetricKey[] = ['lines', 'statements', 'functions', 'branches'];\n\nfunction listTrackedSourceFiles(rootDir: string, relativeDir: string): string[] {\n const absoluteDir = path.join(rootDir, relativeDir);\n const entries = readdirSync(absoluteDir, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const relativePath = path.join(relativeDir, entry.name);\n if (entry.isDirectory()) {\n files.push(...listTrackedSourceFiles(rootDir, relativePath));\n continue;\n }\n if (relativePath.endsWith('.d.ts')) {\n continue;\n }\n if (relativePath.endsWith('.ts') || relativePath.endsWith('.js')) {\n files.push(path.join(rootDir, relativePath));\n }\n }\n\n return files;\n}\n\nfunction isCoverageMetric(value: unknown): value is CoverageMetric {\n return Boolean(\n value &&\n typeof value === 'object' &&\n typeof (value as CoverageMetric).total === 'number' &&\n typeof (value as CoverageMetric).covered === 'number' &&\n typeof (value as CoverageMetric).skipped === 'number' &&\n typeof (value as CoverageMetric).pct === 'number',\n );\n}\n\nfunction isCoverageFileSummary(value: unknown): value is CoverageFileSummary {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n return COVERAGE_METRIC_KEYS.every((key) => isCoverageMetric((value as CoverageFileSummary)[key]));\n}\n\nfunction aggregateCoverage(entries: CoverageFileSummary[]): CoverageFileSummary {\n return Object.fromEntries(\n COVERAGE_METRIC_KEYS.map((key) => {\n const total = entries.reduce((sum, entry) => sum + entry[key].total, 0);\n const covered = entries.reduce((sum, entry) => sum + entry[key].covered, 0);\n const skipped = entries.reduce((sum, entry) => sum + entry[key].skipped, 0);\n return [\n key,\n {\n total,\n covered,\n skipped,\n pct: total === 0 ? 100 : (covered / total) * 100,\n },\n ];\n }),\n ) as CoverageFileSummary;\n}\n\nconst summaryPath = path.join(process.cwd(), 'coverage', 'coverage-summary.json');\nconst summary = JSON.parse(readFileSync(summaryPath, 'utf8')) as CoverageSummary;\nconst coveredFiles = new Set(Object.keys(summary).filter((key) => key !== 'total'));\nconst expectedFiles = listTrackedSourceFiles(process.cwd(), 'src');\nconst expectedCoverageEntries = expectedFiles.map((filePath) => {\n const coverageEntry = summary[filePath];\n\n if (!isCoverageFileSummary(coverageEntry)) {\n throw new Error(`Expected coverage summary to include ${filePath}, but it was missing.`);\n }\n\n return coverageEntry;\n});\nconst aggregate = aggregateCoverage(expectedCoverageEntries);\n\nfor (const key of COVERAGE_METRIC_KEYS) {\n const value = aggregate[key];\n if (value.covered !== value.total || value.pct !== 100) {\n throw new Error(\n `Expected ${key} coverage across src files to equal 100 but received ${value.pct} (${value.covered}/${value.total}).`,\n );\n }\n}\n\nfor (const filePath of expectedFiles) {\n if (!coveredFiles.has(filePath)) {\n throw new Error(`Expected coverage summary to include ${filePath}, but it was missing.`);\n }\n}\n\nprocess.stdout.write(\n 'Coverage assertion passed: 100% on lines, statements, functions, and branches across src files.\\n',\n);\n"]}