@builder-builder/builder 0.0.10 → 0.0.11

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 (191) hide show
  1. package/dist/bb.d.ts +28 -0
  2. package/dist/bb.js +49 -0
  3. package/dist/check.d.ts +1 -1
  4. package/dist/check.js +4 -2
  5. package/dist/entities/builder/bind.d.ts +4 -85
  6. package/dist/entities/builder/bind.js +1 -9
  7. package/dist/entities/builder/builder.d.ts +17 -509
  8. package/dist/entities/builder/builder.js +19 -79
  9. package/dist/entities/builder/factory.d.ts +7 -0
  10. package/dist/entities/builder/factory.js +4 -0
  11. package/dist/entities/builder/index.d.ts +3 -6
  12. package/dist/entities/builder/index.js +1 -2
  13. package/dist/entities/collection/collection.d.ts +69 -19
  14. package/dist/entities/collection/collection.js +7 -25
  15. package/dist/entities/collection/config.d.ts +38 -1095
  16. package/dist/entities/collection/config.js +8 -8
  17. package/dist/entities/collection/expectation.d.ts +8 -4
  18. package/dist/entities/collection/index.d.ts +2 -2
  19. package/dist/entities/collection/when.d.ts +5 -4
  20. package/dist/entities/component/component.d.ts +264 -293
  21. package/dist/entities/component/component.js +5 -5
  22. package/dist/entities/component/details.d.ts +32 -57
  23. package/dist/entities/component/details.js +8 -8
  24. package/dist/entities/component/expectation.d.ts +7 -4
  25. package/dist/entities/component/expectation.js +0 -3
  26. package/dist/entities/component/field.d.ts +50 -0
  27. package/dist/entities/component/field.js +41 -0
  28. package/dist/entities/component/index.d.ts +4 -2
  29. package/dist/entities/component/index.js +2 -1
  30. package/dist/entities/component/when.d.ts +1 -1
  31. package/dist/entities/component/when.js +2 -2
  32. package/dist/entities/entry.d.ts +4 -0
  33. package/dist/entities/expectation.d.ts +10 -22
  34. package/dist/entities/expectation.js +2 -7
  35. package/dist/entities/index.d.ts +20 -17
  36. package/dist/entities/index.js +9 -8
  37. package/dist/entities/kind.d.ts +8 -5
  38. package/dist/entities/kind.js +3 -4
  39. package/dist/entities/model/bind.d.ts +83 -0
  40. package/dist/entities/model/expectation.d.ts +16 -0
  41. package/dist/entities/model/index.d.ts +7 -0
  42. package/dist/entities/model/index.js +2 -0
  43. package/dist/entities/model/methods.d.ts +57 -0
  44. package/dist/entities/{builder → model}/methods.js +8 -8
  45. package/dist/entities/model/model.d.ts +39 -0
  46. package/dist/entities/model/model.js +73 -0
  47. package/dist/entities/model/models.d.ts +39 -0
  48. package/dist/entities/model/models.js +14 -0
  49. package/dist/entities/{builder → model}/state.d.ts +10 -10
  50. package/dist/entities/option/index.d.ts +1 -1
  51. package/dist/entities/option/index.js +1 -1
  52. package/dist/entities/option/option.d.ts +210 -209
  53. package/dist/entities/option/option.js +5 -5
  54. package/dist/entities/option/select.d.ts +2 -12
  55. package/dist/entities/option/select.js +6 -3
  56. package/dist/entities/option/toggle.d.ts +2 -9
  57. package/dist/entities/option/toggle.js +3 -3
  58. package/dist/entities/option/values.d.ts +3 -21
  59. package/dist/entities/option/values.js +8 -2
  60. package/dist/entities/option/when.d.ts +5 -4
  61. package/dist/entities/refs.d.ts +6 -0
  62. package/dist/entities/refs.js +1 -0
  63. package/dist/entities/serialise.d.ts +388 -2919
  64. package/dist/entities/serialise.js +116 -17
  65. package/dist/entities/ui/describe.d.ts +22 -31
  66. package/dist/entities/ui/describe.js +1 -1
  67. package/dist/entities/ui/index.d.ts +2 -5
  68. package/dist/entities/ui/index.js +1 -2
  69. package/dist/entities/ui/page.d.ts +22 -31
  70. package/dist/entities/ui/page.js +1 -1
  71. package/dist/entities/ui/pages.d.ts +11 -8
  72. package/dist/entities/ui/pages.js +1 -1
  73. package/dist/entities/ui/ui.d.ts +22 -1194
  74. package/dist/entities/ui/ui.js +16 -28
  75. package/dist/entities/ui/uis.d.ts +5 -15
  76. package/dist/entities/ui/uis.js +12 -18
  77. package/dist/entities/validated.d.ts +35 -0
  78. package/dist/entities/validated.js +1 -0
  79. package/dist/entities/when.d.ts +64 -56
  80. package/dist/entities/when.js +1 -0
  81. package/dist/environment.d.ts +5 -0
  82. package/dist/environment.js +2 -0
  83. package/dist/exception.d.ts +8 -3
  84. package/dist/exception.js +3 -0
  85. package/dist/index.d.ts +21 -28
  86. package/dist/index.js +5 -13
  87. package/dist/instance.d.ts +56 -0
  88. package/dist/instance.js +10 -0
  89. package/dist/mappers/index.d.ts +7 -7
  90. package/dist/mappers/index.js +5 -4
  91. package/dist/mappers/instance.d.ts +3 -0
  92. package/dist/mappers/instance.js +35 -0
  93. package/dist/mappers/order.d.ts +6 -0
  94. package/dist/mappers/order.js +22 -0
  95. package/dist/mappers/render/pages.d.ts +4 -4
  96. package/dist/mappers/render/render.d.ts +2 -3
  97. package/dist/mappers/render/render.js +83 -78
  98. package/dist/mappers/resolve.d.ts +5 -9
  99. package/dist/mappers/resolve.js +25 -33
  100. package/dist/mappers/variants/index.d.ts +1 -0
  101. package/dist/mappers/variants/index.js +1 -0
  102. package/dist/mappers/variants/option-graph.d.ts +19 -0
  103. package/dist/mappers/{models → variants}/option-graph.js +33 -22
  104. package/dist/mappers/variants/variants.d.ts +3 -0
  105. package/dist/mappers/variants/variants.js +57 -0
  106. package/dist/private.d.ts +4 -0
  107. package/dist/private.js +4 -0
  108. package/dist/references.d.ts +13 -48
  109. package/dist/references.js +6 -14
  110. package/dist/serialisable.d.ts +1 -9
  111. package/dist/serialisable.js +2 -3
  112. package/dist/validate/brand.d.ts +14 -0
  113. package/dist/validate/brand.js +17 -0
  114. package/dist/validate/builder.d.ts +4 -0
  115. package/dist/validate/builder.js +27 -0
  116. package/dist/validate/expectations.d.ts +10 -0
  117. package/dist/validate/expectations.js +12 -0
  118. package/dist/validate/index.d.ts +18 -0
  119. package/dist/validate/index.js +9 -0
  120. package/dist/validate/instance.d.ts +19 -0
  121. package/dist/validate/instance.js +46 -0
  122. package/dist/validate/model.d.ts +36 -0
  123. package/dist/validate/model.js +196 -0
  124. package/dist/validate/resolve.d.ts +16 -0
  125. package/dist/validate/resolve.js +91 -0
  126. package/dist/validate/result.d.ts +8 -0
  127. package/dist/validate/result.js +4 -0
  128. package/dist/validate/ui.d.ts +8 -0
  129. package/dist/validate/ui.js +77 -0
  130. package/dist/validate/variants.d.ts +59 -0
  131. package/dist/validate/variants.js +102 -0
  132. package/package.json +5 -4
  133. package/dist/entities/bind.d.ts +0 -4
  134. package/dist/entities/bind.js +0 -44
  135. package/dist/entities/builder/builders.d.ts +0 -35
  136. package/dist/entities/builder/builders.js +0 -19
  137. package/dist/entities/builder/expectation.d.ts +0 -12
  138. package/dist/entities/builder/methods.d.ts +0 -58
  139. package/dist/entities/builder/validate.d.ts +0 -3
  140. package/dist/entities/builder/validate.js +0 -108
  141. package/dist/entities/errors.d.ts +0 -21
  142. package/dist/entities/ui/bind.d.ts +0 -10
  143. package/dist/entities/ui/bind.js +0 -9
  144. package/dist/entities/ui/validate.d.ts +0 -8
  145. package/dist/entities/ui/validate.js +0 -21
  146. package/dist/entities/validate.d.ts +0 -28
  147. package/dist/mappers/assert/builder.d.ts +0 -2
  148. package/dist/mappers/assert/builder.js +0 -46
  149. package/dist/mappers/assert/expectation.d.ts +0 -2
  150. package/dist/mappers/assert/expectation.js +0 -23
  151. package/dist/mappers/assert/index.d.ts +0 -6
  152. package/dist/mappers/assert/index.js +0 -4
  153. package/dist/mappers/assert/model.d.ts +0 -13
  154. package/dist/mappers/assert/model.js +0 -47
  155. package/dist/mappers/assert/models.d.ts +0 -33
  156. package/dist/mappers/assert/models.js +0 -74
  157. package/dist/mappers/assert/ui.d.ts +0 -2
  158. package/dist/mappers/assert/ui.js +0 -22
  159. package/dist/mappers/instance/index.d.ts +0 -1
  160. package/dist/mappers/instance/index.js +0 -1
  161. package/dist/mappers/instance/instance.d.ts +0 -4
  162. package/dist/mappers/instance/instance.js +0 -33
  163. package/dist/mappers/models/component-graph.d.ts +0 -9
  164. package/dist/mappers/models/component-graph.js +0 -51
  165. package/dist/mappers/models/graph.d.ts +0 -12
  166. package/dist/mappers/models/graph.js +0 -17
  167. package/dist/mappers/models/index.d.ts +0 -1
  168. package/dist/mappers/models/index.js +0 -1
  169. package/dist/mappers/models/models.d.ts +0 -3
  170. package/dist/mappers/models/models.js +0 -37
  171. package/dist/mappers/models/option-graph.d.ts +0 -9
  172. package/dist/mappers/order/index.d.ts +0 -2
  173. package/dist/mappers/order/index.js +0 -1
  174. package/dist/mappers/order/order.d.ts +0 -14
  175. package/dist/mappers/order/order.js +0 -31
  176. package/dist/mappers/refs.d.ts +0 -12
  177. package/dist/mappers/refs.js +0 -36
  178. package/dist/model.d.ts +0 -35
  179. package/dist/model.js +0 -9
  180. package/dist/walker/index.d.ts +0 -2
  181. package/dist/walker/index.js +0 -1
  182. package/dist/walker/walkable.d.ts +0 -4
  183. package/dist/walker/walkable.js +0 -4
  184. package/dist/walker/walker.d.ts +0 -26
  185. package/dist/walker/walker.js +0 -115
  186. package/dist/walker/walkers.d.ts +0 -9
  187. package/dist/walker/walkers.js +0 -55
  188. /package/dist/entities/{builder/expectation.js → entry.js} +0 -0
  189. /package/dist/entities/{builder/state.js → model/bind.js} +0 -0
  190. /package/dist/entities/{errors.js → model/expectation.js} +0 -0
  191. /package/dist/entities/{validate.js → model/state.js} +0 -0
