@builder-builder/builder 0.0.6 → 0.0.7
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/core/builder.d.ts +6 -2
- package/dist/core/builder.js +17 -32
- package/dist/core/expectation.d.ts +2 -5
- package/dist/core/expectation.js +0 -4
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +1 -0
- package/dist/core/option/index.d.ts +1 -0
- package/dist/core/option/toggle.d.ts +3 -1
- package/dist/core/option/toggle.js +9 -7
- package/dist/core/validate.d.ts +26 -0
- package/dist/core/validate.js +43 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +3 -3
- package/dist/resolve/index.d.ts +4 -3
- package/dist/resolve/index.js +2 -2
- package/dist/resolve/instance.d.ts +34 -2
- package/dist/resolve/instance.js +56 -2
- package/dist/resolve/models.d.ts +2 -2
- package/dist/resolve/models.js +11 -1
- package/dist/resolve/order.d.ts +4 -2
- package/dist/resolve/order.js +5 -2
- package/dist/resolve/render.d.ts +4 -2
- package/dist/resolve/validate.d.ts +20 -16
- package/dist/resolve/validate.js +18 -22
- package/dist/serialise/deserialise.d.ts +6 -1
- package/dist/serialise/deserialise.js +40 -34
- package/dist/serialise/index.d.ts +3 -1
- package/dist/serialise/index.js +2 -1
- package/dist/serialise/schemas.d.ts +146 -85
- package/dist/serialise/schemas.js +18 -9
- package/dist/serialise/serialise.d.ts +4 -1
- package/dist/serialise/serialise.js +16 -9
- package/dist/serialise/validate.d.ts +26 -0
- package/dist/serialise/validate.js +148 -0
- package/dist/ui.d.ts +2 -1
- package/dist/ui.js +3 -12
- package/package.json +2 -2
|
@@ -1,33 +1,37 @@
|
|
|
1
1
|
import type { BuilderData, BuilderModel } from '../model';
|
|
2
|
-
import type {
|
|
2
|
+
import type { BuilderValidated } from '../core/validate';
|
|
3
3
|
declare const validated: unique symbol;
|
|
4
4
|
export type BuilderDataValidated = BuilderData & {
|
|
5
5
|
readonly [validated]: true;
|
|
6
6
|
};
|
|
7
|
-
export type
|
|
8
|
-
readonly
|
|
7
|
+
export type BuilderDataErrorComponentMissing = {
|
|
8
|
+
readonly kind: 'missing-component';
|
|
9
9
|
readonly component: string;
|
|
10
10
|
};
|
|
11
|
-
export type
|
|
12
|
-
readonly
|
|
11
|
+
export type BuilderDataErrorComponentUnexpected = {
|
|
12
|
+
readonly kind: 'unexpected-component';
|
|
13
13
|
readonly component: string;
|
|
14
14
|
};
|
|
15
|
-
export type
|
|
16
|
-
readonly
|
|
15
|
+
export type BuilderDataErrorVariantMissing = {
|
|
16
|
+
readonly kind: 'missing-variant';
|
|
17
17
|
readonly component: string;
|
|
18
18
|
readonly model: BuilderModel;
|
|
19
19
|
};
|
|
20
|
-
export type
|
|
21
|
-
readonly
|
|
20
|
+
export type BuilderDataErrorVariantInvalid = {
|
|
21
|
+
readonly kind: 'invalid-variant';
|
|
22
22
|
readonly component: string;
|
|
23
23
|
readonly model: BuilderModel;
|
|
24
24
|
};
|
|
25
|
-
export type
|
|
26
|
-
export type
|
|
27
|
-
export type
|
|
28
|
-
export
|
|
29
|
-
strict:
|
|
25
|
+
export type BuilderDataError = BuilderDataErrorComponentMissing | BuilderDataErrorComponentUnexpected | BuilderDataErrorVariantMissing | BuilderDataErrorVariantInvalid;
|
|
26
|
+
export type BuilderDataErrors = ReadonlyArray<BuilderDataError>;
|
|
27
|
+
export type BuilderDataValidateResult = readonly [BuilderDataValidated, BuilderDataErrors];
|
|
28
|
+
export type BuilderDataValidateOptions = {
|
|
29
|
+
readonly strict: true;
|
|
30
30
|
};
|
|
31
|
-
declare
|
|
32
|
-
|
|
31
|
+
export declare class BuilderDataValidateError extends Error {
|
|
32
|
+
readonly errors: BuilderDataErrors;
|
|
33
|
+
constructor(errors: BuilderDataErrors);
|
|
34
|
+
}
|
|
35
|
+
export declare const validate: typeof validateData;
|
|
36
|
+
declare function validateData(builder: BuilderValidated, builderData: BuilderData, options?: BuilderDataValidateOptions): BuilderDataValidateResult;
|
|
33
37
|
export {};
|
package/dist/resolve/validate.js
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
import { models } from './models.js';
|
|
2
|
-
export
|
|
3
|
-
|
|
2
|
+
export class BuilderDataValidateError extends Error {
|
|
3
|
+
errors;
|
|
4
|
+
constructor(errors) {
|
|
5
|
+
super('data validation failed');
|
|
6
|
+
this.errors = errors;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export const validate = validateData;
|
|
10
|
+
function validateData(builder, builderData, options) {
|
|
4
11
|
const expected = models(builder);
|
|
5
12
|
let errors = [];
|
|
6
13
|
Object.entries(expected).forEach(([component, expectedModels]) => {
|
|
7
|
-
const componentModels =
|
|
14
|
+
const componentModels = builderData[component];
|
|
8
15
|
if (!componentModels) {
|
|
9
|
-
errors = [...errors, {
|
|
16
|
+
errors = [...errors, { kind: 'missing-component', component }];
|
|
10
17
|
return;
|
|
11
18
|
}
|
|
12
19
|
const expectedKeys = new Map(expectedModels.map((variant) => [sortedKey(variant.model), variant.model]));
|
|
@@ -15,37 +22,26 @@ function validateBuilder(builder, builderModels) {
|
|
|
15
22
|
const key = sortedKey(variant.model);
|
|
16
23
|
actualKeys.add(key);
|
|
17
24
|
if (!expectedKeys.has(key)) {
|
|
18
|
-
errors = [...errors, {
|
|
25
|
+
errors = [...errors, { kind: 'invalid-variant', component, model: variant.model }];
|
|
19
26
|
}
|
|
20
27
|
});
|
|
21
28
|
expectedKeys.forEach((model, key) => {
|
|
22
29
|
if (!actualKeys.has(key)) {
|
|
23
|
-
errors = [...errors, {
|
|
30
|
+
errors = [...errors, { kind: 'missing-variant', component, model }];
|
|
24
31
|
}
|
|
25
32
|
});
|
|
26
33
|
});
|
|
27
|
-
Object.keys(
|
|
34
|
+
Object.keys(builderData).forEach((component) => {
|
|
28
35
|
if (!expected[component]) {
|
|
29
|
-
errors = [...errors, {
|
|
36
|
+
errors = [...errors, { kind: 'unexpected-component', component }];
|
|
30
37
|
}
|
|
31
38
|
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
function validateStrict(builder, builderModels) {
|
|
35
|
-
const [data, errors] = validateBuilder(builder, builderModels);
|
|
36
|
-
if (errors.length > 0) {
|
|
37
|
-
throw new ValidateException(errors);
|
|
39
|
+
if (options?.strict && errors.length > 0) {
|
|
40
|
+
throw new BuilderDataValidateError(errors);
|
|
38
41
|
}
|
|
39
|
-
return [
|
|
42
|
+
return [builderData, errors];
|
|
40
43
|
}
|
|
41
44
|
function sortedKey(model) {
|
|
42
45
|
const entries = Object.entries(model).filter(([, value]) => value != null);
|
|
43
46
|
return JSON.stringify(entries.sort(([keyA], [keyB]) => keyA.localeCompare(keyB)));
|
|
44
47
|
}
|
|
45
|
-
class ValidateException extends Error {
|
|
46
|
-
errors;
|
|
47
|
-
constructor(errors) {
|
|
48
|
-
super(`Builder validation failed with ${String(errors.length)} error(s)`);
|
|
49
|
-
this.errors = errors;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { BuilderGeneric } from '../core/index';
|
|
2
2
|
import type { BuilderUIGeneric } from '../ui';
|
|
3
|
+
import type { BuilderSelectTypeSerialised } from './schemas';
|
|
4
|
+
import { Builder, BuilderSelectType } from '../core/index.js';
|
|
3
5
|
export declare const deserialise: {
|
|
4
6
|
builder: typeof deserialiseBuilder;
|
|
7
|
+
select: typeof deserialiseSelect;
|
|
5
8
|
ui: typeof deserialiseUI;
|
|
9
|
+
validate: (data: unknown, options?: import("./validate.js").BuilderSerialisedValidateOptions) => import("./validate.js").BuilderSerialisedValidateResult;
|
|
6
10
|
};
|
|
7
|
-
declare function deserialiseBuilder(data: unknown):
|
|
11
|
+
declare function deserialiseBuilder(data: unknown): Builder;
|
|
8
12
|
declare function deserialiseUI(builder: BuilderGeneric, data: unknown): BuilderUIGeneric;
|
|
13
|
+
declare function deserialiseSelect(data: BuilderSelectTypeSerialised): BuilderSelectType;
|
|
9
14
|
export {};
|
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
import * as v from 'valibot';
|
|
2
|
-
import { BuilderCollection, BuilderComponent, BuilderExpectation, BuilderOption,
|
|
3
|
-
import { BuilderSerialisedSchema, BuilderUIItemsSerialisedSchema } from './schemas.js';
|
|
2
|
+
import { Builder, BuilderCollection, BuilderComponent, BuilderExpectation, BuilderOption, BuilderParameter, BuilderSelectType, BuilderToggleType } from '../core/index.js';
|
|
4
3
|
import { BuilderUI } from '../ui.js';
|
|
4
|
+
import { BuilderSerialisedSchema, BuilderUISerialisedSchema } from './schemas.js';
|
|
5
|
+
import { validate as validateSerialised } from './validate.js';
|
|
5
6
|
export const deserialise = {
|
|
6
7
|
builder: deserialiseBuilder,
|
|
7
|
-
|
|
8
|
+
select: deserialiseSelect,
|
|
9
|
+
ui: deserialiseUI,
|
|
10
|
+
validate: validateSerialised
|
|
8
11
|
};
|
|
9
12
|
function deserialiseBuilder(data) {
|
|
10
|
-
|
|
13
|
+
const builderSerialised = v.parse(BuilderSerialisedSchema, data);
|
|
14
|
+
const options = builderSerialised.options.map(deserialiseOption);
|
|
15
|
+
const components = builderSerialised.components.map(deserialiseComponent);
|
|
16
|
+
const collections = builderSerialised.collections.map(deserialiseCollection);
|
|
17
|
+
const expectations = builderSerialised.expectations.map((expectation) => new BuilderExpectation(expectation.name, expectation.kind));
|
|
18
|
+
return new Builder(options, components, collections, expectations);
|
|
11
19
|
}
|
|
12
20
|
function deserialiseUI(builder, data) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const options = data.options.map(deserialiseOption);
|
|
17
|
-
const components = data.components.map(deserialiseComponent);
|
|
18
|
-
const collections = data.collections.map(deserialiseCollection);
|
|
19
|
-
const expectations = data.expectations.map((expectation) => new BuilderExpectation(expectation.name, expectation.kind));
|
|
20
|
-
return new Builder(options, collections, components, expectations);
|
|
21
|
+
const parsed = v.parse(BuilderUISerialisedSchema, data);
|
|
22
|
+
const expectations = parsed.expectations.map((expectation) => new BuilderExpectation(expectation.name, expectation.kind));
|
|
23
|
+
return new BuilderUI(builder, parsed.items, expectations);
|
|
21
24
|
}
|
|
22
25
|
function deserialiseOption(data) {
|
|
23
26
|
const values = deserialiseValues(data.values);
|
|
@@ -28,29 +31,29 @@ function deserialiseComponent(data) {
|
|
|
28
31
|
return new BuilderComponent(data.name, data.paths, data.dependencies);
|
|
29
32
|
}
|
|
30
33
|
function deserialiseCollection(data) {
|
|
31
|
-
const
|
|
34
|
+
const builder = deserialiseBuilder(data.builder);
|
|
32
35
|
const config = deserialiseCollectionWhenConfig(data.config);
|
|
33
|
-
return new BuilderCollection(data.name,
|
|
36
|
+
return new BuilderCollection(data.name, builder, data.min, data.max, data.gatePaths, config);
|
|
37
|
+
}
|
|
38
|
+
function deserialiseSelect(data) {
|
|
39
|
+
const { optional, options, defaultValue, labels } = data;
|
|
40
|
+
const valueSchema = v.union(options.map((value) => v.literal(value)));
|
|
41
|
+
return new BuilderSelectType(options, optional ? v.nullable(valueSchema) : valueSchema, defaultValue, optional, labels);
|
|
34
42
|
}
|
|
35
43
|
function deserialiseValues(data) {
|
|
36
44
|
if (data.type === 'parameter') {
|
|
37
45
|
return new BuilderParameter();
|
|
38
46
|
}
|
|
39
47
|
if (data.type === 'select') {
|
|
40
|
-
|
|
41
|
-
const valueSchema = v.union(options.map((value) => v.literal(value)));
|
|
42
|
-
return new BuilderSelectType(options, optional ? v.nullable(valueSchema) : valueSchema, defaultValue, optional, labels);
|
|
48
|
+
return deserialiseSelect(data);
|
|
43
49
|
}
|
|
44
|
-
const
|
|
45
|
-
return new BuilderToggleType(valueSchema, data.defaultValue, data.optional);
|
|
46
|
-
}
|
|
47
|
-
function deserialiseToggleValueSchema(valueType, optional) {
|
|
48
|
-
const base = valueType.includes('boolean')
|
|
50
|
+
const baseSchema = data.valueType === 'boolean'
|
|
49
51
|
? v.boolean()
|
|
50
|
-
: valueType
|
|
52
|
+
: data.valueType === 'string'
|
|
51
53
|
? v.string()
|
|
52
54
|
: v.number();
|
|
53
|
-
|
|
55
|
+
const valueSchema = data.optional ? v.nullable(baseSchema) : baseSchema;
|
|
56
|
+
return new BuilderToggleType(data.valueType, valueSchema, data.defaultValue, data.optional);
|
|
54
57
|
}
|
|
55
58
|
function deserialiseOptionWhenConfig(data) {
|
|
56
59
|
if (data === null) {
|
|
@@ -88,26 +91,29 @@ function deserialiseCollectionWhenConfig(data) {
|
|
|
88
91
|
switch (data.type) {
|
|
89
92
|
case 'enable': {
|
|
90
93
|
const { max, min, builder: builderData, type } = data;
|
|
91
|
-
return { type, builder:
|
|
94
|
+
return { type, builder: deserialiseBuilder(builderData), min, max };
|
|
92
95
|
}
|
|
93
96
|
case 'match': {
|
|
94
|
-
const { matchPath,
|
|
95
|
-
const deserialisedSelectMap = Object.fromEntries(Object.entries(selectMap).map(([key, value]) => {
|
|
97
|
+
const { matchPath, type } = data;
|
|
98
|
+
const deserialisedSelectMap = Object.fromEntries(Object.entries(data.selectMap).map(([key, value]) => {
|
|
96
99
|
if (!value) {
|
|
97
100
|
return [key, null];
|
|
98
101
|
}
|
|
99
102
|
const { builder: builderData, min, max } = value;
|
|
100
|
-
return [key, { builder:
|
|
103
|
+
return [key, { builder: deserialiseBuilder(builderData), min, max }];
|
|
101
104
|
}));
|
|
102
|
-
return {
|
|
103
|
-
type,
|
|
104
|
-
matchPath,
|
|
105
|
-
selectMap: deserialisedSelectMap
|
|
106
|
-
};
|
|
105
|
+
return { type, matchPath, selectMap: deserialisedSelectMap };
|
|
107
106
|
}
|
|
108
107
|
case 'unless': {
|
|
109
108
|
const { disabledValues, max, min, builder: builderData, type, unlessPath } = data;
|
|
110
|
-
return {
|
|
109
|
+
return {
|
|
110
|
+
type,
|
|
111
|
+
unlessPath,
|
|
112
|
+
disabledValues,
|
|
113
|
+
builder: deserialiseBuilder(builderData),
|
|
114
|
+
min,
|
|
115
|
+
max
|
|
116
|
+
};
|
|
111
117
|
}
|
|
112
118
|
}
|
|
113
119
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export type { BuilderCollectionSerialised, BuilderCollectionConfigSerialised, BuilderCollectionEnableConfigSerialised, BuilderCollectionMatchConfigSerialised, BuilderCollectionUnlessConfigSerialised, BuilderCollectionWhenConfigSerialised, BuilderComponentSerialised, BuilderExpectationSerialised, BuilderOptionSerialised, BuilderOptionEnableConfigSerialised, BuilderOptionMatchConfigSerialised, BuilderOptionUnlessConfigSerialised, BuilderOptionWhenConfigSerialised, BuilderSerialised, BuilderSelectTypeSerialised, BuilderToggleTypeSerialised, BuilderUISerialised, BuilderUICollectionSerialised, BuilderUIDescribeSerialised, BuilderUIItemSerialised, BuilderUIItemsSerialised, BuilderUIPageSerialised, BuilderParameterSerialised, BuilderValuesSerialised } from './schemas';
|
|
2
|
-
export { BuilderCollectionConfigSerialisedSchema, BuilderCollectionEnableConfigSerialisedSchema, BuilderCollectionMatchConfigSerialisedSchema, BuilderCollectionSerialisedSchema, BuilderCollectionUnlessConfigSerialisedSchema, BuilderCollectionWhenConfigSerialisedSchema, BuilderComponentSerialisedSchema, BuilderExpectationSerialisedSchema, BuilderOptionEnableConfigSerialisedSchema, BuilderOptionMatchConfigSerialisedSchema, BuilderOptionSerialisedSchema, BuilderOptionUnlessConfigSerialisedSchema, BuilderOptionWhenConfigSerialisedSchema, BuilderSerialisedSchema, BuilderSelectTypeSerialisedSchema, BuilderToggleTypeSerialisedSchema, BuilderUICollectionSerialisedSchema, BuilderUIDescribeSerialisedSchema, BuilderUIItemSerialisedSchema, BuilderUIItemsSerialisedSchema, BuilderUIPageSerialisedSchema, BuilderValuesSerialisedSchema } from './schemas.js';
|
|
2
|
+
export { BuilderCollectionConfigSerialisedSchema, BuilderCollectionEnableConfigSerialisedSchema, BuilderCollectionMatchConfigSerialisedSchema, BuilderCollectionSerialisedSchema, BuilderCollectionUnlessConfigSerialisedSchema, BuilderCollectionWhenConfigSerialisedSchema, BuilderComponentSerialisedSchema, BuilderExpectationSerialisedSchema, BuilderOptionEnableConfigSerialisedSchema, BuilderOptionMatchConfigSerialisedSchema, BuilderOptionSerialisedSchema, BuilderOptionUnlessConfigSerialisedSchema, BuilderOptionWhenConfigSerialisedSchema, BuilderSerialisedSchema, BuilderSelectTypeSerialisedSchema, BuilderToggleTypeSerialisedSchema, BuilderUICollectionSerialisedSchema, BuilderUIDescribeSerialisedSchema, BuilderUIItemSerialisedSchema, BuilderUIItemsSerialisedSchema, BuilderUIPageSerialisedSchema, BuilderUISerialisedSchema, BuilderValuesSerialisedSchema } from './schemas.js';
|
|
3
|
+
export type { BuilderSerialisedValidated, BuilderSerialisedError, BuilderSerialisedErrors, BuilderSerialisedValidateOptions, BuilderSerialisedValidateResult } from './validate';
|
|
3
4
|
export { deserialise } from './deserialise.js';
|
|
4
5
|
export { serialise } from './serialise.js';
|
|
6
|
+
export { BuilderSerialisedValidateError } from './validate.js';
|
package/dist/serialise/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { BuilderCollectionConfigSerialisedSchema, BuilderCollectionEnableConfigSerialisedSchema, BuilderCollectionMatchConfigSerialisedSchema, BuilderCollectionSerialisedSchema, BuilderCollectionUnlessConfigSerialisedSchema, BuilderCollectionWhenConfigSerialisedSchema, BuilderComponentSerialisedSchema, BuilderExpectationSerialisedSchema, BuilderOptionEnableConfigSerialisedSchema, BuilderOptionMatchConfigSerialisedSchema, BuilderOptionSerialisedSchema, BuilderOptionUnlessConfigSerialisedSchema, BuilderOptionWhenConfigSerialisedSchema, BuilderSerialisedSchema, BuilderSelectTypeSerialisedSchema, BuilderToggleTypeSerialisedSchema, BuilderUICollectionSerialisedSchema, BuilderUIDescribeSerialisedSchema, BuilderUIItemSerialisedSchema, BuilderUIItemsSerialisedSchema, BuilderUIPageSerialisedSchema, BuilderValuesSerialisedSchema } from './schemas.js';
|
|
1
|
+
export { BuilderCollectionConfigSerialisedSchema, BuilderCollectionEnableConfigSerialisedSchema, BuilderCollectionMatchConfigSerialisedSchema, BuilderCollectionSerialisedSchema, BuilderCollectionUnlessConfigSerialisedSchema, BuilderCollectionWhenConfigSerialisedSchema, BuilderComponentSerialisedSchema, BuilderExpectationSerialisedSchema, BuilderOptionEnableConfigSerialisedSchema, BuilderOptionMatchConfigSerialisedSchema, BuilderOptionSerialisedSchema, BuilderOptionUnlessConfigSerialisedSchema, BuilderOptionWhenConfigSerialisedSchema, BuilderSerialisedSchema, BuilderSelectTypeSerialisedSchema, BuilderToggleTypeSerialisedSchema, BuilderUICollectionSerialisedSchema, BuilderUIDescribeSerialisedSchema, BuilderUIItemSerialisedSchema, BuilderUIItemsSerialisedSchema, BuilderUIPageSerialisedSchema, BuilderUISerialisedSchema, BuilderValuesSerialisedSchema } from './schemas.js';
|
|
2
2
|
export { deserialise } from './deserialise.js';
|
|
3
3
|
export { serialise } from './serialise.js';
|
|
4
|
+
export { BuilderSerialisedValidateError } from './validate.js';
|