@depup/typebox 1.3.22-depup.0 → 1.3.30-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/validator.d.mts +1 -1
- package/build/compile/validator.mjs +1 -1
- package/build/format/iri.mjs +5 -1
- package/build/schema/build.mjs +2 -2
- package/build/schema/check.mjs +1 -1
- package/build/schema/compile.d.mts +3 -2
- package/build/schema/compile.mjs +8 -8
- package/build/schema/engine/_context.d.mts +6 -7
- package/build/schema/engine/_context.mjs +23 -15
- package/build/schema/engine/_functions.d.mts +2 -2
- package/build/schema/engine/_functions.mjs +1 -1
- package/build/schema/engine/_reducer.d.mts +3 -3
- package/build/schema/engine/_refine.d.mts +5 -5
- package/build/schema/engine/_refine.mjs +4 -7
- package/build/schema/engine/_stack.d.mts +34 -16
- package/build/schema/engine/_stack.mjs +148 -104
- package/build/schema/engine/additionalItems.d.mts +4 -4
- package/build/schema/engine/additionalProperties.d.mts +8 -8
- package/build/schema/engine/additionalProperties.mjs +11 -17
- package/build/schema/engine/allOf.d.mts +4 -4
- package/build/schema/engine/allOf.mjs +3 -3
- package/build/schema/engine/anyOf.d.mts +4 -4
- package/build/schema/engine/anyOf.mjs +5 -10
- package/build/schema/engine/boolean.d.mts +4 -4
- package/build/schema/engine/boolean.mjs +2 -6
- package/build/schema/engine/const.d.mts +4 -4
- package/build/schema/engine/const.mjs +2 -6
- package/build/schema/engine/contains.d.mts +4 -4
- package/build/schema/engine/contains.mjs +2 -6
- package/build/schema/engine/dependencies.d.mts +4 -4
- package/build/schema/engine/dependencies.mjs +3 -6
- package/build/schema/engine/dependentRequired.d.mts +4 -4
- package/build/schema/engine/dependentRequired.mjs +2 -6
- package/build/schema/engine/dependentSchemas.d.mts +4 -4
- package/build/schema/engine/dynamicRef.d.mts +4 -4
- package/build/schema/engine/dynamicRef.mjs +11 -7
- package/build/schema/engine/enum.d.mts +4 -4
- package/build/schema/engine/enum.mjs +2 -6
- package/build/schema/engine/exclusiveMaximum.d.mts +4 -4
- package/build/schema/engine/exclusiveMaximum.mjs +2 -6
- package/build/schema/engine/exclusiveMinimum.d.mts +4 -4
- package/build/schema/engine/exclusiveMinimum.mjs +2 -6
- package/build/schema/engine/format.d.mts +4 -4
- package/build/schema/engine/format.mjs +2 -6
- package/build/schema/engine/if.d.mts +4 -4
- package/build/schema/engine/if.mjs +7 -15
- package/build/schema/engine/items.d.mts +4 -4
- package/build/schema/engine/items.mjs +1 -1
- package/build/schema/engine/maxContains.d.mts +4 -4
- package/build/schema/engine/maxContains.mjs +2 -6
- package/build/schema/engine/maxItems.d.mts +4 -4
- package/build/schema/engine/maxItems.mjs +2 -6
- package/build/schema/engine/maxLength.d.mts +4 -4
- package/build/schema/engine/maxLength.mjs +2 -6
- package/build/schema/engine/maxProperties.d.mts +4 -4
- package/build/schema/engine/maxProperties.mjs +2 -6
- package/build/schema/engine/maximum.d.mts +4 -4
- package/build/schema/engine/maximum.mjs +2 -6
- package/build/schema/engine/minContains.d.mts +4 -4
- package/build/schema/engine/minContains.mjs +2 -6
- package/build/schema/engine/minItems.d.mts +5 -5
- package/build/schema/engine/minItems.mjs +2 -6
- package/build/schema/engine/minLength.d.mts +4 -4
- package/build/schema/engine/minLength.mjs +2 -6
- package/build/schema/engine/minProperties.d.mts +4 -4
- package/build/schema/engine/minProperties.mjs +2 -6
- package/build/schema/engine/minimum.d.mts +4 -4
- package/build/schema/engine/minimum.mjs +2 -6
- package/build/schema/engine/multipleOf.d.mts +4 -4
- package/build/schema/engine/multipleOf.mjs +2 -6
- package/build/schema/engine/not.d.mts +4 -4
- package/build/schema/engine/not.mjs +4 -8
- package/build/schema/engine/oneOf.d.mts +4 -4
- package/build/schema/engine/oneOf.mjs +6 -11
- package/build/schema/engine/pattern.d.mts +4 -4
- package/build/schema/engine/pattern.mjs +3 -7
- package/build/schema/engine/patternProperties.d.mts +4 -4
- package/build/schema/engine/patternProperties.mjs +1 -1
- package/build/schema/engine/prefixItems.d.mts +4 -4
- package/build/schema/engine/prefixItems.mjs +1 -1
- package/build/schema/engine/properties.d.mts +4 -4
- package/build/schema/engine/properties.mjs +1 -1
- package/build/schema/engine/propertyNames.d.mts +4 -4
- package/build/schema/engine/propertyNames.mjs +4 -10
- package/build/schema/engine/recursiveRef.d.mts +4 -4
- package/build/schema/engine/recursiveRef.mjs +11 -7
- package/build/schema/engine/ref.d.mts +4 -4
- package/build/schema/engine/ref.mjs +19 -15
- package/build/schema/engine/required.d.mts +4 -4
- package/build/schema/engine/required.mjs +2 -6
- package/build/schema/engine/schema.d.mts +7 -7
- package/build/schema/engine/schema.mjs +137 -133
- package/build/schema/engine/type.d.mts +4 -4
- package/build/schema/engine/type.mjs +2 -6
- package/build/schema/engine/unevaluatedItems.d.mts +4 -4
- package/build/schema/engine/unevaluatedItems.mjs +5 -9
- package/build/schema/engine/unevaluatedProperties.d.mts +4 -4
- package/build/schema/engine/unevaluatedProperties.mjs +5 -9
- package/build/schema/engine/uniqueItems.d.mts +4 -4
- package/build/schema/engine/uniqueItems.mjs +2 -6
- package/build/schema/errors.d.mts +2 -2
- package/build/schema/errors.mjs +8 -14
- package/build/schema/intern/index.d.mts +1 -0
- package/build/schema/intern/index.mjs +1 -0
- package/build/schema/intern/intern.d.mts +11 -0
- package/build/schema/intern/intern.mjs +293 -0
- package/build/schema/meta/draft_2019_09.d.mts +2 -0
- package/build/schema/meta/draft_2019_09.mjs +288 -0
- package/build/schema/meta/draft_2020_12.d.mts +2 -0
- package/build/schema/meta/draft_2020_12.mjs +300 -0
- package/build/schema/meta/draft_3.d.mts +2 -0
- package/build/schema/meta/draft_3.mjs +143 -0
- package/build/schema/meta/draft_4.d.mts +2 -0
- package/build/schema/meta/draft_4.mjs +149 -0
- package/build/schema/meta/draft_6.d.mts +2 -0
- package/build/schema/meta/draft_6.mjs +155 -0
- package/build/schema/meta/draft_7.d.mts +2 -0
- package/build/schema/meta/draft_7.mjs +172 -0
- package/build/schema/meta/index.d.mts +2 -0
- package/build/schema/meta/index.mjs +2 -0
- package/build/schema/meta/meta.d.mts +9 -0
- package/build/schema/meta/meta.mjs +15 -0
- package/build/schema/meta/schema.d.mts +6 -0
- package/build/schema/meta/schema.mjs +1 -0
- package/build/schema/parse.d.mts +1 -0
- package/build/schema/parse.mjs +10 -5
- package/build/schema/resolve/resolve.d.mts +8 -3
- package/build/schema/resolve/resolve.mjs +268 -139
- package/build/schema/schema.d.mts +2 -0
- package/build/schema/schema.mjs +2 -0
- package/build/value/errors/errors.d.mts +2 -12
- package/build/value/errors/errors.mjs +2 -7
- package/changes.json +1 -1
- package/package.json +3 -3
- package/readme.md +59 -89
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as Schema from '../types/index.mjs';
|
|
2
|
-
import
|
|
2
|
+
import * as Stack from './_stack.mjs';
|
|
3
3
|
import { BuildContext, CheckContext, ErrorContext } from './_context.mjs';
|
|
4
|
-
export declare function BuildUniqueItems(_stack: Stack, _context: BuildContext, schema: Schema.XUniqueItems, value: string): string;
|
|
5
|
-
export declare function CheckUniqueItems(_stack: Stack, _context: CheckContext, schema: Schema.XUniqueItems, value: unknown[]): boolean;
|
|
6
|
-
export declare function ErrorUniqueItems(_stack: Stack, context: ErrorContext, schemaPath: string, instancePath: string, schema: Schema.XUniqueItems, value: unknown[]): boolean;
|
|
4
|
+
export declare function BuildUniqueItems(_stack: Stack.XStack, _context: BuildContext, schema: Schema.XUniqueItems, value: string): string;
|
|
5
|
+
export declare function CheckUniqueItems(_stack: Stack.XStack, _context: CheckContext, schema: Schema.XUniqueItems, value: unknown[]): boolean;
|
|
6
|
+
export declare function ErrorUniqueItems(_stack: Stack.XStack, context: ErrorContext, schemaPath: string, instancePath: string, schema: Schema.XUniqueItems, value: unknown[]): boolean;
|
|
@@ -42,10 +42,6 @@ export function ErrorUniqueItems(_stack, context, schemaPath, instancePath, sche
|
|
|
42
42
|
return result;
|
|
43
43
|
}, []);
|
|
44
44
|
const isUniqueItems = G.IsEqual(duplicateItems.length, 0);
|
|
45
|
-
return isUniqueItems ||
|
|
46
|
-
|
|
47
|
-
schemaPath,
|
|
48
|
-
instancePath,
|
|
49
|
-
params: { duplicateItems },
|
|
50
|
-
});
|
|
45
|
+
return isUniqueItems ||
|
|
46
|
+
context.AddError('uniqueItems', schemaPath, instancePath, { duplicateItems });
|
|
51
47
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type TLocalizedValidationError } from '../error/index.mjs';
|
|
2
2
|
import * as Schema from './types/index.mjs';
|
|
3
|
-
/**
|
|
3
|
+
/** Returns an array of validation errors for the given value. */
|
|
4
4
|
export declare function Errors(schema: Schema.XSchema, value: unknown): [boolean, TLocalizedValidationError[]];
|
|
5
|
-
/**
|
|
5
|
+
/** Returns an array of validation errors for the given value. */
|
|
6
6
|
export declare function Errors(context: Record<PropertyKey, Schema.XSchema>, schema: Schema.XSchema, value: unknown): [boolean, TLocalizedValidationError[]];
|
package/build/schema/errors.mjs
CHANGED
|
@@ -1,24 +1,18 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
2
|
import { Arguments } from '../system/arguments/index.mjs';
|
|
3
|
-
import {
|
|
4
|
-
import { Get as LocaleGet } from '../system/locale/_config.mjs';
|
|
5
|
-
import { Guard } from '../guard/index.mjs';
|
|
3
|
+
import { Get as GetLocalizationFunction } from '../system/locale/_config.mjs';
|
|
6
4
|
import * as Engine from './engine/index.mjs';
|
|
7
|
-
/**
|
|
5
|
+
/** Returns an array of validation errors for the given value. */
|
|
8
6
|
export function Errors(...args) {
|
|
9
7
|
const [context, schema, value] = Arguments.Match(args, {
|
|
10
8
|
3: (context, schema, value) => [context, schema, value],
|
|
11
9
|
2: (schema, value) => [{}, schema, value]
|
|
12
10
|
});
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const errors = [];
|
|
16
|
-
const stack = new Engine.Stack(context, schema);
|
|
17
|
-
const errorContext = new Engine.ErrorContext(error => {
|
|
18
|
-
if (Guard.IsGreaterEqualThan(errors.length, settings.maxErrors))
|
|
19
|
-
return;
|
|
20
|
-
return errors.push({ ...error, message: locale(error) });
|
|
21
|
-
});
|
|
11
|
+
const stack = Engine.Stack(context, schema);
|
|
12
|
+
const errorContext = new Engine.ErrorContext();
|
|
22
13
|
const result = Engine.ErrorSchema(stack, errorContext, '#', '', schema, value);
|
|
23
|
-
|
|
14
|
+
const errors = errorContext.GetErrors();
|
|
15
|
+
const locale = GetLocalizationFunction();
|
|
16
|
+
const localized = errors.map(error => ({ ...error, message: locale(error) }));
|
|
17
|
+
return [result, localized];
|
|
24
18
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './intern.mjs';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './intern.mjs';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as Schema from '../types/index.mjs';
|
|
2
|
+
import { type XStatic } from '../static/index.mjs';
|
|
3
|
+
export interface XIntern<Type extends unknown = unknown> {
|
|
4
|
+
'~unsafe': Type;
|
|
5
|
+
$ref: string;
|
|
6
|
+
$defs: Record<string, Schema.XSchemaObject>;
|
|
7
|
+
}
|
|
8
|
+
/** (Experimental) This function restructures the schema such that each distinct sub-schema is stored exactly once in a $defs object and keyed by content hash. */
|
|
9
|
+
export declare function Intern<const Schema extends Schema.XSchema>(schema: Schema): XIntern<XStatic<Schema>>;
|
|
10
|
+
/** (Experimental) This function restructures the schema such that each distinct sub-schema is stored exactly once in a $defs object and keyed by content hash. */
|
|
11
|
+
export declare function Intern<const Schema extends Schema.XSchema>(context: Record<PropertyKey, Schema.XSchema>, schema: Schema): XIntern<XStatic<Schema>>;
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { Arguments } from '../../system/arguments/index.mjs';
|
|
2
|
+
import { Hashing, Memory } from '../../system/index.mjs';
|
|
3
|
+
import * as Schema from '../types/index.mjs';
|
|
4
|
+
import * as Stack from '../engine/_stack.mjs';
|
|
5
|
+
import { Guard } from '../../guard/index.mjs';
|
|
6
|
+
import { Resolve } from '../resolve/index.mjs';
|
|
7
|
+
// ----------------------------------------------------------------
|
|
8
|
+
// UnresolvableRef
|
|
9
|
+
// ----------------------------------------------------------------
|
|
10
|
+
function UnresolvableRef(ref) {
|
|
11
|
+
throw Error(`UnresolvableRef '${ref}'`);
|
|
12
|
+
}
|
|
13
|
+
// ----------------------------------------------------------------
|
|
14
|
+
// HashKey
|
|
15
|
+
// ----------------------------------------------------------------
|
|
16
|
+
function HashKey(schema) {
|
|
17
|
+
return `x-${Hashing.Hash(schema)}`;
|
|
18
|
+
}
|
|
19
|
+
// ----------------------------------------------------------------
|
|
20
|
+
// AdditionalItems
|
|
21
|
+
// ----------------------------------------------------------------
|
|
22
|
+
function FromAdditionalItems(context, schema) {
|
|
23
|
+
return FromSchema(context, schema.additionalItems);
|
|
24
|
+
}
|
|
25
|
+
// ----------------------------------------------------------------
|
|
26
|
+
// AdditionalProperties
|
|
27
|
+
// ----------------------------------------------------------------
|
|
28
|
+
function FromAdditionalProperties(context, schema) {
|
|
29
|
+
return FromSchema(context, schema.additionalProperties);
|
|
30
|
+
}
|
|
31
|
+
// ----------------------------------------------------------------
|
|
32
|
+
// AllOf
|
|
33
|
+
// ----------------------------------------------------------------
|
|
34
|
+
function FromAllOf(context, schema) {
|
|
35
|
+
return schema.allOf.map((inner) => FromSchema(context, inner));
|
|
36
|
+
}
|
|
37
|
+
// ----------------------------------------------------------------
|
|
38
|
+
// AnyOf
|
|
39
|
+
// ----------------------------------------------------------------
|
|
40
|
+
function FromAnyOf(context, schema) {
|
|
41
|
+
return schema.anyOf.map((inner) => FromSchema(context, inner));
|
|
42
|
+
}
|
|
43
|
+
// ----------------------------------------------------------------
|
|
44
|
+
// Contains
|
|
45
|
+
// ----------------------------------------------------------------
|
|
46
|
+
function FromContains(context, schema) {
|
|
47
|
+
return FromSchema(context, schema.contains);
|
|
48
|
+
}
|
|
49
|
+
// ----------------------------------------------------------------
|
|
50
|
+
// DependentSchemas
|
|
51
|
+
// ----------------------------------------------------------------
|
|
52
|
+
function FromDependentSchemas(context, schema) {
|
|
53
|
+
return Guard.Keys(schema.dependentSchemas).reduce((result, key) => ({ ...result, [key]: FromSchema(context, schema.dependentSchemas[key]) }), {});
|
|
54
|
+
}
|
|
55
|
+
// ----------------------------------------------------------------
|
|
56
|
+
// Else
|
|
57
|
+
// ----------------------------------------------------------------
|
|
58
|
+
function FromElse(context, schema) {
|
|
59
|
+
return FromSchema(context, schema.else);
|
|
60
|
+
}
|
|
61
|
+
// ----------------------------------------------------------------
|
|
62
|
+
// If
|
|
63
|
+
// ----------------------------------------------------------------
|
|
64
|
+
function FromIf(context, schema) {
|
|
65
|
+
return FromSchema(context, schema.if);
|
|
66
|
+
}
|
|
67
|
+
// ----------------------------------------------------------------
|
|
68
|
+
// Items
|
|
69
|
+
// ----------------------------------------------------------------
|
|
70
|
+
function FromItems(context, schema) {
|
|
71
|
+
return Schema.IsItemsSized(schema) ? FromItemsSized(context, schema) : FromItemsUnsized(context, schema);
|
|
72
|
+
}
|
|
73
|
+
// ----------------------------------------------------------------
|
|
74
|
+
// ItemsSized
|
|
75
|
+
// ----------------------------------------------------------------
|
|
76
|
+
function FromItemsSized(context, schema) {
|
|
77
|
+
return schema.items.map((inner) => FromSchema(context, inner));
|
|
78
|
+
}
|
|
79
|
+
// ----------------------------------------------------------------
|
|
80
|
+
// ItemsUnsized
|
|
81
|
+
// ----------------------------------------------------------------
|
|
82
|
+
function FromItemsUnsized(context, schema) {
|
|
83
|
+
return FromSchema(context, schema.items);
|
|
84
|
+
}
|
|
85
|
+
// ----------------------------------------------------------------
|
|
86
|
+
// Not
|
|
87
|
+
// ----------------------------------------------------------------
|
|
88
|
+
function FromNot(context, schema) {
|
|
89
|
+
return FromSchema(context, schema.not);
|
|
90
|
+
}
|
|
91
|
+
// ----------------------------------------------------------------
|
|
92
|
+
// OneOf
|
|
93
|
+
// ----------------------------------------------------------------
|
|
94
|
+
function FromOneOf(context, schema) {
|
|
95
|
+
return schema.oneOf.map((inner) => FromSchema(context, inner));
|
|
96
|
+
}
|
|
97
|
+
// ----------------------------------------------------------------
|
|
98
|
+
// PatternProperties
|
|
99
|
+
// ----------------------------------------------------------------
|
|
100
|
+
function FromPatternProperties(context, schema) {
|
|
101
|
+
return Guard.Keys(schema.patternProperties).reduce((result, key) => ({ ...result, [key]: FromSchema(context, schema.patternProperties[key]) }), {});
|
|
102
|
+
}
|
|
103
|
+
// ----------------------------------------------------------------
|
|
104
|
+
// PrefixItems
|
|
105
|
+
// ----------------------------------------------------------------
|
|
106
|
+
function FromPrefixItems(context, schema) {
|
|
107
|
+
return schema.prefixItems.map((inner) => FromSchema(context, inner));
|
|
108
|
+
}
|
|
109
|
+
// ----------------------------------------------------------------
|
|
110
|
+
// Properties
|
|
111
|
+
// ----------------------------------------------------------------
|
|
112
|
+
function FromProperties(context, schema) {
|
|
113
|
+
return Guard.Keys(schema.properties).reduce((result, key) => ({ ...result, [key]: FromSchema(context, schema.properties[key]) }), {});
|
|
114
|
+
}
|
|
115
|
+
// ----------------------------------------------------------------
|
|
116
|
+
// PropertyNames
|
|
117
|
+
// ----------------------------------------------------------------
|
|
118
|
+
function FromPropertyNames(context, schema) {
|
|
119
|
+
return FromSchema(context, schema.propertyNames);
|
|
120
|
+
}
|
|
121
|
+
// ----------------------------------------------------------------
|
|
122
|
+
// Ref
|
|
123
|
+
// ----------------------------------------------------------------
|
|
124
|
+
function ResolveRef(stack, ref) {
|
|
125
|
+
const result = Resolve.Ref(stack, { $ref: ref });
|
|
126
|
+
return { schema: result.schema ?? UnresolvableRef(ref), stack: result.stack };
|
|
127
|
+
}
|
|
128
|
+
// ----------------------------------------------------------------
|
|
129
|
+
// DynamicRef
|
|
130
|
+
// ----------------------------------------------------------------
|
|
131
|
+
function ResolveDynamicRef(stack, schema) {
|
|
132
|
+
return Resolve.DynamicRef(stack, schema) ?? UnresolvableRef(schema.$dynamicRef);
|
|
133
|
+
}
|
|
134
|
+
// ----------------------------------------------------------------
|
|
135
|
+
// RecursiveRef
|
|
136
|
+
// ----------------------------------------------------------------
|
|
137
|
+
function ResolveRecursiveRef(stack, schema) {
|
|
138
|
+
return Resolve.RecursiveRef(stack, schema) ?? UnresolvableRef(schema.$recursiveRef);
|
|
139
|
+
}
|
|
140
|
+
// ----------------------------------------------------------------
|
|
141
|
+
// FromResolvedRef (shared logic for Ref, DynamicRef, RecursiveRef)
|
|
142
|
+
// ----------------------------------------------------------------
|
|
143
|
+
function FromResolvedRef(context, target, nextStack) {
|
|
144
|
+
const nextContext = { ...context, stack: nextStack };
|
|
145
|
+
const resolving = context.resolving.get(target);
|
|
146
|
+
if (Guard.IsUndefined(resolving))
|
|
147
|
+
return FromSchema(nextContext, target);
|
|
148
|
+
// Target is mid-intern, so this is a cycle (point at its reserved placeholder)
|
|
149
|
+
resolving.used = true;
|
|
150
|
+
return { $ref: `#/$defs/${resolving.key}` };
|
|
151
|
+
}
|
|
152
|
+
// ----------------------------------------------------------------
|
|
153
|
+
// FromRef
|
|
154
|
+
// ----------------------------------------------------------------
|
|
155
|
+
function FromRef(context, schema) {
|
|
156
|
+
// Resolve target off the current traversal stack, carrying forward any resource crossing
|
|
157
|
+
const { schema: target, stack } = ResolveRef(context.stack, schema.$ref);
|
|
158
|
+
return FromResolvedRef(context, target, stack);
|
|
159
|
+
}
|
|
160
|
+
// ----------------------------------------------------------------
|
|
161
|
+
// FromDynamicRef
|
|
162
|
+
// ----------------------------------------------------------------
|
|
163
|
+
function FromDynamicRef(context, schema) {
|
|
164
|
+
// Resolve target off the current traversal stack (dynamic scope depends on anchors seen so far)
|
|
165
|
+
const target = ResolveDynamicRef(context.stack, schema);
|
|
166
|
+
return FromResolvedRef(context, target, { ...context.stack, pendingResource: true });
|
|
167
|
+
}
|
|
168
|
+
// ----------------------------------------------------------------
|
|
169
|
+
// FromRecursiveRef
|
|
170
|
+
// ----------------------------------------------------------------
|
|
171
|
+
function FromRecursiveRef(context, schema) {
|
|
172
|
+
// Resolve target off the current traversal stack (recursive scope depends on the path taken so far)
|
|
173
|
+
const target = ResolveRecursiveRef(context.stack, schema);
|
|
174
|
+
return FromResolvedRef(context, target, { ...context.stack, pendingResource: true });
|
|
175
|
+
}
|
|
176
|
+
// ----------------------------------------------------------------
|
|
177
|
+
// Then
|
|
178
|
+
// ----------------------------------------------------------------
|
|
179
|
+
function FromThen(context, schema) {
|
|
180
|
+
return FromSchema(context, schema.then);
|
|
181
|
+
}
|
|
182
|
+
// ----------------------------------------------------------------
|
|
183
|
+
// UnevaluatedItems
|
|
184
|
+
// ----------------------------------------------------------------
|
|
185
|
+
function FromUnevaluatedItems(context, schema) {
|
|
186
|
+
return FromSchema(context, schema.unevaluatedItems);
|
|
187
|
+
}
|
|
188
|
+
// ----------------------------------------------------------------
|
|
189
|
+
// UnevaluatedProperties
|
|
190
|
+
// ----------------------------------------------------------------
|
|
191
|
+
function FromUnevaluatedProperties(context, schema) {
|
|
192
|
+
return FromSchema(context, schema.unevaluatedProperties);
|
|
193
|
+
}
|
|
194
|
+
// ----------------------------------------------------------------
|
|
195
|
+
// SchemaObject
|
|
196
|
+
// ----------------------------------------------------------------
|
|
197
|
+
function FromSchemaObject(context, schema) {
|
|
198
|
+
// Reference-style schemas resolve to another node and cannot contain other keywords
|
|
199
|
+
if (Schema.IsRef(schema))
|
|
200
|
+
return FromRef(context, schema);
|
|
201
|
+
if (Schema.IsDynamicRef(schema))
|
|
202
|
+
return FromDynamicRef(context, schema);
|
|
203
|
+
if (Schema.IsRecursiveRef(schema))
|
|
204
|
+
return FromRecursiveRef(context, schema);
|
|
205
|
+
// Check if the schema has already been resolved
|
|
206
|
+
const existing = resolved.get(schema);
|
|
207
|
+
if (!Guard.IsUndefined(existing))
|
|
208
|
+
return existing;
|
|
209
|
+
// Reserve a placeholder key in case a nested ref cycles back to this schema
|
|
210
|
+
const reservation = { key: `x-ref-${context.resolving.size}`, used: false };
|
|
211
|
+
context.resolving.set(schema, reservation);
|
|
212
|
+
// Intern each subschema
|
|
213
|
+
const remapped = {
|
|
214
|
+
...(Schema.IsRefine(schema) ? { ['~refine']: schema['~refine'] } : {}),
|
|
215
|
+
...(Schema.IsAdditionalItems(schema) ? { additionalItems: FromAdditionalItems(context, schema) } : {}),
|
|
216
|
+
...(Schema.IsAdditionalProperties(schema) ? { additionalProperties: FromAdditionalProperties(context, schema) } : {}),
|
|
217
|
+
...(Schema.IsAllOf(schema) ? { allOf: FromAllOf(context, schema) } : {}),
|
|
218
|
+
...(Schema.IsAnyOf(schema) ? { anyOf: FromAnyOf(context, schema) } : {}),
|
|
219
|
+
...(Schema.IsContains(schema) ? { contains: FromContains(context, schema) } : {}),
|
|
220
|
+
...(Schema.IsDependentSchemas(schema) ? { dependentSchemas: FromDependentSchemas(context, schema) } : {}),
|
|
221
|
+
...(Schema.IsElse(schema) ? { else: FromElse(context, schema) } : {}),
|
|
222
|
+
...(Schema.IsIf(schema) ? { if: FromIf(context, schema) } : {}),
|
|
223
|
+
...(Schema.IsItems(schema) ? { items: FromItems(context, schema) } : {}),
|
|
224
|
+
...(Schema.IsNot(schema) ? { not: FromNot(context, schema) } : {}),
|
|
225
|
+
...(Schema.IsOneOf(schema) ? { oneOf: FromOneOf(context, schema) } : {}),
|
|
226
|
+
...(Schema.IsPatternProperties(schema) ? { patternProperties: FromPatternProperties(context, schema) } : {}),
|
|
227
|
+
...(Schema.IsPrefixItems(schema) ? { prefixItems: FromPrefixItems(context, schema) } : {}),
|
|
228
|
+
...(Schema.IsProperties(schema) ? { properties: FromProperties(context, schema) } : {}),
|
|
229
|
+
...(Schema.IsPropertyNames(schema) ? { propertyNames: FromPropertyNames(context, schema) } : {}),
|
|
230
|
+
...(Schema.IsThen(schema) ? { then: FromThen(context, schema) } : {}),
|
|
231
|
+
...(Schema.IsUnevaluatedItems(schema) ? { unevaluatedItems: FromUnevaluatedItems(context, schema) } : {}),
|
|
232
|
+
...(Schema.IsUnevaluatedProperties(schema) ? { unevaluatedProperties: FromUnevaluatedProperties(context, schema) } : {})
|
|
233
|
+
};
|
|
234
|
+
context.resolving.delete(schema);
|
|
235
|
+
// Discard resolution keywords and finalize the interned schema
|
|
236
|
+
const interned = Memory.Discard(Memory.Assign(schema, remapped), ['$id', '$defs', '$anchor', '$dynamicAnchor', '$recursionAnchor']);
|
|
237
|
+
const key = reservation.used ? reservation.key : HashKey(interned);
|
|
238
|
+
registry.set(key, interned);
|
|
239
|
+
// Result
|
|
240
|
+
const result = { $ref: `#/$defs/${key}` };
|
|
241
|
+
resolved.set(schema, result);
|
|
242
|
+
return result;
|
|
243
|
+
}
|
|
244
|
+
// ----------------------------------------------------------------
|
|
245
|
+
// SchemaBoolean
|
|
246
|
+
// ----------------------------------------------------------------
|
|
247
|
+
function FromSchemaBoolean(_context, schema) {
|
|
248
|
+
// Finalize and register the result
|
|
249
|
+
const key = HashKey(schema);
|
|
250
|
+
registry.set(key, schema);
|
|
251
|
+
// Result
|
|
252
|
+
const result = { $ref: `#/$defs/${key}` };
|
|
253
|
+
resolved.set(schema, result);
|
|
254
|
+
return result;
|
|
255
|
+
}
|
|
256
|
+
// ----------------------------------------------------------------
|
|
257
|
+
// Schema
|
|
258
|
+
// ----------------------------------------------------------------
|
|
259
|
+
function FromSchema(context, schema) {
|
|
260
|
+
const next = { ...context, stack: Stack.NextStack(context.stack, schema) };
|
|
261
|
+
return Schema.IsSchemaBoolean(schema) ? FromSchemaBoolean(next, schema) : FromSchemaObject(next, schema);
|
|
262
|
+
}
|
|
263
|
+
// ----------------------------------------------------------------
|
|
264
|
+
// BooleanEntry
|
|
265
|
+
// ----------------------------------------------------------------
|
|
266
|
+
function BooleanEntry(schema) {
|
|
267
|
+
const key = HashKey(schema);
|
|
268
|
+
return { $ref: `#/$defs/${key}`, $defs: { [key]: schema } };
|
|
269
|
+
}
|
|
270
|
+
// ----------------------------------------------------------------
|
|
271
|
+
// Module-level accumulator state
|
|
272
|
+
// ----------------------------------------------------------------
|
|
273
|
+
const registry = new Map();
|
|
274
|
+
const resolved = new Map();
|
|
275
|
+
/** (Experimental) This function restructures the schema such that each distinct sub-schema is stored exactly once in a $defs object and keyed by content hash. */
|
|
276
|
+
export function Intern(...args) {
|
|
277
|
+
const [context, schema] = Arguments.Match(args, {
|
|
278
|
+
2: (context, schema) => [context, schema],
|
|
279
|
+
1: (schema) => [{}, schema]
|
|
280
|
+
});
|
|
281
|
+
registry.clear();
|
|
282
|
+
resolved.clear();
|
|
283
|
+
if (Schema.IsSchemaBoolean(schema))
|
|
284
|
+
return BooleanEntry(schema);
|
|
285
|
+
const defs = Schema.IsDefs(schema) ? schema.$defs : {};
|
|
286
|
+
const rootStack = Stack.Stack({ ...context, ...defs }, schema);
|
|
287
|
+
const { schema: entry, stack } = Schema.IsRef(schema) ? ResolveRef(Stack.NextStack(rootStack, schema), schema.$ref) : { schema, stack: rootStack };
|
|
288
|
+
if (Schema.IsSchemaBoolean(entry))
|
|
289
|
+
return BooleanEntry(entry);
|
|
290
|
+
const ref_context = { stack, resolving: new Map() };
|
|
291
|
+
const result = FromSchema(ref_context, entry);
|
|
292
|
+
return { $ref: result.$ref, $defs: Object.fromEntries(registry) };
|
|
293
|
+
}
|