@mitre/hdf-validators
Advanced tools
@@ -1,1 +0,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"} | ||
| {"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"} |
@@ -1,1 +0,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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"} | ||
| {"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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"} |
+2
-2
| { | ||
| "name": "@mitre/hdf-validators", | ||
| "version": "3.1.0", | ||
| "version": "3.2.0", | ||
| "description": "JSON Schema validation for HDF documents (Results and Baselines)", | ||
@@ -30,3 +30,3 @@ "publishConfig": { | ||
| "ajv-formats": "^3.0.1", | ||
| "@mitre/hdf-schema": "^3.1.0" | ||
| "@mitre/hdf-schema": "^3.2.0" | ||
| }, | ||
@@ -33,0 +33,0 @@ "engines": { |
+1
-1
@@ -117,3 +117,3 @@ # @mitre/hdf-validators | ||
| validators "github.com/mitre/hdf-libs/hdf-validators/go" | ||
| validators "github.com/mitre/hdf-libs/hdf-validators/go/v3" | ||
| ) | ||
@@ -120,0 +120,0 @@ |
35394
0.42%Updated