@btst/plugin-form-builder 1.0.0-beta.0 → 1.2.0-beta.1
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/api/index.cjs +1 -0
- package/dist/api/index.d.cts +1 -1
- package/dist/api/index.d.mts +1 -1
- package/dist/api/index.d.ts +1 -1
- package/dist/api/index.mjs +1 -1
- package/dist/api/operations.cjs +64 -4
- package/dist/api/operations.mjs +64 -5
- package/dist/api/plugin.cjs +8 -0
- package/dist/api/plugin.mjs +8 -0
- package/dist/api/submissions-csv.cjs +69 -0
- package/dist/api/submissions-csv.mjs +64 -0
- package/dist/client/components/forms/form-renderer.cjs +31 -2
- package/dist/client/components/forms/form-renderer.mjs +31 -2
- package/dist/client/components/forms/media-file-field.cjs +48 -0
- package/dist/client/components/forms/media-file-field.mjs +46 -0
- package/dist/client/components/index.d.cts +4 -2
- package/dist/client/components/index.d.mts +4 -2
- package/dist/client/components/index.d.ts +4 -2
- package/dist/client/components/pages/ai-schema.cjs +120 -0
- package/dist/client/components/pages/ai-schema.mjs +118 -0
- package/dist/client/components/pages/form-builder-page.internal.cjs +40 -1
- package/dist/client/components/pages/form-builder-page.internal.mjs +41 -2
- package/dist/client/components/pages/form-list-page.internal.cjs +1 -0
- package/dist/client/components/pages/form-list-page.internal.mjs +1 -0
- package/dist/client/components/pages/submissions-page.internal.cjs +40 -0
- package/dist/client/components/pages/submissions-page.internal.mjs +41 -1
- package/dist/client/components/shared/pagination.cjs +19 -0
- package/dist/client/components/shared/pagination.mjs +20 -1
- package/dist/client/hooks/form-builder-hooks.cjs +4 -0
- package/dist/client/hooks/form-builder-hooks.mjs +4 -1
- package/dist/client/hooks/index.cjs +1 -0
- package/dist/client/hooks/index.d.cts +7 -2
- package/dist/client/hooks/index.d.mts +7 -2
- package/dist/client/hooks/index.d.ts +7 -2
- package/dist/client/hooks/index.mjs +1 -1
- package/dist/client/index.d.cts +42 -3
- package/dist/client/index.d.mts +42 -3
- package/dist/client/index.d.ts +42 -3
- package/dist/permissions.cjs +8 -0
- package/dist/permissions.d.cts +6 -0
- package/dist/permissions.d.mts +6 -0
- package/dist/permissions.d.ts +6 -0
- package/dist/permissions.mjs +8 -0
- package/dist/query-keys.cjs +7 -0
- package/dist/query-keys.d.cts +29 -1
- package/dist/query-keys.d.mts +29 -1
- package/dist/query-keys.d.ts +29 -1
- package/dist/query-keys.mjs +7 -0
- package/dist/shared/{plugin-form-builder.CSP5HR2O.d.ts → plugin-form-builder.65tLgfcd.d.ts} +46 -29
- package/dist/shared/{plugin-form-builder.Bbl9NufB.d.cts → plugin-form-builder.DXdOj9vM.d.cts} +46 -29
- package/dist/shared/{plugin-form-builder.lp98rFNl.d.mts → plugin-form-builder.PWs25HN1.d.mts} +46 -29
- package/dist/shared/{plugin-form-builder.DWrQ3lRX.d.ts → plugin-form-builder.sdjcoJcH.d.cts} +15 -1
- package/dist/shared/{plugin-form-builder.DWrQ3lRX.d.cts → plugin-form-builder.sdjcoJcH.d.mts} +15 -1
- package/dist/shared/{plugin-form-builder.DWrQ3lRX.d.mts → plugin-form-builder.sdjcoJcH.d.ts} +15 -1
- package/dist/ui/src/components/auto-form/config.cjs +2 -0
- package/dist/ui/src/components/auto-form/config.mjs +2 -0
- package/dist/ui/src/components/auto-form/fields/file.cjs +68 -0
- package/dist/ui/src/components/auto-form/fields/file.mjs +63 -0
- package/dist/ui/src/components/auto-form/fields/object.cjs +9 -2
- package/dist/ui/src/components/auto-form/fields/object.mjs +9 -2
- package/dist/ui/src/components/auto-form/helpers.cjs +9 -0
- package/dist/ui/src/components/auto-form/helpers.mjs +9 -0
- package/dist/ui/src/components/auto-form/index.cjs +29 -4
- package/dist/ui/src/components/auto-form/index.mjs +31 -6
- package/dist/ui/src/components/auto-form/stepped-auto-form.cjs +34 -29
- package/dist/ui/src/components/auto-form/stepped-auto-form.mjs +35 -30
- package/dist/ui/src/components/form-builder/canvas.cjs +9 -0
- package/dist/ui/src/components/form-builder/canvas.mjs +9 -0
- package/dist/ui/src/components/form-builder/components/index.cjs +12 -0
- package/dist/ui/src/components/form-builder/components/index.mjs +12 -1
- package/dist/ui/src/components/form-builder/condition-editor.cjs +73 -0
- package/dist/ui/src/components/form-builder/condition-editor.mjs +71 -0
- package/dist/ui/src/components/form-builder/edit-field-dialog.cjs +6 -2
- package/dist/ui/src/components/form-builder/edit-field-dialog.mjs +6 -2
- package/dist/ui/src/components/form-builder/index.cjs +6 -1
- package/dist/ui/src/components/form-builder/index.mjs +6 -1
- package/dist/ui/src/components/form-builder/schema-utils.cjs +2 -0
- package/dist/ui/src/components/form-builder/schema-utils.mjs +2 -0
- package/dist/ui/src/components/form.mjs +1 -1
- package/dist/ui/src/lib/form-visibility.cjs +20 -0
- package/dist/ui/src/lib/form-visibility.mjs +18 -0
- package/dist/ui/src/lib/schema-converter.cjs +101 -0
- package/dist/ui/src/lib/schema-converter.mjs +100 -1
- package/package.json +4 -4
|
@@ -1,7 +1,20 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const z = require('zod');
|
|
4
|
+
const formVisibility = require('./form-visibility.cjs');
|
|
4
5
|
|
|
6
|
+
const displaySchemas = /* @__PURE__ */ new WeakMap();
|
|
7
|
+
function getFormDisplaySchema(schema) {
|
|
8
|
+
const cached = displaySchemas.get(schema);
|
|
9
|
+
if (cached) return cached;
|
|
10
|
+
const metadata = schema.meta();
|
|
11
|
+
if (schema instanceof z.z.ZodPipe && metadata?.properties) {
|
|
12
|
+
const display = z.z.fromJSONSchema(metadata);
|
|
13
|
+
displaySchemas.set(schema, display);
|
|
14
|
+
return display;
|
|
15
|
+
}
|
|
16
|
+
return void 0;
|
|
17
|
+
}
|
|
5
18
|
function zodToFormSchema(schema, metadata) {
|
|
6
19
|
const jsonSchema = z.z.toJSONSchema(schema, {
|
|
7
20
|
unrepresentable: "any",
|
|
@@ -106,8 +119,94 @@ function attachStepsMetadata(schema, jsonSchema) {
|
|
|
106
119
|
stepGroupMap
|
|
107
120
|
});
|
|
108
121
|
}
|
|
122
|
+
function hasVisibilityRules(schema) {
|
|
123
|
+
return Boolean(schema.steps?.some((step) => step.showIf) || Object.values(schema.properties ?? {}).some((prop) => prop.showIf || prop.properties && hasVisibilityRules(prop) || prop.items && hasVisibilityRules(prop.items)));
|
|
124
|
+
}
|
|
125
|
+
function resolveVisibleSchema(schema, values) {
|
|
126
|
+
const data = { ...values };
|
|
127
|
+
for (const [key, prop] of Object.entries(schema.properties ?? {})) {
|
|
128
|
+
if (data[key] === void 0 && prop.default !== void 0) Object.defineProperty(data, key, { value: prop.default, enumerable: true, writable: true, configurable: true });
|
|
129
|
+
}
|
|
130
|
+
const comparisonValues = { ...data };
|
|
131
|
+
const visibility = /* @__PURE__ */ new Map();
|
|
132
|
+
const resolving = [];
|
|
133
|
+
const isVisible = (key) => {
|
|
134
|
+
if (visibility.has(key)) return visibility.get(key);
|
|
135
|
+
const cycleStart = resolving.indexOf(key);
|
|
136
|
+
if (cycleStart !== -1) {
|
|
137
|
+
for (const field of resolving.slice(cycleStart)) visibility.set(field, false);
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
const prop = schema.properties?.[key];
|
|
141
|
+
if (!prop) return true;
|
|
142
|
+
resolving.push(key);
|
|
143
|
+
const matches = (condition) => {
|
|
144
|
+
if (!condition) return true;
|
|
145
|
+
const sourceVisible = isVisible(condition.field);
|
|
146
|
+
return formVisibility.matchesShowIf(condition, { [condition.field]: sourceVisible && Object.hasOwn(comparisonValues, condition.field) ? comparisonValues[condition.field] : void 0 });
|
|
147
|
+
};
|
|
148
|
+
const step = schema.steps?.[prop.stepGroup ?? schema.stepGroupMap?.[key] ?? 0];
|
|
149
|
+
const result = matches(step?.showIf) && matches(prop.showIf);
|
|
150
|
+
resolving.pop();
|
|
151
|
+
if (!visibility.has(key)) visibility.set(key, result);
|
|
152
|
+
return visibility.get(key);
|
|
153
|
+
};
|
|
154
|
+
const properties = /* @__PURE__ */ Object.create(null);
|
|
155
|
+
for (const [key, prop] of Object.entries(schema.properties ?? {})) {
|
|
156
|
+
if (!isVisible(key)) {
|
|
157
|
+
Reflect.deleteProperty(data, key);
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const { showIf: _showIf, ...visibleProp } = prop;
|
|
161
|
+
if (prop.properties && data[key] && typeof data[key] === "object" && !Array.isArray(data[key])) {
|
|
162
|
+
const nested = resolveVisibleSchema(prop, data[key]);
|
|
163
|
+
Object.assign(visibleProp, nested.schema);
|
|
164
|
+
data[key] = nested.data;
|
|
165
|
+
}
|
|
166
|
+
properties[key] = visibleProp;
|
|
167
|
+
}
|
|
168
|
+
return { schema: { ...schema, properties, required: schema.required?.filter((key) => key in properties), steps: schema.steps?.map(({ showIf: _showIf, ...step }) => step) }, data };
|
|
169
|
+
}
|
|
109
170
|
function formSchemaToZod(jsonSchema) {
|
|
171
|
+
if (jsonSchema.default !== void 0 && hasVisibilityRules(jsonSchema)) {
|
|
172
|
+
const { default: defaultValue, ...contentSchema } = jsonSchema;
|
|
173
|
+
return formSchemaToZod(contentSchema).prefault(defaultValue).meta({ ...jsonSchema });
|
|
174
|
+
}
|
|
175
|
+
if (jsonSchema.steps?.some((step) => step.showIf) || Object.values(jsonSchema.properties ?? {}).some((prop) => prop.showIf)) {
|
|
176
|
+
const display = z.z.fromJSONSchema(jsonSchema);
|
|
177
|
+
const shape = Object.fromEntries(Object.entries(display.shape).map(([key]) => [key, z.z.unknown().optional()]));
|
|
178
|
+
const conditional = z.z.object(shape).passthrough().transform((data, ctx) => {
|
|
179
|
+
const { schema: visibleSchema, data: visibleData } = resolveVisibleSchema(jsonSchema, data);
|
|
180
|
+
const result = formSchemaToZod(visibleSchema).safeParse(visibleData);
|
|
181
|
+
if (!result.success) {
|
|
182
|
+
for (const issue of result.error.issues) ctx.addIssue({ ...issue });
|
|
183
|
+
return z.z.NEVER;
|
|
184
|
+
}
|
|
185
|
+
return result.data;
|
|
186
|
+
}).meta({ ...jsonSchema });
|
|
187
|
+
displaySchemas.set(conditional, display);
|
|
188
|
+
return conditional;
|
|
189
|
+
}
|
|
110
190
|
let schema = z.z.fromJSONSchema(jsonSchema);
|
|
191
|
+
if (schema instanceof z.z.ZodObject) {
|
|
192
|
+
const nestedShape = {};
|
|
193
|
+
for (const [key, prop] of Object.entries(jsonSchema.properties ?? {})) {
|
|
194
|
+
if (!hasVisibilityRules({ properties: { [key]: prop } })) continue;
|
|
195
|
+
let nested;
|
|
196
|
+
if (prop.type === "object" && prop.properties) nested = formSchemaToZod(prop);
|
|
197
|
+
if (prop.type === "array" && prop.items?.properties) {
|
|
198
|
+
let array = z.z.array(formSchemaToZod(prop.items));
|
|
199
|
+
if (typeof prop.minItems === "number") array = array.min(prop.minItems);
|
|
200
|
+
if (typeof prop.maxItems === "number") array = array.max(prop.maxItems);
|
|
201
|
+
nested = array;
|
|
202
|
+
}
|
|
203
|
+
if (nested) {
|
|
204
|
+
if (!jsonSchema.required?.includes(key)) nested = nested.optional();
|
|
205
|
+
nestedShape[key] = prop.default !== void 0 ? nested.prefault(prop.default) : nested;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (Object.keys(nestedShape).length) schema = schema.extend(nestedShape);
|
|
209
|
+
}
|
|
111
210
|
if (schema && typeof schema.passthrough === "function") {
|
|
112
211
|
schema = schema.passthrough();
|
|
113
212
|
}
|
|
@@ -127,7 +226,9 @@ function getStepGroupMap(jsonSchema) {
|
|
|
127
226
|
}
|
|
128
227
|
|
|
129
228
|
exports.formSchemaToZod = formSchemaToZod;
|
|
229
|
+
exports.getFormDisplaySchema = getFormDisplaySchema;
|
|
130
230
|
exports.getStepGroupMap = getStepGroupMap;
|
|
131
231
|
exports.getSteps = getSteps;
|
|
132
232
|
exports.hasSteps = hasSteps;
|
|
233
|
+
exports.resolveVisibleSchema = resolveVisibleSchema;
|
|
133
234
|
exports.zodToFormSchema = zodToFormSchema;
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { matchesShowIf } from './form-visibility.mjs';
|
|
2
3
|
|
|
4
|
+
const displaySchemas = /* @__PURE__ */ new WeakMap();
|
|
5
|
+
function getFormDisplaySchema(schema) {
|
|
6
|
+
const cached = displaySchemas.get(schema);
|
|
7
|
+
if (cached) return cached;
|
|
8
|
+
const metadata = schema.meta();
|
|
9
|
+
if (schema instanceof z.ZodPipe && metadata?.properties) {
|
|
10
|
+
const display = z.fromJSONSchema(metadata);
|
|
11
|
+
displaySchemas.set(schema, display);
|
|
12
|
+
return display;
|
|
13
|
+
}
|
|
14
|
+
return void 0;
|
|
15
|
+
}
|
|
3
16
|
function zodToFormSchema(schema, metadata) {
|
|
4
17
|
const jsonSchema = z.toJSONSchema(schema, {
|
|
5
18
|
unrepresentable: "any",
|
|
@@ -104,8 +117,94 @@ function attachStepsMetadata(schema, jsonSchema) {
|
|
|
104
117
|
stepGroupMap
|
|
105
118
|
});
|
|
106
119
|
}
|
|
120
|
+
function hasVisibilityRules(schema) {
|
|
121
|
+
return Boolean(schema.steps?.some((step) => step.showIf) || Object.values(schema.properties ?? {}).some((prop) => prop.showIf || prop.properties && hasVisibilityRules(prop) || prop.items && hasVisibilityRules(prop.items)));
|
|
122
|
+
}
|
|
123
|
+
function resolveVisibleSchema(schema, values) {
|
|
124
|
+
const data = { ...values };
|
|
125
|
+
for (const [key, prop] of Object.entries(schema.properties ?? {})) {
|
|
126
|
+
if (data[key] === void 0 && prop.default !== void 0) Object.defineProperty(data, key, { value: prop.default, enumerable: true, writable: true, configurable: true });
|
|
127
|
+
}
|
|
128
|
+
const comparisonValues = { ...data };
|
|
129
|
+
const visibility = /* @__PURE__ */ new Map();
|
|
130
|
+
const resolving = [];
|
|
131
|
+
const isVisible = (key) => {
|
|
132
|
+
if (visibility.has(key)) return visibility.get(key);
|
|
133
|
+
const cycleStart = resolving.indexOf(key);
|
|
134
|
+
if (cycleStart !== -1) {
|
|
135
|
+
for (const field of resolving.slice(cycleStart)) visibility.set(field, false);
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
const prop = schema.properties?.[key];
|
|
139
|
+
if (!prop) return true;
|
|
140
|
+
resolving.push(key);
|
|
141
|
+
const matches = (condition) => {
|
|
142
|
+
if (!condition) return true;
|
|
143
|
+
const sourceVisible = isVisible(condition.field);
|
|
144
|
+
return matchesShowIf(condition, { [condition.field]: sourceVisible && Object.hasOwn(comparisonValues, condition.field) ? comparisonValues[condition.field] : void 0 });
|
|
145
|
+
};
|
|
146
|
+
const step = schema.steps?.[prop.stepGroup ?? schema.stepGroupMap?.[key] ?? 0];
|
|
147
|
+
const result = matches(step?.showIf) && matches(prop.showIf);
|
|
148
|
+
resolving.pop();
|
|
149
|
+
if (!visibility.has(key)) visibility.set(key, result);
|
|
150
|
+
return visibility.get(key);
|
|
151
|
+
};
|
|
152
|
+
const properties = /* @__PURE__ */ Object.create(null);
|
|
153
|
+
for (const [key, prop] of Object.entries(schema.properties ?? {})) {
|
|
154
|
+
if (!isVisible(key)) {
|
|
155
|
+
Reflect.deleteProperty(data, key);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const { showIf: _showIf, ...visibleProp } = prop;
|
|
159
|
+
if (prop.properties && data[key] && typeof data[key] === "object" && !Array.isArray(data[key])) {
|
|
160
|
+
const nested = resolveVisibleSchema(prop, data[key]);
|
|
161
|
+
Object.assign(visibleProp, nested.schema);
|
|
162
|
+
data[key] = nested.data;
|
|
163
|
+
}
|
|
164
|
+
properties[key] = visibleProp;
|
|
165
|
+
}
|
|
166
|
+
return { schema: { ...schema, properties, required: schema.required?.filter((key) => key in properties), steps: schema.steps?.map(({ showIf: _showIf, ...step }) => step) }, data };
|
|
167
|
+
}
|
|
107
168
|
function formSchemaToZod(jsonSchema) {
|
|
169
|
+
if (jsonSchema.default !== void 0 && hasVisibilityRules(jsonSchema)) {
|
|
170
|
+
const { default: defaultValue, ...contentSchema } = jsonSchema;
|
|
171
|
+
return formSchemaToZod(contentSchema).prefault(defaultValue).meta({ ...jsonSchema });
|
|
172
|
+
}
|
|
173
|
+
if (jsonSchema.steps?.some((step) => step.showIf) || Object.values(jsonSchema.properties ?? {}).some((prop) => prop.showIf)) {
|
|
174
|
+
const display = z.fromJSONSchema(jsonSchema);
|
|
175
|
+
const shape = Object.fromEntries(Object.entries(display.shape).map(([key]) => [key, z.unknown().optional()]));
|
|
176
|
+
const conditional = z.object(shape).passthrough().transform((data, ctx) => {
|
|
177
|
+
const { schema: visibleSchema, data: visibleData } = resolveVisibleSchema(jsonSchema, data);
|
|
178
|
+
const result = formSchemaToZod(visibleSchema).safeParse(visibleData);
|
|
179
|
+
if (!result.success) {
|
|
180
|
+
for (const issue of result.error.issues) ctx.addIssue({ ...issue });
|
|
181
|
+
return z.NEVER;
|
|
182
|
+
}
|
|
183
|
+
return result.data;
|
|
184
|
+
}).meta({ ...jsonSchema });
|
|
185
|
+
displaySchemas.set(conditional, display);
|
|
186
|
+
return conditional;
|
|
187
|
+
}
|
|
108
188
|
let schema = z.fromJSONSchema(jsonSchema);
|
|
189
|
+
if (schema instanceof z.ZodObject) {
|
|
190
|
+
const nestedShape = {};
|
|
191
|
+
for (const [key, prop] of Object.entries(jsonSchema.properties ?? {})) {
|
|
192
|
+
if (!hasVisibilityRules({ properties: { [key]: prop } })) continue;
|
|
193
|
+
let nested;
|
|
194
|
+
if (prop.type === "object" && prop.properties) nested = formSchemaToZod(prop);
|
|
195
|
+
if (prop.type === "array" && prop.items?.properties) {
|
|
196
|
+
let array = z.array(formSchemaToZod(prop.items));
|
|
197
|
+
if (typeof prop.minItems === "number") array = array.min(prop.minItems);
|
|
198
|
+
if (typeof prop.maxItems === "number") array = array.max(prop.maxItems);
|
|
199
|
+
nested = array;
|
|
200
|
+
}
|
|
201
|
+
if (nested) {
|
|
202
|
+
if (!jsonSchema.required?.includes(key)) nested = nested.optional();
|
|
203
|
+
nestedShape[key] = prop.default !== void 0 ? nested.prefault(prop.default) : nested;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (Object.keys(nestedShape).length) schema = schema.extend(nestedShape);
|
|
207
|
+
}
|
|
109
208
|
if (schema && typeof schema.passthrough === "function") {
|
|
110
209
|
schema = schema.passthrough();
|
|
111
210
|
}
|
|
@@ -124,4 +223,4 @@ function getStepGroupMap(jsonSchema) {
|
|
|
124
223
|
return jsonSchema.stepGroupMap ?? extractStepGroupMap(jsonSchema);
|
|
125
224
|
}
|
|
126
225
|
|
|
127
|
-
export { formSchemaToZod, getStepGroupMap, getSteps, hasSteps, zodToFormSchema };
|
|
226
|
+
export { formSchemaToZod, getFormDisplaySchema, getStepGroupMap, getSteps, hasSteps, resolveVisibleSchema, zodToFormSchema };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@btst/plugin-form-builder",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0-beta.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -147,7 +147,7 @@
|
|
|
147
147
|
"better-call": "1.4.4"
|
|
148
148
|
},
|
|
149
149
|
"peerDependencies": {
|
|
150
|
-
"@btst/stack": ">=6.
|
|
150
|
+
"@btst/stack": ">=6.2.0-beta.1 <6.2.0",
|
|
151
151
|
"@btst/yar": ">=1.3.2",
|
|
152
152
|
"@tanstack/react-query": "^5.0.0",
|
|
153
153
|
"react": ">=19.2.6",
|
|
@@ -166,10 +166,10 @@
|
|
|
166
166
|
"@btst/adapter-memory": "3.0.1",
|
|
167
167
|
"jsdom": "^28.1.0",
|
|
168
168
|
"@types/slug": "^5.0.9",
|
|
169
|
-
"@btst/stack": "6.
|
|
169
|
+
"@btst/stack": "6.2.0-beta.1",
|
|
170
170
|
"@workspace/ui": "0.0.0"
|
|
171
171
|
},
|
|
172
|
-
"gitHead": "
|
|
172
|
+
"gitHead": "657bc1fff550f456c13c9de9caaa87c7978c0f33",
|
|
173
173
|
"scripts": {
|
|
174
174
|
"build": "unbuild --clean",
|
|
175
175
|
"typecheck": "tsc --project tsconfig.json && tsc --project tsconfig.typecheck.json",
|