@mitre/hdf-validators 3.4.4 → 3.5.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.
package/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # @mitre/hdf-validators
2
2
 
3
- JSON Schema validation for Heimdall Data Format (HDF) documents. Validates all 7 HDF document types against their official schemas to ensure structural correctness and data integrity.
3
+ JSON Schema validation for Heimdall Data Format (HDF) documents. Validates all 8 HDF document types against their official schemas to ensure structural correctness and data integrity.
4
4
 
5
5
  ## Scope and Responsibilities
6
6
 
7
7
  **hdf-validators** provides schema-based validation:
8
- - Validate all HDF document types: Results, Baseline, System, Plan, Amendments, Evidence Package, Comparison
8
+ - Validate all HDF document types: Results, Baseline, System, Plan, Amendments, Evidence Package, Comparison, Requirement Change Event
9
9
  - Auto-detect document type via the generic `validate()` function
10
10
  - Detailed error reporting with field-level validation messages
11
11
  - Support for both TypeScript and Go implementations
@@ -214,6 +214,14 @@ Validate data against the HDF Evidence Package schema.
214
214
  - `data` - JavaScript object to validate
215
215
  - **Returns:** `ValidationResult` with validation status and errors
216
216
 
217
+ #### `validateRequirementChangeEvent(data: unknown): ValidationResult`
218
+
219
+ Validate data against the HDF Requirement Change Event schema.
220
+
221
+ - **Parameters:**
222
+ - `data` - JavaScript object to validate
223
+ - **Returns:** `ValidationResult` with validation status and errors
224
+
217
225
  #### `validate(data: unknown): ValidationResult`
218
226
 
219
227
  Auto-detect document type and validate.
@@ -266,7 +274,7 @@ Validate JSON bytes against specified schema type.
266
274
 
267
275
  - **Parameters:**
268
276
  - `data` - JSON bytes to validate
269
- - `schemaType` - one of `TypeResults`, `TypeBaseline`, `TypeComparison`, `TypeSystem`, `TypePlan`, `TypeAmendments`, `TypeEvidencePackage`
277
+ - `schemaType` - one of `TypeResults`, `TypeBaseline`, `TypeComparison`, `TypeSystem`, `TypePlan`, `TypeAmendments`, `TypeEvidencePackage`, `TypeRequirementChangeEvent`
270
278
  - **Returns:** `ValidationResult` with validation status and errors
271
279
 
272
280
  #### `SetSchemaDir(dir string)`
package/dist/index.d.ts CHANGED
@@ -27,6 +27,10 @@ declare function validateBaseline(data: unknown): ValidationResult;
27
27
  * Validate HDF Comparison document against schema
28
28
  */
29
29
  declare function validateComparison(data: unknown): ValidationResult;
30
+ /**
31
+ * Validate an HDF Requirement Change Event (one continuous-monitoring wire event) against schema
32
+ */
33
+ declare function validateRequirementChangeEvent(data: unknown): ValidationResult;
30
34
  /**
31
35
  * Validate HDF System document against schema
32
36
  */
@@ -48,5 +52,5 @@ declare function validateEvidencePackage(data: unknown): ValidationResult;
48
52
  */
49
53
  declare function validate(data: unknown): ValidationResult;
50
54
  //#endregion
