@builder-builder/builder 0.0.25 → 0.0.27
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/client/schema.d.ts +29 -4
- package/dist/client/schema.js +3 -1
- package/dist/components/Builder.svelte.d.ts +24 -0
- package/dist/components/BuilderCollectionButtons.svelte.d.ts +22 -0
- package/dist/components/BuilderCollections.svelte.d.ts +23 -0
- package/dist/components/BuilderDescription.svelte.d.ts +18 -0
- package/dist/components/BuilderLayout.svelte.d.ts +24 -0
- package/dist/components/BuilderOption.svelte.d.ts +31 -0
- package/dist/components/BuilderOptionSelect.svelte.d.ts +21 -0
- package/dist/components/BuilderOptionToggleBoolean.svelte.d.ts +20 -0
- package/dist/components/BuilderOptionToggleNumber.svelte.d.ts +21 -0
- package/dist/components/BuilderOptionToggleString.svelte.d.ts +21 -0
- package/dist/components/BuilderPrice.svelte.d.ts +21 -0
- package/dist/components/BuilderRender.svelte.d.ts +39 -0
- package/dist/components/config.d.ts +2 -0
- package/dist/components/config.js +1 -0
- package/dist/components/dispatch.d.ts +1 -0
- package/dist/components/dispatch.js +3 -0
- package/dist/components/id.d.ts +1 -0
- package/dist/components/id.js +3 -0
- package/dist/components/index.d.ts +25 -0
- package/dist/components/index.js +7441 -0
- package/dist/entities/builder/builder.js +2 -1
- package/dist/entities/collection/collection.js +2 -1
- package/dist/entities/collection/config.d.ts +20 -20
- package/dist/entities/collection/config.js +3 -2
- package/dist/entities/component/component.d.ts +30 -30
- package/dist/entities/component/component.js +2 -1
- package/dist/entities/component/config.d.ts +12 -12
- package/dist/entities/component/field.d.ts +4 -4
- package/dist/entities/component/field.js +4 -3
- package/dist/entities/expectation.d.ts +2 -2
- package/dist/entities/expectation.js +2 -1
- package/dist/entities/index.d.ts +1 -1
- package/dist/entities/kind.d.ts +1 -1
- package/dist/entities/kind.js +43 -3
- package/dist/entities/model/models.d.ts +3 -3
- package/dist/entities/option/config.d.ts +4 -4
- package/dist/entities/option/option.d.ts +22 -22
- package/dist/entities/option/option.js +2 -1
- package/dist/entities/option/select.d.ts +1 -1
- package/dist/entities/option/select.js +5 -4
- package/dist/entities/option/toggle.d.ts +1 -1
- package/dist/entities/option/toggle.js +4 -3
- package/dist/entities/paths.d.ts +2 -2
- package/dist/entities/paths.js +2 -1
- package/dist/entities/pricing/expression.js +5 -4
- package/dist/entities/pricing/rates.js +2 -1
- package/dist/entities/references.d.ts +50 -2
- package/dist/entities/references.js +2 -1
- package/dist/entities/serialise.d.ts +318 -113
- package/dist/entities/serialise.js +4 -3
- package/dist/entities/tags.d.ts +1 -1
- package/dist/entities/tags.js +2 -1
- package/dist/entities/ui/describe.d.ts +126 -34
- package/dist/entities/ui/describe.js +3 -2
- package/dist/entities/ui/input.d.ts +158 -49
- package/dist/entities/ui/input.js +13 -6
- package/dist/entities/ui/page.d.ts +124 -32
- package/dist/entities/ui/page.js +2 -1
- package/dist/entities/ui/pages.d.ts +11 -3
- package/dist/entities/ui/pages.js +3 -2
- package/dist/entities/validated.d.ts +1 -0
- package/dist/entities/when.d.ts +16 -16
- package/dist/entities/when.js +2 -2
- package/dist/errors/errors.d.ts +10 -0
- package/dist/errors/errors.js +6 -0
- package/dist/instance.d.ts +7 -7
- package/dist/instance.js +4 -4
- package/dist/mappers/index.d.ts +1 -1
- package/dist/mappers/order.js +4 -2
- package/dist/mappers/price.js +1 -2
- package/dist/mappers/render/collection.d.ts +9 -0
- package/dist/mappers/render/collection.js +27 -0
- package/dist/mappers/render/compose.d.ts +5 -0
- package/dist/mappers/render/compose.js +15 -0
- package/dist/mappers/render/description.d.ts +3 -0
- package/dist/mappers/render/description.js +17 -0
- package/dist/mappers/render/index.d.ts +3 -1
- package/dist/mappers/render/option.d.ts +21 -0
- package/dist/mappers/render/option.js +26 -0
- package/dist/mappers/render/page.d.ts +11 -0
- package/dist/mappers/render/page.js +11 -0
- package/dist/mappers/render/paths.d.ts +3 -0
- package/dist/mappers/render/paths.js +21 -0
- package/dist/mappers/render/render.d.ts +1 -1
- package/dist/mappers/render/render.js +33 -98
- package/dist/mappers/resolve.d.ts +2 -1
- package/dist/mappers/resolve.js +24 -23
- package/dist/primitive.d.ts +5 -0
- package/dist/primitive.js +6 -1
- package/dist/public.d.ts +1 -1
- package/dist/references.d.ts +6 -6
- package/dist/references.js +3 -2
- package/dist/validate/model.js +16 -5
- package/dist/validate/paths.js +3 -5
- package/dist/validate/pricing.js +5 -6
- package/dist/validate/resolve.d.ts +2 -1
- package/dist/validate/resolve.js +87 -73
- package/dist/validate/ui.js +14 -13
- package/package.json +7 -5
- package/dist/mappers/render/pages.d.ts +0 -24
- package/dist/mappers/render/pages.js +0 -2
package/dist/validate/model.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { BuilderCollectionConfigSerialisedSchema, BuilderComponentConfigSerialisedSchema, BuilderModelSerialisedSchema, BuilderOptionConfigSerialisedSchema, BuilderPathsSchema, BuilderWhenSerialisedSchema, whenBranches, model, modelsMerge, serialise, validateCollectionConfig, validateComponentConfig, validateSelect, validateToggle } from '../entities/index.js';
|
|
2
3
|
import { BuilderErrorsScope, check } from '../errors/index.js';
|
|
3
4
|
import { isParamable } from '../references.js';
|
|
4
5
|
import { validate } from './brand.js';
|
|
@@ -41,8 +42,8 @@ export function validateModelStructure(input, resolve, errors) {
|
|
|
41
42
|
};
|
|
42
43
|
return walkStructure(input);
|
|
43
44
|
function walkStructure(input) {
|
|
44
|
-
const resolved = resolve(input);
|
|
45
|
-
if (
|
|
45
|
+
const resolved = resolve(input, BuilderModelSerialisedSchema);
|
|
46
|
+
if (resolved == null) {
|
|
46
47
|
return validate(serialise.model(model()));
|
|
47
48
|
}
|
|
48
49
|
const modelInput = resolved;
|
|
@@ -81,6 +82,15 @@ export function validateModelStructure(input, resolve, errors) {
|
|
|
81
82
|
components,
|
|
82
83
|
collections
|
|
83
84
|
};
|
|
85
|
+
function payloadSchemaFor(kind) {
|
|
86
|
+
if (kind === 'option') {
|
|
87
|
+
return BuilderOptionConfigSerialisedSchema;
|
|
88
|
+
}
|
|
89
|
+
if (kind === 'component') {
|
|
90
|
+
return BuilderComponentConfigSerialisedSchema;
|
|
91
|
+
}
|
|
92
|
+
return BuilderCollectionConfigSerialisedSchema;
|
|
93
|
+
}
|
|
84
94
|
function walkEntries(entries, kind, validateBranches) {
|
|
85
95
|
const seenLocal = new Set();
|
|
86
96
|
const items = [];
|
|
@@ -99,10 +109,11 @@ export function validateModelStructure(input, resolve, errors) {
|
|
|
99
109
|
function resolveEntry(entry, seenLocal, kind) {
|
|
100
110
|
let paths = entry.paths;
|
|
101
111
|
if (entry.paths != null) {
|
|
102
|
-
const resolvedPaths = errors.scope('paths', () => resolve(entry.paths));
|
|
112
|
+
const resolvedPaths = errors.scope('paths', () => resolve(entry.paths, BuilderPathsSchema));
|
|
103
113
|
paths = resolvedPaths ?? entry.paths;
|
|
104
114
|
}
|
|
105
|
-
const
|
|
115
|
+
const payloadSchema = v.union([payloadSchemaFor(kind), BuilderWhenSerialisedSchema]);
|
|
116
|
+
const payload = errors.scope('payload', () => resolve(entry.payload, payloadSchema));
|
|
106
117
|
const resolvedEntry = { ...entry, paths, payload: payload ?? entry.payload };
|
|
107
118
|
if (seenLocal.has(resolvedEntry.name)) {
|
|
108
119
|
if (kind === 'option') {
|
package/dist/validate/paths.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import * as v from 'valibot';
|
|
2
1
|
import { BuilderModelSerialisedSchema } from '../entities/index.js';
|
|
3
2
|
import { check } from '../errors/index.js';
|
|
4
3
|
import { resolveCollections } from '../mappers/index.js';
|
|
5
|
-
|
|
6
|
-
const StringSchema = v.string();
|
|
4
|
+
import { NameSchema, NumberSchema } from '../primitive.js';
|
|
7
5
|
export function checkPath(model, path, errors) {
|
|
8
6
|
if (path.length === 0) {
|
|
9
7
|
errors.pathEmpty();
|
|
@@ -15,7 +13,7 @@ export function checkPath(model, path, errors) {
|
|
|
15
13
|
return;
|
|
16
14
|
}
|
|
17
15
|
const optionName = path.at(-1);
|
|
18
|
-
if (!check.is(
|
|
16
|
+
if (!check.is(NameSchema, optionName)) {
|
|
19
17
|
errors.scope(lastIndex, () => errors.pathInvalidSegment());
|
|
20
18
|
return;
|
|
21
19
|
}
|
|
@@ -39,7 +37,7 @@ function walkPath(models, remaining, offset, errors) {
|
|
|
39
37
|
return models;
|
|
40
38
|
}
|
|
41
39
|
const [collectionName, index, ...rest] = remaining;
|
|
42
|
-
if (!check.is(
|
|
40
|
+
if (!check.is(NameSchema, collectionName)) {
|
|
43
41
|
errors.scope(offset, () => errors.pathInvalidSegment());
|
|
44
42
|
return null;
|
|
45
43
|
}
|
package/dist/validate/pricing.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import * as v from 'valibot';
|
|
2
1
|
import { BuilderPricingExpressionSchema, BuilderPricingSerialisedSchema, BuilderRatesSchema, pricing, serialise } from '../entities/index.js';
|
|
3
2
|
import { BuilderErrorsScope, check } from '../errors/index.js';
|
|
3
|
+
import { NumberSchema } from '../primitive.js';
|
|
4
4
|
import { validate } from './brand.js';
|
|
5
5
|
import { resolver } from './resolve.js';
|
|
6
6
|
const EMPTY_PRICING = validate(serialise.pricing(pricing()));
|
|
7
|
-
const NumberSchema = v.number();
|
|
8
7
|
export function validatePricing(input, references = [], errors = new BuilderErrorsScope(input)) {
|
|
9
8
|
if (!check.is(BuilderPricingSerialisedSchema, input)) {
|
|
10
9
|
errors.entityInvalid('pricing');
|
|
@@ -16,8 +15,8 @@ export function validatePricing(input, references = [], errors = new BuilderErro
|
|
|
16
15
|
}
|
|
17
16
|
export function validatePricingStructure(input, resolve, errors) {
|
|
18
17
|
const rates = errors.scope('rates', () => input.rates.flatMap((entry, index) => {
|
|
19
|
-
const resolved = resolve(entry);
|
|
20
|
-
if (
|
|
18
|
+
const resolved = resolve(entry, BuilderRatesSchema);
|
|
19
|
+
if (resolved != null) {
|
|
21
20
|
return [resolved];
|
|
22
21
|
}
|
|
23
22
|
errors.scope(index, () => errors.pricingInvalidRateValue());
|
|
@@ -29,8 +28,8 @@ export function validatePricingStructure(input, resolve, errors) {
|
|
|
29
28
|
}
|
|
30
29
|
return { rates, formula };
|
|
31
30
|
function resolveExpression(input) {
|
|
32
|
-
const resolved = resolve(input);
|
|
33
|
-
if (
|
|
31
|
+
const resolved = resolve(input, BuilderPricingExpressionSchema);
|
|
32
|
+
if (resolved == null) {
|
|
34
33
|
errors.pricingMalformedExpression();
|
|
35
34
|
return null;
|
|
36
35
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { BuilderBindings, BuilderReferences } from '../entities/index';
|
|
2
2
|
import type { BuilderErrorsScope } from '../errors/index';
|
|
3
|
-
|
|
3
|
+
import * as v from 'valibot';
|
|
4
|
+
export type BuilderResolve = <S extends v.GenericSchema = v.GenericSchema<unknown>>(value: unknown, schema?: S) => v.InferOutput<S> | null;
|
|
4
5
|
export declare function resolver(errors: BuilderErrorsScope, references?: BuilderReferences, bindings?: BuilderBindings): BuilderResolve;
|
package/dist/validate/resolve.js
CHANGED
|
@@ -1,97 +1,111 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { BuilderCollectionConfigSerialisedSchema, BuilderModelSerialisedSchema, BuilderPathSchema, BuilderWhenSerialisedSchema } from '../entities/index.js';
|
|
2
3
|
import { check } from '../errors/index.js';
|
|
4
|
+
import { NumberSchema, StringSchema } from '../primitive.js';
|
|
3
5
|
import { BuilderParameterSerialisedSchema, BuilderRefSerialisedSchema } from '../references.js';
|
|
4
6
|
import { validateModelStructure } from './model.js';
|
|
5
7
|
export function resolver(errors, references = [], bindings = {}) {
|
|
6
8
|
const resolving = new Set();
|
|
7
|
-
function resolve(value) {
|
|
9
|
+
function resolve(value, schema = v.unknown()) {
|
|
10
|
+
const errorsBefore = errors.errors.length;
|
|
11
|
+
const resolved = dispatch(value, schema);
|
|
12
|
+
if (check.is(schema, resolved)) {
|
|
13
|
+
return resolved;
|
|
14
|
+
}
|
|
15
|
+
if (errors.errors.length === errorsBefore) {
|
|
16
|
+
errors.referenceInvalid();
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
function dispatch(value, schema) {
|
|
8
21
|
if (check.is(BuilderParameterSerialisedSchema, value)) {
|
|
9
|
-
return resolveParameter(value);
|
|
22
|
+
return resolveParameter(value, schema);
|
|
10
23
|
}
|
|
11
24
|
if (check.is(BuilderRefSerialisedSchema, value)) {
|
|
12
|
-
return resolveReference(value);
|
|
25
|
+
return resolveReference(value, schema);
|
|
13
26
|
}
|
|
14
27
|
if (check.is(BuilderWhenSerialisedSchema, value)) {
|
|
15
|
-
return resolveWhen(value);
|
|
28
|
+
return resolveWhen(value, schema);
|
|
16
29
|
}
|
|
17
30
|
if (check.is(BuilderCollectionConfigSerialisedSchema, value)) {
|
|
18
31
|
return resolveCollectionConfig(value);
|
|
19
32
|
}
|
|
20
33
|
return value;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const found = references.find((entry) => entry.id === reference.id);
|
|
27
|
-
if (found == null) {
|
|
28
|
-
errors.referenceMissing();
|
|
29
|
-
return reference;
|
|
30
|
-
}
|
|
31
|
-
resolving.add(reference.id);
|
|
32
|
-
try {
|
|
33
|
-
return resolve(found.serialised);
|
|
34
|
-
}
|
|
35
|
-
finally {
|
|
36
|
-
resolving.delete(reference.id);
|
|
37
|
-
}
|
|
34
|
+
}
|
|
35
|
+
function resolveReference(reference, schema) {
|
|
36
|
+
if (resolving.has(reference.id)) {
|
|
37
|
+
errors.referenceCircular();
|
|
38
|
+
return reference;
|
|
38
39
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
const binding = bindings[parameter.name];
|
|
45
|
-
if (!check.is(BuilderRefSerialisedSchema, binding)) {
|
|
46
|
-
return binding;
|
|
47
|
-
}
|
|
48
|
-
return resolveReference(binding);
|
|
40
|
+
const found = references.find((entry) => entry.id === reference.id);
|
|
41
|
+
if (found == null) {
|
|
42
|
+
errors.referenceMissing();
|
|
43
|
+
return reference;
|
|
49
44
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const resolved = errors.scope(key, () => resolve(entryValue));
|
|
74
|
-
return { ...values, [key]: resolved ?? entryValue };
|
|
75
|
-
}, {}));
|
|
76
|
-
return { ...when, matchPath: matchPath ?? when.matchPath, selectMap };
|
|
45
|
+
resolving.add(reference.id);
|
|
46
|
+
try {
|
|
47
|
+
return dispatch(found.serialised, schema);
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
resolving.delete(reference.id);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function resolveParameter(parameter, schema) {
|
|
54
|
+
if (!(parameter.name in bindings)) {
|
|
55
|
+
errors.referenceUnboundParameter();
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const binding = bindings[parameter.name];
|
|
59
|
+
if (!check.is(BuilderRefSerialisedSchema, binding)) {
|
|
60
|
+
return binding;
|
|
61
|
+
}
|
|
62
|
+
return resolveReference(binding, schema);
|
|
63
|
+
}
|
|
64
|
+
function resolveWhen(when, payloadSchema) {
|
|
65
|
+
if (when.type === 'enable') {
|
|
66
|
+
const payload = errors.scope('payload', () => resolve(when.payload, payloadSchema));
|
|
67
|
+
return { ...when, payload: payload ?? when.payload };
|
|
77
68
|
}
|
|
78
|
-
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
if (check.is(BuilderModelSerialisedSchema, resolved)) {
|
|
82
|
-
return validateModelStructure(resolved, resolve, errors);
|
|
83
|
-
}
|
|
84
|
-
return resolved;
|
|
85
|
-
});
|
|
86
|
-
const min = errors.scope('min', () => resolve(config.min));
|
|
87
|
-
const max = errors.scope('max', () => resolve(config.max));
|
|
69
|
+
if (when.type === 'unless') {
|
|
70
|
+
const unlessPath = errors.scope('unlessPath', () => resolve(when.unlessPath, BuilderPathSchema));
|
|
71
|
+
const payload = errors.scope('payload', () => resolve(when.payload, payloadSchema));
|
|
88
72
|
return {
|
|
89
|
-
...
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
max: max ?? config.max
|
|
73
|
+
...when,
|
|
74
|
+
unlessPath: unlessPath ?? when.unlessPath,
|
|
75
|
+
payload: payload ?? when.payload
|
|
93
76
|
};
|
|
94
77
|
}
|
|
78
|
+
const matchPath = errors.scope('matchPath', () => resolve(when.matchPath, BuilderPathSchema));
|
|
79
|
+
const selectMapSchema = v.record(StringSchema, v.nullable(v.unknown()));
|
|
80
|
+
const map = errors.scope('selectMap', () => resolve(when.selectMap, selectMapSchema));
|
|
81
|
+
if (map == null) {
|
|
82
|
+
return { ...when, matchPath: matchPath ?? when.matchPath };
|
|
83
|
+
}
|
|
84
|
+
const selectMap = errors.scope('selectMap', () => Object.entries(map).reduce((values, [key, entryValue]) => {
|
|
85
|
+
if (entryValue == null) {
|
|
86
|
+
return { ...values, [key]: null };
|
|
87
|
+
}
|
|
88
|
+
const resolved = errors.scope(key, () => resolve(entryValue, payloadSchema));
|
|
89
|
+
return { ...values, [key]: resolved ?? entryValue };
|
|
90
|
+
}, {}));
|
|
91
|
+
return { ...when, matchPath: matchPath ?? when.matchPath, selectMap };
|
|
92
|
+
}
|
|
93
|
+
function resolveCollectionConfig(config) {
|
|
94
|
+
const model = errors.scope('model', () => {
|
|
95
|
+
const resolved = resolve(config.model, BuilderModelSerialisedSchema);
|
|
96
|
+
if (resolved == null) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return validateModelStructure(resolved, resolve, errors);
|
|
100
|
+
});
|
|
101
|
+
const min = errors.scope('min', () => resolve(config.min, NumberSchema));
|
|
102
|
+
const max = errors.scope('max', () => resolve(config.max, NumberSchema));
|
|
103
|
+
return {
|
|
104
|
+
...config,
|
|
105
|
+
model: model ?? config.model,
|
|
106
|
+
min: min ?? config.min,
|
|
107
|
+
max: max ?? config.max
|
|
108
|
+
};
|
|
95
109
|
}
|
|
96
110
|
return resolve;
|
|
97
111
|
}
|
package/dist/validate/ui.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { BuilderModelSerialisedSchema, BuilderUIInputMetadataSchema, BuilderUISerialisedSchema, modelsMerge, serialise, uis, validateUIDescribe, validateUIInput, validateUIPage, validateUIPages } from '../entities/index.js';
|
|
1
|
+
import { BuilderModelSerialisedSchema, BuilderPathSchema, BuilderUIInputMetadataSchema, BuilderUIInputSerialisedSchema, BuilderUIInputsSerialisedSchema, BuilderUIItemSerialisedSchema, BuilderUIItemsSerialisedSchema, BuilderUISerialisedSchema, modelsMerge, serialise, uis, validateUIDescribe, validateUIInput, validateUIPage, validateUIPages } from '../entities/index.js';
|
|
2
2
|
import { BuilderErrorsScope, check } from '../errors/index.js';
|
|
3
3
|
import { resolveCollections } from '../mappers/index.js';
|
|
4
|
+
import { StringSchema } from '../primitive.js';
|
|
4
5
|
import { validate } from './brand.js';
|
|
5
6
|
import { checkExpectations } from './expectations.js';
|
|
6
7
|
import { checkPath } from './paths.js';
|
|
@@ -25,8 +26,8 @@ export function validateUIStructure(ui, resolve, errors) {
|
|
|
25
26
|
return data;
|
|
26
27
|
function walkChildUIs() {
|
|
27
28
|
return errors.scope('uis', () => ui.uis.flatMap((part, partIndex) => errors.scope(partIndex, () => {
|
|
28
|
-
const resolved = resolve(part);
|
|
29
|
-
if (resolved == null
|
|
29
|
+
const resolved = resolve(part, BuilderUISerialisedSchema);
|
|
30
|
+
if (resolved == null) {
|
|
30
31
|
return [];
|
|
31
32
|
}
|
|
32
33
|
return [validateUIStructure(resolved, resolve, errors)];
|
|
@@ -34,7 +35,7 @@ export function validateUIStructure(ui, resolve, errors) {
|
|
|
34
35
|
}
|
|
35
36
|
function walkItems(parts) {
|
|
36
37
|
return parts.map((item, itemIndex) => errors.scope(itemIndex, () => {
|
|
37
|
-
const resolved = resolve(item);
|
|
38
|
+
const resolved = resolve(item, BuilderUIItemSerialisedSchema);
|
|
38
39
|
return walkUIItem((resolved ?? item));
|
|
39
40
|
}));
|
|
40
41
|
}
|
|
@@ -48,17 +49,17 @@ export function validateUIStructure(ui, resolve, errors) {
|
|
|
48
49
|
else if (item.type === 'describe') {
|
|
49
50
|
validateUIDescribe(item, [], errors);
|
|
50
51
|
}
|
|
51
|
-
const label = errors.scope('label', () => resolve(item.label) ?? item.label);
|
|
52
|
+
const label = errors.scope('label', () => resolve(item.label, StringSchema) ?? item.label);
|
|
52
53
|
if (item.type === 'pages') {
|
|
53
54
|
const innerItems = errors.scope('items', () => {
|
|
54
|
-
const resolved = resolve(item.items);
|
|
55
|
+
const resolved = resolve(item.items, BuilderUIItemsSerialisedSchema);
|
|
55
56
|
const resolvedItems = (Array.isArray(resolved) ? resolved : item.items);
|
|
56
57
|
return walkItems(resolvedItems);
|
|
57
58
|
});
|
|
58
59
|
return { ...item, label, items: innerItems };
|
|
59
60
|
}
|
|
60
61
|
const inputs = errors.scope('inputs', () => {
|
|
61
|
-
const resolved = resolve(item.inputs);
|
|
62
|
+
const resolved = resolve(item.inputs, BuilderUIInputsSerialisedSchema);
|
|
62
63
|
if (!Array.isArray(resolved)) {
|
|
63
64
|
return resolved ?? item.inputs;
|
|
64
65
|
}
|
|
@@ -68,22 +69,22 @@ export function validateUIStructure(ui, resolve, errors) {
|
|
|
68
69
|
}
|
|
69
70
|
function walkInputs(inputs) {
|
|
70
71
|
return inputs.map((entry, entryIndex) => errors.scope(entryIndex, () => {
|
|
71
|
-
const resolvedEntry = resolve(entry);
|
|
72
|
+
const resolvedEntry = resolve(entry, BuilderUIInputSerialisedSchema);
|
|
72
73
|
return walkInput((resolvedEntry ?? entry));
|
|
73
74
|
}));
|
|
74
75
|
}
|
|
75
76
|
function walkInput(value) {
|
|
76
77
|
validateUIInput(value, [], errors);
|
|
77
|
-
const path = errors.scope('path', () => resolve(value.path) ?? value.path);
|
|
78
|
+
const path = errors.scope('path', () => resolve(value.path, BuilderPathSchema) ?? value.path);
|
|
78
79
|
const displayName = value.displayName &&
|
|
79
|
-
errors.scope('displayName', () => resolve(value.displayName) ?? value.displayName);
|
|
80
|
-
const kind = value.kind && errors.scope('kind', () => resolve(value.kind) ?? value.kind);
|
|
80
|
+
errors.scope('displayName', () => resolve(value.displayName, StringSchema) ?? value.displayName);
|
|
81
|
+
const kind = value.kind && errors.scope('kind', () => resolve(value.kind, StringSchema) ?? value.kind);
|
|
81
82
|
const metadata = value.metadata && errors.scope('metadata', () => walkMetadata(value.metadata));
|
|
82
83
|
return { ...value, path, displayName, kind, metadata };
|
|
83
84
|
}
|
|
84
85
|
function walkMetadata(rawMetadata) {
|
|
85
|
-
const resolved = resolve(rawMetadata);
|
|
86
|
-
if (
|
|
86
|
+
const resolved = resolve(rawMetadata, BuilderUIInputMetadataSchema);
|
|
87
|
+
if (resolved == null) {
|
|
87
88
|
return rawMetadata;
|
|
88
89
|
}
|
|
89
90
|
return Object.entries(resolved).reduce((entries, [key, entryValue]) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@builder-builder/builder",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.27",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=24"
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
"types": "./dist/client/public.d.ts",
|
|
15
15
|
"default": "./dist/client/public.js"
|
|
16
16
|
},
|
|
17
|
-
"./
|
|
18
|
-
"types": "./dist/
|
|
19
|
-
"default": "./dist/
|
|
17
|
+
"./components": {
|
|
18
|
+
"types": "./dist/components/index.d.ts",
|
|
19
|
+
"default": "./dist/components/index.js"
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
"files": [
|
|
@@ -32,7 +32,9 @@
|
|
|
32
32
|
"predev": "npm run db:types:local",
|
|
33
33
|
"dev:v": "NO_UPDATE_NOTIFIER=false VERCEL_ENV=development vercel dev",
|
|
34
34
|
"build": "NODE_ENV=production vite build",
|
|
35
|
-
"package": "svelte-kit sync &&
|
|
35
|
+
"package": "svelte-kit sync && npm run package:lib && npm run package:components",
|
|
36
|
+
"package:lib": "svelte-package --input src/lib/builder",
|
|
37
|
+
"package:components": "vite build --mode components && rm -f dist/components/*.svelte",
|
|
36
38
|
"preview": "vite preview",
|
|
37
39
|
"prepare": "svelte-kit sync && npm run messages || echo ''",
|
|
38
40
|
"prepublishOnly": "npm run test && npm run package",
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { BuilderOptionConfigSerialised } from '../../entities/index';
|
|
2
|
-
import type { BuilderPrimitive } from '../../primitive';
|
|
3
|
-
import type { BuilderInstance } from '../../instance';
|
|
4
|
-
import * as v from 'valibot';
|
|
5
|
-
export type BuilderRenderUpdate = (model: BuilderInstance, primitive: BuilderPrimitive) => BuilderInstance;
|
|
6
|
-
export declare const BuilderRenderMetadataSchema: v.SchemaWithPipe<readonly [v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, v.ReadonlyAction<{
|
|
7
|
-
[x: string]: unknown;
|
|
8
|
-
}>]>;
|
|
9
|
-
export type BuilderRenderMetadata = v.InferOutput<typeof BuilderRenderMetadataSchema>;
|
|
10
|
-
export type BuilderRenderOption = Readonly<{
|
|
11
|
-
name: string;
|
|
12
|
-
value: BuilderPrimitive;
|
|
13
|
-
update: BuilderRenderUpdate;
|
|
14
|
-
option: BuilderOptionConfigSerialised;
|
|
15
|
-
displayName?: string;
|
|
16
|
-
kind?: string;
|
|
17
|
-
metadata?: BuilderRenderMetadata;
|
|
18
|
-
}>;
|
|
19
|
-
export type BuilderRenderOptions = ReadonlyArray<BuilderRenderOption>;
|
|
20
|
-
export type BuilderRenderPage = Readonly<{
|
|
21
|
-
label: string;
|
|
22
|
-
options: BuilderRenderOptions;
|
|
23
|
-
}>;
|
|
24
|
-
export type BuilderRenderPages = ReadonlyArray<BuilderRenderPage>;
|