@mitre/hdf-validators 3.1.0 → 3.2.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
@@ -114,7 +114,7 @@ import (
114
114
  "fmt"
115
115
  "os"
116
116
 
117
- validators "github.com/mitre/hdf-libs/hdf-validators/go"
117
+ validators "github.com/mitre/hdf-libs/hdf-validators/go/v3"
118
118
  )
119
119
 
120
120
  func main() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../typescript/index.ts"],"mappings":";;AAkCA;;UAAiB,eAAA;EACf,KAAA;EACA,OAAA;EACA,KAAA;AAAA;;;AAMF;UAAiB,gBAAA;EACf,KAAA;EACA,MAAA,EAAQ,eAAA;EACR,eAAA;AAAA;;;;iBAuLc,eAAA,CAAgB,IAAA,YAAgB,gBAAA;AAAhD;;;AAAA,iBAQgB,gBAAA,CAAiB,IAAA,YAAgB,gBAAA;;AAAjD;;iBAQgB,kBAAA,CAAmB,IAAA,YAAgB,gBAAA;;;AAAnD;iBAQgB,cAAA,CAAe,IAAA,YAAgB,gBAAA;;;;iBAQ/B,YAAA,CAAa,IAAA,YAAgB,gBAAA;;;;iBAQ7B,kBAAA,CAAmB,IAAA,YAAgB,gBAAA;AARnD;;;AAAA,iBAgBgB,uBAAA,CAAwB,IAAA,YAAgB,gBAAA;;AARxD;;iBAgBgB,QAAA,CAAS,IAAA,YAAgB,gBAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../typescript/index.ts"],"mappings":";;AAkCA;;UAAiB,eAAA;EACf,KAAA;EACA,OAAA;EACA,KAAA;AAAA;;AAAK;AAMP;UAAiB,gBAAA;EACf,KAAA;EACA,MAAA,EAAQ,eAAe;EACvB,eAAA;AAAA;;;;iBAuLc,eAAA,CAAgB,IAAA,YAAgB,gBAAgB;AAAhE;;;AAAA,iBAQgB,gBAAA,CAAiB,IAAA,YAAgB,gBAAgB;AARD;AAQhE;;AARgE,iBAgBhD,kBAAA,CAAmB,IAAA,YAAgB,gBAAgB;;AARF;AAQjE;iBAQgB,cAAA,CAAe,IAAA,YAAgB,gBAAgB;;;AARI;iBAgBnD,YAAA,CAAa,IAAA,YAAgB,gBAAgB;;;;iBAQ7C,kBAAA,CAAmB,IAAA,YAAgB,gBAAgB;AARnE;;;AAAA,iBAgBgB,uBAAA,CAAwB,IAAA,YAAgB,gBAAgB;AAhBX;AAQ7D;;AAR6D,iBAwB7C,QAAA,CAAS,IAAA,YAAgB,gBAAgB"}
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} 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(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 'mode' and 'sources' at root\n if ('mode' in obj && 'sources' 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 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} 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(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 'mode' and 'sources' at root\n if ('mode' in obj && 'sources' 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.1.0",
3
+ "version": "3.2.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.1.0"
30
+ "@mitre/hdf-schema": "^3.2.0"
31
31
  },
32
32
  "engines": {
33
33
  "node": ">=22.0.0"