@builder-builder/builder 0.0.8 → 0.0.10

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 (83) hide show
  1. package/dist/entities/bind.d.ts +4 -0
  2. package/dist/entities/bind.js +44 -0
  3. package/dist/entities/builder/bind.d.ts +85 -0
  4. package/dist/entities/builder/bind.js +9 -0
  5. package/dist/entities/builder/builder.d.ts +111 -92
  6. package/dist/entities/builder/builder.js +11 -8
  7. package/dist/entities/builder/builders.d.ts +23 -8
  8. package/dist/entities/builder/builders.js +6 -5
  9. package/dist/entities/builder/index.d.ts +3 -3
  10. package/dist/entities/builder/index.js +1 -1
  11. package/dist/entities/builder/methods.d.ts +17 -17
  12. package/dist/entities/builder/state.d.ts +4 -4
  13. package/dist/entities/builder/validate.js +7 -7
  14. package/dist/entities/collection/collection.d.ts +6 -5
  15. package/dist/entities/collection/collection.js +6 -5
  16. package/dist/entities/collection/config.d.ts +280 -232
  17. package/dist/entities/collection/config.js +4 -4
  18. package/dist/entities/collection/index.d.ts +1 -1
  19. package/dist/entities/collection/index.js +1 -1
  20. package/dist/entities/collection/when.d.ts +5 -5
  21. package/dist/entities/component/component.d.ts +91 -90
  22. package/dist/entities/component/component.js +5 -4
  23. package/dist/entities/component/details.d.ts +16 -16
  24. package/dist/entities/component/details.js +2 -2
  25. package/dist/entities/component/index.d.ts +1 -1
  26. package/dist/entities/component/index.js +1 -1
  27. package/dist/entities/component/when.d.ts +5 -5
  28. package/dist/entities/index.d.ts +10 -8
  29. package/dist/entities/index.js +7 -6
  30. package/dist/entities/kind.d.ts +6 -0
  31. package/dist/entities/kind.js +6 -0
  32. package/dist/entities/option/index.d.ts +1 -1
  33. package/dist/entities/option/index.js +1 -1
  34. package/dist/entities/option/option.d.ts +39 -38
  35. package/dist/entities/option/option.js +5 -4
  36. package/dist/entities/option/values.d.ts +5 -7
  37. package/dist/entities/option/values.js +4 -4
  38. package/dist/entities/option/when.d.ts +5 -5
  39. package/dist/entities/serialise.d.ts +1582 -2226
  40. package/dist/entities/serialise.js +52 -22
  41. package/dist/entities/ui/bind.d.ts +10 -0
  42. package/dist/entities/ui/bind.js +9 -0
  43. package/dist/entities/ui/describe.d.ts +26 -51
  44. package/dist/entities/ui/describe.js +3 -4
  45. package/dist/entities/ui/index.d.ts +5 -7
  46. package/dist/entities/ui/index.js +2 -3
  47. package/dist/entities/ui/page.d.ts +26 -51
  48. package/dist/entities/ui/page.js +3 -4
  49. package/dist/entities/ui/pages.d.ts +17 -405
  50. package/dist/entities/ui/pages.js +6 -6
  51. package/dist/entities/ui/ui.d.ts +307 -688
  52. package/dist/entities/ui/ui.js +16 -17
  53. package/dist/entities/ui/uis.d.ts +11 -5
  54. package/dist/entities/ui/uis.js +9 -10
  55. package/dist/entities/ui/validate.d.ts +2 -2
  56. package/dist/entities/ui/validate.js +3 -3
  57. package/dist/entities/validate.d.ts +3 -3
  58. package/dist/entities/when.d.ts +45 -44
  59. package/dist/entities/when.js +10 -7
  60. package/dist/index.d.ts +19 -14
  61. package/dist/index.js +6 -2
  62. package/dist/mappers/assert/builder.js +13 -13
  63. package/dist/mappers/assert/ui.js +4 -4
  64. package/dist/mappers/index.d.ts +2 -0
  65. package/dist/mappers/index.js +1 -0
  66. package/dist/mappers/refs.d.ts +12 -0
  67. package/dist/mappers/refs.js +36 -0
  68. package/dist/mappers/render/render.js +3 -3
  69. package/dist/model.d.ts +29 -8
  70. package/dist/model.js +9 -1
  71. package/dist/references.d.ts +55 -29
  72. package/dist/references.js +25 -10
  73. package/dist/walker/walker.d.ts +13 -5
  74. package/dist/walker/walker.js +39 -27
  75. package/dist/walker/walkers.d.ts +4 -3
  76. package/dist/walker/walkers.js +18 -14
  77. package/package.json +10 -8
  78. package/dist/entities/builder/parameter.d.ts +0 -61
  79. package/dist/entities/builder/parameter.js +0 -18
  80. package/dist/entities/ui/label.d.ts +0 -18
  81. package/dist/entities/ui/label.js +0 -12
  82. package/dist/entities/ui/parameter.d.ts +0 -7
  83. package/dist/entities/ui/parameter.js +0 -29