51
- export { ValidationError, ValidationResult, validate, validateAmendments, validateBaseline, validateComparison, validateEvidencePackage, validatePlan, validateResults, validateSystem };
55
+ export { ValidationError, ValidationResult, validate, validateAmendments, validateBaseline, validateComparison, validateEvidencePackage, validatePlan, validateRequirementChangeEvent, validateResults, validateSystem };
52
56
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../typescript/index.ts"],"mappings":";;;;UAuCiB;EACf;EACA;EACA;;;;;UAMe;EACf;EACA,QAAQ;EACR;;;;;iBA4Lc,gBAAgB,gBAAgB;;;;iBAQhC,iBAAiB,gBAAgB;;;;iBAQjC,mBAAmB,gBAAgB;;;;iBAQnC,eAAe,gBAAgB;;;;iBAQ/B,aAAa,gBAAgB;;;;iBAQ7B,mBAAmB,gBAAgB;;;;iBAQnC,wBAAwB,gBAAgB;;;;iBAQxC,SAAS,gBAAgB"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../typescript/index.ts"],"mappings":";;;;UAyCiB;EACf;EACA;EACA;;;;;UAMe;EACf;EACA,QAAQ;EACR;;;;;iBAsMc,gBAAgB,gBAAgB;;;;iBAQhC,iBAAiB,gBAAgB;;;;iBAQjC,mBAAmB,gBAAgB;;;;iBAQnC,+BAA+B,gBAAgB;;;;iBAQ/C,eAAe,gBAAgB;;;;iBAQ/B,aAAa,gBAAgB;;;;iBAQ7B,mBAAmB,gBAAgB;;;;iBAQnC,wBAAwB,gBAAgB;;;;iBAQxC,SAAS,gBAAgB"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import Ajv from "ajv";
2
2
  import addFormats from "ajv-formats";
3
- import { affectedPackageSchema, amendmentsSchema, bomSchema, commonSchema, comparisonSchema, componentSchema, cvssSchema, dataFlowSchema, epssSchema, extensionsSchema, hdfAmendmentsSchema, hdfBaselineSchema, hdfComparisonSchema, hdfEvidencePackageSchema, hdfPlanSchema, hdfResultsSchema, hdfSystemSchema, kevSchema, parameterSchema, planSchema, platformSchema, resultSchema, runnerSchema, statisticsSchema, systemSchema, targetSchema } from "@mitre/hdf-schema";
3
+ import { affectedPackageSchema, amendmentsSchema, bomSchema, commonSchema, comparisonSchema, componentSchema, cvssSchema, dataFlowSchema, epssSchema, eventsSchema, extensionsSchema, hdfAmendmentsSchema, hdfBaselineSchema, hdfComparisonSchema, hdfEvidencePackageSchema, hdfPlanSchema, hdfRequirementChangeEventSchema, hdfResultsSchema, hdfSystemSchema, kevSchema, parameterSchema, planSchema, platformSchema, resultSchema, runnerSchema, statisticsSchema, systemSchema, targetSchema } from "@mitre/hdf-schema";
4
4
  //#region typescript/index.ts
5
5
  /**
6
6
  * Create and configure Ajv instance with all HDF schemas
@@ -31,6 +31,7 @@ function createValidator() {
31
31
  ajv.addSchema(systemSchema);
32
32
  ajv.addSchema(planSchema);
33
33
  ajv.addSchema(comparisonSchema);
34
+ ajv.addSchema(eventsSchema);
34
35
  ajv.addSchema(componentSchema);
35
36
  ajv.addSchema(dataFlowSchema);
36
37
  ajv.addSchema(hdfResultsSchema);
@@ -39,6 +40,7 @@ function createValidator() {
39
40
  ajv.addSchema(hdfSystemSchema);
40
41
  ajv.addSchema(hdfPlanSchema);
41
42
  ajv.addSchema(hdfAmendmentsSchema);
43
+ ajv.addSchema(hdfRequirementChangeEventSchema);
42
44
  ajv.addSchema(hdfEvidencePackageSchema);
43
45
  return ajv;
44
46
  }
@@ -50,6 +52,7 @@ let systemValidator = null;
50
52
  let planValidator = null;
51
53
  let amendmentsValidator = null;
52
54
  let evidencePackageValidator = null;
55
+ let requirementChangeEventValidator = null;
53
56
  function getResultsValidator() {
54
57
  if (!resultsValidator) resultsValidator = ajv.compile(hdfResultsSchema);
55
58
  return resultsValidator;
@@ -62,6 +65,10 @@ function getComparisonValidator() {
62
65
  if (!comparisonValidator) comparisonValidator = ajv.compile(hdfComparisonSchema);
63
66
  return comparisonValidator;
64
67
  }
68
+ function getRequirementChangeEventValidator() {
69
+ if (!requirementChangeEventValidator) requirementChangeEventValidator = ajv.compile(hdfRequirementChangeEventSchema);
70
+ return requirementChangeEventValidator;
71
+ }
65
72
  function getSystemValidator() {
66
73
  if (!systemValidator) systemValidator = ajv.compile(hdfSystemSchema);
67
74
  return systemValidator;
@@ -143,6 +150,12 @@ function validateComparison(data) {
143
150
  return createResult(getComparisonValidator(), data);
144
151
  }
145
152
  /**
153
+ * Validate an HDF Requirement Change Event (one continuous-monitoring wire event) against schema
154
+ */
155
+ function validateRequirementChangeEvent(data) {
156
+ return createResult(getRequirementChangeEventValidator(), data);
157
+ }
158
+ /**
146
159
  * Validate HDF System document against schema
147
160
  */
