@builder-builder/builder 0.0.27 → 0.0.29

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 (132) hide show
  1. package/dist/bb.js +9 -10
  2. package/dist/client/client.d.ts +2 -1
  3. package/dist/client/client.js +4 -1
  4. package/dist/client/public.d.ts +2 -2
  5. package/dist/client/public.js +1 -1
  6. package/dist/client/schema.d.ts +126 -45
  7. package/dist/client/schema.js +6 -1
  8. package/dist/components/BuilderOption.svelte.d.ts +12 -12
  9. package/dist/components/BuilderOptionValueBoolean.svelte.d.ts +20 -0
  10. package/dist/components/BuilderOptionValueNumber.svelte.d.ts +21 -0
  11. package/dist/components/BuilderOptionValueSelect.svelte.d.ts +21 -0
  12. package/dist/components/BuilderOptionValueString.svelte.d.ts +21 -0
  13. package/dist/components/BuilderRender.svelte.d.ts +2 -2
  14. package/dist/components/index.d.ts +8 -8
  15. package/dist/components/index.js +4376 -4258
  16. package/dist/components/index.min.js +3 -0
  17. package/dist/entities/collection/collection.d.ts +191 -401
  18. package/dist/entities/collection/collection.js +7 -4
  19. package/dist/entities/collection/{when.d.ts → condition.d.ts} +4 -5
  20. package/dist/entities/collection/condition.js +2 -0
  21. package/dist/entities/collection/config.d.ts +62 -80
  22. package/dist/entities/collection/index.d.ts +4 -4
  23. package/dist/entities/collection/index.js +2 -2
  24. package/dist/entities/component/component.d.ts +71 -83
  25. package/dist/entities/component/component.js +4 -4
  26. package/dist/entities/component/condition.d.ts +10 -0
  27. package/dist/entities/component/{when.js → condition.js} +3 -9
  28. package/dist/entities/component/config.d.ts +33 -33
  29. package/dist/entities/component/config.js +18 -16
  30. package/dist/entities/component/detail.d.ts +61 -0
  31. package/dist/entities/component/detail.js +71 -0
  32. package/dist/entities/component/index.d.ts +6 -6
  33. package/dist/entities/component/index.js +3 -3
  34. package/dist/entities/{when.d.ts → condition.d.ts} +23 -36
  35. package/dist/entities/{when.js → condition.js} +20 -25
  36. package/dist/entities/expectation.d.ts +135 -3
  37. package/dist/entities/expectation.js +6 -2
  38. package/dist/entities/index.d.ts +9 -9
  39. package/dist/entities/index.js +4 -4
  40. package/dist/entities/kind.d.ts +4 -4
  41. package/dist/entities/kind.js +24 -25
  42. package/dist/entities/model/bind.d.ts +5 -5
  43. package/dist/entities/model/methods.d.ts +18 -27
  44. package/dist/entities/model/methods.js +4 -22
  45. package/dist/entities/model/model.d.ts +3 -1
  46. package/dist/entities/model/model.js +25 -27
  47. package/dist/entities/option/condition.d.ts +9 -0
  48. package/dist/entities/option/condition.js +2 -0
  49. package/dist/entities/option/config.d.ts +47 -72
  50. package/dist/entities/option/config.js +6 -6
  51. package/dist/entities/option/expectation.d.ts +6 -1
  52. package/dist/entities/option/expectation.js +2 -2
  53. package/dist/entities/option/index.d.ts +8 -8
  54. package/dist/entities/option/index.js +4 -4
  55. package/dist/entities/option/option.d.ts +179 -210
  56. package/dist/entities/option/option.js +4 -4
  57. package/dist/entities/option/select.d.ts +16 -43
  58. package/dist/entities/option/select.js +8 -31
  59. package/dist/entities/option/value.d.ts +73 -0
  60. package/dist/entities/option/value.js +99 -0
  61. package/dist/entities/paths.d.ts +2 -2
  62. package/dist/entities/pricing/expression.d.ts +16 -39
  63. package/dist/entities/pricing/expression.js +1 -16
  64. package/dist/entities/pricing/index.d.ts +1 -1
  65. package/dist/entities/pricing/rates.d.ts +1 -1
  66. package/dist/entities/references.d.ts +124 -84
  67. package/dist/entities/serialise.d.ts +175 -109
  68. package/dist/entities/serialise.js +32 -27
  69. package/dist/entities/ui/describe.d.ts +1 -1
  70. package/dist/entities/ui/input.d.ts +2 -2
  71. package/dist/entities/ui/page.d.ts +1 -1
  72. package/dist/entities/ui/pages.d.ts +2 -2
  73. package/dist/entities/validated.d.ts +3 -3
  74. package/dist/environment.d.ts +2 -2
  75. package/dist/errors/errors.d.ts +94 -58
  76. package/dist/errors/errors.js +41 -7
  77. package/dist/errors/exception.d.ts +3 -3
  78. package/dist/errors/index.d.ts +1 -1
  79. package/dist/errors/index.js +1 -1
  80. package/dist/errors/public.d.ts +1 -1
  81. package/dist/index.d.ts +1 -1
  82. package/dist/index.js +1 -1
  83. package/dist/instance.d.ts +53 -9
  84. package/dist/instance.js +6 -2
  85. package/dist/mappers/dependencies.d.ts +3 -0
  86. package/dist/mappers/dependencies.js +45 -0
  87. package/dist/mappers/index.d.ts +2 -2
  88. package/dist/mappers/index.js +2 -1
  89. package/dist/mappers/instance.js +26 -21
  90. package/dist/mappers/price.js +6 -4
  91. package/dist/mappers/resolve.js +23 -22
  92. package/dist/mappers/variants/index.d.ts +1 -2
  93. package/dist/mappers/variants/index.js +1 -2
  94. package/dist/mappers/variants/option-graph.d.ts +1 -2
  95. package/dist/mappers/variants/option-graph.js +4 -18
  96. package/dist/mappers/variants/variants.d.ts +3 -6
  97. package/dist/mappers/variants/variants.js +34 -11
  98. package/dist/primitive.d.ts +3 -0
  99. package/dist/primitive.js +2 -0
  100. package/dist/public.d.ts +20 -20
  101. package/dist/public.js +17 -9
  102. package/dist/validate/builder.d.ts +2 -2
  103. package/dist/validate/builder.js +15 -15
  104. package/dist/validate/expectations.d.ts +2 -2
  105. package/dist/validate/expectations.js +23 -5
  106. package/dist/validate/instance.d.ts +2 -2
  107. package/dist/validate/instance.js +31 -13
  108. package/dist/validate/model.d.ts +4 -4
  109. package/dist/validate/model.js +57 -51
  110. package/dist/validate/paths.d.ts +2 -2
  111. package/dist/validate/paths.js +19 -14
  112. package/dist/validate/pricing.d.ts +4 -4
  113. package/dist/validate/pricing.js +31 -31
  114. package/dist/validate/resolve.d.ts +2 -2
  115. package/dist/validate/resolve.js +27 -31
  116. package/dist/validate/ui.d.ts +4 -4
  117. package/dist/validate/ui.js +38 -38
  118. package/dist/validate/variants.d.ts +3 -3
  119. package/dist/validate/variants.js +32 -31
  120. package/package.json +4 -2
  121. package/dist/components/BuilderOptionSelect.svelte.d.ts +0 -21
  122. package/dist/components/BuilderOptionToggleBoolean.svelte.d.ts +0 -20
  123. package/dist/components/BuilderOptionToggleNumber.svelte.d.ts +0 -21
  124. package/dist/components/BuilderOptionToggleString.svelte.d.ts +0 -21
  125. package/dist/entities/collection/when.js +0 -2
  126. package/dist/entities/component/field.d.ts +0 -59
  127. package/dist/entities/component/field.js +0 -52
  128. package/dist/entities/component/when.d.ts +0 -11
  129. package/dist/entities/option/toggle.d.ts +0 -45
  130. package/dist/entities/option/toggle.js +0 -66
  131. package/dist/entities/option/when.d.ts +0 -10
  132. package/dist/entities/option/when.js +0 -2