@@ -0,0 +1,83 @@
1
+ import type { BuilderPaths } from '../../paths';
2
+ import type { BuilderParameter, BuilderRef, Paramable } from '../../references';
3
+ import type { BuilderCollectionConfig, BuilderCollectionPayload } from '../collection/index';
4
+ import type { BuilderComponentPayload } from '../component/index';
5
+ import type { BuilderOptionPayload } from '../option/index';
6
+ import type { BuilderWhenConstrained, BuilderWhenGeneric, WhenConfigNullable } from '../when';
7
+ import type { BuilderModelGeneric } from './model';
8
+ import type { BuilderModels } from './models';
9
+ import type { BuilderModelState, BuilderModelStateAppend } from './state';
10
+ export type BuilderModelBindings<State extends BuilderModelState> = {
11
+ readonly [Name in BuilderModelPartsNamesOf<State['models']> | ParameterNamesOf<State['options']> | ParameterNamesOf<State['collections']> | ParameterNamesOf<State['components']> | CollectionConfigParameterNamesOf<State['collections']>]?: BuilderWhenConstrained<State, PayloadForParameter<State, Name>> | BuilderRef;
12
+ };
13
+ export type BuilderModelBoundState<State extends BuilderModelState, Bindings extends BuilderModelBindings<State>> = BuilderModelStateAppend<State, {
14
+ options: EntryBound<State['options'], Bindings>;
15
+ collections: EntryBound<State['collections'], Bindings>;
16
+ components: EntryBound<State['components'], Bindings>;
17
+ instance: Omit<State['instance'], keyof Bindings> & {
18
+ [Key in Extract<keyof Bindings, string>]: BoundInstance<Bindings[Key]>;
19
+ };
20
+ }>;
21
+ type BoundInstance<Binding> = Binding extends BuilderRef ? unknown : BoundValue<Binding> | BoundConfigNullable<Binding>;
22
+ type BoundValue<Binding> = Binding extends {
23
+ readonly type: 'match';
24
+ readonly selectMap: infer SelectMap extends Record<string, unknown>;
25
+ } ? NonNullable<SelectMap[keyof SelectMap]> extends {
26
+ readonly value: infer Value;
27
+ } ? Value : string : Binding extends {
28
+ readonly payload: {
29
+ readonly value: infer Value;
30
+ };
31
+ } ? Value : Binding extends {
32
+ readonly value: infer Value;
33
+ } ? Value : string;
34
+ type BoundConfigNullable<Binding> = Binding extends BuilderWhenGeneric ? WhenConfigNullable<Binding> : never;
35
+ type EntryLike = {
36
+ readonly name: string;
37
+ readonly payload: unknown;
38
+ readonly paths?: Paramable<BuilderPaths>;
39
+ };
40
+ type EntryBound<Entries extends ReadonlyArray<EntryLike>, Bindings> = Entries extends readonly [
41
+ infer Head extends EntryLike,
42
+ ...infer Tail extends ReadonlyArray<EntryLike>
43
+ ] ? Head extends {
44
+ readonly payload: infer Payload;
45
+ } ? Payload extends BuilderParameter ? Head['name'] extends keyof Bindings ? Bindings[Head['name']] extends BuilderRef ? [Head, ...EntryBound<Tail, Bindings>] : [...EntryBound<Tail, Bindings>] : [Head, ...EntryBound<Tail, Bindings>] : [Head, ...EntryBound<Tail, Bindings>] : [Head, ...EntryBound<Tail, Bindings>] : [];
46
+ type EntryParameters<Entries extends ReadonlyArray<EntryLike>> = Entries[number] extends infer Entry ? Entry extends {
47
+ readonly payload: infer Payload;
48
+ } ? PayloadParameters<Payload> : never : never;
49
+ type PayloadParameters<Payload> = ParameterInfo<Payload> | (Payload extends {
50
+ readonly type: 'match';
51
+ readonly selectMap: infer SelectMap;
52
+ } ? ParameterInfo<SelectMap[keyof SelectMap]> : never) | (Payload extends {
53
+ readonly type: 'enable' | 'unless';
54
+ readonly payload: infer Inner;
55
+ } ? ParameterInfo<Inner> : never);
56
+ type ParameterInfo<Value> = Extract<Value, BuilderParameter> extends infer Parameter extends BuilderParameter ? {
57
+ readonly name: Parameter['name'];
58
+ readonly payload: Parameter;
59
+ } : never;
60
+ type ParameterNamesOf<Entries extends ReadonlyArray<EntryLike>> = EntryParameters<Entries>['name'];
61
+ type PayloadForParameter<State extends BuilderModelState, Name extends string> = Name extends BuilderModelPartsNamesOf<State['models']> ? BuilderModelGeneric : Name extends ParameterNamesOf<State['options']> ? BuilderOptionPayload : Name extends ParameterNamesOf<State['collections']> ? BuilderCollectionPayload : Name extends ParameterNamesOf<State['components']> ? BuilderComponentPayload : Name extends CollectionConfigParameterNamesOf<State['collections']> ? CollectionConfigExpectedOf<State['collections'], Name> : never;
62
+ type BuilderModelPartsNamesOf<Parts extends BuilderModels> = Extract<Parts[number], BuilderParameter>['name'];
63
+ type CollectionConfigOf<Payload> = Payload extends BuilderCollectionConfig<infer Model, infer Min, infer Max> ? BuilderCollectionConfig<Model, Min, Max> : Payload extends {
64
+ readonly type: 'enable' | 'unless';
65
+ readonly payload: infer Inner;
66
+ } ? CollectionConfigOf<Inner> : Payload extends {
67
+ readonly type: 'match';
68
+ readonly selectMap: infer SelectMap;
69
+ } ? CollectionConfigOf<NonNullable<SelectMap[keyof SelectMap]>> : never;
70
+ type CollectionConfigParameterInfo<Value, Expected> = Value extends BuilderParameter ? {
71
+ readonly name: Value['name'];
72
+ readonly payload: Value;
73
+ readonly expected: Expected;
74
+ } : never;
75
+ type CollectionConfigParameters<Payload> = [CollectionConfigOf<Payload>] extends [never] ? never : CollectionConfigOf<Payload> extends BuilderCollectionConfig<infer Model, infer Min, infer Max> ? CollectionConfigParameterInfo<Model, BuilderModelGeneric> | CollectionConfigParameterInfo<Min, number> | CollectionConfigParameterInfo<Max, number> : never;
76
+ type CollectionConfigParametersOfEntries<Entries extends ReadonlyArray<EntryLike>> = Entries[number] extends infer Entry ? Entry extends {
77
+ readonly payload: infer Payload;
78
+ } ? CollectionConfigParameters<Payload> : never : never;
79
+ type CollectionConfigParameterNamesOf<Entries extends ReadonlyArray<EntryLike>> = CollectionConfigParametersOfEntries<Entries>['name'];
80
+ type CollectionConfigExpectedOf<Entries extends ReadonlyArray<EntryLike>, Name extends string> = Extract<CollectionConfigParametersOfEntries<Entries>, {
81
+ readonly name: Name;
82
+ }>['expected'];
83
+ export {};
@@ -0,0 +1,16 @@
1
+ import type { Prettify } from '../../prettify';
2
+ import type { CollectionsAsserted } from '../collection/index';
3
+ import type { ComponentAsserted } from '../component/index';
4
+ import type { BuilderExpectation, BuilderExpectations } from '../expectation';
5
+ import type { BuilderModelState, BuilderModelStateAppend } from './state';
6
+ export type BuilderModelStateAsserted<State extends BuilderModelState, Expectations extends BuilderExpectations> = BuilderModelStateAppend<State, {
7
+ instance: InstanceAsserted<State, Expectations>;
8
+ components: ComponentAsserted<State, Expectations>;
9
+ collections: CollectionsAsserted<State, Expectations>;
10
+ }>;
11
+ type InstanceAsserted<State extends BuilderModelState, Expectations extends BuilderExpectations, Current extends State['instance'] = State['instance'], Asserted extends InstanceExpected<Expectations> = InstanceExpected<Expectations>> = unknown extends Current ? Prettify<Asserted> : Prettify<Current & Asserted>;
12
+ type InstanceExpected<Expectations extends BuilderExpectations> = Expectations extends readonly [
13
+ infer Head,
14
+ ...infer Tail extends BuilderExpectations
15
+ ] ? (Head extends BuilderExpectation<infer Name, infer Value, 'option'> ? Record<Name, Value> : Head extends BuilderExpectation<infer Name, any, 'collection'> ? Record<Name, ReadonlyArray<unknown>> : unknown) & InstanceExpected<Tail> : unknown;
16
+ export {};
@@ -0,0 +1,7 @@
1
+ export type { BuilderModelGeneric, BuilderInstanceOf, BuilderModelSerialised, BuilderModelStateOf } from './model';
2
+ export type { BuilderModels } from './models';
3
+ export type { BuilderModelStateAsserted } from './expectation';
4
+ export type { BuilderModelBindings } from './bind';
5
+ export type { BuilderModelState, BuilderModelStateEmpty } from './state';
6
+ export { BuilderModel, BuilderModelSchema, BuilderModelSerialisedSchema, model } from './model.js';
7
+ export { modelsMerge } from './models.js';
@@ -0,0 +1,2 @@
1
+ export { BuilderModel, BuilderModelSchema, BuilderModelSerialisedSchema, model } from './model.js';
2
+ export { modelsMerge } from './models.js';
@@ -0,0 +1,57 @@
1
+ import type { BuilderPaths } from '../../paths';
2
+ import type { BuilderParameter, Paramable } from '../../references';
3
+ import type { BuilderCollectionConfig, BuilderCollectionWhen } from '../collection/index';
4
+ import type { BuilderComponentDetails, BuilderComponentWhen } from '../component/index';
5
+ import type { BuilderOptionValues, BuilderOptionWhen } from '../option/index';
6
+ import type { BuilderValidPaths, BuilderWhenConstrained, WhenConfigPayload, WhenNullability } from '../when';
7
+ import type { BuilderModel } from './model';
8
+ import type { BuilderModelState, BuilderModelStateAppend } from './state';
9
+ import { BuilderCollection } from '../collection/index.js';
10
+ import { BuilderComponent } from '../component/index.js';
11
+ import { BuilderOption } from '../option/index.js';
12
+ export type BuilderOptionMethod<State extends BuilderModelState> = {
13
+ <const Name extends string, const Payload extends Paramable<BuilderOptionValues>>(name: Name, payload: Payload): OptionStateAppend<State, BuilderOption<Name, Payload>>;
14
+ when: <const Paths extends Paramable<BuilderValidPaths<State>>, const Name extends string, const Payload extends Paramable<BuilderOptionWhen>>(paths: Paths, name: Name, payload: Payload & BuilderWhenConstrained<State, Payload>) => OptionStateAppend<State, OptionWhenResolver<Name, Payload>, OptionInstanceOf<OptionWhenResolver<Name, Payload>> | WhenNullability<State, Paths, Payload>>;
15
+ };
16
+ export type BuilderComponentMethod<State extends BuilderModelState> = {
17
+ <const Name extends string, const Payload extends Paramable<BuilderComponentDetails>>(name: Name, payload?: Payload): ComponentStateAppend<State, BuilderComponent<Name, Payload>>;
18
+ when: <const Paths extends Paramable<BuilderValidPaths<State>>, const Name extends string, const Payload extends Paramable<BuilderComponentWhen>>(paths: Paths, name: Name, payload?: Payload & BuilderWhenConstrained<State, Payload>) => ComponentStateAppend<State, ComponentWhenResolver<Name, Payload>>;
19
+ };
20
+ export type BuilderCollectionMethod<State extends BuilderModelState> = {
21
+ <const Name extends string, const Payload extends Paramable<BuilderCollectionConfig>>(name: Name, payload: Payload): CollectionStateAppend<State, BuilderCollection<Name, Payload>>;
22
+ when: <const Paths extends Paramable<BuilderValidPaths<State>>, const Name extends string, const Payload extends Paramable<BuilderCollectionWhen>>(paths: Paths, name: Name, payload: Payload & BuilderWhenConstrained<State, Payload>) => CollectionStateAppend<State, CollectionWhenResolver<Name, Payload>, CollectionInstanceOf<CollectionWhenResolver<Name, Payload>> | WhenNullability<State, Paths, Payload>>;
23
+ };
24
+ type OptionWhenResolver<Name extends string, Payload extends Paramable<BuilderOptionWhen>> = Payload extends BuilderOptionWhen ? BuilderOption<Name, WhenConfigPayload<Payload, BuilderOptionValues>> : BuilderOption<Name, BuilderParameter>;
25
+ type ComponentWhenResolver<Name extends string, Payload extends Paramable<BuilderComponentWhen>> = Payload extends BuilderComponentWhen ? BuilderComponent<Name, WhenConfigPayload<Payload, BuilderComponentDetails>> : BuilderComponent<Name, BuilderParameter>;
26
+ type CollectionWhenResolver<Name extends string, Payload extends Paramable<BuilderCollectionWhen>> = Payload extends BuilderCollectionWhen ? BuilderCollection<Name, WhenConfigPayload<Payload, BuilderCollectionConfig>> : BuilderCollection<Name, BuilderParameter>;
27
+ type OptionStateAppend<State extends BuilderModelState, Option extends BuilderOption, InstanceType = OptionInstanceOf<Option>> = BuilderModel<BuilderModelStateAppend<State, {
28
+ instance: State['instance'] & {
29
+ [K in Option['name']]: InstanceType;
30
+ };
31
+ options: [...State['options'], Option];
32
+ }>>;
33
+ type ComponentStateAppend<State extends BuilderModelState, Component extends BuilderComponent> = BuilderModel<BuilderModelStateAppend<State, {
34
+ components: [...State['components'], Component];
35
+ }>>;
36
+ type CollectionStateAppend<State extends BuilderModelState, Collection extends BuilderCollection, InstanceType = CollectionInstanceOf<Collection>> = BuilderModel<BuilderModelStateAppend<State, {
37
+ instance: State['instance'] & Record<Collection['name'], InstanceType>;
38
+ collections: [...State['collections'], Collection];
39
+ }>>;
40
+ type OptionInstanceOf<Option extends BuilderOption> = Option['payload'] extends BuilderParameter ? string : Option['payload'] extends {
41
+ readonly value: infer Value;
42
+ } ? Value : never;
43
+ type CollectionInstanceOf<Collection extends BuilderCollection> = [Collection['payload']] extends [
44
+ never
45
+ ] ? null : Collection['payload'] extends BuilderCollectionConfig ? Collection['payload']['model'] extends BuilderModel<infer State extends BuilderModelState> ? CollectionShape<Collection, State['instance']> : ReadonlyArray<unknown> : ReadonlyArray<unknown>;
46
+ type CollectionShape<Collection extends BuilderCollection, Item> = Collection['payload'] extends BuilderCollectionConfig ? Collection['payload']['min'] extends number ? Collection['payload']['max'] extends number ? number extends Collection['payload']['min'] ? ReadonlyArray<Item> : number extends Collection['payload']['max'] ? ReadonlyArray<Item> : Collection['payload']['min'] extends Collection['payload']['max'] ? CollectionTuple<Item, Collection['payload']['min']> : ReadonlyArray<Item> : ReadonlyArray<Item> : ReadonlyArray<Item> : ReadonlyArray<Item>;
47
+ type CollectionTuple<Item, Length extends number, Result extends ReadonlyArray<Item> = []> = Result['length'] extends Length ? Result : CollectionTuple<Item, Length, [...Result, Item]>;
48
+ export declare function builderOptionMethod(): ((name: string, payload: Paramable<BuilderOptionValues>) => BuilderOption<string, Paramable<import("..").BuilderSelectType<readonly [string, ...string[]], import("valibot").GenericSchema<string | null>> | import("..").BuilderToggleType<import("valibot").GenericSchema<string | number | boolean | null>>>, Paramable<readonly (readonly (string | number)[])[]>>) & {
49
+ when(paths: Paramable<BuilderPaths>, name: string, payload: Paramable<BuilderOptionWhen>): BuilderOption<string, Paramable<BuilderOptionWhen>, readonly (readonly (string | number)[])[] | import("../..").BuilderRef | BuilderParameter<string>>;
50
+ };
51
+ export declare function builderComponentMethod(): ((name: string, payload?: Paramable<BuilderComponentDetails>) => BuilderComponent<string, Paramable<BuilderComponentDetails<Paramable<readonly import("..").BuilderComponentField<string, import("valibot").GenericSchema<string | number | boolean | null>>[]>>>, Paramable<readonly (readonly (string | number)[])[]>>) & {
52
+ when(paths: Paramable<BuilderPaths>, name: string, payload?: Paramable<BuilderComponentWhen>): BuilderComponent<string, Paramable<BuilderComponentWhen>, readonly (readonly (string | number)[])[] | import("../..").BuilderRef | BuilderParameter<string>>;
53
+ };
54
+ export declare function builderCollectionMethod(): ((name: string, payload: Paramable<BuilderCollectionConfig>) => BuilderCollection<string, Paramable<BuilderCollectionConfig<Paramable<import("./model").BuilderModelGeneric>, Paramable<number>, Paramable<number>>>, Paramable<readonly (readonly (string | number)[])[]>>) & {
55
+ when(paths: Paramable<BuilderPaths>, name: string, payload: Paramable<BuilderCollectionWhen>): BuilderCollection<string, Paramable<BuilderCollectionWhen>, readonly (readonly (string | number)[])[] | import("../..").BuilderRef | BuilderParameter<string>>;
56
+ };
57
+ export {};
@@ -1,21 +1,21 @@
1
1
  import { BuilderCollection } from '../collection/index.js';