148
161
  function validateSystem(data) {
@@ -187,6 +200,6 @@ function validate(data) {
187
200
  return resultsResult;
188
201
  }
189
202
  //#endregion
190
- export { validate, validateAmendments, validateBaseline, validateComparison, validateEvidencePackage, validatePlan, validateResults, validateSystem };
203
+ export { validate, validateAmendments, validateBaseline, validateComparison, validateEvidencePackage, validatePlan, validateRequirementChangeEvent, validateResults, validateSystem };
191
204
 
192
205
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../typescript/index.ts"],"sourcesContent":["import Ajv, { type ValidateFunction, type ErrorObject } from 'ajv';\nimport addFormats from 'ajv-formats';\n\n// Named JS-object schema imports — the schemas are inlined into\n// @mitre/hdf-schema's dist/index.js at build time, so downstream consumers\n// never see raw JSON imports. Works uniformly in raw Node ESM, Vite/Nuxt,\n// webpack, esbuild — no consumer-side noExternal configuration required.\nimport {\n hdfResultsSchema,\n hdfBaselineSchema,\n hdfComparisonSchema,\n hdfSystemSchema,\n hdfPlanSchema,\n hdfAmendmentsSchema,\n hdfEvidencePackageSchema,\n commonSchema,\n extensionsSchema,\n platformSchema,\n resultSchema,\n runnerSchema,\n statisticsSchema,\n targetSchema,\n parameterSchema,\n systemSchema,\n planSchema,\n amendmentsSchema,\n comparisonSchema,\n componentSchema,\n dataFlowSchema,\n cvssSchema,\n epssSchema,\n kevSchema,\n affectedPackageSchema,\n bomSchema,\n} from '@mitre/hdf-schema';\n\n/**\n * Validation error details\n */\nexport interface ValidationError {\n field: string;\n message: string;\n value?: unknown;\n}\n\n/**\n * Result of schema validation\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n getErrorMessage(): string;\n}\n\n/**\n * Create and configure Ajv instance with all HDF schemas\n */\nfunction createValidator(): Ajv {\n const ajv = new Ajv({\n allErrors: true,\n verbose: true,\n strict: false,\n validateFormats: true,\n validateSchema: false // Skip meta-schema validation for performance\n });\n\n // Add format validators (date-time, uri, etc.)\n addFormats(ajv);\n\n // Add all primitive schemas so they can be referenced via $ref\n ajv.addSchema(commonSchema);\n ajv.addSchema(platformSchema);\n ajv.addSchema(resultSchema);\n ajv.addSchema(runnerSchema);\n ajv.addSchema(statisticsSchema);\n ajv.addSchema(targetSchema);\n ajv.addSchema(parameterSchema);\n ajv.addSchema(cvssSchema); // CVE-ecosystem primitives: referenced by Evaluated_Requirement + overrides\n ajv.addSchema(epssSchema);\n ajv.addSchema(kevSchema);\n ajv.addSchema(affectedPackageSchema);\n ajv.addSchema(bomSchema); // referenced by Base_Component.boms[]\n ajv.addSchema(amendmentsSchema); // before extensions (extensions $refs amendments Override_Type)\n ajv.addSchema(extensionsSchema);\n ajv.addSchema(systemSchema);\n ajv.addSchema(planSchema);\n ajv.addSchema(comparisonSchema);\n ajv.addSchema(componentSchema);\n ajv.addSchema(dataFlowSchema);\n\n // Register top-level schemas so cross-schema $refs resolve.\n // The comparison primitive references hdf-results#/$defs/Evaluated_Requirement,\n // so hdf-results must be registered before compiling comparison.\n // Schemas are compiled lazily (in getXxxValidator) for performance.\n ajv.addSchema(hdfResultsSchema);\n ajv.addSchema(hdfBaselineSchema);\n ajv.addSchema(hdfComparisonSchema);\n ajv.addSchema(hdfSystemSchema);\n ajv.addSchema(hdfPlanSchema);\n ajv.addSchema(hdfAmendmentsSchema);\n ajv.addSchema(hdfEvidencePackageSchema);\n\n return ajv;\n}\n\n// Singleton Ajv instance\nconst ajv = createValidator();\n\n// Compile schemas once (lazy initialization)\nlet resultsValidator: ValidateFunction | null = null;\nlet baselineValidator: ValidateFunction | null = null;\nlet comparisonValidator: ValidateFunction | null = null;\nlet systemValidator: ValidateFunction | null = null;\nlet planValidator: ValidateFunction | null = null;\nlet amendmentsValidator: ValidateFunction | null = null;\nlet evidencePackageValidator: ValidateFunction | null = null;\n\nfunction getResultsValidator(): ValidateFunction {\n if (!resultsValidator) {\n resultsValidator = ajv.compile(hdfResultsSchema);\n }\n return resultsValidator;\n}\n\nfunction getBaselineValidator(): ValidateFunction {\n if (!baselineValidator) {\n baselineValidator = ajv.compile(hdfBaselineSchema);\n }\n return baselineValidator;\n}\n\nfunction getComparisonValidator(): ValidateFunction {\n if (!comparisonValidator) {\n comparisonValidator = ajv.compile(hdfComparisonSchema);\n }\n return comparisonValidator;\n}\n\nfunction getSystemValidator(): ValidateFunction {\n if (!systemValidator) {\n systemValidator = ajv.compile(hdfSystemSchema);\n }\n return systemValidator;\n}\n\nfunction getPlanValidator(): ValidateFunction {\n if (!planValidator) {\n planValidator = ajv.compile(hdfPlanSchema);\n }\n return planValidator;\n}\n\nfunction getAmendmentsValidator(): ValidateFunction {\n if (!amendmentsValidator) {\n amendmentsValidator = ajv.compile(hdfAmendmentsSchema);\n }\n return amendmentsValidator;\n}\n\nfunction getEvidencePackageValidator(): ValidateFunction {\n if (!evidencePackageValidator) {\n evidencePackageValidator = ajv.compile(hdfEvidencePackageSchema);\n }\n return evidencePackageValidator;\n}\n\n/**\n * Convert Ajv errors to ValidationError format\n */\nfunction formatErrors(errors: ErrorObject[] | null | undefined): ValidationError[] {\n if (!errors || errors.length === 0) {\n return [];\n }\n\n return errors.map(err => {\n // Clean up field path (remove leading slash, use dot notation)\n let field = err.instancePath\n .replace(/^\\//, '')\n .replace(/\\//g, '.');\n\n // If field is empty, use the data path from the error\n if (!field && err.schemaPath) {\n const pathParts = err.schemaPath.split('/');\n field = pathParts[pathParts.length - 1] || '(root)';\n }\n\n // Build message\n let message = err.message || 'validation failed';\n if (err.params) {\n // Add parameter info for more context\n if ('missingProperty' in err.params) {\n field = field ? `${field}.${err.params.missingProperty}` : err.params.missingProperty;\n message = 'is required';\n } else if ('additionalProperty' in err.params) {\n field = field ? `${field}.${err.params.additionalProperty}` : err.params.additionalProperty;\n message = 'is not allowed';\n } else if ('limit' in err.params) {\n message = `${message} (limit: ${err.params.limit})`;\n }\n }\n\n return {\n field: field || '(root)',\n message,\n value: err.data\n };\n });\n}\n\n/**\n * Create ValidationResult from validator output\n */\nfunction createResult(validator: ValidateFunction, data: unknown): ValidationResult {\n const valid = validator(data);\n\n const errors = formatErrors(validator.errors);\n\n return {\n valid: valid === true,\n errors,\n getErrorMessage(): string {\n if (this.valid) {\n return '';\n }\n return this.errors\n .map(e => {\n if (e.field === '(root)') {\n return e.message;\n }\n return `${e.field}: ${e.message}`;\n })\n .join('; ');\n }\n };\n}\n\n/**\n * Validate HDF Results document against schema\n */\nexport function validateResults(data: unknown): ValidationResult {\n const validator = getResultsValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF Baseline document against schema\n */\nexport function validateBaseline(data: unknown): ValidationResult {\n const validator = getBaselineValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF Comparison document against schema\n */\nexport function validateComparison(data: unknown): ValidationResult {\n const validator = getComparisonValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF System document against schema\n */\nexport function validateSystem(data: unknown): ValidationResult {\n const validator = getSystemValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF Plan document against schema\n */\nexport function validatePlan(data: unknown): ValidationResult {\n const validator = getPlanValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF Amendments document against schema\n */\nexport function validateAmendments(data: unknown): ValidationResult {\n const validator = getAmendmentsValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF Evidence Package document against schema\n */\nexport function validateEvidencePackage(data: unknown): ValidationResult {\n const validator = getEvidencePackageValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF document (auto-detect type based on structure)\n */\nexport function validate(data: unknown): ValidationResult {\n if (typeof data === 'object' && data !== null) {\n const obj = data as Record<string, unknown>;\n\n // HDF Results has 'baselines' array at root\n if ('baselines' in obj) {\n return validateResults(data);\n }\n\n // HDF Baseline has 'name' and 'requirements' at root\n if ('name' in obj && 'requirements' in obj) {\n return validateBaseline(data);\n }\n\n // HDF System has 'name' and 'components' at root\n if ('name' in obj && 'components' in obj) {\n return validateSystem(data);\n }\n\n // HDF Plan has 'name' and 'assessments' at root\n if ('name' in obj && 'assessments' in obj) {\n return validatePlan(data);\n }\n\n // HDF Amendments has 'name' and 'overrides' at root\n if ('name' in obj && 'overrides' in obj) {\n return validateAmendments(data);\n }\n\n // HDF Comparison has 'requirementDiffs' at root (unique discriminator)\n if ('requirementDiffs' in obj) {\n return validateComparison(data);\n }\n\n // HDF Evidence Package has 'name' and 'contents' at root\n if ('name' in obj && 'contents' in obj) {\n return validateEvidencePackage(data);\n }\n }\n\n // Cannot determine type, try results first (most common)\n const resultsResult = validateResults(data);\n if (resultsResult.valid) {\n return resultsResult;\n }\n\n const baselineResult = validateBaseline(data);\n if (baselineResult.valid) {\n return baselineResult;\n }\n\n return resultsResult;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../typescript/index.ts"],"sourcesContent":["import Ajv, { type ValidateFunction, type ErrorObject } from 'ajv';\nimport addFormats from 'ajv-formats';\n\n// Named JS-object schema imports — the schemas are inlined into\n// @mitre/hdf-schema's dist/index.js at build time, so downstream consumers\n// never see raw JSON imports. Works uniformly in raw Node ESM, Vite/Nuxt,\n// webpack, esbuild — no consumer-side noExternal configuration required.\nimport {\n hdfResultsSchema,\n hdfBaselineSchema,\n hdfComparisonSchema,\n hdfSystemSchema,\n hdfPlanSchema,\n hdfAmendmentsSchema,\n hdfEvidencePackageSchema,\n hdfRequirementChangeEventSchema,\n commonSchema,\n eventsSchema,\n extensionsSchema,\n platformSchema,\n resultSchema,\n runnerSchema,\n statisticsSchema,\n targetSchema,\n parameterSchema,\n systemSchema,\n planSchema,\n amendmentsSchema,\n comparisonSchema,\n componentSchema,\n dataFlowSchema,\n cvssSchema,\n epssSchema,\n kevSchema,\n affectedPackageSchema,\n bomSchema,\n} from '@mitre/hdf-schema';\n\n/**\n * Validation error details\n */\nexport interface ValidationError {\n field: string;\n message: string;\n value?: unknown;\n}\n\n/**\n * Result of schema validation\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n getErrorMessage(): string;\n}\n\n/**\n * Create and configure Ajv instance with all HDF schemas\n */\nfunction createValidator(): Ajv {\n const ajv = new Ajv({\n allErrors: true,\n verbose: true,\n strict: false,\n validateFormats: true,\n validateSchema: false // Skip meta-schema validation for performance\n });\n\n // Add format validators (date-time, uri, etc.)\n addFormats(ajv);\n\n // Add all primitive schemas so they can be referenced via $ref\n ajv.addSchema(commonSchema);\n ajv.addSchema(platformSchema);\n ajv.addSchema(resultSchema);\n ajv.addSchema(runnerSchema);\n ajv.addSchema(statisticsSchema);\n ajv.addSchema(targetSchema);\n ajv.addSchema(parameterSchema);\n ajv.addSchema(cvssSchema); // CVE-ecosystem primitives: referenced by Evaluated_Requirement + overrides\n ajv.addSchema(epssSchema);\n ajv.addSchema(kevSchema);\n ajv.addSchema(affectedPackageSchema);\n ajv.addSchema(bomSchema); // referenced by Base_Component.boms[]\n ajv.addSchema(amendmentsSchema); // before extensions (extensions $refs amendments Override_Type)\n ajv.addSchema(extensionsSchema);\n ajv.addSchema(systemSchema);\n ajv.addSchema(planSchema);\n ajv.addSchema(comparisonSchema);\n ajv.addSchema(eventsSchema); // change-event envelope (referenced by hdf-requirement-change-event)\n ajv.addSchema(componentSchema);\n ajv.addSchema(dataFlowSchema);\n\n // Register top-level schemas so cross-schema $refs resolve.\n // The comparison primitive references hdf-results#/$defs/Evaluated_Requirement,\n // so hdf-results must be registered before compiling comparison.\n // Schemas are compiled lazily (in getXxxValidator) for performance.\n ajv.addSchema(hdfResultsSchema);\n ajv.addSchema(hdfBaselineSchema);\n ajv.addSchema(hdfComparisonSchema);\n ajv.addSchema(hdfSystemSchema);\n ajv.addSchema(hdfPlanSchema);\n ajv.addSchema(hdfAmendmentsSchema);\n ajv.addSchema(hdfRequirementChangeEventSchema);\n ajv.addSchema(hdfEvidencePackageSchema);\n\n return ajv;\n}\n\n// Singleton Ajv instance\nconst ajv = createValidator();\n\n// Compile schemas once (lazy initialization)\nlet resultsValidator: ValidateFunction | null = null;\nlet baselineValidator: ValidateFunction | null = null;\nlet comparisonValidator: ValidateFunction | null = null;\nlet systemValidator: ValidateFunction | null = null;\nlet planValidator: ValidateFunction | null = null;\nlet amendmentsValidator: ValidateFunction | null = null;\nlet evidencePackageValidator: ValidateFunction | null = null;\nlet requirementChangeEventValidator: ValidateFunction | null = null;\n\nfunction getResultsValidator(): ValidateFunction {\n if (!resultsValidator) {\n resultsValidator = ajv.compile(hdfResultsSchema);\n }\n return resultsValidator;\n}\n\nfunction getBaselineValidator(): ValidateFunction {\n if (!baselineValidator) {\n baselineValidator = ajv.compile(hdfBaselineSchema);\n }\n return baselineValidator;\n}\n\nfunction getComparisonValidator(): ValidateFunction {\n if (!comparisonValidator) {\n comparisonValidator = ajv.compile(hdfComparisonSchema);\n }\n return comparisonValidator;\n}\n\nfunction getRequirementChangeEventValidator(): ValidateFunction {\n if (!requirementChangeEventValidator) {\n requirementChangeEventValidator = ajv.compile(hdfRequirementChangeEventSchema);\n }\n return requirementChangeEventValidator;\n}\n\nfunction getSystemValidator(): ValidateFunction {\n if (!systemValidator) {\n systemValidator = ajv.compile(hdfSystemSchema);\n }\n return systemValidator;\n}\n\nfunction getPlanValidator(): ValidateFunction {\n if (!planValidator) {\n planValidator = ajv.compile(hdfPlanSchema);\n }\n return planValidator;\n}\n\nfunction getAmendmentsValidator(): ValidateFunction {\n if (!amendmentsValidator) {\n amendmentsValidator = ajv.compile(hdfAmendmentsSchema);\n }\n return amendmentsValidator;\n}\n\nfunction getEvidencePackageValidator(): ValidateFunction {\n if (!evidencePackageValidator) {\n evidencePackageValidator = ajv.compile(hdfEvidencePackageSchema);\n }\n return evidencePackageValidator;\n}\n\n/**\n * Convert Ajv errors to ValidationError format\n */\nfunction formatErrors(errors: ErrorObject[] | null | undefined): ValidationError[] {\n if (!errors || errors.length === 0) {\n return [];\n }\n\n return errors.map(err => {\n // Clean up field path (remove leading slash, use dot notation)\n let field = err.instancePath\n .replace(/^\\//, '')\n .replace(/\\//g, '.');\n\n // If field is empty, use the data path from the error\n if (!field && err.schemaPath) {\n const pathParts = err.schemaPath.split('/');\n field = pathParts[pathParts.length - 1] || '(root)';\n }\n\n // Build message\n let message = err.message || 'validation failed';\n if (err.params) {\n // Add parameter info for more context\n if ('missingProperty' in err.params) {\n field = field ? `${field}.${err.params.missingProperty}` : err.params.missingProperty;\n message = 'is required';\n } else if ('additionalProperty' in err.params) {\n field = field ? `${field}.${err.params.additionalProperty}` : err.params.additionalProperty;\n message = 'is not allowed';\n } else if ('limit' in err.params) {\n message = `${message} (limit: ${err.params.limit})`;\n }\n }\n\n return {\n field: field || '(root)',\n message,\n value: err.data\n };\n });\n}\n\n/**\n * Create ValidationResult from validator output\n */\nfunction createResult(validator: ValidateFunction, data: unknown): ValidationResult {\n const valid = validator(data);\n\n const errors = formatErrors(validator.errors);\n\n return {\n valid: valid === true,\n errors,\n getErrorMessage(): string {\n if (this.valid) {\n return '';\n }\n return this.errors\n .map(e => {\n if (e.field === '(root)') {\n return e.message;\n }\n return `${e.field}: ${e.message}`;\n })\n .join('; ');\n }\n };\n}\n\n/**\n * Validate HDF Results document against schema\n */\nexport function validateResults(data: unknown): ValidationResult {\n const validator = getResultsValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF Baseline document against schema\n */\nexport function validateBaseline(data: unknown): ValidationResult {\n const validator = getBaselineValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF Comparison document against schema\n */\nexport function validateComparison(data: unknown): ValidationResult {\n const validator = getComparisonValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate an HDF Requirement Change Event (one continuous-monitoring wire event) against schema\n */\nexport function validateRequirementChangeEvent(data: unknown): ValidationResult {\n const validator = getRequirementChangeEventValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF System document against schema\n */\nexport function validateSystem(data: unknown): ValidationResult {\n const validator = getSystemValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF Plan document against schema\n */\nexport function validatePlan(data: unknown): ValidationResult {\n const validator = getPlanValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF Amendments document against schema\n */\nexport function validateAmendments(data: unknown): ValidationResult {\n const validator = getAmendmentsValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF Evidence Package document against schema\n */\nexport function validateEvidencePackage(data: unknown): ValidationResult {\n const validator = getEvidencePackageValidator();\n return createResult(validator, data);\n}\n\n/**\n * Validate HDF document (auto-detect type based on structure)\n */\nexport function validate(data: unknown): ValidationResult {\n if (typeof data === 'object' && data !== null) {\n const obj = data as Record<string, unknown>;\n\n // HDF Results has 'baselines' array at root\n if ('baselines' in obj) {\n return validateResults(data);\n }\n\n // HDF Baseline has 'name' and 'requirements' at root\n if ('name' in obj && 'requirements' in obj) {\n return validateBaseline(data);\n }\n\n // HDF System has 'name' and 'components' at root\n if ('name' in obj && 'components' in obj) {\n return validateSystem(data);\n }\n\n // HDF Plan has 'name' and 'assessments' at root\n if ('name' in obj && 'assessments' in obj) {\n return validatePlan(data);\n }\n\n // HDF Amendments has 'name' and 'overrides' at root\n if ('name' in obj && 'overrides' in obj) {\n return validateAmendments(data);\n }\n\n // HDF Comparison has 'requirementDiffs' at root (unique discriminator)\n if ('requirementDiffs' in obj) {\n return validateComparison(data);\n }\n\n // HDF Evidence Package has 'name' and 'contents' at root\n if ('name' in obj && 'contents' in obj) {\n return validateEvidencePackage(data);\n }\n }\n\n // Cannot determine type, try results first (most common)\n const resultsResult = validateResults(data);\n if (resultsResult.valid) {\n return resultsResult;\n }\n\n const baselineResult = validateBaseline(data);\n if (baselineResult.valid) {\n return baselineResult;\n }\n\n return resultsResult;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mitre/hdf-validators",
3
- "version": "3.4.4",
3
+ "version": "3.5.0",
4
4
  "description": "JSON Schema validation for HDF documents (Results and Baselines)",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -27,7 +27,7 @@
27
27
  "dependencies": {
28
28
  "ajv": "^8.17.1",
29
29
  "ajv-formats": "^3.0.1",
30
- "@mitre/hdf-schema": "^3.4.4"
30
+ "@mitre/hdf-schema": "^3.5.0"
31
31
  },
32
32
  "engines": {
33
33
  "node": ">=22.0.0"
@@ -41,7 +41,7 @@
41
41
  "devDependencies": {
42
42
  "@stryker-mutator/core": "^9.5.1",
43
43
  "@stryker-mutator/vitest-runner": "^9.5.1",
44
- "@mitre/hdf-fixtures": "^3.4.4"
44
+ "@mitre/hdf-fixtures": "^3.5.0"
45
45
  },
46
46
  "scripts": {
47
47
  "build": "tsdown",