@sinclair/typebox 0.32.15 → 0.32.17
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/build/import/system/system.d.mts +1 -1
- package/build/import/type/indexed/indexed.d.mts +1 -1
- package/build/import/type/indexed/indexed.mjs +3 -1
- package/build/import/type/static/static.d.mts +2 -1
- package/build/import/type/template-literal/parse.mjs +24 -5
- package/build/import/type/template-literal/syntax.d.mts +1 -1
- package/build/import/value/convert/convert.mjs +2 -15
- package/build/import/value/delta/delta.d.mts +22 -22
- package/build/import/value/transform/decode.d.mts +3 -1
- package/build/import/value/transform/decode.mjs +58 -52
- package/build/import/value/transform/encode.d.mts +3 -1
- package/build/import/value/transform/encode.mjs +56 -50
- package/build/import/value/value/value.mjs +1 -1
- package/build/require/system/system.d.ts +1 -1
- package/build/require/type/indexed/indexed.d.ts +1 -1
- package/build/require/type/indexed/indexed.js +3 -1
- package/build/require/type/static/static.d.ts +2 -1
- package/build/require/type/template-literal/parse.js +24 -5
- package/build/require/type/template-literal/syntax.d.ts +1 -1
- package/build/require/value/convert/convert.js +33 -46
- package/build/require/value/delta/delta.d.ts +22 -22
- package/build/require/value/transform/decode.d.ts +3 -1
- package/build/require/value/transform/decode.js +56 -52
- package/build/require/value/transform/encode.d.ts +3 -1
- package/build/require/value/transform/encode.js +54 -50
- package/build/require/value/value/value.js +1 -1
- package/package.json +1 -1
- package/readme.md +1 -0
|
@@ -15,80 +15,86 @@ import { IsTransform, IsSchema } from '../../type/guard/type.mjs';
|
|
|
15
15
|
// ------------------------------------------------------------------
|
|
16
16
|
// Errors
|
|
17
17
|
// ------------------------------------------------------------------
|
|
18
|
+
// prettier-ignore
|
|
18
19
|
export class TransformEncodeCheckError extends TypeBoxError {
|
|
19
20
|
schema;
|
|
20
21
|
value;
|
|
21
22
|
error;
|
|
22
23
|
constructor(schema, value, error) {
|
|
23
|
-
super(`
|
|
24
|
+
super(`The encoded value does not match the expected schema`);
|
|
24
25
|
this.schema = schema;
|
|
25
26
|
this.value = value;
|
|
26
27
|
this.error = error;
|
|
27
28
|
}
|
|
28
29
|
}
|
|
30
|
+
// prettier-ignore
|
|
29
31
|
export class TransformEncodeError extends TypeBoxError {
|
|
30
32
|
schema;
|
|
33
|
+
path;
|
|
31
34
|
value;
|
|
32
|
-
|
|
35
|
+
error;
|
|
36
|
+
constructor(schema, path, value, error) {
|
|
33
37
|
super(`${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
34
38
|
this.schema = schema;
|
|
39
|
+
this.path = path;
|
|
35
40
|
this.value = value;
|
|
41
|
+
this.error = error;
|
|
36
42
|
}
|
|
37
43
|
}
|
|
38
44
|
// ------------------------------------------------------------------
|
|
39
45
|
// Encode
|
|
40
46
|
// ------------------------------------------------------------------
|
|
41
47
|
// prettier-ignore
|
|
42
|
-
function Default(schema, value) {
|
|
48
|
+
function Default(schema, path, value) {
|
|
43
49
|
try {
|
|
44
50
|
return IsTransform(schema) ? schema[TransformKind].Encode(value) : value;
|
|
45
51
|
}
|
|
46
52
|
catch (error) {
|
|
47
|
-
throw new TransformEncodeError(schema, value, error);
|
|
53
|
+
throw new TransformEncodeError(schema, path, value, error);
|
|
48
54
|
}
|
|
49
55
|
}
|
|
50
56
|
// prettier-ignore
|
|
51
|
-
function FromArray(schema, references, value) {
|
|
52
|
-
const defaulted = Default(schema, value);
|
|
57
|
+
function FromArray(schema, references, path, value) {
|
|
58
|
+
const defaulted = Default(schema, path, value);
|
|
53
59
|
return IsArray(defaulted)
|
|
54
|
-
? defaulted.map((value) => Visit(schema.items, references, value))
|
|
60
|
+
? defaulted.map((value, index) => Visit(schema.items, references, `${path}/${index}`, value))
|
|
55
61
|
: defaulted;
|
|
56
62
|
}
|
|
57
63
|
// prettier-ignore
|
|
58
|
-
function FromIntersect(schema, references, value) {
|
|
59
|
-
const defaulted = Default(schema, value);
|
|
64
|
+
function FromIntersect(schema, references, path, value) {
|
|
65
|
+
const defaulted = Default(schema, path, value);
|
|
60
66
|
if (!IsStandardObject(value) || IsValueType(value))
|
|
61
67
|
return defaulted;
|
|
62
68
|
const knownKeys = KeyOfPropertyKeys(schema);
|
|
63
69
|
const knownProperties = knownKeys.reduce((value, key) => {
|
|
64
70
|
return key in defaulted
|
|
65
|
-
? { ...value, [key]: Visit(Index(schema, [key]), references, value[key]) }
|
|
71
|
+
? { ...value, [key]: Visit(Index(schema, [key]), references, `${path}/${key}`, value[key]) }
|
|
66
72
|
: value;
|
|
67
73
|
}, defaulted);
|
|
68
74
|
if (!IsTransform(schema.unevaluatedProperties)) {
|
|
69
|
-
return Default(schema, knownProperties);
|
|
75
|
+
return Default(schema, path, knownProperties);
|
|
70
76
|
}
|
|
71
77
|
const unknownKeys = Object.getOwnPropertyNames(knownProperties);
|
|
72
78
|
const unevaluatedProperties = schema.unevaluatedProperties;
|
|
73
79
|
return unknownKeys.reduce((value, key) => {
|
|
74
80
|
return !knownKeys.includes(key)
|
|
75
|
-
? { ...value, [key]: Default(unevaluatedProperties, value[key]) }
|
|
81
|
+
? { ...value, [key]: Default(unevaluatedProperties, `${path}/${key}`, value[key]) }
|
|
76
82
|
: value;
|
|
77
83
|
}, knownProperties);
|
|
78
84
|
}
|
|
79
85
|
// prettier-ignore
|
|
80
|
-
function FromNot(schema, references, value) {
|
|
81
|
-
return Default(schema.not, Default(schema, value));
|
|
86
|
+
function FromNot(schema, references, path, value) {
|
|
87
|
+
return Default(schema.not, path, Default(schema, path, value));
|
|
82
88
|
}
|
|
83
89
|
// prettier-ignore
|
|
84
|
-
function FromObject(schema, references, value) {
|
|
85
|
-
const defaulted = Default(schema, value);
|
|
90
|
+
function FromObject(schema, references, path, value) {
|
|
91
|
+
const defaulted = Default(schema, path, value);
|
|
86
92
|
if (!IsStandardObject(value))
|
|
87
93
|
return defaulted;
|
|
88
94
|
const knownKeys = KeyOfPropertyKeys(schema);
|
|
89
95
|
const knownProperties = knownKeys.reduce((value, key) => {
|
|
90
96
|
return key in value
|
|
91
|
-
? { ...value, [key]: Visit(schema.properties[key], references, value[key]) }
|
|
97
|
+
? { ...value, [key]: Visit(schema.properties[key], references, `${path}/${key}`, value[key]) }
|
|
92
98
|
: value;
|
|
93
99
|
}, defaulted);
|
|
94
100
|
if (!IsSchema(schema.additionalProperties)) {
|
|
@@ -98,93 +104,93 @@ function FromObject(schema, references, value) {
|
|
|
98
104
|
const additionalProperties = schema.additionalProperties;
|
|
99
105
|
return unknownKeys.reduce((value, key) => {
|
|
100
106
|
return !knownKeys.includes(key)
|
|
101
|
-
? { ...value, [key]: Default(additionalProperties, value[key]) }
|
|
107
|
+
? { ...value, [key]: Default(additionalProperties, `${path}/${key}`, value[key]) }
|
|
102
108
|
: value;
|
|
103
109
|
}, knownProperties);
|
|
104
110
|
}
|
|
105
111
|
// prettier-ignore
|
|
106
|
-
function FromRecord(schema, references, value) {
|
|
107
|
-
const defaulted = Default(schema, value);
|
|
112
|
+
function FromRecord(schema, references, path, value) {
|
|
113
|
+
const defaulted = Default(schema, path, value);
|
|
108
114
|
if (!IsStandardObject(value))
|
|
109
115
|
return defaulted;
|
|
110
116
|
const pattern = Object.getOwnPropertyNames(schema.patternProperties)[0];
|
|
111
117
|
const knownKeys = new RegExp(pattern);
|
|
112
118
|
const knownProperties = Object.getOwnPropertyNames(value).reduce((value, key) => {
|
|
113
119
|
return knownKeys.test(key)
|
|
114
|
-
? { ...value, [key]: Visit(schema.patternProperties[pattern], references, value[key]) }
|
|
120
|
+
? { ...value, [key]: Visit(schema.patternProperties[pattern], references, `${path}/${key}`, value[key]) }
|
|
115
121
|
: value;
|
|
116
122
|
}, defaulted);
|
|
117
123
|
if (!IsSchema(schema.additionalProperties)) {
|
|
118
|
-
return Default(schema, knownProperties);
|
|
124
|
+
return Default(schema, path, knownProperties);
|
|
119
125
|
}
|
|
120
126
|
const unknownKeys = Object.getOwnPropertyNames(knownProperties);
|
|
121
127
|
const additionalProperties = schema.additionalProperties;
|
|
122
128
|
return unknownKeys.reduce((value, key) => {
|
|
123
129
|
return !knownKeys.test(key)
|
|
124
|
-
? { ...value, [key]: Default(additionalProperties, value[key]) }
|
|
130
|
+
? { ...value, [key]: Default(additionalProperties, `${path}/${key}`, value[key]) }
|
|
125
131
|
: value;
|
|
126
132
|
}, knownProperties);
|
|
127
133
|
}
|
|
128
134
|
// prettier-ignore
|
|
129
|
-
function FromRef(schema, references, value) {
|
|
135
|
+
function FromRef(schema, references, path, value) {
|
|
130
136
|
const target = Deref(schema, references);
|
|
131
|
-
const resolved = Visit(target, references, value);
|
|
132
|
-
return Default(schema, resolved);
|
|
137
|
+
const resolved = Visit(target, references, path, value);
|
|
138
|
+
return Default(schema, path, resolved);
|
|
133
139
|
}
|
|
134
140
|
// prettier-ignore
|
|
135
|
-
function FromThis(schema, references, value) {
|
|
141
|
+
function FromThis(schema, references, path, value) {
|
|
136
142
|
const target = Deref(schema, references);
|
|
137
|
-
const resolved = Visit(target, references, value);
|
|
138
|
-
return Default(schema, resolved);
|
|
143
|
+
const resolved = Visit(target, references, path, value);
|
|
144
|
+
return Default(schema, path, resolved);
|
|
139
145
|
}
|
|
140
146
|
// prettier-ignore
|
|
141
|
-
function FromTuple(schema, references, value) {
|
|
142
|
-
const value1 = Default(schema, value);
|
|
143
|
-
return IsArray(schema.items) ? schema.items.map((schema, index) => Visit(schema, references, value1[index])) : [];
|
|
147
|
+
function FromTuple(schema, references, path, value) {
|
|
148
|
+
const value1 = Default(schema, path, value);
|
|
149
|
+
return IsArray(schema.items) ? schema.items.map((schema, index) => Visit(schema, references, `${path}/${index}`, value1[index])) : [];
|
|
144
150
|
}
|
|
145
151
|
// prettier-ignore
|
|
146
|
-
function FromUnion(schema, references, value) {
|
|
152
|
+
function FromUnion(schema, references, path, value) {
|
|
147
153
|
// test value against union variants
|
|
148
154
|
for (const subschema of schema.anyOf) {
|
|
149
155
|
if (!Check(subschema, references, value))
|
|
150
156
|
continue;
|
|
151
|
-
const value1 = Visit(subschema, references, value);
|
|
152
|
-
return Default(schema, value1);
|
|
157
|
+
const value1 = Visit(subschema, references, path, value);
|
|
158
|
+
return Default(schema, path, value1);
|
|
153
159
|
}
|
|
154
160
|
// test transformed value against union variants
|
|
155
161
|
for (const subschema of schema.anyOf) {
|
|
156
|
-
const value1 = Visit(subschema, references, value);
|
|
162
|
+
const value1 = Visit(subschema, references, path, value);
|
|
157
163
|
if (!Check(schema, references, value1))
|
|
158
164
|
continue;
|
|
159
|
-
return Default(schema, value1);
|
|
165
|
+
return Default(schema, path, value1);
|
|
160
166
|
}
|
|
161
|
-
return Default(schema, value);
|
|
167
|
+
return Default(schema, path, value);
|
|
162
168
|
}
|
|
163
169
|
// prettier-ignore
|
|
164
|
-
function Visit(schema, references, value) {
|
|
170
|
+
function Visit(schema, references, path, value) {
|
|
165
171
|
const references_ = typeof schema.$id === 'string' ? [...references, schema] : references;
|
|
166
172
|
const schema_ = schema;
|
|
167
173
|
switch (schema[Kind]) {
|
|
168
174
|
case 'Array':
|
|
169
|
-
return FromArray(schema_, references_, value);
|
|
175
|
+
return FromArray(schema_, references_, path, value);
|
|
170
176
|
case 'Intersect':
|
|
171
|
-
return FromIntersect(schema_, references_, value);
|
|
177
|
+
return FromIntersect(schema_, references_, path, value);
|
|
172
178
|
case 'Not':
|
|
173
|
-
return FromNot(schema_, references_, value);
|
|
179
|
+
return FromNot(schema_, references_, path, value);
|
|
174
180
|
case 'Object':
|
|
175
|
-
return FromObject(schema_, references_, value);
|
|
181
|
+
return FromObject(schema_, references_, path, value);
|
|
176
182
|
case 'Record':
|
|
177
|
-
return FromRecord(schema_, references_, value);
|
|
183
|
+
return FromRecord(schema_, references_, path, value);
|
|
178
184
|
case 'Ref':
|
|
179
|
-
return FromRef(schema_, references_, value);
|
|
185
|
+
return FromRef(schema_, references_, path, value);
|
|
180
186
|
case 'This':
|
|
181
|
-
return FromThis(schema_, references_, value);
|
|
187
|
+
return FromThis(schema_, references_, path, value);
|
|
182
188
|
case 'Tuple':
|
|
183
|
-
return FromTuple(schema_, references_, value);
|
|
189
|
+
return FromTuple(schema_, references_, path, value);
|
|
184
190
|
case 'Union':
|
|
185
|
-
return FromUnion(schema_, references_, value);
|
|
191
|
+
return FromUnion(schema_, references_, path, value);
|
|
186
192
|
default:
|
|
187
|
-
return Default(schema_, value);
|
|
193
|
+
return Default(schema_, path, value);
|
|
188
194
|
}
|
|
189
195
|
}
|
|
190
196
|
/**
|
|
@@ -194,5 +200,5 @@ function Visit(schema, references, value) {
|
|
|
194
200
|
* `Value.Encode()` function for implementation details.
|
|
195
201
|
*/
|
|
196
202
|
export function TransformEncode(schema, references, value) {
|
|
197
|
-
return Visit(schema, references, value);
|
|
203
|
+
return Visit(schema, references, '', value);
|
|
198
204
|
}
|
|
@@ -51,7 +51,7 @@ export function Encode(...args) {
|
|
|
51
51
|
const [schema, references, value] = args.length === 3 ? [args[0], args[1], args[2]] : [args[0], [], args[1]];
|
|
52
52
|
const encoded = TransformEncode(schema, references, value);
|
|
53
53
|
if (!Check(schema, references, encoded))
|
|
54
|
-
throw new TransformEncodeCheckError(schema,
|
|
54
|
+
throw new TransformEncodeCheckError(schema, encoded, Errors(schema, references, encoded).First());
|
|
55
55
|
return encoded;
|
|
56
56
|
}
|
|
57
57
|
/** Returns an iterator for each error in this value. */
|
|
@@ -8,7 +8,7 @@ export declare class TypeSystemDuplicateFormat extends TypeBoxError {
|
|
|
8
8
|
/** Creates user defined types and formats and provides overrides for value checking behaviours */
|
|
9
9
|
export declare namespace TypeSystem {
|
|
10
10
|
/** Creates a new type */
|
|
11
|
-
function Type<Type, Options = Record<PropertyKey, unknown>>(kind: string, check: (options: Options, value: unknown) => boolean): (options?: Partial<Options>) => import("
|
|
11
|
+
function Type<Type, Options = Record<PropertyKey, unknown>>(kind: string, check: (options: Options, value: unknown) => boolean): (options?: Partial<Options>) => import("src/type/unsafe/unsafe").TUnsafe<Type>;
|
|
12
12
|
/** Creates a new string format */
|
|
13
13
|
function Format<F extends string>(format: F, check: (value: string) => boolean): F;
|
|
14
14
|
}
|
|
@@ -16,7 +16,7 @@ import { type TIndexFromMappedResult } from './indexed-from-mapped-result';
|
|
|
16
16
|
type TFromRest<T extends TSchema[], K extends PropertyKey, Acc extends TSchema[] = []> = (T extends [infer L extends TSchema, ...infer R extends TSchema[]] ? TFromRest<R, K, [...Acc, Assert<TIndexFromPropertyKey<L, K>, TSchema>]> : Acc);
|
|
17
17
|
type TFromIntersectRest<T extends TSchema[], Acc extends TSchema[] = []> = (T extends [infer L extends TSchema, ...infer R extends TSchema[]] ? L extends TNever ? TFromIntersectRest<R, [...Acc]> : TFromIntersectRest<R, [...Acc, L]> : Acc);
|
|
18
18
|
type TFromIntersect<T extends TSchema[], K extends PropertyKey> = (TIntersectEvaluated<TFromIntersectRest<TFromRest<T, K>>>);
|
|
19
|
-
type TFromUnionRest<T extends TSchema[]> = T;
|
|
19
|
+
type TFromUnionRest<T extends TSchema[], Acc extends TSchema[] = []> = T extends [infer L extends TSchema, ...infer R extends TSchema[]] ? L extends TNever ? [] : TFromUnionRest<R, [L, ...Acc]> : Acc;
|
|
20
20
|
type TFromUnion<T extends TSchema[], K extends PropertyKey> = (TUnionEvaluated<TFromUnionRest<TFromRest<T, K>>>);
|
|
21
21
|
type TFromTuple<T extends TSchema[], K extends PropertyKey> = (K extends keyof T ? T[K] : K extends '[number]' ? TUnionEvaluated<T> : TNever);
|
|
22
22
|
type TFromArray<T extends TSchema, K extends PropertyKey> = (K extends '[number]' ? T : TNever);
|
|
@@ -24,8 +24,9 @@ export type TDecodeProperties<T extends TProperties> = {
|
|
|
24
24
|
};
|
|
25
25
|
export type TDecodeRest<T extends TSchema[], Acc extends TSchema[] = []> = T extends [infer L extends TSchema, ...infer R extends TSchema[]] ? TDecodeRest<R, [...Acc, TDecodeType<L>]> : Acc;
|
|
26
26
|
export type TDecodeType<T extends TSchema> = (T extends TOptional<infer S extends TSchema> ? TOptional<TDecodeType<S>> : T extends TReadonly<infer S extends TSchema> ? TReadonly<TDecodeType<S>> : T extends TTransform<infer _, infer R> ? TUnsafe<R> : T extends TArray<infer S extends TSchema> ? TArray<TDecodeType<S>> : T extends TAsyncIterator<infer S extends TSchema> ? TAsyncIterator<TDecodeType<S>> : T extends TConstructor<infer P extends TSchema[], infer R extends TSchema> ? TConstructor<TDecodeRest<P>, TDecodeType<R>> : T extends TEnum<infer S> ? TEnum<S> : T extends TFunction<infer P extends TSchema[], infer R extends TSchema> ? TFunction<TDecodeRest<P>, TDecodeType<R>> : T extends TIntersect<infer S extends TSchema[]> ? TIntersect<TDecodeRest<S>> : T extends TIterator<infer S extends TSchema> ? TIterator<TDecodeType<S>> : T extends TNot<infer S extends TSchema> ? TNot<TDecodeType<S>> : T extends TObject<infer S> ? TObject<Evaluate<TDecodeProperties<S>>> : T extends TPromise<infer S extends TSchema> ? TPromise<TDecodeType<S>> : T extends TRecord<infer K, infer S> ? TRecord<K, TDecodeType<S>> : T extends TRecursive<infer S extends TSchema> ? TRecursive<TDecodeType<S>> : T extends TRef<infer S extends TSchema> ? TRef<TDecodeType<S>> : T extends TTuple<infer S extends TSchema[]> ? TTuple<TDecodeRest<S>> : T extends TUnion<infer S extends TSchema[]> ? TUnion<TDecodeRest<S>> : T);
|
|
27
|
+
export type StaticDecodeIsAny<T> = boolean extends (T extends TSchema ? true : false) ? true : false;
|
|
27
28
|
/** Creates an decoded static type from a TypeBox type */
|
|
28
|
-
export type StaticDecode<T extends TSchema, P extends unknown[] = []> = Static<TDecodeType<T>, P>;
|
|
29
|
+
export type StaticDecode<T extends TSchema, P extends unknown[] = []> = StaticDecodeIsAny<T> extends true ? unknown : Static<TDecodeType<T>, P>;
|
|
29
30
|
/** Creates an encoded static type from a TypeBox type */
|
|
30
31
|
export type StaticEncode<T extends TSchema, P extends unknown[] = []> = Static<T, P>;
|
|
31
32
|
/** Creates a static type from a TypeBox type */
|
|
@@ -9,23 +9,42 @@ const index_1 = require("../error/index");
|
|
|
9
9
|
class TemplateLiteralParserError extends index_1.TypeBoxError {
|
|
10
10
|
}
|
|
11
11
|
exports.TemplateLiteralParserError = TemplateLiteralParserError;
|
|
12
|
+
// -------------------------------------------------------------------
|
|
13
|
+
// Unescape
|
|
14
|
+
//
|
|
15
|
+
// Unescape for these control characters specifically. Note that this
|
|
16
|
+
// function is only called on non union group content, and where we
|
|
17
|
+
// still want to allow the user to embed control characters in that
|
|
18
|
+
// content. For review.
|
|
19
|
+
// -------------------------------------------------------------------
|
|
12
20
|
// prettier-ignore
|
|
21
|
+
function Unescape(pattern) {
|
|
22
|
+
return pattern
|
|
23
|
+
.replace(/\\\$/g, '$')
|
|
24
|
+
.replace(/\\\*/g, '*')
|
|
25
|
+
.replace(/\\\^/g, '^')
|
|
26
|
+
.replace(/\\\|/g, '|')
|
|
27
|
+
.replace(/\\\(/g, '(')
|
|
28
|
+
.replace(/\\\)/g, ')');
|
|
29
|
+
}
|
|
30
|
+
// -------------------------------------------------------------------
|
|
31
|
+
// Control Characters
|
|
32
|
+
// -------------------------------------------------------------------
|
|
13
33
|
function IsNonEscaped(pattern, index, char) {
|
|
14
34
|
return pattern[index] === char && pattern.charCodeAt(index - 1) !== 92;
|
|
15
35
|
}
|
|
16
|
-
// prettier-ignore
|
|
17
36
|
function IsOpenParen(pattern, index) {
|
|
18
37
|
return IsNonEscaped(pattern, index, '(');
|
|
19
38
|
}
|
|
20
|
-
// prettier-ignore
|
|
21
39
|
function IsCloseParen(pattern, index) {
|
|
22
40
|
return IsNonEscaped(pattern, index, ')');
|
|
23
41
|
}
|
|
24
|
-
// prettier-ignore
|
|
25
42
|
function IsSeparator(pattern, index) {
|
|
26
43
|
return IsNonEscaped(pattern, index, '|');
|
|
27
44
|
}
|
|
28
|
-
//
|
|
45
|
+
// -------------------------------------------------------------------
|
|
46
|
+
// Control Groups
|
|
47
|
+
// -------------------------------------------------------------------
|
|
29
48
|
function IsGroup(pattern) {
|
|
30
49
|
if (!(IsOpenParen(pattern, 0) && IsCloseParen(pattern, pattern.length - 1)))
|
|
31
50
|
return false;
|
|
@@ -142,7 +161,7 @@ function TemplateLiteralParse(pattern) {
|
|
|
142
161
|
return (IsGroup(pattern) ? TemplateLiteralParse(InGroup(pattern)) :
|
|
143
162
|
IsPrecedenceOr(pattern) ? Or(pattern) :
|
|
144
163
|
IsPrecedenceAnd(pattern) ? And(pattern) :
|
|
145
|
-
{ type: 'const', const: pattern });
|
|
164
|
+
{ type: 'const', const: Unescape(pattern) });
|
|
146
165
|
}
|
|
147
166
|
exports.TemplateLiteralParse = TemplateLiteralParse;
|
|
148
167
|
// ------------------------------------------------------------------
|
|
@@ -12,7 +12,7 @@ type FromUnionLiteral<T extends string> = T extends `${infer L}|${infer R}` ? [T
|
|
|
12
12
|
];
|
|
13
13
|
type FromUnion<T extends string> = TUnionEvaluated<FromUnionLiteral<T>>;
|
|
14
14
|
type FromTerminal<T extends string> = T extends 'boolean' ? TBoolean : T extends 'bigint' ? TBigInt : T extends 'number' ? TNumber : T extends 'string' ? TString : FromUnion<T>;
|
|
15
|
-
type FromString<T extends string> = T extends `{${infer L}}${infer R}` ? [FromTerminal<L>, ...FromString<R>] : T extends `${infer L}
|
|
15
|
+
type FromString<T extends string> = T extends `{${infer L}}${infer R}` ? [FromTerminal<L>, ...FromString<R>] : T extends `${infer L}$\{${infer R1}\}${infer R2}` ? [TLiteral<L>, ...FromString<`{${R1}}`>, ...FromString<R2>] : T extends `${infer L}$\{${infer R1}\}` ? [TLiteral<L>, ...FromString<`{${R1}}`>] : T extends `${infer L}` ? [TLiteral<L>] : [
|
|
16
16
|
];
|
|
17
17
|
export type TTemplateLiteralSyntax<T extends string> = (TTemplateLiteral<Assert<FromString<T>, TTemplateLiteralKind[]>>);
|
|
18
18
|
/** Parses TemplateLiteralSyntax and returns a tuple of TemplateLiteralKinds */
|
|
@@ -3,44 +3,41 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.Convert = void 0;
|
|
5
5
|
const index_1 = require("../clone/index");
|
|
6
|
-
const index_2 = require("../
|
|
7
|
-
const index_3 = require("
|
|
8
|
-
const type_1 = require("../../type/guard/type");
|
|
9
|
-
const index_4 = require("../../type/symbols/index");
|
|
10
|
-
const index_5 = require("../../type/composite/index");
|
|
6
|
+
const index_2 = require("../deref/index");
|
|
7
|
+
const index_3 = require("../../type/symbols/index");
|
|
11
8
|
// ------------------------------------------------------------------
|
|
12
9
|
// ValueGuard
|
|
13
10
|
// ------------------------------------------------------------------
|
|
14
|
-
const
|
|
11
|
+
const index_4 = require("../guard/index");
|
|
15
12
|
// ------------------------------------------------------------------
|
|
16
13
|
// Conversions
|
|
17
14
|
// ------------------------------------------------------------------
|
|
18
15
|
function IsStringNumeric(value) {
|
|
19
|
-
return (0,
|
|
16
|
+
return (0, index_4.IsString)(value) && !isNaN(value) && !isNaN(parseFloat(value));
|
|
20
17
|
}
|
|
21
18
|
function IsValueToString(value) {
|
|
22
|
-
return (0,
|
|
19
|
+
return (0, index_4.IsBigInt)(value) || (0, index_4.IsBoolean)(value) || (0, index_4.IsNumber)(value);
|
|
23
20
|
}
|
|
24
21
|
function IsValueTrue(value) {
|
|
25
|
-
return value === true || ((0,
|
|
22
|
+
return value === true || ((0, index_4.IsNumber)(value) && value === 1) || ((0, index_4.IsBigInt)(value) && value === BigInt('1')) || ((0, index_4.IsString)(value) && (value.toLowerCase() === 'true' || value === '1'));
|
|
26
23
|
}
|
|
27
24
|
function IsValueFalse(value) {
|
|
28
|
-
return value === false || ((0,
|
|
25
|
+
return value === false || ((0, index_4.IsNumber)(value) && (value === 0 || Object.is(value, -0))) || ((0, index_4.IsBigInt)(value) && value === BigInt('0')) || ((0, index_4.IsString)(value) && (value.toLowerCase() === 'false' || value === '0' || value === '-0'));
|
|
29
26
|
}
|
|
30
27
|
function IsTimeStringWithTimeZone(value) {
|
|
31
|
-
return (0,
|
|
28
|
+
return (0, index_4.IsString)(value) && /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i.test(value);
|
|
32
29
|
}
|
|
33
30
|
function IsTimeStringWithoutTimeZone(value) {
|
|
34
|
-
return (0,
|
|
31
|
+
return (0, index_4.IsString)(value) && /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)?$/i.test(value);
|
|
35
32
|
}
|
|
36
33
|
function IsDateTimeStringWithTimeZone(value) {
|
|
37
|
-
return (0,
|
|
34
|
+
return (0, index_4.IsString)(value) && /^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i.test(value);
|
|
38
35
|
}
|
|
39
36
|
function IsDateTimeStringWithoutTimeZone(value) {
|
|
40
|
-
return (0,
|
|
37
|
+
return (0, index_4.IsString)(value) && /^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)?$/i.test(value);
|
|
41
38
|
}
|
|
42
39
|
function IsDateString(value) {
|
|
43
|
-
return (0,
|
|
40
|
+
return (0, index_4.IsString)(value) && /^\d\d\d\d-[0-1]\d-[0-3]\d$/i.test(value);
|
|
44
41
|
}
|
|
45
42
|
// ------------------------------------------------------------------
|
|
46
43
|
// Convert
|
|
@@ -59,31 +56,31 @@ function TryConvertLiteralBoolean(value, target) {
|
|
|
59
56
|
}
|
|
60
57
|
// prettier-ignore
|
|
61
58
|
function TryConvertLiteral(schema, value) {
|
|
62
|
-
return ((0,
|
|
63
|
-
(0,
|
|
64
|
-
(0,
|
|
59
|
+
return ((0, index_4.IsString)(schema.const) ? TryConvertLiteralString(value, schema.const) :
|
|
60
|
+
(0, index_4.IsNumber)(schema.const) ? TryConvertLiteralNumber(value, schema.const) :
|
|
61
|
+
(0, index_4.IsBoolean)(schema.const) ? TryConvertLiteralBoolean(value, schema.const) :
|
|
65
62
|
(0, index_1.Clone)(value));
|
|
66
63
|
}
|
|
67
64
|
function TryConvertBoolean(value) {
|
|
68
65
|
return IsValueTrue(value) ? true : IsValueFalse(value) ? false : value;
|
|
69
66
|
}
|
|
70
67
|
function TryConvertBigInt(value) {
|
|
71
|
-
return IsStringNumeric(value) ? BigInt(parseInt(value)) : (0,
|
|
68
|
+
return IsStringNumeric(value) ? BigInt(parseInt(value)) : (0, index_4.IsNumber)(value) ? BigInt(value | 0) : IsValueFalse(value) ? BigInt(0) : IsValueTrue(value) ? BigInt(1) : value;
|
|
72
69
|
}
|
|
73
70
|
function TryConvertString(value) {
|
|
74
|
-
return IsValueToString(value) ? value.toString() : (0,
|
|
71
|
+
return IsValueToString(value) ? value.toString() : (0, index_4.IsSymbol)(value) && value.description !== undefined ? value.description.toString() : value;
|
|
75
72
|
}
|
|
76
73
|
function TryConvertNumber(value) {
|
|
77
74
|
return IsStringNumeric(value) ? parseFloat(value) : IsValueTrue(value) ? 1 : IsValueFalse(value) ? 0 : value;
|
|
78
75
|
}
|
|
79
76
|
function TryConvertInteger(value) {
|
|
80
|
-
return IsStringNumeric(value) ? parseInt(value) : (0,
|
|
77
|
+
return IsStringNumeric(value) ? parseInt(value) : (0, index_4.IsNumber)(value) ? value | 0 : IsValueTrue(value) ? 1 : IsValueFalse(value) ? 0 : value;
|
|
81
78
|
}
|
|
82
79
|
function TryConvertNull(value) {
|
|
83
|
-
return (0,
|
|
80
|
+
return (0, index_4.IsString)(value) && value.toLowerCase() === 'null' ? null : value;
|
|
84
81
|
}
|
|
85
82
|
function TryConvertUndefined(value) {
|
|
86
|
-
return (0,
|
|
83
|
+
return (0, index_4.IsString)(value) && value === 'undefined' ? undefined : value;
|
|
87
84
|
}
|
|
88
85
|
// ------------------------------------------------------------------
|
|
89
86
|
// note: this function may return an invalid dates for the regex
|
|
@@ -94,8 +91,8 @@ function TryConvertUndefined(value) {
|
|
|
94
91
|
// ------------------------------------------------------------------
|
|
95
92
|
// prettier-ignore
|
|
96
93
|
function TryConvertDate(value) {
|
|
97
|
-
return ((0,
|
|
98
|
-
(0,
|
|
94
|
+
return ((0, index_4.IsDate)(value) ? value :
|
|
95
|
+
(0, index_4.IsNumber)(value) ? new Date(value) :
|
|
99
96
|
IsValueTrue(value) ? new Date(1) :
|
|
100
97
|
IsValueFalse(value) ? new Date(0) :
|
|
101
98
|
IsStringNumeric(value) ? new Date(parseInt(value)) :
|
|
@@ -116,7 +113,7 @@ function Default(value) {
|
|
|
116
113
|
// Convert
|
|
117
114
|
// ------------------------------------------------------------------
|
|
118
115
|
function FromArray(schema, references, value) {
|
|
119
|
-
if ((0,
|
|
116
|
+
if ((0, index_4.IsArray)(value)) {
|
|
120
117
|
return value.map((value) => Visit(schema.items, references, value));
|
|
121
118
|
}
|
|
122
119
|
return value;
|
|
@@ -133,12 +130,8 @@ function FromDate(schema, references, value) {
|
|
|
133
130
|
function FromInteger(schema, references, value) {
|
|
134
131
|
return TryConvertInteger(value);
|
|
135
132
|
}
|
|
136
|
-
// prettier-ignore
|
|
137
133
|
function FromIntersect(schema, references, value) {
|
|
138
|
-
|
|
139
|
-
if (allObjects)
|
|
140
|
-
return Visit((0, index_5.Composite)(schema.allOf), references, value);
|
|
141
|
-
return Visit(schema.allOf[0], references, value); // todo: fix this
|
|
134
|
+
return schema.allOf.reduce((value, schema) => Visit(schema, references, value), value);
|
|
142
135
|
}
|
|
143
136
|
function FromLiteral(schema, references, value) {
|
|
144
137
|
return TryConvertLiteral(schema, value);
|
|
@@ -151,11 +144,11 @@ function FromNumber(schema, references, value) {
|
|
|
151
144
|
}
|
|
152
145
|
// prettier-ignore
|
|
153
146
|
function FromObject(schema, references, value) {
|
|
154
|
-
const isConvertable = (0,
|
|
147
|
+
const isConvertable = (0, index_4.IsObject)(value);
|
|
155
148
|
if (!isConvertable)
|
|
156
149
|
return value;
|
|
157
150
|
return Object.getOwnPropertyNames(schema.properties).reduce((value, key) => {
|
|
158
|
-
return !(0,
|
|
151
|
+
return !(0, index_4.IsUndefined)(value[key])
|
|
159
152
|
? ({ ...value, [key]: Visit(schema.properties[key], references, value[key]) })
|
|
160
153
|
: ({ ...value });
|
|
161
154
|
}, value);
|
|
@@ -170,20 +163,20 @@ function FromRecord(schema, references, value) {
|
|
|
170
163
|
return result;
|
|
171
164
|
}
|
|
172
165
|
function FromRef(schema, references, value) {
|
|
173
|
-
return Visit((0,
|
|
166
|
+
return Visit((0, index_2.Deref)(schema, references), references, value);
|
|
174
167
|
}
|
|
175
168
|
function FromString(schema, references, value) {
|
|
176
169
|
return TryConvertString(value);
|
|
177
170
|
}
|
|
178
171
|
function FromSymbol(schema, references, value) {
|
|
179
|
-
return (0,
|
|
172
|
+
return (0, index_4.IsString)(value) || (0, index_4.IsNumber)(value) ? Symbol(value) : value;
|
|
180
173
|
}
|
|
181
174
|
function FromThis(schema, references, value) {
|
|
182
|
-
return Visit((0,
|
|
175
|
+
return Visit((0, index_2.Deref)(schema, references), references, value);
|
|
183
176
|
}
|
|
184
177
|
// prettier-ignore
|
|
185
178
|
function FromTuple(schema, references, value) {
|
|
186
|
-
const isConvertable = (0,
|
|
179
|
+
const isConvertable = (0, index_4.IsArray)(value) && !(0, index_4.IsUndefined)(schema.items);
|
|
187
180
|
if (!isConvertable)
|
|
188
181
|
return value;
|
|
189
182
|
return value.map((value, index) => {
|
|
@@ -196,18 +189,12 @@ function FromUndefined(schema, references, value) {
|
|
|
196
189
|
return TryConvertUndefined(value);
|
|
197
190
|
}
|
|
198
191
|
function FromUnion(schema, references, value) {
|
|
199
|
-
|
|
200
|
-
const converted = Visit(subschema, references, value);
|
|
201
|
-
if ((0, index_2.Check)(subschema, references, converted)) {
|
|
202
|
-
return converted;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
return value;
|
|
192
|
+
return schema.anyOf.reduce((value, schema) => Visit(schema, references, value), value);
|
|
206
193
|
}
|
|
207
194
|
function Visit(schema, references, value) {
|
|
208
|
-
const references_ = (0,
|
|
195
|
+
const references_ = (0, index_4.IsString)(schema.$id) ? [...references, schema] : references;
|
|
209
196
|
const schema_ = schema;
|
|
210
|
-
switch (schema[
|
|
197
|
+
switch (schema[index_3.Kind]) {
|
|
211
198
|
case 'Array':
|
|
212
199
|
return FromArray(schema_, references_, value);
|
|
213
200
|
case 'BigInt':
|
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
import type { Static } from '../../type/static/index';
|
|
2
2
|
import { TypeBoxError } from '../../type/error/index';
|
|
3
3
|
export type Insert = Static<typeof Insert>;
|
|
4
|
-
export declare const Insert: import("
|
|
5
|
-
type: import("
|
|
6
|
-
path: import("
|
|
7
|
-
value: import("
|
|
4
|
+
export declare const Insert: import("src/type/object/object").TObject<{
|
|
5
|
+
type: import("src/type/literal/literal").TLiteral<"insert">;
|
|
6
|
+
path: import("src/type/string/string").TString;
|
|
7
|
+
value: import("src/type/unknown/unknown").TUnknown;
|
|
8
8
|
}>;
|
|
9
9
|
export type Update = Static<typeof Update>;
|
|
10
|
-
export declare const Update: import("
|
|
11
|
-
type: import("
|
|
12
|
-
path: import("
|
|
13
|
-
value: import("
|
|
10
|
+
export declare const Update: import("src/type/object/object").TObject<{
|
|
11
|
+
type: import("src/type/literal/literal").TLiteral<"update">;
|
|
12
|
+
path: import("src/type/string/string").TString;
|
|
13
|
+
value: import("src/type/unknown/unknown").TUnknown;
|
|
14
14
|
}>;
|
|
15
15
|
export type Delete = Static<typeof Delete>;
|
|
16
|
-
export declare const Delete: import("
|
|
17
|
-
type: import("
|
|
18
|
-
path: import("
|
|
16
|
+
export declare const Delete: import("src/type/object/object").TObject<{
|
|
17
|
+
type: import("src/type/literal/literal").TLiteral<"delete">;
|
|
18
|
+
path: import("src/type/string/string").TString;
|
|
19
19
|
}>;
|
|
20
20
|
export type Edit = Static<typeof Edit>;
|
|
21
|
-
export declare const Edit: import("
|
|
22
|
-
type: import("
|
|
23
|
-
path: import("
|
|
24
|
-
value: import("
|
|
25
|
-
}>, import("
|
|
26
|
-
type: import("
|
|
27
|
-
path: import("
|
|
28
|
-
value: import("
|
|
29
|
-
}>, import("
|
|
30
|
-
type: import("
|
|
31
|
-
path: import("
|
|
21
|
+
export declare const Edit: import("src/type/union/union-type").TUnion<[import("src/type/object/object").TObject<{
|
|
22
|
+
type: import("src/type/literal/literal").TLiteral<"insert">;
|
|
23
|
+
path: import("src/type/string/string").TString;
|
|
24
|
+
value: import("src/type/unknown/unknown").TUnknown;
|
|
25
|
+
}>, import("src/type/object/object").TObject<{
|
|
26
|
+
type: import("src/type/literal/literal").TLiteral<"update">;
|
|
27
|
+
path: import("src/type/string/string").TString;
|
|
28
|
+
value: import("src/type/unknown/unknown").TUnknown;
|
|
29
|
+
}>, import("src/type/object/object").TObject<{
|
|
30
|
+
type: import("src/type/literal/literal").TLiteral<"delete">;
|
|
31
|
+
path: import("src/type/string/string").TString;
|
|
32
32
|
}>]>;
|
|
33
33
|
export declare class ValueDeltaError extends TypeBoxError {
|
|
34
34
|
readonly value: unknown;
|
|
@@ -9,8 +9,10 @@ export declare class TransformDecodeCheckError extends TypeBoxError {
|
|
|
9
9
|
}
|
|
10
10
|
export declare class TransformDecodeError extends TypeBoxError {
|
|
11
11
|
readonly schema: TSchema;
|
|
12
|
+
readonly path: string;
|
|
12
13
|
readonly value: unknown;
|
|
13
|
-
|
|
14
|
+
readonly error: Error;
|
|
15
|
+
constructor(schema: TSchema, path: string, value: unknown, error: Error);
|
|
14
16
|
}
|
|
15
17
|
/**
|
|
16
18
|
* `[Internal]` Decodes the value and returns the result. This function requires that
|