ata-validator 1.30.1 → 1.30.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/lib/js-compiler.js +17 -9
- package/lib/version.js +1 -1
- package/package.json +9 -9
package/lib/js-compiler.js
CHANGED
|
@@ -1838,6 +1838,13 @@ function genCode(schema, v, lines, ctx, knownType) {
|
|
|
1838
1838
|
ctx.regExpMap = new Map();
|
|
1839
1839
|
}
|
|
1840
1840
|
|
|
1841
|
+
// Bookkeeping about THIS node, so it stays in this call. On `ctx` it outlived
|
|
1842
|
+
// the node: a sibling that set one made the next node skip a check it owed,
|
|
1843
|
+
// and `propertyNames` then vanished from the emitted program. Same class as
|
|
1844
|
+
// the deferred additionalProperties bug, so same answer, a local.
|
|
1845
|
+
let ppHandledPropertyNames = false
|
|
1846
|
+
let earlyKeyCount = false
|
|
1847
|
+
|
|
1841
1848
|
// $ref — guard against circular references
|
|
1842
1849
|
// In 2020-12 with unevaluated*, $ref can coexist with siblings — don't early return
|
|
1843
1850
|
// Only when THIS schema has unevaluated keywords directly (not via $ref target)
|
|
@@ -2062,7 +2069,7 @@ function genCode(schema, v, lines, ctx, knownType) {
|
|
|
2062
2069
|
} else {
|
|
2063
2070
|
lines.push(`if(Object.keys(${v}).length!==${propCount})return false`)
|
|
2064
2071
|
}
|
|
2065
|
-
|
|
2072
|
+
earlyKeyCount = true // this node emitted its key count already
|
|
2066
2073
|
}
|
|
2067
2074
|
}
|
|
2068
2075
|
}
|
|
@@ -2278,8 +2285,7 @@ function genCode(schema, v, lines, ctx, knownType) {
|
|
|
2278
2285
|
// A key that is neither declared nor matched by any pattern is
|
|
2279
2286
|
// additional: rejected outright, or run through the additionalProperties
|
|
2280
2287
|
// schema when there is one.
|
|
2281
|
-
|
|
2282
|
-
ctx._ppHandledPropertyNames = !!pn
|
|
2288
|
+
ppHandledPropertyNames = !!pn
|
|
2283
2289
|
const propKeys = Object.keys(schema.properties || {})
|
|
2284
2290
|
let apCheck = null
|
|
2285
2291
|
if (apSchema) {
|
|
@@ -2337,7 +2343,7 @@ function genCode(schema, v, lines, ctx, knownType) {
|
|
|
2337
2343
|
lines.push(`}}`)
|
|
2338
2344
|
} else {
|
|
2339
2345
|
// No additionalProperties: validate matching keys + propertyNames
|
|
2340
|
-
|
|
2346
|
+
ppHandledPropertyNames = !!pn
|
|
2341
2347
|
lines.push(`${guard}{for(const ${kVar} in ${v}){`)
|
|
2342
2348
|
// propertyNames checks (merged)
|
|
2343
2349
|
if (pn) {
|
|
@@ -2389,7 +2395,7 @@ function genCode(schema, v, lines, ctx, knownType) {
|
|
|
2389
2395
|
}
|
|
2390
2396
|
|
|
2391
2397
|
// propertyNames — only emit if not already merged into patternProperties loop
|
|
2392
|
-
if (schema.propertyNames && typeof schema.propertyNames === 'object' && !
|
|
2398
|
+
if (schema.propertyNames && typeof schema.propertyNames === 'object' && !ppHandledPropertyNames) {
|
|
2393
2399
|
const pn = schema.propertyNames
|
|
2394
2400
|
const ki = ctx.varCounter++
|
|
2395
2401
|
const guard = isObj ? '' : `if(typeof ${v}==='object'&&${v}!==null&&!Array.isArray(${v}))`
|
|
@@ -2620,7 +2626,7 @@ function genCode(schema, v, lines, ctx, knownType) {
|
|
|
2620
2626
|
let inner
|
|
2621
2627
|
if (allRequired && propCount > 0) {
|
|
2622
2628
|
// TRICK 1: required covers all — key count check only
|
|
2623
|
-
if (!
|
|
2629
|
+
if (!earlyKeyCount) {
|
|
2624
2630
|
// Adaptive: for-in for <=15 keys, Object.keys for >15
|
|
2625
2631
|
inner = propCount <= 15
|
|
2626
2632
|
? `var _n=0;for(var _k in ${v})_n++;if(_n!==${propCount})return false`
|
|
@@ -4291,6 +4297,8 @@ function compileToJSCombined(schema, VALID_RESULT, schemaMap, userFormats) {
|
|
|
4291
4297
|
// If type check fails → push error, skip property checks (they'd crash).
|
|
4292
4298
|
function genCodeC(schema, v, pathExpr, lines, ctx, schemaPrefix) {
|
|
4293
4299
|
if (!schemaPrefix) schemaPrefix = '#'
|
|
4300
|
+
// Per-node, for the reason spelled out in genCode.
|
|
4301
|
+
let ppHandledPropertyNames = false
|
|
4294
4302
|
if (schema === false) {
|
|
4295
4303
|
// Leading semicolon: the previous generated line may end in an
|
|
4296
4304
|
// expression, and a line starting with `(` would be parsed as a call.
|
|
@@ -4692,7 +4700,7 @@ function genCodeC(schema, v, pathExpr, lines, ctx, schemaPrefix) {
|
|
|
4692
4700
|
const kVar = `_k${pi}`
|
|
4693
4701
|
|
|
4694
4702
|
if (schema.additionalProperties === false && schema.properties) {
|
|
4695
|
-
|
|
4703
|
+
ppHandledPropertyNames = !!pn
|
|
4696
4704
|
const propKeys = Object.keys(schema.properties)
|
|
4697
4705
|
// Inline key comparison for small property sets
|
|
4698
4706
|
const keyCheck = propKeys.length <= 8
|
|
@@ -4740,7 +4748,7 @@ function genCodeC(schema, v, pathExpr, lines, ctx, schemaPrefix) {
|
|
|
4740
4748
|
lines.push(`if(!_m${pi}){${fail('additionalProperties', 'additionalProperties', `{additionalProperty:${kVar}}`, "'must NOT have additional properties'")}}`)
|
|
4741
4749
|
lines.push(`}}`)
|
|
4742
4750
|
} else {
|
|
4743
|
-
|
|
4751
|
+
ppHandledPropertyNames = !!pn
|
|
4744
4752
|
lines.push(`${guard}{for(const ${kVar} in ${v}){`)
|
|
4745
4753
|
if (pn) {
|
|
4746
4754
|
if (pn.minLength !== undefined) lines.push(`if(${kVar}.length<${pn.minLength}){${fail('minLength', 'propertyNames/minLength', `{limit:${pn.minLength}}`, `'must NOT have fewer than ${pn.minLength} characters'`)}}`)
|
|
@@ -4789,7 +4797,7 @@ function genCodeC(schema, v, pathExpr, lines, ctx, schemaPrefix) {
|
|
|
4789
4797
|
}
|
|
4790
4798
|
|
|
4791
4799
|
// propertyNames — skip if already merged into patternProperties loop
|
|
4792
|
-
if (schema.propertyNames && typeof schema.propertyNames === 'object' && !
|
|
4800
|
+
if (schema.propertyNames && typeof schema.propertyNames === 'object' && !ppHandledPropertyNames) {
|
|
4793
4801
|
const pn = schema.propertyNames
|
|
4794
4802
|
const ki = ctx.varCounter++
|
|
4795
4803
|
lines.push(`if(typeof ${v}==='object'&&${v}!==null&&!Array.isArray(${v})){for(const _k${ki} in ${v}){`)
|
package/lib/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ata-validator",
|
|
3
|
-
"version": "1.30.
|
|
3
|
+
"version": "1.30.2",
|
|
4
4
|
"description": "JSON Schema validation that compiles for speed and still runs where code generation is blocked. Compiled and interpreted engines answer identically at 100% of the official suite. TypeScript inference, Standard Schema V1, and a build step that emits dependency-free modules.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"module": "index.mjs",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"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",
|
|
52
52
|
"build": "cmake-js build --target ata",
|
|
53
53
|
"rebuild": "cmake-js rebuild --target ata",
|
|
54
|
-
"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_scanner_differential.js && node tests/test_validate_json_scanner_cost.js && node tests/test_buffer_reject_cost.js && node tests/test_nan_verdict.js && node tests/test_remove_additional_nested.js && node tests/test_exclusive_bounds.js && node tests/test_engine_differential.js && node tests/test_error_shape_differential.js && node tests/test_output_format.js && node tests/test_retry_message.js && node tests/test_describe_schema.js && node tests/test_aot_parse.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_option.js && node tests/test_compile_cache_order.js && node tests/test_engine_diagnostic.js && node tests/test_format_engine_parity.js && node tests/test_error_accumulator_collision.js && node tests/test_uri_helper_parity.js && node tests/test_formats_single_pass.js && node tests/test_email_format_cost.js && node tests/test_format_single_error.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_deferred_def_scope.js && node tests/test_ajv_errors.js && node tests/test_custom_keywords.js && node tests/test_strict_schema.js && node tests/test_aot_external_checks.js && node tests/test_ajv_parity.js && node tests/test_user_format_error_path.js && node tests/test_unevaluated_error_path.js && node tests/test_unevaluated_error_shape.js && node tests/test_pattern_properties_errors.js && node tests/test_additional_properties_scaling.js && node tests/test_additional_props_combined_cost.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_error_order_ordinal.js && node tests/test_rejection_shape.js && node tests/test_lazy_normalization.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_single_pass_errors.js && node tests/test_lazy_json_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_defaults_own_keys.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_malformed_json_termination.js && node tests/test_data_positions.js && node tests/test_targeted_positions.js && node tests/test_position_map_cost.js && node tests/test_targeted_positions_cost.js && node tests/test_aot_staleness.js && node tests/test_file_positions.js && node tests/test_aot_positions_cost.js && node tests/test_schema_hash.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",
|
|
54
|
+
"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_scanner_differential.js && node tests/test_validate_json_scanner_cost.js && node tests/test_buffer_reject_cost.js && node tests/test_nan_verdict.js && node tests/test_remove_additional_nested.js && node tests/test_exclusive_bounds.js && node tests/test_engine_differential.js && node tests/test_error_shape_differential.js && node tests/test_output_format.js && node tests/test_retry_message.js && node tests/test_describe_schema.js && node tests/test_aot_parse.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_option.js && node tests/test_compile_cache_order.js && node tests/test_engine_diagnostic.js && node tests/test_format_engine_parity.js && node tests/test_error_accumulator_collision.js && node tests/test_uri_helper_parity.js && node tests/test_formats_single_pass.js && node tests/test_email_format_cost.js && node tests/test_format_single_error.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_deferred_def_scope.js && node tests/test_node_scoped_ctx_flags.js && node tests/test_ajv_errors.js && node tests/test_custom_keywords.js && node tests/test_strict_schema.js && node tests/test_aot_external_checks.js && node tests/test_ajv_parity.js && node tests/test_user_format_error_path.js && node tests/test_unevaluated_error_path.js && node tests/test_unevaluated_error_shape.js && node tests/test_pattern_properties_errors.js && node tests/test_additional_properties_scaling.js && node tests/test_additional_props_combined_cost.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_error_order_ordinal.js && node tests/test_rejection_shape.js && node tests/test_lazy_normalization.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_single_pass_errors.js && node tests/test_lazy_json_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_defaults_own_keys.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_malformed_json_termination.js && node tests/test_data_positions.js && node tests/test_targeted_positions.js && node tests/test_position_map_cost.js && node tests/test_targeted_positions_cost.js && node tests/test_aot_staleness.js && node tests/test_file_positions.js && node tests/test_aot_positions_cost.js && node tests/test_schema_hash.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",
|
|
55
55
|
"bench:size": "node benchmark/bench_aot_size.mjs",
|
|
56
56
|
"test:suite": "node tests/run_suite.js && node tests/run_suite.js draft7 && node tests/run_suite.js v1",
|
|
57
57
|
"test:compat": "node tests/test_compat.js",
|
|
@@ -121,13 +121,13 @@
|
|
|
121
121
|
"LICENSE"
|
|
122
122
|
],
|
|
123
123
|
"optionalDependencies": {
|
|
124
|
-
"@ata-validator/native-darwin-arm64": "1.30.
|
|
125
|
-
"@ata-validator/native-darwin-x64": "1.30.
|
|
126
|
-
"@ata-validator/native-linux-arm64-gnu": "1.30.
|
|
127
|
-
"@ata-validator/native-linux-arm64-musl": "1.30.
|
|
128
|
-
"@ata-validator/native-linux-x64-gnu": "1.30.
|
|
129
|
-
"@ata-validator/native-linux-x64-musl": "1.30.
|
|
130
|
-
"@ata-validator/native-win32-x64": "1.30.
|
|
124
|
+
"@ata-validator/native-darwin-arm64": "1.30.2",
|
|
125
|
+
"@ata-validator/native-darwin-x64": "1.30.2",
|
|
126
|
+
"@ata-validator/native-linux-arm64-gnu": "1.30.2",
|
|
127
|
+
"@ata-validator/native-linux-arm64-musl": "1.30.2",
|
|
128
|
+
"@ata-validator/native-linux-x64-gnu": "1.30.2",
|
|
129
|
+
"@ata-validator/native-linux-x64-musl": "1.30.2",
|
|
130
|
+
"@ata-validator/native-win32-x64": "1.30.2"
|
|
131
131
|
},
|
|
132
132
|
"peerDependencies": {
|
|
133
133
|
"yaml": "^2.0.0"
|