ata-validator 1.10.0 → 1.12.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.
@@ -762,9 +762,9 @@ const _formats = require('./formats')
762
762
  const FORMAT_CHECKS = {
763
763
  email: (s) => { const at = s.indexOf('@'); return at > 0 && at < s.length - 1 && s.indexOf('.', at) > at + 1 },
764
764
  date: _formats.date,
765
- 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),
765
+ uuid: _formats.uuid,
766
766
  ipv4: _formats.ipv4,
767
- hostname: (s) => s.length > 0 && s.length <= 253 && /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i.test(s),
767
+ hostname: _formats.hostname,
768
768
  }
769
769
 
770
770
  // Dangerous JS property names that exist on Object.prototype
@@ -850,6 +850,49 @@ function hasNestedIdScope(node, isRoot = true) {
850
850
  // the generated code the same way `$ref: "#"` does at the root. A plain
851
851
  // cross-reference (A -> B where B does not refer back) is not on a cycle and
852
852
  // still inlines.
853
+ // Data can point back at itself, and a schema that references itself would
854
+ // then recurse until the stack runs out. Validation runs in two passes: the
855
+ // fast one counts depth and gives up past CYCLE_DEPTH, the second re-runs with
856
+ // a set of the values currently under check, where a value met twice is a
857
+ // fixed point and counts as satisfied. That is what the interpreted engine
858
+ // does, so both engines answer the same on cyclic input. Legitimate documents
859
+ // never reach the threshold, so they only pay the counter.
860
+ // Raised by a generator that meets a construct it cannot express. The entry
861
+ // point turns it into a decline, so the caller falls back to an engine that
862
+ // can. Emitting nothing would mean "everything is valid", which is the failure
863
+ // mode this project has shipped three times in $ref handling; declining is the
864
+ // only safe way out.
865
+ const DECLINE = Symbol('ata.decline')
866
+
867
+ const CYCLE_DEPTH = 512
868
+
869
+ // Declarations the guarded functions close over. Emitted once, ahead of them.
870
+ function emitGuardState () {
871
+ return 'const _CYC={};const _stk=new Set();let _sd=0,_sg=false\n '
872
+ }
873
+
874
+ // Wraps a self-recursive root: `name` is the guarded entry, `name`_b the body.
875
+ function emitRootGuard (name, args, onRepeat) {
876
+ const call = `${name}_b(${args})`
877
+ return (
878
+ `function ${name}(${args}){\n ` +
879
+ `if(_sg){if(typeof d!=='object'||d===null)return ${call};if(_stk.has(d))return ${onRepeat};_stk.add(d);try{return ${call}}finally{_stk.delete(d)}}\n ` +
880
+ `if(++_sd>${CYCLE_DEPTH})throw _CYC\n const _r=${call}\n _sd--\n return _r\n }\n `
881
+ )
882
+ }
883
+
884
+ // Runs `attempt`, and on the depth signal runs it again under the guard.
885
+ // `reset` clears anything the abandoned pass left behind.
886
+ function emitGuardedRun (attempt, reset, defSets) {
887
+ const clears = ['_stk.clear()'].concat(defSets.map((n) => `${n}_s.clear()`)).join(';')
888
+ return (
889
+ `_sd=0\n try{${attempt}}catch(_err){\n ` +
890
+ `if(_err!==_CYC)throw _err\n ` +
891
+ `${reset}_sg=true;${clears}\n ` +
892
+ `try{${attempt}}finally{_sg=false}\n }\n `
893
+ )
894
+ }
895
+
853
896
  function cyclicDefNames (defs) {
854
897
  const out = new Set()
855
898
  if (!defs || typeof defs !== 'object') return out
@@ -1417,18 +1460,33 @@ function compileToJSCodegen(schema, schemaMap, userFormats) {
1417
1460
  }
1418
1461
  }
1419
1462
 
1463
+ const defSets = ctx.defFns ? Array.from(ctx.defFns.values()) : []
1464
+ const needsGuard = ctx.usesRecursion || defSets.length > 0
1465
+
1420
1466
  let body, hybridBody
1421
1467
  if (ctx.usesRecursion) {
1422
- // Self-recursive: wrap in named function
1423
- body = `function _validate(d){\n ${checkStr}\n return true\n }\n return _validate(d)`
1424
- // Hybrid: keep _validate as boolean, wrap only the outer call
1425
- hybridBody = `function _validate(d){\n ${checkStr}\n return true\n }\n return _validate(d)?R:E(d)`
1468
+ // Self-recursive: a named body reached through the cycle guard, so data
1469
+ // that points back at itself settles instead of exhausting the stack.
1470
+ const decl = emitRootGuard('_validate', 'd', 'true') +
1471
+ `function _validate_b(d){\n ${checkStr}\n return true\n }\n `
1472
+ const run = emitGuardedRun('return _validate(d)', '', defSets)
1473
+ body = `${decl}function _run(d){\n ${run}\n }\n return _run(d)`
1474
+ // Hybrid: keep the boolean answer, wrap only the outer call
1475
+ hybridBody = `${decl}function _run(d){\n ${run}\n }\n return _run(d)?R:E(d)`
1476
+ } else if (defSets.length > 0) {
1477
+ // No self-reference at the root, but a def on a cycle can still be
1478
+ // re-entered with the same value; the guarded functions need their state.
1479
+ const run = emitGuardedRun(`return _body(d)`, '', defSets)
1480
+ body = `function _body(d){\n ${checkStr}\n return true\n }\n function _run(d){\n ${run}\n }\n return _run(d)`
1481
+ hybridBody = `function _body(d){\n ${checkStr}\n return true\n }\n function _run(d){\n ${run}\n }\n return _run(d)?R:E(d)`
1426
1482
  } else {
1427
1483
  body = checkStr + '\n return true'
1428
1484
  hybridBody = replaceTopLevel(checkStr + '\n return R')
1429
1485
  }
1430
1486
 
1431
- const preambleStr = ctx.preamble && ctx.preamble.length ? ctx.preamble.join('\n ') + '\n ' : ''
1487
+ const guardStr = needsGuard ? emitGuardState() : ''
1488
+ const preambleStr = guardStr +
1489
+ (ctx.preamble && ctx.preamble.length ? ctx.preamble.join('\n ') + '\n ' : '')
1432
1490
 
1433
1491
  try {
1434
1492
  let boolFn
@@ -1695,7 +1753,16 @@ function genCode(schema, v, lines, ctx, knownType) {
1695
1753
  ctx.defFns.set(defName, fnName)
1696
1754
  const bodyLines = []
1697
1755
  genCode(ctx.rootDefs[defName], 'd', bodyLines, ctx)
1698
- ctx.preamble.push(`function ${fnName}(d){${bodyLines.join('\n ')}\n return true}`)
1756
+ // Entered through the cycle guard: see emitGuardState. In the fast
1757
+ // pass the wrapper only counts depth; the set is used by the second,
1758
+ // guarded pass that runs when data turns out to point back at
1759
+ // itself.
1760
+ ctx.preamble.push(
1761
+ `const ${fnName}_s=new Set()\n function ${fnName}(d){\n ` +
1762
+ `if(_sg){if(typeof d!=='object'||d===null)return ${fnName}_b(d);if(${fnName}_s.has(d))return true;${fnName}_s.add(d);try{return ${fnName}_b(d)}finally{${fnName}_s.delete(d)}}\n ` +
1763
+ `if(++_sd>${CYCLE_DEPTH})throw _CYC\n const _r=${fnName}_b(d)\n _sd--\n return _r\n }\n ` +
1764
+ `function ${fnName}_b(d){${bodyLines.join('\n ')}\n return true}`,
1765
+ )
1699
1766
  }
1700
1767
  lines.push(`if(!${fnName}(${v}))return false`)
1701
1768
  if (!hasSiblings) return
@@ -2900,31 +2967,19 @@ const FORMAT_CODEGEN = {
2900
2967
  : `if(typeof ${v}==='string'){const _at=${v}.indexOf('@');if(_at<=0||_at>=${v}.length-1||${v}.indexOf('.',_at)<=_at+1)return false}`
2901
2968
  },
2902
2969
  date: _formats.dateSource,
2903
- uuid: (v, isStr) => isStr
2904
- ? `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`
2905
- : `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`,
2906
- 'date-time': (v, isStr) => isStr
2907
- ? `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`
2908
- : `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`,
2909
- time: (v, isStr) => isStr
2910
- ? `if(!/^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?$/.test(${v}))return false`
2911
- : `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`,
2970
+ uuid: _formats.uuidSource,
2971
+ 'date-time': _formats.dateTimeSource,
2972
+ time: _formats.timeSource,
2912
2973
  duration: (v, isStr) => isStr
2913
2974
  ? `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`
2914
2975
  : `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`,
2915
- uri: (v, isStr) => isStr
2916
- ? `if(!/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(${v})||/[\\s\\u0000-\\u001f\\u007f]/.test(${v}))return false`
2917
- : `if(typeof ${v}==='string'&&(!/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(${v})||/[\\s\\u0000-\\u001f\\u007f]/.test(${v})))return false`,
2976
+ uri: _formats.uriSource,
2918
2977
  'uri-reference': (v, isStr) => isStr
2919
- ? `if(/[\\s\\u0000-\\u001f\\u007f]/.test(${v}))return false`
2920
- : `if(typeof ${v}==='string'&&/[\\s\\u0000-\\u001f\\u007f]/.test(${v}))return false`,
2978
+ ? `{${_formats.noReservedSource(v, '0')}}`
2979
+ : `if(typeof ${v}==='string'){${_formats.noReservedSource(v, '0')}}`,
2921
2980
  ipv4: _formats.ipv4Source,
2922
- ipv6: (v, isStr) => isStr
2923
- ? `{const _s=${v};if(_s===''||!/^[0-9a-fA-F:]+$/.test(_s)||_s.split(':').length<3||_s.split(':').length>8)return false}`
2924
- : `if(typeof ${v}==='string'){const _s=${v};if(_s===''||!/^[0-9a-fA-F:]+$/.test(_s)||_s.split(':').length<3||_s.split(':').length>8)return false}`,
2925
- hostname: (v, isStr) => isStr
2926
- ? `if(!/^[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(${v}))return false`
2927
- : `if(typeof ${v}==='string'&&!/^[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(${v}))return false`,
2981
+ ipv6: _formats.ipv6Source,
2982
+ hostname: _formats.hostnameSource,
2928
2983
  }
2929
2984
 
2930
2985
  // Safe key escaping: use JSON.stringify to handle all special chars (newlines, null bytes, etc.)
@@ -3069,8 +3124,6 @@ function compileToJSCodegenWithErrors(schema, schemaMap, userFormats, sourceOpts
3069
3124
  if (typeof schema === 'object' && schema !== null) {
3070
3125
  const s = JSON.stringify(schema)
3071
3126
  if (s.includes('unevaluatedProperties') || s.includes('unevaluatedItems')) return null
3072
- // Bail on self-referencing schemas — error codegen doesn't support recursion
3073
- if (s.includes('"$ref":"#"')) return null
3074
3127
  }
3075
3128
  if (typeof schema === 'boolean') {
3076
3129
  return schema
@@ -3133,7 +3186,12 @@ function compileToJSCodegenWithErrors(schema, schemaMap, userFormats, sourceOpts
3133
3186
  : null }
3134
3187
  ctx.helperCode.push('const _cpLen=s=>{let n=0;for(const _ of s)n++;return n}')
3135
3188
  const lines = []
3136
- genCodeE(schema, 'd', '', lines, ctx, '#')
3189
+ try {
3190
+ genCodeE(schema, 'd', '', lines, ctx, '#')
3191
+ } catch (e) {
3192
+ if (e === DECLINE) return null
3193
+ throw e
3194
+ }
3137
3195
  // Inline branch-collapse helper only when the schema actually used a
3138
3196
  // oneOf/anyOf branch path (tracked via ctx.usesBranchCollapse). Keeps the
3139
3197
  // AOT output small for schemas that don't compose. Standalone modules can't
@@ -3144,16 +3202,28 @@ function compileToJSCodegenWithErrors(schema, schemaMap, userFormats, sourceOpts
3144
3202
  if (lines.length === 0) return (d) => ({ valid: true, errors: [] })
3145
3203
 
3146
3204
  const checkStr = lines.join('\n ')
3205
+ const defSetsE = ctx.defFns ? Array.from(ctx.defFns.values()) : []
3206
+ const needsGuardE = ctx.usesRecursion || defSetsE.length > 0
3207
+ const guardStrE = needsGuardE ? emitGuardState() : ''
3208
+ const helpersE = ctx.helperCode.length ? ctx.helperCode.join('\n ') + '\n ' : ''
3209
+
3147
3210
  let body
3148
3211
  if (ctx.usesRecursion) {
3149
- body = `const _e=[];\n ` +
3150
- (ctx.helperCode.length ? ctx.helperCode.join('\n ') + '\n ' : '') +
3151
- `function _validateE(d,_all,_e){\n ${checkStr}\n }\n _validateE(d,_all,_e);\n ` +
3212
+ // The abandoned first pass may have pushed errors, so the retry starts
3213
+ // from an empty list and the reported errors come from the guarded run
3214
+ // alone.
3215
+ body = `const _e=[];\n ` + guardStrE + helpersE +
3216
+ emitRootGuard('_validateE', 'd,_all,_e', '') +
3217
+ `function _validateE_b(d,_all,_e){\n ${checkStr}\n }\n ` +
3218
+ emitGuardedRun('_validateE(d,_all,_e)', '_e.length=0;', defSetsE) +
3219
+ `return{valid:_e.length===0,errors:_e}`
3220
+ } else if (defSetsE.length > 0) {
3221
+ body = `const _e=[];\n ` + guardStrE + helpersE +
3222
+ `function _bodyE(d,_all,_e){\n ${checkStr}\n }\n ` +
3223
+ emitGuardedRun('_bodyE(d,_all,_e)', '_e.length=0;', defSetsE) +
3152
3224
  `return{valid:_e.length===0,errors:_e}`
3153
3225
  } else {
3154
- body = `const _e=[];\n ` +
3155
- (ctx.helperCode.length ? ctx.helperCode.join('\n ') + '\n ' : '') +
3156
- checkStr +
3226
+ body = `const _e=[];\n ` + helpersE + checkStr +
3157
3227
  `\n return{valid:_e.length===0,errors:_e}`
3158
3228
  }
3159
3229
  try {
@@ -3232,8 +3302,11 @@ function genCodeE(schema, v, pathExpr, lines, ctx, schemaPrefix) {
3232
3302
  }
3233
3303
  // $ref — resolve local and cross-schema refs
3234
3304
  if (schema.$ref) {
3235
- // Self-reference "#" — no-op (permissive) to avoid infinite recursion
3236
- if (schema.$ref === '#') return
3305
+ // A self-reference cannot be expressed here yet: the root helper takes no
3306
+ // path argument, so errors raised through it would carry the path of the
3307
+ // root rather than of the value that failed. This used to fall through as
3308
+ // a permissive no-op, which accepted whatever the reference guarded.
3309
+ if (schema.$ref === '#') throw DECLINE
3237
3310
  const m = schema.$ref.match(/^#\/(?:\$defs|definitions)\/(.+)$/)
3238
3311
  if (m && ctx.rootDefs && ctx.rootDefs[m[1]]) {
3239
3312
  const defName = m[1]
@@ -3248,7 +3321,12 @@ function genCodeE(schema, v, pathExpr, lines, ctx, schemaPrefix) {
3248
3321
  ctx.defFns.set(defName, fnName)
3249
3322
  const bodyLines = []
3250
3323
  genCodeE(ctx.rootDefs[defName], 'd', '_p', bodyLines, ctx, '#/$defs/' + defName)
3251
- ctx.helperCode.push(`function ${fnName}(d,_p,_all,_e){${bodyLines.join('\n ')}}`)
3324
+ ctx.helperCode.push(
3325
+ `const ${fnName}_s=new Set()\n function ${fnName}(d,_p,_all,_e){\n ` +
3326
+ `if(_sg){if(typeof d!=='object'||d===null)return ${fnName}_b(d,_p,_all,_e);if(${fnName}_s.has(d))return;${fnName}_s.add(d);try{return ${fnName}_b(d,_p,_all,_e)}finally{${fnName}_s.delete(d)}}\n ` +
3327
+ `if(++_sd>${CYCLE_DEPTH})throw _CYC\n const _r=${fnName}_b(d,_p,_all,_e)\n _sd--\n return _r\n }\n ` +
3328
+ `function ${fnName}_b(d,_p,_all,_e){${bodyLines.join('\n ')}}`,
3329
+ )
3252
3330
  }
3253
3331
  lines.push(`${fnName}(${v},${pathExpr || '""'},_all,_e);if(!_all&&_e.length)return{valid:false,errors:_e}`)
3254
3332
  return
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.10.0';
10
+ module.exports = '1.12.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ata-validator",
3
- "version": "1.10.0",
3
+ "version": "1.12.0",
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_no_eval.js && node tests/test_property_dependencies.js && node tests/test_v1_dialect.js && node tests/test_buffer_path_parity.js && node tests/test_buffer_gate.js && node tests/test_draft7_semantics.js && node tests/test_metaschema_ref.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_native_loaded.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_format_mode.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_engine_diagnostic.js && node tests/test_format_engine_parity.js && node tests/test_formats_single_pass.js && node tests/test_defs_pointer_alias.js && node tests/test_cross_doc_root_ref.js && node tests/test_codegen_entrypoint_agreement.js && node tests/test_hybrid_agreement.js && node tests/test_codegen_edge_shapes.js && node tests/test_ajv_errors.js && node tests/test_pattern_properties_errors.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_code_lookup.js && node tests/test_error_order.js && node tests/test_value_equality.js && node tests/test_vocabulary.js && node tests/test_schema_scan.js && node tests/test_lazy_errors.js && node tests/test_plan_compiler.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_enrich_received.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_additive_fields.js && node tests/test_diagnostic_source.js && node tests/test_diagnose.js && node tests/test_correlate.js && node tests/test_diagnostics_score.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_no_eval.js && node tests/test_property_dependencies.js && node tests/test_v1_dialect.js && node tests/test_buffer_path_parity.js && node tests/test_buffer_gate.js && node tests/test_draft7_semantics.js && node tests/test_metaschema_ref.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_native_loaded.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_format_mode.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_engine_diagnostic.js && node tests/test_format_engine_parity.js && node tests/test_formats_single_pass.js && node tests/test_defs_pointer_alias.js && node tests/test_cross_doc_root_ref.js && node tests/test_codegen_entrypoint_agreement.js && node tests/test_hybrid_agreement.js && node tests/test_codegen_edge_shapes.js && node tests/test_ajv_errors.js && node tests/test_pattern_properties_errors.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_code_lookup.js && node tests/test_error_order.js && node tests/test_value_equality.js && node tests/test_vocabulary.js && node tests/test_schema_scan.js && node tests/test_lazy_errors.js && node tests/test_lazy_instance.js && node tests/test_cyclic_input.js && node tests/test_native_error_codes.js && node tests/test_verdict_preprocess.js && node tests/test_plan_compiler.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_enrich_received.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_additive_fields.js && node tests/test_diagnostic_source.js && node tests/test_diagnose.js && node tests/test_correlate.js && node tests/test_diagnostics_score.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 && node tests/run_suite.js draft7 && node tests/run_suite.js v1",
50
50
  "test:compat": "node tests/test_compat.js",
@@ -112,13 +112,13 @@
112
112
  "LICENSE"
113
113
  ],
114
114
  "optionalDependencies": {
115
- "@ata-validator/native-darwin-arm64": "1.10.0",
116
- "@ata-validator/native-darwin-x64": "1.10.0",
117
- "@ata-validator/native-linux-x64-gnu": "1.10.0",
118
- "@ata-validator/native-linux-arm64-gnu": "1.10.0",
119
- "@ata-validator/native-linux-x64-musl": "1.10.0",
120
- "@ata-validator/native-linux-arm64-musl": "1.10.0",
121
- "@ata-validator/native-win32-x64": "1.10.0"
115
+ "@ata-validator/native-darwin-arm64": "1.12.0",
116
+ "@ata-validator/native-darwin-x64": "1.12.0",
117
+ "@ata-validator/native-linux-x64-gnu": "1.12.0",
118
+ "@ata-validator/native-linux-arm64-gnu": "1.12.0",
119
+ "@ata-validator/native-linux-x64-musl": "1.12.0",
120
+ "@ata-validator/native-linux-arm64-musl": "1.12.0",
121
+ "@ata-validator/native-win32-x64": "1.12.0"
122
122
  },
123
123
  "peerDependencies": {
124
124
  "yaml": "^2.0.0"