@builder-builder/builder 0.0.5 → 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.
Files changed (47) hide show
  1. package/dist/core/builder.d.ts +6 -2
  2. package/dist/core/builder.js +20 -29
  3. package/dist/core/collection/collection.d.ts +3 -1
  4. package/dist/core/component/component.d.ts +0 -2
  5. package/dist/core/component/component.js +0 -7
  6. package/dist/core/component/graph.d.ts +0 -1
  7. package/dist/core/component/graph.js +5 -5
  8. package/dist/core/component/index.d.ts +1 -1
  9. package/dist/core/expectation.d.ts +22 -19
  10. package/dist/core/expectation.js +5 -9
  11. package/dist/core/index.d.ts +4 -2
  12. package/dist/core/index.js +2 -1
  13. package/dist/core/option/graph.d.ts +1 -2
  14. package/dist/core/option/graph.js +4 -6
  15. package/dist/core/option/index.d.ts +1 -0
  16. package/dist/core/option/option.js +5 -4
  17. package/dist/core/option/toggle.d.ts +3 -1
  18. package/dist/core/option/toggle.js +9 -7
  19. package/dist/core/validate.d.ts +26 -0
  20. package/dist/core/validate.js +43 -0
  21. package/dist/index.d.ts +7 -7
  22. package/dist/index.js +3 -3
  23. package/dist/paths.d.ts +3 -1
  24. package/dist/resolve/index.d.ts +4 -3
  25. package/dist/resolve/index.js +2 -2
  26. package/dist/resolve/instance.d.ts +34 -2
  27. package/dist/resolve/instance.js +56 -2
  28. package/dist/resolve/models.d.ts +2 -2
  29. package/dist/resolve/models.js +11 -1
  30. package/dist/resolve/order.d.ts +4 -2
  31. package/dist/resolve/order.js +13 -10
  32. package/dist/resolve/render.d.ts +4 -2
  33. package/dist/resolve/validate.d.ts +20 -16
  34. package/dist/resolve/validate.js +18 -22
  35. package/dist/serialise/deserialise.d.ts +6 -1
  36. package/dist/serialise/deserialise.js +40 -34
  37. package/dist/serialise/index.d.ts +3 -1
  38. package/dist/serialise/index.js +2 -1
  39. package/dist/serialise/schemas.d.ts +153 -92
  40. package/dist/serialise/schemas.js +19 -10
  41. package/dist/serialise/serialise.d.ts +4 -1
  42. package/dist/serialise/serialise.js +16 -9
  43. package/dist/serialise/validate.d.ts +26 -0
  44. package/dist/serialise/validate.js +148 -0
  45. package/dist/ui.d.ts +7 -6
  46. package/dist/ui.js +17 -15
  47. package/package.json +3 -2
@@ -1,3 +1,35 @@
1
1
  import type { BuilderGeneric, BuilderModelOf } from '../core/index';
2
- import type { BuilderModelInput } from '../model';
3
- export declare function instance<const Builder extends BuilderGeneric>(builder: Builder, partial?: BuilderModelInput): BuilderModelOf<Builder>;
2
+ import type { BuilderModel, BuilderModelInput } from '../model';
3
+ declare const modelValidated: unique symbol;
4
+ export type BuilderModelValidated = BuilderModel & {
5
+ readonly [modelValidated]: true;
6
+ };
7
+ export type BuilderModelValidateErrorInvalidOption = {
8
+ readonly kind: 'invalid-option';
9
+ readonly name: string;
10
+ readonly value: unknown;
11
+ };
12
+ export type BuilderModelValidateErrorInvalidCollection = {
13
+ readonly kind: 'invalid-collection';
14
+ readonly name: string;
15
+ readonly detail: string;
16
+ };
17
+ export type BuilderModelValidateError = BuilderModelValidateErrorInvalidOption | BuilderModelValidateErrorInvalidCollection;
18
+ export type BuilderModelValidateErrors = ReadonlyArray<BuilderModelValidateError>;
19
+ export type BuilderModelValidateResult = readonly [
20
+ BuilderModelValidated,
21
+ BuilderModelValidateErrors
22
+ ];
23
+ export type BuilderModelValidateOptions = {
24
+ readonly strict: true;
25
+ };
26
+ export declare class BuilderModelValidateException extends Error {
27
+ readonly errors: BuilderModelValidateErrors;
28
+ constructor(errors: BuilderModelValidateErrors);
29
+ }
30
+ export declare function validateInstance(builder: BuilderGeneric, model: BuilderModel, options?: BuilderModelValidateOptions): BuilderModelValidateResult;
31
+ export declare const instance: typeof createInstance & {
32
+ validate: typeof validateInstance;
33
+ };
34
+ declare function createInstance<const Builder extends BuilderGeneric>(builder: Builder, partial?: BuilderModelInput): BuilderModelOf<Builder> & BuilderModelValidated;
35
+ export {};
@@ -1,6 +1,60 @@
1
1
  import * as v from 'valibot';