2
- import { BuilderComponent, componentWhen } from '../component/index.js';
2
+ import { BuilderComponent, componentDetails, componentWhen } from '../component/index.js';
3
3
  import { BuilderOption } from '../option/index.js';
4
4
  export function builderOptionMethod() {
5
5
  return Object.assign((name, payload) => {
6
6
  return new BuilderOption(name, payload);
7
7
  }, {
8
- when(gatePaths, name, payload) {
9
- return new BuilderOption(name, payload, gatePaths);
8
+ when(paths, name, payload) {
9
+ return new BuilderOption(name, payload, paths);
10
10
  }
11
11
  });
12
12
  }
13
13
  export function builderComponentMethod() {
14
14
  return Object.assign((name, payload) => {
15
- return new BuilderComponent(name, payload ?? componentWhen.enable());
15
+ return new BuilderComponent(name, payload ?? componentDetails());
16
16
  }, {
17
- when(gatePaths, name, payload) {
18
- return new BuilderComponent(name, payload ?? componentWhen.enable(), gatePaths);
17
+ when(paths, name, payload) {
18
+ return new BuilderComponent(name, payload ?? componentWhen.enable(), paths);
19
19
  }
20
20
  });
21
21
  }
@@ -23,8 +23,8 @@ export function builderCollectionMethod() {
23
23
  return Object.assign((name, payload) => {
24
24
  return new BuilderCollection(name, payload);
25
25
  }, {
26
- when(gatePaths, name, payload) {
27
- return new BuilderCollection(name, payload, gatePaths);
26
+ when(paths, name, payload) {
27
+ return new BuilderCollection(name, payload, paths);
28
28
  }
29
29
  });
30
30
  }
@@ -0,0 +1,39 @@
1
+ import type { Prettify } from '../../prettify';
2
+ import type { Paramable } from '../../references';
3
+ import type { Builder } from '../builder/index';
4
+ import type { BuilderCollections, BuilderCollectionsSerialised } from '../collection/index';
5
+ import type { BuilderComponents, BuilderComponentsSerialised } from '../component/index';
6
+ import type { BuilderExpectation, BuilderExpectations, BuilderExpectationsSerialised } from '../expectation';
7
+ import type { BuilderOptions, BuilderOptionsSerialised } from '../option/index';
8
+ import type { BuilderModelStateAsserted } from './expectation';
9
+ import type { BuilderCollectionMethod, BuilderComponentMethod, BuilderOptionMethod } from './methods';
10
+ import type { BuilderModels, BuilderModelsMerge, BuilderModelsSerialised } from './models';
11
+ import type { BuilderModelState, BuilderModelStateEmpty } from './state';
12
+ import * as v from 'valibot';
13
+ export declare class BuilderModel<State extends BuilderModelState = BuilderModelStateEmpty> {
14
+ #private;
15
+ readonly type: 'model';
16
+ readonly models: State['models'];
17
+ readonly options: State['options'];
18
+ readonly components: State['components'];
19
+ readonly collections: State['collections'];
20
+ readonly expectations: BuilderExpectations;
21
+ constructor(models?: BuilderModels, options?: BuilderOptions, components?: BuilderComponents, collections?: BuilderCollections, expectations?: BuilderExpectations);
22
+ get option(): BuilderOptionMethod<State>;
23
+ get component(): BuilderComponentMethod<State>;
24
+ get collection(): BuilderCollectionMethod<State>;
25
+ expect<const Expectations extends readonly [BuilderExpectation, ...ReadonlyArray<BuilderExpectation>]>(...expectations: Expectations): BuilderModel<BuilderModelStateAsserted<State, Expectations>>;
26
+ }
27
+ export declare function model<const Parts extends BuilderModels>(...parts: Parts): BuilderModel<BuilderModelsMerge<Parts>>;
28
+ export type BuilderModelGeneric = BuilderModel<BuilderModelState>;
29
+ export declare const BuilderModelSchema: v.InstanceSchema<typeof BuilderModel, undefined>;
30
+ export interface BuilderModelSerialised {
31
+ readonly models: BuilderModelsSerialised;
32
+ readonly options: BuilderOptionsSerialised;
33
+ readonly components: BuilderComponentsSerialised;
34
+ readonly collections: BuilderCollectionsSerialised;
35
+ readonly expectations: BuilderExpectationsSerialised;
36
+ }
37
+ export declare const BuilderModelSerialisedSchema: v.GenericSchema<BuilderModelSerialised>;
38
+ export type BuilderModelStateOf<Input extends Paramable<BuilderModelGeneric>> = Input extends BuilderModel<infer State extends BuilderModelState> ? State : BuilderModelStateEmpty;
39
+ export type BuilderInstanceOf<Input> = Input extends BuilderModel<infer State extends BuilderModelState> ? Prettify<State['instance']> : Input extends Builder<infer State extends BuilderModelState> ? Prettify<State['instance']> : never;
@@ -0,0 +1,73 @@
1
+ import * as v from 'valibot';
2
+ import { serialisable } from '../../serialisable.js';
3
+ import { BuilderCollectionsSerialisedSchema } from '../collection/index.js';
4
+ import { BuilderComponentsSerialisedSchema } from '../component/index.js';
5
+ import { BuilderExpectationsSerialisedSchema } from '../expectation.js';
6
+ import { BuilderOptionsSerialisedSchema } from '../option/index.js';
7
+ import { builderCollectionMethod, builderComponentMethod, builderOptionMethod } from './methods.js';
8
+ import { BuilderModelsSerialisedSchema } from './models.js';
9
+ export class BuilderModel {
10
+ models;
11
+ options;
12
+ components;
13
+ collections;
14
+ expectations;
15
+ constructor(models = [], options = [], components = [], collections = [], expectations = []) {
16
+ this.models = models;
17
+ this.options = options;
18
+ this.components = components;
19
+ this.collections = collections;
20
+ this.expectations = expectations;
21
+ }
22
+ get option() {
23
+ const method = builderOptionMethod();
24
+ const add = (name, payload) => {
25
+ return this.#next({ options: [...this.options, method(name, payload)] });
26
+ };
27
+ const when = (paths, name, config) => {
28
+ return this.#next({ options: [...this.options, method.when(paths, name, config)] });
29
+ };
30
+ return Object.assign(add, { when });
31
+ }
32
+ get component() {
33
+ const method = builderComponentMethod();
34
+ const add = (name, details) => {
35
+ return this.#next({ components: [...this.components, method(name, details)] });
36
+ };
37
+ const when = (paths, name, config) => {
38
+ return this.#next({
39
+ components: [...this.components, method.when(paths, name, config)]
40
+ });
41
+ };
42
+ return Object.assign(add, { when });
43
+ }
44
+ get collection() {
45
+ const method = builderCollectionMethod();
46
+ const add = (name, payload) => {
47
+ return this.#next({ collections: [...this.collections, method(name, payload)] });
48
+ };
49
+ const when = (paths, name, config) => {
50
+ return this.#next({
51
+ collections: [...this.collections, method.when(paths, name, config)]
52
+ });
53
+ };
54
+ return Object.assign(add, { when });
55
+ }
56
+ expect(...expectations) {
57
+ return this.#next({ expectations: [...this.expectations, ...expectations] });
58
+ }
59
+ #next(patch) {
60
+ return new BuilderModel(this.models, patch.options ?? this.options, patch.components ?? this.components, patch.collections ?? this.collections, patch.expectations ?? this.expectations);
61
+ }
62
+ }
63
+ export function model(...parts) {
64
+ return new BuilderModel(parts, [], [], [], []);
65
+ }
66
+ export const BuilderModelSchema = v.instance(BuilderModel);
67
+ export const BuilderModelSerialisedSchema = serialisable(v.object({
68
+ models: BuilderModelsSerialisedSchema,
69
+ options: BuilderOptionsSerialisedSchema,
70
+ components: BuilderComponentsSerialisedSchema,
71
+ collections: BuilderCollectionsSerialisedSchema,
72
+ expectations: BuilderExpectationsSerialisedSchema
73
+ }));
@@ -0,0 +1,39 @@
1
+ import type { Paramable, ParamableSerialised } from '../../references';
2
+ import type { BuilderModelValidated } from '../validated';
3
+ import type { BuilderModelGeneric, BuilderModelSerialised, BuilderModelStateOf } from './model';
4
+ import type { BuilderModelStateAppend, BuilderModelStateEmpty } from './state';
5
+ import * as v from 'valibot';
6
+ export type BuilderModels = ReadonlyArray<Paramable<BuilderModelGeneric>>;
7
+ export type BuilderModelsSerialised = ReadonlyArray<ParamableSerialised<BuilderModelSerialised>>;
8
+ export declare const BuilderModelsSerialisedSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.UnionSchema<[v.SchemaWithPipe<readonly [v.ObjectSchema<{
9
+ readonly type: v.LiteralSchema<"parameter", undefined>;
10
+ readonly id: v.StringSchema<undefined>;
11
+ readonly name: v.StringSchema<undefined>;
12
+ }, undefined>, v.ReadonlyAction<{
13
+ type: "parameter";
14
+ id: string;
15
+ name: string;
16
+ }>]>, v.SchemaWithPipe<readonly [v.ObjectSchema<{
17
+ readonly type: v.LiteralSchema<"ref", undefined>;
18
+ readonly id: v.StringSchema<undefined>;
19
+ }, undefined>, v.ReadonlyAction<{
20
+ type: "ref";
21
+ id: string;
22
+ }>]>, v.LazySchema<v.GenericSchema<BuilderModelSerialised>>], undefined>, undefined>, v.ReadonlyAction<(Readonly<{
23
+ type: "parameter";
24
+ id: string;
25
+ name: string;
26
+ }> | Readonly<{
27
+ type: "ref";
28
+ id: string;
29
+ }> | BuilderModelSerialised)[]>]>;
30
+ export type BuilderModelsMerge<Parts extends BuilderModels> = BuilderModelStateAppend<BuilderModelStateEmpty, {
31
+ instance: BuilderModelsInstanceMerge<Parts>;
32
+ models: Parts;
33
+ }>;
34
+ type BuilderModelsInstanceMerge<Parts extends BuilderModels> = Parts extends readonly [
35
+ infer Head,
36
+ ...infer Tail extends BuilderModels
37
+ ] ? Head extends BuilderModelGeneric ? BuilderModelStateOf<Head>['instance'] & BuilderModelsInstanceMerge<Tail> : BuilderModelsInstanceMerge<Tail> : unknown;
38
+ export declare function modelsMerge(model: BuilderModelValidated): BuilderModelValidated;
39
+ export {};
@@ -0,0 +1,14 @@
1
+ import * as v from 'valibot';
2
+ import { paramable } from '../../references.js';
3
+ import { BuilderModelSerialisedSchema } from './model.js';
4
+ export const BuilderModelsSerialisedSchema = v.pipe(v.array(paramable(v.lazy(() => BuilderModelSerialisedSchema))), v.readonly());
5
+ export function modelsMerge(model) {
6
+ const merged = model.models.map(modelsMerge);
7
+ return {
8
+ models: [],
9
+ options: [...model.options, ...merged.flatMap((nested) => nested.options)],
10
+ components: [...model.components, ...merged.flatMap((nested) => nested.components)],
11
+ collections: [...model.collections, ...merged.flatMap((nested) => nested.collections)],
12
+ expectations: [...model.expectations, ...merged.flatMap((nested) => nested.expectations)]
13
+ };
14
+ }
@@ -1,25 +1,25 @@
1
1
  import type { Prettify } from '../../prettify';