@@ -1,4 +1,5 @@
1
1
  export { createInstance } from './instance/index.js';
2
2
  export { createModels } from './models/index.js';
3
3
  export { order } from './order/index.js';
4
+ export { refs } from './refs.js';
4
5
  export { ordinal, render } from './render/index.js';
@@ -0,0 +1,12 @@
1
+ import type { BuilderEntityKind, BuilderUISerialised } from '../entities/index';
2
+ import * as v from 'valibot';
3
+ import { entitiesByKind } from '../entities/index.js';
4
+ export type BuilderRefEntity = {
5
+ readonly [Kind in BuilderEntityKind]: {
6
+ readonly kind: Kind;
7
+ readonly id: string;
8
+ readonly data: v.InferOutput<(typeof entitiesByKind)[Kind]['serialised']>;
9
+ };
10
+ }[BuilderEntityKind];
11
+ export type BuilderRefEntities = ReadonlyArray<BuilderRefEntity>;
12
+ export declare function refs(ui: BuilderUISerialised, entities: BuilderRefEntities): BuilderUISerialised;
@@ -0,0 +1,36 @@
1
+ import * as v from 'valibot';
2
+ import { BuilderSchema, BuilderUISchema, deserialise, entitiesByKind, serialise } from '../entities/index.js';
3
+ import { walk } from '../walker/walker.js';
4
+ export function refs(ui, entities) {
5
+ const entityMap = new Map();
6
+ entities.forEach((entity) => {
7
+ const instance = deserialise[entity.kind](entity.data);
8
+ entityMap.set(entity.id, isBindable(instance) ? bind(instance, entitiesByKind[entity.kind].serialised) : instance);
9
+ });
10
+ const root = bind(deserialise.ui(ui), entitiesByKind.ui.serialised);
11
+ return serialise.ui(root);
12
+ function bind(instance, schema) {
13
+ const references = collectReferences(instance, schema);
14
+ if (references.length === 0) {
15
+ return instance;
16
+ }
17
+ const bindings = Object.fromEntries(references.map((reference) => [reference.parameter, entityMap.get(reference.id)]));
18
+ return instance.bind(bindings);
19
+ }
20
+ }
21
+ function isBindable(entity) {
22
+ return v.is(BuilderSchema, entity) || v.is(BuilderUISchema, entity);
23
+ }
24
+ function collectReferences(instance, schema) {
25
+ const references = [];
26
+ walk(schema, instance, {
27
+ walkEntity: ({ record }) => {
28
+ const maybeReferences = record.references;
29
+ if (Array.isArray(maybeReferences)) {
30
+ references.push(...maybeReferences);
31
+ }
32
+ return record;
33
+ }
34
+ });
35
+ return references;
36
+ }
@@ -15,9 +15,9 @@ export function render(ui, rootModel) {
15
15
  function walk(builder, model, collectionPath, labelContext, items) {
16
16
  function composeLabel(label) {
17
17
  if (labelContext.length === 0) {
18
- return label.label;
18
+ return label;
19
19
  }
20
- return `${labelContext.join(', ')}, ${label.label}`;
20
+ return `${labelContext.join(', ')}, ${label}`;
21
21
  }
22
22
  items.forEach((item) => {
23
23
  if (item.type === 'pages') {
@@ -27,7 +27,7 @@ export function render(ui, rootModel) {
27
27
  }
28
28
  const models = model[collection.name];
29
29
  models.forEach((collectionModel, itemIndex) => {
30
- const labelSegment = `${ordinal(itemIndex)} ${item.label.label}`;
30
+ const labelSegment = `${ordinal(itemIndex)} ${item.label}`;
31
31
  walk(collection.payload.builder, collectionModel, [...collectionPath, item.name, itemIndex], [...labelContext, labelSegment], item.items);
32
32
  });
33
33
  return;
package/dist/model.d.ts CHANGED
@@ -1,14 +1,35 @@
1
- import type { BuilderPrimitive } from './primitive';
1
+ import * as v from 'valibot';
2
+ import { type BuilderPrimitive } from './primitive.js';
2
3
  export type BuilderModel = {
3
4
  readonly [key: string]: BuilderPrimitive | BuilderModels;
4
5
  };
5
- export type BuilderModels = ReadonlyArray<BuilderModel>;
6
+ export declare const BuilderModelSchema: v.GenericSchema<BuilderModel>;
7
+ export declare const BuilderModelsSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.GenericSchema<BuilderModel>, undefined>, v.ReadonlyAction<BuilderModel[]>]>;
8
+ export type BuilderModels = v.InferOutput<typeof BuilderModelsSchema>;
6
9
  export type BuilderModelInput = Readonly<Record<string, unknown>>;
7
- export type BuilderVariant = Readonly<{
10
+ export declare const BuilderVariantSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
11
+ readonly model: v.GenericSchema<BuilderModel>;
12
+ readonly details: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
13
+ }, undefined>, v.ReadonlyAction<{
8
14
  model: BuilderModel;
9
- price?: string;
10
- image?: string;
11
- details?: Readonly<Record<string, string>>;
12
- }>;
13
- export type BuilderVariants = ReadonlyArray<BuilderVariant>;
15
+ details?: {
16
+ [x: string]: string;
17
+ } | undefined;
18
+ }>]>;
19
+ export type BuilderVariant = v.InferOutput<typeof BuilderVariantSchema>;
20
+ export declare const BuilderVariantsSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
21
+ readonly model: v.GenericSchema<BuilderModel>;
22
+ readonly details: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
23
+ }, undefined>, v.ReadonlyAction<{
24
+ model: BuilderModel;
25
+ details?: {
26
+ [x: string]: string;
27
+ } | undefined;
28
+ }>]>, undefined>, v.ReadonlyAction<Readonly<{
29
+ model: BuilderModel;
30
+ details?: {
31
+ [x: string]: string;
32
+ } | undefined;
33
+ }>[]>]>;
34
+ export type BuilderVariants = v.InferOutput<typeof BuilderVariantsSchema>;
14
35
  export type BuilderData = Readonly<Record<string, BuilderVariants>>;
