@depup/typebox 1.3.30-depup.0 → 1.3.34-depup.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.
- package/README.md +2 -2
- package/build/compile/code.mjs +1 -2
- package/build/compile/validator.mjs +5 -1
- package/build/format/iri.mjs +16 -9
- package/build/guard/emit.mjs +2 -2
- package/build/guard/guard.d.mts +7 -5
- package/build/guard/guard.mjs +14 -9
- package/build/guard/index.mjs +6 -0
- package/build/guard/unicode/unicode.d.mts +6 -0
- package/build/guard/unicode/unicode.mjs +35 -0
- package/build/guard/{string.mjs → unicode/unicode_segment.mjs} +16 -19
- package/build/schema/build.mjs +2 -3
- package/build/schema/engine/_pathing.d.mts +1 -0
- package/build/schema/engine/_pathing.mjs +11 -0
- package/build/schema/engine/_refine.mjs +13 -5
- package/build/schema/engine/additionalProperties.mjs +2 -1
- package/build/schema/engine/dependencies.mjs +2 -1
- package/build/schema/engine/dependentSchemas.mjs +2 -1
- package/build/schema/engine/dynamicRef.d.mts +1 -1
- package/build/schema/engine/dynamicRef.mjs +2 -2
- package/build/schema/engine/format.mjs +9 -2
- package/build/schema/engine/patternProperties.mjs +3 -2
- package/build/schema/engine/properties.mjs +3 -2
- package/build/schema/engine/propertyNames.mjs +2 -1
- package/build/schema/engine/recursiveRef.d.mts +1 -1
- package/build/schema/engine/recursiveRef.mjs +2 -2
- package/build/schema/engine/ref.d.mts +1 -1
- package/build/schema/engine/ref.mjs +2 -2
- package/build/schema/engine/schema.mjs +24 -24
- package/build/schema/parse.mjs +3 -0
- package/build/schema/pointer/pointer.d.mts +1 -6
- package/build/schema/pointer/pointer.mjs +47 -64
- package/build/system/settings/internal.d.mts +2 -0
- package/build/system/settings/internal.mjs +20 -0
- package/build/system/settings/settings.d.mts +11 -0
- package/build/system/settings/settings.mjs +14 -0
- package/build/type/extends/inference.d.mts +1 -1
- package/build/type/extends/inference.mjs +15 -2
- package/build/type/extends/tuple.d.mts +2 -1
- package/build/type/extends/tuple.mjs +21 -1
- package/build/value/parse/parse.mjs +10 -4
- package/changes.json +1 -1
- package/package.json +3 -3
- package/readme.md +3 -1
- /package/build/guard/{string.d.mts → unicode/unicode_segment.d.mts} +0 -0
package/README.md
CHANGED
|
@@ -13,8 +13,8 @@ npm install @depup/typebox
|
|
|
13
13
|
|
|
14
14
|
| Field | Value |
|
|
15
15
|
|-------|-------|
|
|
16
|
-
| Original | [typebox](https://www.npmjs.com/package/typebox) @ 1.3.
|
|
17
|
-
| Processed | 2026-09-
|
|
16
|
+
| Original | [typebox](https://www.npmjs.com/package/typebox) @ 1.3.34 |
|
|
17
|
+
| Processed | 2026-09-20 |
|
|
18
18
|
| Smoke test | passed |
|
|
19
19
|
| Deps updated | 0 |
|
|
20
20
|
|
package/build/compile/code.mjs
CHANGED
|
@@ -16,9 +16,8 @@ function Separator() {
|
|
|
16
16
|
function ImportSection(build) {
|
|
17
17
|
const context = build.UseUnevaluated() ? [`import { CheckContext } from "typebox/schema"`] : [];
|
|
18
18
|
const hashing = `import { Hashing } from "typebox/system"`;
|
|
19
|
-
const format = `import { Format } from "typebox/format"`;
|
|
20
19
|
const guard = `import { Guard } from "typebox/guard"`;
|
|
21
|
-
return [...context, hashing,
|
|
20
|
+
return [...context, hashing, guard];
|
|
22
21
|
}
|
|
23
22
|
// ------------------------------------------------------------------
|
|
24
23
|
// ExternalSection
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
|
+
import { EnableParseErrors, DisableParseErrors } from '../system/settings/internal.mjs';
|
|
2
3
|
import { Settings } from '../system/settings/index.mjs';
|
|
3
4
|
import { Errors, Clean, Convert, Create, Default, Decode, Encode, HasCodec, Parser, ParseError } from '../value/index.mjs';
|
|
4
5
|
import { Build } from '../schema/index.mjs';
|
|
@@ -51,7 +52,10 @@ export class Validator {
|
|
|
51
52
|
return value;
|
|
52
53
|
if (Settings.Get().correctiveParse)
|
|
53
54
|
return Parser(this.Context(), this.Type(), value);
|
|
54
|
-
|
|
55
|
+
EnableParseErrors();
|
|
56
|
+
const errors = this.Errors(value);
|
|
57
|
+
DisableParseErrors();
|
|
58
|
+
throw new ParseError(value, errors);
|
|
55
59
|
}
|
|
56
60
|
/** Returns an array of validation errors for the given value. */
|
|
57
61
|
Errors(value) {
|
package/build/format/iri.mjs
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// deno-lint-ignore-file no-control-regex
|
|
2
|
-
const IpvFutureMatchMaxLength = 2048;
|
|
3
|
-
const IpvFutureMatch = /\[[vV][0-9a-fA-F]+\.[^\]]+\]/; // Guarded By IpvFutureMatchMaxLength
|
|
4
|
-
const InvalidIriChars = /[\x00-\x20<>\^`{|}\\]/;
|
|
5
|
-
const InvalidPercentEncoding = /%(?![0-9a-fA-F]{2})/;
|
|
6
2
|
// ------------------------------------------------------------------
|
|
3
|
+
//
|
|
4
|
+
// Removed by the following PR
|
|
5
|
+
//
|
|
6
|
+
// https://github.com/json-schema-org/JSON-Schema-Test-Suite/pull/1176
|
|
7
|
+
//
|
|
7
8
|
// NarrowIpvFuture
|
|
8
9
|
//
|
|
9
10
|
// Substitutes an IPvFuture address with a standard IPv6 loopback
|
|
@@ -13,12 +14,18 @@ const InvalidPercentEncoding = /%(?![0-9a-fA-F]{2})/;
|
|
|
13
14
|
// be expensive on large strings, this operation is strictly
|
|
14
15
|
// limited to inputs under a defined length threshold.
|
|
15
16
|
//
|
|
16
|
-
//
|
|
17
|
+
// ------------------------------------------------------------------
|
|
18
|
+
//
|
|
19
|
+
// const IpvFutureMatchMaxLength = 2048
|
|
20
|
+
// const IpvFutureMatch = /\[[vV][0-9a-fA-F]+\.[^\]]+\]/ // Guarded By IpvFutureMatchMaxLength
|
|
21
|
+
//
|
|
22
|
+
// function NarrowIpvFuture(value: string): string {
|
|
23
|
+
// return value.length < IpvFutureMatchMaxLength ? value.replace(IpvFutureMatch, '[::1]') : value
|
|
24
|
+
// }
|
|
17
25
|
//
|
|
18
26
|
// ------------------------------------------------------------------
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
27
|
+
const InvalidIriChars = /[\x00-\x20<>\^`{|}\\]/;
|
|
28
|
+
const InvalidPercentEncoding = /%(?![0-9a-fA-F]{2})/;
|
|
22
29
|
/**
|
|
23
30
|
* Returns true if the value is a valid Internationalized Resource Identifier.
|
|
24
31
|
* @specification https://datatracker.ietf.org/doc/html/rfc3987
|
|
@@ -31,5 +38,5 @@ export function IsIri(value) {
|
|
|
31
38
|
if (InvalidPercentEncoding.test(value))
|
|
32
39
|
return false;
|
|
33
40
|
// 3. Delegate to the native URL parser, patching the IPvFuture edge case beforehand.
|
|
34
|
-
return URL.canParse(
|
|
41
|
+
return URL.canParse(value);
|
|
35
42
|
}
|
package/build/guard/emit.mjs
CHANGED
|
@@ -97,10 +97,10 @@ export function IsGreaterEqualThan(left, right) {
|
|
|
97
97
|
// String
|
|
98
98
|
// --------------------------------------------------------------------------
|
|
99
99
|
export function IsMinLength(value, length) {
|
|
100
|
-
return `Guard.
|
|
100
|
+
return `(${value}.length >= ${(+length) << 1} || (${value}.length >= ${length} && Guard.CodePointCount(${value}) >= ${length}))`;
|
|
101
101
|
}
|
|
102
102
|
export function IsMaxLength(value, length) {
|
|
103
|
-
return `Guard.
|
|
103
|
+
return `(${value}.length <= ${length} || (${value}.length <= ${(+length) << 1} && Guard.CodePointCount(${value}) <= ${length}))`;
|
|
104
104
|
}
|
|
105
105
|
// --------------------------------------------------------------------------
|
|
106
106
|
// Array
|
package/build/guard/guard.d.mts
CHANGED
|
@@ -33,12 +33,14 @@ export declare function IsMultipleOf(dividend: bigint | number, divisor: bigint
|
|
|
33
33
|
/** Returns true if the value appears to be an instance of a class. */
|
|
34
34
|
export declare function IsClassInstance(value: unknown): boolean;
|
|
35
35
|
export declare function IsValueLike(value: unknown): value is bigint | boolean | null | number | string | undefined;
|
|
36
|
-
/** Returns the number of grapheme clusters in the string */
|
|
36
|
+
/** Returns the total number of visual grapheme clusters in the string. */
|
|
37
37
|
export declare function GraphemeCount(value: string): number;
|
|
38
|
-
/** Returns
|
|
39
|
-
export declare function
|
|
40
|
-
/** Returns true if the string
|
|
41
|
-
export declare function
|
|
38
|
+
/** Returns the total number of Unicode code points in the string. */
|
|
39
|
+
export declare function CodePointCount(value: string): number;
|
|
40
|
+
/** Returns true if the string length in Unicode code points does not exceed maxLength */
|
|
41
|
+
export declare function IsMaxLength(value: string, maxLength: number): boolean;
|
|
42
|
+
/** Returns true if the string length in Unicode code points is at least minLength */
|
|
43
|
+
export declare function IsMinLength(value: string, minLength: number): boolean;
|
|
42
44
|
/** Returns true if every element from offset satisfies the callback, short-circuiting on the first failure */
|
|
43
45
|
export declare function Every<T>(value: T[], offset: number, callback: (value: T, index: number) => boolean): boolean;
|
|
44
46
|
/** Returns true if every element from offset satisfies the callback, using exhaustive enumeration */
|
package/build/guard/guard.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
|
-
import * as
|
|
2
|
+
import * as UnicodeSegmentGuard from './unicode/unicode_segment.mjs';
|
|
3
|
+
import * as UnicodeGuard from './unicode/unicode.mjs';
|
|
3
4
|
// --------------------------------------------------------------------------
|
|
4
5
|
// Guards
|
|
5
6
|
// --------------------------------------------------------------------------
|
|
@@ -123,17 +124,21 @@ export function IsValueLike(value) {
|
|
|
123
124
|
// --------------------------------------------------------------------------
|
|
124
125
|
// String
|
|
125
126
|
// --------------------------------------------------------------------------
|
|
126
|
-
/** Returns the number of grapheme clusters in the string */
|
|
127
|
+
/** Returns the total number of visual grapheme clusters in the string. */
|
|
127
128
|
export function GraphemeCount(value) {
|
|
128
|
-
return
|
|
129
|
+
return UnicodeSegmentGuard.GraphemeCount(value);
|
|
129
130
|
}
|
|
130
|
-
/** Returns
|
|
131
|
-
export function
|
|
132
|
-
return
|
|
131
|
+
/** Returns the total number of Unicode code points in the string. */
|
|
132
|
+
export function CodePointCount(value) {
|
|
133
|
+
return UnicodeGuard.CodePointCount(value);
|
|
133
134
|
}
|
|
134
|
-
/** Returns true if the string
|
|
135
|
-
export function
|
|
136
|
-
return
|
|
135
|
+
/** Returns true if the string length in Unicode code points does not exceed maxLength */
|
|
136
|
+
export function IsMaxLength(value, maxLength) {
|
|
137
|
+
return UnicodeGuard.IsMaxLength(value, maxLength);
|
|
138
|
+
}
|
|
139
|
+
/** Returns true if the string length in Unicode code points is at least minLength */
|
|
140
|
+
export function IsMinLength(value, minLength) {
|
|
141
|
+
return UnicodeGuard.IsMinLength(value, minLength);
|
|
137
142
|
}
|
|
138
143
|
// --------------------------------------------------------------------------
|
|
139
144
|
// Array
|
package/build/guard/index.mjs
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
// ------------------------------------------------------------------
|
|
2
|
+
// Guards
|
|
3
|
+
// ------------------------------------------------------------------
|
|
1
4
|
export * as EmitGuard from './emit.mjs';
|
|
2
5
|
export * as GlobalsGuard from './globals.mjs';
|
|
3
6
|
export * as NativeGuard from './native.mjs';
|
|
7
|
+
// ------------------------------------------------------------------
|
|
8
|
+
// Default
|
|
9
|
+
// ------------------------------------------------------------------
|
|
4
10
|
import * as Guard from './guard.mjs';
|
|
5
11
|
export * as Guard from './guard.mjs';
|
|
6
12
|
export default Guard;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Returns the total number of Unicode code points in the string */
|
|
2
|
+
export declare function CodePointCount(value: string): number;
|
|
3
|
+
/** Returns true if the string length in Unicode code points is less than or equal to maxLength */
|
|
4
|
+
export declare function IsMaxLength(value: string, maxLength: number): boolean;
|
|
5
|
+
/** Returns true if the string length in Unicode code points is greater than or equal to minLength */
|
|
6
|
+
export declare function IsMinLength(value: string, minLength: number): boolean;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// ------------------------------------------------------------------
|
|
2
|
+
// CodePointCount (10-bit Shift Branchless)
|
|
3
|
+
//
|
|
4
|
+
// Counts code points by enumerating UTF-16 sequences and incrementing
|
|
5
|
+
// when not within a high/low pairing. Because surrogate blocks are
|
|
6
|
+
// 1024 (2^10) wide and aligned, by shifting right by (0xA), we can
|
|
7
|
+
// collapse each unit to a constant per block (high: 0x36, low: 0x37)
|
|
8
|
+
// and shift again into a packed (0x3637) for comparison. Fetch calls
|
|
9
|
+
// to charCodeAt(...) are kept to one call per iteration.
|
|
10
|
+
//
|
|
11
|
+
// ------------------------------------------------------------------
|
|
12
|
+
/** Returns the total number of Unicode code points in the string */
|
|
13
|
+
export function CodePointCount(value) {
|
|
14
|
+
let result = 0, index = 0, prev = 0;
|
|
15
|
+
while (index < value.length) {
|
|
16
|
+
const next = value.charCodeAt(index++) >> 0xA; // shift (10-bits into high/low)
|
|
17
|
+
result += +(((prev << 8) | next) !== 0x3637); // packed (or +!(prev === 0x36 && next === 0x37))
|
|
18
|
+
prev = next;
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
// ------------------------------------------------------------------
|
|
23
|
+
// IsMaxLength
|
|
24
|
+
// ------------------------------------------------------------------
|
|
25
|
+
/** Returns true if the string length in Unicode code points is less than or equal to maxLength */
|
|
26
|
+
export function IsMaxLength(value, maxLength) {
|
|
27
|
+
return value.length <= maxLength || (value.length <= (maxLength << 1) && CodePointCount(value) <= maxLength);
|
|
28
|
+
}
|
|
29
|
+
// ------------------------------------------------------------------
|
|
30
|
+
// IsMinLength
|
|
31
|
+
// ------------------------------------------------------------------
|
|
32
|
+
/** Returns true if the string length in Unicode code points is greater than or equal to minLength */
|
|
33
|
+
export function IsMinLength(value, minLength) {
|
|
34
|
+
return value.length >= (minLength << 1) || (value.length >= minLength && CodePointCount(value) >= minLength);
|
|
35
|
+
}
|
|
@@ -91,26 +91,12 @@ function IsGraphemeCodePoint(value) {
|
|
|
91
91
|
IsZeroWidthJoiner(value)));
|
|
92
92
|
}
|
|
93
93
|
// --------------------------------------------------------------------------
|
|
94
|
-
// GraphemeCount
|
|
95
|
-
// --------------------------------------------------------------------------
|
|
96
|
-
/** Returns the number of grapheme clusters in a string */
|
|
97
|
-
export function GraphemeCount(value) {
|
|
98
|
-
let count = 0;
|
|
99
|
-
let index = 0;
|
|
100
|
-
while (index < value.length) {
|
|
101
|
-
index = NextGraphemeClusterIndex(value, index);
|
|
102
|
-
count++;
|
|
103
|
-
}
|
|
104
|
-
return count;
|
|
105
|
-
}
|
|
106
|
-
// --------------------------------------------------------------------------
|
|
107
94
|
// IsMinLengthSegmented
|
|
108
95
|
// --------------------------------------------------------------------------
|
|
109
96
|
/** Checks if a string has at least a minimum number of grapheme clusters */
|
|
110
97
|
function IsMinLengthSegmented(value, minLength) {
|
|
111
98
|
// if (minLength === 0) return true // 0-length (unreachable)
|
|
112
|
-
let count = 0;
|
|
113
|
-
let index = 0;
|
|
99
|
+
let count = 0, index = 0;
|
|
114
100
|
while (index < value.length) {
|
|
115
101
|
index = NextGraphemeClusterIndex(value, index);
|
|
116
102
|
if ((++count) >= minLength)
|
|
@@ -123,8 +109,7 @@ function IsMinLengthSegmented(value, minLength) {
|
|
|
123
109
|
// --------------------------------------------------------------------------
|
|
124
110
|
/** Checks if a string has at most a maximum number of grapheme clusters */
|
|
125
111
|
function IsMaxLengthSegmented(value, maxLength) {
|
|
126
|
-
let count = 0;
|
|
127
|
-
let index = 0;
|
|
112
|
+
let count = 0, index = 0;
|
|
128
113
|
while (index < value.length) {
|
|
129
114
|
index = NextGraphemeClusterIndex(value, index);
|
|
130
115
|
if ((++count) > maxLength)
|
|
@@ -133,7 +118,19 @@ function IsMaxLengthSegmented(value, maxLength) {
|
|
|
133
118
|
return true;
|
|
134
119
|
}
|
|
135
120
|
// --------------------------------------------------------------------------
|
|
136
|
-
//
|
|
121
|
+
// GraphemeCount
|
|
122
|
+
// --------------------------------------------------------------------------
|
|
123
|
+
/** Returns the number of grapheme clusters in a string */
|
|
124
|
+
export function GraphemeCount(value) {
|
|
125
|
+
let count = 0, index = 0;
|
|
126
|
+
while (index < value.length) {
|
|
127
|
+
index = NextGraphemeClusterIndex(value, index);
|
|
128
|
+
count++;
|
|
129
|
+
}
|
|
130
|
+
return count;
|
|
131
|
+
}
|
|
132
|
+
// --------------------------------------------------------------------------
|
|
133
|
+
// IsMinLength
|
|
137
134
|
// --------------------------------------------------------------------------
|
|
138
135
|
/** Fast check for minimum grapheme length, falls back to full check if needed */
|
|
139
136
|
export function IsMinLength(value, minLength) {
|
|
@@ -151,7 +148,7 @@ export function IsMinLength(value, minLength) {
|
|
|
151
148
|
}
|
|
152
149
|
}
|
|
153
150
|
// --------------------------------------------------------------------------
|
|
154
|
-
//
|
|
151
|
+
// IsMaxLength
|
|
155
152
|
// --------------------------------------------------------------------------
|
|
156
153
|
/** Fast check for maximum grapheme length, falls back to full check if needed */
|
|
157
154
|
export function IsMaxLength(value, maxLength) {
|
package/build/schema/build.mjs
CHANGED
|
@@ -4,7 +4,6 @@ import { Arguments } from '../system/arguments/index.mjs';
|
|
|
4
4
|
import { Environment } from '../system/environment/index.mjs';
|
|
5
5
|
import { Hashing } from '../system/hashing/index.mjs';
|
|
6
6
|
import { Guard } from '../guard/index.mjs';
|
|
7
|
-
import { Format } from '../format/index.mjs';
|
|
8
7
|
import * as Engine from './engine/index.mjs';
|
|
9
8
|
// ------------------------------------------------------------------
|
|
10
9
|
// CreateCode
|
|
@@ -20,8 +19,8 @@ function CreateCode(build) {
|
|
|
20
19
|
// CreateEvaluatedCheck
|
|
21
20
|
// ------------------------------------------------------------------
|
|
22
21
|
function CreateEvaluatedCheck(build, code) {
|
|
23
|
-
const factory = Environment.Evaluate('CheckContext', 'Guard', '
|
|
24
|
-
return factory(Engine.CheckContext, Guard,
|
|
22
|
+
const factory = Environment.Evaluate('CheckContext', 'Guard', 'Hashing', build.External().identifier, code);
|
|
23
|
+
return factory(Engine.CheckContext, Guard, Hashing, build.External().variables);
|
|
25
24
|
}
|
|
26
25
|
// ------------------------------------------------------------------
|
|
27
26
|
// CreateDynamicCheck
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function EncodeFragment(fragment: string): string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// ------------------------------------------------------------------
|
|
2
|
+
// EncodeFragment
|
|
3
|
+
//
|
|
4
|
+
// We use this function to encode instancePath and schemaPath path
|
|
5
|
+
// fragments for errors. We need this encoding such that callers
|
|
6
|
+
// can use Pointer to deref error targets. We should consider adding
|
|
7
|
+
// this to the Pointer module as Pointer.Encode(...) (review)
|
|
8
|
+
// ------------------------------------------------------------------
|
|
9
|
+
export function EncodeFragment(fragment) {
|
|
10
|
+
return fragment.replace(/~/g, '~0').replace(/\//g, '~1');
|
|
11
|
+
}
|
|
@@ -4,9 +4,18 @@ import { EmitGuard as E, Guard as G } from '../../guard/index.mjs';
|
|
|
4
4
|
// ------------------------------------------------------------------
|
|
5
5
|
// Build
|
|
6
6
|
// ------------------------------------------------------------------
|
|
7
|
+
function BuildRefineMultiple(_stack, _context, schema, value) {
|
|
8
|
+
const external = Externals.CreateVariable(schema['~refine']);
|
|
9
|
+
return E.Every(external, E.Constant(0), ['refinement', '_'], E.Call(E.Member('refinement', 'check'), [value]));
|
|
10
|
+
}
|
|
11
|
+
function BuildRefineSingle(_stack, _context, schema, value) {
|
|
12
|
+
const external = Externals.CreateVariable(schema['~refine'][0]);
|
|
13
|
+
return E.Call(E.Member(external, 'check'), [value]);
|
|
14
|
+
}
|
|
7
15
|
export function BuildRefine(_stack, _context, schema, value) {
|
|
8
|
-
|
|
9
|
-
|
|
16
|
+
return G.IsEqual(schema['~refine'].length, 1)
|
|
17
|
+
? BuildRefineSingle(_stack, _context, schema, value)
|
|
18
|
+
: BuildRefineMultiple(_stack, _context, schema, value);
|
|
10
19
|
}
|
|
11
20
|
// ------------------------------------------------------------------
|
|
12
21
|
// Check
|
|
@@ -19,8 +28,7 @@ export function CheckRefine(_stack, _context, schema, value) {
|
|
|
19
28
|
// ------------------------------------------------------------------
|
|
20
29
|
export function ErrorRefine(_stack, context, schemaPath, instancePath, schema, value) {
|
|
21
30
|
return G.EveryAll(schema['~refine'], 0, (refinement, index) => {
|
|
22
|
-
return refinement.check(value) ||
|
|
23
|
-
index, message: refinement.error(value)
|
|
24
|
-
});
|
|
31
|
+
return refinement.check(value) ||
|
|
32
|
+
context.AddError('~refine', schemaPath, instancePath, { index, message: refinement.error(value) });
|
|
25
33
|
});
|
|
26
34
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
2
|
import * as Schema from '../types/index.mjs';
|
|
3
3
|
import * as Externals from './_externals.mjs';
|
|
4
|
+
import * as Pathing from './_pathing.mjs';
|
|
4
5
|
import { Unique } from './_unique.mjs';
|
|
5
6
|
import { UnicodeRegExp } from './_regexp.mjs';
|
|
6
7
|
import { EmitGuard as E, Guard as G } from '../../guard/index.mjs';
|
|
@@ -107,7 +108,7 @@ export function ErrorAdditionalProperties(stack, context, schemaPath, instancePa
|
|
|
107
108
|
const additionalProperties = [];
|
|
108
109
|
const isAdditionalProperties = G.EveryAll(G.Keys(value), 0, (key, _index) => {
|
|
109
110
|
const nextSchemaPath = `${schemaPath}/additionalProperties`;
|
|
110
|
-
const nextInstancePath = `${instancePath}/${key}`;
|
|
111
|
+
const nextInstancePath = `${instancePath}/${Pathing.EncodeFragment(key)}`;
|
|
111
112
|
const isAdditionalProperty = regexp.test(key) ||
|
|
112
113
|
(ErrorSchemaPushStack(stack, context, nextSchemaPath, nextInstancePath, schema.additionalProperties, value[key]) && context.AddKey(key));
|
|
113
114
|
if (!isAdditionalProperty)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
|
+
import * as Pathing from './_pathing.mjs';
|
|
2
3
|
import { EmitGuard as E, Guard as G } from '../../guard/index.mjs';
|
|
3
4
|
import { BuildSchema, CheckSchema, ErrorSchema } from './schema.mjs';
|
|
4
5
|
// ------------------------------------------------------------------
|
|
@@ -32,7 +33,7 @@ export function CheckDependencies(stack, context, schema, value) {
|
|
|
32
33
|
export function ErrorDependencies(stack, context, schemaPath, instancePath, schema, value) {
|
|
33
34
|
const isLength = G.IsEqual(G.Keys(value).length, 0);
|
|
34
35
|
const isEvery = G.EveryAll(G.Entries(schema.dependencies), 0, ([key, schema]) => {
|
|
35
|
-
const nextSchemaPath = `${schemaPath}/dependencies/${key}`;
|
|
36
|
+
const nextSchemaPath = `${schemaPath}/dependencies/${Pathing.EncodeFragment(key)}`;
|
|
36
37
|
return !G.HasPropertyKey(value, key) || (G.IsArray(schema)
|
|
37
38
|
? schema.every((dependency) => G.HasPropertyKey(value, dependency) ||
|
|
38
39
|
context.AddError('dependencies', schemaPath, instancePath, { property: key, dependencies: schema }))
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
|
+
import * as Pathing from './_pathing.mjs';
|
|
2
3
|
import { Guard as G, EmitGuard as E } from '../../guard/index.mjs';
|
|
3
4
|
import { BuildSchema, CheckSchema, ErrorSchema } from './schema.mjs';
|
|
4
5
|
// ------------------------------------------------------------------
|
|
@@ -30,7 +31,7 @@ export function CheckDependentSchemas(stack, context, schema, value) {
|
|
|
30
31
|
export function ErrorDependentSchemas(stack, context, schemaPath, instancePath, schema, value) {
|
|
31
32
|
const isLength = G.IsEqual(G.Keys(value).length, 0);
|
|
32
33
|
const isEvery = G.EveryAll(G.Entries(schema.dependentSchemas), 0, ([key, schema]) => {
|
|
33
|
-
const nextSchemaPath = `${schemaPath}/dependentSchemas/${key}`;
|
|
34
|
+
const nextSchemaPath = `${schemaPath}/dependentSchemas/${Pathing.EncodeFragment(key)}`;
|
|
34
35
|
return !G.HasPropertyKey(value, key) ||
|
|
35
36
|
ErrorSchema(stack, context, nextSchemaPath, instancePath, schema, value);
|
|
36
37
|
});
|
|
@@ -3,4 +3,4 @@ import * as Stack from './_stack.mjs';
|
|
|
3
3
|
import { BuildContext, CheckContext, ErrorContext } from './_context.mjs';
|
|
4
4
|
export declare function BuildDynamicRef(stack: Stack.XStack, context: BuildContext, schema: Schema.XDynamicRef, value: string): string;
|
|
5
5
|
export declare function CheckDynamicRef(stack: Stack.XStack, context: CheckContext, schema: Schema.XDynamicRef, value: unknown): boolean;
|
|
6
|
-
export declare function ErrorDynamicRef(stack: Stack.XStack, context: ErrorContext,
|
|
6
|
+
export declare function ErrorDynamicRef(stack: Stack.XStack, context: ErrorContext, schemaPath: string, instancePath: string, schema: Schema.XDynamicRef, value: unknown): boolean;
|
|
@@ -22,8 +22,8 @@ export function CheckDynamicRef(stack, context, schema, value) {
|
|
|
22
22
|
// ------------------------------------------------------------------
|
|
23
23
|
// Error
|
|
24
24
|
// ------------------------------------------------------------------
|
|
25
|
-
export function ErrorDynamicRef(stack, context,
|
|
25
|
+
export function ErrorDynamicRef(stack, context, schemaPath, instancePath, schema, value) {
|
|
26
26
|
const target = Resolve.DynamicRef(stack, schema) ?? false;
|
|
27
27
|
const nextStack = target ? { ...stack, pendingResource: true } : stack;
|
|
28
|
-
return (Schema.IsSchema(target) && ErrorSchema(nextStack, context,
|
|
28
|
+
return (Schema.IsSchema(target) && ErrorSchema(nextStack, context, schemaPath, instancePath, target, value));
|
|
29
29
|
}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
|
+
import * as Externals from './_externals.mjs';
|
|
2
3
|
import { Format } from '../../format/index.mjs';
|
|
3
4
|
import { EmitGuard as E } from '../../guard/index.mjs';
|
|
4
5
|
// ------------------------------------------------------------------
|
|
5
|
-
// Build
|
|
6
|
+
// Build (Remote)
|
|
7
|
+
// ------------------------------------------------------------------
|
|
8
|
+
// export function BuildFormat(_stack: Stack.XStack, _context: BuildContext, schema: Schema.XFormat, value: string): string {
|
|
9
|
+
// return E.Call(E.Member('Format', 'Test'), [E.Constant(schema.format), value])
|
|
10
|
+
// }
|
|
11
|
+
// ------------------------------------------------------------------
|
|
12
|
+
// Build (Inline)
|
|
6
13
|
// ------------------------------------------------------------------
|
|
7
14
|
export function BuildFormat(_stack, _context, schema, value) {
|
|
8
|
-
return E.Call(
|
|
15
|
+
return Format.Has(schema.format) ? E.Call(Externals.CreateVariable(Format.Get(schema.format)), [value]) : E.Constant(true);
|
|
9
16
|
}
|
|
10
17
|
// ------------------------------------------------------------------
|
|
11
18
|
// Check
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
2
|
import * as Externals from './_externals.mjs';
|
|
3
|
+
import * as Pathing from './_pathing.mjs';
|
|
3
4
|
import { Unique } from './_unique.mjs';
|
|
4
5
|
import { UnicodeRegExp } from './_regexp.mjs';
|
|
5
6
|
import { BuildSchemaPushStack, CheckSchemaPushStack, ErrorSchemaPushStack } from './schema.mjs';
|
|
@@ -34,10 +35,10 @@ export function CheckPatternProperties(stack, context, schema, value) {
|
|
|
34
35
|
// ------------------------------------------------------------------
|
|
35
36
|
export function ErrorPatternProperties(stack, context, schemaPath, instancePath, schema, value) {
|
|
36
37
|
return G.EveryAll(G.Entries(schema.patternProperties), 0, ([pattern, schema]) => {
|
|
37
|
-
const nextSchemaPath = `${schemaPath}/patternProperties/${pattern}`;
|
|
38
|
+
const nextSchemaPath = `${schemaPath}/patternProperties/${Pathing.EncodeFragment(pattern)}`;
|
|
38
39
|
const regexp = UnicodeRegExp(pattern);
|
|
39
40
|
return G.EveryAll(G.Entries(value), 0, ([key, value]) => {
|
|
40
|
-
const nextInstancePath = `${instancePath}/${key}`;
|
|
41
|
+
const nextInstancePath = `${instancePath}/${Pathing.EncodeFragment(key)}`;
|
|
41
42
|
const notKey = !regexp.test(key);
|
|
42
43
|
return notKey || ErrorSchemaPushStack(stack, context, nextSchemaPath, nextInstancePath, schema, value) && context.AddKey(key);
|
|
43
44
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
2
|
import * as Schema from '../types/index.mjs';
|
|
3
|
+
import * as Pathing from './_pathing.mjs';
|
|
3
4
|
import { BuildSchemaPushStack, CheckSchemaPushStack, ErrorSchemaPushStack } from './schema.mjs';
|
|
4
5
|
import { InexactOptionalCheck, InexactOptionalBuild, IsExactOptional } from './_exact_optional.mjs';
|
|
5
6
|
import { Guard as G, EmitGuard as E } from '../../guard/index.mjs';
|
|
@@ -63,8 +64,8 @@ export function CheckProperties(stack, context, schema, value) {
|
|
|
63
64
|
export function ErrorProperties(stack, context, schemaPath, instancePath, schema, value) {
|
|
64
65
|
const required = Schema.IsRequired(schema) ? schema.required : [];
|
|
65
66
|
const isProperties = G.EveryAll(G.Entries(schema.properties), 0, ([key, schema]) => {
|
|
66
|
-
const nextSchemaPath = `${schemaPath}/properties/${key}`;
|
|
67
|
-
const nextInstancePath = `${instancePath}/${key}`;
|
|
67
|
+
const nextSchemaPath = `${schemaPath}/properties/${Pathing.EncodeFragment(key)}`;
|
|
68
|
+
const nextInstancePath = `${instancePath}/${Pathing.EncodeFragment(key)}`;
|
|
68
69
|
// Defer error generation for IsExactOptional
|
|
69
70
|
const isProperty = () => (!G.HasPropertyKey(value, key) || (ErrorSchemaPushStack(stack, context, nextSchemaPath, nextInstancePath, schema, value[key]) && context.AddKey(key)));
|
|
70
71
|
return IsExactOptional(required, key)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
|
+
import * as Pathing from './_pathing.mjs';
|
|
2
3
|
import { Unique } from './_unique.mjs';
|
|
3
4
|
import { BuildSchema, CheckSchema, ErrorSchema } from './schema.mjs';
|
|
4
5
|
import { EmitGuard as E, Guard as G } from '../../guard/index.mjs';
|
|
@@ -21,7 +22,7 @@ export function CheckPropertyNames(stack, context, schema, value) {
|
|
|
21
22
|
export function ErrorPropertyNames(stack, context, schemaPath, instancePath, schema, value) {
|
|
22
23
|
const propertyNames = [];
|
|
23
24
|
const isPropertyNames = G.EveryAll(G.Keys(value), 0, (key, _index) => {
|
|
24
|
-
const nextInstancePath = `${instancePath}/${key}`;
|
|
25
|
+
const nextInstancePath = `${instancePath}/${Pathing.EncodeFragment(key)}`;
|
|
25
26
|
const nextSchemaPath = `${schemaPath}/propertyNames`;
|
|
26
27
|
const isPropertyName = ErrorSchema(stack, context, nextSchemaPath, nextInstancePath, schema.propertyNames, key);
|
|
27
28
|
if (!isPropertyName)
|
|
@@ -3,4 +3,4 @@ import * as Stack from './_stack.mjs';
|
|
|
3
3
|
import { BuildContext, CheckContext, ErrorContext } from './_context.mjs';
|
|
4
4
|
export declare function BuildRecursiveRef(stack: Stack.XStack, context: BuildContext, schema: Schema.XRecursiveRef, value: string): string;
|
|
5
5
|
export declare function CheckRecursiveRef(stack: Stack.XStack, context: CheckContext, schema: Schema.XRecursiveRef, value: unknown): boolean;
|
|
6
|
-
export declare function ErrorRecursiveRef(stack: Stack.XStack, context: ErrorContext,
|
|
6
|
+
export declare function ErrorRecursiveRef(stack: Stack.XStack, context: ErrorContext, schemaPath: string, instancePath: string, schema: Schema.XRecursiveRef, value: unknown): boolean;
|
|
@@ -22,8 +22,8 @@ export function CheckRecursiveRef(stack, context, schema, value) {
|
|
|
22
22
|
// ------------------------------------------------------------------
|
|
23
23
|
// Error
|
|
24
24
|
// ------------------------------------------------------------------
|
|
25
|
-
export function ErrorRecursiveRef(stack, context,
|
|
25
|
+
export function ErrorRecursiveRef(stack, context, schemaPath, instancePath, schema, value) {
|
|
26
26
|
const target = Resolve.RecursiveRef(stack, schema) ?? false;
|
|
27
27
|
const nextStack = target ? { ...stack, pendingResource: true } : stack;
|
|
28
|
-
return (Schema.IsSchema(target) && ErrorSchema(nextStack, context,
|
|
28
|
+
return (Schema.IsSchema(target) && ErrorSchema(nextStack, context, schemaPath, instancePath, target, value));
|
|
29
29
|
}
|
|
@@ -3,4 +3,4 @@ import * as Stack from './_stack.mjs';
|
|
|
3
3
|
import { BuildContext, CheckContext, ErrorContext } from './_context.mjs';
|
|
4
4
|
export declare function BuildRef(stack: Stack.XStack, context: BuildContext, schema: Schema.XRef, value: string): string;
|
|
5
5
|
export declare function CheckRef(stack: Stack.XStack, context: CheckContext, schema: Schema.XRef, value: unknown): boolean;
|
|
6
|
-
export declare function ErrorRef(stack: Stack.XStack, context: ErrorContext,
|
|
6
|
+
export declare function ErrorRef(stack: Stack.XStack, context: ErrorContext, schemaPath: string, instancePath: string, schema: Schema.XRef, value: unknown): boolean;
|
|
@@ -43,11 +43,11 @@ export function CheckRef(stack, context, schema, value) {
|
|
|
43
43
|
// ------------------------------------------------------------------
|
|
44
44
|
// Error
|
|
45
45
|
// ------------------------------------------------------------------
|
|
46
|
-
export function ErrorRef(stack, context,
|
|
46
|
+
export function ErrorRef(stack, context, schemaPath, instancePath, schema, value) {
|
|
47
47
|
const result = Resolve.Ref(stack, schema);
|
|
48
48
|
const target = result.schema ?? false;
|
|
49
49
|
const nextContext = new ErrorContext();
|
|
50
|
-
const valid = (Schema.IsSchema(target) && ErrorSchema(result.stack, nextContext,
|
|
50
|
+
const valid = (Schema.IsSchema(target) && ErrorSchema(result.stack, nextContext, schemaPath, instancePath, target, value));
|
|
51
51
|
if (valid)
|
|
52
52
|
context.Merge([nextContext]);
|
|
53
53
|
if (!valid)
|
|
@@ -173,14 +173,14 @@ export function BuildSchema(stack, context, schema, value) {
|
|
|
173
173
|
constraints.push(BuildContains(current, context, schema, value));
|
|
174
174
|
if (Schema.IsItems(schema))
|
|
175
175
|
constraints.push(BuildItems(current, context, schema, value));
|
|
176
|
-
if (Schema.IsMaxContains(schema))
|
|
177
|
-
constraints.push(BuildMaxContains(current, context, schema, value));
|
|
178
|
-
if (Schema.IsMaxItems(schema))
|
|
179
|
-
constraints.push(BuildMaxItems(current, context, schema, value));
|
|
180
176
|
if (Schema.IsMinContains(schema))
|
|
181
177
|
constraints.push(BuildMinContains(current, context, schema, value));
|
|
178
|
+
if (Schema.IsMaxContains(schema))
|
|
179
|
+
constraints.push(BuildMaxContains(current, context, schema, value));
|
|
182
180
|
if (Schema.IsMinItems(schema))
|
|
183
181
|
constraints.push(BuildMinItems(current, context, schema, value));
|
|
182
|
+
if (Schema.IsMaxItems(schema))
|
|
183
|
+
constraints.push(BuildMaxItems(current, context, schema, value));
|
|
184
184
|
if (Schema.IsPrefixItems(schema))
|
|
185
185
|
constraints.push(BuildPrefixItems(current, context, schema, value));
|
|
186
186
|
if (Schema.IsUniqueItems(schema))
|
|
@@ -191,10 +191,10 @@ export function BuildSchema(stack, context, schema, value) {
|
|
|
191
191
|
}
|
|
192
192
|
if (HasStringKeywords(schema)) {
|
|
193
193
|
const constraints = [];
|
|
194
|
-
if (Schema.IsMaxLength(schema))
|
|
195
|
-
constraints.push(BuildMaxLength(current, context, schema, value));
|
|
196
194
|
if (Schema.IsMinLength(schema))
|
|
197
195
|
constraints.push(BuildMinLength(current, context, schema, value));
|
|
196
|
+
if (Schema.IsMaxLength(schema))
|
|
197
|
+
constraints.push(BuildMaxLength(current, context, schema, value));
|
|
198
198
|
if (Schema.IsFormat(schema))
|
|
199
199
|
constraints.push(BuildFormat(current, context, schema, value));
|
|
200
200
|
if (Schema.IsPattern(schema))
|
|
@@ -205,14 +205,14 @@ export function BuildSchema(stack, context, schema, value) {
|
|
|
205
205
|
}
|
|
206
206
|
if (HasNumberKeywords(schema)) {
|
|
207
207
|
const constraints = [];
|
|
208
|
-
if (Schema.IsExclusiveMaximum(schema))
|
|
209
|
-
constraints.push(BuildExclusiveMaximum(current, context, schema, value));
|
|
210
208
|
if (Schema.IsExclusiveMinimum(schema))
|
|
211
209
|
constraints.push(BuildExclusiveMinimum(current, context, schema, value));
|
|
212
|
-
if (Schema.
|
|
213
|
-
constraints.push(
|
|
210
|
+
if (Schema.IsExclusiveMaximum(schema))
|
|
211
|
+
constraints.push(BuildExclusiveMaximum(current, context, schema, value));
|
|
214
212
|
if (Schema.IsMinimum(schema))
|
|
215
213
|
constraints.push(BuildMinimum(current, context, schema, value));
|
|
214
|
+
if (Schema.IsMaximum(schema))
|
|
215
|
+
constraints.push(BuildMaximum(current, context, schema, value));
|
|
216
216
|
if (Schema.IsMultipleOf(schema))
|
|
217
217
|
constraints.push(BuildMultipleOf(current, context, schema, value));
|
|
218
218
|
const reduced = E.ReduceAnd(constraints);
|
|
@@ -270,20 +270,20 @@ export function CheckSchema(stack, context, schema, value) {
|
|
|
270
270
|
(!G.IsArray(value) || ((!Schema.IsAdditionalItems(schema) || CheckAdditionalItems(current, context, schema, value)) &&
|
|
271
271
|
(!Schema.IsContains(schema) || CheckContains(current, context, schema, value)) &&
|
|
272
272
|
(!Schema.IsItems(schema) || CheckItems(current, context, schema, value)) &&
|
|
273
|
-
(!Schema.IsMaxContains(schema) || CheckMaxContains(current, context, schema, value)) &&
|
|
274
|
-
(!Schema.IsMaxItems(schema) || CheckMaxItems(current, context, schema, value)) &&
|
|
275
273
|
(!Schema.IsMinContains(schema) || CheckMinContains(current, context, schema, value)) &&
|
|
274
|
+
(!Schema.IsMaxContains(schema) || CheckMaxContains(current, context, schema, value)) &&
|
|
276
275
|
(!Schema.IsMinItems(schema) || CheckMinItems(current, context, schema, value)) &&
|
|
276
|
+
(!Schema.IsMaxItems(schema) || CheckMaxItems(current, context, schema, value)) &&
|
|
277
277
|
(!Schema.IsPrefixItems(schema) || CheckPrefixItems(current, context, schema, value)) &&
|
|
278
278
|
(!Schema.IsUniqueItems(schema) || CheckUniqueItems(current, context, schema, value)))) &&
|
|
279
|
-
(!G.IsString(value) || ((!Schema.
|
|
280
|
-
(!Schema.
|
|
279
|
+
(!G.IsString(value) || ((!Schema.IsMinLength(schema) || CheckMinLength(current, context, schema, value)) &&
|
|
280
|
+
(!Schema.IsMaxLength(schema) || CheckMaxLength(current, context, schema, value)) &&
|
|
281
281
|
(!Schema.IsFormat(schema) || CheckFormat(current, context, schema, value)) &&
|
|
282
282
|
(!Schema.IsPattern(schema) || CheckPattern(current, context, schema, value)))) &&
|
|
283
|
-
(!(G.IsNumber(value) || G.IsBigInt(value)) || ((!Schema.
|
|
284
|
-
(!Schema.
|
|
285
|
-
(!Schema.IsMaximum(schema) || CheckMaximum(current, context, schema, value)) &&
|
|
283
|
+
(!(G.IsNumber(value) || G.IsBigInt(value)) || ((!Schema.IsExclusiveMinimum(schema) || CheckExclusiveMinimum(current, context, schema, value)) &&
|
|
284
|
+
(!Schema.IsExclusiveMaximum(schema) || CheckExclusiveMaximum(current, context, schema, value)) &&
|
|
286
285
|
(!Schema.IsMinimum(schema) || CheckMinimum(current, context, schema, value)) &&
|
|
286
|
+
(!Schema.IsMaximum(schema) || CheckMaximum(current, context, schema, value)) &&
|
|
287
287
|
(!Schema.IsMultipleOf(schema) || CheckMultipleOf(current, context, schema, value)))) &&
|
|
288
288
|
(!Schema.IsRef(schema) || CheckRef(current, context, schema, value)) &&
|
|
289
289
|
(!Schema.IsRecursiveRef(schema) || CheckRecursiveRef(current, context, schema, value)) &&
|
|
@@ -328,20 +328,20 @@ export function ErrorSchema(stack, context, schemaPath, instancePath, schema, va
|
|
|
328
328
|
+(!G.IsArray(value) || !!(+(!Schema.IsAdditionalItems(schema) || ErrorAdditionalItems(current, context, schemaPath, instancePath, schema, value)) &
|
|
329
329
|
+(!Schema.IsContains(schema) || ErrorContains(current, context, schemaPath, instancePath, schema, value)) &
|
|
330
330
|
+(!Schema.IsItems(schema) || ErrorItems(current, context, schemaPath, instancePath, schema, value)) &
|
|
331
|
-
+(!Schema.IsMaxContains(schema) || ErrorMaxContains(current, context, schemaPath, instancePath, schema, value)) &
|
|
332
|
-
+(!Schema.IsMaxItems(schema) || ErrorMaxItems(current, context, schemaPath, instancePath, schema, value)) &
|
|
333
331
|
+(!Schema.IsMinContains(schema) || ErrorMinContains(current, context, schemaPath, instancePath, schema, value)) &
|
|
332
|
+
+(!Schema.IsMaxContains(schema) || ErrorMaxContains(current, context, schemaPath, instancePath, schema, value)) &
|
|
334
333
|
+(!Schema.IsMinItems(schema) || ErrorMinItems(current, context, schemaPath, instancePath, schema, value)) &
|
|
334
|
+
+(!Schema.IsMaxItems(schema) || ErrorMaxItems(current, context, schemaPath, instancePath, schema, value)) &
|
|
335
335
|
+(!Schema.IsPrefixItems(schema) || ErrorPrefixItems(current, context, schemaPath, instancePath, schema, value)) &
|
|
336
336
|
+(!Schema.IsUniqueItems(schema) || ErrorUniqueItems(current, context, schemaPath, instancePath, schema, value)))) &
|
|
337
|
-
+(!G.IsString(value) || !!(+(!Schema.
|
|
338
|
-
+(!Schema.
|
|
337
|
+
+(!G.IsString(value) || !!(+(!Schema.IsMinLength(schema) || ErrorMinLength(current, context, schemaPath, instancePath, schema, value)) &
|
|
338
|
+
+(!Schema.IsMaxLength(schema) || ErrorMaxLength(current, context, schemaPath, instancePath, schema, value)) &
|
|
339
339
|
+(!Schema.IsFormat(schema) || ErrorFormat(current, context, schemaPath, instancePath, schema, value)) &
|
|
340
340
|
+(!Schema.IsPattern(schema) || ErrorPattern(current, context, schemaPath, instancePath, schema, value)))) &
|
|
341
|
-
+(!(G.IsNumber(value) || G.IsBigInt(value)) || !!(+(!Schema.
|
|
342
|
-
+(!Schema.
|
|
343
|
-
+(!Schema.IsMaximum(schema) || ErrorMaximum(current, context, schemaPath, instancePath, schema, value)) &
|
|
341
|
+
+(!(G.IsNumber(value) || G.IsBigInt(value)) || !!(+(!Schema.IsExclusiveMinimum(schema) || ErrorExclusiveMinimum(current, context, schemaPath, instancePath, schema, value)) &
|
|
342
|
+
+(!Schema.IsExclusiveMaximum(schema) || ErrorExclusiveMaximum(current, context, schemaPath, instancePath, schema, value)) &
|
|
344
343
|
+(!Schema.IsMinimum(schema) || ErrorMinimum(current, context, schemaPath, instancePath, schema, value)) &
|
|
344
|
+
+(!Schema.IsMaximum(schema) || ErrorMaximum(current, context, schemaPath, instancePath, schema, value)) &
|
|
345
345
|
+(!Schema.IsMultipleOf(schema) || ErrorMultipleOf(current, context, schemaPath, instancePath, schema, value)))) &
|
|
346
346
|
+(!Schema.IsRef(schema) || ErrorRef(current, context, schemaPath, instancePath, schema, value)) &
|
|
347
347
|
+(!Schema.IsRecursiveRef(schema) || ErrorRecursiveRef(current, context, schemaPath, instancePath, schema, value)) &
|
package/build/schema/parse.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
2
|
// deno-lint-ignore-file
|
|
3
|
+
import { EnableParseErrors, DisableParseErrors } from '../system/settings/internal.mjs';
|
|
3
4
|
import { Arguments } from '../system/arguments/index.mjs';
|
|
4
5
|
import { Check } from './check.mjs';
|
|
5
6
|
import { Errors } from './errors.mjs';
|
|
@@ -17,7 +18,9 @@ export class ParseError {
|
|
|
17
18
|
// ThrowParseError
|
|
18
19
|
// ------------------------------------------------------------------
|
|
19
20
|
export function ThrowParseError(context, schema, value) {
|
|
21
|
+
EnableParseErrors();
|
|
20
22
|
const result = Errors(context, schema, value);
|
|
23
|
+
DisableParseErrors();
|
|
21
24
|
throw new ParseError(schema, value, result[1]);
|
|
22
25
|
}
|
|
23
26
|
/** Parses a value against the provided schema */
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
/** Returns an array of path indices for the given pointer */
|
|
2
1
|
export declare function Indices(pointer: string): string[];
|
|
3
|
-
|
|
4
|
-
export declare function Has(value: unknown, pointer: string): unknown;
|
|
5
|
-
/** Gets a value at the pointer, or undefined if not exists */
|
|
2
|
+
export declare function Has(value: unknown, pointer: string): boolean;
|
|
6
3
|
export declare function Get(value: unknown, pointer: string): unknown;
|
|
7
|
-
/** Sets a value at the given pointer. May throw if the target value is not indexable */
|
|
8
4
|
export declare function Set(value: unknown, pointer: string, next: unknown): unknown;
|
|
9
|
-
/** Deletes the value at the given pointer. May throw if the target value is not indexable */
|
|
10
5
|
export declare function Delete(value: unknown, pointer: string): unknown;
|
|
@@ -1,106 +1,89 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
2
|
import { Guard } from '../../guard/index.mjs';
|
|
3
3
|
// ------------------------------------------------------------------
|
|
4
|
-
//
|
|
4
|
+
// Throw
|
|
5
5
|
// ------------------------------------------------------------------
|
|
6
|
-
function
|
|
7
|
-
|
|
8
|
-
throw Error('Cannot set root');
|
|
6
|
+
function Throw(message) {
|
|
7
|
+
throw Error(message);
|
|
9
8
|
}
|
|
10
|
-
function
|
|
11
|
-
|
|
12
|
-
throw Error('Cannot set value');
|
|
9
|
+
function ThrowUnsafePropertyKey() {
|
|
10
|
+
Throw('Pointer contains unsafe property key');
|
|
13
11
|
}
|
|
14
|
-
function
|
|
15
|
-
|
|
16
|
-
throw Error('Pointer contains unsafe property key');
|
|
17
|
-
}
|
|
18
|
-
function AssertIndices(indices) {
|
|
19
|
-
for (const index of indices)
|
|
20
|
-
AssertIndex(index);
|
|
21
|
-
}
|
|
22
|
-
// ------------------------------------------------------------------
|
|
23
|
-
// Indices
|
|
24
|
-
// ------------------------------------------------------------------
|
|
25
|
-
function IsNumericIndex(index) {
|
|
26
|
-
return /^(0|[1-9]\d*)$/.test(index);
|
|
27
|
-
}
|
|
28
|
-
function TakeIndexRight(indices) {
|
|
29
|
-
return [
|
|
30
|
-
indices.slice(0, indices.length - 1),
|
|
31
|
-
indices.slice(indices.length - 1)[0]
|
|
32
|
-
];
|
|
33
|
-
}
|
|
34
|
-
function HasIndex(index, value) {
|
|
35
|
-
return Guard.IsObject(value) && Guard.HasPropertyKey(value, index);
|
|
36
|
-
}
|
|
37
|
-
function GetIndex(index, value) {
|
|
38
|
-
return Guard.IsObject(value) && !Guard.IsUnsafePropertyKey(index) ? value[index] : undefined;
|
|
39
|
-
}
|
|
40
|
-
function GetIndices(indices, value) {
|
|
41
|
-
return indices.reduce((value, index) => GetIndex(index, value), value);
|
|
12
|
+
function ThrowCannotSetRoot() {
|
|
13
|
+
Throw('Cannot set value');
|
|
42
14
|
}
|
|
43
15
|
// ------------------------------------------------------------------
|
|
44
16
|
// Indices
|
|
45
17
|
// ------------------------------------------------------------------
|
|
46
|
-
/** Returns an array of path indices for the given pointer */
|
|
47
18
|
export function Indices(pointer) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const indices = pointer.split("/").map(index => index.replace(/~1/g, "/").replace(/~0/g, "~"));
|
|
51
|
-
return (indices.length > 0 && indices[0] === '') ? indices.slice(1) : indices;
|
|
19
|
+
const indices = pointer.split('/').map(index => index.replace(/~1/g, '/').replace(/~0/g, '~'));
|
|
20
|
+
return indices[0] === '' ? indices.slice(1) : indices;
|
|
52
21
|
}
|
|
53
22
|
// ------------------------------------------------------------------
|
|
54
23
|
// Has
|
|
55
24
|
// ------------------------------------------------------------------
|
|
56
|
-
/** Returns true if a value exists at the current pointer */
|
|
57
25
|
export function Has(value, pointer) {
|
|
58
26
|
let current = value;
|
|
59
|
-
|
|
60
|
-
if (!
|
|
27
|
+
for (const index of Indices(pointer)) {
|
|
28
|
+
if (!Guard.IsObject(current) || !Guard.HasPropertyKey(current, index))
|
|
61
29
|
return false;
|
|
62
30
|
current = current[index];
|
|
63
|
-
|
|
64
|
-
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
65
33
|
}
|
|
66
34
|
// ------------------------------------------------------------------
|
|
67
35
|
// Get
|
|
68
36
|
// ------------------------------------------------------------------
|
|
69
|
-
/** Gets a value at the pointer, or undefined if not exists */
|
|
70
37
|
export function Get(value, pointer) {
|
|
71
|
-
|
|
72
|
-
|
|
38
|
+
let current = value;
|
|
39
|
+
for (const index of Indices(pointer)) {
|
|
40
|
+
if (!Guard.IsObject(current) || Guard.IsUnsafePropertyKey(index))
|
|
41
|
+
return undefined;
|
|
42
|
+
current = current[index];
|
|
43
|
+
}
|
|
44
|
+
return current;
|
|
45
|
+
}
|
|
46
|
+
// ------------------------------------------------------------------
|
|
47
|
+
// Get
|
|
48
|
+
// ------------------------------------------------------------------
|
|
49
|
+
function Parent(value, indices, last) {
|
|
50
|
+
let current = value;
|
|
51
|
+
for (const index of indices) {
|
|
52
|
+
if (Guard.IsUnsafePropertyKey(index))
|
|
53
|
+
ThrowUnsafePropertyKey();
|
|
54
|
+
current = Guard.IsObject(current) ? current[index] : undefined;
|
|
55
|
+
}
|
|
56
|
+
if (Guard.IsUnsafePropertyKey(last))
|
|
57
|
+
ThrowUnsafePropertyKey();
|
|
58
|
+
if (!Guard.IsObject(current))
|
|
59
|
+
ThrowCannotSetRoot();
|
|
60
|
+
return current;
|
|
73
61
|
}
|
|
74
62
|
// ------------------------------------------------------------------
|
|
75
63
|
// Set
|
|
76
64
|
// ------------------------------------------------------------------
|
|
77
|
-
/** Sets a value at the given pointer. May throw if the target value is not indexable */
|
|
78
65
|
export function Set(value, pointer, next) {
|
|
79
66
|
const indices = Indices(pointer);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
AssertCanSet(parent);
|
|
85
|
-
parent[index] = next;
|
|
67
|
+
const last = indices.pop();
|
|
68
|
+
if (Guard.IsUndefined(last))
|
|
69
|
+
ThrowCannotSetRoot();
|
|
70
|
+
Parent(value, indices, last)[last] = next;
|
|
86
71
|
return value;
|
|
87
72
|
}
|
|
88
73
|
// ------------------------------------------------------------------
|
|
89
74
|
// Delete
|
|
90
75
|
// ------------------------------------------------------------------
|
|
91
|
-
/** Deletes the value at the given pointer. May throw if the target value is not indexable */
|
|
92
76
|
export function Delete(value, pointer) {
|
|
93
77
|
const indices = Indices(pointer);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const parent =
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
parent.splice(+index, 1);
|
|
78
|
+
const last = indices.pop();
|
|
79
|
+
if (Guard.IsUndefined(last))
|
|
80
|
+
ThrowCannotSetRoot();
|
|
81
|
+
const parent = Parent(value, indices, last);
|
|
82
|
+
if (Guard.IsArray(parent) && /^(0|[1-9]\d*)$/.test(last)) {
|
|
83
|
+
parent.splice(Number(last), 1);
|
|
101
84
|
}
|
|
102
85
|
else {
|
|
103
|
-
delete parent[
|
|
86
|
+
delete parent[last];
|
|
104
87
|
}
|
|
105
88
|
return value;
|
|
106
89
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Get } from './settings.mjs';
|
|
2
|
+
// ------------------------------------------------------------------
|
|
3
|
+
// TempMaxErrors
|
|
4
|
+
// ------------------------------------------------------------------
|
|
5
|
+
let TempMaxErrors = 0;
|
|
6
|
+
// ------------------------------------------------------------------
|
|
7
|
+
// [Internal] EnableParseErrors
|
|
8
|
+
// ------------------------------------------------------------------
|
|
9
|
+
export function EnableParseErrors() {
|
|
10
|
+
const settings = Get();
|
|
11
|
+
TempMaxErrors = settings.maxErrors;
|
|
12
|
+
settings.maxErrors = settings.maxParseErrors;
|
|
13
|
+
}
|
|
14
|
+
// ------------------------------------------------------------------
|
|
15
|
+
// [Internal] DisableParseErrors
|
|
16
|
+
// ------------------------------------------------------------------
|
|
17
|
+
export function DisableParseErrors() {
|
|
18
|
+
const settings = Get();
|
|
19
|
+
settings.maxErrors = TempMaxErrors;
|
|
20
|
+
}
|
|
@@ -16,6 +16,17 @@ export interface TSettings {
|
|
|
16
16
|
* @default 8
|
|
17
17
|
*/
|
|
18
18
|
maxErrors: number;
|
|
19
|
+
/**
|
|
20
|
+
* Specifies the maximum number of errors to gather for failed Parse operations. TypeBox will
|
|
21
|
+
* automatically run an error-gathering pass on failed Parses to attach diagnostics to the
|
|
22
|
+
* thrown exception. This setting controls the number of errors gathered in that pass. Higher
|
|
23
|
+
* values will reduce throughput on failure cases, so a maximum of 4 is recommended if more
|
|
24
|
+
* errors are needed. The default setting of 1 will terminate on the first error, while a
|
|
25
|
+
* setting of 0 will skip error gathering entirely.
|
|
26
|
+
*
|
|
27
|
+
* @default 1
|
|
28
|
+
*/
|
|
29
|
+
maxParseErrors: number;
|
|
19
30
|
/**
|
|
20
31
|
* Specifies the maximum number of instantiations allowed within a top-level generic instantiation
|
|
21
32
|
* context. This setting can be used to bound generic calls to a fixed count, which can be useful if
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { Guard } from '../../guard/index.mjs';
|
|
2
|
+
// -------------------------------------------------------------------
|
|
3
|
+
// State
|
|
4
|
+
// -------------------------------------------------------------------
|
|
2
5
|
// Internal mutable state
|
|
3
6
|
const settings = {
|
|
4
7
|
immutableTypes: false,
|
|
5
8
|
maxErrors: 8,
|
|
9
|
+
maxParseErrors: 1,
|
|
6
10
|
maxInstantiationCount: 128,
|
|
7
11
|
useAcceleration: true,
|
|
8
12
|
exactOptionalPropertyTypes: false,
|
|
@@ -10,10 +14,14 @@ const settings = {
|
|
|
10
14
|
correctiveParse: false,
|
|
11
15
|
unionPrioritySort: true
|
|
12
16
|
};
|
|
17
|
+
// -------------------------------------------------------------------
|
|
18
|
+
// Reset
|
|
19
|
+
// -------------------------------------------------------------------
|
|
13
20
|
/** Resets system settings to defaults */
|
|
14
21
|
export function Reset() {
|
|
15
22
|
settings.immutableTypes = false;
|
|
16
23
|
settings.maxErrors = 8;
|
|
24
|
+
settings.maxParseErrors = 1;
|
|
17
25
|
settings.maxInstantiationCount = 128;
|
|
18
26
|
settings.useAcceleration = true;
|
|
19
27
|
settings.exactOptionalPropertyTypes = false;
|
|
@@ -21,6 +29,9 @@ export function Reset() {
|
|
|
21
29
|
settings.correctiveParse = false;
|
|
22
30
|
settings.unionPrioritySort = true;
|
|
23
31
|
}
|
|
32
|
+
// -------------------------------------------------------------------
|
|
33
|
+
// Set
|
|
34
|
+
// -------------------------------------------------------------------
|
|
24
35
|
/** Sets system settings */
|
|
25
36
|
export function Set(options) {
|
|
26
37
|
for (const key of Guard.Keys(options)) {
|
|
@@ -30,6 +41,9 @@ export function Set(options) {
|
|
|
30
41
|
}
|
|
31
42
|
}
|
|
32
43
|
}
|
|
44
|
+
// -------------------------------------------------------------------
|
|
45
|
+
// Get
|
|
46
|
+
// -------------------------------------------------------------------
|
|
33
47
|
/** Gets current system settings */
|
|
34
48
|
export function Get() {
|
|
35
49
|
return settings;
|
|
@@ -22,7 +22,7 @@ export declare function TryRestInferable<Type extends TSchema>(type: Type): TTry
|
|
|
22
22
|
export type TTryInferable<Type extends TSchema, Result extends TInferable | undefined = (Type extends TInfer<infer Name extends string, infer Type extends TSchema> ? TInferable<Name, Type> : undefined)> = Result;
|
|
23
23
|
export declare function TryInferable<Type extends TSchema>(type: Type): TTryInferable<Type>;
|
|
24
24
|
type TryInferResults<Rest extends TSchema[], Right extends TSchema, Result extends TSchema[] = []> = (Rest extends [infer Head extends TSchema, ...infer Tail extends TSchema[]] ? TExtendsLeft<{}, Head, Right> extends Result.TExtendsTrueLike ? TryInferResults<Tail, Right, [...Result, Head]> : undefined : Result);
|
|
25
|
-
declare function TryInferResults<Rest extends TSchema[], Right extends TSchema>(rest: [...Rest], right: Right
|
|
25
|
+
declare function TryInferResults<Rest extends TSchema[], Right extends TSchema>(rest: [...Rest], right: Right): TryInferResults<Rest, Right>;
|
|
26
26
|
export type TInferTupleResult<Inferred extends TProperties, Name extends string, Left extends TSchema[], Right extends TSchema, Results extends TSchema[] | undefined = TryInferResults<Left, Right>> = (Results extends [...infer Results extends TSchema[]] ? Result.TExtendsTrue<Memory.TAssign<Inferred, {
|
|
27
27
|
[_ in Name]: TTuple<Results>;
|
|
28
28
|
}>> : Result.TExtendsFalse);
|
|
@@ -45,8 +45,21 @@ export function TryInferable(type) {
|
|
|
45
45
|
return (IsInfer(type) ? Inferrable(type.name, type.extends) :
|
|
46
46
|
undefined);
|
|
47
47
|
}
|
|
48
|
-
function TryInferResults(rest, right, result = []) {
|
|
49
|
-
|
|
48
|
+
// function TryInferResults<Rest extends TSchema[], Right extends TSchema>(rest: [...Rest], right: Right, result: TSchema[] = []): TryInferResults<Rest, Right> {
|
|
49
|
+
// return Guard.ShiftLeft(rest, (head, tail) =>
|
|
50
|
+
// Result.Match(ExtendsLeft({}, head, right),
|
|
51
|
+
// () => TryInferResults(tail, right, [...result, head]), // Stack Overflow Here (Large Rest)
|
|
52
|
+
// () => undefined),
|
|
53
|
+
// () => result) as never
|
|
54
|
+
// }
|
|
55
|
+
function TryInferResults(rest, right) {
|
|
56
|
+
const result = [];
|
|
57
|
+
for (const head of rest) {
|
|
58
|
+
if (!Result.IsExtendsTrueLike(ExtendsLeft({}, head, right)))
|
|
59
|
+
return undefined;
|
|
60
|
+
result.push(head);
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
50
63
|
}
|
|
51
64
|
export function InferTupleResult(inferred, name, left, right) {
|
|
52
65
|
const results = TryInferResults(left, right);
|
|
@@ -16,7 +16,8 @@ type TElementsLeft<Inferred extends TProperties, Reversed extends boolean, LeftR
|
|
|
16
16
|
type TElementsRight<Inferred extends TProperties, Reversed extends boolean, LeftRest extends TSchema[], RightRest extends TSchema[]> = (RightRest extends [infer Head extends TSchema, ...infer Tail extends TSchema[]] ? TElementsLeft<Inferred, Reversed, LeftRest, Head, Tail> : LeftRest['length'] extends 0 ? Result.TExtendsTrue<Inferred> : Result.TExtendsFalse);
|
|
17
17
|
type TElements<Inferred extends TProperties, Reversed extends boolean, LeftRest extends TSchema[], RightRest extends TSchema[]> = TElementsRight<Inferred, Reversed, LeftRest, RightRest>;
|
|
18
18
|
type TExtendsTupleToTuple<Inferred extends TProperties, Left extends TSchema[], Right extends TSchema[], InstantiatedRight extends TSchema[] = TInstantiateElements<Inferred, TState<[], []>, Right>, Reversed extends boolean = TReversed<InstantiatedRight>> = TElements<Inferred, Reversed, TApplyReverse<Left, Reversed>, TApplyReverse<InstantiatedRight, Reversed>>;
|
|
19
|
-
type
|
|
19
|
+
type TExtendsTupleToArrayReduce<Inferred extends TProperties, Left extends TSchema[], Right extends TSchema> = (Left extends [infer Head extends TSchema, ...infer Tail extends TSchema[]] ? TExtendsLeft<Inferred, Head, Right> extends Result.TExtendsTrueLike<infer Inferred extends TProperties> ? TExtendsTupleToArrayReduce<Inferred, Tail, Right> : Result.TExtendsFalse : Result.TExtendsTrue<Inferred>);
|
|
20
|
+
type TExtendsTupleToArray<Inferred extends TProperties, Left extends TSchema[], Right extends TSchema, Inferrable extends TInferable | undefined = TTryInferable<Right>> = (Inferrable extends TInferable ? TInferUnionResult<Inferred, Inferrable['name'], Left, Inferrable['type']> : TExtendsTupleToArrayReduce<Inferred, Left, Right>);
|
|
20
21
|
export type TExtendsTuple<Inferred extends TProperties, Left extends TSchema[], Right extends TSchema, InstantiatedLeft extends TSchema[] = TInstantiateElements<Inferred, TState<[], []>, Left>> = (Right extends TTuple<infer Types extends TSchema[]> ? TExtendsTupleToTuple<Inferred, InstantiatedLeft, Types> : Right extends TArray<infer Type extends TSchema> ? TExtendsTupleToArray<Inferred, InstantiatedLeft, Type> : TExtendsRight<Inferred, TTuple<InstantiatedLeft>, Right>);
|
|
21
22
|
export declare function ExtendsTuple<Inferred extends TProperties, Left extends TSchema[], Right extends TSchema>(inferred: Inferred, left: Left, right: Right): TExtendsTuple<Inferred, Left, Right>;
|
|
22
23
|
export {};
|
|
@@ -47,11 +47,31 @@ function ExtendsTupleToTuple(inferred, left, right) {
|
|
|
47
47
|
const reversed = Reversed(instantiatedRight);
|
|
48
48
|
return Elements(inferred, reversed, ApplyReverse(left, reversed), ApplyReverse(instantiatedRight, reversed));
|
|
49
49
|
}
|
|
50
|
+
// function ExtendsTupleToArrayReduce<Inferred extends TProperties, Left extends TSchema[], Right extends TSchema>
|
|
51
|
+
// (inferred: Inferred, left: [...Left], right: Right):
|
|
52
|
+
// TExtendsTupleToArrayReduce<Inferred, Left, Right> {
|
|
53
|
+
// return (
|
|
54
|
+
// Guard.ShiftLeft(left, (head, tail) =>
|
|
55
|
+
// Result.Match(ExtendsLeft(inferred, head, right), inferred =>
|
|
56
|
+
// ExtendsTupleToArrayReduce(inferred, tail, right), // Stack Overflow Here (Large Left)
|
|
57
|
+
// () => Result.ExtendsFalse()),
|
|
58
|
+
// () => Result.ExtendsTrue(inferred))
|
|
59
|
+
// ) as never
|
|
60
|
+
// }
|
|
61
|
+
function ExtendsTupleToArrayReduce(inferred, left, right) {
|
|
62
|
+
for (const head of left) {
|
|
63
|
+
const result = ExtendsLeft(inferred, head, right);
|
|
64
|
+
if (!Result.IsExtendsTrueLike(result))
|
|
65
|
+
return result;
|
|
66
|
+
inferred = result.inferred; // (review-assign-to-argument)
|
|
67
|
+
}
|
|
68
|
+
return Result.ExtendsTrue(inferred);
|
|
69
|
+
}
|
|
50
70
|
function ExtendsTupleToArray(inferred, left, right) {
|
|
51
71
|
const inferrable = TryInferable(right);
|
|
52
72
|
return (IsInferable(inferrable)
|
|
53
73
|
? InferUnionResult(inferred, inferrable['name'], left, inferrable['type'])
|
|
54
|
-
:
|
|
74
|
+
: ExtendsTupleToArrayReduce(inferred, left, right));
|
|
55
75
|
}
|
|
56
76
|
export function ExtendsTuple(inferred, left, right) {
|
|
57
77
|
const instantiatedLeft = InstantiateElements(inferred, State([], []), left);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
|
-
import {
|
|
3
|
-
import { Arguments } from '../../system/
|
|
2
|
+
import { EnableParseErrors, DisableParseErrors } from '../../system/settings/internal.mjs';
|
|
3
|
+
import { Arguments, Settings } from '../../system/index.mjs';
|
|
4
4
|
import { AssertError } from '../assert/index.mjs';
|
|
5
5
|
import { Check } from '../check/index.mjs';
|
|
6
6
|
import { Errors } from '../errors/index.mjs';
|
|
@@ -18,8 +18,11 @@ export class ParseError extends AssertError {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
function Assert(context, type, value) {
|
|
21
|
+
EnableParseErrors();
|
|
22
|
+
const errors = Errors(context, type, value);
|
|
23
|
+
DisableParseErrors();
|
|
21
24
|
if (!Check(context, type, value))
|
|
22
|
-
throw new ParseError(value,
|
|
25
|
+
throw new ParseError(value, errors);
|
|
23
26
|
return value;
|
|
24
27
|
}
|
|
25
28
|
// ------------------------------------------------------------------
|
|
@@ -43,5 +46,8 @@ export function Parse(...args) {
|
|
|
43
46
|
return value;
|
|
44
47
|
if (Settings.Get().correctiveParse)
|
|
45
48
|
return Parser(context, type, value);
|
|
46
|
-
|
|
49
|
+
EnableParseErrors();
|
|
50
|
+
const errors = Errors(context, type, value);
|
|
51
|
+
DisableParseErrors();
|
|
52
|
+
throw new ParseError(value, errors);
|
|
47
53
|
}
|
package/changes.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@depup/typebox",
|
|
3
3
|
"description": "Json Schema Type Builder with Static Type Resolution for TypeScript (with updated dependencies)",
|
|
4
|
-
"version": "1.3.
|
|
4
|
+
"version": "1.3.34-depup.0",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typebox",
|
|
7
7
|
"depup",
|
|
@@ -94,8 +94,8 @@
|
|
|
94
94
|
"changes": {},
|
|
95
95
|
"depsUpdated": 0,
|
|
96
96
|
"originalPackage": "typebox",
|
|
97
|
-
"originalVersion": "1.3.
|
|
98
|
-
"processedAt": "2026-09-
|
|
97
|
+
"originalVersion": "1.3.34",
|
|
98
|
+
"processedAt": "2026-09-20T01:02:50.022Z",
|
|
99
99
|
"smokeTest": "passed"
|
|
100
100
|
}
|
|
101
101
|
}
|
package/readme.md
CHANGED
|
@@ -166,9 +166,11 @@ import Schema from 'typebox/schema'
|
|
|
166
166
|
|
|
167
167
|
### Compile
|
|
168
168
|
|
|
169
|
-
The compiler accepts
|
|
169
|
+
The compiler accepts TypeBox types as well as plain JSON Schema objects, and returns a Validator instance which can be used to check values. The following compiles a Vector type.
|
|
170
170
|
|
|
171
171
|
```typescript
|
|
172
|
+
import Schema from 'typebox/schema'
|
|
173
|
+
|
|
172
174
|
// Compile
|
|
173
175
|
|
|
174
176
|
const Vector = Schema.Compile(Type.Script(`{
|
|
File without changes
|