@x0k/json-schema-merge 1.0.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/LICENSE +7 -0
- package/README.md +181 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lib/array.d.ts +19 -0
- package/dist/lib/array.js +133 -0
- package/dist/lib/function.d.ts +1 -0
- package/dist/lib/function.js +3 -0
- package/dist/lib/json-schema/compare/compare.d.ts +9 -0
- package/dist/lib/json-schema/compare/compare.js +205 -0
- package/dist/lib/json-schema/compare/index.d.ts +1 -0
- package/dist/lib/json-schema/compare/index.js +1 -0
- package/dist/lib/json-schema/index.d.ts +5 -0
- package/dist/lib/json-schema/index.js +5 -0
- package/dist/lib/json-schema/json-schema.d.ts +37 -0
- package/dist/lib/json-schema/json-schema.js +56 -0
- package/dist/lib/json-schema/merge/all-of-merge.d.ts +3 -0
- package/dist/lib/json-schema/merge/all-of-merge.js +29 -0
- package/dist/lib/json-schema/merge/index.d.ts +3 -0
- package/dist/lib/json-schema/merge/index.js +3 -0
- package/dist/lib/json-schema/merge/merge.d.ts +91 -0
- package/dist/lib/json-schema/merge/merge.js +554 -0
- package/dist/lib/json-schema/merge/patterns.d.ts +2 -0
- package/dist/lib/json-schema/merge/patterns.js +6 -0
- package/dist/lib/json-schema/transform.d.ts +4 -0
- package/dist/lib/json-schema/transform.js +72 -0
- package/dist/lib/json-schema/traverse.d.ts +26 -0
- package/dist/lib/json-schema/traverse.js +1 -0
- package/dist/lib/math.d.ts +2 -0
- package/dist/lib/math.js +2 -0
- package/dist/lib/memoize.d.ts +7 -0
- package/dist/lib/memoize.js +11 -0
- package/dist/lib/object.d.ts +2 -0
- package/dist/lib/object.js +12 -0
- package/dist/lib/ord.d.ts +9 -0
- package/dist/lib/ord.js +7 -0
- package/dist/lib/traverser.d.ts +4 -0
- package/dist/lib/traverser.js +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { isRecordEmpty } from "../object.js";
|
|
2
|
+
export const JSON_SCHEMA_TYPE_NAMES = [
|
|
3
|
+
"array",
|
|
4
|
+
"boolean",
|
|
5
|
+
"integer",
|
|
6
|
+
"null",
|
|
7
|
+
"number",
|
|
8
|
+
"object",
|
|
9
|
+
"string",
|
|
10
|
+
];
|
|
11
|
+
export const SET_OF_JSON_SCHEMA_TYPE_NAMES = new Set(JSON_SCHEMA_TYPE_NAMES);
|
|
12
|
+
export function isJsonSchemaType(type) {
|
|
13
|
+
return SET_OF_JSON_SCHEMA_TYPE_NAMES.has(type);
|
|
14
|
+
}
|
|
15
|
+
// WARN: Order is important
|
|
16
|
+
export const RECORDS_OF_SUB_SCHEMAS = [
|
|
17
|
+
"$defs",
|
|
18
|
+
"definitions",
|
|
19
|
+
"properties",
|
|
20
|
+
"patternProperties",
|
|
21
|
+
"dependencies",
|
|
22
|
+
];
|
|
23
|
+
export const SET_OF_RECORDS_OF_SUB_SCHEMAS = new Set(RECORDS_OF_SUB_SCHEMAS);
|
|
24
|
+
// WARN: Order is important
|
|
25
|
+
export const ARRAYS_OF_SUB_SCHEMAS = [
|
|
26
|
+
"items",
|
|
27
|
+
"allOf",
|
|
28
|
+
"oneOf",
|
|
29
|
+
"anyOf",
|
|
30
|
+
];
|
|
31
|
+
export const SET_OF_ARRAYS_OF_SUB_SCHEMAS = new Set(ARRAYS_OF_SUB_SCHEMAS);
|
|
32
|
+
// WARN: Order is important
|
|
33
|
+
export const SUB_SCHEMAS = [
|
|
34
|
+
"items",
|
|
35
|
+
"additionalItems",
|
|
36
|
+
"additionalProperties",
|
|
37
|
+
"propertyNames",
|
|
38
|
+
"contains",
|
|
39
|
+
"if",
|
|
40
|
+
"then",
|
|
41
|
+
"else",
|
|
42
|
+
"not",
|
|
43
|
+
];
|
|
44
|
+
export const SET_OF_SUB_SCHEMAS = new Set(SUB_SCHEMAS);
|
|
45
|
+
// WARN: Order is important
|
|
46
|
+
export const ALL_SUB_SCHEMA_KEYS = [
|
|
47
|
+
...RECORDS_OF_SUB_SCHEMAS,
|
|
48
|
+
...ARRAYS_OF_SUB_SCHEMAS,
|
|
49
|
+
...SUB_SCHEMAS,
|
|
50
|
+
];
|
|
51
|
+
export function isSchemaObject(schemaDef) {
|
|
52
|
+
return typeof schemaDef === "object";
|
|
53
|
+
}
|
|
54
|
+
export function isAllowAnySchema(def) {
|
|
55
|
+
return isSchemaObject(def) ? isRecordEmpty(def) : def === true;
|
|
56
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { JSONSchema7Definition } from "json-schema";
|
|
2
|
+
export declare function createShallowAllOfMerge(mergeArrayOfSchemaDefinitions: (defs: JSONSchema7Definition[]) => JSONSchema7Definition): (schema: JSONSchema7Definition) => JSONSchema7Definition;
|
|
3
|
+
export declare function createDeepAllOfMerge(shallowMerge: (def: JSONSchema7Definition) => JSONSchema7Definition): (schemaDef: JSONSchema7Definition) => JSONSchema7Definition;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { transformSchemaDefinition } from "../transform.js";
|
|
2
|
+
function getAllOfSchemas(schema) {
|
|
3
|
+
const result = [];
|
|
4
|
+
const stack = [schema];
|
|
5
|
+
while (stack.length > 0) {
|
|
6
|
+
const current = stack.pop();
|
|
7
|
+
if (typeof current === "boolean" || current.allOf === undefined) {
|
|
8
|
+
result.push(current);
|
|
9
|
+
continue;
|
|
10
|
+
}
|
|
11
|
+
const { allOf, ...rest } = current;
|
|
12
|
+
result.push(rest);
|
|
13
|
+
for (let i = allOf.length - 1; i >= 0; i--) {
|
|
14
|
+
stack.push(allOf[i]);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
export function createShallowAllOfMerge(mergeArrayOfSchemaDefinitions) {
|
|
20
|
+
return (schema) => mergeArrayOfSchemaDefinitions(getAllOfSchemas(schema));
|
|
21
|
+
}
|
|
22
|
+
export function createDeepAllOfMerge(shallowMerge) {
|
|
23
|
+
return (schemaDef) => transformSchemaDefinition(schemaDef, (def) => {
|
|
24
|
+
if (typeof def === "boolean" || def.allOf === undefined) {
|
|
25
|
+
return def;
|
|
26
|
+
}
|
|
27
|
+
return shallowMerge(def);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { JSONSchema7, JSONSchema7Definition, JSONSchema7Type } from "json-schema";
|
|
2
|
+
import { type Deduplicator, type Intersector } from "../../array.ts";
|
|
3
|
+
type SchemaKey = keyof JSONSchema7;
|
|
4
|
+
/**
|
|
5
|
+
* An assigner function operates at the schema-object level.
|
|
6
|
+
* It receives the partially merged `target` and the original
|
|
7
|
+
* `left` and `right` schemas.
|
|
8
|
+
*
|
|
9
|
+
* In most cases, it modifies and returns the `target` object,
|
|
10
|
+
* but it may also return a completely new schema object if needed.
|
|
11
|
+
*
|
|
12
|
+
* Assigners are used for keywords that cannot be merged by simple
|
|
13
|
+
* value-level functions, often because they interact with other
|
|
14
|
+
* keywords or require holistic decisions.
|
|
15
|
+
*/
|
|
16
|
+
export type Assigner<R extends {}> = (target: R, l: R, r: R) => R;
|
|
17
|
+
/**
|
|
18
|
+
* A merger function combines two values for a specific JSON Schema keyword.
|
|
19
|
+
*/
|
|
20
|
+
export type Merger<T> = (a: T, b: T) => T;
|
|
21
|
+
/**
|
|
22
|
+
* A validation function that ensures consistency between two schema keywords.
|
|
23
|
+
*/
|
|
24
|
+
export type Check<K extends SchemaKey> = (target: Required<Pick<JSONSchema7, K>>) => boolean;
|
|
25
|
+
export type CheckEntry<A extends SchemaKey, B extends SchemaKey> = readonly [
|
|
26
|
+
A,
|
|
27
|
+
B,
|
|
28
|
+
Check<A | B>
|
|
29
|
+
];
|
|
30
|
+
export declare function check<A extends SchemaKey, B extends SchemaKey>(a: A, b: B, check: Check<A | B>): CheckEntry<A, B>;
|
|
31
|
+
export interface MergeOptions {
|
|
32
|
+
/**
|
|
33
|
+
* Custom function to test whether a regular expression `subExpr`
|
|
34
|
+
* is considered a subset of another `superExpr`.
|
|
35
|
+
* @default Object.is
|
|
36
|
+
*/
|
|
37
|
+
isSubRegExp?: (subExpr: string, superExpr: string) => boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Merger function for combining regular expression patterns
|
|
40
|
+
* @default simplePatternsMerger
|
|
41
|
+
*/
|
|
42
|
+
mergePatterns?: Merger<string>;
|
|
43
|
+
/**
|
|
44
|
+
* Intersector function for merging JSON values (enum keyword)
|
|
45
|
+
* @default intersection
|
|
46
|
+
*/
|
|
47
|
+
intersectJson?: Intersector<JSONSchema7Type>;
|
|
48
|
+
/**
|
|
49
|
+
* Deduplication strategy for JSON Schema definitions.
|
|
50
|
+
* @default identity
|
|
51
|
+
*/
|
|
52
|
+
deduplicateJsonSchemaDef?: Deduplicator<JSONSchema7Definition>;
|
|
53
|
+
/**
|
|
54
|
+
* Fallback merger applied when no keyword-specific merger is defined.
|
|
55
|
+
* @default identity
|
|
56
|
+
*/
|
|
57
|
+
defaultMerger?: Merger<any>;
|
|
58
|
+
/**
|
|
59
|
+
* A mapping of schema keywords to merger functions.
|
|
60
|
+
*
|
|
61
|
+
* - A merger operates on **values of a single keyword** (`a`, `b` → merged value).
|
|
62
|
+
* - When provided, a custom merger **overrides the default merger** for that keyword.
|
|
63
|
+
*/
|
|
64
|
+
mergers?: Partial<{
|
|
65
|
+
[K in SchemaKey]: Merger<Exclude<JSONSchema7[K], undefined>>;
|
|
66
|
+
}>;
|
|
67
|
+
/**
|
|
68
|
+
* A collection of keyword groups with associated assigner functions.
|
|
69
|
+
*
|
|
70
|
+
* - An assigner operates at the **schema-object level** (`target`, `left`, `right`).
|
|
71
|
+
* - Custom assigners are **appended** to the default assigners,
|
|
72
|
+
* but can also **replace behavior** for specific keywords if they overlap.
|
|
73
|
+
*/
|
|
74
|
+
assigners?: Iterable<[SchemaKey[], Assigner<JSONSchema7>]>;
|
|
75
|
+
/**
|
|
76
|
+
* Consistency checks to validate relationships between
|
|
77
|
+
* pairs of schema keywords (e.g. `minimum` ≤ `maximum`).
|
|
78
|
+
*
|
|
79
|
+
* - A check ensures that two related keywords do not conflict.
|
|
80
|
+
* - Providing this option **replaces the default checks** completely.
|
|
81
|
+
*
|
|
82
|
+
* @default DEFAULT_CHECKS
|
|
83
|
+
*/
|
|
84
|
+
checks?: Iterable<CheckEntry<SchemaKey, SchemaKey>>;
|
|
85
|
+
}
|
|
86
|
+
export declare const DEFAULT_CHECKS: (CheckEntry<"minimum", "maximum"> | CheckEntry<"exclusiveMinimum", "maximum"> | CheckEntry<"minimum", "exclusiveMaximum"> | CheckEntry<"exclusiveMinimum", "exclusiveMaximum"> | CheckEntry<"minLength", "maxLength"> | CheckEntry<"minItems", "maxItems"> | CheckEntry<"minProperties", "maxProperties">)[];
|
|
87
|
+
export declare function createMerger({ mergePatterns, isSubRegExp, intersectJson, deduplicateJsonSchemaDef, defaultMerger, assigners, checks, mergers, }?: MergeOptions): {
|
|
88
|
+
mergeSchemaDefinitions: (left: JSONSchema7Definition, right: JSONSchema7Definition) => boolean | JSONSchema7;
|
|
89
|
+
mergeArrayOfSchemaDefinitions: (schemas: JSONSchema7Definition[]) => JSONSchema7Definition;
|
|
90
|
+
};
|
|
91
|
+
export {};
|