@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;;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"} | ||
| {"version":3,"file":"index.d.ts","names":[],"sources":["../typescript/index.ts"],"mappings":";;AAsCA;;UAAiB,eAAA;EACf,KAAA;EACA,OAAA;EACA,KAAA;AAAA;;AAAK;AAMP;UAAiB,gBAAA;EACf,KAAA;EACA,MAAA,EAAQ,eAAe;EACvB,eAAA;AAAA;;;;iBA2Lc,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"} |
+6
-2
| import Ajv from "ajv"; | ||
| import addFormats from "ajv-formats"; | ||
| import { amendmentsSchema, commonSchema, comparisonSchema, componentSchema, dataFlowSchema, extensionsSchema, hdfAmendmentsSchema, hdfBaselineSchema, hdfComparisonSchema, hdfEvidencePackageSchema, hdfPlanSchema, hdfResultsSchema, hdfSystemSchema, parameterSchema, planSchema, platformSchema, resultSchema, runnerSchema, statisticsSchema, systemSchema, targetSchema } from "@mitre/hdf-schema"; | ||
| import { affectedPackageSchema, amendmentsSchema, 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"; | ||
| //#region typescript/index.ts | ||
@@ -24,2 +24,6 @@ /** | ||
| ajv.addSchema(parameterSchema); | ||
| ajv.addSchema(cvssSchema); | ||
| ajv.addSchema(epssSchema); | ||
| ajv.addSchema(kevSchema); | ||
| ajv.addSchema(affectedPackageSchema); | ||
| ajv.addSchema(amendmentsSchema); | ||
@@ -176,3 +180,3 @@ ajv.addSchema(extensionsSchema); | ||
| if ("name" in obj && "overrides" in obj) return validateAmendments(data); | ||
| if ("mode" in obj && "sources" in obj) return validateComparison(data); | ||
| if ("requirementDiffs" in obj) return validateComparison(data); | ||
| if ("name" in obj && "contents" in obj) return validateEvidencePackage(data); | ||
@@ -179,0 +183,0 @@ } |
@@ -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 cvssSchema,\n epssSchema,\n kevSchema,\n affectedPackageSchema,\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(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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"} |
+4
-3
| { | ||
| "name": "@mitre/hdf-validators", | ||
| "version": "3.2.0", | ||
| "version": "3.3.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.2.0" | ||
| "@mitre/hdf-schema": "^3.3.0" | ||
| }, | ||
@@ -44,3 +44,4 @@ "engines": { | ||
| "@stryker-mutator/core": "^9.5.1", | ||
| "@stryker-mutator/vitest-runner": "^9.5.1" | ||
| "@stryker-mutator/vitest-runner": "^9.5.1", | ||
| "@mitre/hdf-fixtures": "^3.3.0" | ||
| }, | ||
@@ -47,0 +48,0 @@ "scripts": { |
35989
1.68%241
1.69%3
50%Updated