@builder-builder/builder 0.0.8 → 0.0.10
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/dist/entities/bind.d.ts +4 -0
- package/dist/entities/bind.js +44 -0
- package/dist/entities/builder/bind.d.ts +85 -0
- package/dist/entities/builder/bind.js +9 -0
- package/dist/entities/builder/builder.d.ts +111 -92
- package/dist/entities/builder/builder.js +11 -8
- package/dist/entities/builder/builders.d.ts +23 -8
- package/dist/entities/builder/builders.js +6 -5
- package/dist/entities/builder/index.d.ts +3 -3
- package/dist/entities/builder/index.js +1 -1
- package/dist/entities/builder/methods.d.ts +17 -17
- package/dist/entities/builder/state.d.ts +4 -4
- package/dist/entities/builder/validate.js +7 -7
- package/dist/entities/collection/collection.d.ts +6 -5
- package/dist/entities/collection/collection.js +6 -5
- package/dist/entities/collection/config.d.ts +280 -232
- package/dist/entities/collection/config.js +4 -4
- package/dist/entities/collection/index.d.ts +1 -1
- package/dist/entities/collection/index.js +1 -1
- package/dist/entities/collection/when.d.ts +5 -5
- package/dist/entities/component/component.d.ts +91 -90
- package/dist/entities/component/component.js +5 -4
- package/dist/entities/component/details.d.ts +16 -16
- package/dist/entities/component/details.js +2 -2
- package/dist/entities/component/index.d.ts +1 -1
- package/dist/entities/component/index.js +1 -1
- package/dist/entities/component/when.d.ts +5 -5
- package/dist/entities/index.d.ts +10 -8
- package/dist/entities/index.js +7 -6
- package/dist/entities/kind.d.ts +6 -0
- package/dist/entities/kind.js +6 -0
- package/dist/entities/option/index.d.ts +1 -1
- package/dist/entities/option/index.js +1 -1
- package/dist/entities/option/option.d.ts +39 -38
- package/dist/entities/option/option.js +5 -4
- package/dist/entities/option/values.d.ts +5 -7
- package/dist/entities/option/values.js +4 -4
- package/dist/entities/option/when.d.ts +5 -5
- package/dist/entities/serialise.d.ts +1582 -2226
- package/dist/entities/serialise.js +52 -22
- package/dist/entities/ui/bind.d.ts +10 -0
- package/dist/entities/ui/bind.js +9 -0
- package/dist/entities/ui/describe.d.ts +26 -51
- package/dist/entities/ui/describe.js +3 -4
- package/dist/entities/ui/index.d.ts +5 -7
- package/dist/entities/ui/index.js +2 -3
- package/dist/entities/ui/page.d.ts +26 -51
- package/dist/entities/ui/page.js +3 -4
- package/dist/entities/ui/pages.d.ts +17 -405
- package/dist/entities/ui/pages.js +6 -6
- package/dist/entities/ui/ui.d.ts +307 -688
- package/dist/entities/ui/ui.js +16 -17
- package/dist/entities/ui/uis.d.ts +11 -5
- package/dist/entities/ui/uis.js +9 -10
- package/dist/entities/ui/validate.d.ts +2 -2
- package/dist/entities/ui/validate.js +3 -3
- package/dist/entities/validate.d.ts +3 -3
- package/dist/entities/when.d.ts +45 -44
- package/dist/entities/when.js +10 -7
- package/dist/index.d.ts +19 -14
- package/dist/index.js +6 -2
- package/dist/mappers/assert/builder.js +13 -13
- package/dist/mappers/assert/ui.js +4 -4
- package/dist/mappers/index.d.ts +2 -0
- package/dist/mappers/index.js +1 -0
- package/dist/mappers/refs.d.ts +12 -0
- package/dist/mappers/refs.js +36 -0
- package/dist/mappers/render/render.js +3 -3
- package/dist/model.d.ts +29 -8
- package/dist/model.js +9 -1
- package/dist/references.d.ts +55 -29
- package/dist/references.js +25 -10
- package/dist/walker/walker.d.ts +13 -5
- package/dist/walker/walker.js +39 -27
- package/dist/walker/walkers.d.ts +4 -3
- package/dist/walker/walkers.js +18 -14
- package/package.json +10 -8
- package/dist/entities/builder/parameter.d.ts +0 -61
- package/dist/entities/builder/parameter.js +0 -18
- package/dist/entities/ui/label.d.ts +0 -18
- package/dist/entities/ui/label.js +0 -12
- package/dist/entities/ui/parameter.d.ts +0 -7
- package/dist/entities/ui/parameter.js +0 -29
package/dist/mappers/index.js
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BuilderEntityKind, BuilderUISerialised } from '../entities/index';
|
|
2
|
+
import * as v from 'valibot';
|
|
3
|
+
import { entitiesByKind } from '../entities/index.js';
|
|
4
|
+
export type BuilderRefEntity = {
|
|
5
|
+
readonly [Kind in BuilderEntityKind]: {
|
|
6
|
+
readonly kind: Kind;
|
|
7
|
+
readonly id: string;
|
|
8
|
+
readonly data: v.InferOutput<(typeof entitiesByKind)[Kind]['serialised']>;
|
|
9
|
+
};
|
|
10
|
+
}[BuilderEntityKind];
|
|
11
|
+
export type BuilderRefEntities = ReadonlyArray<BuilderRefEntity>;
|
|
12
|
+
export declare function refs(ui: BuilderUISerialised, entities: BuilderRefEntities): BuilderUISerialised;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { BuilderSchema, BuilderUISchema, deserialise, entitiesByKind, serialise } from '../entities/index.js';
|
|
3
|
+
import { walk } from '../walker/walker.js';
|
|
4
|
+
export function refs(ui, entities) {
|
|
5
|
+
const entityMap = new Map();
|
|
6
|
+
entities.forEach((entity) => {
|
|
7
|
+
const instance = deserialise[entity.kind](entity.data);
|
|
8
|
+
entityMap.set(entity.id, isBindable(instance) ? bind(instance, entitiesByKind[entity.kind].serialised) : instance);
|
|
9
|
+
});
|
|
10
|
+
const root = bind(deserialise.ui(ui), entitiesByKind.ui.serialised);
|
|
11
|
+
return serialise.ui(root);
|
|
12
|
+
function bind(instance, schema) {
|
|
13
|
+
const references = collectReferences(instance, schema);
|
|
14
|
+
if (references.length === 0) {
|
|
15
|
+
return instance;
|
|
16
|
+
}
|
|
17
|
+
const bindings = Object.fromEntries(references.map((reference) => [reference.parameter, entityMap.get(reference.id)]));
|
|
18
|
+
return instance.bind(bindings);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function isBindable(entity) {
|
|
22
|
+
return v.is(BuilderSchema, entity) || v.is(BuilderUISchema, entity);
|
|
23
|
+
}
|
|
24
|
+
function collectReferences(instance, schema) {
|
|
25
|
+
const references = [];
|
|
26
|
+
walk(schema, instance, {
|
|
27
|
+
walkEntity: ({ record }) => {
|
|
28
|
+
const maybeReferences = record.references;
|
|
29
|
+
if (Array.isArray(maybeReferences)) {
|
|
30
|
+
references.push(...maybeReferences);
|
|
31
|
+
}
|
|
32
|
+
return record;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return references;
|
|
36
|
+
}
|
|
@@ -15,9 +15,9 @@ export function render(ui, rootModel) {
|
|
|
15
15
|
function walk(builder, model, collectionPath, labelContext, items) {
|
|
16
16
|
function composeLabel(label) {
|
|
17
17
|
if (labelContext.length === 0) {
|
|
18
|
-
return label
|
|
18
|
+
return label;
|
|
19
19
|
}
|
|
20
|
-
return `${labelContext.join(', ')}, ${label
|
|
20
|
+
return `${labelContext.join(', ')}, ${label}`;
|
|
21
21
|
}
|
|
22
22
|
items.forEach((item) => {
|
|
23
23
|
if (item.type === 'pages') {
|
|
@@ -27,7 +27,7 @@ export function render(ui, rootModel) {
|
|
|
27
27
|
}
|
|
28
28
|
const models = model[collection.name];
|
|
29
29
|
models.forEach((collectionModel, itemIndex) => {
|
|
30
|
-
const labelSegment = `${ordinal(itemIndex)} ${item.label
|
|
30
|
+
const labelSegment = `${ordinal(itemIndex)} ${item.label}`;
|
|
31
31
|
walk(collection.payload.builder, collectionModel, [...collectionPath, item.name, itemIndex], [...labelContext, labelSegment], item.items);
|
|
32
32
|
});
|
|
33
33
|
return;
|
package/dist/model.d.ts
CHANGED
|
@@ -1,14 +1,35 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { type BuilderPrimitive } from './primitive.js';
|
|
2
3
|
export type BuilderModel = {
|
|
3
4
|
readonly [key: string]: BuilderPrimitive | BuilderModels;
|
|
4
5
|
};
|
|
5
|
-
export
|
|
6
|
+
export declare const BuilderModelSchema: v.GenericSchema<BuilderModel>;
|
|
7
|
+
export declare const BuilderModelsSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.GenericSchema<BuilderModel>, undefined>, v.ReadonlyAction<BuilderModel[]>]>;
|
|
8
|
+
export type BuilderModels = v.InferOutput<typeof BuilderModelsSchema>;
|
|
6
9
|
export type BuilderModelInput = Readonly<Record<string, unknown>>;
|
|
7
|
-
export
|
|
10
|
+
export declare const BuilderVariantSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
11
|
+
readonly model: v.GenericSchema<BuilderModel>;
|
|
12
|
+
readonly details: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
|
|
13
|
+
}, undefined>, v.ReadonlyAction<{
|
|
8
14
|
model: BuilderModel;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}>;
|
|
13
|
-
export type
|
|
15
|
+
details?: {
|
|
16
|
+
[x: string]: string;
|
|
17
|
+
} | undefined;
|
|
18
|
+
}>]>;
|
|
19
|
+
export type BuilderVariant = v.InferOutput<typeof BuilderVariantSchema>;
|
|
20
|
+
export declare const BuilderVariantsSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
21
|
+
readonly model: v.GenericSchema<BuilderModel>;
|
|
22
|
+
readonly details: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
|
|
23
|
+
}, undefined>, v.ReadonlyAction<{
|
|
24
|
+
model: BuilderModel;
|
|
25
|
+
details?: {
|
|
26
|
+
[x: string]: string;
|
|
27
|
+
} | undefined;
|
|
28
|
+
}>]>, undefined>, v.ReadonlyAction<Readonly<{
|
|
29
|
+
model: BuilderModel;
|
|
30
|
+
details?: {
|
|
31
|
+
[x: string]: string;
|
|
32
|
+
} | undefined;
|
|
33
|
+
}>[]>]>;
|
|
34
|
+
export type BuilderVariants = v.InferOutput<typeof BuilderVariantsSchema>;
|
|
14
35
|
export type BuilderData = Readonly<Record<string, BuilderVariants>>;
|
package/dist/model.js
CHANGED
|
@@ -1 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { BuilderPrimitiveSchema } from './primitive.js';
|
|
3
|
+
export const BuilderModelSchema = v.pipe(v.record(v.string(), v.union([BuilderPrimitiveSchema, v.lazy(() => BuilderModelsSchema)])), v.readonly());
|
|
4
|
+
export const BuilderModelsSchema = v.pipe(v.array(BuilderModelSchema), v.readonly());
|
|
5
|
+
export const BuilderVariantSchema = v.pipe(v.object({
|
|
6
|
+
model: BuilderModelSchema,
|
|
7
|
+
details: v.optional(v.record(v.string(), v.string()))
|
|
8
|
+
}), v.readonly());
|
|
9
|
+
export const BuilderVariantsSchema = v.pipe(v.array(BuilderVariantSchema), v.readonly());
|
package/dist/references.d.ts
CHANGED
|
@@ -1,60 +1,86 @@
|
|
|
1
1
|
import * as v from 'valibot';
|
|
2
|
-
export type
|
|
3
|
-
export type
|
|
4
|
-
export type
|
|
5
|
-
readonly
|
|
2
|
+
export type Paramable<Value> = Value | BuilderParameter;
|
|
3
|
+
export type ParamableSerialised<Value> = Value | BuilderParameterSerialised;
|
|
4
|
+
export type ParamableMetadata = {
|
|
5
|
+
readonly paramable?: v.GenericSchema;
|
|
6
6
|
};
|
|
7
|
-
export declare class
|
|
7
|
+
export declare class BuilderParameter<const Name extends string = string> {
|
|
8
8
|
readonly id: string;
|
|
9
|
-
readonly name:
|
|
10
|
-
constructor(name:
|
|
9
|
+
readonly name: Name;
|
|
10
|
+
constructor(name: Name, id?: string);
|
|
11
11
|
}
|
|
12
|
-
export declare const
|
|
13
|
-
export declare const
|
|
14
|
-
export type
|
|
15
|
-
export declare const
|
|
16
|
-
readonly type: v.LiteralSchema<"
|
|
12
|
+
export declare const BuilderParameterSchema: v.InstanceSchema<typeof BuilderParameter, undefined>;
|
|
13
|
+
export declare const BuilderParametersSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.InstanceSchema<typeof BuilderParameter, undefined>, undefined>, v.ReadonlyAction<BuilderParameter<string>[]>]>;
|
|
14
|
+
export type BuilderParameters = v.InferOutput<typeof BuilderParametersSchema>;
|
|
15
|
+
export declare const BuilderParameterSerialisedSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
16
|
+
readonly type: v.LiteralSchema<"parameter", undefined>;
|
|
17
17
|
readonly id: v.StringSchema<undefined>;
|
|
18
18
|
readonly name: v.StringSchema<undefined>;
|
|
19
19
|
}, undefined>, v.ReadonlyAction<{
|
|
20
|
-
type: "
|
|
20
|
+
type: "parameter";
|
|
21
21
|
id: string;
|
|
22
22
|
name: string;
|
|
23
23
|
}>]>;
|
|
24
|
-
export type
|
|
25
|
-
export declare const
|
|
26
|
-
readonly type: v.LiteralSchema<"
|
|
24
|
+
export type BuilderParameterSerialised = v.InferOutput<typeof BuilderParameterSerialisedSchema>;
|
|
25
|
+
export declare const BuilderParametersSerialisedSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
26
|
+
readonly type: v.LiteralSchema<"parameter", undefined>;
|
|
27
27
|
readonly id: v.StringSchema<undefined>;
|
|
28
28
|
readonly name: v.StringSchema<undefined>;
|
|
29
29
|
}, undefined>, v.ReadonlyAction<{
|
|
30
|
-
type: "
|
|
30
|
+
type: "parameter";
|
|
31
31
|
id: string;
|
|
32
32
|
name: string;
|
|
33
33
|
}>]>, undefined>, v.ReadonlyAction<Readonly<{
|
|
34
|
-
type: "
|
|
34
|
+
type: "parameter";
|
|
35
35
|
id: string;
|
|
36
36
|
name: string;
|
|
37
37
|
}>[]>]>;
|
|
38
|
-
export type
|
|
38
|
+
export type BuilderParametersSerialised = v.InferOutput<typeof BuilderParametersSerialisedSchema>;
|
|
39
|
+
export declare class BuilderRef {
|
|
40
|
+
readonly id: string;
|
|
41
|
+
constructor(id: string);
|
|
42
|
+
}
|
|
43
|
+
export declare const BuilderRefSchema: v.InstanceSchema<typeof BuilderRef, undefined>;
|
|
44
|
+
export declare const BuilderReferenceSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
45
|
+
readonly parameter: v.StringSchema<undefined>;
|
|
46
|
+
readonly id: v.StringSchema<undefined>;
|
|
47
|
+
}, undefined>, v.ReadonlyAction<{
|
|
48
|
+
parameter: string;
|
|
49
|
+
id: string;
|
|
50
|
+
}>]>;
|
|
51
|
+
export type BuilderReference = v.InferOutput<typeof BuilderReferenceSchema>;
|
|
52
|
+
export declare const BuilderReferencesSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
53
|
+
readonly parameter: v.StringSchema<undefined>;
|
|
54
|
+
readonly id: v.StringSchema<undefined>;
|
|
55
|
+
}, undefined>, v.ReadonlyAction<{
|
|
56
|
+
parameter: string;
|
|
57
|
+
id: string;
|
|
58
|
+
}>]>, undefined>, v.ReadonlyAction<Readonly<{
|
|
59
|
+
parameter: string;
|
|
60
|
+
id: string;
|
|
61
|
+
}>[]>]>;
|
|
62
|
+
export type BuilderReferences = v.InferOutput<typeof BuilderReferencesSchema>;
|
|
63
|
+
export declare function isParameter(value: unknown): value is BuilderParameter;
|
|
64
|
+
export declare function isSerialisedParameter(value: unknown): value is BuilderParameterSerialised;
|
|
39
65
|
export declare function isRef(value: unknown): value is BuilderRef;
|
|
40
|
-
export declare function
|
|
41
|
-
export declare function
|
|
42
|
-
export declare function
|
|
43
|
-
readonly type: v.LiteralSchema<"
|
|
66
|
+
export declare function parameter<const Name extends string>(name: Name): BuilderParameter<Name>;
|
|
67
|
+
export declare function ref(id: string): BuilderRef;
|
|
68
|
+
export declare function paramable<Schema extends v.GenericSchema>(paramable: Schema): v.SchemaWithPipe<readonly [v.UnionSchema<[v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
69
|
+
readonly type: v.LiteralSchema<"parameter", undefined>;
|
|
44
70
|
readonly id: v.StringSchema<undefined>;
|
|
45
71
|
readonly name: v.StringSchema<undefined>;
|
|
46
72
|
}, undefined>, v.ReadonlyAction<{
|
|
47
|
-
type: "
|
|
73
|
+
type: "parameter";
|
|
48
74
|
id: string;
|
|
49
75
|
name: string;
|
|
50
|
-
}>]>, v.InstanceSchema<typeof
|
|
51
|
-
readonly type: v.LiteralSchema<"
|
|
76
|
+
}>]>, v.InstanceSchema<typeof BuilderParameter, undefined>, Schema], undefined>, v.MetadataAction<v.InferOutput<v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
77
|
+
readonly type: v.LiteralSchema<"parameter", undefined>;
|
|
52
78
|
readonly id: v.StringSchema<undefined>;
|
|
53
79
|
readonly name: v.StringSchema<undefined>;
|
|
54
80
|
}, undefined>, v.ReadonlyAction<{
|
|
55
|
-
type: "
|
|
81
|
+
type: "parameter";
|
|
56
82
|
id: string;
|
|
57
83
|
name: string;
|
|
58
|
-
}>]> | v.InstanceSchema<typeof
|
|
59
|
-
readonly
|
|
84
|
+
}>]> | v.InstanceSchema<typeof BuilderParameter, undefined> | Schema>, {
|
|
85
|
+
readonly paramable: Schema;
|
|
60
86
|
}>]>;
|
package/dist/references.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as v from 'valibot';
|
|
2
2
|
import { check } from './check.js';
|
|
3
|
-
export class
|
|
3
|
+
export class BuilderParameter {
|
|
4
4
|
id;
|
|
5
5
|
name;
|
|
6
6
|
constructor(name, id = crypto.randomUUID()) {
|
|
@@ -8,19 +8,34 @@ export class BuilderRef {
|
|
|
8
8
|
this.id = id;
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
|
+
export const BuilderParameterSchema = v.instance(BuilderParameter);
|
|
12
|
+
export const BuilderParametersSchema = v.pipe(v.array(BuilderParameterSchema), v.readonly());
|
|
13
|
+
export const BuilderParameterSerialisedSchema = v.pipe(v.object({ type: v.literal('parameter'), id: v.string(), name: v.string() }), v.readonly());
|
|
14
|
+
export const BuilderParametersSerialisedSchema = v.pipe(v.array(BuilderParameterSerialisedSchema), v.readonly());
|
|
15
|
+
export class BuilderRef {
|
|
16
|
+
id;
|
|
17
|
+
constructor(id) {
|
|
18
|
+
this.id = id;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
11
21
|
export const BuilderRefSchema = v.instance(BuilderRef);
|
|
12
|
-
export const
|
|
13
|
-
export const
|
|
14
|
-
export
|
|
22
|
+
export const BuilderReferenceSchema = v.pipe(v.object({ parameter: v.string(), id: v.string() }), v.readonly());
|
|
23
|
+
export const BuilderReferencesSchema = v.pipe(v.array(BuilderReferenceSchema), v.readonly());
|
|
24
|
+
export function isParameter(value) {
|
|
25
|
+
return check.is(BuilderParameterSchema, value);
|
|
26
|
+
}
|
|
27
|
+
export function isSerialisedParameter(value) {
|
|
28
|
+
return check.is(BuilderParameterSerialisedSchema, value);
|
|
29
|
+
}
|
|
15
30
|
export function isRef(value) {
|
|
16
31
|
return check.is(BuilderRefSchema, value);
|
|
17
32
|
}
|
|
18
|
-
export function isSerialisedRef(value) {
|
|
19
|
-
return check.is(BuilderRefSerialisedSchema, value);
|
|
20
|
-
}
|
|
21
33
|
export function parameter(name) {
|
|
22
|
-
return new
|
|
34
|
+
return new BuilderParameter(name);
|
|
35
|
+
}
|
|
36
|
+
export function ref(id) {
|
|
37
|
+
return new BuilderRef(id);
|
|
23
38
|
}
|
|
24
|
-
export function
|
|
25
|
-
return v.pipe(v.union([
|
|
39
|
+
export function paramable(paramable) {
|
|
40
|
+
return v.pipe(v.union([BuilderParameterSerialisedSchema, BuilderParameterSchema, paramable]), v.metadata({ paramable }));
|
|
26
41
|
}
|
package/dist/walker/walker.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { BuilderParameter, BuilderParameterSerialised } from '../references';
|
|
2
2
|
import type { SerialisableClass } from '../serialisable';
|
|
3
3
|
import * as v from 'valibot';
|
|
4
4
|
export type Walker = (schema: v.GenericSchema, data: unknown) => unknown;
|
|
@@ -9,10 +9,18 @@ export type WalkerField = {
|
|
|
9
9
|
} | null;
|
|
10
10
|
};
|
|
11
11
|
export type WalkerFields = ReadonlyArray<WalkerField>;
|
|
12
|
+
export type WalkerObjectArgs = {
|
|
13
|
+
readonly fields: WalkerFields;
|
|
14
|
+
readonly walked: Record<string, unknown>;
|
|
15
|
+
readonly record: Record<string, unknown>;
|
|
16
|
+
};
|
|
17
|
+
export type WalkerEntityArgs = WalkerObjectArgs & {
|
|
18
|
+
readonly serialisable: SerialisableClass;
|
|
19
|
+
};
|
|
12
20
|
export type WalkerConfig = {
|
|
13
|
-
readonly
|
|
14
|
-
readonly
|
|
15
|
-
readonly walkObject?: (
|
|
16
|
-
readonly walkEntity?: (
|
|
21
|
+
readonly onParameter?: (parameter: BuilderParameter, paramableSchema: v.GenericSchema) => unknown;
|
|
22
|
+
readonly onSerialisedParameter?: (data: BuilderParameterSerialised, paramableSchema: v.GenericSchema) => unknown;
|
|
23
|
+
readonly walkObject?: (args: WalkerObjectArgs) => unknown;
|
|
24
|
+
readonly walkEntity?: (args: WalkerEntityArgs) => unknown;
|
|
17
25
|
};
|
|
18
26
|
export declare function walk(schema: v.GenericSchema, value: unknown, config: WalkerConfig): unknown;
|
package/dist/walker/walker.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as v from 'valibot';
|
|
2
|
-
import {
|
|
2
|
+
import { isParameter, isSerialisedParameter } from '../references.js';
|
|
3
3
|
import { isWalkable } from './walkable.js';
|
|
4
4
|
export function walk(schema, value, config) {
|
|
5
5
|
const meta = v.getMetadata(schema);
|
|
6
|
-
if (meta.
|
|
7
|
-
return
|
|
6
|
+
if (meta.paramable != null) {
|
|
7
|
+
return walkParamable(meta.paramable, value, config);
|
|
8
8
|
}
|
|
9
9
|
const inner = unwrapPipe(schema);
|
|
10
10
|
if (!isWalkable(inner)) {
|
|
@@ -32,37 +32,49 @@ export function walk(schema, value, config) {
|
|
|
32
32
|
function isLiteral(schema) {
|
|
33
33
|
return schema.type === 'literal';
|
|
34
34
|
}
|
|
35
|
-
function
|
|
35
|
+
function walkParamable(inner, value, config) {
|
|
36
36
|
if (value == null) {
|
|
37
37
|
return value;
|
|
38
38
|
}
|
|
39
|
-
const resolved =
|
|
40
|
-
? config.
|
|
41
|
-
:
|
|
42
|
-
? config.
|
|
39
|
+
const resolved = isParameter(value) && config.onParameter
|
|
40
|
+
? config.onParameter(value, inner)
|
|
41
|
+
: isSerialisedParameter(value) && config.onSerialisedParameter
|
|
42
|
+
? config.onSerialisedParameter(value, inner)
|
|
43
43
|
: value;
|
|
44
|
-
if (
|
|
44
|
+
if (isParameter(resolved) || isSerialisedParameter(resolved)) {
|
|
45
45
|
return resolved;
|
|
46
46
|
}
|
|
47
47
|
return walk(inner, resolved, config);
|
|
48
48
|
}
|
|
49
49
|
function walkArray(item, value, config) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
});
|
|
50
|
+
const walked = value.flatMap((element) => walkArrayElement(item, element, config));
|
|
51
|
+
return walked.length === value.length &&
|
|
52
|
+
walked.every((element, index) => element === value[index])
|
|
53
|
+
? value
|
|
54
|
+
: walked;
|
|
55
|
+
}
|
|
56
|
+
function walkArrayElement(item, element, config) {
|
|
57
|
+
const walked = walk(item, element, config);
|
|
58
|
+
if (!isAnyParameter(element) || !Array.isArray(walked)) {
|
|
59
|
+
return [walked];
|
|
60
|
+
}
|
|
61
|
+
return walked.flatMap((nested) => walkArrayElement(item, nested, config));
|
|
63
62
|
}
|
|
64
63
|
function walkRecord(valueSchema, record, config) {
|
|
65
|
-
|
|
64
|
+
let changed = false;
|
|
65
|
+
const walked = {};
|
|
66
|
+
Object.entries(record).forEach(([key, entry]) => {
|
|
67
|
+
if (entry === null) {
|
|
68
|
+
walked[key] = null;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const walkedEntry = walk(valueSchema, entry, config);
|
|
72
|
+
if (walkedEntry !== entry) {
|
|
73
|
+
changed = true;
|
|
74
|
+
}
|
|
75
|
+
walked[key] = walkedEntry;
|
|
76
|
+
});
|
|
77
|
+
return changed ? walked : record;
|
|
66
78
|
}
|
|
67
79
|
function walkObject(schema, record, serialisable, config) {
|
|
68
80
|
const fields = fieldsOf(schema);
|
|
@@ -74,9 +86,9 @@ function walkObject(schema, record, serialisable, config) {
|
|
|
74
86
|
walked[field.name] = walk(schema.entries[field.name], record[field.name], config);
|
|
75
87
|
});
|
|
76
88
|
if (serialisable != null && config.walkEntity) {
|
|
77
|
-
return config.walkEntity(serialisable, fields, walked, record);
|
|
89
|
+
return config.walkEntity({ serialisable, fields, walked, record });
|
|
78
90
|
}
|
|
79
|
-
return config.walkObject ? config.walkObject(fields, walked, record) : record;
|
|
91
|
+
return config.walkObject ? config.walkObject({ fields, walked, record }) : record;
|
|
80
92
|
}
|
|
81
93
|
function fieldsOf(schema) {
|
|
82
94
|
return Object.entries(schema.entries).map(([name, fieldSchema]) => {
|
|
@@ -91,8 +103,8 @@ function matches(schema, value) {
|
|
|
91
103
|
}
|
|
92
104
|
return v.is(schema, value);
|
|
93
105
|
}
|
|
94
|
-
function
|
|
95
|
-
return
|
|
106
|
+
function isAnyParameter(value) {
|
|
107
|
+
return isParameter(value) || isSerialisedParameter(value);
|
|
96
108
|
}
|
|
97
109
|
function unwrapPipe(schema) {
|
|
98
110
|
if ('pipe' in schema && Array.isArray(schema.pipe)) {
|
package/dist/walker/walkers.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Walker } from './walker';
|
|
2
|
-
import
|
|
2
|
+
import type * as v from 'valibot';
|
|
3
|
+
import { BuilderParameter } from '../references.js';
|
|
3
4
|
export declare function createWalkerSerialise(): Walker;
|
|
4
5
|
export declare function createWalkerDeserialise(): Walker;
|
|
5
|
-
export declare function createWalkerValidation(onUnbound: (
|
|
6
|
+
export declare function createWalkerValidation(onUnbound: (parameter: BuilderParameter) => void): Walker;
|
|
6
7
|
export declare function createWalkerBinding(config: {
|
|
7
|
-
readonly lookupBinding: (
|
|
8
|
+
readonly lookupBinding: (parameter: BuilderParameter, paramableSchema: v.GenericSchema) => unknown;
|
|
8
9
|
}): Walker;
|
package/dist/walker/walkers.js
CHANGED
|
@@ -1,34 +1,38 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BuilderParameter } from '../references.js';
|
|
2
2
|
import { walk } from './walker.js';
|
|
3
3
|
export function createWalkerSerialise() {
|
|
4
4
|
return (schema, data) => walk(schema, data, {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
onParameter: (parameter) => ({
|
|
6
|
+
type: 'parameter',
|
|
7
|
+
id: parameter.id,
|
|
8
|
+
name: parameter.name
|
|
9
|
+
}),
|
|
10
|
+
walkObject: ({ fields, walked }) => rebuild(fields, walked)
|
|
7
11
|
});
|
|
8
12
|
}
|
|
9
13
|
export function createWalkerDeserialise() {
|
|
10
14
|
return (schema, data) => walk(schema, data, {
|
|
11
|
-
|
|
12
|
-
walkObject: (fields, walked) => rebuild(fields, walked),
|
|
13
|
-
walkEntity: (serialisable, fields, walked) => construct(serialisable, fields, rebuild(fields, walked))
|
|
15
|
+
onSerialisedParameter: (serialised) => new BuilderParameter(serialised.name, serialised.id),
|
|
16
|
+
walkObject: ({ fields, walked }) => rebuild(fields, walked),
|
|
17
|
+
walkEntity: ({ serialisable, fields, walked }) => construct(serialisable, fields, rebuild(fields, walked))
|
|
14
18
|
});
|
|
15
19
|
}
|
|
16
20
|
export function createWalkerValidation(onUnbound) {
|
|
17
21
|
return (schema, data) => walk(schema, data, {
|
|
18
|
-
|
|
19
|
-
onUnbound(
|
|
20
|
-
return
|
|
22
|
+
onParameter: (parameter) => {
|
|
23
|
+
onUnbound(parameter);
|
|
24
|
+
return parameter;
|
|
21
25
|
}
|
|
22
26
|
});
|
|
23
27
|
}
|
|
24
28
|
export function createWalkerBinding(config) {
|
|
25
29
|
return (schema, data) => walk(schema, data, {
|
|
26
|
-
|
|
27
|
-
const value = config.lookupBinding(
|
|
28
|
-
return value != null ? value :
|
|
30
|
+
onParameter: (parameter, paramableSchema) => {
|
|
31
|
+
const value = config.lookupBinding(parameter, paramableSchema);
|
|
32
|
+
return value != null ? value : parameter;
|
|
29
33
|
},
|
|
30
|
-
walkObject: (
|
|
31
|
-
walkEntity: (serialisable, fields, walked, record) => {
|
|
34
|
+
walkObject: ({ walked, record }) => applyPatches(record, walked),
|
|
35
|
+
walkEntity: ({ serialisable, fields, walked, record }) => {
|
|
32
36
|
const merged = applyPatches(record, walked);
|
|
33
37
|
return merged === record ? record : construct(serialisable, fields, merged);
|
|
34
38
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@builder-builder/builder",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.10",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -23,13 +23,14 @@
|
|
|
23
23
|
"build": "vite build",
|
|
24
24
|
"package": "svelte-kit sync && svelte-package --input src/lib/builder",
|
|
25
25
|
"preview": "vite preview",
|
|
26
|
-
"prepare": "svelte-kit sync || echo ''",
|
|
26
|
+
"prepare": "svelte-kit sync && npm run messages || echo ''",
|
|
27
27
|
"prepublishOnly": "npm run test && npm run package",
|
|
28
|
-
"
|
|
29
|
-
"check
|
|
28
|
+
"messages": "paraglide-js compile --project ./project.inlang --outdir ./src/lib/i18n",
|
|
29
|
+
"check": "npm run messages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
|
30
|
+
"check:watch": "npm run messages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
|
30
31
|
"format": "prettier --write .",
|
|
31
32
|
"lint": "prettier --check . && eslint .",
|
|
32
|
-
"test:unit": "vitest",
|
|
33
|
+
"test:unit": "npm run messages && vitest",
|
|
33
34
|
"test": "npm run test:unit -- --run",
|
|
34
35
|
"verify": "npm run test && npm run check && npm run format && npm run lint",
|
|
35
36
|
"types:db": "dotenv -e .env.development.local -- supabase gen types typescript --project-id \"$SUPABASE_PROJECT_ID\" --schema public > ./src/lib/db/database.types.ts"
|
|
@@ -37,6 +38,7 @@
|
|
|
37
38
|
"devDependencies": {
|
|
38
39
|
"@eslint/compat": "^1.2.5",
|
|
39
40
|
"@eslint/js": "^9.18.0",
|
|
41
|
+
"@inlang/paraglide-js": "^2.16.0",
|
|
40
42
|
"@sveltejs/adapter-auto": "^6.0.0",
|
|
41
43
|
"@sveltejs/adapter-vercel": "^5.7.2",
|
|
42
44
|
"@sveltejs/kit": "^2.16.0",
|
|
@@ -54,7 +56,7 @@
|
|
|
54
56
|
"jsdom": "^26.0.0",
|
|
55
57
|
"prettier": "^3.4.2",
|
|
56
58
|
"prettier-plugin-svelte": "^3.3.3",
|
|
57
|
-
"supabase": "^2.
|
|
59
|
+
"supabase": "^2.93.0",
|
|
58
60
|
"svelte": "^5.0.0",
|
|
59
61
|
"svelte-check": "^4.0.0",
|
|
60
62
|
"typescript": "^5.0.0",
|
|
@@ -65,7 +67,7 @@
|
|
|
65
67
|
"dependencies": {
|
|
66
68
|
"@floating-ui/dom": "^1.7.2",
|
|
67
69
|
"@lucide/svelte": "^0.525.0",
|
|
68
|
-
"@supabase/supabase-js": "^2.
|
|
70
|
+
"@supabase/supabase-js": "^2.104.0",
|
|
69
71
|
"@upstash/ratelimit": "^2.0.5",
|
|
70
72
|
"@upstash/redis": "^1.35.0",
|
|
71
73
|
"@vercel/kv": "^3.0.0",
|
|
@@ -74,4 +76,4 @@
|
|
|
74
76
|
"svelte-clerk": "^1.1.1",
|
|
75
77
|
"valibot": "^1.1.0"
|
|
76
78
|
}
|
|
77
|
-
}
|
|
79
|
+
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import type { BuilderPaths } from '../../paths';
|
|
2
|
-
import type { BuilderRef, Refable } from '../../references';
|
|
3
|
-
import type { BuilderCollectionPayload } from '../collection/index';
|
|
4
|
-
import type { BuilderComponentPayload } from '../component/index';
|
|
5
|
-
import type { BuilderOptionPayload } from '../option/index';
|
|
6
|
-
import type { BuilderWhenConfig, BuilderWhenConstrained, WhenConfigNullable } from '../when';
|
|
7
|
-
import type { BuilderState, BuilderStateAppend } from './state';
|
|
8
|
-
import { Builder } from './builder.js';
|
|
9
|
-
export type BuilderBindings<State extends BuilderState> = EntryStateBindings<State, State['options'], BuilderOptionPayload> & EntryStateBindings<State, State['collections'], BuilderCollectionPayload> & EntryStateBindings<State, State['components'], BuilderComponentPayload>;
|
|
10
|
-
export declare function bindBuilder<State extends BuilderState, Bindings extends BuilderBindings<State>>(builder: Builder<State>, bindings: Bindings): Builder<BuilderBoundState<State, Bindings>>;
|
|
11
|
-
export type BuilderBoundState<State extends BuilderState, Bindings extends BuilderBindings<State>> = BuilderStateAppend<State, {
|
|
12
|
-
options: EntryBound<State['options'], Extract<keyof Bindings, string>>;
|
|
13
|
-
collections: EntryBound<State['collections'], Extract<keyof Bindings, string>>;
|
|
14
|
-
components: EntryBound<State['components'], Extract<keyof Bindings, string>>;
|
|
15
|
-
model: Omit<State['model'], keyof Bindings> & {
|
|
16
|
-
[K in Extract<keyof Bindings, string>]: BindingModelType<Bindings[K]>;
|
|
17
|
-
};
|
|
18
|
-
}>;
|
|
19
|
-
export type BindingModelType<Binding> = BindingValueType<Binding> | BindingConfigNullable<Binding>;
|
|
20
|
-
type BindingValueType<Binding> = Binding extends {
|
|
21
|
-
readonly type: 'match';
|
|
22
|
-
readonly selectMap: infer SelectMap extends Record<string, unknown>;
|
|
23
|
-
} ? NonNullable<SelectMap[keyof SelectMap]> extends {
|
|
24
|
-
readonly value: infer Value;
|
|
25
|
-
} ? Value : string : Binding extends {
|
|
26
|
-
readonly payload: {
|
|
27
|
-
readonly value: infer Value;
|
|
28
|
-
};
|
|
29
|
-
} ? Value : Binding extends {
|
|
30
|
-
readonly value: infer Value;
|
|
31
|
-
} ? Value : string;
|
|
32
|
-
type BindingConfigNullable<Binding> = Binding extends BuilderWhenConfig ? WhenConfigNullable<Binding> : never;
|
|
33
|
-
type EntryLike = {
|
|
34
|
-
readonly name: string;
|
|
35
|
-
readonly payload: unknown;
|
|
36
|
-
readonly gatePaths?: Refable<BuilderPaths>;
|
|
37
|
-
};
|
|
38
|
-
type EntryStateBindings<State extends BuilderState, Entries extends ReadonlyArray<EntryLike>, PayloadType> = {
|
|
39
|
-
readonly [Parameter in EntryParameters<Entries> as Parameter['name']]: BuilderWhenConstrained<State, PayloadType>;
|
|
40
|
-
};
|
|
41
|
-
type EntryBound<Entries extends ReadonlyArray<EntryLike>, BoundNames extends string> = Entries extends readonly [
|
|
42
|
-
infer Head extends EntryLike,
|
|
43
|
-
...infer Tail extends ReadonlyArray<EntryLike>
|
|
44
|
-
] ? Head extends {
|
|
45
|
-
readonly payload: infer Payload;
|
|
46
|
-
} ? Payload extends BuilderRef ? Head['name'] extends BoundNames ? [...EntryBound<Tail, BoundNames>] : [Head, ...EntryBound<Tail, BoundNames>] : [Head, ...EntryBound<Tail, BoundNames>] : [Head, ...EntryBound<Tail, BoundNames>] : [];
|
|
47
|
-
type EntryParameters<Entries extends ReadonlyArray<EntryLike>> = Entries[number] extends infer Entry ? Entry extends {
|
|
48
|
-
readonly payload: infer Payload;
|
|
49
|
-
} ? PayloadParameters<Payload> : never : never;
|
|
50
|
-
type PayloadParameters<Payload> = ParameterOf<Payload> | (Payload extends {
|
|
51
|
-
readonly type: 'match';
|
|
52
|
-
readonly selectMap: infer SelectMap;
|
|
53
|
-
} ? ParameterOf<SelectMap[keyof SelectMap]> : never) | (Payload extends {
|
|
54
|
-
readonly type: 'enable' | 'unless';
|
|
55
|
-
readonly payload: infer Inner;
|
|
56
|
-
} ? ParameterOf<Inner> : never);
|
|
57
|
-
type ParameterOf<Value> = Extract<Value, BuilderRef> extends infer Ref extends BuilderRef ? {
|
|
58
|
-
readonly name: Ref['name'];
|
|
59
|
-
readonly payload: Ref;
|
|
60
|
-
} : never;
|
|
61
|
-
export {};
|