2
2
  import { resolveCollectionModels } from '../core/index.js';
3
- export function instance(builder, partial = {}) {
3
+ export class BuilderModelValidateException extends Error {
4
+ errors;
5
+ constructor(errors) {
6
+ super('model validation failed');
7
+ this.errors = errors;
8
+ }
9
+ }
10
+ export function validateInstance(builder, model, options) {
11
+ const errors = validateModel(builder, model);
12
+ if (options?.strict && errors.length > 0) {
13
+ throw new BuilderModelValidateException(errors);
14
+ }
15
+ return [model, errors];
16
+ }
17
+ export const instance = Object.assign(createInstance, { validate: validateInstance });
18
+ function validateModel(builder, model) {
19
+ let errors = [];
20
+ builder.options.forEach((entry) => {
21
+ const option = entry.resolve(model);
22
+ if (!option) {
23
+ return;
24
+ }
25
+ const value = model[option.name];
26
+ if (!v.is(option.values.valueSchema, value)) {
27
+ errors = [...errors, { kind: 'invalid-option', name: option.name, value }];
28
+ }
29
+ });
30
+ builder.collections.forEach((entry) => {
31
+ const collection = entry.resolve(model);
32
+ if (!collection) {
33
+ return;
34
+ }
35
+ const existing = model[collection.name];
36
+ if (!Array.isArray(existing)) {
37
+ errors = [
38
+ ...errors,
39
+ { kind: 'invalid-collection', name: collection.name, detail: 'expected an array' }
40
+ ];
41
+ return;
42
+ }
43
+ const collectionModels = resolveCollectionModels(model, collection.name);
44
+ collectionModels.forEach((itemModel, index) => {
45
+ const nestedErrors = validateModel(collection.builder, itemModel);
46
+ errors = [
47
+ ...errors,
48
+ ...nestedErrors.map((error) => ({
49
+ ...error,
50
+ name: `${collection.name}[${String(index)}].${error.name}`
51
+ }))
52
+ ];
53
+ });
54
+ });
55
+ return errors;
56
+ }
57
+ function createInstance(builder, partial = {}) {
4
58
  const model = partial;
5
59
  builder.options.forEach((entry) => {
6
60
  const option = entry.resolve(model);
@@ -20,7 +74,7 @@ export function instance(builder, partial = {}) {
20
74
  const collectionModels = existing != null ? resolveCollectionModels(model, collection.name) : [];
21
75
  model[collection.name] = Array.from({
22
76
  length: Math.max(collectionModels.length, collection.min)
23
- }).map((_, index) => instance(collection.builder, collectionModels[index] || {}));
77
+ }).map((_, index) => createInstance(collection.builder, collectionModels[index] || {}));
24
78
  });
25
79
  return model;
26
80
  }
@@ -1,3 +1,3 @@
1
1
  import type { BuilderData } from '../model';