package/dist/public.d.ts CHANGED
@@ -1,37 +1,37 @@
1
1
  export type { BB, BBOptions, BuilderEntityValidators } from './bb';
2
- export type { Builder, BuilderBindings, BuilderBindingsSerialised, BuilderCollection, BuilderCollectionConfig, BuilderCollectionConfigSerialised, BuilderCollections, BuilderCollectionSerialised, BuilderCollectionsSerialised, BuilderCollectionWhen, BuilderCollectionWhenSerialised, BuilderComponent, BuilderComponentConfig, BuilderComponentConfigSerialised, BuilderComponentField, BuilderComponentFields, BuilderComponentFieldSerialised, BuilderComponentFieldsSerialised, BuilderComponentFieldValueType, BuilderComponents, BuilderComponentSerialised, BuilderComponentsSerialised, BuilderComponentWhen, BuilderComponentWhenSerialised, BuilderDescription, BuilderDescriptionItem, BuilderEnableConfig, BuilderEntityKind, BuilderEntitySerialised, BuilderExpectation, BuilderExpectationKind, BuilderExpectations, BuilderExpectationSerialised, BuilderExpectationsSerialised, BuilderInstanceOf, BuilderInstanceValidated, BuilderMatchConfig, BuilderMatchSelectMap, BuilderModel, BuilderModels, BuilderModelSerialised, BuilderModelValidated, BuilderOption, BuilderOptionConfig, BuilderOptionConfigSerialised, BuilderOptions, BuilderOptionSerialised, BuilderOptionsSerialised, BuilderOptionWhen, BuilderOptionWhenSerialised, BuilderPath, BuilderPaths, BuilderPricing, BuilderPricingExpression, BuilderPricingLookupKey, BuilderPricingReduce, BuilderPricingSerialised, BuilderReference, BuilderReferences, BuilderSelectConfig, BuilderSelectConfigLabels, BuilderSelectConfigSerialised, BuilderSelectConfigValues, BuilderSerialised, BuilderTags, BuilderToggleConfig, BuilderToggleConfigSerialised, BuilderToggleValueType, BuilderUI, BuilderUIDescribe, BuilderUIDescribeSerialised, BuilderUIInput, BuilderUIInputMetadata, BuilderUIInputMetadataSerialised, BuilderUIInputs, BuilderUIInputSerialised, BuilderUIInputsSerialised, BuilderUIItem, BuilderUIItems, BuilderUIItemsSerialised, BuilderUIPage, BuilderUIPages, BuilderUIPageSerialised, BuilderUIPagesSerialised, BuilderUIs, BuilderUISerialised, BuilderUIsSerialised, BuilderUIValidated, BuilderUnlessConfig, BuilderValidated, BuilderVariantsValidated, BuilderWhen, BuilderWhenConfig, BuilderWhenSerialised } from './entities/index';
2
+ export type { Builder, BuilderBindings, BuilderBindingsSerialised, BuilderCollection, BuilderCollectionConfig, BuilderCollectionConfigSerialised, BuilderCollections, BuilderCollectionSerialised, BuilderCollectionsSerialised, BuilderCollectionCondition, BuilderCollectionConditionSerialised, BuilderComponent, BuilderComponentConfig, BuilderComponentConfigSerialised, BuilderComponentDetail, BuilderComponentDetailKind, BuilderComponentDetails, BuilderComponentDetailSerialised, BuilderComponentDetailsSerialised, BuilderComponents, BuilderComponentSerialised, BuilderComponentsSerialised, BuilderComponentCondition, BuilderComponentConditionSerialised, BuilderDescription, BuilderDescriptionItem, BuilderEntityKind, BuilderEntitySerialised, BuilderExpectation, BuilderExpectationKind, BuilderExpectations, BuilderExpectationSerialised, BuilderExpectationsSerialised, BuilderInstanceOf, BuilderInstanceValidated, BuilderMatchConfig, BuilderMatchSelectMap, BuilderModel, BuilderModels, BuilderModelSerialised, BuilderModelValidated, BuilderOption, BuilderOptionConfig, BuilderOptionConfigSerialised, BuilderOptions, BuilderOptionSerialised, BuilderOptionsSerialised, BuilderOptionCondition, BuilderOptionConditionSerialised, BuilderPath, BuilderPaths, BuilderPricing, BuilderPricingExpression, BuilderPricingLookupKey, BuilderPricingReduce, BuilderPricingSerialised, BuilderReference, BuilderReferences, BuilderSelectConfig, BuilderSerialised, BuilderTags, BuilderValueConfig, BuilderValueConfigSerialised, BuilderValueKind, BuilderValueOptionLabels, BuilderValueOptions, BuilderUI, BuilderUIDescribe, BuilderUIDescribeSerialised, BuilderUIInput, BuilderUIInputMetadata, BuilderUIInputMetadataSerialised, BuilderUIInputs, BuilderUIInputSerialised, BuilderUIInputsSerialised, BuilderUIItem, BuilderUIItems, BuilderUIItemsSerialised, BuilderUIPage, BuilderUIPages, BuilderUIPageSerialised, BuilderUIPagesSerialised, BuilderUIs, BuilderUISerialised, BuilderUIsSerialised, BuilderUIValidated, BuilderUnlessConfig, BuilderValidated, BuilderVariantsValidated, BuilderCondition, BuilderConditionConfig, BuilderConditionSerialised } from './entities/index';
3
3
  export type { BuilderEnvironment } from './environment';
