@builder-builder/builder 0.0.20 → 0.0.22

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 (125) hide show
  1. package/README.md +33 -24
  2. package/dist/bb.d.ts +10 -11
  3. package/dist/bb.js +25 -2
  4. package/dist/client/client.d.ts +7 -0
  5. package/dist/client/client.js +19 -0
  6. package/dist/client/index.d.ts +4 -0
  7. package/dist/client/index.js +2 -0
  8. package/dist/client/schema.d.ts +396 -0
  9. package/dist/client/schema.js +13 -0
  10. package/dist/entities/builder/bind.d.ts +1 -1
  11. package/dist/entities/builder/builder.js +1 -1
  12. package/dist/entities/collection/collection.d.ts +689 -1
  13. package/dist/entities/collection/collection.js +5 -2
  14. package/dist/entities/collection/config.d.ts +189 -0
  15. package/dist/entities/collection/config.js +12 -2
  16. package/dist/entities/collection/expectation.d.ts +1 -1
  17. package/dist/entities/collection/index.d.ts +2 -2
  18. package/dist/entities/collection/index.js +2 -2
  19. package/dist/entities/collection/when.d.ts +1 -1
  20. package/dist/entities/component/component.d.ts +61 -7
  21. package/dist/entities/component/component.js +5 -2
  22. package/dist/entities/component/config.d.ts +10 -0
  23. package/dist/entities/component/config.js +19 -2
  24. package/dist/entities/component/field.js +1 -1
  25. package/dist/entities/component/index.d.ts +2 -2
  26. package/dist/entities/component/index.js +2 -2
  27. package/dist/entities/component/when.d.ts +1 -1
  28. package/dist/entities/expectation.d.ts +4 -0
  29. package/dist/entities/expectation.js +3 -1
  30. package/dist/entities/index.d.ts +15 -13
  31. package/dist/entities/index.js +11 -10
  32. package/dist/entities/kind.d.ts +10 -7
  33. package/dist/entities/kind.js +39 -5
  34. package/dist/entities/model/bind.d.ts +1 -1
  35. package/dist/entities/model/methods.d.ts +4 -4
  36. package/dist/entities/model/model.js +1 -1
  37. package/dist/entities/option/index.d.ts +3 -3
  38. package/dist/entities/option/index.js +3 -3
  39. package/dist/entities/option/option.d.ts +85 -7
  40. package/dist/entities/option/option.js +5 -2
  41. package/dist/entities/option/select.d.ts +10 -0
  42. package/dist/entities/option/select.js +12 -1
  43. package/dist/entities/option/toggle.d.ts +7 -0
  44. package/dist/entities/option/toggle.js +12 -1
  45. package/dist/entities/option/when.d.ts +1 -1
  46. package/dist/{paths.d.ts → entities/paths.d.ts} +2 -0
  47. package/dist/{paths.js → entities/paths.js} +3 -0
  48. package/dist/entities/pricing/index.d.ts +1 -1
  49. package/dist/entities/pricing/index.js +1 -1
  50. package/dist/entities/pricing/pricing.js +1 -1
  51. package/dist/entities/pricing/rates.d.ts +5 -0
  52. package/dist/entities/pricing/rates.js +3 -1
  53. package/dist/entities/references.d.ts +723 -6
  54. package/dist/entities/references.js +7 -1
  55. package/dist/entities/serialise.d.ts +48 -42
  56. package/dist/entities/serialise.js +9 -3
  57. package/dist/entities/ui/describe.d.ts +15 -0
  58. package/dist/entities/ui/describe.js +11 -2
  59. package/dist/entities/ui/index.d.ts +4 -4
  60. package/dist/entities/ui/index.js +4 -4
  61. package/dist/entities/ui/input.d.ts +11 -1
  62. package/dist/entities/ui/input.js +4 -2
  63. package/dist/entities/ui/page.d.ts +15 -0
  64. package/dist/entities/ui/page.js +11 -2
  65. package/dist/entities/ui/pages.d.ts +132 -0
  66. package/dist/entities/ui/pages.js +12 -2
  67. package/dist/entities/ui/ui.d.ts +1 -1
  68. package/dist/entities/ui/ui.js +2 -2
  69. package/dist/entities/ui/uis.js +1 -1
  70. package/dist/entities/validated.d.ts +26 -18
  71. package/dist/entities/when.d.ts +4 -3
  72. package/dist/entities/when.js +22 -2
  73. package/dist/environment.d.ts +2 -2
  74. package/dist/{validate → errors}/errors.d.ts +57 -35
  75. package/dist/{validate → errors}/errors.js +40 -5
  76. package/dist/errors/exception.d.ts +5 -0
  77. package/dist/{exception.js → errors/exception.js} +0 -3
  78. package/dist/errors/index.d.ts +4 -0
  79. package/dist/errors/index.js +3 -0
  80. package/dist/index.d.ts +14 -14
  81. package/dist/index.js +3 -2
  82. package/dist/instance.d.ts +7 -7
  83. package/dist/instance.js +4 -4
  84. package/dist/mappers/instance.js +1 -1
  85. package/dist/mappers/order.d.ts +4 -4
  86. package/dist/mappers/order.js +1 -1
  87. package/dist/mappers/price.js +18 -18
  88. package/dist/mappers/render/render.js +1 -1
  89. package/dist/mappers/resolve.d.ts +1 -2
  90. package/dist/mappers/resolve.js +3 -20
  91. package/dist/mappers/variants/option-graph.d.ts +1 -2
  92. package/dist/mappers/variants/option-graph.js +2 -3
  93. package/dist/mappers/variants/variants.d.ts +2 -2
  94. package/dist/mappers/variants/variants.js +1 -1
  95. package/dist/private.d.ts +1 -2
  96. package/dist/private.js +1 -2
  97. package/dist/references.js +1 -1
  98. package/dist/validate/brand.js +1 -2
  99. package/dist/validate/builder.d.ts +2 -3
  100. package/dist/validate/builder.js +2 -3
  101. package/dist/validate/expectations.d.ts +1 -1
  102. package/dist/validate/index.d.ts +4 -2
  103. package/dist/validate/index.js +1 -0
  104. package/dist/validate/instance.d.ts +2 -3
  105. package/dist/validate/instance.js +1 -2
  106. package/dist/validate/model.d.ts +2 -3
  107. package/dist/validate/model.js +39 -44
  108. package/dist/validate/paths.d.ts +2 -3
  109. package/dist/validate/paths.js +1 -1
  110. package/dist/validate/pricing.d.ts +2 -3
  111. package/dist/validate/pricing.js +2 -3
  112. package/dist/validate/resolve.d.ts +1 -1
  113. package/dist/validate/resolve.js +1 -1
  114. package/dist/validate/ui.d.ts +2 -3
  115. package/dist/validate/ui.js +13 -4
  116. package/dist/validate/variants.d.ts +4 -5
  117. package/dist/validate/variants.js +4 -5
  118. package/package.json +17 -5
  119. package/dist/exception.d.ts +0 -13
  120. package/dist/validate/result.d.ts +0 -2
  121. package/dist/validate/result.js +0 -1
  122. /package/dist/{serialisable.d.ts → entities/serialisable.d.ts} +0 -0
  123. /package/dist/{serialisable.js → entities/serialisable.js} +0 -0
  124. /package/dist/{check.d.ts → errors/check.d.ts} +0 -0
  125. /package/dist/{check.js → errors/check.js} +0 -0
