Skip to content

Commit d82ebd4

Browse files
authored
Merge pull request #191 from x0k/backport-modern-merger
Backport modern merger
2 parents e837bb3 + 745d067 commit d82ebd4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+9092
-465
lines changed

.changeset/eighty-rings-return.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@sjsf/form": minor
3+
---
4+
5+
Export mergers from `form/mergers`

.changeset/tired-suits-attack.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@sjsf/form": minor
3+
---
4+
5+
Add `json-schema`, `math`, `ord`, `traverser` libs, new `array` functions

mkfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ f/:
7171
pnpm run dev
7272
b:
7373
pnpm run build
74+
ben:
75+
pnpm run bench $@
7476
c:
7577
pnpm run check
7678
t:

packages/form/package.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"scripts": {
3030
"dev": "vite",
3131
"test": "vitest run --typecheck --exclude '.svelte-kit/**'",
32+
"bench": "vitest bench --exclude '.svelte-kit/**'",
3233
"build": "svelte-package && publint",
3334
"check": "svelte-check --tsconfig ./tsconfig.json"
3435
},
@@ -44,12 +45,20 @@
4445
"svelte": "^5.33.0"
4546
},
4647
"devDependencies": {
48+
"@types/json-schema-compare": "^0.2.4",
49+
"ajv": "catalog:",
50+
"allof-merge": "^0.6.7",
4751
"deep-freeze-es6": "^4.0.1",
52+
"json-schema-compare": "^0.2.2",
4853
"svelte": "catalog:"
4954
},
5055
"types": "./dist/form/index.d.ts",
5156
"svelte": "./dist/form/index.js",
5257
"exports": {
58+
"./lib/json-schema": {
59+
"types": "./dist/lib/json-schema/index.d.ts",
60+
"default": "./dist/lib/json-schema/index.js"
61+
},
5362
"./lib/*.svelte": {
5463
"types": "./dist/lib/*.svelte.d.ts",
5564
"svelte": "./dist/lib/*.svelte"
@@ -111,6 +120,10 @@
111120
"types": "./dist/validators/*.d.ts",
112121
"default": "./dist/validators/*.js"
113122
},
123+
"./mergers/*": {
124+
"types": "./dist/mergers/*.d.ts",
125+
"default": "./dist/mergers/*.js"
126+
},
114127
"./focus-on-first-error": {
115128
"types": "./dist/focus-on-first-error.d.ts",
116129
"svelte": "./dist/focus-on-first-error.js"

packages/form/src/core/default-state.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
// Licensed under the Apache License, Version 2.0.
33
// Modifications made by Roman Krasilnikov.
44

5-
import { isEmptyRecord, isObject } from "@/lib/object.js";
5+
import { isRecordEmpty, isObject } from "@/lib/object.js";
6+
import { isSchemaObject } from '@/lib/json-schema/index.js'
67

78
import { resolveDependencies, retrieveSchema } from "./resolve.js";
89
import {
910
ALL_OF_KEY,
1011
DEPENDENCIES_KEY,
11-
isSchema,
1212
type Schema,
1313
type SchemaArrayValue,
1414
type SchemaObjectValue,
@@ -359,7 +359,7 @@ export function computeDefaults(
359359
merger,
360360
rootSchema,
361361
rawFormData ?? schemaDefault,
362-
schemaOneOf.filter(isSchema),
362+
schemaOneOf.filter(isSchemaObject),
363363
0,
364364
getDiscriminatorFieldFromSchema(schema)
365365
)
@@ -380,7 +380,7 @@ export function computeDefaults(
380380
merger,
381381
rootSchema,
382382
rawFormData ?? schemaDefault,
383-
schemaAnyOf.filter(isSchema),
383+
schemaAnyOf.filter(isSchemaObject),
384384
0,
385385
getDiscriminatorFieldFromSchema(schema)
386386
)
@@ -509,7 +509,7 @@ function maybeAddDefaultToObject(
509509
if (
510510
Array.isArray(computedDefault)
511511
? computedDefault.length > 0
512-
: !isObject(computedDefault) || !isEmptyRecord(computedDefault)
512+
: !isObject(computedDefault) || !isRecordEmpty(computedDefault)
513513
) {
514514
obj.set(key, computedDefault);
515515
}

packages/form/src/core/definitions.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,9 @@
44

55
import jsonpointer from "jsonpointer";
66

7-
import {
8-
isSchema,
9-
REF_KEY,
10-
type Schema,
11-
type SchemaDefinition,
12-
} from "./schema.js";
7+
import { isSchemaObject } from "@/lib/json-schema/index.js";
8+
9+
import { REF_KEY, type Schema, type SchemaDefinition } from "./schema.js";
1310
import { mergeSchemas } from "./merge.js";
1411

1512
export function resolveRef(ref: string, rootSchema: Schema) {
@@ -32,7 +29,7 @@ export function findSchemaDefinition(
3229
stack = new Set<string>()
3330
): Schema {
3431
const current = resolveRef(ref, rootSchema);
35-
if (!isSchema(current)) {
32+
if (!isSchemaObject(current)) {
3633
throw new Error(`Definition for ${ref} should be a schema (object)`);
3734
}
3835
const nextRef = current[REF_KEY];

packages/form/src/core/discriminator.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Licensed under the Apache License, Version 2.0.
33
// Modifications made by Roman Krasilnikov.
44

5-
import { afterAll, beforeAll, describe, expect, it, test, vi, type MockInstance } from 'vitest';
5+
import { describe, expect, it, test } from 'vitest';
66

77
import { getDiscriminatorFieldFromSchema, getOptionMatchingSimpleDiscriminator } from './discriminator.js';
88
import type { Schema } from './schema.js';

packages/form/src/core/is-select.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
// Licensed under the Apache License, Version 2.0.
33
// Modifications made by Roman Krasilnikov.
44

5-
import { isSchema, type Schema, type SchemaValue } from "./schema.js";
5+
import { isSchemaObject } from '@/lib/json-schema/index.js';
6+
7+
import type { Schema, SchemaValue } from "./schema.js";
68
import type { Validator } from "./validator.js";
79
import { retrieveSchema } from "./resolve.js";
810
import {
@@ -71,7 +73,7 @@ export function getSelectOptionValues({
7173
return undefined;
7274
}
7375
return altSchema.map((schemaDef, i) => {
74-
if (!isSchema(schemaDef)) {
76+
if (!isSchemaObject(schemaDef)) {
7577
throw new Error(`Invalid enum definition in altSchema.${i}`);
7678
}
7779
return getSchemaConstantValue(schemaDef);

packages/form/src/core/known-properties.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import { isSchemaObject } from '@/lib/json-schema/index.js'
2+
13
import { resolveRef } from "./definitions.js";
2-
import { isSchema, type Schema } from "./schema.js";
4+
import type { Schema } from "./schema.js";
35

46
export function* getKnownProperties(
57
{ $ref: ref, properties, dependencies, oneOf, allOf, anyOf }: Schema,
@@ -12,7 +14,7 @@ export function* getKnownProperties(
1214
}
1315
stack.add(ref);
1416
const resolved = resolveRef(ref, rootSchema);
15-
if (isSchema(resolved)) {
17+
if (isSchemaObject(resolved)) {
1618
yield* getKnownProperties(resolved, rootSchema, stack);
1719
}
1820
return;
@@ -25,15 +27,15 @@ export function* getKnownProperties(
2527
for (const alternatives of [oneOf, allOf, anyOf]) {
2628
if (Array.isArray(alternatives)) {
2729
for (const alternative of alternatives) {
28-
if (isSchema(alternative)) {
30+
if (isSchemaObject(alternative)) {
2931
yield* getKnownProperties(alternative, rootSchema, stack);
3032
}
3133
}
3234
}
3335
}
3436
if (dependencies !== undefined) {
3537
for (const dependency of Object.values(dependencies)) {
36-
if (!Array.isArray(dependency) && isSchema(dependency)) {
38+
if (!Array.isArray(dependency) && isSchemaObject(dependency)) {
3739
yield* getKnownProperties(dependency, rootSchema, stack);
3840
}
3941
}

packages/form/src/core/matching.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// Modifications made by Roman Krasilnikov.
44

55
import { weakMemoize } from "@/lib/memoize.js";
6+
import { isSchemaObject } from '@/lib/json-schema/index.js'
67

78
import {
89
getDiscriminatorFieldFromSchema,
@@ -11,7 +12,6 @@ import {
1112
import type { Merger } from "./merger.js";
1213
import { resolveAllReferences, retrieveSchema } from "./resolve.js";
1314
import {
14-
isSchema,
1515
isSchemaWithProperties,
1616
REF_KEY,
1717
type Schema,
@@ -158,7 +158,7 @@ export function calculateIndexScore(
158158
merger,
159159
rootSchema,
160160
formValue,
161-
altSchemas.filter(isSchema),
161+
altSchemas.filter(isSchemaObject),
162162
-1,
163163
discriminator
164164
);

0 commit comments

Comments
 (0)