4
- export type { BuilderError, BuilderErrorLocation, BuilderErrors } from './errors/index';
5
- export type { BuilderErrorKind } from './errors/index.js';
6
- export type { BuilderComponentVariant, BuilderComponentVariants, BuilderInstance, BuilderInstanceInput, BuilderInstances, BuilderVariants } from './instance';
4
+ export type { BuilderIssue, BuilderIssueLocation, BuilderIssues } from './errors/index';
5
+ export type { BuilderIssueKind } from './errors/index.js';
6
+ export type { BuilderComponentVariant, BuilderComponentVariants, BuilderInstance, BuilderInstanceInput, BuilderInstances, BuilderVariantDetail, BuilderVariants } from './instance';
7
7
  export type { BuilderOrder, BuilderRenderCollection, BuilderRenderCollectionAddRemove, BuilderRenderCollections, BuilderRenderMetadata, BuilderRenderOption, BuilderRenderOptions, BuilderRenderOptionUpdate, BuilderRenderPage, BuilderRenderPages, BuilderRenderResult } from './mappers/index';
8
8
  export type { BuilderPrimitive, BuilderPrimitives } from './primitive';
9
9
  export type { BuilderParameter, BuilderParameterSerialised, BuilderRef, Paramable, ParamableSerialised } from './references';
10
10
  export type { BuilderInstanceValidationResult, BuilderModelValidationResult, BuilderPricingValidationResult, BuilderUIValidationResult, BuilderValidationResult, BuilderVariantsValidationOptions, BuilderVariantsValidationResult } from './validate/index';
11
11
  export { bb } from './bb.js';
12
- export { builder, detailBoolean, detailNumber, detailString, input, model, pricing, select, serialise, toggleBoolean, toggleNumber, toggleString } from './entities/index.js';
12
+ export { builder, input, match, model, pricing, serialise, unless } from './entities/index.js';
13
13
  export { BuilderException } from './errors/index.js';
14
14
  export { ordinal } from './mappers/index.js';
15
15
  export { parameter, ref } from './references.js';
16
- import { collectionConfig, collectionExpectation, componentConfig, componentExpectation, optionExpectation, uis } from './entities/index.js';
17
- export declare const collection: typeof collectionConfig & {
18
- enable: <const Values extends import("./references").Paramable<import("./public").BuilderCollectionConfig<import("./references").Paramable<import("./entities/model").BuilderModelGeneric>, import("./references").Paramable<number>, import("./references").Paramable<number>>>>(values: Values) => import("./public").BuilderEnableConfig<Values>;
19
- match: <const MatchPayload extends import("./references").Paramable<import("./public").BuilderCollectionConfig<import("./references").Paramable<import("./entities/model").BuilderModelGeneric>, import("./references").Paramable<number>, import("./references").Paramable<number>>>, const MatchPath extends import("./references").Paramable<import("./public").BuilderPath>, const SelectMap extends import("./references").Paramable<import("./public").BuilderMatchSelectMap<import("./references").Paramable<import("./public").BuilderCollectionConfig<import("./references").Paramable<import("./entities/model").BuilderModelGeneric>, import("./references").Paramable<number>, import("./references").Paramable<number>>>>>>(matchPath: MatchPath, selectMap: SelectMap) => import("./public").BuilderMatchConfig<MatchPayload, MatchPath, SelectMap>;
20
- unless: <const Values extends import("./references").Paramable<import("./public").BuilderCollectionConfig<import("./references").Paramable<import("./entities/model").BuilderModelGeneric>, import("./references").Paramable<number>, import("./references").Paramable<number>>>, const UnlessPath extends import("./references").Paramable<import("./public").BuilderPath>>(unlessPath: UnlessPath, disabledValues: import("./primitive").BuilderPrimitives, values: Values) => import("./public").BuilderUnlessConfig<Values, UnlessPath>;
21
- };
22
- export declare const component: typeof componentConfig & {
23
- enable: <const Payload extends import("./references").Paramable<import("./public").BuilderComponentConfig>>(payload?: Payload) => import("./public").BuilderEnableConfig<Payload>;
24
- match: <const Payload extends import("./references").Paramable<import("./public").BuilderComponentConfig>, const MatchPath extends import("./references").Paramable<import("./public").BuilderPath>, const SelectMap extends import("./references").Paramable<import("./public").BuilderMatchSelectMap<import("./references").Paramable<import("./public").BuilderComponentConfig>>>>(matchPath: MatchPath, selectMap: SelectMap) => import("./public").BuilderMatchConfig<Payload, MatchPath, SelectMap>;
25
- unless: <const UnlessPath extends import("./references").Paramable<import("./public").BuilderPath>, const Payload extends import("./references").Paramable<import("./public").BuilderComponentConfig>>(unlessPath: UnlessPath, disabledValues: import("./primitive").BuilderPrimitives, payload?: Payload) => import("./public").BuilderUnlessConfig<Payload, UnlessPath>;
26
- };
16
+ import { collectionConfig, collectionExpectation, componentConfig, componentExpectation, detailBoolean, detailImage, detailNumber, detailPrice, detailString, optionExpectation, valueBoolean, valueNumber, valueSelect, valueString, uis } from './entities/index.js';
17
+ export declare const collection: typeof collectionConfig;
18
+ export declare const component: typeof componentConfig;
27
19
  export declare const has: {
28
20
  collection: typeof collectionExpectation;
29
21
  component: typeof componentExpectation;
30
22
  option: typeof optionExpectation;
31
23
  };
