@formspec/dsl 0.1.0-alpha.10 → 0.1.0-alpha.12
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/README.md +0 -6
- package/dist/index.cjs +446 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +411 -38
- package/dist/index.js.map +1 -1
- package/package.json +7 -5
- package/dist/__tests__/builders.test.js +0 -228
- package/dist/__tests__/builders.test.js.map +0 -1
- package/dist/__tests__/inference.test-d.js +0 -94
- package/dist/__tests__/inference.test-d.js.map +0 -1
- package/dist/__tests__/validation.test.js +0 -207
- package/dist/__tests__/validation.test.js.map +0 -1
- package/dist/field.js +0 -261
- package/dist/field.js.map +0 -1
- package/dist/inference.js +0 -8
- package/dist/inference.js.map +0 -1
- package/dist/predicate.js +0 -41
- package/dist/predicate.js.map +0 -1
- package/dist/structure.js +0 -129
- package/dist/structure.js.map +0 -1
- package/dist/validation.js +0 -188
- package/dist/validation.js.map +0 -1
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { field, group, when, is, formspec } from "../index.js";
|
|
3
|
-
describe("field builders", () => {
|
|
4
|
-
describe("field.text", () => {
|
|
5
|
-
it("should create a text field with required properties", () => {
|
|
6
|
-
const f = field.text("name");
|
|
7
|
-
expect(f._type).toBe("field");
|
|
8
|
-
expect(f._field).toBe("text");
|
|
9
|
-
expect(f.name).toBe("name");
|
|
10
|
-
});
|
|
11
|
-
it("should include optional config properties", () => {
|
|
12
|
-
const f = field.text("name", {
|
|
13
|
-
label: "Full Name",
|
|
14
|
-
placeholder: "Enter your name",
|
|
15
|
-
required: true,
|
|
16
|
-
});
|
|
17
|
-
expect(f.label).toBe("Full Name");
|
|
18
|
-
expect(f.placeholder).toBe("Enter your name");
|
|
19
|
-
expect(f.required).toBe(true);
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
describe("field.number", () => {
|
|
23
|
-
it("should create a number field with required properties", () => {
|
|
24
|
-
const f = field.number("age");
|
|
25
|
-
expect(f._type).toBe("field");
|
|
26
|
-
expect(f._field).toBe("number");
|
|
27
|
-
expect(f.name).toBe("age");
|
|
28
|
-
});
|
|
29
|
-
it("should include min/max constraints", () => {
|
|
30
|
-
const f = field.number("age", { min: 0, max: 150 });
|
|
31
|
-
expect(f.min).toBe(0);
|
|
32
|
-
expect(f.max).toBe(150);
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
describe("field.boolean", () => {
|
|
36
|
-
it("should create a boolean field", () => {
|
|
37
|
-
const f = field.boolean("active");
|
|
38
|
-
expect(f._type).toBe("field");
|
|
39
|
-
expect(f._field).toBe("boolean");
|
|
40
|
-
expect(f.name).toBe("active");
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
describe("field.enum", () => {
|
|
44
|
-
it("should create an enum field with options", () => {
|
|
45
|
-
const f = field.enum("status", ["draft", "sent", "paid"]);
|
|
46
|
-
expect(f._type).toBe("field");
|
|
47
|
-
expect(f._field).toBe("enum");
|
|
48
|
-
expect(f.name).toBe("status");
|
|
49
|
-
expect(f.options).toEqual(["draft", "sent", "paid"]);
|
|
50
|
-
});
|
|
51
|
-
it("should include optional config", () => {
|
|
52
|
-
const f = field.enum("status", ["draft", "sent"], {
|
|
53
|
-
label: "Status",
|
|
54
|
-
required: true,
|
|
55
|
-
});
|
|
56
|
-
expect(f.label).toBe("Status");
|
|
57
|
-
expect(f.required).toBe(true);
|
|
58
|
-
});
|
|
59
|
-
it("should create an enum field with object options", () => {
|
|
60
|
-
const f = field.enum("priority", [
|
|
61
|
-
{ id: "low", label: "Low Priority" },
|
|
62
|
-
{ id: "medium", label: "Medium Priority" },
|
|
63
|
-
{ id: "high", label: "High Priority" },
|
|
64
|
-
]);
|
|
65
|
-
expect(f._type).toBe("field");
|
|
66
|
-
expect(f._field).toBe("enum");
|
|
67
|
-
expect(f.name).toBe("priority");
|
|
68
|
-
expect(f.options).toEqual([
|
|
69
|
-
{ id: "low", label: "Low Priority" },
|
|
70
|
-
{ id: "medium", label: "Medium Priority" },
|
|
71
|
-
{ id: "high", label: "High Priority" },
|
|
72
|
-
]);
|
|
73
|
-
});
|
|
74
|
-
it("should include optional config with object options", () => {
|
|
75
|
-
const f = field.enum("priority", [
|
|
76
|
-
{ id: "low", label: "Low" },
|
|
77
|
-
{ id: "high", label: "High" },
|
|
78
|
-
], {
|
|
79
|
-
label: "Priority",
|
|
80
|
-
required: true,
|
|
81
|
-
});
|
|
82
|
-
expect(f.label).toBe("Priority");
|
|
83
|
-
expect(f.required).toBe(true);
|
|
84
|
-
});
|
|
85
|
-
it("should handle empty options array", () => {
|
|
86
|
-
const f = field.enum("empty", []);
|
|
87
|
-
expect(f._field).toBe("enum");
|
|
88
|
-
expect(f.options).toEqual([]);
|
|
89
|
-
});
|
|
90
|
-
it("should throw error for mixed string and object options", () => {
|
|
91
|
-
expect(() => {
|
|
92
|
-
// Using 'as any' to bypass type checking for runtime validation test
|
|
93
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
94
|
-
field.enum("mixed", ["string", { id: "obj", label: "Object" }]);
|
|
95
|
-
}).toThrow(/options must be all strings or all objects/);
|
|
96
|
-
});
|
|
97
|
-
it("should throw error for object options missing id", () => {
|
|
98
|
-
expect(() => {
|
|
99
|
-
// @ts-expect-error - intentionally testing invalid object
|
|
100
|
-
field.enum("invalid", [{ label: "No ID" }]);
|
|
101
|
-
}).toThrow(/object options must have string "id" and "label"/);
|
|
102
|
-
});
|
|
103
|
-
it("should throw error for object options missing label", () => {
|
|
104
|
-
expect(() => {
|
|
105
|
-
// @ts-expect-error - intentionally testing invalid object
|
|
106
|
-
field.enum("invalid", [{ id: "missing-label" }]);
|
|
107
|
-
}).toThrow(/object options must have string "id" and "label"/);
|
|
108
|
-
});
|
|
109
|
-
it("should throw error for object options with non-string id", () => {
|
|
110
|
-
expect(() => {
|
|
111
|
-
// @ts-expect-error - intentionally testing invalid object
|
|
112
|
-
field.enum("invalid", [{ id: 123, label: "Number ID" }]);
|
|
113
|
-
}).toThrow(/object options must have string "id" and "label"/);
|
|
114
|
-
});
|
|
115
|
-
it("should throw error for object options with non-string label", () => {
|
|
116
|
-
expect(() => {
|
|
117
|
-
// @ts-expect-error - intentionally testing invalid object
|
|
118
|
-
field.enum("invalid", [{ id: "valid", label: 456 }]);
|
|
119
|
-
}).toThrow(/object options must have string "id" and "label"/);
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
describe("field.dynamicEnum", () => {
|
|
123
|
-
it("should create a dynamic enum field with source", () => {
|
|
124
|
-
const f = field.dynamicEnum("country", "countries");
|
|
125
|
-
expect(f._type).toBe("field");
|
|
126
|
-
expect(f._field).toBe("dynamic_enum");
|
|
127
|
-
expect(f.name).toBe("country");
|
|
128
|
-
expect(f.source).toBe("countries");
|
|
129
|
-
});
|
|
130
|
-
it("should include params for dependent lookups", () => {
|
|
131
|
-
const f = field.dynamicEnum("city", "cities", {
|
|
132
|
-
params: ["country"],
|
|
133
|
-
});
|
|
134
|
-
expect(f.params).toEqual(["country"]);
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
describe("field.dynamicSchema", () => {
|
|
138
|
-
it("should create a dynamic schema field", () => {
|
|
139
|
-
const f = field.dynamicSchema("extension", "payment-extension");
|
|
140
|
-
expect(f._type).toBe("field");
|
|
141
|
-
expect(f._field).toBe("dynamic_schema");
|
|
142
|
-
expect(f.name).toBe("extension");
|
|
143
|
-
expect(f.schemaSource).toBe("payment-extension");
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
describe("field.array", () => {
|
|
147
|
-
it("should create an array field with item schema", () => {
|
|
148
|
-
const f = field.array("addresses", field.text("street"), field.text("city"));
|
|
149
|
-
expect(f._type).toBe("field");
|
|
150
|
-
expect(f._field).toBe("array");
|
|
151
|
-
expect(f.name).toBe("addresses");
|
|
152
|
-
expect(f.items).toHaveLength(2);
|
|
153
|
-
expect(f.items[0]._field).toBe("text");
|
|
154
|
-
expect(f.items[1]._field).toBe("text");
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
describe("field.arrayWithConfig", () => {
|
|
158
|
-
it("should create an array field with config", () => {
|
|
159
|
-
const f = field.arrayWithConfig("items", { label: "Line Items", minItems: 1, maxItems: 10 }, field.text("description"));
|
|
160
|
-
expect(f.label).toBe("Line Items");
|
|
161
|
-
expect(f.minItems).toBe(1);
|
|
162
|
-
expect(f.maxItems).toBe(10);
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
describe("field.object", () => {
|
|
166
|
-
it("should create an object field with properties", () => {
|
|
167
|
-
const f = field.object("address", field.text("street"), field.text("city"), field.text("zip"));
|
|
168
|
-
expect(f._type).toBe("field");
|
|
169
|
-
expect(f._field).toBe("object");
|
|
170
|
-
expect(f.name).toBe("address");
|
|
171
|
-
expect(f.properties).toHaveLength(3);
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
describe("field.objectWithConfig", () => {
|
|
175
|
-
it("should create an object field with config", () => {
|
|
176
|
-
const f = field.objectWithConfig("billing", { label: "Billing Address", required: true }, field.text("street"));
|
|
177
|
-
expect(f.label).toBe("Billing Address");
|
|
178
|
-
expect(f.required).toBe(true);
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
});
|
|
182
|
-
describe("structure builders", () => {
|
|
183
|
-
describe("group", () => {
|
|
184
|
-
it("should create a group with label and elements", () => {
|
|
185
|
-
const g = group("Customer Info", field.text("name"), field.text("email"));
|
|
186
|
-
expect(g._type).toBe("group");
|
|
187
|
-
expect(g.label).toBe("Customer Info");
|
|
188
|
-
expect(g.elements).toHaveLength(2);
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
describe("when", () => {
|
|
192
|
-
it("should create a conditional with predicate and elements", () => {
|
|
193
|
-
const c = when(is("country", "US"), field.text("state"));
|
|
194
|
-
expect(c._type).toBe("conditional");
|
|
195
|
-
expect(c.field).toBe("country");
|
|
196
|
-
expect(c.value).toBe("US");
|
|
197
|
-
expect(c.elements).toHaveLength(1);
|
|
198
|
-
});
|
|
199
|
-
it("should support non-string values", () => {
|
|
200
|
-
const c = when(is("active", true), field.text("notes"));
|
|
201
|
-
expect(c.value).toBe(true);
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
describe("formspec", () => {
|
|
205
|
-
it("should create a form spec with elements", () => {
|
|
206
|
-
const f = formspec(field.text("name"), field.number("age"));
|
|
207
|
-
expect(f.elements).toHaveLength(2);
|
|
208
|
-
});
|
|
209
|
-
it("should support nested structures", () => {
|
|
210
|
-
const f = formspec(group("Basic", field.text("name")), when(is("type", "business"), field.text("company")));
|
|
211
|
-
expect(f.elements).toHaveLength(2);
|
|
212
|
-
expect(f.elements[0]._type).toBe("group");
|
|
213
|
-
expect(f.elements[1]._type).toBe("conditional");
|
|
214
|
-
});
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
describe("complex compositions", () => {
|
|
218
|
-
it("should support deeply nested structures", () => {
|
|
219
|
-
const form = formspec(group("Customer", field.text("name", { required: true }), field.object("address", field.text("street"), field.text("city"))), when(is("type", "business"), group("Business Info", field.text("company"), field.array("contacts", field.text("name"), field.text("email")))));
|
|
220
|
-
expect(form.elements).toHaveLength(2);
|
|
221
|
-
const customerGroup = form.elements[0];
|
|
222
|
-
expect(customerGroup._type).toBe("group");
|
|
223
|
-
// Type is narrowed after the assertion above, safe to access group properties
|
|
224
|
-
expect(customerGroup.elements).toHaveLength(2);
|
|
225
|
-
expect(customerGroup.elements[1]._type).toBe("field");
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
//# sourceMappingURL=builders.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"builders.test.js","sourceRoot":"","sources":["../../src/__tests__/builders.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type-level tests for inference utilities.
|
|
3
|
-
*
|
|
4
|
-
* These tests verify that the type inference works correctly at compile time.
|
|
5
|
-
* Run with: pnpm dlx tsd
|
|
6
|
-
*/
|
|
7
|
-
import { expectType, expectNotType } from "tsd";
|
|
8
|
-
import { field, group, when, is, formspec } from "../index.js";
|
|
9
|
-
// =============================================================================
|
|
10
|
-
// InferFieldValue tests
|
|
11
|
-
// =============================================================================
|
|
12
|
-
// TextField should infer to string
|
|
13
|
-
expectType({});
|
|
14
|
-
// NumberField should infer to number
|
|
15
|
-
expectType({});
|
|
16
|
-
// BooleanField should infer to boolean
|
|
17
|
-
expectType({});
|
|
18
|
-
// StaticEnumField should infer to union of options
|
|
19
|
-
expectType({});
|
|
20
|
-
// StaticEnumField with object options should infer to union of id values
|
|
21
|
-
expectType({});
|
|
22
|
-
expectType({});
|
|
23
|
-
expectType({});
|
|
24
|
-
// =============================================================================
|
|
25
|
-
// InferSchema tests - Basic fields
|
|
26
|
-
// =============================================================================
|
|
27
|
-
// Test single text field
|
|
28
|
-
const _singleTextField = formspec(field.text("name"));
|
|
29
|
-
expectType({});
|
|
30
|
-
// Test multiple basic fields
|
|
31
|
-
const _multipleFields = formspec(field.text("name"), field.number("age"), field.boolean("active"));
|
|
32
|
-
expectType({});
|
|
33
|
-
// =============================================================================
|
|
34
|
-
// InferSchema tests - Enum fields
|
|
35
|
-
// =============================================================================
|
|
36
|
-
// Test static enum field
|
|
37
|
-
const _enumForm = formspec(field.enum("status", ["draft", "sent", "paid"]));
|
|
38
|
-
expectType({});
|
|
39
|
-
// Test static enum field with object options
|
|
40
|
-
const _objectEnumForm = formspec(field.enum("priority", [
|
|
41
|
-
{ id: "low", label: "Low Priority" },
|
|
42
|
-
{ id: "high", label: "High Priority" },
|
|
43
|
-
]));
|
|
44
|
-
expectType({});
|
|
45
|
-
// =============================================================================
|
|
46
|
-
// InferSchema tests - Groups
|
|
47
|
-
// =============================================================================
|
|
48
|
-
// Test fields inside groups
|
|
49
|
-
const _groupForm = formspec(group("Customer", field.text("name"), field.text("email")), field.number("amount"));
|
|
50
|
-
expectType({});
|
|
51
|
-
// =============================================================================
|
|
52
|
-
// InferSchema tests - Conditionals
|
|
53
|
-
// =============================================================================
|
|
54
|
-
// Test fields inside conditionals - should be optional
|
|
55
|
-
const _conditionalForm = formspec(field.enum("type", ["personal", "business"]), when(is("type", "business"), field.text("company")));
|
|
56
|
-
// company is optional since it's inside a conditional
|
|
57
|
-
expectType({});
|
|
58
|
-
// Test multiple conditionals - all conditional fields should be optional
|
|
59
|
-
const _multiConditionalForm = formspec(field.enum("accountType", ["personal", "business"]), when(is("accountType", "personal"), field.text("ssn")), when(is("accountType", "business"), field.text("ein"), field.text("companyName")));
|
|
60
|
-
expectType({});
|
|
61
|
-
// Test conditional inside group - still optional
|
|
62
|
-
const _conditionalInGroupForm = formspec(group("Details", field.text("name"), when(is("showExtra", true), field.text("extra"))), field.boolean("showExtra"));
|
|
63
|
-
expectType({});
|
|
64
|
-
// Test group inside conditional - all fields optional
|
|
65
|
-
const _groupInConditionalForm = formspec(field.boolean("showAddress"), when(is("showAddress", true), group("Address", field.text("street"), field.text("city"))));
|
|
66
|
-
expectType({});
|
|
67
|
-
// =============================================================================
|
|
68
|
-
// InferSchema tests - Array fields
|
|
69
|
-
// =============================================================================
|
|
70
|
-
// Test array fields
|
|
71
|
-
const _arrayForm = formspec(field.array("addresses", field.text("street"), field.text("city")));
|
|
72
|
-
expectType({});
|
|
73
|
-
// =============================================================================
|
|
74
|
-
// InferSchema tests - Object fields
|
|
75
|
-
// =============================================================================
|
|
76
|
-
// Test object fields
|
|
77
|
-
const _objectForm = formspec(field.object("address", field.text("street"), field.text("city"), field.text("zip")));
|
|
78
|
-
expectType({});
|
|
79
|
-
// =============================================================================
|
|
80
|
-
// InferFormSchema tests
|
|
81
|
-
// =============================================================================
|
|
82
|
-
// Test InferFormSchema convenience type
|
|
83
|
-
const _complexForm = formspec(field.text("name"), field.number("amount"), field.enum("status", ["active", "inactive"]));
|
|
84
|
-
expectType({});
|
|
85
|
-
// =============================================================================
|
|
86
|
-
// Negative tests - types should NOT match
|
|
87
|
-
// =============================================================================
|
|
88
|
-
// TextField should NOT infer to number
|
|
89
|
-
expectNotType({});
|
|
90
|
-
// NumberField should NOT infer to string
|
|
91
|
-
expectNotType({});
|
|
92
|
-
// Enum should NOT allow invalid values
|
|
93
|
-
expectNotType({});
|
|
94
|
-
//# sourceMappingURL=inference.test-d.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inference.test-d.js","sourceRoot":"","sources":["../../src/__tests__/inference.test-d.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAW/D,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,mCAAmC;AACnC,UAAU,CAAS,EAAwC,CAAC,CAAC;AAE7D,qCAAqC;AACrC,UAAU,CAAS,EAAyC,CAAC,CAAC;AAE9D,uCAAuC;AACvC,UAAU,CAAU,EAA6C,CAAC,CAAC;AAEnE,mDAAmD;AACnD,UAAU,CACR,EAAoF,CACrF,CAAC;AAEF,yEAAyE;AACzE,UAAU,CACR,EAQC,CACF,CAAC;AAIF,UAAU,CACR,EAA4D,CAC7D,CAAC;AAIF,UAAU,CACR,EAA2D,CAC5D,CAAC;AAEF,gFAAgF;AAChF,mCAAmC;AACnC,gFAAgF;AAEhF,yBAAyB;AACzB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAEtD,UAAU,CAAmB,EAAsB,CAAC,CAAC;AAErD,6BAA6B;AAC7B,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEnG,UAAU,CAAiD,EAA0B,CAAC,CAAC;AAEvF,gFAAgF;AAChF,kCAAkC;AAClC,gFAAgF;AAEhF,yBAAyB;AACzB,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC,CAAC,CAAC;AAErF,UAAU,CAAwC,EAAgB,CAAC,CAAC;AAEpE,6CAA6C;AAC7C,MAAM,eAAe,GAAG,QAAQ,CAC9B,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE;IACrB,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE;IACpC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE;CAC9B,CAAC,CACZ,CAAC;AAEF,UAAU,CAA+B,EAAsB,CAAC,CAAC;AAEjE,gFAAgF;AAChF,6BAA6B;AAC7B,gFAAgF;AAEhF,4BAA4B;AAC5B,MAAM,UAAU,GAAG,QAAQ,CACzB,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAC1D,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CACvB,CAAC;AAEF,UAAU,CAAkD,EAAiB,CAAC,CAAC;AAE/E,gFAAgF;AAChF,mCAAmC;AACnC,gFAAgF;AAEhF,uDAAuD;AACvD,MAAM,gBAAgB,GAAG,QAAQ,CAC/B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,CAAU,CAAC,EACrD,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CACpD,CAAC;AAEF,sDAAsD;AACtD,UAAU,CAAsD,EAAuB,CAAC,CAAC;AAEzF,yEAAyE;AACzE,MAAM,qBAAqB,GAAG,QAAQ,CACpC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,CAAU,CAAC,EAC5D,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EACtD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAClF,CAAC;AAEF,UAAU,CAKP,EAA4B,CAAC,CAAC;AAEjC,iDAAiD;AACjD,MAAM,uBAAuB,GAAG,QAAQ,CACtC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EACtF,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAC3B,CAAC;AAEF,UAAU,CAAuD,EAA8B,CAAC,CAAC;AAEjG,sDAAsD;AACtD,MAAM,uBAAuB,GAAG,QAAQ,CACtC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAC5B,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAC1F,CAAC;AAEF,UAAU,CACR,EAA8B,CAC/B,CAAC;AAEF,gFAAgF;AAChF,mCAAmC;AACnC,gFAAgF;AAEhF,oBAAoB;AACpB,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAEhG,UAAU,CAAoD,EAAiB,CAAC,CAAC;AAEjF,gFAAgF;AAChF,oCAAoC;AACpC,gFAAgF;AAEhF,qBAAqB;AACrB,MAAM,WAAW,GAAG,QAAQ,CAC1B,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CACrF,CAAC;AAEF,UAAU,CAA6D,EAAkB,CAAC,CAAC;AAE3F,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,wCAAwC;AACxC,MAAM,YAAY,GAAG,QAAQ,CAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAClB,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EACtB,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAU,CAAC,CACtD,CAAC;AAEF,UAAU,CAAkE,EAAmB,CAAC,CAAC;AAEjG,gFAAgF;AAChF,0CAA0C;AAC1C,gFAAgF;AAEhF,uCAAuC;AACvC,aAAa,CAAS,EAAwC,CAAC,CAAC;AAEhE,yCAAyC;AACzC,aAAa,CAAS,EAAyC,CAAC,CAAC;AAEjE,uCAAuC;AACvC,aAAa,CAAqB,EAA4C,CAAC,CAAC"}
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import { formspecWithValidation, field, group, when, is, validateForm } from "../index.js";
|
|
3
|
-
describe("validateForm", () => {
|
|
4
|
-
describe("duplicate field detection", () => {
|
|
5
|
-
it("should detect duplicate field names at root level", () => {
|
|
6
|
-
const elements = [
|
|
7
|
-
field.text("name"),
|
|
8
|
-
field.text("email"),
|
|
9
|
-
field.text("name"), // duplicate
|
|
10
|
-
];
|
|
11
|
-
const result = validateForm(elements);
|
|
12
|
-
expect(result.valid).toBe(false); // duplicates are errors
|
|
13
|
-
expect(result.issues).toHaveLength(1);
|
|
14
|
-
const firstIssue = result.issues[0];
|
|
15
|
-
expect(firstIssue).toBeDefined();
|
|
16
|
-
if (firstIssue) {
|
|
17
|
-
expect(firstIssue.severity).toBe("error");
|
|
18
|
-
expect(firstIssue.message).toContain('Duplicate field name "name"');
|
|
19
|
-
expect(firstIssue.message).toContain("2 times");
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
it("should detect duplicate field names inside groups", () => {
|
|
23
|
-
const elements = [
|
|
24
|
-
group("Personal", field.text("name")),
|
|
25
|
-
group("Business", field.text("name") // duplicate
|
|
26
|
-
),
|
|
27
|
-
];
|
|
28
|
-
const result = validateForm(elements);
|
|
29
|
-
expect(result.valid).toBe(false);
|
|
30
|
-
expect(result.issues).toHaveLength(1);
|
|
31
|
-
const firstIssue = result.issues[0];
|
|
32
|
-
expect(firstIssue).toBeDefined();
|
|
33
|
-
if (firstIssue) {
|
|
34
|
-
expect(firstIssue.severity).toBe("error");
|
|
35
|
-
expect(firstIssue.message).toContain('Duplicate field name "name"');
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
it("should detect duplicate field names inside conditionals", () => {
|
|
39
|
-
const elements = [
|
|
40
|
-
field.enum("type", ["a", "b"]),
|
|
41
|
-
field.text("value"),
|
|
42
|
-
when(is("type", "a"), field.text("value") // duplicate
|
|
43
|
-
),
|
|
44
|
-
];
|
|
45
|
-
const result = validateForm(elements);
|
|
46
|
-
expect(result.valid).toBe(false);
|
|
47
|
-
expect(result.issues).toHaveLength(1);
|
|
48
|
-
const firstIssue = result.issues[0];
|
|
49
|
-
expect(firstIssue).toBeDefined();
|
|
50
|
-
if (firstIssue) {
|
|
51
|
-
expect(firstIssue.severity).toBe("error");
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
it("should allow same field names inside different array items (separate scope)", () => {
|
|
55
|
-
// Fields inside arrays are in a different scope - this is valid
|
|
56
|
-
const elements = [
|
|
57
|
-
field.array("addresses", field.text("street"), field.text("city")),
|
|
58
|
-
];
|
|
59
|
-
const result = validateForm(elements);
|
|
60
|
-
expect(result.valid).toBe(true);
|
|
61
|
-
expect(result.issues).toHaveLength(0);
|
|
62
|
-
});
|
|
63
|
-
it("should not flag unique field names", () => {
|
|
64
|
-
const elements = [
|
|
65
|
-
field.text("firstName"),
|
|
66
|
-
field.text("lastName"),
|
|
67
|
-
field.text("email"),
|
|
68
|
-
];
|
|
69
|
-
const result = validateForm(elements);
|
|
70
|
-
expect(result.valid).toBe(true);
|
|
71
|
-
expect(result.issues).toHaveLength(0);
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
describe("field reference validation", () => {
|
|
75
|
-
it("should detect references to non-existent fields", () => {
|
|
76
|
-
const elements = [
|
|
77
|
-
field.text("name"),
|
|
78
|
-
when(is("status", "draft"), // "status" doesn't exist!
|
|
79
|
-
field.text("notes")),
|
|
80
|
-
];
|
|
81
|
-
const result = validateForm(elements);
|
|
82
|
-
expect(result.valid).toBe(false);
|
|
83
|
-
expect(result.issues).toHaveLength(1);
|
|
84
|
-
const firstIssue = result.issues[0];
|
|
85
|
-
expect(firstIssue).toBeDefined();
|
|
86
|
-
if (firstIssue) {
|
|
87
|
-
expect(firstIssue.severity).toBe("error");
|
|
88
|
-
expect(firstIssue.message).toContain('non-existent field "status"');
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
it("should pass when conditional references existing field", () => {
|
|
92
|
-
const elements = [
|
|
93
|
-
field.enum("status", ["draft", "sent"]),
|
|
94
|
-
when(is("status", "draft"), field.text("notes")),
|
|
95
|
-
];
|
|
96
|
-
const result = validateForm(elements);
|
|
97
|
-
expect(result.valid).toBe(true);
|
|
98
|
-
expect(result.issues).toHaveLength(0);
|
|
99
|
-
});
|
|
100
|
-
it("should detect reference errors in nested conditionals", () => {
|
|
101
|
-
const elements = [
|
|
102
|
-
field.enum("type", ["a", "b"]),
|
|
103
|
-
when(is("type", "a"), when(is("subtype", "x"), // "subtype" doesn't exist!
|
|
104
|
-
field.text("extra"))),
|
|
105
|
-
];
|
|
106
|
-
const result = validateForm(elements);
|
|
107
|
-
expect(result.valid).toBe(false);
|
|
108
|
-
expect(result.issues.some((i) => i.message.includes('"subtype"'))).toBe(true);
|
|
109
|
-
});
|
|
110
|
-
it("should allow forward references (field defined after conditional)", () => {
|
|
111
|
-
// This is valid - the conditional references a field that's defined later
|
|
112
|
-
const elements = [
|
|
113
|
-
when(is("status", "draft"), field.text("notes")),
|
|
114
|
-
field.enum("status", ["draft", "sent"]),
|
|
115
|
-
];
|
|
116
|
-
const result = validateForm(elements);
|
|
117
|
-
expect(result.valid).toBe(true);
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
describe("combined issues", () => {
|
|
121
|
-
it("should report multiple issues", () => {
|
|
122
|
-
const elements = [
|
|
123
|
-
field.text("name"),
|
|
124
|
-
field.text("name"), // duplicate - now an error
|
|
125
|
-
when(is("nonExistent", "value"), // reference error
|
|
126
|
-
field.text("extra")),
|
|
127
|
-
];
|
|
128
|
-
const result = validateForm(elements);
|
|
129
|
-
expect(result.valid).toBe(false);
|
|
130
|
-
expect(result.issues).toHaveLength(2);
|
|
131
|
-
expect(result.issues.filter((i) => i.severity === "warning")).toHaveLength(0);
|
|
132
|
-
expect(result.issues.filter((i) => i.severity === "error")).toHaveLength(2);
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
describe("formspecWithValidation", () => {
|
|
137
|
-
let consoleWarnSpy;
|
|
138
|
-
let consoleErrorSpy;
|
|
139
|
-
beforeEach(() => {
|
|
140
|
-
consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => undefined);
|
|
141
|
-
consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
|
|
142
|
-
});
|
|
143
|
-
afterEach(() => {
|
|
144
|
-
consoleWarnSpy.mockRestore();
|
|
145
|
-
consoleErrorSpy.mockRestore();
|
|
146
|
-
});
|
|
147
|
-
it("should not validate when validate=false", () => {
|
|
148
|
-
formspecWithValidation({ validate: false }, field.text("name"), when(is("nonExistent", "value"), field.text("notes")));
|
|
149
|
-
expect(consoleWarnSpy).not.toHaveBeenCalled();
|
|
150
|
-
expect(consoleErrorSpy).not.toHaveBeenCalled();
|
|
151
|
-
});
|
|
152
|
-
it("should log errors when validate=true with duplicates", () => {
|
|
153
|
-
formspecWithValidation({ validate: true }, field.text("name"), field.text("name") // duplicate - now an error
|
|
154
|
-
);
|
|
155
|
-
expect(consoleErrorSpy).toHaveBeenCalled();
|
|
156
|
-
});
|
|
157
|
-
it("should log errors when validate=true and there are errors", () => {
|
|
158
|
-
formspecWithValidation({ validate: true }, field.text("name"), when(is("nonExistent", "value"), field.text("notes")));
|
|
159
|
-
expect(consoleErrorSpy).toHaveBeenCalled();
|
|
160
|
-
});
|
|
161
|
-
it("should include form name in validation messages", () => {
|
|
162
|
-
formspecWithValidation({ validate: true, name: "TestForm" }, field.text("name"), field.text("name"));
|
|
163
|
-
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining("TestForm"));
|
|
164
|
-
});
|
|
165
|
-
it("should throw when validate='throw' and there are errors", () => {
|
|
166
|
-
expect(() => formspecWithValidation({ validate: "throw" }, field.text("name"), when(is("nonExistent", "value"), field.text("notes")))).toThrow("Form validation failed");
|
|
167
|
-
});
|
|
168
|
-
it("should throw when validate='throw' and there are duplicate fields", () => {
|
|
169
|
-
expect(() => formspecWithValidation({ validate: "throw" }, field.text("name"), field.text("name") // duplicate - now an error
|
|
170
|
-
)).toThrow("Form validation failed");
|
|
171
|
-
});
|
|
172
|
-
it("should log errors with validate='warn' for duplicates", () => {
|
|
173
|
-
formspecWithValidation({ validate: "warn" }, field.text("name"), field.text("name"));
|
|
174
|
-
expect(consoleErrorSpy).toHaveBeenCalled();
|
|
175
|
-
});
|
|
176
|
-
it("should return correct form structure regardless of validation", () => {
|
|
177
|
-
const form = formspecWithValidation({ validate: true, name: "Test" }, field.text("name"), field.number("age"));
|
|
178
|
-
expect(form.elements).toHaveLength(2);
|
|
179
|
-
expect(form.elements[0]._type).toBe("field");
|
|
180
|
-
expect(form.elements[1]._type).toBe("field");
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
describe("validation with complex structures", () => {
|
|
184
|
-
it("should validate fields inside object fields", () => {
|
|
185
|
-
const elements = [
|
|
186
|
-
field.object("address", field.text("street"), field.text("street") // duplicate inside object
|
|
187
|
-
),
|
|
188
|
-
];
|
|
189
|
-
const result = validateForm(elements);
|
|
190
|
-
expect(result.issues).toHaveLength(1);
|
|
191
|
-
const firstIssue = result.issues[0];
|
|
192
|
-
expect(firstIssue).toBeDefined();
|
|
193
|
-
if (firstIssue) {
|
|
194
|
-
expect(firstIssue.message).toContain('"street"');
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
it("should validate deeply nested structures", () => {
|
|
198
|
-
const elements = [
|
|
199
|
-
group("Outer", group("Inner", field.enum("type", ["a", "b"]), when(is("type", "a"), field.object("details", field.text("name"), when(is("missing", "value"), // doesn't exist!
|
|
200
|
-
field.text("extra")))))),
|
|
201
|
-
];
|
|
202
|
-
const result = validateForm(elements);
|
|
203
|
-
expect(result.valid).toBe(false);
|
|
204
|
-
expect(result.issues.some((i) => i.message.includes('"missing"'))).toBe(true);
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
//# sourceMappingURL=validation.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":"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"}
|