@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.
@@ -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';