@@ -1,7 +1,7 @@
1
1
  import * as v from 'valibot';
2
- import { check } from '../check.js';
3
2
  import { BuilderPricingExpressionSchema } from '../entities/index.js';
4
- import { BuilderVariantSchema } from '../instance.js';
3
+ import { check } from '../errors/index.js';
4
+ import { BuilderComponentVariantSchema } from '../instance.js';
5
5
  const NumberSchema = v.number();
6
6
  export function price(pricingInput, order) {
7
7
  const { rates, formula } = pricingInput;
@@ -10,31 +10,31 @@ export function price(pricingInput, order) {
10
10
  }
11
11
  const variants = collectVariants(order);
12
12
  return evaluate(formula);
13
- function evaluate(expression, currentVariant = null) {
13
+ function evaluate(expression, variant = null) {
14
14
  check.assert(BuilderPricingExpressionSchema, expression);
15
15
  if (check.is(NumberSchema, expression)) {
16
16
  return expression;
17
17
  }
18
18
  switch (expression.kind) {
19
19
  case 'variantPrice':
20
- return variantPrice(currentVariant);
20
+ return variantPrice(variant);
21
21
  case 'lookup':
22
- return evaluateLookup(expression, currentVariant);
22
+ return evaluateLookup(expression, variant);
23
23
  case 'variants':
24
24
  return evaluateVariants(expression);
25
25
  case 'add':
26
- return combine(expression.left, expression.right, currentVariant, (l, r) => l + r);
26
+ return combine(expression.left, expression.right, variant, (l, r) => l + r);
27
27
  case 'sub':
28
- return combine(expression.left, expression.right, currentVariant, (l, r) => l - r);
28
+ return combine(expression.left, expression.right, variant, (l, r) => l - r);
29
29
  case 'mul':
30
- return combine(expression.left, expression.right, currentVariant, (l, r) => l * r);
30
+ return combine(expression.left, expression.right, variant, (l, r) => l * r);
31
31
  case 'div':
32
- return combine(expression.left, expression.right, currentVariant, (l, r) => l / r);
32
+ return combine(expression.left, expression.right, variant, (l, r) => l / r);
33
33
  }
34
34
  }
35
- function combine(left, right, currentVariant, operation) {
36
- const leftValue = evaluate(left, currentVariant);
37
- const rightValue = evaluate(right, currentVariant);
35
+ function combine(left, right, variant, operation) {
36
+ const leftValue = evaluate(left, variant);
37
+ const rightValue = evaluate(right, variant);
38
38
  if (leftValue == null || rightValue == null) {
39
39
  return null;
40
40
  }
@@ -54,8 +54,8 @@ export function price(pricingInput, order) {
54
54
  const candidate = variant?.details?.price;
55
55
  return check.is(NumberSchema, candidate) ? candidate : null;
56
56
  }
57
- function evaluateLookup(expression, currentVariant) {
58
- const keys = resolveKey(expression.key, currentVariant);
57
+ function evaluateLookup(expression, variant) {
58
+ const keys = resolveKey(expression.key, variant);
59
59
  const matches = keys
60
60
  .map((key) => lookupRate(expression.rate, key))
61
61
  .filter((value) => value != null);
@@ -73,12 +73,12 @@ export function price(pricingInput, order) {
73
73
  }
74
74
  return reduceValues(results, expression.reduce ?? 'sum');
75
75
  }
76
- function resolveKey(key, currentVariant) {
76
+ function resolveKey(key, variant) {
77
77
  switch (key.kind) {
78
78
  case 'variantTags':
79
- return currentVariant?.tags ?? [];
79
+ return variant?.tags ?? [];
80
80
  case 'option': {
81
- const value = currentVariant?.instance?.[key.name];
81
+ const value = variant?.instance?.[key.name];
82
82
  return value == null ? [] : [String(value)];
83
83
  }
84
84
  }
@@ -100,7 +100,7 @@ function collectVariants(order) {
100
100
  if (value == null) {
101
101
  return [];
102
102
  }
103
- if (check.is(BuilderVariantSchema, value)) {
103
+ if (check.is(BuilderComponentVariantSchema, value)) {
104
104
  return [value];
105
105
  }
106
106
  if (Array.isArray(value)) {
@@ -1,5 +1,5 @@
1
1
  import * as v from 'valibot';
2
- import { check } from '../../check.js';
2
+ import { check } from '../../errors/index.js';
3
3
  import { BuilderInstancesSchema } from '../../instance.js';
4
4
  import { BuilderPrimitiveSchema } from '../../primitive.js';
5
5
  import { createInstance } from '../instance.js';
@@ -1,6 +1,5 @@
1
- import type { BuilderCollectionConfigsSerialised, BuilderCollectionConfigValidated, BuilderCollectionSerialised, BuilderCollectionValidated, BuilderComponentConfigsSerialised, BuilderComponentConfigValidated, BuilderComponentSerialised, BuilderComponentValidated, BuilderModelValidated, BuilderOptionConfigsSerialised, BuilderOptionConfigValidated, BuilderOptionSerialised, BuilderOptionValidated, BuilderReferences } from '../entities/index';
1
+ import type { BuilderCollectionConfigsSerialised, BuilderCollectionConfigValidated, BuilderCollectionSerialised, BuilderCollectionValidated, BuilderComponentConfigsSerialised, BuilderComponentConfigValidated, BuilderComponentSerialised, BuilderComponentValidated, BuilderModelValidated, BuilderOptionConfigsSerialised, BuilderOptionConfigValidated, BuilderOptionSerialised, BuilderOptionValidated, BuilderPath, BuilderReferences } from '../entities/index';
2
2
  import type { BuilderInstance } from '../instance';
3
- import type { BuilderPath } from '../paths';
4
3
  export declare function resolveOption(option: BuilderOptionValidated, model: BuilderModelValidated, instance: unknown, references?: BuilderReferences): BuilderOptionConfigValidated | null;
5
4
  export declare function resolveOptions(option: BuilderOptionSerialised, references?: BuilderReferences): BuilderOptionConfigsSerialised;
6
5
  export declare function resolveComponent(component: BuilderComponentValidated, model: BuilderModelValidated, instance: unknown, references?: BuilderReferences): BuilderComponentConfigValidated | null;
@@ -1,8 +1,7 @@
1
1
  import * as v from 'valibot';
2
- import { check } from '../check.js';
3
- import { BuilderCollectionConfigSerialisedSchema, BuilderComponentConfigSerialisedSchema, BuilderOptionConfigSerialisedSchema, BuilderWhenSerialisedSchema, modelsMerge } from '../entities/index.js';
2
+ import { BuilderCollectionConfigSerialisedSchema, BuilderComponentConfigSerialisedSchema, BuilderOptionConfigSerialisedSchema, BuilderPathsSchema, BuilderWhenSerialisedSchema, modelsMerge, whenBranches } from '../entities/index.js';
3
+ import { check } from '../errors/index.js';
4
4
  import { BuilderInstanceSchema, BuilderInstancesSchema } from '../instance.js';
5
- import { BuilderPathsSchema } from '../paths.js';
6
5
  import { BuilderPrimitiveSchema } from '../primitive.js';
7
6
  import { BuilderRefSerialisedSchema } from '../references.js';
8
7
  export function resolveOption(option, model, instance, references = []) {
@@ -105,21 +104,5 @@ function resolveEntryInstance(entry, schema, model, instance, references) {
105
104
  }
106
105
  }
107
106
  function resolveEntryExhaustive(entry, schema, references) {
108
- const payload = resolveReference(entry.payload, references);
109
- if (check.is(schema, payload)) {
110
- return [payload];
111
- }
112
- if (!check.is(BuilderWhenSerialisedSchema, payload)) {
113
- return [];
114
- }
115
- const when = payload;
116
- switch (when.type) {
117
- case 'enable':
118
- case 'unless': {
119
- return [when.payload];
120
- }
121
- case 'match': {
122
- return Object.values(when.selectMap).filter((branch) => branch != null);
123
- }
124
- }
107
+ return whenBranches(resolveReference(entry.payload, references), schema);
125
108
  }
@@ -1,6 +1,5 @@
1
- import type { BuilderModelValidated, BuilderOptionValidated } from '../../entities/index';
1
+ import type { BuilderModelValidated, BuilderOptionValidated, BuilderPaths } from '../../entities/index';
2
2
  import type { BuilderInstances } from '../../instance';
3
- import type { BuilderPaths } from '../../paths';
4
3
  export type GraphKeys = ReadonlySet<string>;
5
4
  export type GraphPath = {
6
5
  name: string;
@@ -1,6 +1,5 @@
1
- import { check } from '../../check.js';
2
- import { BuilderWhenMatchSchema, BuilderWhenUnlessSchema } from '../../entities/index.js';
3
- import { BuilderPathSchema } from '../../paths.js';
1
+ import { BuilderPathSchema, BuilderWhenMatchSchema, BuilderWhenUnlessSchema } from '../../entities/index.js';
2
+ import { check } from '../../errors/index.js';
4
3
  import { resolveOption } from '../resolve.js';
5
4
  export function crossProduct(left, right) {
6
5
  return left.flatMap((leftModel) => right.map((rightModel) => ({ ...leftModel, ...rightModel })));
@@ -1,6 +1,6 @@
1
1
  import type { BuilderCollectionValidated, BuilderComponentValidated, BuilderModelValidated, BuilderValidated } from '../../entities/index';
2
- import type { BuilderComponentVariants, BuilderInstances } from '../../instance';
2
+ import type { BuilderVariants, BuilderInstances } from '../../instance';
3
3
  import { BuilderOptionGraph } from './option-graph.js';
4
- export declare function createVariants(entity: BuilderValidated | BuilderModelValidated): BuilderComponentVariants;
4
+ export declare function createVariants(entity: BuilderValidated | BuilderModelValidated): BuilderVariants;
5
5
  export declare function optionGraph(model: BuilderModelValidated): BuilderOptionGraph;
6
6
  export declare function variantsFor(entity: BuilderComponentValidated | BuilderCollectionValidated, options: BuilderOptionGraph): BuilderInstances;
@@ -1,5 +1,5 @@
1
- import { check } from '../../check.js';
2
1
  import { BuilderModelSerialisedSchema, BuilderSerialisedSchema } from '../../entities/index.js';
2
+ import { check } from '../../errors/index.js';
3
3
  import { resolveCollection } from '../resolve.js';
4
4
  import { BuilderOptionGraph, crossProduct, dependencyKeys } from './option-graph.js';
5
5
  export function createVariants(entity) {
package/dist/private.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- export { BuilderCollectionConfigSchema, BuilderCollectionConfigSerialisedSchema, BuilderCollectionSchema, BuilderCollectionSelectMapSerialisedSchema, BuilderCollectionSerialisedSchema, BuilderCollectionsSerialisedSchema, BuilderCollectionWhenSerialisedSchema, BuilderComponentConfigSchema, BuilderComponentConfigSerialisedSchema, BuilderComponentFieldSchema, BuilderComponentFieldSerialisedSchema, BuilderComponentFieldsSchema, BuilderComponentFieldsSerialisedSchema, BuilderComponentFieldValueTypeSchema, BuilderComponentSchema, BuilderComponentSelectMapSerialisedSchema, BuilderComponentSerialisedSchema, BuilderComponentsSerialisedSchema, BuilderComponentWhenSerialisedSchema, BuilderDescriptionItemSchema, BuilderDescriptionSchema, BuilderEntityKindSchema, BuilderEntitySerialisedSchema, BuilderExpectationKindSchema, BuilderExpectationSchema, BuilderExpectationSerialisedSchema, BuilderExpectationsSchema, BuilderExpectationsSerialisedSchema, BuilderModelSchema, BuilderModelSerialisedSchema, BuilderOptionSchema, BuilderOptionSelectMapSerialisedSchema, BuilderOptionSerialisedSchema, BuilderOptionsSerialisedSchema, BuilderOptionConfigSchema, BuilderOptionConfigSerialisedSchema, BuilderOptionWhenSerialisedSchema, BuilderSchema, BuilderSelectConfigSchema, BuilderSelectConfigSerialisedSchema, BuilderSerialisedSchema, BuilderToggleConfigSchema, BuilderToggleConfigSerialisedSchema, BuilderUIDescribeSchema, BuilderUIDescribeSerialisedSchema, BuilderUIItemSerialisedSchema, BuilderUIItemsSerialisedSchema, BuilderUIPageSchema, BuilderUIPageSerialisedSchema, BuilderUIPagesSchema, BuilderUIPagesSerialisedSchema, BuilderUISchema, BuilderUISerialisedSchema, BuilderWhenConfigSchema, BuilderWhenEnableSchema, BuilderWhenMatchSchema, BuilderWhenUnlessSchema } from './entities/index.js';
1
+ export { BuilderCollectionConfigSchema, BuilderCollectionConfigSerialisedSchema, BuilderCollectionSchema, BuilderCollectionSelectMapSerialisedSchema, BuilderCollectionSerialisedSchema, BuilderCollectionsSerialisedSchema, BuilderCollectionWhenSerialisedSchema, BuilderComponentConfigSchema, BuilderComponentConfigSerialisedSchema, BuilderComponentFieldSchema, BuilderComponentFieldSerialisedSchema, BuilderComponentFieldsSchema, BuilderComponentFieldsSerialisedSchema, BuilderComponentFieldValueTypeSchema, BuilderComponentSchema, BuilderComponentSelectMapSerialisedSchema, BuilderComponentSerialisedSchema, BuilderComponentsSerialisedSchema, BuilderComponentWhenSerialisedSchema, BuilderDescriptionItemSchema, BuilderDescriptionSchema, BuilderEntityKindSchema, BuilderEntitySerialisedSchema, BuilderExpectationKindSchema, BuilderExpectationSchema, BuilderExpectationSerialisedSchema, BuilderExpectationsSchema, BuilderExpectationsSerialisedSchema, BuilderModelSchema, BuilderModelSerialisedSchema, BuilderOptionConfigSchema, BuilderOptionConfigSerialisedSchema, BuilderOptionSchema, BuilderOptionSelectMapSerialisedSchema, BuilderOptionSerialisedSchema, BuilderOptionsSerialisedSchema, BuilderOptionWhenSerialisedSchema, BuilderPathSchema, BuilderPathsSchema, BuilderReferenceSchema, BuilderReferencesSchema, BuilderSchema, BuilderSelectConfigSchema, BuilderSelectConfigSerialisedSchema, BuilderSerialisedSchema, BuilderToggleConfigSchema, BuilderToggleConfigSerialisedSchema, BuilderUIDescribeSchema, BuilderUIDescribeSerialisedSchema, BuilderUIItemSerialisedSchema, BuilderUIItemsSerialisedSchema, BuilderUIPageSchema, BuilderUIPageSerialisedSchema, BuilderUIPagesSchema, BuilderUIPagesSerialisedSchema, BuilderUISchema, BuilderUISerialisedSchema, BuilderWhenConfigSchema, BuilderWhenEnableSchema, BuilderWhenMatchSchema, BuilderWhenUnlessSchema } from './entities/index.js';
2
2
  export { BuilderEnvironmentSchema } from './environment.js';
3
3
  export { BuilderComponentVariantsSchema, BuilderVariantsSchema } from './instance.js';
4
- export { BuilderPathSchema, BuilderPathsSchema } from './paths.js';
package/dist/private.js CHANGED
@@ -1,4 +1,3 @@
1
- export { BuilderCollectionConfigSchema, BuilderCollectionConfigSerialisedSchema, BuilderCollectionSchema, BuilderCollectionSelectMapSerialisedSchema, BuilderCollectionSerialisedSchema, BuilderCollectionsSerialisedSchema, BuilderCollectionWhenSerialisedSchema, BuilderComponentConfigSchema, BuilderComponentConfigSerialisedSchema, BuilderComponentFieldSchema, BuilderComponentFieldSerialisedSchema, BuilderComponentFieldsSchema, BuilderComponentFieldsSerialisedSchema, BuilderComponentFieldValueTypeSchema, BuilderComponentSchema, BuilderComponentSelectMapSerialisedSchema, BuilderComponentSerialisedSchema, BuilderComponentsSerialisedSchema, BuilderComponentWhenSerialisedSchema, BuilderDescriptionItemSchema, BuilderDescriptionSchema, BuilderEntityKindSchema, BuilderEntitySerialisedSchema, BuilderExpectationKindSchema, BuilderExpectationSchema, BuilderExpectationSerialisedSchema, BuilderExpectationsSchema, BuilderExpectationsSerialisedSchema, BuilderModelSchema, BuilderModelSerialisedSchema, BuilderOptionSchema, BuilderOptionSelectMapSerialisedSchema, BuilderOptionSerialisedSchema, BuilderOptionsSerialisedSchema, BuilderOptionConfigSchema, BuilderOptionConfigSerialisedSchema, BuilderOptionWhenSerialisedSchema, BuilderSchema, BuilderSelectConfigSchema, BuilderSelectConfigSerialisedSchema, BuilderSerialisedSchema, BuilderToggleConfigSchema, BuilderToggleConfigSerialisedSchema, BuilderUIDescribeSchema, BuilderUIDescribeSerialisedSchema, BuilderUIItemSerialisedSchema, BuilderUIItemsSerialisedSchema, BuilderUIPageSchema, BuilderUIPageSerialisedSchema, BuilderUIPagesSchema, BuilderUIPagesSerialisedSchema, BuilderUISchema, BuilderUISerialisedSchema, BuilderWhenConfigSchema, BuilderWhenEnableSchema, BuilderWhenMatchSchema, BuilderWhenUnlessSchema } from './entities/index.js';
1
+ export { BuilderCollectionConfigSchema, BuilderCollectionConfigSerialisedSchema, BuilderCollectionSchema, BuilderCollectionSelectMapSerialisedSchema, BuilderCollectionSerialisedSchema, BuilderCollectionsSerialisedSchema, BuilderCollectionWhenSerialisedSchema, BuilderComponentConfigSchema, BuilderComponentConfigSerialisedSchema, BuilderComponentFieldSchema, BuilderComponentFieldSerialisedSchema, BuilderComponentFieldsSchema, BuilderComponentFieldsSerialisedSchema, BuilderComponentFieldValueTypeSchema, BuilderComponentSchema, BuilderComponentSelectMapSerialisedSchema, BuilderComponentSerialisedSchema, BuilderComponentsSerialisedSchema, BuilderComponentWhenSerialisedSchema, BuilderDescriptionItemSchema, BuilderDescriptionSchema, BuilderEntityKindSchema, BuilderEntitySerialisedSchema, BuilderExpectationKindSchema, BuilderExpectationSchema, BuilderExpectationSerialisedSchema, BuilderExpectationsSchema, BuilderExpectationsSerialisedSchema, BuilderModelSchema, BuilderModelSerialisedSchema, BuilderOptionConfigSchema, BuilderOptionConfigSerialisedSchema, BuilderOptionSchema, BuilderOptionSelectMapSerialisedSchema, BuilderOptionSerialisedSchema, BuilderOptionsSerialisedSchema, BuilderOptionWhenSerialisedSchema, BuilderPathSchema, BuilderPathsSchema, BuilderReferenceSchema, BuilderReferencesSchema, BuilderSchema, BuilderSelectConfigSchema, BuilderSelectConfigSerialisedSchema, BuilderSerialisedSchema, BuilderToggleConfigSchema, BuilderToggleConfigSerialisedSchema, BuilderUIDescribeSchema, BuilderUIDescribeSerialisedSchema, BuilderUIItemSerialisedSchema, BuilderUIItemsSerialisedSchema, BuilderUIPageSchema, BuilderUIPageSerialisedSchema, BuilderUIPagesSchema, BuilderUIPagesSerialisedSchema, BuilderUISchema, BuilderUISerialisedSchema, BuilderWhenConfigSchema, BuilderWhenEnableSchema, BuilderWhenMatchSchema, BuilderWhenUnlessSchema } from './entities/index.js';
2
2
  export { BuilderEnvironmentSchema } from './environment.js';
3
3
  export { BuilderComponentVariantsSchema, BuilderVariantsSchema } from './instance.js';
4
- export { BuilderPathSchema, BuilderPathsSchema } from './paths.js';
@@ -1,5 +1,5 @@
1
1
  import * as v from 'valibot';
2
- import { check } from './check.js';
2
+ import { check } from './errors/index.js';
3
3
  export class BuilderParameter {
4
4
  id;
5
5
  name;
@@ -1,5 +1,4 @@
1
- import { BuilderException } from '../exception.js';
2
- import { BuilderValidateErrors } from './errors.js';
1
+ import { BuilderException, BuilderValidateErrors } from '../errors/index.js';
3
2
  const VALIDATED_ENTITIES = new WeakSet();
4
3
  export function validate(value) {
5
4
  VALIDATED_ENTITIES.add(value);
@@ -1,5 +1,4 @@
1
- import type { BuilderReferences, BuilderValidated } from '../entities/index';
2
- import type { ValidationResult } from './result';
3
- import { BuilderValidateErrors } from './errors.js';
1
+ import type { BuilderReferences, BuilderValidated, ValidationResult } from '../entities/index';
2
+ import { BuilderValidateErrors } from '../errors/index.js';
4
3
  export type BuilderValidationResult = ValidationResult<BuilderValidated>;
5
4
  export declare function validateBuilder(input: unknown, references?: BuilderReferences, errors?: BuilderValidateErrors): BuilderValidationResult;
@@ -1,7 +1,6 @@
1
- import { check } from '../check.js';
2
1
  import { builder, BuilderSerialisedSchema, modelsMerge, serialise } from '../entities/index.js';
2
+ import { BuilderValidateErrors, check } from '../errors/index.js';
3
3
  import { validate } from './brand.js';
4
- import { BuilderValidateErrors } from './errors.js';
5
4
  import { checkModelExpectations, validateModelStructure } from './model.js';
6
5
  import { checkPricingExpectations, validatePricingStructure } from './pricing.js';
7
6
  import { resolver } from './resolve.js';
@@ -9,7 +8,7 @@ import { checkUIExpectations, validateUIStructure } from './ui.js';
9
8
  const EMPTY_BUILDER = validate(serialise.builder(builder()));
10
9
  export function validateBuilder(input, references = [], errors = new BuilderValidateErrors()) {
11
10
  if (!check.is(BuilderSerialisedSchema, input)) {
12
- errors.invalidInput('builder');
11
+ errors.invalidEntity('builder');
13
12
  return [EMPTY_BUILDER, errors.errors];
14
13
  }
15
14
  const resolve = resolver(errors, references, input.bindings);
@@ -1,3 +1,3 @@
1
1
  import type { BuilderExpectationsSerialised, BuilderModelSerialised } from '../entities/index';
2
- import type { BuilderValidateErrors } from './errors';
2
+ import type { BuilderValidateErrors } from '../errors/index';
3
3
  export declare function checkExpectations(model: BuilderModelSerialised, expectations: BuilderExpectationsSerialised, errors: BuilderValidateErrors): void;
@@ -1,11 +1,13 @@
1
+ export type { BuilderValidatedMap, ValidationResult } from '../entities/index';
2
+ export type { BuilderErrorKind, BuilderValidateErrors } from '../errors/index';
1
3
  export type { BuilderValidatedBrand } from './brand';
2
4
  export type { BuilderValidationResult } from './builder';
3
- export type { BuilderErrorDuplicateName, BuilderErrorInvalidCollection, BuilderErrorInvalidCollectionBounds, BuilderErrorInvalidDetail, BuilderErrorInvalidInput, BuilderErrorInvalidOption, BuilderErrorInvalidPath, BuilderErrorInvalidPathReason, BuilderErrorInvalidPricing, BuilderErrorInvalidSelectMapKey, BuilderErrorInvalidPricingReason, BuilderErrorInvalidVariant, BuilderErrorMissingComponent, BuilderErrorMissingDetail, BuilderErrorMissingRate, BuilderErrorMissingReference, BuilderErrorMissingVariant, BuilderErrorUnboundParameter, BuilderErrorUnexpectedComponent, BuilderErrorUnexpectedDetail, BuilderErrorUnmetExpectation, BuilderErrorUnvalidated, BuilderInvalidInputTarget } from './errors';
4
5
  export type { BuilderInstanceValidationResult } from './instance';
5
6
  export type { BuilderModelValidationResult } from './model';
6
7
  export type { BuilderPricingValidationResult } from './pricing';
7
8
  export type { BuilderUIValidationResult } from './ui';
8
- export type { BuilderComponentVariantsValidationResult, BuilderVariantsValidationOptions } from './variants';
9
+ export type { BuilderVariantsValidationOptions, BuilderVariantsValidationResult } from './variants';
10
+ export { createEntityValidator } from '../entities/index.js';
9
11
  export { assertValidated } from './brand.js';
10
12
  export { validateBuilder } from './builder.js';
11
13
  export { validateInstance } from './instance.js';
@@ -1,3 +1,4 @@
1
+ export { createEntityValidator } from '../entities/index.js';
1
2
  export { assertValidated } from './brand.js';
2
3
  export { validateBuilder } from './builder.js';
3
4
  export { validateInstance } from './instance.js';
@@ -1,6 +1,5 @@
1
- import type { BuilderInstanceValidated, BuilderModelValidated } from '../entities/index';
1
+ import type { BuilderInstanceValidated, BuilderModelValidated, ValidationResult } from '../entities/index';
2
2
  import type { BuilderInstance } from '../instance';
3
- import type { ValidationResult } from './result';
4
- import { BuilderValidateErrors } from './errors.js';
3
+ import { BuilderValidateErrors } from '../errors/index.js';
5
4
  export type BuilderInstanceValidationResult = ValidationResult<BuilderInstanceValidated>;
6
5
  export declare function validateInstance(model: BuilderModelValidated, instance: BuilderInstance, errors?: BuilderValidateErrors): BuilderInstanceValidationResult;
@@ -1,9 +1,8 @@
1
- import { check } from '../check.js';
2
1
  import { optionValueSchema } from '../entities/index.js';
2
+ import { BuilderValidateErrors, check } from '../errors/index.js';
3
3
  import { BuilderInstancesSchema } from '../instance.js';
4
4
  import { resolveCollection, resolveOption } from '../mappers/index.js';
5
5
  import { validate } from './brand.js';
6
- import { BuilderValidateErrors } from './errors.js';
7
6
  export function validateInstance(model, instance, errors = new BuilderValidateErrors()) {
8
7
  errors.scope('instance', () => {
9
8
  checkInstance(model, instance);
@@ -1,8 +1,7 @@
1
- import type { BuilderModelSerialised, BuilderModelValidated, BuilderReferences } from '../entities/index';
1
+ import type { BuilderModelSerialised, BuilderModelValidated, BuilderReferences, ValidationResult } from '../entities/index';
2
2
  import type { ParamableSerialised } from '../references';
3
3
  import type { BuilderResolve } from './resolve';
4
- import type { ValidationResult } from './result';
5
- import { BuilderValidateErrors } from './errors.js';
4
+ import { BuilderValidateErrors } from '../errors/index.js';
6
5
  export type BuilderModelValidationResult = ValidationResult<BuilderModelValidated>;
7
6
  export declare function validateModel(input: unknown, references?: BuilderReferences, errors?: BuilderValidateErrors): BuilderModelValidationResult;
8
7
  export declare function checkModelExpectations(mergedModel: BuilderModelSerialised, rootModel: BuilderModelSerialised, errors: BuilderValidateErrors): void;
@@ -1,15 +1,14 @@
1
- import { check } from '../check.js';
2
- import { BuilderModelSerialisedSchema, BuilderWhenSerialisedSchema, model, modelsMerge, serialise } from '../entities/index.js';
3
- import { resolveCollections } from '../mappers/index.js';
1
+ import { BuilderCollectionConfigSerialisedSchema, BuilderComponentConfigSerialisedSchema, BuilderModelSerialisedSchema, BuilderOptionConfigSerialisedSchema, BuilderWhenSerialisedSchema, whenBranches, model, modelsMerge, serialise, validateCollectionConfig, validateComponentConfig, validateSelect, validateToggle } from '../entities/index.js';
2
+ import { BuilderValidateErrors, check } from '../errors/index.js';
3
+ import { isParamable } from '../references.js';
4
4
  import { validate } from './brand.js';
5
- import { BuilderValidateErrors } from './errors.js';
6
5
  import { checkExpectations } from './expectations.js';
7
6
  import { checkPath } from './paths.js';
8
7
  import { resolver } from './resolve.js';
9
8
  const EMPTY_MODEL = validate(serialise.model(model()));
10
9
  export function validateModel(input, references = [], errors = new BuilderValidateErrors()) {
11
10
  if (!check.is(BuilderModelSerialisedSchema, input)) {
12
- errors.invalidInput('model');
11
+ errors.invalidEntity('model');
13
12
  return [EMPTY_MODEL, errors.errors];
14
13
  }
15
14
  const resolve = resolver(errors, references);
@@ -41,9 +40,32 @@ export function validateModelStructure(input, resolve, errors) {
41
40
  const modelInput = resolved;
42
41
  const skipPathValidation = modelInput.expectations.length > 0;
43
42
  const childModels = errors.scope('models', () => modelInput.models.flatMap((part, partIndex) => errors.scope(partIndex, () => [validateModelStructure(part, resolve, errors)])));
44
- const options = walkEntries(modelInput.options, 'option');
45
- const components = walkEntries(modelInput.components, 'component');
46
- const collections = walkCollections();
43
+ const options = errors.scope('options', () => walkEntries(modelInput.options, (resolved) => {
44
+ whenBranches(resolved.payload, BuilderOptionConfigSerialisedSchema)
45
+ .filter((config) => !isParamable(config))
46
+ .forEach((config) => {
47
+ if (config.type === 'select') {
48
+ validateSelect(config, [], errors);
49
+ }
50
+ else if (config.type === 'toggle') {
51
+ validateToggle(config, [], errors);
52
+ }
53
+ });
54
+ }));
55
+ const components = errors.scope('components', () => walkEntries(modelInput.components, (resolved) => {
56
+ whenBranches(resolved.payload, BuilderComponentConfigSerialisedSchema)
57
+ .filter((config) => !isParamable(config))
58
+ .forEach((config) => {
59
+ validateComponentConfig(config, [], errors);
60
+ });
61
+ }));
62
+ const collections = errors.scope('collections', () => walkEntries(modelInput.collections, (resolved) => {
63
+ whenBranches(resolved.payload, BuilderCollectionConfigSerialisedSchema)
64
+ .filter((config) => !isParamable(config))
65
+ .forEach((config) => {
66
+ validateCollectionConfig(config, [], errors);
67
+ });
68
+ }));
47
69
  return {
48
70
  ...modelInput,
49
71
  models: childModels,
@@ -51,34 +73,17 @@ export function validateModelStructure(input, resolve, errors) {
51
73
  components,
52
74
  collections
53
75
  };
54
- function walkEntries(entries, entryKind) {
76
+ function walkEntries(entries, validateBranches) {
55
77
  const seen = new Set();
56
78
  const items = [];
57
- errors.scope(`${entryKind}s`, () => {
58
- entries.forEach((entry, entryIndex) => {
59
- errors.scope(entryIndex, () => {
60
- const resolved = resolveEntry(entry, seen);
61
- if (resolved != null) {
62
- items.push(resolved);
63
- }
64
- });
65
- });
66
- });
67
- return items;
68
- }
69
- function walkCollections() {
70
- const seen = new Set();
71
- const items = [];
72
- errors.scope('collections', () => {
73
- modelInput.collections.forEach((entry, entryIndex) => {
74
- errors.scope(entryIndex, () => {
75
- const resolved = resolveEntry(entry, seen);
76
- if (resolved == null) {
77
- return;
78
- }
79
- checkCollectionBounds(resolved);
80
- items.push(resolved);
81
- });
79
+ entries.forEach((entry, entryIndex) => {
80
+ errors.scope(entryIndex, () => {
81
+ const resolved = resolveEntry(entry, seen);
82
+ if (resolved == null) {
83
+ return;
84
+ }
85
+ validateBranches(resolved);
86
+ items.push(resolved);
82
87
  });
83
88
  });
84
89
  return items;
@@ -135,14 +140,4 @@ export function validateModelStructure(input, resolve, errors) {
135
140
  });
136
141
  }
137
142
  }
138
- function checkCollectionBounds(collection) {
139
- resolveCollections(collection).forEach(({ min, max }) => {
140
- if (typeof min !== 'number' || typeof max !== 'number') {
141
- return;
142
- }
143
- if (min < 0 || max <= 0 || max < min) {
144
- errors.invalidCollectionBounds(collection.name, min, max);
145
- }
146
- });
147
- }
148
143
  }
@@ -1,4 +1,3 @@
1
- import type { BuilderModelSerialised } from '../entities/index';
2
- import type { BuilderPath } from '../paths';
3
- import type { BuilderValidateErrors } from './errors';
1
+ import type { BuilderModelSerialised, BuilderPath } from '../entities/index';
2
+ import type { BuilderValidateErrors } from '../errors/index';
4
3
  export declare function checkPath(model: BuilderModelSerialised, path: BuilderPath, errors: BuilderValidateErrors): void;
@@ -1,6 +1,6 @@
1
1
  import * as v from 'valibot';
2
- import { check } from '../check.js';
3
2
  import { BuilderModelSerialisedSchema } from '../entities/index.js';
3
+ import { check } from '../errors/index.js';
4
4
  import { resolveCollections } from '../mappers/index.js';
5
5
  const NumberSchema = v.number();
6
6
  const StringSchema = v.string();
@@ -1,7 +1,6 @@
1
- import type { BuilderModelSerialised, BuilderPricingSerialised, BuilderPricingValidated, BuilderReferences } from '../entities/index';
1
+ import type { BuilderModelSerialised, BuilderPricingSerialised, BuilderPricingValidated, BuilderReferences, ValidationResult } from '../entities/index';
2
2
  import type { BuilderResolve } from './resolve';
3
- import type { ValidationResult } from './result';
4
- import { BuilderValidateErrors } from './errors.js';
3
+ import { BuilderValidateErrors } from '../errors/index.js';
5
4
  export type BuilderPricingValidationResult = ValidationResult<BuilderPricingValidated>;
6
5
  export declare function validatePricing(input: unknown, references?: BuilderReferences, errors?: BuilderValidateErrors): BuilderPricingValidationResult;
7
6
  export declare function validatePricingStructure(input: BuilderPricingSerialised, resolve: BuilderResolve, errors: BuilderValidateErrors): BuilderPricingSerialised;
@@ -1,14 +1,13 @@
1
1
  import * as v from 'valibot';
2
- import { check } from '../check.js';
3
2
  import { BuilderPricingExpressionSchema, BuilderPricingSerialisedSchema, BuilderRatesSchema, pricing, serialise } from '../entities/index.js';
3
+ import { BuilderValidateErrors, check } from '../errors/index.js';
4
4
  import { validate } from './brand.js';
5
- import { BuilderValidateErrors } from './errors.js';
6
5
  import { resolver } from './resolve.js';
7
6
  const EMPTY_PRICING = validate(serialise.pricing(pricing()));
8
7
  const NumberSchema = v.number();
9
8
  export function validatePricing(input, references = [], errors = new BuilderValidateErrors()) {
10
9
  if (!check.is(BuilderPricingSerialisedSchema, input)) {
11
- errors.invalidInput('pricing');
10
+ errors.invalidEntity('pricing');
12
11
  return [EMPTY_PRICING, errors.errors];
13
12
  }
14
13
  const resolve = resolver(errors, references);
@@ -1,4 +1,4 @@
1
1
  import type { BuilderBindings, BuilderReferences } from '../entities/index';
2
- import type { BuilderValidateErrors } from './errors';
2
+ import type { BuilderValidateErrors } from '../errors/index';
3
3
  export type BuilderResolve = (value: unknown) => unknown;
4
4
  export declare function resolver(errors: BuilderValidateErrors, references?: BuilderReferences, bindings?: BuilderBindings): BuilderResolve;
@@ -1,5 +1,5 @@
1
- import { check } from '../check.js';
2
1
  import { BuilderCollectionConfigSerialisedSchema, BuilderModelSerialisedSchema, BuilderWhenSerialisedSchema } from '../entities/index.js';
2
+ import { check } from '../errors/index.js';
3
3
  import { BuilderParameterSerialisedSchema, BuilderRefSerialisedSchema } from '../references.js';
4
4
  import { validateModelStructure } from './model.js';
5
5
  export function resolver(errors, references = [], bindings = {}) {
@@ -1,7 +1,6 @@
1
- import type { BuilderModelSerialised, BuilderReferences, BuilderUISerialised, BuilderUIValidated } from '../entities/index';
1
+ import type { BuilderModelSerialised, BuilderReferences, BuilderUISerialised, BuilderUIValidated, ValidationResult } from '../entities/index';
2
2
  import type { BuilderResolve } from './resolve';
3
- import type { ValidationResult } from './result';
4
- import { BuilderValidateErrors } from './errors.js';
3
+ import { BuilderValidateErrors } from '../errors/index.js';
5
4
  export type BuilderUIValidationResult = ValidationResult<BuilderUIValidated>;
6
5
  export declare function validateUI(input: unknown, references?: BuilderReferences, errors?: BuilderValidateErrors): BuilderUIValidationResult;
7
6
  export declare function validateUIStructure(ui: BuilderUISerialised, resolve: BuilderResolve, errors: BuilderValidateErrors): BuilderUIValidated;
@@ -1,14 +1,13 @@
1
- import { check } from '../check.js';
2
- import { BuilderModelSerialisedSchema, BuilderUIInputMetadataSchema, BuilderUISerialisedSchema, modelsMerge, serialise, uis } from '../entities/index.js';
1
+ import { BuilderModelSerialisedSchema, BuilderUIInputMetadataSchema, BuilderUISerialisedSchema, modelsMerge, serialise, uis, validateUIDescribe, validateUIInput, validateUIPage, validateUIPages } from '../entities/index.js';
2
+ import { BuilderValidateErrors, check } from '../errors/index.js';
3
3
  import { resolveCollections } from '../mappers/index.js';
4
4
  import { validate } from './brand.js';
5
- import { BuilderValidateErrors } from './errors.js';
6
5
  import { checkExpectations } from './expectations.js';
7
6
  import { checkPath } from './paths.js';
8
7
  import { resolver } from './resolve.js';
9
8
  export function validateUI(input, references = [], errors = new BuilderValidateErrors()) {
10
9
  if (!check.is(BuilderUISerialisedSchema, input)) {
11
- errors.invalidInput('ui');
10
+ errors.invalidEntity('ui');
12
11
  return [validate(serialise.ui(uis())), errors.errors];
13
12
  }
14
13
  const resolve = resolver(errors, references);
@@ -40,6 +39,15 @@ export function validateUIStructure(ui, resolve, errors) {
40
39
  }));
41
40
  }
42
41
  function walkUIItem(item) {
42
+ if (item.type === 'page') {
43
+ validateUIPage(item, [], errors);
44
+ }
45
+ else if (item.type === 'pages') {
46
+ validateUIPages(item, [], errors);
47
+ }
48
+ else if (item.type === 'describe') {
49
+ validateUIDescribe(item, [], errors);
50
+ }
43
51
  const label = errors.scope('label', () => resolve(item.label) ?? item.label);
44
52
  if (item.type === 'pages') {
45
53
  const innerItems = errors.scope('items', () => {
@@ -65,6 +73,7 @@ export function validateUIStructure(ui, resolve, errors) {
65
73
  }));
66
74
  }
67
75
  function walkInput(value) {
76
+ validateUIInput(value, [], errors);
68
77
  const path = errors.scope('path', () => resolve(value.path) ?? value.path);
69
78
  const displayName = value.displayName &&
70
79
  errors.scope('displayName', () => resolve(value.displayName) ?? value.displayName);
@@ -1,8 +1,7 @@
1
- import type { BuilderComponentVariantsValidated, BuilderModelValidated } from '../entities/index';
2
- import type { ValidationResult } from './result';
3
- import { BuilderValidateErrors } from './errors.js';
1
+ import type { BuilderModelValidated, BuilderVariantsValidated, ValidationResult } from '../entities/index';
2
+ import { BuilderValidateErrors } from '../errors/index.js';
4
3
  export type BuilderVariantsValidationOptions = {
5
4
  readonly partial?: boolean;
6
5
  };
7
- export type BuilderComponentVariantsValidationResult = ValidationResult<BuilderComponentVariantsValidated>;
8
- export declare function validateVariants(model: BuilderModelValidated, input: unknown, options?: BuilderVariantsValidationOptions, errors?: BuilderValidateErrors): BuilderComponentVariantsValidationResult;
6
+ export type BuilderVariantsValidationResult = ValidationResult<BuilderVariantsValidated>;
7
+ export declare function validateVariants(model: BuilderModelValidated, input: unknown, options?: BuilderVariantsValidationOptions, errors?: BuilderValidateErrors): BuilderVariantsValidationResult;
@@ -1,12 +1,11 @@
1
- import { check } from '../check.js';
2
1
  import { BuilderComponentConfigSerialisedSchema, detailValueSchema } from '../entities/index.js';
3
- import { BuilderComponentVariantsSchema } from '../instance.js';
2
+ import { BuilderValidateErrors, check } from '../errors/index.js';
3
+ import { BuilderVariantsSchema } from '../instance.js';
4
4
  import { createVariants } from '../mappers/index.js';
5
5
  import { validate } from './brand.js';
6
- import { BuilderValidateErrors } from './errors.js';
7
6
  export function validateVariants(model, input, options = {}, errors = new BuilderValidateErrors()) {
8
- if (!check.is(BuilderComponentVariantsSchema, input)) {
9
- errors.invalidInput('variants');
7
+ if (!check.is(BuilderVariantsSchema, input)) {
8
+ errors.invalidVariants();
10
9
  return [validate({}), errors.errors];
11
10
  }
12
11
  const variants = input;