ata-validator 1.2.0 → 1.2.2

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/CHANGELOG.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
  All notable changes to ata-validator are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/), and this project adheres to semantic versioning.
4
4
 
5
+ ## 1.2.2 - 2026-07-26
6
+
7
+ ### Fixed
8
+
9
+ - The `uri` format was too permissive: it only checked for a scheme prefix, so a string like `https: not a url` passed. It now also rejects any whitespace or control character, so values that carry a scheme but are not URIs are caught. Real URIs, including `mailto:` and `urn:` forms and hyphenated hosts, still pass. `uri-reference` now rejects the same characters and accepts the empty string (a valid same-document reference), which the codegen path had wrongly rejected.
10
+ - `date-time` now accepts lowercase `t` and `z` separators per RFC 3339, matching the interpreted engine. `duration` now rejects a trailing `T` with no time component (`PT`, `P1DT`), which are not valid ISO 8601 durations.
11
+ - These format checks are emitted in two places, the JS compiler and the interpreted engine, and had drifted apart on the cases above. A new differential test (`tests/test_format_engine_parity.js`) runs every built-in format through both engines over a shared corpus and fails on any disagreement, so the two stay in lockstep.
12
+
13
+ ## 1.2.1 - 2026-07-18
14
+
15
+ ### Fixed
16
+
17
+ - Schemas the JS compiler cannot represent now validate on the engine that gets them right, instead of always preferring the native addon when it is installed. The native resolver mishandles several `$id` base-URI corners (URN bases, absolute-path references, empty JSON-pointer tokens, nested `$id` scopes) and silently skips regex patterns its engine cannot parse; all of these now route to the interpreted engine. Pure dynamic-ref schemas stay on the native path, which tracks `$dynamicRef` scopes more completely. Buffer and parallel APIs are unchanged.
18
+ - The JS compiler no longer compiles two shapes it got wrong: `unevaluatedItems` with `contains` in scope (contains-matched items were never credited as evaluated, rejecting valid arrays) and plain-anchor schemas that open nested `$id` scopes (same-named anchors in different base-URI scopes resolved to the wrong target). Both now go to the interpreted engine.
19
+ - Official draft 2020-12 suite: 1190 of 1190 applicable cases with the native accelerator (up from 1175), 1188 of 1190 (99.8%) pure-JS (up from 1184). Draft 7 suite gains four `ref.json` cases.
20
+
5
21
  ## 1.2.0 - 2026-07-18
6
22
 
7
23
  ### Added
