@builder-builder/builder 0.0.6 → 0.0.8

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 (216) hide show
  1. package/dist/check.d.ts +2 -1
  2. package/dist/check.js +6 -2
  3. package/dist/entities/builder/builder.d.ts +494 -0
  4. package/dist/entities/builder/builder.js +84 -0
  5. package/dist/entities/builder/builders.d.ts +20 -0
  6. package/dist/entities/builder/builders.js +18 -0
  7. package/dist/entities/builder/expectation.d.ts +12 -0
  8. package/dist/entities/builder/index.d.ts +7 -0
  9. package/dist/entities/builder/index.js +3 -0
  10. package/dist/entities/builder/methods.d.ts +58 -0
  11. package/dist/entities/builder/methods.js +30 -0
  12. package/dist/entities/builder/parameter.d.ts +61 -0
  13. package/dist/entities/builder/parameter.js +18 -0
  14. package/dist/entities/builder/state.d.ts +26 -0
  15. package/dist/entities/builder/validate.d.ts +3 -0
  16. package/dist/entities/builder/validate.js +108 -0
  17. package/dist/entities/collection/collection.d.ts +37 -0
  18. package/dist/entities/collection/collection.js +42 -0
  19. package/dist/entities/collection/config.d.ts +1094 -0
  20. package/dist/entities/collection/config.js +23 -0
  21. package/dist/entities/collection/expectation.d.ts +7 -0
  22. package/dist/entities/collection/expectation.js +4 -0
  23. package/dist/entities/collection/index.d.ts +8 -0
  24. package/dist/entities/collection/index.js +4 -0
  25. package/dist/entities/collection/when.d.ts +9 -0
  26. package/dist/entities/collection/when.js +2 -0
  27. package/dist/entities/component/component.d.ts +403 -0
  28. package/dist/entities/component/component.js +24 -0
  29. package/dist/entities/component/details.d.ts +82 -0
  30. package/dist/entities/component/details.js +17 -0
  31. package/dist/entities/component/expectation.d.ts +8 -0
  32. package/dist/entities/component/expectation.js +7 -0
  33. package/dist/entities/component/index.d.ts +8 -0
  34. package/dist/entities/component/index.js +4 -0
  35. package/dist/entities/component/when.d.ts +11 -0
  36. package/dist/entities/component/when.js +20 -0
  37. package/dist/entities/errors.d.ts +21 -0
  38. package/dist/entities/expectation.d.ts +44 -0
  39. package/dist/entities/expectation.js +23 -0
  40. package/dist/entities/index.d.ts +18 -0
  41. package/dist/entities/index.js +9 -0
  42. package/dist/entities/option/expectation.d.ts +2 -0
  43. package/dist/entities/option/expectation.js +4 -0
  44. package/dist/entities/option/index.d.ts +11 -0
  45. package/dist/entities/option/index.js +6 -0
  46. package/dist/entities/option/option.d.ts +347 -0
  47. package/dist/entities/option/option.js +24 -0
  48. package/dist/entities/option/select.d.ts +49 -0
  49. package/dist/entities/option/select.js +40 -0
  50. package/dist/entities/option/toggle.d.ts +39 -0
  51. package/dist/entities/option/toggle.js +42 -0
  52. package/dist/entities/option/values.d.ts +63 -0
  53. package/dist/entities/option/values.js +8 -0
  54. package/dist/entities/option/when.d.ts +9 -0
  55. package/dist/entities/option/when.js +2 -0
  56. package/dist/entities/serialise.d.ts +3801 -0
  57. package/dist/entities/serialise.js +41 -0
  58. package/dist/entities/ui/describe.d.ts +100 -0
  59. package/dist/entities/ui/describe.js +22 -0
  60. package/dist/entities/ui/index.d.ts +14 -0
  61. package/dist/entities/ui/index.js +7 -0
  62. package/dist/entities/ui/label.d.ts +18 -0
  63. package/dist/entities/ui/label.js +12 -0
  64. package/dist/entities/ui/page.d.ts +96 -0
  65. package/dist/entities/ui/page.js +20 -0
  66. package/dist/entities/ui/pages.d.ts +431 -0
  67. package/dist/entities/ui/pages.js +29 -0
  68. package/dist/entities/ui/parameter.d.ts +7 -0
  69. package/dist/entities/ui/parameter.js +29 -0
  70. package/dist/entities/ui/ui.d.ts +1582 -0
  71. package/dist/entities/ui/ui.js +53 -0
  72. package/dist/entities/ui/uis.d.ts +10 -0
  73. package/dist/entities/ui/uis.js +20 -0
  74. package/dist/entities/ui/validate.d.ts +8 -0
  75. package/dist/entities/ui/validate.js +21 -0
  76. package/dist/entities/validate.d.ts +28 -0
  77. package/dist/entities/validate.js +1 -0
  78. package/dist/entities/when.d.ts +176 -0
  79. package/dist/entities/when.js +47 -0
  80. package/dist/exception.d.ts +8 -0
  81. package/dist/exception.js +7 -0
  82. package/dist/index.d.ts +37 -13
  83. package/dist/index.js +22 -5
  84. package/dist/mappers/assert/builder.d.ts +2 -0
  85. package/dist/mappers/assert/builder.js +46 -0
  86. package/dist/mappers/assert/expectation.d.ts +2 -0
  87. package/dist/mappers/assert/expectation.js +23 -0
  88. package/dist/mappers/assert/index.d.ts +6 -0
  89. package/dist/mappers/assert/index.js +4 -0
  90. package/dist/mappers/assert/model.d.ts +13 -0
  91. package/dist/mappers/assert/model.js +47 -0
  92. package/dist/mappers/assert/models.d.ts +33 -0
  93. package/dist/mappers/assert/models.js +74 -0
  94. package/dist/mappers/assert/ui.d.ts +2 -0
  95. package/dist/mappers/assert/ui.js +22 -0
  96. package/dist/mappers/index.d.ts +7 -0
  97. package/dist/mappers/index.js +4 -0
  98. package/dist/mappers/instance/index.d.ts +1 -0
  99. package/dist/mappers/instance/index.js +1 -0
  100. package/dist/mappers/instance/instance.d.ts +4 -0
  101. package/dist/mappers/instance/instance.js +33 -0
  102. package/dist/mappers/models/component-graph.d.ts +9 -0
  103. package/dist/{core/component/graph.js → mappers/models/component-graph.js} +3 -3
  104. package/dist/{core → mappers/models}/graph.d.ts +4 -1
  105. package/dist/mappers/models/graph.js +17 -0
  106. package/dist/mappers/models/index.d.ts +1 -0
  107. package/dist/mappers/models/index.js +1 -0
  108. package/dist/mappers/models/models.d.ts +3 -0
  109. package/dist/mappers/models/models.js +37 -0
  110. package/dist/mappers/models/option-graph.d.ts +9 -0
  111. package/dist/mappers/models/option-graph.js +77 -0
  112. package/dist/mappers/order/index.d.ts +2 -0
  113. package/dist/mappers/order/index.js +1 -0
  114. package/dist/mappers/order/order.d.ts +14 -0
  115. package/dist/mappers/order/order.js +31 -0
  116. package/dist/mappers/render/index.d.ts +4 -0
  117. package/dist/mappers/render/index.js +2 -0
  118. package/dist/mappers/render/ordinal.d.ts +1 -0
  119. package/dist/mappers/render/ordinal.js +20 -0
  120. package/dist/mappers/render/pages.d.ts +15 -0
  121. package/dist/mappers/render/pages.js +1 -0
  122. package/dist/mappers/render/render.d.ts +8 -0
  123. package/dist/mappers/render/render.js +124 -0
  124. package/dist/mappers/resolve.d.ts +9 -0
  125. package/dist/mappers/resolve.js +57 -0
  126. package/dist/model.d.ts +8 -8
  127. package/dist/paths.d.ts +5 -16
  128. package/dist/paths.js +3 -0
  129. package/dist/primitive.d.ts +5 -0
  130. package/dist/{schemas/primitives.js → primitive.js} +0 -2
  131. package/dist/references.d.ts +60 -0
  132. package/dist/references.js +26 -0
  133. package/dist/serialisable.d.ts +10 -0
  134. package/dist/serialisable.js +5 -0
  135. package/dist/walker/index.d.ts +2 -0
  136. package/dist/walker/index.js +1 -0
  137. package/dist/walker/walkable.d.ts +4 -0
  138. package/dist/walker/walkable.js +4 -0
  139. package/dist/walker/walker.d.ts +18 -0
  140. package/dist/walker/walker.js +103 -0
  141. package/dist/walker/walkers.d.ts +8 -0
  142. package/dist/walker/walkers.js +51 -0
  143. package/package.json +10 -4
  144. package/dist/core/builder.d.ts +0 -70
  145. package/dist/core/builder.js +0 -124
  146. package/dist/core/collection/collection.d.ts +0 -32
  147. package/dist/core/collection/collection.js +0 -37
  148. package/dist/core/collection/index.d.ts +0 -4
  149. package/dist/core/collection/index.js +0 -2
  150. package/dist/core/collection/method.d.ts +0 -30
  151. package/dist/core/collection/method.js +0 -11
  152. package/dist/core/component/component.d.ts +0 -9
  153. package/dist/core/component/component.js +0 -10
  154. package/dist/core/component/graph.d.ts +0 -9
  155. package/dist/core/component/index.d.ts +0 -4
  156. package/dist/core/component/index.js +0 -2
  157. package/dist/core/component/method.d.ts +0 -11
  158. package/dist/core/expectation.d.ts +0 -45
  159. package/dist/core/expectation.js +0 -22
  160. package/dist/core/graph.js +0 -3
  161. package/dist/core/index.d.ts +0 -12
  162. package/dist/core/index.js +0 -6
  163. package/dist/core/option/graph.d.ts +0 -10
  164. package/dist/core/option/graph.js +0 -78
  165. package/dist/core/option/index.d.ts +0 -9
  166. package/dist/core/option/index.js +0 -5
  167. package/dist/core/option/method.d.ts +0 -70
  168. package/dist/core/option/method.js +0 -13
  169. package/dist/core/option/option.d.ts +0 -30
  170. package/dist/core/option/option.js +0 -42
  171. package/dist/core/option/select.d.ts +0 -22
  172. package/dist/core/option/select.js +0 -34
  173. package/dist/core/option/toggle.d.ts +0 -14
  174. package/dist/core/option/toggle.js +0 -27
  175. package/dist/core/parameter.d.ts +0 -48
  176. package/dist/core/parameter.js +0 -31
  177. package/dist/core/when/config.d.ts +0 -20
  178. package/dist/core/when/config.js +0 -4
  179. package/dist/core/when/constrain.d.ts +0 -14
  180. package/dist/core/when/index.d.ts +0 -5
  181. package/dist/core/when/index.js +0 -2
  182. package/dist/core/when/nullability.d.ts +0 -18
  183. package/dist/core/when/resolve.d.ts +0 -18
  184. package/dist/core/when/resolve.js +0 -22
  185. package/dist/resolve/index.d.ts +0 -9
  186. package/dist/resolve/index.js +0 -5
  187. package/dist/resolve/instance.d.ts +0 -3
  188. package/dist/resolve/instance.js +0 -26
  189. package/dist/resolve/models.d.ts +0 -3
  190. package/dist/resolve/models.js +0 -10
  191. package/dist/resolve/order.d.ts +0 -19
  192. package/dist/resolve/order.js +0 -24
  193. package/dist/resolve/render.d.ts +0 -21
  194. package/dist/resolve/render.js +0 -171
  195. package/dist/resolve/validate.d.ts +0 -33
  196. package/dist/resolve/validate.js +0 -51
  197. package/dist/schemas/description.d.ts +0 -5
  198. package/dist/schemas/description.js +0 -3
  199. package/dist/schemas/index.d.ts +0 -6
  200. package/dist/schemas/index.js +0 -3
  201. package/dist/schemas/primitives.d.ts +0 -9
  202. package/dist/schemas/ui.d.ts +0 -96
  203. package/dist/schemas/ui.js +0 -23
  204. package/dist/serialise/deserialise.d.ts +0 -9
  205. package/dist/serialise/deserialise.js +0 -113
  206. package/dist/serialise/index.d.ts +0 -4
  207. package/dist/serialise/index.js +0 -3
  208. package/dist/serialise/schemas.d.ts +0 -1885
  209. package/dist/serialise/schemas.js +0 -141
  210. package/dist/serialise/serialise.d.ts +0 -10
  211. package/dist/serialise/serialise.js +0 -140
  212. package/dist/ui.d.ts +0 -18
  213. package/dist/ui.js +0 -53
  214. /package/dist/{core/component/method.js → entities/builder/expectation.js} +0 -0
  215. /package/dist/{core/when/constrain.js → entities/builder/state.js} +0 -0
  216. /package/dist/{core/when/nullability.js → entities/errors.js} +0 -0
