@builder-builder/builder 0.0.7 → 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.
- package/dist/check.d.ts +2 -1
- package/dist/check.js +6 -2
- package/dist/entities/builder/builder.d.ts +494 -0
- package/dist/entities/builder/builder.js +84 -0
- package/dist/entities/builder/builders.d.ts +20 -0
- package/dist/entities/builder/builders.js +18 -0
- package/dist/entities/builder/expectation.d.ts +12 -0
- package/dist/entities/builder/index.d.ts +7 -0
- package/dist/entities/builder/index.js +3 -0
- package/dist/entities/builder/methods.d.ts +58 -0
- package/dist/entities/builder/methods.js +30 -0
- package/dist/entities/builder/parameter.d.ts +61 -0
- package/dist/entities/builder/parameter.js +18 -0
- package/dist/entities/builder/state.d.ts +26 -0
- package/dist/entities/builder/validate.d.ts +3 -0
- package/dist/entities/builder/validate.js +108 -0
- package/dist/entities/collection/collection.d.ts +37 -0
- package/dist/entities/collection/collection.js +42 -0
- package/dist/entities/collection/config.d.ts +1094 -0
- package/dist/entities/collection/config.js +23 -0
- package/dist/entities/collection/expectation.d.ts +7 -0
- package/dist/entities/collection/expectation.js +4 -0
- package/dist/entities/collection/index.d.ts +8 -0
- package/dist/entities/collection/index.js +4 -0
- package/dist/entities/collection/when.d.ts +9 -0
- package/dist/entities/collection/when.js +2 -0
- package/dist/entities/component/component.d.ts +403 -0
- package/dist/entities/component/component.js +24 -0
- package/dist/entities/component/details.d.ts +82 -0
- package/dist/entities/component/details.js +17 -0
- package/dist/entities/component/expectation.d.ts +8 -0
- package/dist/entities/component/expectation.js +7 -0
- package/dist/entities/component/index.d.ts +8 -0
- package/dist/entities/component/index.js +4 -0
- package/dist/entities/component/when.d.ts +11 -0
- package/dist/entities/component/when.js +20 -0
- package/dist/entities/errors.d.ts +21 -0
- package/dist/entities/expectation.d.ts +44 -0
- package/dist/entities/expectation.js +23 -0
- package/dist/entities/index.d.ts +18 -0
- package/dist/entities/index.js +9 -0
- package/dist/entities/option/expectation.d.ts +2 -0
- package/dist/entities/option/expectation.js +4 -0
- package/dist/entities/option/index.d.ts +11 -0
- package/dist/entities/option/index.js +6 -0
- package/dist/entities/option/option.d.ts +347 -0
- package/dist/entities/option/option.js +24 -0
- package/dist/entities/option/select.d.ts +49 -0
- package/dist/entities/option/select.js +40 -0
- package/dist/entities/option/toggle.d.ts +39 -0
- package/dist/entities/option/toggle.js +42 -0
- package/dist/entities/option/values.d.ts +63 -0
- package/dist/entities/option/values.js +8 -0
- package/dist/entities/option/when.d.ts +9 -0
- package/dist/entities/option/when.js +2 -0
- package/dist/entities/serialise.d.ts +3801 -0
- package/dist/entities/serialise.js +41 -0
- package/dist/entities/ui/describe.d.ts +100 -0
- package/dist/entities/ui/describe.js +22 -0
- package/dist/entities/ui/index.d.ts +14 -0
- package/dist/entities/ui/index.js +7 -0
- package/dist/entities/ui/label.d.ts +18 -0
- package/dist/entities/ui/label.js +12 -0
- package/dist/entities/ui/page.d.ts +96 -0
- package/dist/entities/ui/page.js +20 -0
- package/dist/entities/ui/pages.d.ts +431 -0
- package/dist/entities/ui/pages.js +29 -0
- package/dist/entities/ui/parameter.d.ts +7 -0
- package/dist/entities/ui/parameter.js +29 -0
- package/dist/entities/ui/ui.d.ts +1582 -0
- package/dist/entities/ui/ui.js +53 -0
- package/dist/entities/ui/uis.d.ts +10 -0
- package/dist/entities/ui/uis.js +20 -0
- package/dist/entities/ui/validate.d.ts +8 -0
- package/dist/entities/ui/validate.js +21 -0
- package/dist/entities/validate.d.ts +28 -0
- package/dist/entities/validate.js +1 -0
- package/dist/entities/when.d.ts +176 -0
- package/dist/entities/when.js +47 -0
- package/dist/exception.d.ts +8 -0
- package/dist/exception.js +7 -0
- package/dist/index.d.ts +37 -13
- package/dist/index.js +22 -5
- package/dist/mappers/assert/builder.d.ts +2 -0
- package/dist/mappers/assert/builder.js +46 -0
- package/dist/mappers/assert/expectation.d.ts +2 -0
- package/dist/mappers/assert/expectation.js +23 -0
- package/dist/mappers/assert/index.d.ts +6 -0
- package/dist/mappers/assert/index.js +4 -0
- package/dist/mappers/assert/model.d.ts +13 -0
- package/dist/mappers/assert/model.js +47 -0
- package/dist/mappers/assert/models.d.ts +33 -0
- package/dist/mappers/assert/models.js +74 -0
- package/dist/mappers/assert/ui.d.ts +2 -0
- package/dist/mappers/assert/ui.js +22 -0
- package/dist/mappers/index.d.ts +7 -0
- package/dist/mappers/index.js +4 -0
- package/dist/mappers/instance/index.d.ts +1 -0
- package/dist/mappers/instance/index.js +1 -0
- package/dist/mappers/instance/instance.d.ts +4 -0
- package/dist/mappers/instance/instance.js +33 -0
- package/dist/mappers/models/component-graph.d.ts +9 -0
- package/dist/{core/component/graph.js → mappers/models/component-graph.js} +3 -3
- package/dist/{core → mappers/models}/graph.d.ts +4 -1
- package/dist/mappers/models/graph.js +17 -0
- package/dist/mappers/models/index.d.ts +1 -0
- package/dist/mappers/models/index.js +1 -0
- package/dist/mappers/models/models.d.ts +3 -0
- package/dist/mappers/models/models.js +37 -0
- package/dist/mappers/models/option-graph.d.ts +9 -0
- package/dist/mappers/models/option-graph.js +77 -0
- package/dist/mappers/order/index.d.ts +2 -0
- package/dist/mappers/order/index.js +1 -0
- package/dist/mappers/order/order.d.ts +14 -0
- package/dist/mappers/order/order.js +31 -0
- package/dist/mappers/render/index.d.ts +4 -0
- package/dist/mappers/render/index.js +2 -0
- package/dist/mappers/render/ordinal.d.ts +1 -0
- package/dist/mappers/render/ordinal.js +20 -0
- package/dist/mappers/render/pages.d.ts +15 -0
- package/dist/mappers/render/pages.js +1 -0
- package/dist/mappers/render/render.d.ts +8 -0
- package/dist/mappers/render/render.js +124 -0
- package/dist/mappers/resolve.d.ts +9 -0
- package/dist/mappers/resolve.js +57 -0
- package/dist/model.d.ts +8 -8
- package/dist/paths.d.ts +5 -16
- package/dist/paths.js +3 -0
- package/dist/primitive.d.ts +5 -0
- package/dist/{schemas/primitives.js → primitive.js} +0 -2
- package/dist/references.d.ts +60 -0
- package/dist/references.js +26 -0
- package/dist/serialisable.d.ts +10 -0
- package/dist/serialisable.js +5 -0
- package/dist/walker/index.d.ts +2 -0
- package/dist/walker/index.js +1 -0
- package/dist/walker/walkable.d.ts +4 -0
- package/dist/walker/walkable.js +4 -0
- package/dist/walker/walker.d.ts +18 -0
- package/dist/walker/walker.js +103 -0
- package/dist/walker/walkers.d.ts +8 -0
- package/dist/walker/walkers.js +51 -0
- package/package.json +9 -3
- package/dist/core/builder.d.ts +0 -74
- package/dist/core/builder.js +0 -109
- package/dist/core/collection/collection.d.ts +0 -32
- package/dist/core/collection/collection.js +0 -37
- package/dist/core/collection/index.d.ts +0 -4
- package/dist/core/collection/index.js +0 -2
- package/dist/core/collection/method.d.ts +0 -30
- package/dist/core/collection/method.js +0 -11
- package/dist/core/component/component.d.ts +0 -9
- package/dist/core/component/component.js +0 -10
- package/dist/core/component/graph.d.ts +0 -9
- package/dist/core/component/index.d.ts +0 -4
- package/dist/core/component/index.js +0 -2
- package/dist/core/component/method.d.ts +0 -11
- package/dist/core/expectation.d.ts +0 -42
- package/dist/core/expectation.js +0 -18
- package/dist/core/graph.js +0 -3
- package/dist/core/index.d.ts +0 -14
- package/dist/core/index.js +0 -7
- package/dist/core/option/graph.d.ts +0 -10
- package/dist/core/option/graph.js +0 -78
- package/dist/core/option/index.d.ts +0 -10
- package/dist/core/option/index.js +0 -5
- package/dist/core/option/method.d.ts +0 -70
- package/dist/core/option/method.js +0 -13
- package/dist/core/option/option.d.ts +0 -30
- package/dist/core/option/option.js +0 -42
- package/dist/core/option/select.d.ts +0 -22
- package/dist/core/option/select.js +0 -34
- package/dist/core/option/toggle.d.ts +0 -16
- package/dist/core/option/toggle.js +0 -29
- package/dist/core/parameter.d.ts +0 -48
- package/dist/core/parameter.js +0 -31
- package/dist/core/validate.d.ts +0 -26
- package/dist/core/validate.js +0 -43
- package/dist/core/when/config.d.ts +0 -20
- package/dist/core/when/config.js +0 -4
- package/dist/core/when/constrain.d.ts +0 -14
- package/dist/core/when/index.d.ts +0 -5
- package/dist/core/when/index.js +0 -2
- package/dist/core/when/nullability.d.ts +0 -18
- package/dist/core/when/resolve.d.ts +0 -18
- package/dist/core/when/resolve.js +0 -22
- package/dist/resolve/index.d.ts +0 -10
- package/dist/resolve/index.js +0 -5
- package/dist/resolve/instance.d.ts +0 -35
- package/dist/resolve/instance.js +0 -80
- package/dist/resolve/models.d.ts +0 -3
- package/dist/resolve/models.js +0 -20
- package/dist/resolve/order.d.ts +0 -21
- package/dist/resolve/order.js +0 -27
- package/dist/resolve/render.d.ts +0 -23
- package/dist/resolve/render.js +0 -171
- package/dist/resolve/validate.d.ts +0 -37
- package/dist/resolve/validate.js +0 -47
- package/dist/schemas/description.d.ts +0 -5
- package/dist/schemas/description.js +0 -3
- package/dist/schemas/index.d.ts +0 -6
- package/dist/schemas/index.js +0 -3
- package/dist/schemas/primitives.d.ts +0 -9
- package/dist/schemas/ui.d.ts +0 -96
- package/dist/schemas/ui.js +0 -23
- package/dist/serialise/deserialise.d.ts +0 -14
- package/dist/serialise/deserialise.js +0 -119
- package/dist/serialise/index.d.ts +0 -6
- package/dist/serialise/index.js +0 -4
- package/dist/serialise/schemas.d.ts +0 -1946
- package/dist/serialise/schemas.js +0 -150
- package/dist/serialise/serialise.d.ts +0 -13
- package/dist/serialise/serialise.js +0 -147
- package/dist/serialise/validate.d.ts +0 -26
- package/dist/serialise/validate.js +0 -148
- package/dist/ui.d.ts +0 -19
- package/dist/ui.js +0 -44
- /package/dist/{core/component/method.js → entities/builder/expectation.js} +0 -0
- /package/dist/{core/when/constrain.js → entities/builder/state.js} +0 -0
- /package/dist/{core/when/nullability.js → entities/errors.js} +0 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { assertModel, assertUI } from '../assert/index.js';
|
|
3
|
+
import { check } from '../../check.js';
|
|
4
|
+
import { readPath } from '../../paths.js';
|
|
5
|
+
import { resolveCollection, resolveOption } from '../resolve.js';
|
|
6
|
+
import { ordinal } from './ordinal.js';
|
|
7
|
+
export function render(ui, rootModel) {
|
|
8
|
+
assertUI(ui);
|
|
9
|
+
const rootBuilder = ui.builder;
|
|
10
|
+
assertModel(rootBuilder, rootModel);
|
|
11
|
+
const layout = [];
|
|
12
|
+
const description = [];
|
|
13
|
+
walk(rootBuilder, rootModel, [], [], ui.items);
|
|
14
|
+
return { layout, description };
|
|
15
|
+
function walk(builder, model, collectionPath, labelContext, items) {
|
|
16
|
+
function composeLabel(label) {
|
|
17
|
+
if (labelContext.length === 0) {
|
|
18
|
+
return label.label;
|
|
19
|
+
}
|
|
20
|
+
return `${labelContext.join(', ')}, ${label.label}`;
|
|
21
|
+
}
|
|
22
|
+
items.forEach((item) => {
|
|
23
|
+
if (item.type === 'pages') {
|
|
24
|
+
const collection = findCollection(builder, model, item.name);
|
|
25
|
+
if (!collection) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const models = model[collection.name];
|
|
29
|
+
models.forEach((collectionModel, itemIndex) => {
|
|
30
|
+
const labelSegment = `${ordinal(itemIndex)} ${item.label.label}`;
|
|
31
|
+
walk(collection.payload.builder, collectionModel, [...collectionPath, item.name, itemIndex], [...labelContext, labelSegment], item.items);
|
|
32
|
+
});
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (item.type === 'page') {
|
|
36
|
+
const options = item.paths.flatMap((path) => {
|
|
37
|
+
const option = findResolvedOption(builder, model, path);
|
|
38
|
+
if (!option) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
const fullPath = [...collectionPath, ...path];
|
|
42
|
+
return [
|
|
43
|
+
{
|
|
44
|
+
option: option.payload,
|
|
45
|
+
value: readPath(model, fullPath),
|
|
46
|
+
update: (updateModel, updateValue) => setPath(updateModel, fullPath, updateValue)
|
|
47
|
+
}
|
|
48
|
+
];
|
|
49
|
+
});
|
|
50
|
+
if (options.length === 0) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
layout.push({ label: composeLabel(item.label), options });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (item.type === 'describe') {
|
|
57
|
+
const composedLabel = composeLabel(item.label);
|
|
58
|
+
const values = item.paths.flatMap((path) => {
|
|
59
|
+
const option = findResolvedOption(builder, model, path);
|
|
60
|
+
if (!option) {
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
const fullPath = [...collectionPath, ...path];
|
|
64
|
+
const value = readPath(model, fullPath);
|
|
65
|
+
if (value == null) {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
return [value];
|
|
69
|
+
});
|
|
70
|
+
if (values.length === 0) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
description.push([composedLabel, values.join(' ')]);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function findResolvedOption(builder, model, path) {
|
|
78
|
+
const optionName = path.at(-1);
|
|
79
|
+
check.assert(v.string(), optionName);
|
|
80
|
+
const collectionPairs = path.slice(0, -1);
|
|
81
|
+
const resolved = descendPairs(builder, model, collectionPairs);
|
|
82
|
+
if (!resolved) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
return (resolved.builder.options
|
|
86
|
+
.map((entry) => resolveOption(entry, resolved.model))
|
|
87
|
+
.find((entry) => entry?.name === optionName) ?? null);
|
|
88
|
+
}
|
|
89
|
+
function descendPairs(currentBuilder, currentModel, remaining) {
|
|
90
|
+
if (remaining.length === 0) {
|
|
91
|
+
return { builder: currentBuilder, model: currentModel };
|
|
92
|
+
}
|
|
93
|
+
const [collectionName, modelIndex, ...rest] = remaining;
|
|
94
|
+
check.assert(v.string(), collectionName);
|
|
95
|
+
check.assert(v.number(), modelIndex);
|
|
96
|
+
const collection = findCollection(currentBuilder, currentModel, collectionName);
|
|
97
|
+
if (!collection) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const nextModel = currentModel[collection.name].at(modelIndex);
|
|
101
|
+
if (!nextModel) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
return descendPairs(collection.payload.builder, nextModel, rest);
|
|
105
|
+
}
|
|
106
|
+
function findCollection(builder, model, collectionName) {
|
|
107
|
+
return (builder.collections
|
|
108
|
+
.map((entry) => resolveCollection(entry, model))
|
|
109
|
+
.find((collection) => collection?.name === collectionName) ?? null);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function setPath(container, path, value) {
|
|
113
|
+
const [head, ...tail] = path;
|
|
114
|
+
if (typeof head === 'number') {
|
|
115
|
+
const arrayContainer = container ? [...container] : [];
|
|
116
|
+
arrayContainer[head] = tail.length === 0 ? value : setPath(arrayContainer[head], tail, value);
|
|
117
|
+
return arrayContainer;
|
|
118
|
+
}
|
|
119
|
+
const objectContainer = container ? container : {};
|
|
120
|
+
return {
|
|
121
|
+
...objectContainer,
|
|
122
|
+
[head]: tail.length === 0 ? value : setPath(objectContainer[head], tail, value)
|
|
123
|
+
};
|
|
124
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BuilderCollectionConfig, BuilderCollectionValidated, BuilderComponentDetails, BuilderComponentValidated, BuilderExpectations, BuilderOptionValidated, BuilderOptionValues, BuilderValidated } from '../entities/index';
|
|
2
|
+
import type { BuilderPaths } from '../paths';
|
|
3
|
+
import { BuilderCollection, BuilderComponent, BuilderOption } from '../entities/index.js';
|
|
4
|
+
export type BuilderOptionResolved = BuilderOption<string, BuilderOptionValues, BuilderPaths>;
|
|
5
|
+
export type BuilderComponentResolved = BuilderComponent<string, BuilderComponentDetails<BuilderExpectations>, BuilderPaths>;
|
|
6
|
+
export type BuilderCollectionResolved = BuilderCollection<string, BuilderCollectionConfig<BuilderValidated, number, number>, BuilderPaths>;
|
|
7
|
+
export declare function resolveOption(option: BuilderOptionValidated, model: unknown): BuilderOptionResolved | null;
|
|
8
|
+
export declare function resolveComponent(component: BuilderComponentValidated, model: unknown): BuilderComponentResolved | null;
|
|
9
|
+
export declare function resolveCollection(collection: BuilderCollectionValidated, model: unknown): BuilderCollectionResolved | null;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { check } from '../check.js';
|
|
2
|
+
import { BuilderCollection, BuilderCollectionConfigSchema, BuilderComponent, BuilderComponentDetailsSchema, BuilderOption, BuilderOptionValuesSchema } from '../entities/index.js';
|
|
3
|
+
import { BuilderPathsSchema, readPath } from '../paths.js';
|
|
4
|
+
export function resolveOption(option, model) {
|
|
5
|
+
if (check.is(BuilderOptionValuesSchema, option.payload)) {
|
|
6
|
+
return new BuilderOption(option.name, option.payload);
|
|
7
|
+
}
|
|
8
|
+
check.assert(BuilderPathsSchema, option.gatePaths);
|
|
9
|
+
const result = resolveWhen(option.gatePaths, option.payload, model);
|
|
10
|
+
if (!result) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
return new BuilderOption(option.name, result);
|
|
14
|
+
}
|
|
15
|
+
export function resolveComponent(component, model) {
|
|
16
|
+
if (check.is(BuilderComponentDetailsSchema, component.payload)) {
|
|
17
|
+
return new BuilderComponent(component.name, component.payload);
|
|
18
|
+
}
|
|
19
|
+
check.assert(BuilderPathsSchema, component.gatePaths);
|
|
20
|
+
const result = resolveWhen(component.gatePaths, component.payload, model);
|
|
21
|
+
if (!result) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return new BuilderComponent(component.name, result);
|
|
25
|
+
}
|
|
26
|
+
export function resolveCollection(collection, model) {
|
|
27
|
+
if (check.is(BuilderCollectionConfigSchema, collection.payload)) {
|
|
28
|
+
return new BuilderCollection(collection.name, collection.payload);
|
|
29
|
+
}
|
|
30
|
+
check.assert(BuilderPathsSchema, collection.gatePaths);
|
|
31
|
+
const result = resolveWhen(collection.gatePaths, collection.payload, model);
|
|
32
|
+
if (!result) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return new BuilderCollection(collection.name, result);
|
|
36
|
+
}
|
|
37
|
+
function resolveWhen(gatePaths, config, model) {
|
|
38
|
+
if (!gatePaths.every((path) => !!readPath(model, path))) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
switch (config.type) {
|
|
42
|
+
case 'enable': {
|
|
43
|
+
return config.payload;
|
|
44
|
+
}
|
|
45
|
+
case 'match': {
|
|
46
|
+
const selectMap = config.selectMap;
|
|
47
|
+
return selectMap[`${readPath(model, config.matchPath)}`];
|
|
48
|
+
}
|
|
49
|
+
case 'unless': {
|
|
50
|
+
const value = readPath(model, config.unlessPath);
|
|
51
|
+
if (config.disabledValues.includes(value)) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return config.payload;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
package/dist/model.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import type { BuilderPrimitive } from './
|
|
2
|
-
export type { BuilderPrimitive, BuilderPrimitives } from './schemas/index';
|
|
1
|
+
import type { BuilderPrimitive } from './primitive';
|
|
3
2
|
export type BuilderModel = {
|
|
4
3
|
readonly [key: string]: BuilderPrimitive | BuilderModels;
|
|
5
4
|
};
|
|
6
|
-
export type BuilderModelInput = Record<string, unknown>;
|
|
7
5
|
export type BuilderModels = ReadonlyArray<BuilderModel>;
|
|
8
|
-
export type
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
export type BuilderModelInput = Readonly<Record<string, unknown>>;
|
|
7
|
+
export type BuilderVariant = Readonly<{
|
|
8
|
+
model: BuilderModel;
|
|
9
|
+
price?: string;
|
|
10
|
+
image?: string;
|
|
11
|
+
details?: Readonly<Record<string, string>>;
|
|
12
|
+
}>;
|
|
13
13
|
export type BuilderVariants = ReadonlyArray<BuilderVariant>;
|
|
14
14
|
export type BuilderData = Readonly<Record<string, BuilderVariants>>;
|
package/dist/paths.d.ts
CHANGED
|
@@ -1,17 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
export type
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
}[keyof Model & string];
|
|
7
|
-
export type BuilderValidPaths<Model> = ReadonlyArray<BuilderValidPath<Model>>;
|
|
8
|
-
export type BuilderModelPaths<Builder extends BuilderGeneric | null> = [Builder] extends [
|
|
9
|
-
BuilderGeneric
|
|
10
|
-
] ? BuilderValidPaths<BuilderModelOf<Builder>> : ReadonlyArray<never>;
|
|
11
|
-
export type BuilderResolvePath<Model, Path extends BuilderPath> = Path extends readonly [
|
|
12
|
-
infer Head extends keyof Model & string
|
|
13
|
-
] ? Model[Head] : Path extends readonly [
|
|
14
|
-
infer Head extends keyof Model & string,
|
|
15
|
-
...infer Tail extends BuilderPath
|
|
16
|
-
] ? Model[Head] extends ReadonlyArray<infer Item> ? Tail extends readonly [number, ...infer Rest extends BuilderPath] ? BuilderResolvePath<Item, Rest> : never : BuilderResolvePath<Model[Head], Tail> : never;
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
export declare const BuilderPathSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.UnionSchema<[v.StringSchema<undefined>, v.NumberSchema<undefined>], undefined>, undefined>, v.ReadonlyAction<(string | number)[]>]>;
|
|
3
|
+
export type BuilderPath = v.InferOutput<typeof BuilderPathSchema>;
|
|
4
|
+
export declare const BuilderPathsSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.UnionSchema<[v.StringSchema<undefined>, v.NumberSchema<undefined>], undefined>, undefined>, v.ReadonlyAction<(string | number)[]>]>, undefined>, v.ReadonlyAction<(readonly (string | number)[])[]>]>;
|
|
5
|
+
export type BuilderPaths = v.InferOutput<typeof BuilderPathsSchema>;
|
|
17
6
|
export declare function readPath(model: unknown, path: BuilderPath): unknown;
|
package/dist/paths.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
export const BuilderPathSchema = v.pipe(v.array(v.union([v.string(), v.number()])), v.readonly());
|
|
3
|
+
export const BuilderPathsSchema = v.pipe(v.array(BuilderPathSchema), v.readonly());
|
|
1
4
|
export function readPath(model, path) {
|
|
2
5
|
return path.reduce((current, segment) => {
|
|
3
6
|
if (current == null) {
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
export declare const BuilderPrimitiveSchema: v.NullableSchema<v.UnionSchema<[v.StringSchema<undefined>, v.BooleanSchema<undefined>, v.NumberSchema<undefined>], undefined>, undefined>;
|
|
3
|
+
export type BuilderPrimitive = v.InferOutput<typeof BuilderPrimitiveSchema>;
|
|
4
|
+
export declare const BuilderPrimitivesSchema: v.SchemaWithPipe<readonly [v.ArraySchema<v.NullableSchema<v.UnionSchema<[v.StringSchema<undefined>, v.BooleanSchema<undefined>, v.NumberSchema<undefined>], undefined>, undefined>, undefined>, v.ReadonlyAction<(string | number | boolean | null)[]>]>;
|
|
5
|
+
export type BuilderPrimitives = v.InferOutput<typeof BuilderPrimitivesSchema>;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import * as v from 'valibot';
|
|
2
2
|
export const BuilderPrimitiveSchema = v.nullable(v.union([v.string(), v.boolean(), v.number()]));
|
|
3
3
|
export const BuilderPrimitivesSchema = v.pipe(v.array(BuilderPrimitiveSchema), v.readonly());
|
|
4
|
-
export const BuilderPathSchema = v.pipe(v.array(v.union([v.string(), v.number()])), v.readonly());
|
|
5
|
-
export const BuilderPathsSchema = v.pipe(v.array(BuilderPathSchema), v.readonly());
|
|
@@ -0,0 +1,60 @@
|
|
|
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;
|
|
6
|
+
};
|
|
7
|
+
export declare class BuilderRef {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
readonly name: string;
|
|
10
|
+
constructor(name: string, id?: string);
|
|
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>;
|
|
17
|
+
readonly id: v.StringSchema<undefined>;
|
|
18
|
+
readonly name: v.StringSchema<undefined>;
|
|
19
|
+
}, undefined>, v.ReadonlyAction<{
|
|
20
|
+
type: "ref";
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
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>;
|
|
27
|
+
readonly id: v.StringSchema<undefined>;
|
|
28
|
+
readonly name: v.StringSchema<undefined>;
|
|
29
|
+
}, undefined>, v.ReadonlyAction<{
|
|
30
|
+
type: "ref";
|
|
31
|
+
id: string;
|
|
32
|
+
name: string;
|
|
33
|
+
}>]>, undefined>, v.ReadonlyAction<Readonly<{
|
|
34
|
+
type: "ref";
|
|
35
|
+
id: string;
|
|
36
|
+
name: string;
|
|
37
|
+
}>[]>]>;
|
|
38
|
+
export type BuilderRefsSerialised = v.InferOutput<typeof BuilderRefsSerialisedSchema>;
|
|
39
|
+
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>;
|
|
44
|
+
readonly id: v.StringSchema<undefined>;
|
|
45
|
+
readonly name: v.StringSchema<undefined>;
|
|
46
|
+
}, undefined>, v.ReadonlyAction<{
|
|
47
|
+
type: "ref";
|
|
48
|
+
id: string;
|
|
49
|
+
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>;
|
|
52
|
+
readonly id: v.StringSchema<undefined>;
|
|
53
|
+
readonly name: v.StringSchema<undefined>;
|
|
54
|
+
}, undefined>, v.ReadonlyAction<{
|
|
55
|
+
type: "ref";
|
|
56
|
+
id: string;
|
|
57
|
+
name: string;
|
|
58
|
+
}>]> | v.InstanceSchema<typeof BuilderRef, undefined> | Schema>, {
|
|
59
|
+
readonly refable: Schema;
|
|
60
|
+
}>]>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { check } from './check.js';
|
|
3
|
+
export class BuilderRef {
|
|
4
|
+
id;
|
|
5
|
+
name;
|
|
6
|
+
constructor(name, id = crypto.randomUUID()) {
|
|
7
|
+
this.name = name;
|
|
8
|
+
this.id = id;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
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());
|
|
15
|
+
export function isRef(value) {
|
|
16
|
+
return check.is(BuilderRefSchema, value);
|
|
17
|
+
}
|
|
18
|
+
export function isSerialisedRef(value) {
|
|
19
|
+
return check.is(BuilderRefSerialisedSchema, value);
|
|
20
|
+
}
|
|
21
|
+
export function parameter(name) {
|
|
22
|
+
return new BuilderRef(name);
|
|
23
|
+
}
|
|
24
|
+
export function refable(refable) {
|
|
25
|
+
return v.pipe(v.union([BuilderRefSerialisedSchema, BuilderRefSchema, refable]), v.metadata({ refable }));
|
|
26
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
export type SerialisableClass = new (...args: ReadonlyArray<never>) => object;
|
|
3
|
+
export type SerialisableMetadata = {
|
|
4
|
+
readonly serialisable?: SerialisableClass;
|
|
5
|
+
readonly instance?: v.GenericSchema;
|
|
6
|
+
};
|
|
7
|
+
export declare function serialisable<Serialisable extends SerialisableClass, Schema extends v.GenericSchema>(serialisable: Serialisable, schema: Schema): v.SchemaWithPipe<readonly [Schema, v.MetadataAction<v.InferOutput<Schema>, {
|
|
8
|
+
readonly serialisable: Serialisable;
|
|
9
|
+
readonly instance: v.InstanceSchema<Serialisable, undefined>;
|
|
10
|
+
}>, v.ReadonlyAction<v.InferOutput<Schema>>]>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createWalkerBinding, createWalkerDeserialise, createWalkerSerialise, createWalkerValidation } from './walkers.js';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type * as v from 'valibot';
|
|
2
|
+
type WalkableSchema = v.LazySchema<v.GenericSchema> | v.OptionalSchema<v.GenericSchema, unknown> | v.NullableSchema<v.GenericSchema, unknown> | v.ArraySchema<v.GenericSchema, undefined> | v.RecordSchema<v.GenericSchema<string>, v.GenericSchema, undefined> | v.ObjectSchema<v.ObjectEntries, undefined> | v.UnionSchema<ReadonlyArray<v.GenericSchema>, undefined> | v.VariantSchema<string, v.VariantOptions<string>, undefined>;
|
|
3
|
+
export declare function isWalkable(schema: v.GenericSchema): schema is WalkableSchema;
|
|
4
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BuilderRef, BuilderRefSerialised } from '../references';
|
|
2
|
+
import type { SerialisableClass } from '../serialisable';
|
|
3
|
+
import * as v from 'valibot';
|
|
4
|
+
export type Walker = (schema: v.GenericSchema, data: unknown) => unknown;
|
|
5
|
+
export type WalkerField = {
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly literal: {
|
|
8
|
+
readonly value: unknown;
|
|
9
|
+
} | null;
|
|
10
|
+
};
|
|
11
|
+
export type WalkerFields = ReadonlyArray<WalkerField>;
|
|
12
|
+
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;
|
|
17
|
+
};
|
|
18
|
+
export declare function walk(schema: v.GenericSchema, value: unknown, config: WalkerConfig): unknown;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { isRef, isSerialisedRef } from '../references.js';
|
|
3
|
+
import { isWalkable } from './walkable.js';
|
|
4
|
+
export function walk(schema, value, config) {
|
|
5
|
+
const meta = v.getMetadata(schema);
|
|
6
|
+
if (meta.refable != null) {
|
|
7
|
+
return walkRefable(meta.refable, value, config);
|
|
8
|
+
}
|
|
9
|
+
const inner = unwrapPipe(schema);
|
|
10
|
+
if (!isWalkable(inner)) {
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
switch (inner.type) {
|
|
14
|
+
case 'lazy':
|
|
15
|
+
return walk(inner.getter(value), value, config);
|
|
16
|
+
case 'optional':
|
|
17
|
+
case 'nullable':
|
|
18
|
+
return walk(inner.wrapped, value, config);
|
|
19
|
+
case 'array':
|
|
20
|
+
return walkArray(inner.item, value, config);
|
|
21
|
+
case 'record':
|
|
22
|
+
return walkRecord(inner.value, value, config);
|
|
23
|
+
case 'object':
|
|
24
|
+
return walkObject(inner, value, meta.serialisable, config);
|
|
25
|
+
case 'union':
|
|
26
|
+
case 'variant': {
|
|
27
|
+
const matched = inner.options.find((option) => matches(option, value));
|
|
28
|
+
return matched ? walk(matched, value, config) : value;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function isLiteral(schema) {
|
|
33
|
+
return schema.type === 'literal';
|
|
34
|
+
}
|
|
35
|
+
function walkRefable(inner, value, config) {
|
|
36
|
+
if (value == null) {
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
const resolved = isRef(value) && config.onRef
|
|
40
|
+
? config.onRef(value)
|
|
41
|
+
: isSerialisedRef(value) && config.onSerialisedRef
|
|
42
|
+
? config.onSerialisedRef(value)
|
|
43
|
+
: value;
|
|
44
|
+
if (isRef(resolved) || isSerialisedRef(resolved)) {
|
|
45
|
+
return resolved;
|
|
46
|
+
}
|
|
47
|
+
return walk(inner, resolved, config);
|
|
48
|
+
}
|
|
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
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function walkRecord(valueSchema, record, config) {
|
|
65
|
+
return Object.fromEntries(Object.entries(record).map(([key, entry]) => entry === null ? [key, null] : [key, walk(valueSchema, entry, config)]));
|
|
66
|
+
}
|
|
67
|
+
function walkObject(schema, record, serialisable, config) {
|
|
68
|
+
const fields = fieldsOf(schema);
|
|
69
|
+
const walked = {};
|
|
70
|
+
fields.forEach((field) => {
|
|
71
|
+
if (field.literal) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
walked[field.name] = walk(schema.entries[field.name], record[field.name], config);
|
|
75
|
+
});
|
|
76
|
+
if (serialisable != null && config.walkEntity) {
|
|
77
|
+
return config.walkEntity(serialisable, fields, walked, record);
|
|
78
|
+
}
|
|
79
|
+
return config.walkObject ? config.walkObject(fields, walked, record) : record;
|
|
80
|
+
}
|
|
81
|
+
function fieldsOf(schema) {
|
|
82
|
+
return Object.entries(schema.entries).map(([name, fieldSchema]) => {
|
|
83
|
+
const inner = unwrapPipe(fieldSchema);
|
|
84
|
+
return isLiteral(inner) ? { name, literal: { value: inner.literal } } : { name, literal: null };
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function matches(schema, value) {
|
|
88
|
+
const { instance } = v.getMetadata(schema);
|
|
89
|
+
if (instance != null && v.is(instance, value)) {
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
return v.is(schema, value);
|
|
93
|
+
}
|
|
94
|
+
function isAnyRef(value) {
|
|
95
|
+
return isRef(value) || isSerialisedRef(value);
|
|
96
|
+
}
|
|
97
|
+
function unwrapPipe(schema) {
|
|
98
|
+
if ('pipe' in schema && Array.isArray(schema.pipe)) {
|
|
99
|
+
const [first] = schema.pipe;
|
|
100
|
+
return first;
|
|
101
|
+
}
|
|
102
|
+
return schema;
|
|
103
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Walker } from './walker';
|
|
2
|
+
import { BuilderRef } from '../references.js';
|
|
3
|
+
export declare function createWalkerSerialise(): Walker;
|
|
4
|
+
export declare function createWalkerDeserialise(): Walker;
|
|
5
|
+
export declare function createWalkerValidation(onUnbound: (ref: BuilderRef) => void): Walker;
|
|
6
|
+
export declare function createWalkerBinding(config: {
|
|
7
|
+
readonly lookupBinding: (ref: BuilderRef) => unknown;
|
|
8
|
+
}): Walker;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { BuilderRef } from '../references.js';
|
|
2
|
+
import { walk } from './walker.js';
|
|
3
|
+
export function createWalkerSerialise() {
|
|
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)
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
export function createWalkerDeserialise() {
|
|
10
|
+
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))
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export function createWalkerValidation(onUnbound) {
|
|
17
|
+
return (schema, data) => walk(schema, data, {
|
|
18
|
+
onRef: (ref) => {
|
|
19
|
+
onUnbound(ref);
|
|
20
|
+
return ref;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export function createWalkerBinding(config) {
|
|
25
|
+
return (schema, data) => walk(schema, data, {
|
|
26
|
+
onRef: (ref) => {
|
|
27
|
+
const value = config.lookupBinding(ref);
|
|
28
|
+
return value != null ? value : ref;
|
|
29
|
+
},
|
|
30
|
+
walkObject: (_fields, walked, record) => applyPatches(record, walked),
|
|
31
|
+
walkEntity: (serialisable, fields, walked, record) => {
|
|
32
|
+
const merged = applyPatches(record, walked);
|
|
33
|
+
return merged === record ? record : construct(serialisable, fields, merged);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function rebuild(fields, walked) {
|
|
38
|
+
return Object.fromEntries(fields.map((field) => [
|
|
39
|
+
field.name,
|
|
40
|
+
field.literal !== null ? field.literal.value : walked[field.name]
|
|
41
|
+
]));
|
|
42
|
+
}
|
|
43
|
+
function construct(serialisable, fields, entries) {
|
|
44
|
+
const args = fields.filter((field) => field.literal === null).map((field) => entries[field.name]);
|
|
45
|
+
const callable = serialisable;
|
|
46
|
+
return new callable(...args);
|
|
47
|
+
}
|
|
48
|
+
function applyPatches(record, walked) {
|
|
49
|
+
const patches = Object.entries(walked).filter(([name, value]) => value !== record[name]);
|
|
50
|
+
return patches.length === 0 ? record : { ...record, ...Object.fromEntries(patches) };
|
|
51
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@builder-builder/builder",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
],
|
|
14
14
|
"svelte": "./dist/index.js",
|
|
15
15
|
"types": "./dist/index.d.ts",
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
16
19
|
"scripts": {
|
|
17
20
|
"dev": "vite dev",
|
|
18
21
|
"predev": "npm run types:db",
|
|
@@ -21,12 +24,14 @@
|
|
|
21
24
|
"package": "svelte-kit sync && svelte-package --input src/lib/builder",
|
|
22
25
|
"preview": "vite preview",
|
|
23
26
|
"prepare": "svelte-kit sync || echo ''",
|
|
27
|
+
"prepublishOnly": "npm run test && npm run package",
|
|
24
28
|
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
|
25
29
|
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
|
26
30
|
"format": "prettier --write .",
|
|
27
31
|
"lint": "prettier --check . && eslint .",
|
|
28
32
|
"test:unit": "vitest",
|
|
29
33
|
"test": "npm run test:unit -- --run",
|
|
34
|
+
"verify": "npm run test && npm run check && npm run format && npm run lint",
|
|
30
35
|
"types:db": "dotenv -e .env.development.local -- supabase gen types typescript --project-id \"$SUPABASE_PROJECT_ID\" --schema public > ./src/lib/db/database.types.ts"
|
|
31
36
|
},
|
|
32
37
|
"devDependencies": {
|
|
@@ -43,6 +48,7 @@
|
|
|
43
48
|
"dotenv-cli": "^8.0.0",
|
|
44
49
|
"eslint": "^9.18.0",
|
|
45
50
|
"eslint-config-prettier": "^10.0.1",
|
|
51
|
+
"eslint-plugin-import-x": "^4.16.2",
|
|
46
52
|
"eslint-plugin-svelte": "^3.0.0",
|
|
47
53
|
"globals": "^16.0.0",
|
|
48
54
|
"jsdom": "^26.0.0",
|
|
@@ -52,7 +58,7 @@
|
|
|
52
58
|
"svelte": "^5.0.0",
|
|
53
59
|
"svelte-check": "^4.0.0",
|
|
54
60
|
"typescript": "^5.0.0",
|
|
55
|
-
"typescript-eslint": "^8.
|
|
61
|
+
"typescript-eslint": "^8.58.2",
|
|
56
62
|
"vite": "^6.2.6",
|
|
57
63
|
"vitest": "^3.0.0"
|
|
58
64
|
},
|
|
@@ -68,4 +74,4 @@
|
|
|
68
74
|
"svelte-clerk": "^1.1.1",
|
|
69
75
|
"valibot": "^1.1.0"
|
|
70
76
|
}
|
|
71
|
-
}
|
|
77
|
+
}
|