2
- import type { BuilderParameters } from '../../references';
3
2
  import type { BuilderCollections } from '../collection/index';
4
3
  import type { BuilderComponents } from '../component/index';
5
4
  import type { BuilderOptions } from '../option/index';
6
- export type BuilderState = {
7
- model: unknown;
8
- parameters: BuilderParameters;
5
+ import type { BuilderModels } from './models';
6
+ export type BuilderModelState = {
7
+ instance: unknown;
8
+ models: BuilderModels;
9
9
  options: BuilderOptions;
10
10
  components: BuilderComponents;
11
11
  collections: BuilderCollections;
12
12
  };
13
- export type BuilderStateEmpty = {
14
- readonly model: unknown;
15
- readonly parameters: [];
13
+ export type BuilderModelStateEmpty = {
14
+ readonly instance: unknown;
15
+ readonly models: [];
16
16
  readonly options: [];
17
17
  readonly components: [];
18
18
  readonly collections: [];
19
19
  };
20
- export type BuilderStateAppend<State extends BuilderState, Patch extends Partial<BuilderState>> = {
21
- model: Prettify<'model' extends keyof Patch ? Patch['model'] : State['model']>;
22
- parameters: 'parameters' extends keyof Patch ? Extract<Patch['parameters'], BuilderParameters> : State['parameters'];
20
+ export type BuilderModelStateAppend<State extends BuilderModelState, Patch extends Partial<BuilderModelState>> = {
21
+ instance: Prettify<'instance' extends keyof Patch ? Patch['instance'] : State['instance']>;
22
+ models: Extract<'models' extends keyof Patch ? Patch['models'] : State['models'], BuilderModels>;
23
23
  options: Extract<'options' extends keyof Patch ? Patch['options'] : State['options'], BuilderOptions>;
24
24
  components: Extract<'components' extends keyof Patch ? Patch['components'] : State['components'], BuilderComponents>;
25
25
  collections: Extract<'collections' extends keyof Patch ? Patch['collections'] : State['collections'], BuilderCollections>;
@@ -6,6 +6,6 @@ export type { BuilderOptionWhen } from './when';
6
6
  export { BuilderOption, BuilderOptionSchema, BuilderOptionSelectMapSerialisedSchema, BuilderOptionSerialisedSchema, BuilderOptionsSerialisedSchema, BuilderOptionWhenSerialisedSchema } from './option.js';
7
7
  export { BuilderSelectType, BuilderSelectTypeSchema, BuilderSelectTypeSerialisedSchema, select } from './select.js';
8
8
  export { BuilderToggleType, BuilderToggleTypeSchema, BuilderToggleTypeSerialisedSchema, toggleBoolean, toggleNumber, toggleString } from './toggle.js';
9
- export { BuilderOptionValuesSchema, BuilderOptionValuesSerialisedSchema } from './values.js';
9
+ export { BuilderOptionValuesSchema, BuilderOptionValuesSerialisedSchema, optionValueSchema } from './values.js';
10
10
  export { optionExpectation } from './expectation.js';
11
11
  export { optionWhen } from './when.js';
@@ -1,6 +1,6 @@
1
1
  export { BuilderOption, BuilderOptionSchema, BuilderOptionSelectMapSerialisedSchema, BuilderOptionSerialisedSchema, BuilderOptionsSerialisedSchema, BuilderOptionWhenSerialisedSchema } from './option.js';
2
2
  export { BuilderSelectType, BuilderSelectTypeSchema, BuilderSelectTypeSerialisedSchema, select } from './select.js';
3
3
  export { BuilderToggleType, BuilderToggleTypeSchema, BuilderToggleTypeSerialisedSchema, toggleBoolean, toggleNumber, toggleString } from './toggle.js';
4
- export { BuilderOptionValuesSchema, BuilderOptionValuesSerialisedSchema } from './values.js';
4
+ export { BuilderOptionValuesSchema, BuilderOptionValuesSerialisedSchema, optionValueSchema } from './values.js';
5
5
  export { optionExpectation } from './expectation.js';
6
6
  export { optionWhen } from './when.js';