32
- export declare const option: {
33
- enable: <const Values extends import("./references").Paramable<import("./public").BuilderSelectConfig<readonly [string, ...string[]], import("valibot").GenericSchema<string | null>> | import("./public").BuilderToggleConfig<import("valibot").GenericSchema<string | number | boolean | null>>>>(values: Values) => import("./public").BuilderEnableConfig<Values>;
34
- match: <const MatchPayload extends import("./references").Paramable<import("./public").BuilderSelectConfig<readonly [string, ...string[]], import("valibot").GenericSchema<string | null>> | import("./public").BuilderToggleConfig<import("valibot").GenericSchema<string | number | boolean | null>>>, const MatchPath extends import("./references").Paramable<import("./public").BuilderPath>, const SelectMap extends import("./references").Paramable<import("./public").BuilderMatchSelectMap<import("./references").Paramable<import("./public").BuilderSelectConfig<readonly [string, ...string[]], import("valibot").GenericSchema<string | null>> | import("./public").BuilderToggleConfig<import("valibot").GenericSchema<string | number | boolean | null>>>>>>(matchPath: MatchPath, selectMap: SelectMap) => import("./public").BuilderMatchConfig<MatchPayload, MatchPath, SelectMap>;
35
- unless: <const Values extends import("./references").Paramable<import("./public").BuilderSelectConfig<readonly [string, ...string[]], import("valibot").GenericSchema<string | null>> | import("./public").BuilderToggleConfig<import("valibot").GenericSchema<string | number | boolean | null>>>, const UnlessPath extends import("./references").Paramable<import("./public").BuilderPath>>(unlessPath: UnlessPath, disabledValues: import("./primitive").BuilderPrimitives, values: Values) => import("./public").BuilderUnlessConfig<Values, UnlessPath>;
24
+ export declare const detail: {
25
+ boolean: typeof detailBoolean;
26
+ image: typeof detailImage;
27
+ number: typeof detailNumber;
28
+ price: typeof detailPrice;
29
+ string: typeof detailString;
36
30
  };
37
31
  export declare const ui: typeof uis;
32
+ export declare const value: {
33
+ boolean: typeof valueBoolean;
34
+ number: typeof valueNumber;
35
+ select: typeof valueSelect;
36
+ string: typeof valueString;
37
+ };
package/dist/public.js CHANGED
@@ -1,19 +1,27 @@
1
1
  export { bb } from './bb.js';
2
- export { builder, detailBoolean, detailNumber, detailString, input, model, pricing, select, serialise, toggleBoolean, toggleNumber, toggleString } from './entities/index.js';
2
+ export { builder, input, match, model, pricing, serialise, unless } from './entities/index.js';
3
3
  export { BuilderException } from './errors/index.js';
4
4
  export { ordinal } from './mappers/index.js';
5
5
  export { parameter, ref } from './references.js';
6
- import { collectionConfig, collectionExpectation, collectionWhen, componentConfig, componentExpectation, componentWhen, optionExpectation, optionWhen, uis } from './entities/index.js';
7
- export const collection = Object.assign(collectionConfig, {
8
- ...collectionWhen
9
- });
10
- export const component = Object.assign(componentConfig, {
11
- ...componentWhen
12
- });
6
+ import { collectionConfig, collectionExpectation, componentConfig, componentExpectation, detailBoolean, detailImage, detailNumber, detailPrice, detailString, optionExpectation, valueBoolean, valueNumber, valueSelect, valueString, uis } from './entities/index.js';
7
+ export const collection = collectionConfig;
8
+ export const component = componentConfig;
13
9
  export const has = {
14
10
  collection: collectionExpectation,
15
11
  component: componentExpectation,
16
12
  option: optionExpectation
17
13
  };
18
- export const option = optionWhen;
14
+ export const detail = {
15
+ boolean: detailBoolean,
16
+ image: detailImage,
17
+ number: detailNumber,
18
+ price: detailPrice,
19
+ string: detailString
20
+ };
19
21
  export const ui = uis;
22
+ export const value = {
23
+ boolean: valueBoolean,
24
+ number: valueNumber,
25
+ select: valueSelect,
26
+ string: valueString
27
+ };
@@ -1,4 +1,4 @@
1
1
  import type { BuilderReferences, BuilderValidated, ValidationResult } from '../entities/index';
2
- import { BuilderErrorsScope } from '../errors/index.js';
2
+ import { BuilderIssuesScope } from '../errors/index.js';
3
3
  export type BuilderValidationResult = ValidationResult<BuilderValidated>;
4
- export declare function validateBuilder(input: unknown, references?: BuilderReferences, errors?: BuilderErrorsScope): BuilderValidationResult;
4
+ export declare function validateBuilder(input: unknown, references?: BuilderReferences, issues?: BuilderIssuesScope): BuilderValidationResult;
@@ -1,30 +1,30 @@
1
1
  import { builder, BuilderSerialisedSchema, modelsMerge, serialise } from '../entities/index.js';
2
- import { BuilderErrorsScope, check } from '../errors/index.js';
2
+ import { BuilderIssuesScope, check } from '../errors/index.js';
3
3
  import { validate } from './brand.js';
4
4
  import { checkModelExpectations, validateModelStructure } from './model.js';
5
5
  import { checkPricingExpectations, validatePricingStructure } from './pricing.js';
6
6
  import { resolver } from './resolve.js';
7
7
  import { checkUIExpectations, validateUIStructure } from './ui.js';
8
8
  const EMPTY_BUILDER = validate(serialise.builder(builder()));
9
- export function validateBuilder(input, references = [], errors = new BuilderErrorsScope(input)) {
9
+ export function validateBuilder(input, references = [], issues = new BuilderIssuesScope(input)) {
10
10
  if (!check.is(BuilderSerialisedSchema, input)) {
11
- errors.entityInvalid('builder');
12
- return [EMPTY_BUILDER, errors.errors];
11
+ issues.entityInvalid('builder');
12
+ return [EMPTY_BUILDER, issues.errors, issues.warnings];
13
13
  }
14
- const resolve = resolver(errors, references, input.bindings);
15
- const validatedModel = errors.scope('model', () => validateModelStructure(input.model, resolve, errors));
14
+ const resolve = resolver(issues, references, input.bindings);
15
+ const validatedModel = issues.scope('model', () => validateModelStructure(input.model, resolve, issues));
16
16
  const mergedModel = modelsMerge(validatedModel);
17
- errors.scope('model', () => {
18
- checkModelExpectations(mergedModel, validatedModel, errors);
17
+ issues.scope('model', () => {
18
+ checkModelExpectations(mergedModel, validatedModel, issues);
19
19
  });
20
- const validatedUI = errors.scope('ui', () => {
21
- const validated = validateUIStructure(input.ui, resolve, errors);
22
- checkUIExpectations(mergedModel, validated, errors);
20
+ const validatedUI = issues.scope('ui', () => {
21
+ const validated = validateUIStructure(input.ui, resolve, issues);
22
+ checkUIExpectations(mergedModel, validated, issues);
23
23
  return validated;
24
24
  });
25
- const validatedPricing = errors.scope('pricing', () => {
26
- const validated = validatePricingStructure(input.pricing, resolve, errors);
27
- checkPricingExpectations(mergedModel, validated, errors);
25
+ const validatedPricing = issues.scope('pricing', () => {
26
+ const validated = validatePricingStructure(input.pricing, resolve, issues);
27
+ checkPricingExpectations(mergedModel, validated, issues);
28
28
  return validated;
29
29
  });
30
30
  const data = validate({
@@ -33,5 +33,5 @@ export function validateBuilder(input, references = [], errors = new BuilderErro
33
33
  ui: validate(validatedUI),
34
34
  pricing: validate(validatedPricing)
35
35
  });
36
- return [data, errors.errors];
36
+ return [data, issues.errors, issues.warnings];
37
37
  }
@@ -1,3 +1,3 @@
1
1
  import type { BuilderExpectationsSerialised, BuilderModelSerialised } from '../entities/index';
2
- import type { BuilderErrorsScope } from '../errors/index';
3
- export declare function checkExpectations(model: BuilderModelSerialised, expectations: BuilderExpectationsSerialised, errors: BuilderErrorsScope): void;
2
+ import type { BuilderIssuesScope } from '../errors/index';
3
+ export declare function checkExpectations(model: BuilderModelSerialised, expectations: BuilderExpectationsSerialised, issues: BuilderIssuesScope): void;
@@ -1,10 +1,28 @@
1
- export function checkExpectations(model, expectations, errors) {
2
- expectations.forEach(({ kind, name }, index) => {
3
- errors.scope(index, () => {
4
- if (model[`${kind}s`].some((entry) => entry.name === name)) {
1
+ import { BuilderOptionConfigSerialisedSchema } from '../entities/index.js';
2
+ import { check } from '../errors/index.js';
3
+ export function checkExpectations(model, expectations, issues) {
4
+ expectations.forEach(({ kind, name, payload }, index) => {
5
+ issues.scope(index, () => {
6
+ const entry = model[`${kind}s`].find((candidate) => candidate.name === name);
7
+ if (entry == null) {
8
+ issues.modelUnmetExpectation();
5
9
  return;
6
10
  }
7
- errors.modelUnmetExpectation();
11
+ if (payload != null && !isExpectedOption(entry.payload, payload)) {
12
+ issues.modelInvalidExpectation();
13
+ }
8
14
  });
9
15
  });
10
16
  }
17
+ function isExpectedOption(payload, expectation) {
18
+ if (!check.is(BuilderOptionConfigSerialisedSchema, payload)) {
19
+ return true;
20
+ }
21
+ if (expectation.kind === 'select') {
22
+ if (payload.kind !== 'select') {
23
+ return false;
24
+ }
25
+ return expectation.options.every((option) => payload.options.includes(option));
26
+ }
27
+ return payload.kind === expectation.kind;
28
+ }
@@ -1,5 +1,5 @@
1
1
  import type { BuilderInstanceValidated, BuilderModelValidated, ValidationResult } from '../entities/index';
2
2
  import type { BuilderInstance } from '../instance';
3
- import { BuilderErrorsScope } from '../errors/index.js';
3
+ import { BuilderIssuesScope } from '../errors/index.js';
4
4
  export type BuilderInstanceValidationResult = ValidationResult<BuilderInstanceValidated>;
5
- export declare function validateInstance(model: BuilderModelValidated, instance: BuilderInstance, errors?: BuilderErrorsScope): BuilderInstanceValidationResult;
5
+ export declare function validateInstance(model: BuilderModelValidated, instance: BuilderInstance, issues?: BuilderIssuesScope): BuilderInstanceValidationResult;
@@ -1,15 +1,16 @@
1
- import { optionValueSchema } from '../entities/index.js';
2
- import { BuilderErrorsScope, check } from '../errors/index.js';
1
+ import { modelsMerge, optionValueSchema } from '../entities/index.js';
2
+ import { BuilderIssuesScope, 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
- export function validateInstance(model, instance, errors = new BuilderErrorsScope(instance)) {
7
- errors.scope('instance', () => {
6
+ export function validateInstance(model, instance, issues = new BuilderIssuesScope(instance)) {
7
+ issues.scope('instance', () => {
8
8
  checkInstance(model, instance);
9
9
  });
10
- return [validate(instance), errors.errors];
10
+ return [validate(instance), issues.errors, issues.warnings];
11
11
  function checkInstance(scopeModel, scopeInstance) {
12
- scopeModel.options.forEach((option) => {
12
+ const merged = modelsMerge(scopeModel);
13
+ merged.options.forEach((option) => {
13
14
  const { name } = option;
14
15
  const payload = resolveOption(option, scopeModel, scopeInstance);
15
16
  if (!payload) {
@@ -17,12 +18,12 @@ export function validateInstance(model, instance, errors = new BuilderErrorsScop
17
18
  }
18
19
  const value = scopeInstance[name];
19
20
  if (!check.is(optionValueSchema(payload), value)) {
20
- errors.scope(name, () => {
21
- errors.instanceInvalidOption();
21
+ issues.scope(name, () => {
22
+ issues.instanceInvalidOption();
22
23
  });
23
24
  }
24
25
  });
25
- scopeModel.collections.forEach((collection) => {
26
+ merged.collections.forEach((collection) => {
26
27
  const { name } = collection;
27
28
  const payload = resolveCollection(collection, scopeModel, scopeInstance);
28
29
  if (!payload) {
@@ -30,18 +31,35 @@ export function validateInstance(model, instance, errors = new BuilderErrorsScop
30
31
  }
31
32
  const existing = scopeInstance[name];
32
33
  if (!check.is(BuilderInstancesSchema, existing)) {
33
- errors.scope(name, () => {
34
- errors.instanceInvalidCollection();
34
+ issues.scope(name, () => {
35
+ issues.instanceInvalidCollection();
35
36
  });
36
37
  return;
37
38
  }
38
- errors.scope(name, () => {
39
+ issues.scope(name, () => {
40
+ if (existing.length < payload.min) {
41
+ issues.instanceInvalidCollectionMin();
42
+ }
43
+ else if (existing.length > payload.max) {
44
+ issues.instanceInvalidCollectionMax();
45
+ }
39
46
  existing.forEach((itemInstance, index) => {
40
- errors.scope(index, () => {
47
+ issues.scope(index, () => {
41
48
  checkInstance(payload.model, itemInstance);
42
49
  });
43
50
  });
44
51
  });
45
52
  });
53
+ const declaredNames = new Set([
54
+ ...merged.options.map((option) => option.name),
55
+ ...merged.collections.map((collection) => collection.name)
56
+ ]);
57
+ Object.keys(scopeInstance).forEach((key) => {
58
+ if (!declaredNames.has(key)) {
59
+ issues.scope(key, () => {
60
+ issues.instanceUnexpectedKey();
61
+ });
62
+ }
63
+ });
46
64
  }
47
65
  }
@@ -1,8 +1,8 @@
1
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 { BuilderErrorsScope } from '../errors/index.js';
4
+ import { BuilderIssuesScope } from '../errors/index.js';
5
5
  export type BuilderModelValidationResult = ValidationResult<BuilderModelValidated>;
6
- export declare function validateModel(input: unknown, references?: BuilderReferences, errors?: BuilderErrorsScope): BuilderModelValidationResult;
7
- export declare function checkModelExpectations(mergedModel: BuilderModelSerialised, rootModel: BuilderModelSerialised, errors: BuilderErrorsScope): void;
8
- export declare function validateModelStructure(input: ParamableSerialised<BuilderModelSerialised>, resolve: BuilderResolve, errors: BuilderErrorsScope): BuilderModelValidated;
6
+ export declare function validateModel(input: unknown, references?: BuilderReferences, issues?: BuilderIssuesScope): BuilderModelValidationResult;
7
+ export declare function checkModelExpectations(mergedModel: BuilderModelSerialised, rootModel: BuilderModelSerialised, issues: BuilderIssuesScope): void;
8
+ export declare function validateModelStructure(input: ParamableSerialised<BuilderModelSerialised>, resolve: BuilderResolve, issues: BuilderIssuesScope): BuilderModelValidated;
@@ -1,40 +1,41 @@
1
1
  import * as v from 'valibot';
2
- import { BuilderCollectionConfigSerialisedSchema, BuilderComponentConfigSerialisedSchema, BuilderModelSerialisedSchema, BuilderOptionConfigSerialisedSchema, BuilderPathsSchema, BuilderWhenSerialisedSchema, whenBranches, model, modelsMerge, serialise, validateCollectionConfig, validateComponentConfig, validateSelect, validateToggle } from '../entities/index.js';
3
- import { BuilderErrorsScope, check } from '../errors/index.js';
2
+ import { BuilderCollectionConfigSerialisedSchema, BuilderComponentConfigSerialisedSchema, BuilderModelSerialisedSchema, BuilderOptionConfigSerialisedSchema, BuilderPathsSchema, BuilderConditionSerialisedSchema, conditionBranches, model, modelsMerge, serialise, validateCollectionConfig, validateComponentConfig, validateValue } from '../entities/index.js';
3
+ import { BuilderIssuesScope, check } from '../errors/index.js';
4
+ import { dependencies } from '../mappers/index.js';
4
5
  import { isParamable } from '../references.js';
5
6
  import { validate } from './brand.js';
6
7
  import { checkExpectations } from './expectations.js';
7
8
  import { checkPath } from './paths.js';
8
9
  import { resolver } from './resolve.js';
9
10
  const EMPTY_MODEL = validate(serialise.model(model()));
10
- export function validateModel(input, references = [], errors = new BuilderErrorsScope(input)) {
11
+ export function validateModel(input, references = [], issues = new BuilderIssuesScope(input)) {
11
12
  if (!check.is(BuilderModelSerialisedSchema, input)) {
12
- errors.entityInvalid('model');
13
- return [EMPTY_MODEL, errors.errors];
13
+ issues.entityInvalid('model');
14
+ return [EMPTY_MODEL, issues.errors, issues.warnings];
14
15
  }
15
- const resolve = resolver(errors, references);
16
- const structure = validateModelStructure(input, resolve, errors);
16
+ const resolve = resolver(issues, references);
17
+ const structure = validateModelStructure(input, resolve, issues);
17
18
  const merged = modelsMerge(structure);
18
19
  const data = validate(merged);
19
- checkModelExpectations(data, structure, errors);
20
- return [data, errors.errors];
20
+ checkModelExpectations(data, structure, issues);
21
+ return [data, issues.errors, issues.warnings];
21
22
  }
22
- export function checkModelExpectations(mergedModel, rootModel, errors) {
23
+ export function checkModelExpectations(mergedModel, rootModel, issues) {
23
24
  recurse(rootModel);
24
25
  function recurse(node) {
25
- errors.scope('expectations', () => {
26
- checkExpectations(mergedModel, node.expectations, errors);
26
+ issues.scope('expectations', () => {
27
+ checkExpectations(mergedModel, node.expectations, issues);
27
28
  });
28
- errors.scope('models', () => {
29
+ issues.scope('models', () => {
29
30
  node.models.forEach((nested, nestedIndex) => {
30
- errors.scope(nestedIndex, () => {
31
+ issues.scope(nestedIndex, () => {
31
32
  recurse(nested);
32
33
  });
33
34
  });
34
35
  });
35
36
  }
36
37
  }
37
- export function validateModelStructure(input, resolve, errors) {
38
+ export function validateModelStructure(input, resolve, issues) {
38
39
  const seenGlobal = {
39
40
  option: new Set(),
40
41
  component: new Set(),
@@ -47,41 +48,42 @@ export function validateModelStructure(input, resolve, errors) {
47
48
  return validate(serialise.model(model()));
48
49
  }
49
50
  const modelInput = resolved;
50
- const skipPathValidation = modelInput.expectations.length > 0;
51
- const childModels = errors.scope('models', () => modelInput.models.flatMap((part, partIndex) => errors.scope(partIndex, () => [walkStructure(part)])));
52
- const options = errors.scope('options', () => walkEntries(modelInput.options, 'option', (resolved) => {
53
- whenBranches(resolved.payload, BuilderOptionConfigSerialisedSchema)
51
+ const childModels = issues.scope('models', () => modelInput.models.flatMap((part, partIndex) => issues.scope(partIndex, () => [walkStructure(part)])));
52
+ const options = issues.scope('options', () => walkEntries(modelInput.options, 'option', (resolved) => {
53
+ conditionBranches(resolved.payload, BuilderOptionConfigSerialisedSchema)
54
54
  .filter((config) => !isParamable(config))
55
55
  .forEach((config) => {
56
- if (config.type === 'select') {
57
- validateSelect(config, [], errors);
58
- }
59
- else if (config.type === 'toggle') {
60
- validateToggle(config, [], errors);
56
+ if (config.type === 'value') {
57
+ validateValue(config, [], issues);
61
58
  }
62
59
  });
63
60
  }));
64
- const components = errors.scope('components', () => walkEntries(modelInput.components, 'component', (resolved) => {
65
- whenBranches(resolved.payload, BuilderComponentConfigSerialisedSchema)
61
+ const components = issues.scope('components', () => walkEntries(modelInput.components, 'component', (resolved) => {
62
+ conditionBranches(resolved.payload, BuilderComponentConfigSerialisedSchema)
66
63
  .filter((config) => !isParamable(config))
67
64
  .forEach((config) => {
68
- validateComponentConfig(config, [], errors);
65
+ validateComponentConfig(config, [], issues);
69
66
  });
70
67
  }));
71
- const collections = errors.scope('collections', () => walkEntries(modelInput.collections, 'collection', (resolved) => {
72
- whenBranches(resolved.payload, BuilderCollectionConfigSerialisedSchema)
68
+ const collections = issues.scope('collections', () => walkEntries(modelInput.collections, 'collection', (resolved) => {
69
+ conditionBranches(resolved.payload, BuilderCollectionConfigSerialisedSchema)
73
70
  .filter((config) => !isParamable(config))
74
71
  .forEach((config) => {
75
- validateCollectionConfig(config, [], errors);
72
+ validateCollectionConfig(config, [], issues);
76
73
  });
77
74
  }));
78
- return {
75
+ const validatedModel = {
79
76
  ...modelInput,
80
77
  models: childModels,
81
78
  options,
82
79
  components,
83
80
  collections
84
81
  };
82
+ const ordered = new Set(dependencies(validatedModel));
83
+ if ([...options, ...collections, ...components].some((entry) => !ordered.has(entry.name))) {
84
+ issues.modelCircularDependency();
85
+ }
86
+ return validatedModel;
85
87
  function payloadSchemaFor(kind) {
86
88
  if (kind === 'option') {
87
89
  return BuilderOptionConfigSerialisedSchema;
@@ -95,7 +97,7 @@ export function validateModelStructure(input, resolve, errors) {
95
97
  const seenLocal = new Set();
96
98
  const items = [];
97
99
  entries.forEach((entry, entryIndex) => {
98
- errors.scope(entryIndex, () => {
100
+ issues.scope(entryIndex, () => {
99
101
  const resolved = resolveEntry(entry, seenLocal, kind);
100
102
  if (resolved == null) {
101
103
  return;
@@ -109,33 +111,33 @@ export function validateModelStructure(input, resolve, errors) {
109
111
  function resolveEntry(entry, seenLocal, kind) {
110
112
  let paths = entry.paths;
111
113
  if (entry.paths != null) {
112
- const resolvedPaths = errors.scope('paths', () => resolve(entry.paths, BuilderPathsSchema));
114
+ const resolvedPaths = issues.scope('paths', () => resolve(entry.paths, BuilderPathsSchema));
113
115
  paths = resolvedPaths ?? entry.paths;
114
116
  }
115
- const payloadSchema = v.union([payloadSchemaFor(kind), BuilderWhenSerialisedSchema]);
116
- const payload = errors.scope('payload', () => resolve(entry.payload, payloadSchema));
117
+ const payloadSchema = v.union([payloadSchemaFor(kind), BuilderConditionSerialisedSchema]);
118
+ const payload = issues.scope('payload', () => resolve(entry.payload, payloadSchema));
117
119
  const resolvedEntry = { ...entry, paths, payload: payload ?? entry.payload };
118
120
  if (seenLocal.has(resolvedEntry.name)) {
119
121
  if (kind === 'option') {
120
- errors.modelDuplicateOption();
122
+ issues.modelDuplicateOption();
121
123
  }
122
124
  else if (kind === 'component') {
123
- errors.modelDuplicateComponent();
125
+ issues.modelDuplicateComponent();
124
126
  }
125
127
  else {
126
- errors.modelDuplicateCollection();
128
+ issues.modelDuplicateCollection();
127
129
  }
128
130
  return null;
129
131
  }
130
132
  if (seenGlobal[kind].has(resolvedEntry.name)) {
131
133
  if (kind === 'option') {
132
- errors.modelOverriddenOption();
134
+ issues.modelOverriddenOption();
133
135
  }
134
136
  else if (kind === 'component') {
135
- errors.modelOverriddenComponent();
137
+ issues.modelOverriddenComponent();
136
138
  }
137
139
  else {
138
- errors.modelOverriddenCollection();
140
+ issues.modelOverriddenCollection();
139
141
  }
140
142
  }
141
143
  seenLocal.add(resolvedEntry.name);
@@ -144,27 +146,31 @@ export function validateModelStructure(input, resolve, errors) {
144
146
  return resolvedEntry;
145
147
  }
146
148
  function checkPaths(entry) {
147
- if (skipPathValidation) {
148
- return;
149
- }
150
149
  const { paths, payload } = entry;
151
150
  if (Array.isArray(paths)) {
152
- errors.scope('paths', () => {
151
+ issues.scope('paths', () => {
153
152
  paths.forEach((path, pathIndex) => {
154
- errors.scope(pathIndex, () => {
155
- checkPath(modelInput, path, errors);
153
+ issues.scope(pathIndex, () => {
154
+ checkPath(modelInput, path, issues);
156
155
  });
157
156
  });
158
157
  });
159
158
  }
160
- if (!check.is(BuilderWhenSerialisedSchema, payload)) {
159
+ if (!check.is(BuilderConditionSerialisedSchema, payload)) {
161
160
  return;
162
161
  }
163
162
  if (payload.type === 'match' && Array.isArray(payload.matchPath)) {
164
- errors.scope('payload', () => errors.scope('matchPath', () => checkPath(modelInput, payload.matchPath, errors)));
163
+ issues.scope('payload', () => issues.scope('matchPath', () => checkPath(modelInput, payload.matchPath, issues)));
165
164
  }
166
- if (payload.type === 'unless' && Array.isArray(payload.unlessPath)) {
167
- errors.scope('payload', () => errors.scope('unlessPath', () => checkPath(modelInput, payload.unlessPath, errors)));
165
+ if (payload.type === 'unless') {
166
+ if (payload.disabledValues.length === 0) {
167
+ issues.scope('payload', () => issues.scope('disabledValues', () => {
168
+ issues.entityEmptyDisabledValues();
169
+ }));
170
+ }
171
+ if (Array.isArray(payload.unlessPath)) {
172
+ issues.scope('payload', () => issues.scope('unlessPath', () => checkPath(modelInput, payload.unlessPath, issues)));
173
+ }
168
174
  }
169
175
  }
170
176
  }
@@ -1,3 +1,3 @@
1
1
  import type { BuilderModelSerialised, BuilderPath } from '../entities/index';
2
- import type { BuilderErrorsScope } from '../errors/index';
3
- export declare function checkPath(model: BuilderModelSerialised, path: BuilderPath, errors: BuilderErrorsScope): void;
2
+ import type { BuilderIssuesScope } from '../errors/index';
3
+ export declare function checkPath(model: BuilderModelSerialised, path: BuilderPath, issues: BuilderIssuesScope): void;
@@ -2,19 +2,24 @@ import { BuilderModelSerialisedSchema } from '../entities/index.js';
2
2
  import { check } from '../errors/index.js';
3
3
  import { resolveCollections } from '../mappers/index.js';
4
4
  import { NameSchema, NumberSchema } from '../primitive.js';
5
- export function checkPath(model, path, errors) {
5
+ export function checkPath(model, path, issues) {
6
6
  if (path.length === 0) {
7
- errors.pathEmpty();
7
+ issues.pathEmpty();
8
+ return;
9
+ }
10
+ const [firstSegment] = path;
11
+ if (check.is(NameSchema, firstSegment) &&
12
+ model.expectations.some((expectation) => expectation.name === firstSegment)) {
8
13
  return;
9
14
  }
10
15
  const lastIndex = path.length - 1;
11
- const models = walkPath([model], path.slice(0, -1), 0, errors);
16
+ const models = walkPath([model], path.slice(0, -1), 0, issues);
12
17
  if (models == null) {
13
18
  return;
14
19
  }
15
20
  const optionName = path.at(-1);
16
21
  if (!check.is(NameSchema, optionName)) {
17
- errors.scope(lastIndex, () => errors.pathInvalidSegment());
22
+ issues.scope(lastIndex, () => issues.pathInvalidSegment());
18
23
  return;
19
24
  }
20
25
  if (models.some((model) => model.options.some((option) => option.name === optionName))) {
@@ -22,27 +27,27 @@ export function checkPath(model, path, errors) {
22
27
  }
23
28
  const isCollection = models.some((model) => model.collections.some((entry) => entry.name === optionName));
24
29
  if (isCollection) {
25
- errors.scope(lastIndex, () => errors.pathTargetIsCollection());
30
+ issues.scope(lastIndex, () => issues.pathTargetIsCollection());
26
31
  return;
27
32
  }
28
33
  const isComponent = models.some((model) => model.components.some((entry) => entry.name === optionName));
29
34
  if (isComponent) {
30
- errors.scope(lastIndex, () => errors.pathTargetIsComponent());
35
+ issues.scope(lastIndex, () => issues.pathTargetIsComponent());
31
36
  return;
32
37
  }
33
- errors.scope(lastIndex, () => errors.pathMissingOption());
38
+ issues.scope(lastIndex, () => issues.pathMissingOption());
34
39
  }
35
- function walkPath(models, remaining, offset, errors) {
40
+ function walkPath(models, remaining, offset, issues) {
36
41
  if (remaining.length === 0) {
37
42
  return models;
38
43
  }
39
44
  const [collectionName, index, ...rest] = remaining;
40
45
  if (!check.is(NameSchema, collectionName)) {
41
- errors.scope(offset, () => errors.pathInvalidSegment());
46
+ issues.scope(offset, () => issues.pathInvalidSegment());
42
47
  return null;
43
48
  }
44
49
  if (!check.is(NumberSchema, index)) {
45
- errors.scope(offset + 1, () => errors.pathInvalidSegment());
50
+ issues.scope(offset + 1, () => issues.pathInvalidSegment());
46
51
  return null;
47
52
  }
48
53
  const collectionConfigs = models.flatMap((model) => {
@@ -50,7 +55,7 @@ function walkPath(models, remaining, offset, errors) {
50
55
  return collection == null ? [] : resolveCollections(collection);
51
56
  });
52
57
  if (collectionConfigs.length === 0) {
53
- errors.scope(offset, () => errors.pathMissingCollection());
58
+ issues.scope(offset, () => issues.pathMissingCollection());
54
59
  return null;
55
60
  }
56
61
  const indexableConfigs = collectionConfigs.filter(({ max }) => !check.is(NumberSchema, max) || index < max);
@@ -61,13 +66,13 @@ function walkPath(models, remaining, offset, errors) {
61
66
  }
62
67
  return max > highest ? max : highest;
63
68
  }, 0);
64
- errors.scope(offset + 1, () => errors.pathInvalidIndex(max));
69
+ issues.scope(offset + 1, () => issues.pathInvalidIndex(max));
65
70
  return null;
66
71
  }
67
72
  const next = indexableConfigs.flatMap((collectionConfig) => check.is(BuilderModelSerialisedSchema, collectionConfig.model) ? [collectionConfig.model] : []);
68
73
  if (next.length === 0) {
69
- errors.scope(offset, () => errors.pathMissingCollection());
74
+ issues.scope(offset, () => issues.pathMissingCollection());
70
75
  return null;
71
76
  }
72
- return walkPath(next, rest, offset + 2, errors);
77
+ return walkPath(next, rest, offset + 2, issues);
73
78
  }