package/dist/model.js CHANGED
@@ -1 +1,9 @@
1
- export {};
1
+ import * as v from 'valibot';
2
+ import { BuilderPrimitiveSchema } from './primitive.js';
3
+ export const BuilderModelSchema = v.pipe(v.record(v.string(), v.union([BuilderPrimitiveSchema, v.lazy(() => BuilderModelsSchema)])), v.readonly());
4
+ export const BuilderModelsSchema = v.pipe(v.array(BuilderModelSchema), v.readonly());
5
+ export const BuilderVariantSchema = v.pipe(v.object({
6
+ model: BuilderModelSchema,
7
+ details: v.optional(v.record(v.string(), v.string()))
8
+ }), v.readonly());
9
+ export const BuilderVariantsSchema = v.pipe(v.array(BuilderVariantSchema), v.readonly());
@@ -1,60 +1,86 @@
1
1
  import * as v from 'valibot';
2
- export type Refable<Value> = Value | BuilderRef;
3
- export type RefableSerialised<Value> = Value | BuilderRefSerialised;
4
- export type RefableMetadata = {
5
- readonly refable?: v.GenericSchema;
2
+ export type Paramable<Value> = Value | BuilderParameter;
3
+ export type ParamableSerialised<Value> = Value | BuilderParameterSerialised;
4
+ export type ParamableMetadata = {
5
+ readonly paramable?: v.GenericSchema;
6
6
  };
7
- export declare class BuilderRef {
7
+ export declare class BuilderParameter<const Name extends string = string> {
8
8
  readonly id: string;
9
- readonly name: string;
10
- constructor(name: string, id?: string);
9
+ readonly name: Name;
10
+ constructor(name: Name, id?: string);
11
11
  }
12
- export declare const BuilderRefSchema: v.InstanceSchema<typeof BuilderRef, undefined>;
13
- export declare const BuilderRefsSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.InstanceSchema<typeof BuilderRef, undefined>, undefined>, v.ReadonlyAction<BuilderRef[]>]>;
14
- export type BuilderRefs = v.InferOutput<typeof BuilderRefsSchema>;
15
- export declare const BuilderRefSerialisedSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
16
- readonly type: v.LiteralSchema<"ref", undefined>;
12
+ export declare const BuilderParameterSchema: v.InstanceSchema<typeof BuilderParameter, undefined>;
13
+ export declare const BuilderParametersSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.InstanceSchema<typeof BuilderParameter, undefined>, undefined>, v.ReadonlyAction<BuilderParameter<string>[]>]>;
14
+ export type BuilderParameters = v.InferOutput<typeof BuilderParametersSchema>;
15
+ export declare const BuilderParameterSerialisedSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
16
+ readonly type: v.LiteralSchema<"parameter", undefined>;
17
17
  readonly id: v.StringSchema<undefined>;
18
18
  readonly name: v.StringSchema<undefined>;
19
19
  }, undefined>, v.ReadonlyAction<{
20
- type: "ref";
20
+ type: "parameter";
21
21
  id: string;
22
22
  name: string;
23
23
  }>]>;
24
- export type BuilderRefSerialised = v.InferOutput<typeof BuilderRefSerialisedSchema>;
25
- export declare const BuilderRefsSerialisedSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
26
- readonly type: v.LiteralSchema<"ref", undefined>;
24
+ export type BuilderParameterSerialised = v.InferOutput<typeof BuilderParameterSerialisedSchema>;
25
+ export declare const BuilderParametersSerialisedSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
26
+ readonly type: v.LiteralSchema<"parameter", undefined>;
27
27
  readonly id: v.StringSchema<undefined>;
28
28
  readonly name: v.StringSchema<undefined>;