2
- import type { BuilderGeneric } from '../core/index';
3
- export declare function models(builder: BuilderGeneric): BuilderData;
2
+ import type { BuilderValidated } from '../core/validate';
3
+ export declare function models(builder: BuilderValidated): BuilderData;
@@ -1,6 +1,9 @@
1
1
  export function models(builder) {
2
+ return modelsRecursive(builder);
3
+ }
4
+ function modelsRecursive(builder) {
2
5
  const collectionModels = builder.collections.flatMap((entry) => {
3
- return [models(entry.builder)];
6
+ return collectionBuilders(entry).map((collectionBuilder) => modelsRecursive(collectionBuilder));
4
7
  });
5
8
  const wrapped = Object.fromEntries(builder.componentGraph.paths.map((path) => [path.name, path.models.map((model) => ({ model }))]));
6
9
  return {
@@ -8,3 +11,10 @@ export function models(builder) {
8
11
  ...wrapped
9
12
  };
10
13
  }
14
+ function collectionBuilders(entry) {
15
+ if (entry.config?.type === 'match') {
16
+ const selectMap = entry.config.selectMap;
17
+ return Object.values(selectMap).flatMap((value) => (value ? [value.builder] : []));
18
+ }
19
+ return [entry.builder];
20
+ }
@@ -1,13 +1,15 @@
1
1
  import type { Prettify } from '../prettify';
2
- import type { BuilderModel, BuilderVariant } from '../model';
2
+ import type { BuilderVariant } from '../model';
3
3
  import type { CollectionShape } from '../core/collection/index';
4
4
  import type { BuilderCollection, BuilderCollectionEntries, BuilderComponentEntries, BuilderComponentNamesOf, BuilderGeneric } from '../core/index';
5
+ import type { BuilderValidated } from '../core/validate';
6
+ import type { BuilderModelValidated } from './instance';
5
7
  import type { BuilderDataValidated } from './validate';
6
8
  export type BuilderOrder<Builder extends BuilderGeneric> = Builder extends {
7
9
  readonly _components: infer Components extends BuilderComponentEntries;
8
10
  readonly _collections: infer Collections extends BuilderCollectionEntries;
9
11
  } ? Prettify<ComponentsOrder<Components> & CollectionsOrder<Collections>> : Record<string, unknown>;
10
- export declare function order<const Builder extends BuilderGeneric>(builder: Builder, model: BuilderModel, componentModels: BuilderDataValidated): BuilderOrder<Builder>;
12
+ export declare function order<const Builder extends BuilderGeneric>(builder: Builder & BuilderValidated, model: BuilderModelValidated, componentModels: BuilderDataValidated): BuilderOrder<Builder>;
11
13
  type ComponentsOrder<Components extends BuilderComponentEntries> = {
12
14
  readonly [Name in BuilderComponentNamesOf<Components>]: BuilderVariant | null;
13
15
  };
@@ -1,15 +1,15 @@
1
1
  import { resolveCollectionModels } from '../core/index.js';
2
- export function order(builder, model, componentModels) {
2
+ import { check } from '../check.js';
3
+ function orderInternal(builder, model, componentModels) {
3
4
  const result = {};
4
- const resolved = {};
5
+ const resolved = new Set();
5
6
  builder.components.forEach((component) => {
6
- const active = component.resolve(resolved);
7
- if (!active) {
8
- return;
9
- }
10
- resolved[active.name] = active;
11
- const variants = componentModels[active.name] ?? [];
12
- result[active.name] =
7
+ component.dependencies.forEach((dependency) => {
8
+ check.truthy(resolved.has(dependency), `Component '${component.name}' depends on '${dependency}' which has not been resolved! ❌`);
9
+ });
10
+ resolved.add(component.name);
11
+ const variants = componentModels[component.name] ?? [];
12
+ result[component.name] =
13
13
  variants.find((variant) => Object.entries(variant.model).every(([key, value]) => model[key] === value)) ?? null;
14
14
  });
15
15
  builder.collections.forEach((entry) => {
@@ -18,7 +18,10 @@ export function order(builder, model, componentModels) {
18
18
  return;
19
19
  }
20
20
  const itemModels = resolveCollectionModels(model, collection.name);
21
- result[collection.name] = itemModels.map((itemModel) => order(collection.builder, itemModel, componentModels));
21
+ result[collection.name] = itemModels.map((itemModel) => orderInternal(collection.builder, itemModel, componentModels));
22
22
  });
23
23
  return result;
24
24
  }
25
+ export function order(builder, model, componentModels) {
26
+ return orderInternal(builder, model, componentModels);
27
+ }
@@ -1,5 +1,7 @@
1
- import type { BuilderGeneric, BuilderOption } from '../core/index';
1
+ import type { BuilderOption } from '../core/index';
2
+ import type { BuilderValidated } from '../core/validate';
2
3
  import type { BuilderModel } from '../model';
4
+ import type { BuilderModelValidated } from './instance';
3
5
  import type { BuilderDescription, BuilderUIItems, BuilderPrimitive } from '../schemas/index';
4
6
  import { BuilderUI } from '../ui.js';
5
7
  export type BuilderRenderOption = {
@@ -17,5 +19,5 @@ export type BuilderRenderResult = {
17
19
  readonly layout: BuilderRenderPages;
18
20
  readonly description: BuilderDescription;
19
21
  };
20
- export declare function render(rootBuilder: BuilderGeneric, rootModel: BuilderModel, input: BuilderUI | BuilderUIItems): BuilderRenderResult;
22
+ export declare function render(rootBuilder: BuilderValidated, rootModel: BuilderModelValidated, input: BuilderUI | BuilderUIItems): BuilderRenderResult;
21
23
  export declare function ordinal(index: number): string;
@@ -1,33 +1,37 @@
1
1
  import type { BuilderData, BuilderModel } from '../model';
2
- import type { BuilderGeneric } from '../core/index';
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 BuilderErrorComponentMissing = {
8
- readonly type: 'missing-component';
7
+ export type BuilderDataErrorComponentMissing = {
8
+ readonly kind: 'missing-component';
9
9
  readonly component: string;
10
10
  };
11
- export type BuilderErrorComponentUnexpected = {
12
- readonly type: 'unexpected-component';
11
+ export type BuilderDataErrorComponentUnexpected = {
12
+ readonly kind: 'unexpected-component';
13
13
  readonly component: string;
14
14
  };
15
- export type BuilderErrorVariantMissing = {
16
- readonly type: 'missing-variant';
15
+ export type BuilderDataErrorVariantMissing = {
16
+ readonly kind: 'missing-variant';
17
17
  readonly component: string;
18
18
  readonly model: BuilderModel;
19
19
  };
20
- export type BuilderErrorVariantInvalid = {
21
- readonly type: 'invalid-variant';
20
+ export type BuilderDataErrorVariantInvalid = {
21
+ readonly kind: 'invalid-variant';
22
22
  readonly component: string;
23
23
  readonly model: BuilderModel;
24
24
  };
25
- export type BuilderErrorValidate = BuilderErrorComponentMissing | BuilderErrorComponentUnexpected | BuilderErrorVariantMissing | BuilderErrorVariantInvalid;
26
- export type BuilderErrorsValidate = ReadonlyArray<BuilderErrorValidate>;
27
- export type BuilderValidateResult = readonly [BuilderDataValidated, BuilderErrorsValidate];
28
- export declare const validate: typeof validateBuilder & {
29
- strict: typeof validateStrict;
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 function validateBuilder(builder: BuilderGeneric, builderModels: BuilderData): BuilderValidateResult;
32
- declare function validateStrict(builder: BuilderGeneric, builderModels: BuilderData): BuilderValidateResult;
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 {};
@@ -1,12 +1,19 @@
1
1
  import { models } from './models.js';
2
- export const validate = Object.assign(validateBuilder, { strict: validateStrict });
3
- function validateBuilder(builder, builderModels) {
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 = builderModels[component];
14
+ const componentModels = builderData[component];
8
15
  if (!componentModels) {
9
- errors = [...errors, { type: 'missing-component', component }];
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, { type: 'invalid-variant', component, model: variant.model }];
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, { type: 'missing-variant', component, model }];
30
+ errors = [...errors, { kind: 'missing-variant', component, model }];
24
31
  }
25
32
  });
26
33
  });
27
- Object.keys(builderModels).forEach((component) => {
34
+ Object.keys(builderData).forEach((component) => {
28
35
  if (!expected[component]) {
29
- errors = [...errors, { type: 'unexpected-component', component }];
36
+ errors = [...errors, { kind: 'unexpected-component', component }];
30
37
  }
31
38
  });
32
- return [builderModels, errors];
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 [data, []];
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): BuilderGeneric;
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, Builder, BuilderParameter, BuilderSelectType, BuilderToggleType } from '../core/index.js';
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
- ui: deserialiseUI
8
+ select: deserialiseSelect,
9
+ ui: deserialiseUI,
10
+ validate: validateSerialised
8
11
  };
9
12
  function deserialiseBuilder(data) {
10
- return buildBuilder(v.parse(BuilderSerialisedSchema, data));
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
- return new BuilderUI(builder, v.parse(BuilderUIItemsSerialisedSchema, data));
14
- }
15
- function buildBuilder(data) {
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 built = buildBuilder(data.builder);
34
+ const builder = deserialiseBuilder(data.builder);
32
35
  const config = deserialiseCollectionWhenConfig(data.config);
33
- return new BuilderCollection(data.name, built, data.min, data.max, data.gatePaths, config);
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
- const { optional, options, defaultValue, labels } = data;
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 valueSchema = deserialiseToggleValueSchema(data.valueType, data.optional);
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.includes('string')
52
+ : data.valueType === 'string'
51
53
  ? v.string()
52
54
  : v.number();
53
- return optional ? v.nullable(base) : base;
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: buildBuilder(builderData), min, max };
94
+ return { type, builder: deserialiseBuilder(builderData), min, max };
92
95
  }
93
96
  case 'match': {
94
- const { matchPath, selectMap, type } = data;
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: buildBuilder(builderData), min, max }];
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 { type, unlessPath, disabledValues, builder: buildBuilder(builderData), min, max };
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';
@@ -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';