@@ -0,0 +1,53 @@
1
+ import * as v from 'valibot';
2
+ import { BuilderRefsSerialisedSchema, isRef, refable } from '../../references.js';
3
+ import { serialisable } from '../../serialisable.js';
4
+ import { BuilderSerialisedSchema } from '../builder/index.js';
5
+ import { BuilderExpectationsSerialisedSchema } from '../expectation.js';
6
+ import { bindUI } from './parameter.js';
7
+ import { BuilderUIDescribe } from './describe.js';
8
+ import { BuilderUILabel } from './label.js';
9
+ import { BuilderUIPage } from './page.js';
10
+ import { BuilderUIItemsSerialisedSchema, BuilderUIPages } from './pages.js';
11
+ import { validatePagesCollections } from './validate.js';
12
+ export class BuilderUI {
13
+ builder;
14
+ references;
15
+ items;
16
+ expectations;
17
+ id = crypto.randomUUID();
18
+ constructor(builder, references, items, expectations) {
19
+ this.builder = builder;
20
+ this.references = references;
21
+ this.items = items;
22
+ this.expectations = expectations;
23
+ validatePagesCollections(builder, items);
24
+ }
25
+ expect(...expectations) {
26
+ return new BuilderUI(this.builder, this.references, this.items, [...this.expectations, ...expectations]
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- type narrowing cast, validated at merge time
28
+ );
29
+ }
30
+ page(label, paths) {
31
+ return new BuilderUI(this.builder, this.references, [...this.items, new BuilderUIPage(this.#label(label), paths)], this.expectations);
32
+ }
33
+ describe(label, paths) {
34
+ return new BuilderUI(this.builder, this.references, [...this.items, new BuilderUIDescribe(this.#label(label), paths)], this.expectations);
35
+ }
36
+ pages(name, label, itemUI) {
37
+ const items = isRef(itemUI) ? itemUI : itemUI.items;
38
+ return new BuilderUI(this.builder, this.references, [...this.items, new BuilderUIPages(name, this.#label(label), items)], this.expectations);
39
+ }
40
+ bind(bindings) {
41
+ return bindUI(this, bindings);
42
+ }
43
+ #label(label) {
44
+ return isRef(label) ? label : new BuilderUILabel(label);
45
+ }
46
+ }
47
+ export const BuilderUISchema = v.instance(BuilderUI);
48
+ export const BuilderUISerialisedSchema = serialisable(BuilderUI, v.object({
49
+ builder: refable(v.lazy(() => BuilderSerialisedSchema)),
50
+ references: BuilderRefsSerialisedSchema,
51
+ items: BuilderUIItemsSerialisedSchema,
52
+ expectations: BuilderExpectationsSerialisedSchema
53
+ }));
@@ -0,0 +1,10 @@
1
+ import type { BuilderGeneric } from '../builder/index';
2
+ import type { BuilderUIReferences } from './ui';
3
+ import { BuilderRef } from '../../references.js';
4
+ import { BuilderUI } from './ui.js';
5
+ export declare function uis(): BuilderUI<BuilderRef>;
6
+ export declare function uis<const BuilderType extends BuilderGeneric>(uiBuilder: BuilderType, ...parts: BuilderUIReferences): BuilderUI<BuilderType>;
7
+ export declare function mergeUIParts(parts: ReadonlyArray<unknown>): {
8
+ references: BuilderRef[];
9
+ expectations: import("..").BuilderExpectation<string, unknown, "option" | "component" | "collection" | "detail">[];
10
+ };
@@ -0,0 +1,20 @@
1
+ import * as v from 'valibot';
2
+ import { BuilderRef } from '../../references.js';
3
+ import { BuilderUI, BuilderUISchema } from './ui.js';
4
+ export function uis(uiBuilder, ...parts) {
5
+ const builder = uiBuilder ?? new BuilderRef('builder');
6
+ const merged = mergeUIParts(parts);
7
+ return new BuilderUI(builder, merged.references, parts.flatMap((part) => {
8
+ if (v.is(BuilderUISchema, part)) {
9
+ return [...part.items];
10
+ }
11
+ return [part];
12
+ }), merged.expectations);
13
+ }
14
+ export function mergeUIParts(parts) {
15
+ const instances = parts.filter((part) => v.is(BuilderUISchema, part));
16
+ return {
17
+ references: instances.flatMap((instance) => [...instance.references]),
18
+ expectations: instances.flatMap((instance) => [...instance.expectations])
19
+ };
20
+ }
@@ -0,0 +1,8 @@
1
+ import type { Refable } from '../../references';
2
+ import type { BuilderGeneric } from '../builder/index';
3
+ import type { BuilderUIItems } from './pages';
4
+ export type BuilderErrorPagesUnknownCollection = {
5
+ readonly kind: 'pages-unknown-collection';
6
+ readonly name: string;
7
+ };
8
+ export declare function validatePagesCollections(builder: Refable<BuilderGeneric>, items: Refable<BuilderUIItems>): void;
@@ -0,0 +1,21 @@
1
+ import { BuilderException } from '../../exception.js';
2
+ import { isRef } from '../../references.js';
3
+ import { BuilderUIPages } from './pages.js';
4
+ export function validatePagesCollections(builder, items) {
5
+ if (isRef(builder) || isRef(items)) {
6
+ return;
7
+ }
8
+ const errors = items.flatMap((item) => {
9
+ if (isRef(item) || !(item instanceof BuilderUIPages)) {
10
+ return [];
11
+ }
12
+ const exists = builder.collections.some((entry) => entry.name === item.name);
13
+ if (exists) {
14
+ return [];
15
+ }
16
+ return [{ kind: 'pages-unknown-collection', name: item.name }];
17
+ });
18
+ if (errors.length > 0) {
19
+ throw new BuilderException(errors);
20
+ }
21
+ }
@@ -0,0 +1,28 @@
1
+ import type { BuilderExpectation } from './expectation';
2
+ import type { BuilderRef } from '../references';
3
+ import type { Builder, BuilderGeneric } from './builder/index';
4
+ import type { BuilderCollection, BuilderCollectionConfig } from './collection/index';
5
+ import type { BuilderComponent, BuilderComponentDetails } from './component/index';
6
+ import type { BuilderOption, BuilderSelectType, BuilderToggleType } from './option/index';
7
+ import type { BuilderUI, BuilderUIDescribe, BuilderUIGeneric, BuilderUIItem, BuilderUIItems, BuilderUILabel, BuilderUIPage, BuilderUIPages } from './ui/index';
8
+ export type Strip<T> = T extends BuilderRef ? never : T extends BuilderSelectType | BuilderToggleType | BuilderUILabel | BuilderExpectation ? T : T extends Builder<infer State> ? Builder<Strip<State>> : T extends BuilderOption<infer Name, infer Payload, infer GatePaths> ? StripEntry<BuilderOption<Name, Strip<Payload>, Strip<GatePaths>>, Payload, GatePaths> : T extends BuilderComponent<infer Name, infer Payload, infer GatePaths> ? StripEntry<BuilderComponent<Name, Strip<Payload>, Strip<GatePaths>>, Payload, GatePaths> : T extends BuilderCollection<infer Name, infer Payload, infer GatePaths> ? StripEntry<BuilderCollection<Name, Strip<Payload>, Strip<GatePaths>>, Payload, GatePaths> : T extends BuilderCollectionConfig<infer Inner, infer Min, infer Max> ? BuilderCollectionConfig<Strip<Inner>, Strip<Min>, Strip<Max>> : T extends BuilderComponentDetails<infer Expectations> ? BuilderComponentDetails<Strip<Expectations>> : T extends BuilderUI<infer Inner, infer Items> ? BuilderUI<Strip<Inner>, Strip<Items> & BuilderUIItems> : T extends BuilderUIPage<infer Label, infer Paths> ? BuilderUIPage<Strip<Label>, Strip<Paths>> : T extends BuilderUIDescribe<infer Label, infer Paths> ? BuilderUIDescribe<Strip<Label>, Strip<Paths>> : T extends BuilderUIPages<infer Name, infer Label, infer Items> ? BuilderUIPages<Name, Strip<Label>, Strip<Items>> : T extends ReadonlyArray<unknown> ? StripTuple<T> : T extends object ? {
9
+ readonly [Key in keyof T]: Strip<T[Key]>;
10
+ } : T;
11
+ type StripEntry<Narrowed, Payload, GatePaths> = [Strip<Payload>] extends [never] ? never : [Strip<GatePaths>] extends [never] ? never : Narrowed;
12
+ export type StripTuple<T extends ReadonlyArray<unknown>> = T extends readonly [
13
+ infer Head,
14
+ ...infer Rest extends ReadonlyArray<unknown>
15
+ ] ? [Strip<Head>] extends [never] ? StripTuple<Rest> : readonly [Strip<Head>, ...StripTuple<Rest>] : T extends readonly [] ? readonly [] : ReadonlyArray<Strip<T[number]>>;
16
+ export type BuilderValidated = Strip<BuilderGeneric>;
17
+ export type BuilderOptionValidated = Strip<BuilderOption>;
18
+ export type BuilderOptionsValidated = ReadonlyArray<BuilderOptionValidated>;
19
+ export type BuilderComponentValidated = Strip<BuilderComponent>;
20
+ export type BuilderComponentsValidated = ReadonlyArray<BuilderComponentValidated>;
21
+ export type BuilderComponentDetailsValidated = Strip<BuilderComponentDetails>;
22
+ export type BuilderCollectionValidated = Strip<BuilderCollection>;
23
+ export type BuilderCollectionsValidated = ReadonlyArray<BuilderCollectionValidated>;
24
+ export type BuilderCollectionConfigValidated = Strip<BuilderCollectionConfig>;
25
+ export type BuilderUIValidated = Strip<BuilderUIGeneric>;
26
+ export type BuilderUIItemValidated = Strip<BuilderUIItem>;
27
+ export type BuilderUIItemsValidated = Strip<BuilderUIItems>;
28
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,176 @@
1
+ import type { BuilderPath, BuilderPaths } from '../paths';
2
+ import type { BuilderPrimitive, BuilderPrimitives } from '../primitive';
3
+ import type { BuilderRef, BuilderRefSerialised, Refable } from '../references';
4
+ import type { BuilderGeneric, BuilderState, BuilderStateOf } from './builder/index';
5
+ import * as v from 'valibot';
6
+ export type BuilderEnableConfig<Payload = unknown> = {
7
+ readonly type: 'enable';
8
+ readonly payload: Payload;
9
+ };
10
+ export type BuilderMatchSelectMap<Item> = Record<string, Item | null>;
11
+ export type BuilderMatchConfig<Payload = unknown, MatchPath = BuilderPath, SelectMap = BuilderMatchSelectMap<Payload>> = {
12
+ readonly type: 'match';
13
+ readonly matchPath: MatchPath;
14
+ readonly selectMap: SelectMap;
15
+ };
16
+ export type BuilderUnlessConfig<Payload = unknown, UnlessPath = BuilderPath> = {
17
+ readonly type: 'unless';
18
+ readonly unlessPath: UnlessPath;
19
+ readonly disabledValues: BuilderPrimitives;
20
+ readonly payload: Payload;
21
+ };
22
+ export type BuilderWhen<Payload = unknown, MatchPath = BuilderPath, MatchSelectMap = Record<string, Payload | null>, UnlessPath = BuilderPath> = BuilderEnableConfig<Payload> | BuilderMatchConfig<Payload, MatchPath, MatchSelectMap> | BuilderUnlessConfig<Payload, UnlessPath>;
23
+ export type WhenSerialised<Payload> = {
24
+ readonly type: 'enable';
25
+ readonly payload: Payload | BuilderRefSerialised;
26
+ } | {
27
+ readonly type: 'match';
28
+ readonly matchPath: BuilderRefSerialised | BuilderPath;
29
+ readonly selectMap: Record<string, (Payload | BuilderRefSerialised) | null> | BuilderRefSerialised;
30
+ } | {
31
+ readonly type: 'unless';
32
+ readonly unlessPath: BuilderRefSerialised | BuilderPath;
33
+ readonly disabledValues: BuilderPrimitives;
34
+ readonly payload: Payload | BuilderRefSerialised;
35
+ };
36
+ export type WhenConfigPayload<Config extends BuilderWhenConfig, Payload> = Config extends {
37
+ readonly payload: infer Inner extends Payload;
38
+ } ? Inner : Config extends BuilderMatchConfig ? NonNullable<Config['selectMap'][keyof Config['selectMap']]> & Payload : never;
39
+ export declare const BuilderWhenEnableSchema: v.ObjectSchema<{
40
+ readonly type: v.LiteralSchema<"enable", undefined>;
41
+ }, undefined>;
42
+ export declare const BuilderWhenMatchSchema: v.ObjectSchema<{
43
+ readonly type: v.LiteralSchema<"match", undefined>;
44
+ readonly matchPath: v.SchemaWithPipe<readonly [v.UnionSchema<[v.SchemaWithPipe<readonly [v.ObjectSchema<{
45
+ readonly type: v.LiteralSchema<"ref", undefined>;
46
+ readonly id: v.StringSchema<undefined>;
47
+ readonly name: v.StringSchema<undefined>;
48
+ }, undefined>, v.ReadonlyAction<{
49
+ type: "ref";
50
+ id: string;
51
+ name: string;
52
+ }>]>, v.InstanceSchema<typeof BuilderRef, undefined>, v.SchemaWithPipe<readonly [v.ArraySchema<v.UnionSchema<[v.StringSchema<undefined>, v.NumberSchema<undefined>], undefined>, undefined>, v.ReadonlyAction<(string | number)[]>]>], undefined>, v.MetadataAction<readonly (string | number)[] | BuilderRef | Readonly<{
53
+ type: "ref";
54
+ id: string;
55
+ name: string;
56
+ }>, {
57
+ readonly refable: v.SchemaWithPipe<readonly [v.ArraySchema<v.UnionSchema<[v.StringSchema<undefined>, v.NumberSchema<undefined>], undefined>, undefined>, v.ReadonlyAction<(string | number)[]>]>;
58
+ }>]>;
59
+ }, undefined>;
60
+ export declare const BuilderWhenUnlessSchema: v.ObjectSchema<{
61
+ readonly type: v.LiteralSchema<"unless", undefined>;
62
+ readonly unlessPath: v.SchemaWithPipe<readonly [v.UnionSchema<[v.SchemaWithPipe<readonly [v.ObjectSchema<{
63
+ readonly type: v.LiteralSchema<"ref", undefined>;
64
+ readonly id: v.StringSchema<undefined>;
65
+ readonly name: v.StringSchema<undefined>;
66
+ }, undefined>, v.ReadonlyAction<{
67
+ type: "ref";
68
+ id: string;
69
+ name: string;
70
+ }>]>, v.InstanceSchema<typeof BuilderRef, undefined>, v.SchemaWithPipe<readonly [v.ArraySchema<v.UnionSchema<[v.StringSchema<undefined>, v.NumberSchema<undefined>], undefined>, undefined>, v.ReadonlyAction<(string | number)[]>]>], undefined>, v.MetadataAction<readonly (string | number)[] | BuilderRef | Readonly<{
71
+ type: "ref";
72
+ id: string;
73
+ name: string;
74
+ }>, {
75
+ readonly refable: v.SchemaWithPipe<readonly [v.ArraySchema<v.UnionSchema<[v.StringSchema<undefined>, v.NumberSchema<undefined>], undefined>, undefined>, v.ReadonlyAction<(string | number)[]>]>;
76
+ }>]>;
77
+ }, undefined>;
78
+ export declare const BuilderWhenConfigSchema: v.SchemaWithPipe<readonly [v.VariantSchema<"type", [v.ObjectSchema<{
79
+ readonly type: v.LiteralSchema<"enable", undefined>;
80
+ }, undefined>, v.ObjectSchema<{
81
+ readonly type: v.LiteralSchema<"match", undefined>;
82
+ readonly matchPath: v.SchemaWithPipe<readonly [v.UnionSchema<[v.SchemaWithPipe<readonly [v.ObjectSchema<{
83
+ readonly type: v.LiteralSchema<"ref", undefined>;
84
+ readonly id: v.StringSchema<undefined>;
85
+ readonly name: v.StringSchema<undefined>;
86
+ }, undefined>, v.ReadonlyAction<{
87
+ type: "ref";
88
+ id: string;
89
+ name: string;
90
+ }>]>, v.InstanceSchema<typeof BuilderRef, undefined>, v.SchemaWithPipe<readonly [v.ArraySchema<v.UnionSchema<[v.StringSchema<undefined>, v.NumberSchema<undefined>], undefined>, undefined>, v.ReadonlyAction<(string | number)[]>]>], undefined>, v.MetadataAction<readonly (string | number)[] | BuilderRef | Readonly<{
91
+ type: "ref";
92
+ id: string;
93
+ name: string;
94
+ }>, {
95
+ readonly refable: v.SchemaWithPipe<readonly [v.ArraySchema<v.UnionSchema<[v.StringSchema<undefined>, v.NumberSchema<undefined>], undefined>, undefined>, v.ReadonlyAction<(string | number)[]>]>;
96
+ }>]>;
97
+ }, undefined>, v.ObjectSchema<{
98
+ readonly type: v.LiteralSchema<"unless", undefined>;
99
+ readonly unlessPath: v.SchemaWithPipe<readonly [v.UnionSchema<[v.SchemaWithPipe<readonly [v.ObjectSchema<{
100
+ readonly type: v.LiteralSchema<"ref", undefined>;
101
+ readonly id: v.StringSchema<undefined>;
102
+ readonly name: v.StringSchema<undefined>;
103
+ }, undefined>, v.ReadonlyAction<{
104
+ type: "ref";
105
+ id: string;
106
+ name: string;
107
+ }>]>, v.InstanceSchema<typeof BuilderRef, undefined>, v.SchemaWithPipe<readonly [v.ArraySchema<v.UnionSchema<[v.StringSchema<undefined>, v.NumberSchema<undefined>], undefined>, undefined>, v.ReadonlyAction<(string | number)[]>]>], undefined>, v.MetadataAction<readonly (string | number)[] | BuilderRef | Readonly<{
108
+ type: "ref";
109
+ id: string;
110
+ name: string;
111
+ }>, {
112
+ readonly refable: v.SchemaWithPipe<readonly [v.ArraySchema<v.UnionSchema<[v.StringSchema<undefined>, v.NumberSchema<undefined>], undefined>, undefined>, v.ReadonlyAction<(string | number)[]>]>;
113
+ }>]>;
114
+ }, undefined>], undefined>, v.ReadonlyAction<{
115
+ type: "enable";
116
+ } | {
117
+ type: "match";
118
+ matchPath: readonly (string | number)[] | BuilderRef | Readonly<{
119
+ type: "ref";
120
+ id: string;
121
+ name: string;
122
+ }>;
123
+ } | {
124
+ type: "unless";
125
+ unlessPath: readonly (string | number)[] | BuilderRef | Readonly<{
126
+ type: "ref";
127
+ id: string;
128
+ name: string;
129
+ }>;
130
+ }>]>;
131
+ export type BuilderWhenConfig = v.InferOutput<typeof BuilderWhenConfigSchema>;
132
+ export declare function createWhenSerialisedSchema(payloadSchema: v.GenericSchema): v.GenericSchema;
133
+ export declare function createWhenFactories<Payload>(): {
134
+ enable: <const Values extends Refable<Payload>>(values: Values) => BuilderEnableConfig<Values>;
135
+ match: <const MatchPayload extends Refable<Payload>, const MatchPath extends Refable<BuilderPath>, const SelectMap extends Refable<BuilderMatchSelectMap<Refable<Payload>>>>(matchPath: MatchPath, selectMap: SelectMap) => BuilderMatchConfig<MatchPayload, MatchPath, SelectMap>;
136
+ unless: <const Values extends Refable<Payload>, const UnlessPath extends Refable<BuilderPath>>(unlessPath: UnlessPath, disabledValues: BuilderPrimitives, values: Values) => BuilderUnlessConfig<Values, UnlessPath>;
137
+ };
138
+ export type BuilderValidPath<State extends BuilderState> = ModelValidPath<State['model']>;
139
+ export type BuilderValidPaths<State extends BuilderState> = ReadonlyArray<BuilderValidPath<State>>;
140
+ export type BuilderValidPathsOf<Input extends Refable<BuilderGeneric>> = BuilderValidPaths<BuilderStateOf<Input>>;
141
+ export type BuilderWhenConstrained<State extends BuilderState, Config> = Config extends BuilderRef ? Config : Config extends {
142
+ readonly type: 'match';
143
+ readonly matchPath: infer MatchPath extends BuilderPath;
144
+ readonly selectMap: infer SelectMap;
145
+ } ? Config & {
146
+ readonly matchPath: [MatchPath] extends [Readonly<BuilderValidPath<State>>] ? MatchPath : Readonly<BuilderValidPath<State>>;
147
+ readonly selectMap: SelectMap extends BuilderRef ? SelectMap : Record<BuilderResolvePath<State['model'], MatchPath> & string, SelectMap[keyof SelectMap]>;
148
+ } : Config extends {
149
+ readonly type: 'unless';
150
+ readonly unlessPath: infer UnlessPath extends BuilderPath;
151
+ } ? Config & {
152
+ readonly unlessPath: [UnlessPath] extends [Readonly<BuilderValidPath<State>>] ? UnlessPath : Readonly<BuilderValidPath<State>>;
153
+ } : Config;
154
+ export type WhenConfigNullable<Config extends BuilderWhenConfig> = Config extends {
155
+ readonly type: 'unless';
156
+ } ? null : Config extends {
157
+ readonly type: 'match';
158
+ readonly selectMap: infer SelectMap;
159
+ } ? null extends SelectMap[keyof SelectMap] ? null : never : never;
160
+ export type WhenNullability<State extends BuilderState, GatePaths extends Refable<BuilderPaths>, Config extends Refable<BuilderWhenConfig>> = [GatePaths] extends [BuilderRef] ? null : WhenNullabilityFromPaths<State['model'], Extract<GatePaths, BuilderValidPaths<State>>, Config>;
161
+ type BuilderResolvePath<Model, Path extends BuilderPath> = Path extends readonly [
162
+ infer Head extends keyof Model & string
163
+ ] ? Model[Head] : Path extends readonly [
164
+ infer Head extends keyof Model & string,
165
+ ...infer Tail extends BuilderPath
166
+ ] ? Model[Head] extends ReadonlyArray<infer Item> ? Tail extends readonly [number, ...infer Rest extends BuilderPath] ? BuilderResolvePath<Item, Rest> : never : BuilderResolvePath<Model[Head], Tail> : never;
167
+ type WhenNullabilityFromPaths<Model, GatePaths extends BuilderPaths, Config extends Refable<BuilderWhenConfig>> = Config extends BuilderRef ? WhenPathsNullable<Model, GatePaths> : Config extends BuilderWhenConfig ? WhenPathsNullable<Model, GatePaths> | WhenConfigNullable<Config> : never;
168
+ type WhenPathsNullable<Model, GatePaths extends BuilderPaths> = GatePaths extends readonly [
169
+ infer Head extends BuilderPath,
170
+ ...infer Tail extends BuilderPaths
171
+ ] ? WhenPathNullable<Model, Head> | WhenPathsNullable<Model, Tail> : never;
172
+ type WhenPathNullable<Model, Path extends BuilderPath> = null extends BuilderResolvePath<Model, Path> ? null : never;
173
+ type ModelValidPath<Model, Depth extends ReadonlyArray<never> = []> = Depth['length'] extends 10 ? never : Model extends BuilderPrimitive | null ? never : Model extends ReadonlyArray<infer Item> ? [number] | [number, ...ModelValidPath<Item, [...Depth, never]>] : {
174
+ [Key in keyof Model & string]: [Key] | (Model[Key] extends BuilderPrimitive | null ? never : [Key, ...ModelValidPath<Model[Key], [...Depth, never]>]);
175
+ }[keyof Model & string];
176
+ export {};
@@ -0,0 +1,47 @@
1
+ import * as v from 'valibot';
2
+ import { BuilderPathSchema } from '../paths.js';
3
+ import { BuilderPrimitivesSchema } from '../primitive.js';
4
+ import { refable } from '../references.js';
5
+ export const BuilderWhenEnableSchema = v.object({
6
+ type: v.literal('enable')
7
+ });
8
+ export const BuilderWhenMatchSchema = v.object({
9
+ type: v.literal('match'),
10
+ matchPath: refable(BuilderPathSchema)
11
+ });
12
+ export const BuilderWhenUnlessSchema = v.object({
13
+ type: v.literal('unless'),
14
+ unlessPath: refable(BuilderPathSchema)
15
+ });
16
+ export const BuilderWhenConfigSchema = v.pipe(v.variant('type', [BuilderWhenEnableSchema, BuilderWhenMatchSchema, BuilderWhenUnlessSchema]), v.readonly());
17
+ export function createWhenSerialisedSchema(payloadSchema) {
18
+ const refablePayload = refable(payloadSchema);
19
+ return v.pipe(v.variant('type', [
20
+ v.object({
21
+ ...BuilderWhenEnableSchema.entries,
22
+ payload: refablePayload
23
+ }),
24
+ v.object({
25
+ ...BuilderWhenMatchSchema.entries,
26
+ selectMap: refable(v.record(v.string(), v.nullable(refablePayload)))
27
+ }),
28
+ v.object({
29
+ ...BuilderWhenUnlessSchema.entries,
30
+ disabledValues: BuilderPrimitivesSchema,
31
+ payload: refablePayload
32
+ })
33
+ ]), v.readonly());
34
+ }
35
+ export function createWhenFactories() {
36
+ return {
37
+ enable: (values) => {
38
+ return { type: 'enable', payload: values };
39
+ },
40
+ match: (matchPath, selectMap) => {
41
+ return { type: 'match', matchPath, selectMap };
42
+ },
43
+ unless: (unlessPath, disabledValues, values) => {
44
+ return { type: 'unless', unlessPath, disabledValues, payload: values };
45
+ }
46
+ };
47
+ }
@@ -0,0 +1,8 @@
1
+ import type { BuilderErrorDuplicateName, BuilderErrorInvalidCollectionBounds, BuilderErrorInvalidGatePath, BuilderErrorPagesUnknownCollection, BuilderErrorUnboundParameter, BuilderErrorUnmetExpectation } from './entities/index';
2
+ import type { BuilderErrorInvalidCollection, BuilderErrorInvalidOption, BuilderErrorInvalidVariant, BuilderErrorMissingComponent, BuilderErrorMissingDetail, BuilderErrorMissingVariant, BuilderErrorUnexpectedComponent, BuilderErrorUnexpectedDetail } from './mappers/index';
3
+ export type BuilderError = BuilderErrorUnmetExpectation | BuilderErrorUnboundParameter | BuilderErrorInvalidGatePath | BuilderErrorDuplicateName | BuilderErrorInvalidCollectionBounds | BuilderErrorPagesUnknownCollection | BuilderErrorInvalidOption | BuilderErrorInvalidCollection | BuilderErrorMissingComponent | BuilderErrorUnexpectedComponent | BuilderErrorMissingVariant | BuilderErrorInvalidVariant | BuilderErrorMissingDetail | BuilderErrorUnexpectedDetail;
4
+ export type BuilderErrors = ReadonlyArray<BuilderError>;
5
+ export declare class BuilderException extends globalThis.Error {
6
+ readonly errors: BuilderErrors;
7
+ constructor(errors: BuilderErrors, message?: string);
8
+ }
@@ -0,0 +1,7 @@
1
+ export class BuilderException extends globalThis.Error {
2
+ errors;
3
+ constructor(errors, message = '') {
4
+ super(`BuilderBuilder exception 🏗️${message ? `: ${message}` : ''}`);
5
+ this.errors = errors;
6
+ }
7
+ }
package/dist/index.d.ts CHANGED
@@ -1,13 +1,37 @@
1
- export type { BuilderData, BuilderModel, BuilderModels, BuilderPrimitive, BuilderPrimitives, BuilderVariant, BuilderVariants } from './model';
2
- export type { Builder, Builders, BuilderCollectionEntries, BuilderComponentEntries, BuilderGeneric, BuilderModelOf, BuilderOptionEntries } from './core/index';
3
- export type { BuilderModelPaths, BuilderResolvePath, BuilderValidPath } from './paths';
4
- export type { BuilderPath, BuilderPaths } from './schemas/index';
5
- export type { BuilderDataValidated, BuilderDescription, BuilderDescriptionItem, BuilderErrorComponentMissing, BuilderErrorComponentUnexpected, BuilderErrorsValidate, BuilderErrorValidate, BuilderErrorVariantInvalid, BuilderErrorVariantMissing, BuilderOrder, BuilderRenderOption, BuilderRenderOptions, BuilderRenderPage, BuilderRenderPages, BuilderRenderResult, BuilderValidateResult } from './resolve/index';
6
- export type { BuilderUICollection, BuilderUIDescribe, BuilderUIItem, BuilderUIItems, BuilderUIPage } from './schemas/index';
7
- export type { BuilderUI, BuilderUIs } from './ui';
8
- export type { BuilderCollectionSerialised, BuilderCollectionWhenConfigSerialised, BuilderComponentSerialised, BuilderOptionSerialised, BuilderOptionWhenConfigSerialised, BuilderParameterSerialised, BuilderSelectTypeSerialised, BuilderSerialised, BuilderToggleTypeSerialised, BuilderUISerialised, BuilderValuesSerialised } from './serialise/index';
9
- export { BuilderExpectation, has } from './core/index.js';
10
- export { builder, BuilderCollection, BuilderComponent, BuilderOption, BuilderParameter, BuilderSelectType, BuilderToggleType, collection, enable, match, select, toggleBoolean, toggleNumber, toggleString, unless } from './core/index.js';
11
- export { instance, models, order, ordinal, render, validate } from './resolve/index.js';
12
- export { deserialise, serialise } from './serialise/index.js';
13
- export { ui } from './ui.js';
1
+ export type { Builder, BuilderCollection, BuilderCollectionConfig, BuilderCollectionConfigSerialised, BuilderCollections, BuilderCollectionSerialised, BuilderCollectionsSerialised, BuilderCollectionWhen, BuilderCollectionWhenSerialised, BuilderComponent, BuilderComponentDetails, BuilderComponentDetailsSerialised, BuilderComponents, BuilderComponentSerialised, BuilderComponentsSerialised, BuilderComponentWhen, BuilderComponentWhenSerialised, BuilderDescription, BuilderDescriptionItem, BuilderErrorDuplicateName, BuilderErrorInvalidCollectionBounds, BuilderErrorInvalidGatePath, BuilderErrorPagesUnknownCollection, BuilderErrorUnboundParameter, BuilderErrorUnmetExpectation, BuilderExpectation, BuilderExpectationKind, BuilderExpectations, BuilderExpectationSerialised, BuilderExpectationsSerialised, BuilderGeneric, BuilderInstanceOf, BuilderOption, BuilderOptions, BuilderOptionSerialised, BuilderOptionsSerialised, BuilderOptionValues, BuilderOptionValuesSerialised, BuilderOptionWhen, BuilderOptionWhenSerialised, BuilderReference, BuilderReferences, BuilderSelectType, BuilderSelectTypeLabels, BuilderSelectTypeSerialised, BuilderSelectTypeValues, BuilderSerialised, BuilderToggleType, BuilderToggleTypeSerialised, BuilderToggleValueType, BuilderUI, BuilderUIDescribe, BuilderUIDescribeSerialised, BuilderUIGeneric, BuilderUIItem, BuilderUIItems, BuilderUIItemsSerialised, BuilderUILabel, BuilderUILabelSerialised, BuilderUIPage, BuilderUIPageSerialised, BuilderUIPages, BuilderUIPagesSerialised, BuilderUIReference, BuilderUIReferences, BuilderUISerialised, BuilderUIValidated, BuilderValidated, BuilderWhenConfig } from './entities/index';
2
+ export type { BuilderError, BuilderErrors } from './exception';
3
+ export type { BuilderErrorInvalidCollection, BuilderErrorInvalidOption, BuilderErrorInvalidVariant, BuilderErrorMissingComponent, BuilderErrorMissingDetail, BuilderErrorMissingVariant, BuilderErrorUnexpectedComponent, BuilderErrorUnexpectedDetail, BuilderOrder, BuilderRenderOption, BuilderRenderOptions, BuilderRenderPage, BuilderRenderPages, BuilderRenderResult, BuilderRenderUpdate } from './mappers/index';
4
+ export type { BuilderData, BuilderModel, BuilderModelInput, BuilderModels, BuilderVariant, BuilderVariants } from './model';
5
+ export type { BuilderPath, BuilderPaths } from './paths';
6
+ export type { BuilderPrimitive, BuilderPrimitives } from './primitive';
7
+ export type { BuilderRef, BuilderRefSerialised, Refable, RefableSerialised } from './references';
8
+ import { builders, collectionConfig, collectionExpectation, componentDetails, componentExpectation, detailExpectation, optionExpectation, uis } from './entities/index.js';
9
+ import { createInstance, createModels } from './mappers/index.js';
10
+ export declare const builder: typeof builders;
11
+ export declare const collection: typeof collectionConfig & {
12
+ enable: <const Values extends import("./references").Refable<import(".").BuilderCollectionConfig<import("./references").Refable<import(".").BuilderGeneric>, import("./references").Refable<number>, import("./references").Refable<number>>>>(values: Values) => import("./entities/when").BuilderEnableConfig<Values>;
13
+ match: <const MatchPayload extends import("./references").Refable<import(".").BuilderCollectionConfig<import("./references").Refable<import(".").BuilderGeneric>, import("./references").Refable<number>, import("./references").Refable<number>>>, const MatchPath extends import("./references").Refable<import("./paths").BuilderPath>, const SelectMap extends import("./references").Refable<import("./entities/when").BuilderMatchSelectMap<import("./references").Refable<import(".").BuilderCollectionConfig<import("./references").Refable<import(".").BuilderGeneric>, import("./references").Refable<number>, import("./references").Refable<number>>>>>>(matchPath: MatchPath, selectMap: SelectMap) => import("./entities/when").BuilderMatchConfig<MatchPayload, MatchPath, SelectMap>;
14
+ unless: <const Values extends import("./references").Refable<import(".").BuilderCollectionConfig<import("./references").Refable<import(".").BuilderGeneric>, import("./references").Refable<number>, import("./references").Refable<number>>>, const UnlessPath extends import("./references").Refable<import("./paths").BuilderPath>>(unlessPath: UnlessPath, disabledValues: import("./primitive").BuilderPrimitives, values: Values) => import("./entities/when").BuilderUnlessConfig<Values, UnlessPath>;
15
+ };
16
+ export declare const component: typeof componentDetails & {
17
+ enable: <const Payload extends import("./references").Refable<import(".").BuilderComponentDetails>>(payload?: Payload) => import("./entities/when").BuilderEnableConfig<Payload>;
18
+ match: <const Payload extends import("./references").Refable<import(".").BuilderComponentDetails>, const MatchPath extends import("./references").Refable<import("./paths").BuilderPath>, const SelectMap extends import("./references").Refable<import("./entities/when").BuilderMatchSelectMap<import("./references").Refable<import(".").BuilderComponentDetails>>>>(matchPath: MatchPath, selectMap: SelectMap) => import("./entities/when").BuilderMatchConfig<Payload, MatchPath, SelectMap>;
19
+ unless: <const UnlessPath extends import("./references").Refable<import("./paths").BuilderPath>, const Payload extends import("./references").Refable<import(".").BuilderComponentDetails>>(unlessPath: UnlessPath, disabledValues: import("./primitive").BuilderPrimitives, payload?: Payload) => import("./entities/when").BuilderUnlessConfig<Payload, UnlessPath>;
20
+ };
21
+ export declare const has: {
22
+ collection: typeof collectionExpectation;
23
+ component: typeof componentExpectation;
24
+ detail: typeof detailExpectation;
25
+ option: typeof optionExpectation;
26
+ };
27
+ export declare const instance: typeof createInstance;
28
+ export declare const models: typeof createModels;
29
+ export declare const option: {
30
+ enable: <const Values extends import("./references").Refable<import(".").BuilderSelectType<readonly [string, ...string[]], import("valibot").GenericSchema<string | null>> | import(".").BuilderToggleType<import("valibot").GenericSchema<string | number | boolean | null>>>>(values: Values) => import("./entities/when").BuilderEnableConfig<Values>;
31
+ match: <const MatchPayload extends import("./references").Refable<import(".").BuilderSelectType<readonly [string, ...string[]], import("valibot").GenericSchema<string | null>> | import(".").BuilderToggleType<import("valibot").GenericSchema<string | number | boolean | null>>>, const MatchPath extends import("./references").Refable<import("./paths").BuilderPath>, const SelectMap extends import("./references").Refable<import("./entities/when").BuilderMatchSelectMap<import("./references").Refable<import(".").BuilderSelectType<readonly [string, ...string[]], import("valibot").GenericSchema<string | null>> | import(".").BuilderToggleType<import("valibot").GenericSchema<string | number | boolean | null>>>>>>(matchPath: MatchPath, selectMap: SelectMap) => import("./entities/when").BuilderMatchConfig<MatchPayload, MatchPath, SelectMap>;
32
+ unless: <const Values extends import("./references").Refable<import(".").BuilderSelectType<readonly [string, ...string[]], import("valibot").GenericSchema<string | null>> | import(".").BuilderToggleType<import("valibot").GenericSchema<string | number | boolean | null>>>, const UnlessPath extends import("./references").Refable<import("./paths").BuilderPath>>(unlessPath: UnlessPath, disabledValues: import("./primitive").BuilderPrimitives, values: Values) => import("./entities/when").BuilderUnlessConfig<Values, UnlessPath>;
33
+ };
34
+ export declare const ui: typeof uis;
35
+ export { BuilderException } from './exception.js';
36
+ export { deserialise, parameter, select, serialise, toggleBoolean, toggleNumber, toggleString } from './entities/index.js';
37
+ export { order, ordinal, render } from './mappers/index.js';
package/dist/index.js CHANGED
@@ -1,5 +1,22 @@
1
- export { BuilderExpectation, has } from './core/index.js';
2
- export { builder, BuilderCollection, BuilderComponent, BuilderOption, BuilderParameter, BuilderSelectType, BuilderToggleType, collection, enable, match, select, toggleBoolean, toggleNumber, toggleString, unless } from './core/index.js';
3
- export { instance, models, order, ordinal, render, validate } from './resolve/index.js';
4
- export { deserialise, serialise } from './serialise/index.js';
5
- export { ui } from './ui.js';
1
+ import { builders, collectionConfig, collectionExpectation, collectionWhen, componentDetails, componentExpectation, componentWhen, detailExpectation, optionExpectation, optionWhen, uis } from './entities/index.js';
2
+ import { createInstance, createModels } from './mappers/index.js';
3
+ export const builder = builders;
4
+ export const collection = Object.assign(collectionConfig, {
5
+ ...collectionWhen
6
+ });
7
+ export const component = Object.assign(componentDetails, {
8
+ ...componentWhen
9
+ });
10
+ export const has = {
11
+ collection: collectionExpectation,
12
+ component: componentExpectation,
13
+ detail: detailExpectation,
14
+ option: optionExpectation
15
+ };
16
+ export const instance = createInstance;
17
+ export const models = createModels;
18
+ export const option = optionWhen;
19
+ export const ui = uis;
20
+ export { BuilderException } from './exception.js';
21
+ export { deserialise, parameter, select, serialise, toggleBoolean, toggleNumber, toggleString } from './entities/index.js';
22
+ export { order, ordinal, render } from './mappers/index.js';
@@ -0,0 +1,2 @@
1
+ import type { BuilderGeneric, Strip } from '../../entities/index';
2
+ export declare function assertBuilder<Input extends BuilderGeneric>(builder: Input): asserts builder is Input & Strip<Input>;
@@ -0,0 +1,46 @@
1
+ import * as v from 'valibot';
2
+ import { BuilderCollectionConfigSchema, BuilderSerialisedSchema } from '../../entities/index.js';
3
+ import { BuilderException } from '../../exception.js';
4
+ import { isRef } from '../../references.js';
5
+ import { createWalkerValidation } from '../../walker/index.js';
6
+ import { collectExpectationErrors } from './expectation.js';
7
+ export function assertBuilder(builder) {
8
+ const errors = collectBuilderErrors(builder);
9
+ if (errors.length > 0) {
10
+ throw new BuilderException(errors);
11
+ }
12
+ }
13
+ function collectBuilderErrors(builder) {
14
+ const expectationErrors = collectNestedBuilders(builder).flatMap((inner) => collectExpectationErrors(inner, inner.expectations));
15
+ const parameterErrors = [];
16
+ const walkValidate = createWalkerValidation((ref) => {
17
+ parameterErrors.push({ kind: 'unbound-parameter', name: ref.name });
18
+ });
19
+ walkValidate(BuilderSerialisedSchema, builder);
20
+ const referenceErrors = builder.references
21
+ .filter(isRef)
22
+ .map((reference) => ({ kind: 'unbound-parameter', name: reference.name }));
23
+ return [...expectationErrors, ...referenceErrors, ...parameterErrors];
24
+ }
25
+ function collectNestedBuilders(builder) {
26
+ const nested = builder.collections.flatMap((collection) => nestedBuildersOf(collection.payload));
27
+ return [builder, ...nested.flatMap((inner) => collectNestedBuilders(inner))];
28
+ }
29
+ function nestedBuildersOf(payload) {
30
+ if (isRef(payload)) {
31
+ return [];
32
+ }
33
+ if (v.is(BuilderCollectionConfigSchema, payload)) {
34
+ return isRef(payload.builder) ? [] : [payload.builder];
35
+ }
36
+ const whenPayload = payload;
37
+ if (whenPayload.type === 'match' && whenPayload.selectMap != null) {
38
+ return Object.values(whenPayload.selectMap).flatMap((value) => value && !isRef(value.builder) ? [value.builder] : []);
39
+ }
40
+ const inner = whenPayload.payload;
41
+ if (inner == null || isRef(inner)) {
42
+ return [];
43
+ }
44
+ const innerBuilder = inner.builder;
45
+ return isRef(innerBuilder) ? [] : [innerBuilder];
46
+ }
@@ -0,0 +1,2 @@
1
+ import type { BuilderErrorUnmetExpectation, BuilderExpectations, BuilderGeneric } from '../../entities/index';
2
+ export declare function collectExpectationErrors(builder: BuilderGeneric, expectations: BuilderExpectations): ReadonlyArray<BuilderErrorUnmetExpectation>;
@@ -0,0 +1,23 @@
1
+ export function collectExpectationErrors(builder, expectations) {
2
+ return expectations.flatMap((expectation) => {
3
+ if (expectation.kind === 'detail') {
4
+ return [];
5
+ }
6
+ const lookup = expectation.kind === 'option'
7
+ ? builder.options
8
+ : expectation.kind === 'component'
9
+ ? builder.components
10
+ : builder.collections;
11
+ const exists = lookup.some((entry) => entry.name === expectation.name);
12
+ if (exists) {
13
+ return [];
14
+ }
15
+ return [
16
+ {
17
+ kind: 'unmet-expectation',
18
+ expectationKind: expectation.kind,
19
+ name: expectation.name
20
+ }
21
+ ];
22
+ });
23
+ }
@@ -0,0 +1,6 @@
1
+ export type { BuilderErrorInvalidCollection, BuilderErrorInvalidOption } from './model';
2
+ export type { BuilderErrorInvalidVariant, BuilderErrorMissingComponent, BuilderErrorMissingDetail, BuilderErrorMissingVariant, BuilderErrorUnexpectedComponent, BuilderErrorUnexpectedDetail } from './models';
3
+ export { assertBuilder } from './builder.js';
4
+ export { assertModel } from './model.js';
5
+ export { assertModels } from './models.js';
6
+ export { assertUI } from './ui.js';
@@ -0,0 +1,4 @@
1
+ export { assertBuilder } from './builder.js';
2
+ export { assertModel } from './model.js';
3
+ export { assertModels } from './models.js';
4
+ export { assertUI } from './ui.js';
@@ -0,0 +1,13 @@
1
+ import type { BuilderValidated } from '../../entities/index';
2
+ import type { BuilderModel } from '../../model';
3
+ export type BuilderErrorInvalidOption = {
4
+ readonly kind: 'invalid-option';
5
+ readonly name: string;
6
+ readonly value: unknown;
7
+ };
8
+ export type BuilderErrorInvalidCollection = {
9
+ readonly kind: 'invalid-collection';
10
+ readonly name: string;
11
+ readonly detail: string;
12
+ };
13
+ export declare function assertModel(builder: BuilderValidated, model: BuilderModel): void;