29
29
  }, undefined>, v.ReadonlyAction<{
30
- type: "ref";
30
+ type: "parameter";
31
31
  id: string;
32
32
  name: string;
33
33
  }>]>, undefined>, v.ReadonlyAction<Readonly<{
34
- type: "ref";
34
+ type: "parameter";
35
35
  id: string;
36
36
  name: string;
37
37
  }>[]>]>;
38
- export type BuilderRefsSerialised = v.InferOutput<typeof BuilderRefsSerialisedSchema>;
38
+ export type BuilderParametersSerialised = v.InferOutput<typeof BuilderParametersSerialisedSchema>;
39
+ export declare class BuilderRef {
40
+ readonly id: string;
41
+ constructor(id: string);
42
+ }
43
+ export declare const BuilderRefSchema: v.InstanceSchema<typeof BuilderRef, undefined>;
44
+ export declare const BuilderReferenceSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
45
+ readonly parameter: v.StringSchema<undefined>;
46
+ readonly id: v.StringSchema<undefined>;
47
+ }, undefined>, v.ReadonlyAction<{
48
+ parameter: string;
49
+ id: string;
50
+ }>]>;
51
+ export type BuilderReference = v.InferOutput<typeof BuilderReferenceSchema>;
52
+ export declare const BuilderReferencesSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
53
+ readonly parameter: v.StringSchema<undefined>;
54
+ readonly id: v.StringSchema<undefined>;
55
+ }, undefined>, v.ReadonlyAction<{
56
+ parameter: string;
57
+ id: string;
58
+ }>]>, undefined>, v.ReadonlyAction<Readonly<{
59
+ parameter: string;
60
+ id: string;
61
+ }>[]>]>;
62
+ export type BuilderReferences = v.InferOutput<typeof BuilderReferencesSchema>;
63
+ export declare function isParameter(value: unknown): value is BuilderParameter;
64
+ export declare function isSerialisedParameter(value: unknown): value is BuilderParameterSerialised;
39
65
  export declare function isRef(value: unknown): value is BuilderRef;