package/README.md CHANGED
@@ -20,7 +20,7 @@ The `ata-validator` package itself is pure JavaScript. The native accelerator (s
20
20
  npm install ata-validator --omit=optional
21
21
  ```
22
22
 
23
- or set `ATA_NO_NATIVE=1` at runtime. Typical schemas compile to specialized JS; shapes the compiler cannot represent (some `$dynamicRef`, cyclic `$ref`, unusual keyword interactions) fall back to an interpreted engine, so every schema validates in every environment. The pure-JS setup passes 99.5% of the official draft 2020-12 test suite. Only the buffer and parallel APIs (`isValid` on raw buffers, `countValid`, `batchIsValid`, `validateAndParse`) need the native engine and say so with a clear error.
23
+ or set `ATA_NO_NATIVE=1` at runtime. Typical schemas compile to specialized JS; shapes the compiler cannot represent (some `$dynamicRef`, cyclic `$ref`, unusual keyword interactions) fall back to an interpreted engine, so every schema validates in every environment. The pure-JS setup passes 99.8% of the official draft 2020-12 test suite. Only the buffer and parallel APIs (`isValid` on raw buffers, `countValid`, `batchIsValid`, `validateAndParse`) need the native engine and say so with a clear error.
24
24
 
25
25
  In your code:
26
26
 
@@ -396,6 +396,8 @@ const result = v['~standard'].validate(data);
396
396
 
397
397
  ### Fastify Plugin
398
398
 
399
+ Measured against Fastify's own schema and validation test files with ata swapped in as the default validator: 181 of 187 tests pass, and the remaining six assert the default validator's own extension API rather than validation behavior. Validation errors follow the schema's keyword declaration order, so error-message plugins and `transformErrors` hooks written against the default validator see the same order.
400
+
399
401
  ```bash
400
402
  npm install fastify-ata
401
403
  ```
@@ -464,7 +466,7 @@ Copy-paste recipes for the common frameworks. Most need 10-20 lines of glue. See
464
466
 
465
467
  ### Known limitations
466
468
 
467
- The 98.5% Draft 2020-12 pass rate excludes areas that are deliberate scope decisions for 1.x:
469
+ The Draft 2020-12 pass rate (1188 of 1190 applicable cases, 99.8%, in the pure-JS configuration; 1190 of 1190 with the native accelerator installed, which covers the two remaining `$dynamicRef` scope corners) excludes areas that are deliberate scope decisions for 1.x:
468
470
 
469
471
  - **Remote `$ref` over the network** is not fetched. Register cross-schema refs explicitly with `schemas: [...]` or `addSchema()`.
470
472
  - **`$vocabulary`** is not implemented; custom vocabularies are ignored rather than enforced.
package/index.js CHANGED
@@ -1017,14 +1017,38 @@ class Validator {
1017
1017
  };
1018
1018
  }
1019
1019
  } else if (native) {
1020
- // Native-only path: no JS codegen, use native for everything
1020
+ // No JS codegen: buffer/parallel APIs always come from the native
1021
+ // engine, but the object-validation entry points go to whichever
1022
+ // engine is more correct for the schema shape. Pure dynamic-ref
1023
+ // schemas stay on the C++ path (full $dynamicRef scope tracking);
1024
+ // everything else uses the interpreted engine, which handles the
1025
+ // $id/URN base-URI resolution corners the native resolver gets wrong.
1021
1026
  this._ensureNative();
1022
- const _hasDynamic = this._schemaStr.includes('"$dynamicRef"') || this._schemaStr.includes('"$dynamicAnchor"') || this._schemaStr.includes('"$anchor"')
1023
- // For schemas with dynamic refs/anchors, use validateJSON (C++ path with full support)
1024
- // instead of validate (NAPI direct V8 path without anchor maps)
1025
- const _validate = _hasDynamic
1026
- ? (data) => this._compiled.validateJSON(JSON.stringify(data))
1027
- : (data) => this._compiled.validate(data);
1027
+ const _hasDynRef = this._schemaStr.includes('"$dynamicRef"') || this._schemaStr.includes('"$dynamicAnchor"')
1028
+ const _hasUneval = this._schemaStr.includes('"unevaluatedProperties"') || this._schemaStr.includes('"unevaluatedItems"')
1029
+ let _validate;
1030
+ if (_hasDynRef && !_hasUneval) {
1031
+ // validateJSON is the C++ path with full anchor-map support; the NAPI
1032
+ // direct V8 `validate` path has no anchor maps.
1033
+ _validate = (data) => this._compiled.validateJSON(JSON.stringify(data));
1034
+ this.validateJSON = (jsonStr) => this._compiled.validateJSON(jsonStr);
1035
+ this.isValidJSON = (jsonStr) => this._compiled.isValidJSON(jsonStr);
1036
+ } else {
1037
+ const { createInterpreter } = require('./lib/interpreter');
1038
+ const interp = createInterpreter(schemaObj, {
1039
+ schemaMap: this._schemaMap.size > 0 ? this._schemaMap : null,
1040
+ formats: this._userFormats,
1041
+ });
1042
+ _validate = (data) => interp.validate(data);
1043
+ this.validateJSON = (jsonStr) => {
1044
+ try {
1045
+ return _validate(JSON.parse(jsonStr));
1046
+ } catch (e) {
1047
+ return { valid: false, errors: [{ keyword: 'syntax', instancePath: '', schemaPath: '#', params: {}, message: e.message }] };
1048
+ }
1049
+ };
1050
+ this.isValidJSON = (jsonStr) => this.validateJSON(jsonStr).valid;
1051
+ }
1028
1052
  this.validate = preprocess
1029
1053
  ? (data) => {
1030
1054
  preprocess(data);
@@ -1032,8 +1056,6 @@ class Validator {
1032
1056
  }
1033
1057
  : _validate;
1034
1058
  this.isValidObject = (data) => _validate(data).valid;
1035
- this.validateJSON = (jsonStr) => this._compiled.validateJSON(jsonStr);
1036
- this.isValidJSON = (jsonStr) => this._compiled.isValidJSON(jsonStr);
1037
1059
  this.validateAndParse = (jsonStr) => this._compiled.validateAndParse(jsonStr);
1038
1060
  {
1039
1061
  const slot = this._fastSlot;
@@ -225,8 +225,8 @@ const FORMAT_CHECKS = {
225
225
  time: (s) => /^([01]\d|2[0-3]):[0-5]\d:[0-5]\d(\.\d+)?([Zz]|[+-]\d{2}:\d{2})?$/.test(s),
226
226
  duration: (s) => /^P(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/.test(s) && s !== 'P' && !s.endsWith('T'),
227
227
  uuid: (s) => s.length === 36 && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s),
228
- uri: (s) => /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(s),
229
- 'uri-reference': (s) => s === '' || !/\s/.test(s),
228
+ uri: (s) => /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(s) && !/[\s\u0000-\u001f\u007f]/.test(s),
229
+ 'uri-reference': (s) => !/[\s\u0000-\u001f\u007f]/.test(s),
230
230
  ipv4: (s) => { const p = s.split('.'); return p.length === 4 && p.every((n) => { const v = +n; return n !== '' && v >= 0 && v <= 255 && String(v) === n; }); },
231
231
  ipv6: (s) => s !== '' && /^[0-9a-fA-F:.]+$/.test(s) && s.split(':').length >= 3 && s.split(':').length <= 8,
232
232
  hostname: (s) => s.length > 0 && s.length <= 253 && /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(s),
@@ -99,7 +99,12 @@ function compileToJS(schema, defs, schemaMap) {
99
99
  // Exception: $dynamicRef/$anchor are handled by the interpretive path even though codegen can't
100
100
  if (!defs && !codegenSafe(schema, schemaMap)) {
101
101
  const str = JSON.stringify(schema)
102
- if (!str.includes('"$dynamicRef"') && !str.includes('"$dynamicAnchor"') && !str.includes('"$anchor"')) return null
102
+ const hasDynamic = str.includes('"$dynamicRef"') || str.includes('"$dynamicAnchor"')
103
+ if (!hasDynamic && !str.includes('"$anchor"')) return null
104
+ // The flat anchor map resolves "#name" without regard to $id base-URI
105
+ // scopes. When a plain-anchor schema opens nested $id scopes, same-named
106
+ // anchors can shadow each other, so those schemas must not use codegen.
107
+ if (!hasDynamic && hasNestedIdScope(schema)) return null
103
108
  }
104
109
 
105
110
  // Collect $defs early so sub-schemas can resolve $ref
@@ -723,6 +728,23 @@ function subtreeRefersToLocalDef(node, defNames) {
723
728
  return false
724
729
  }
725
730
 
731
+ // Returns true if any sub-schema below the root declares a non-fragment $id,
732
+ // i.e. opens a new base-URI scope. Fragment-only ids ('#name') are draft-07
733
+ // anchors, not scope changes.
734
+ function hasNestedIdScope(node, isRoot = true) {
735
+ if (typeof node !== 'object' || node === null) return false
736
+ if (!isRoot && typeof node.$id === 'string' && !node.$id.startsWith('#')) return true
737
+ for (const val of Object.values(node)) {
738
+ if (typeof val !== 'object' || val === null) continue
739
+ if (Array.isArray(val)) {
740
+ for (const item of val) { if (hasNestedIdScope(item, false)) return true }
741
+ } else if (hasNestedIdScope(val, false)) {
742
+ return true
743
+ }
744
+ }
745
+ return false
746
+ }
747
+
726
748
  // Recursively check if a schema can be safely compiled to JS codegen.
727
749
  // Returns false if any sub-schema contains features codegen gets wrong.
728
750
  function codegenSafe(schema, schemaMap) {
@@ -822,6 +844,10 @@ function codegenSafe(schema, schemaMap) {
822
844
  }
823
845
  // unevaluatedItems: allow boolean and schema values
824
846
  if (schema.unevaluatedItems !== undefined) {
847
+ // contains marks matched items as evaluated; the generated evaluated-item
848
+ // tracking never credits contains matches, so any contains in scope of an
849
+ // unevaluatedItems keyword must go to the interpreted engine.
850
+ if (JSON.stringify(schema).includes('"contains"')) return false
825
851
  if (typeof schema.unevaluatedItems === 'object' && schema.unevaluatedItems !== null) {
826
852
  if (!codegenSafe(schema.unevaluatedItems, schemaMap)) return false
827
853
  }
@@ -2412,20 +2438,20 @@ const FORMAT_CODEGEN = {
2412
2438
  ? `if(${v}.length!==36||!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(${v}))return false`
2413
2439
  : `if(typeof ${v}==='string'&&(${v}.length!==36||!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(${v})))return false`,
2414
2440
  'date-time': (v, isStr) => isStr
2415
- ? `if(!/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$/.test(${v})||isNaN(Date.parse(${v})))return false`
2416
- : `if(typeof ${v}==='string'&&(!/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})$/.test(${v})||isNaN(Date.parse(${v}))))return false`,
2441
+ ? `if(!/^\\d{4}-\\d{2}-\\d{2}[Tt]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?([Zz]|[+-]\\d{2}:\\d{2})$/.test(${v})||isNaN(Date.parse(${v})))return false`
2442
+ : `if(typeof ${v}==='string'&&(!/^\\d{4}-\\d{2}-\\d{2}[Tt]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?([Zz]|[+-]\\d{2}:\\d{2})$/.test(${v})||isNaN(Date.parse(${v}))))return false`,
2417
2443
  time: (v, isStr) => isStr
2418
2444
  ? `if(!/^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?$/.test(${v}))return false`
2419
2445
  : `if(typeof ${v}==='string'&&!/^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?$/.test(${v}))return false`,
2420
2446
  duration: (v, isStr) => isStr
2421
- ? `if(!/^P(?:\\d+Y)?(?:\\d+M)?(?:\\d+W)?(?:\\d+D)?(?:T(?:\\d+H)?(?:\\d+M)?(?:\\d+(?:\\.\\d+)?S)?)?$/.test(${v})||${v}==='P')return false`
2422
- : `if(typeof ${v}==='string'&&(!/^P(?:\\d+Y)?(?:\\d+M)?(?:\\d+W)?(?:\\d+D)?(?:T(?:\\d+H)?(?:\\d+M)?(?:\\d+(?:\\.\\d+)?S)?)?$/.test(${v})||${v}==='P'))return false`,
2447
+ ? `if(!/^P(?:\\d+Y)?(?:\\d+M)?(?:\\d+W)?(?:\\d+D)?(?:T(?:\\d+H)?(?:\\d+M)?(?:\\d+(?:\\.\\d+)?S)?)?$/.test(${v})||${v}==='P'||${v}.endsWith('T'))return false`
2448
+ : `if(typeof ${v}==='string'&&(!/^P(?:\\d+Y)?(?:\\d+M)?(?:\\d+W)?(?:\\d+D)?(?:T(?:\\d+H)?(?:\\d+M)?(?:\\d+(?:\\.\\d+)?S)?)?$/.test(${v})||${v}==='P'||${v}.endsWith('T')))return false`,
2423
2449
  uri: (v, isStr) => isStr
2424
- ? `if(!/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(${v}))return false`
2425
- : `if(typeof ${v}==='string'&&!/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(${v}))return false`,
2450
+ ? `if(!/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(${v})||/[\\s\\u0000-\\u001f\\u007f]/.test(${v}))return false`
2451
+ : `if(typeof ${v}==='string'&&(!/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(${v})||/[\\s\\u0000-\\u001f\\u007f]/.test(${v})))return false`,
2426
2452
  'uri-reference': (v, isStr) => isStr
2427
- ? `if(${v}===''||/\\s/.test(${v}))return false`
2428
- : `if(typeof ${v}==='string'&&(${v}===''||/\\s/.test(${v})))return false`,
2453
+ ? `if(/[\\s\\u0000-\\u001f\\u007f]/.test(${v}))return false`
2454
+ : `if(typeof ${v}==='string'&&/[\\s\\u0000-\\u001f\\u007f]/.test(${v}))return false`,
2429
2455
  ipv4: (v, isStr) => isStr
2430
2456
  ? `{const _p=${v}.split('.');if(_p.length!==4||!_p.every(function(n){var x=+n;return x>=0&&x<=255&&String(x)===n}))return false}`
2431
2457
  : `if(typeof ${v}==='string'){const _p=${v}.split('.');if(_p.length!==4||!_p.every(function(n){var x=+n;return x>=0&&x<=255&&String(x)===n}))return false}`,
package/lib/version.js CHANGED
@@ -7,4 +7,4 @@
7
7
  //
8
8
  // Kept in lockstep with package.json by `tests/test_version_sync.js`.
9
9
 
10
- module.exports = '1.2.0';
10
+ module.exports = '1.2.2';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ata-validator",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "JSON Schema validation with first-class TypeScript and zero runtime cost. AOT compile to per-schema ESM modules with zero validator dependency. Generic Validator<T> for TypeBox/Zod/Valibot composition. Optional runtime API. Standard Schema V1 compatible.",
5
5
  "main": "index.js",
6
6
  "module": "index.mjs",
@@ -44,7 +44,7 @@
44
44
  "release:check": "node scripts/regen-safe-regex-source.js && node tests/test_pack_purity.js && node scripts/check-doc-coverage.js && node tests/test_error_codes_lock.js && node tests/test_safe_regex_source_sync.js && node tests/test_version_sync.js",
45
45
  "build": "cmake-js build --target ata",
46
46
  "rebuild": "cmake-js rebuild --target ata",
47
- "test": "node test.js && node tests/test_removed_aot_methods.js && node tests/test_no_native.js && node tests/test_pure_js_unsupported.js && node tests/test_native_load_order.js && node tests/test_pack_purity.js && node tests/test_make_native_package.js && node tests/test_browser_nofs.js && node tests/test_browser_imports_guard.js && node tests/test_version_sync.js && node tests/test_safe_regex_source_sync.js && node tests/test_t_builder.js && node tests/test_async_refine.js && node tests/test_safe_regex.js && node tests/test_safe_regex_integration.js && node tests/test_aot_build.js && node tests/test_aot_differential.js && node tests/test_aot_cli_build.js && node tests/test_aot_cli_smoke.js && node tests/test_bundle_standalone.js && node tests/test_standalone_anyof.js && node tests/test_standalone_formats.js && node tests/test_aot_additional_props_errors.js && node tests/test_id_anchor_refs.js && node tests/test_defs_pointer_alias.js && node tests/test_no_input_mutation.js && node tests/test_typed_validator_runner.js && node tests/test_define_schema.js && node tests/test_error_codes_lock.js && node tests/test_error_order.js && node tests/test_nullable.js && node tests/test_validate_and_parse.js && node tests/test_validate_data.js && node tests/test_enrich_error.js && node tests/test_rich_errors_optout.js && node tests/test_error_messages.js && node tests/test_source_positions.js && node tests/fuzz_positions.js && node tests/test_data_positions.js && node tests/test_render_shared.js && node tests/test_renderers.js && node tests/test_runtime_error_dx.js && node tests/test_aot_error_dx.js && node tests/test_abort_early.js && node tests/test_branch_collapse.js && node tests/test_suggestions.js && node tests/test_cli_validate.js && node tests/test_cli_version.js && node benchmark/bench_aot_size.mjs",
47
+ "test": "node test.js && node tests/test_removed_aot_methods.js && node tests/test_no_native.js && node tests/test_pure_js_unsupported.js && node tests/test_native_load_order.js && node tests/test_pack_purity.js && node tests/test_make_native_package.js && node tests/test_browser_nofs.js && node tests/test_browser_imports_guard.js && node tests/test_version_sync.js && node tests/test_safe_regex_source_sync.js && node tests/test_t_builder.js && node tests/test_async_refine.js && node tests/test_safe_regex.js && node tests/test_safe_regex_integration.js && node tests/test_aot_build.js && node tests/test_aot_differential.js && node tests/test_aot_cli_build.js && node tests/test_aot_cli_smoke.js && node tests/test_bundle_standalone.js && node tests/test_standalone_anyof.js && node tests/test_standalone_formats.js && node tests/test_aot_additional_props_errors.js && node tests/test_id_anchor_refs.js && node tests/test_engine_routing.js && node tests/test_format_engine_parity.js && node tests/test_defs_pointer_alias.js && node tests/test_no_input_mutation.js && node tests/test_typed_validator_runner.js && node tests/test_define_schema.js && node tests/test_error_codes_lock.js && node tests/test_error_order.js && node tests/test_nullable.js && node tests/test_validate_and_parse.js && node tests/test_validate_data.js && node tests/test_enrich_error.js && node tests/test_rich_errors_optout.js && node tests/test_error_messages.js && node tests/test_source_positions.js && node tests/fuzz_positions.js && node tests/test_data_positions.js && node tests/test_render_shared.js && node tests/test_renderers.js && node tests/test_runtime_error_dx.js && node tests/test_aot_error_dx.js && node tests/test_abort_early.js && node tests/test_branch_collapse.js && node tests/test_suggestions.js && node tests/test_cli_validate.js && node tests/test_cli_version.js && node benchmark/bench_aot_size.mjs",
48
48
  "bench:size": "node benchmark/bench_aot_size.mjs",
49
49
  "test:suite": "node tests/run_suite.js",
50
50
  "test:compat": "node tests/test_compat.js",
@@ -112,12 +112,12 @@
112
112
  "LICENSE"
113
113
  ],
114
114
  "optionalDependencies": {
115
- "@ata-validator/native-darwin-arm64": "1.2.0",
116
- "@ata-validator/native-linux-x64-gnu": "1.2.0",
117
- "@ata-validator/native-linux-arm64-gnu": "1.2.0",
118
- "@ata-validator/native-linux-x64-musl": "1.2.0",
119
- "@ata-validator/native-linux-arm64-musl": "1.2.0",
120
- "@ata-validator/native-win32-x64": "1.2.0"
115
+ "@ata-validator/native-darwin-arm64": "1.2.2",
116
+ "@ata-validator/native-linux-x64-gnu": "1.2.2",
117
+ "@ata-validator/native-linux-arm64-gnu": "1.2.2",
118
+ "@ata-validator/native-linux-x64-musl": "1.2.2",
119
+ "@ata-validator/native-linux-arm64-musl": "1.2.2",
120
+ "@ata-validator/native-win32-x64": "1.2.2"
121
121
  },
122
122
  "peerDependencies": {
123
123
  "yaml": "^2.0.0"