40
- export declare function isSerialisedRef(value: unknown): value is BuilderRefSerialised;
41
- export declare function parameter(name: string): BuilderRef;
42
- export declare function refable<Schema extends v.GenericSchema>(refable: Schema): v.SchemaWithPipe<readonly [v.UnionSchema<[v.SchemaWithPipe<readonly [v.ObjectSchema<{
43
- readonly type: v.LiteralSchema<"ref", undefined>;
66
+ export declare function parameter<const Name extends string>(name: Name): BuilderParameter<Name>;
67
+ export declare function ref(id: string): BuilderRef;
68
+ export declare function paramable<Schema extends v.GenericSchema>(paramable: Schema): v.SchemaWithPipe<readonly [v.UnionSchema<[v.SchemaWithPipe<readonly [v.ObjectSchema<{
69
+ readonly type: v.LiteralSchema<"parameter", undefined>;
44
70
  readonly id: v.StringSchema<undefined>;
45
71
  readonly name: v.StringSchema<undefined>;
46
72
  }, undefined>, v.ReadonlyAction<{
47
- type: "ref";
73
+ type: "parameter";
48
74
  id: string;
49
75
  name: string;
50
- }>]>, v.InstanceSchema<typeof BuilderRef, undefined>, Schema], undefined>, v.MetadataAction<v.InferOutput<v.SchemaWithPipe<readonly [v.ObjectSchema<{
51
- readonly type: v.LiteralSchema<"ref", undefined>;
76
+ }>]>, v.InstanceSchema<typeof BuilderParameter, undefined>, Schema], undefined>, v.MetadataAction<v.InferOutput<v.SchemaWithPipe<readonly [v.ObjectSchema<{
77
+ readonly type: v.LiteralSchema<"parameter", undefined>;
52
78
  readonly id: v.StringSchema<undefined>;
53
79
  readonly name: v.StringSchema<undefined>;
54
80
  }, undefined>, v.ReadonlyAction<{
55
- type: "ref";
81
+ type: "parameter";
56
82
  id: string;
57
83
  name: string;
58
- }>]> | v.InstanceSchema<typeof BuilderRef, undefined> | Schema>, {
59
- readonly refable: Schema;
84
+ }>]> | v.InstanceSchema<typeof BuilderParameter, undefined> | Schema>, {
85
+ readonly paramable: Schema;
60
86
  }>]>;
@@ -1,6 +1,6 @@
1
1
  import * as v from 'valibot';
2
2
  import { check } from './check.js';
3
- export class BuilderRef {
3
+ export class BuilderParameter {
4
4
  id;
5
5
  name;
6
6
  constructor(name, id = crypto.randomUUID()) {
@@ -8,19 +8,34 @@ export class BuilderRef {
8
8
  this.id = id;
9
9
  }
10
10
  }
11
+ export const BuilderParameterSchema = v.instance(BuilderParameter);
12
+ export const BuilderParametersSchema = v.pipe(v.array(BuilderParameterSchema), v.readonly());
13
+ export const BuilderParameterSerialisedSchema = v.pipe(v.object({ type: v.literal('parameter'), id: v.string(), name: v.string() }), v.readonly());
14
+ export const BuilderParametersSerialisedSchema = v.pipe(v.array(BuilderParameterSerialisedSchema), v.readonly());
15
+ export class BuilderRef {
16
+ id;
17
+ constructor(id) {
18
+ this.id = id;
19
+ }
20
+ }
11
21
  export const BuilderRefSchema = v.instance(BuilderRef);
12
- export const BuilderRefsSchema = v.pipe(v.array(BuilderRefSchema), v.readonly());
13
- export const BuilderRefSerialisedSchema = v.pipe(v.object({ type: v.literal('ref'), id: v.string(), name: v.string() }), v.readonly());
14
- export const BuilderRefsSerialisedSchema = v.pipe(v.array(BuilderRefSerialisedSchema), v.readonly());
22
+ export const BuilderReferenceSchema = v.pipe(v.object({ parameter: v.string(), id: v.string() }), v.readonly());
23
+ export const BuilderReferencesSchema = v.pipe(v.array(BuilderReferenceSchema), v.readonly());
24
+ export function isParameter(value) {
25
+ return check.is(BuilderParameterSchema, value);
26
+ }
27
+ export function isSerialisedParameter(value) {
28
+ return check.is(BuilderParameterSerialisedSchema, value);
29
+ }
15
30
  export function isRef(value) {
16
31
  return check.is(BuilderRefSchema, value);
17
32
  }
18
- export function isSerialisedRef(value) {
19
- return check.is(BuilderRefSerialisedSchema, value);
20
- }
21
33
  export function parameter(name) {
22
- return new BuilderRef(name);
34
+ return new BuilderParameter(name);
35
+ }
36
+ export function ref(id) {
37
+ return new BuilderRef(id);
23
38
  }
24
- export function refable(refable) {
25
- return v.pipe(v.union([BuilderRefSerialisedSchema, BuilderRefSchema, refable]), v.metadata({ refable }));
39
+ export function paramable(paramable) {
40
+ return v.pipe(v.union([BuilderParameterSerialisedSchema, BuilderParameterSchema, paramable]), v.metadata({ paramable }));
26
41
  }
@@ -1,4 +1,4 @@
1
- import type { BuilderRef, BuilderRefSerialised } from '../references';
1
+ import type { BuilderParameter, BuilderParameterSerialised } from '../references';
2
2
  import type { SerialisableClass } from '../serialisable';
3
3
  import * as v from 'valibot';
4
4
  export type Walker = (schema: v.GenericSchema, data: unknown) => unknown;
@@ -9,10 +9,18 @@ export type WalkerField = {
9
9
  } | null;
10
10
  };
11
11
  export type WalkerFields = ReadonlyArray<WalkerField>;
12
+ export type WalkerObjectArgs = {
13
+ readonly fields: WalkerFields;
14
+ readonly walked: Record<string, unknown>;
15
+ readonly record: Record<string, unknown>;
16
+ };
17
+ export type WalkerEntityArgs = WalkerObjectArgs & {
18
+ readonly serialisable: SerialisableClass;
19
+ };
12
20
  export type WalkerConfig = {
13
- readonly onRef?: (ref: BuilderRef) => unknown;
14
- readonly onSerialisedRef?: (data: BuilderRefSerialised) => unknown;
15
- readonly walkObject?: (fields: WalkerFields, walked: Record<string, unknown>, record: Record<string, unknown>) => unknown;
16
- readonly walkEntity?: (serialisable: SerialisableClass, fields: WalkerFields, walked: Record<string, unknown>, record: Record<string, unknown>) => unknown;
21
+ readonly onParameter?: (parameter: BuilderParameter, paramableSchema: v.GenericSchema) => unknown;
22
+ readonly onSerialisedParameter?: (data: BuilderParameterSerialised, paramableSchema: v.GenericSchema) => unknown;
23
+ readonly walkObject?: (args: WalkerObjectArgs) => unknown;
24
+ readonly walkEntity?: (args: WalkerEntityArgs) => unknown;
17
25
  };
18
26
  export declare function walk(schema: v.GenericSchema, value: unknown, config: WalkerConfig): unknown;
@@ -1,10 +1,10 @@
1
1
  import * as v from 'valibot';
2
- import { isRef, isSerialisedRef } from '../references.js';
2
+ import { isParameter, isSerialisedParameter } from '../references.js';
3
3
  import { isWalkable } from './walkable.js';
4
4
  export function walk(schema, value, config) {
5
5
  const meta = v.getMetadata(schema);
6
- if (meta.refable != null) {
7
- return walkRefable(meta.refable, value, config);
6
+ if (meta.paramable != null) {
7
+ return walkParamable(meta.paramable, value, config);
8
8
  }
9
9
  const inner = unwrapPipe(schema);
10
10
  if (!isWalkable(inner)) {
@@ -32,37 +32,49 @@ export function walk(schema, value, config) {
32
32
  function isLiteral(schema) {
33
33
  return schema.type === 'literal';
34
34
  }
35
- function walkRefable(inner, value, config) {
35
+ function walkParamable(inner, value, config) {
36
36
  if (value == null) {
37
37
  return value;
38
38
  }
39
- const resolved = isRef(value) && config.onRef
40
- ? config.onRef(value)
41
- : isSerialisedRef(value) && config.onSerialisedRef
42
- ? config.onSerialisedRef(value)
39
+ const resolved = isParameter(value) && config.onParameter
40
+ ? config.onParameter(value, inner)
41
+ : isSerialisedParameter(value) && config.onSerialisedParameter
42
+ ? config.onSerialisedParameter(value, inner)
43
43
  : value;
44
- if (isRef(resolved) || isSerialisedRef(resolved)) {
44
+ if (isParameter(resolved) || isSerialisedParameter(resolved)) {
45
45
  return resolved;
46
46
  }
47
47
  return walk(inner, resolved, config);
48
48
  }
49
49
  function walkArray(item, value, config) {
50
- return value.flatMap((element) => {
51
- const walked = walk(item, element, config);
52
- if (!isAnyRef(element) || !Array.isArray(walked)) {
53
- return [walked];
54
- }
55
- return walked.flatMap((nested) => {
56
- const walkedNested = walk(item, nested, config);
57
- if (isAnyRef(nested) && Array.isArray(walkedNested)) {
58
- return walkedNested;
59
- }
60
- return [walkedNested];
61
- });
62
- });
50
+ const walked = value.flatMap((element) => walkArrayElement(item, element, config));
51
+ return walked.length === value.length &&
52
+ walked.every((element, index) => element === value[index])
53
+ ? value
54
+ : walked;
55
+ }
56
+ function walkArrayElement(item, element, config) {
57
+ const walked = walk(item, element, config);
58
+ if (!isAnyParameter(element) || !Array.isArray(walked)) {
59
+ return [walked];
60
+ }
61
+ return walked.flatMap((nested) => walkArrayElement(item, nested, config));
63
62
  }
64
63
  function walkRecord(valueSchema, record, config) {
65
- return Object.fromEntries(Object.entries(record).map(([key, entry]) => entry === null ? [key, null] : [key, walk(valueSchema, entry, config)]));
64
+ let changed = false;
65
+ const walked = {};
66
+ Object.entries(record).forEach(([key, entry]) => {
67
+ if (entry === null) {
68
+ walked[key] = null;
69
+ return;
70
+ }
71
+ const walkedEntry = walk(valueSchema, entry, config);
72
+ if (walkedEntry !== entry) {
73
+ changed = true;
74
+ }
75
+ walked[key] = walkedEntry;
76
+ });
77
+ return changed ? walked : record;
66
78
  }
67
79
  function walkObject(schema, record, serialisable, config) {
68
80
  const fields = fieldsOf(schema);
@@ -74,9 +86,9 @@ function walkObject(schema, record, serialisable, config) {
74
86
  walked[field.name] = walk(schema.entries[field.name], record[field.name], config);
75
87
  });
76
88
  if (serialisable != null && config.walkEntity) {
77
- return config.walkEntity(serialisable, fields, walked, record);
89
+ return config.walkEntity({ serialisable, fields, walked, record });
78
90
  }
79
- return config.walkObject ? config.walkObject(fields, walked, record) : record;
91
+ return config.walkObject ? config.walkObject({ fields, walked, record }) : record;
80
92
  }
81
93
  function fieldsOf(schema) {
82
94
  return Object.entries(schema.entries).map(([name, fieldSchema]) => {
@@ -91,8 +103,8 @@ function matches(schema, value) {
91
103
  }
92
104
  return v.is(schema, value);
93
105
  }
94
- function isAnyRef(value) {
95
- return isRef(value) || isSerialisedRef(value);
106
+ function isAnyParameter(value) {
107
+ return isParameter(value) || isSerialisedParameter(value);
96
108
  }
97
109
  function unwrapPipe(schema) {
98
110
  if ('pipe' in schema && Array.isArray(schema.pipe)) {
@@ -1,8 +1,9 @@
1
1
  import type { Walker } from './walker';
2
- import { BuilderRef } from '../references.js';
2
+ import type * as v from 'valibot';
3
+ import { BuilderParameter } from '../references.js';
3
4
  export declare function createWalkerSerialise(): Walker;
4
5
  export declare function createWalkerDeserialise(): Walker;
5
- export declare function createWalkerValidation(onUnbound: (ref: BuilderRef) => void): Walker;
6
+ export declare function createWalkerValidation(onUnbound: (parameter: BuilderParameter) => void): Walker;
6
7
  export declare function createWalkerBinding(config: {
7
- readonly lookupBinding: (ref: BuilderRef) => unknown;
8
+ readonly lookupBinding: (parameter: BuilderParameter, paramableSchema: v.GenericSchema) => unknown;
8
9
  }): Walker;
@@ -1,34 +1,38 @@
1
- import { BuilderRef } from '../references.js';
1
+ import { BuilderParameter } from '../references.js';
2
2
  import { walk } from './walker.js';
3
3
  export function createWalkerSerialise() {
4
4
  return (schema, data) => walk(schema, data, {
5
- onRef: (ref) => ({ type: 'ref', id: ref.id, name: ref.name }),
6
- walkObject: (fields, walked) => rebuild(fields, walked)
5
+ onParameter: (parameter) => ({
6
+ type: 'parameter',
7
+ id: parameter.id,
8
+ name: parameter.name
9
+ }),
10
+ walkObject: ({ fields, walked }) => rebuild(fields, walked)
7
11
  });
8
12
  }
9
13
  export function createWalkerDeserialise() {
10
14
  return (schema, data) => walk(schema, data, {
11
- onSerialisedRef: (serialised) => new BuilderRef(serialised.name, serialised.id),
12
- walkObject: (fields, walked) => rebuild(fields, walked),
13
- walkEntity: (serialisable, fields, walked) => construct(serialisable, fields, rebuild(fields, walked))
15
+ onSerialisedParameter: (serialised) => new BuilderParameter(serialised.name, serialised.id),
16
+ walkObject: ({ fields, walked }) => rebuild(fields, walked),
17
+ walkEntity: ({ serialisable, fields, walked }) => construct(serialisable, fields, rebuild(fields, walked))
14
18
  });
15
19
  }
16
20
  export function createWalkerValidation(onUnbound) {
17
21
  return (schema, data) => walk(schema, data, {
18
- onRef: (ref) => {
19
- onUnbound(ref);
20
- return ref;
22
+ onParameter: (parameter) => {
23
+ onUnbound(parameter);
24
+ return parameter;
21
25
  }
22
26
  });
23
27
  }
24
28
  export function createWalkerBinding(config) {
25
29
  return (schema, data) => walk(schema, data, {
26
- onRef: (ref) => {
27
- const value = config.lookupBinding(ref);
28
- return value != null ? value : ref;
30
+ onParameter: (parameter, paramableSchema) => {
31
+ const value = config.lookupBinding(parameter, paramableSchema);
32
+ return value != null ? value : parameter;
29
33
  },
30
- walkObject: (_fields, walked, record) => applyPatches(record, walked),
31
- walkEntity: (serialisable, fields, walked, record) => {
34
+ walkObject: ({ walked, record }) => applyPatches(record, walked),
35
+ walkEntity: ({ serialisable, fields, walked, record }) => {
32
36
  const merged = applyPatches(record, walked);
33
37
  return merged === record ? record : construct(serialisable, fields, merged);
34
38
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@builder-builder/builder",
3
- "version": "0.0.8",
3
+ "version": "0.0.10",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -23,13 +23,14 @@
23
23
  "build": "vite build",
24
24
  "package": "svelte-kit sync && svelte-package --input src/lib/builder",
25
25
  "preview": "vite preview",
26
- "prepare": "svelte-kit sync || echo ''",
26
+ "prepare": "svelte-kit sync && npm run messages || echo ''",
27
27
  "prepublishOnly": "npm run test && npm run package",
28
- "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
29
- "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
28
+ "messages": "paraglide-js compile --project ./project.inlang --outdir ./src/lib/i18n",
29
+ "check": "npm run messages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
30
+ "check:watch": "npm run messages && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
30
31
  "format": "prettier --write .",
31
32
  "lint": "prettier --check . && eslint .",
32
- "test:unit": "vitest",
33
+ "test:unit": "npm run messages && vitest",
33
34
  "test": "npm run test:unit -- --run",
34
35
  "verify": "npm run test && npm run check && npm run format && npm run lint",
35
36
  "types:db": "dotenv -e .env.development.local -- supabase gen types typescript --project-id \"$SUPABASE_PROJECT_ID\" --schema public > ./src/lib/db/database.types.ts"
@@ -37,6 +38,7 @@
37
38
  "devDependencies": {
38
39
  "@eslint/compat": "^1.2.5",
39
40
  "@eslint/js": "^9.18.0",
41
+ "@inlang/paraglide-js": "^2.16.0",
40
42
  "@sveltejs/adapter-auto": "^6.0.0",
41
43
  "@sveltejs/adapter-vercel": "^5.7.2",
42
44
  "@sveltejs/kit": "^2.16.0",
@@ -54,7 +56,7 @@
54
56
  "jsdom": "^26.0.0",
55
57
  "prettier": "^3.4.2",
56
58
  "prettier-plugin-svelte": "^3.3.3",
57
- "supabase": "^2.33.9",
59
+ "supabase": "^2.93.0",
58
60
  "svelte": "^5.0.0",
59
61
  "svelte-check": "^4.0.0",
60
62
  "typescript": "^5.0.0",
@@ -65,7 +67,7 @@
65
67
  "dependencies": {
66
68
  "@floating-ui/dom": "^1.7.2",
67
69
  "@lucide/svelte": "^0.525.0",
68
- "@supabase/supabase-js": "^2.49.8",
70
+ "@supabase/supabase-js": "^2.104.0",
69
71
  "@upstash/ratelimit": "^2.0.5",
70
72
  "@upstash/redis": "^1.35.0",
71
73
  "@vercel/kv": "^3.0.0",
@@ -74,4 +76,4 @@
74
76
  "svelte-clerk": "^1.1.1",
75
77
  "valibot": "^1.1.0"
76
78
  }
77
- }
79
+ }
@@ -1,61 +0,0 @@
1
- import type { BuilderPaths } from '../../paths';
2
- import type { BuilderRef, Refable } from '../../references';
3
- import type { BuilderCollectionPayload } from '../collection/index';
4
- import type { BuilderComponentPayload } from '../component/index';
5
- import type { BuilderOptionPayload } from '../option/index';
6
- import type { BuilderWhenConfig, BuilderWhenConstrained, WhenConfigNullable } from '../when';
7
- import type { BuilderState, BuilderStateAppend } from './state';
8
- import { Builder } from './builder.js';
9
- export type BuilderBindings<State extends BuilderState> = EntryStateBindings<State, State['options'], BuilderOptionPayload> & EntryStateBindings<State, State['collections'], BuilderCollectionPayload> & EntryStateBindings<State, State['components'], BuilderComponentPayload>;
10
- export declare function bindBuilder<State extends BuilderState, Bindings extends BuilderBindings<State>>(builder: Builder<State>, bindings: Bindings): Builder<BuilderBoundState<State, Bindings>>;
11
- export type BuilderBoundState<State extends BuilderState, Bindings extends BuilderBindings<State>> = BuilderStateAppend<State, {
12
- options: EntryBound<State['options'], Extract<keyof Bindings, string>>;
13
- collections: EntryBound<State['collections'], Extract<keyof Bindings, string>>;
14
- components: EntryBound<State['components'], Extract<keyof Bindings, string>>;
15
- model: Omit<State['model'], keyof Bindings> & {
16
- [K in Extract<keyof Bindings, string>]: BindingModelType<Bindings[K]>;
17
- };
18
- }>;
19
- export type BindingModelType<Binding> = BindingValueType<Binding> | BindingConfigNullable<Binding>;
20
- type BindingValueType<Binding> = Binding extends {
21
- readonly type: 'match';
22
- readonly selectMap: infer SelectMap extends Record<string, unknown>;
23
- } ? NonNullable<SelectMap[keyof SelectMap]> extends {
24
- readonly value: infer Value;
25
- } ? Value : string : Binding extends {
26
- readonly payload: {
27
- readonly value: infer Value;
28
- };
29
- } ? Value : Binding extends {
30
- readonly value: infer Value;
31
- } ? Value : string;
32
- type BindingConfigNullable<Binding> = Binding extends BuilderWhenConfig ? WhenConfigNullable<Binding> : never;
33
- type EntryLike = {
34
- readonly name: string;
35
- readonly payload: unknown;
36
- readonly gatePaths?: Refable<BuilderPaths>;
37
- };
38
- type EntryStateBindings<State extends BuilderState, Entries extends ReadonlyArray<EntryLike>, PayloadType> = {
39
- readonly [Parameter in EntryParameters<Entries> as Parameter['name']]: BuilderWhenConstrained<State, PayloadType>;
40
- };
41
- type EntryBound<Entries extends ReadonlyArray<EntryLike>, BoundNames extends string> = Entries extends readonly [
42
- infer Head extends EntryLike,
43
- ...infer Tail extends ReadonlyArray<EntryLike>
44
- ] ? Head extends {
45
- readonly payload: infer Payload;
46
- } ? Payload extends BuilderRef ? Head['name'] extends BoundNames ? [...EntryBound<Tail, BoundNames>] : [Head, ...EntryBound<Tail, BoundNames>] : [Head, ...EntryBound<Tail, BoundNames>] : [Head, ...EntryBound<Tail, BoundNames>] : [];
47
- type EntryParameters<Entries extends ReadonlyArray<EntryLike>> = Entries[number] extends infer Entry ? Entry extends {
48
- readonly payload: infer Payload;
49
- } ? PayloadParameters<Payload> : never : never;
50
- type PayloadParameters<Payload> = ParameterOf<Payload> | (Payload extends {
51
- readonly type: 'match';
52
- readonly selectMap: infer SelectMap;
53
- } ? ParameterOf<SelectMap[keyof SelectMap]> : never) | (Payload extends {
54
- readonly type: 'enable' | 'unless';
55
- readonly payload: infer Inner;
56
- } ? ParameterOf<Inner> : never);
57
- type ParameterOf<Value> = Extract<Value, BuilderRef> extends infer Ref extends BuilderRef ? {
58
- readonly name: Ref['name'];
59
- readonly payload: Ref;
60
- } : never;
61
- export {};