@formspec/dsl 0.1.0-alpha.0

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=builders.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builders.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/builders.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,167 @@
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
+ });
60
+ describe("field.dynamicEnum", () => {
61
+ it("should create a dynamic enum field with source", () => {
62
+ const f = field.dynamicEnum("country", "countries");
63
+ expect(f._type).toBe("field");
64
+ expect(f._field).toBe("dynamic_enum");
65
+ expect(f.name).toBe("country");
66
+ expect(f.source).toBe("countries");
67
+ });
68
+ it("should include params for dependent lookups", () => {
69
+ const f = field.dynamicEnum("city", "cities", {
70
+ params: ["country"],
71
+ });
72
+ expect(f.params).toEqual(["country"]);
73
+ });
74
+ });
75
+ describe("field.dynamicSchema", () => {
76
+ it("should create a dynamic schema field", () => {
77
+ const f = field.dynamicSchema("extension", "payment-extension");
78
+ expect(f._type).toBe("field");
79
+ expect(f._field).toBe("dynamic_schema");
80
+ expect(f.name).toBe("extension");
81
+ expect(f.schemaSource).toBe("payment-extension");
82
+ });
83
+ });
84
+ describe("field.array", () => {
85
+ it("should create an array field with item schema", () => {
86
+ const f = field.array("addresses", field.text("street"), field.text("city"));
87
+ expect(f._type).toBe("field");
88
+ expect(f._field).toBe("array");
89
+ expect(f.name).toBe("addresses");
90
+ expect(f.items).toHaveLength(2);
91
+ expect(f.items[0]._field).toBe("text");
92
+ expect(f.items[1]._field).toBe("text");
93
+ });
94
+ });
95
+ describe("field.arrayWithConfig", () => {
96
+ it("should create an array field with config", () => {
97
+ const f = field.arrayWithConfig("items", { label: "Line Items", minItems: 1, maxItems: 10 }, field.text("description"));
98
+ expect(f.label).toBe("Line Items");
99
+ expect(f.minItems).toBe(1);
100
+ expect(f.maxItems).toBe(10);
101
+ });
102
+ });
103
+ describe("field.object", () => {
104
+ it("should create an object field with properties", () => {
105
+ const f = field.object("address", field.text("street"), field.text("city"), field.text("zip"));
106
+ expect(f._type).toBe("field");
107
+ expect(f._field).toBe("object");
108
+ expect(f.name).toBe("address");
109
+ expect(f.properties).toHaveLength(3);
110
+ });
111
+ });
112
+ describe("field.objectWithConfig", () => {
113
+ it("should create an object field with config", () => {
114
+ const f = field.objectWithConfig("billing", { label: "Billing Address", required: true }, field.text("street"));
115
+ expect(f.label).toBe("Billing Address");
116
+ expect(f.required).toBe(true);
117
+ });
118
+ });
119
+ });
120
+ describe("structure builders", () => {
121
+ describe("group", () => {
122
+ it("should create a group with label and elements", () => {
123
+ const g = group("Customer Info", field.text("name"), field.text("email"));
124
+ expect(g._type).toBe("group");
125
+ expect(g.label).toBe("Customer Info");
126
+ expect(g.elements).toHaveLength(2);
127
+ });
128
+ });
129
+ describe("when", () => {
130
+ it("should create a conditional with predicate and elements", () => {
131
+ const c = when(is("country", "US"), field.text("state"));
132
+ expect(c._type).toBe("conditional");
133
+ expect(c.field).toBe("country");
134
+ expect(c.value).toBe("US");
135
+ expect(c.elements).toHaveLength(1);
136
+ });
137
+ it("should support non-string values", () => {
138
+ const c = when(is("active", true), field.text("notes"));
139
+ expect(c.value).toBe(true);
140
+ });
141
+ });
142
+ describe("formspec", () => {
143
+ it("should create a form spec with elements", () => {
144
+ const f = formspec(field.text("name"), field.number("age"));
145
+ expect(f.elements).toHaveLength(2);
146
+ });
147
+ it("should support nested structures", () => {
148
+ const f = formspec(group("Basic", field.text("name")), when(is("type", "business"), field.text("company")));
149
+ expect(f.elements).toHaveLength(2);
150
+ expect(f.elements[0]._type).toBe("group");
151
+ expect(f.elements[1]._type).toBe("conditional");
152
+ });
153
+ });
154
+ });
155
+ describe("complex compositions", () => {
156
+ it("should support deeply nested structures", () => {
157
+ 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")))));
158
+ expect(form.elements).toHaveLength(2);
159
+ const customerGroup = form.elements[0];
160
+ expect(customerGroup._type).toBe("group");
161
+ if (customerGroup._type === "group") {
162
+ expect(customerGroup.elements).toHaveLength(2);
163
+ expect(customerGroup.elements[1]._type).toBe("field");
164
+ }
165
+ });
166
+ });
167
+ //# sourceMappingURL=builders.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builders.test.js","sourceRoot":"","sources":["../../src/__tests__/builders.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE/D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE7B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;gBAC3B,KAAK,EAAE,WAAW;gBAClB,WAAW,EAAE,iBAAiB;gBAC9B,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAClC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC9C,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAE9B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAEpD,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAElC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC,CAAC;YAEnE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9B,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAU,EAAE;gBACzD,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YAEH,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAEpD,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACtC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE;gBAC5C,MAAM,EAAE,CAAC,SAAS,CAAC;aACpB,CAAC,CAAC;YAEH,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;YAEhE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACxC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CACnB,WAAW,EACX,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CACnB,CAAC;YAEF,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,GAAG,KAAK,CAAC,eAAe,CAC7B,OAAO,EACP,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAClD,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAC1B,CAAC;YAEF,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CACpB,SAAS,EACT,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAClB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAClB,CAAC;YAEF,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAC9B,SAAS,EACT,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,EAC5C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CACrB,CAAC;YAEF,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACxC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,GAAG,KAAK,CACb,eAAe,EACf,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAClB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CACpB,CAAC;YAEF,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACtC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,CAAC,GAAG,IAAI,CACZ,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EACnB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CACpB,CAAC;YAEF,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACpC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAExD,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,GAAG,QAAQ,CAChB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAClB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CACpB,CAAC;YAEF,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,CAAC,GAAG,QAAQ,CAChB,KAAK,CAAC,OAAO,EACX,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CACnB,EACD,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EACzB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CACtB,CACF,CAAC;YAEF,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1C,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAAG,QAAQ,CACnB,KAAK,CAAC,UAAU,EACd,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EACtC,KAAK,CAAC,MAAM,CAAC,SAAS,EACpB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CACnB,CACF,EACD,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EACzB,KAAK,CAAC,eAAe,EACnB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EACrB,KAAK,CAAC,KAAK,CAAC,UAAU,EACpB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAClB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CACpB,CACF,CACF,CACF,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEtC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,aAAa,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YACpC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
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
+ export {};
8
+ //# sourceMappingURL=inference.test-d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inference.test-d.d.ts","sourceRoot":"","sources":["../../src/__tests__/inference.test-d.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,76 @@
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
+ expectType({});
21
+ expectType({});
22
+ // =============================================================================
23
+ // InferSchema tests - Basic fields
24
+ // =============================================================================
25
+ // Test single text field
26
+ const singleTextField = formspec(field.text("name"));
27
+ expectType({});
28
+ // Test multiple basic fields
29
+ const multipleFields = formspec(field.text("name"), field.number("age"), field.boolean("active"));
30
+ expectType({});
31
+ // =============================================================================
32
+ // InferSchema tests - Enum fields
33
+ // =============================================================================
34
+ // Test static enum field
35
+ const enumForm = formspec(field.enum("status", ["draft", "sent", "paid"]));
36
+ expectType({});
37
+ // =============================================================================
38
+ // InferSchema tests - Groups
39
+ // =============================================================================
40
+ // Test fields inside groups
41
+ const groupForm = formspec(group("Customer", field.text("name"), field.text("email")), field.number("amount"));
42
+ expectType({});
43
+ // =============================================================================
44
+ // InferSchema tests - Conditionals
45
+ // =============================================================================
46
+ // Test fields inside conditionals
47
+ const conditionalForm = formspec(field.enum("type", ["personal", "business"]), when(is("type", "business"), field.text("company")));
48
+ expectType({});
49
+ // =============================================================================
50
+ // InferSchema tests - Array fields
51
+ // =============================================================================
52
+ // Test array fields
53
+ const arrayForm = formspec(field.array("addresses", field.text("street"), field.text("city")));
54
+ expectType({});
55
+ // =============================================================================
56
+ // InferSchema tests - Object fields
57
+ // =============================================================================
58
+ // Test object fields
59
+ const objectForm = formspec(field.object("address", field.text("street"), field.text("city"), field.text("zip")));
60
+ expectType({});
61
+ // =============================================================================
62
+ // InferFormSchema tests
63
+ // =============================================================================
64
+ // Test InferFormSchema convenience type
65
+ const complexForm = formspec(field.text("name"), field.number("amount"), field.enum("status", ["active", "inactive"]));
66
+ expectType({});
67
+ // =============================================================================
68
+ // Negative tests - types should NOT match
69
+ // =============================================================================
70
+ // TextField should NOT infer to number
71
+ expectNotType({});
72
+ // NumberField should NOT infer to string
73
+ expectNotType({});
74
+ // Enum should NOT allow invalid values
75
+ expectNotType({});
76
+ //# sourceMappingURL=inference.test-d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inference.test-d.js","sourceRoot":"","sources":["../../src/__tests__/inference.test-d.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,180 @@
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(true); // duplicates are warnings, not errors
13
+ expect(result.issues).toHaveLength(1);
14
+ expect(result.issues[0].severity).toBe("warning");
15
+ expect(result.issues[0].message).toContain('Duplicate field name "name"');
16
+ expect(result.issues[0].message).toContain("2 times");
17
+ });
18
+ it("should detect duplicate field names inside groups", () => {
19
+ const elements = [
20
+ group("Personal", field.text("name")),
21
+ group("Business", field.text("name")),
22
+ ];
23
+ const result = validateForm(elements);
24
+ expect(result.issues).toHaveLength(1);
25
+ expect(result.issues[0].severity).toBe("warning");
26
+ expect(result.issues[0].message).toContain('Duplicate field name "name"');
27
+ });
28
+ it("should detect duplicate field names inside conditionals", () => {
29
+ const elements = [
30
+ field.enum("type", ["a", "b"]),
31
+ field.text("value"),
32
+ when(is("type", "a"), field.text("value")),
33
+ ];
34
+ const result = validateForm(elements);
35
+ expect(result.issues).toHaveLength(1);
36
+ expect(result.issues[0].severity).toBe("warning");
37
+ });
38
+ it("should allow same field names inside different array items (separate scope)", () => {
39
+ // Fields inside arrays are in a different scope - this is valid
40
+ const elements = [
41
+ field.array("addresses", field.text("street"), field.text("city")),
42
+ ];
43
+ const result = validateForm(elements);
44
+ expect(result.valid).toBe(true);
45
+ expect(result.issues).toHaveLength(0);
46
+ });
47
+ it("should not flag unique field names", () => {
48
+ const elements = [
49
+ field.text("firstName"),
50
+ field.text("lastName"),
51
+ field.text("email"),
52
+ ];
53
+ const result = validateForm(elements);
54
+ expect(result.valid).toBe(true);
55
+ expect(result.issues).toHaveLength(0);
56
+ });
57
+ });
58
+ describe("field reference validation", () => {
59
+ it("should detect references to non-existent fields", () => {
60
+ const elements = [
61
+ field.text("name"),
62
+ when(is("status", "draft"), // "status" doesn't exist!
63
+ field.text("notes")),
64
+ ];
65
+ const result = validateForm(elements);
66
+ expect(result.valid).toBe(false);
67
+ expect(result.issues).toHaveLength(1);
68
+ expect(result.issues[0].severity).toBe("error");
69
+ expect(result.issues[0].message).toContain('non-existent field "status"');
70
+ });
71
+ it("should pass when conditional references existing field", () => {
72
+ const elements = [
73
+ field.enum("status", ["draft", "sent"]),
74
+ when(is("status", "draft"), field.text("notes")),
75
+ ];
76
+ const result = validateForm(elements);
77
+ expect(result.valid).toBe(true);
78
+ expect(result.issues).toHaveLength(0);
79
+ });
80
+ it("should detect reference errors in nested conditionals", () => {
81
+ const elements = [
82
+ field.enum("type", ["a", "b"]),
83
+ when(is("type", "a"), when(is("subtype", "x"), // "subtype" doesn't exist!
84
+ field.text("extra"))),
85
+ ];
86
+ const result = validateForm(elements);
87
+ expect(result.valid).toBe(false);
88
+ expect(result.issues.some((i) => i.message.includes('"subtype"'))).toBe(true);
89
+ });
90
+ it("should allow forward references (field defined after conditional)", () => {
91
+ // This is valid - the conditional references a field that's defined later
92
+ const elements = [
93
+ when(is("status", "draft"), field.text("notes")),
94
+ field.enum("status", ["draft", "sent"]),
95
+ ];
96
+ const result = validateForm(elements);
97
+ expect(result.valid).toBe(true);
98
+ });
99
+ });
100
+ describe("combined issues", () => {
101
+ it("should report multiple issues", () => {
102
+ const elements = [
103
+ field.text("name"),
104
+ field.text("name"), // duplicate
105
+ when(is("nonExistent", "value"), // reference error
106
+ field.text("extra")),
107
+ ];
108
+ const result = validateForm(elements);
109
+ expect(result.valid).toBe(false);
110
+ expect(result.issues).toHaveLength(2);
111
+ expect(result.issues.filter((i) => i.severity === "warning")).toHaveLength(1);
112
+ expect(result.issues.filter((i) => i.severity === "error")).toHaveLength(1);
113
+ });
114
+ });
115
+ });
116
+ describe("formspecWithValidation", () => {
117
+ let consoleWarnSpy;
118
+ let consoleErrorSpy;
119
+ beforeEach(() => {
120
+ consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
121
+ consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
122
+ });
123
+ afterEach(() => {
124
+ consoleWarnSpy.mockRestore();
125
+ consoleErrorSpy.mockRestore();
126
+ });
127
+ it("should not validate when validate=false", () => {
128
+ formspecWithValidation({ validate: false }, field.text("name"), when(is("nonExistent", "value"), field.text("notes")));
129
+ expect(consoleWarnSpy).not.toHaveBeenCalled();
130
+ expect(consoleErrorSpy).not.toHaveBeenCalled();
131
+ });
132
+ it("should log warnings when validate=true", () => {
133
+ formspecWithValidation({ validate: true }, field.text("name"), field.text("name"));
134
+ expect(consoleWarnSpy).toHaveBeenCalled();
135
+ });
136
+ it("should log errors when validate=true and there are errors", () => {
137
+ formspecWithValidation({ validate: true }, field.text("name"), when(is("nonExistent", "value"), field.text("notes")));
138
+ expect(consoleErrorSpy).toHaveBeenCalled();
139
+ });
140
+ it("should include form name in validation messages", () => {
141
+ formspecWithValidation({ validate: true, name: "TestForm" }, field.text("name"), field.text("name"));
142
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining("TestForm"));
143
+ });
144
+ it("should throw when validate='throw' and there are errors", () => {
145
+ expect(() => formspecWithValidation({ validate: "throw" }, field.text("name"), when(is("nonExistent", "value"), field.text("notes")))).toThrow("Form validation failed");
146
+ });
147
+ it("should not throw when validate='throw' and there are only warnings", () => {
148
+ expect(() => formspecWithValidation({ validate: "throw" }, field.text("name"), field.text("name"))).not.toThrow();
149
+ });
150
+ it("should work with validate='warn'", () => {
151
+ formspecWithValidation({ validate: "warn" }, field.text("name"), field.text("name"));
152
+ expect(consoleWarnSpy).toHaveBeenCalled();
153
+ });
154
+ it("should return correct form structure regardless of validation", () => {
155
+ const form = formspecWithValidation({ validate: true, name: "Test" }, field.text("name"), field.number("age"));
156
+ expect(form.elements).toHaveLength(2);
157
+ expect(form.elements[0]._type).toBe("field");
158
+ expect(form.elements[1]._type).toBe("field");
159
+ });
160
+ });
161
+ describe("validation with complex structures", () => {
162
+ it("should validate fields inside object fields", () => {
163
+ const elements = [
164
+ field.object("address", field.text("street"), field.text("street")),
165
+ ];
166
+ const result = validateForm(elements);
167
+ expect(result.issues).toHaveLength(1);
168
+ expect(result.issues[0].message).toContain('"street"');
169
+ });
170
+ it("should validate deeply nested structures", () => {
171
+ const elements = [
172
+ 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!
173
+ field.text("extra")))))),
174
+ ];
175
+ const result = validateForm(elements);
176
+ expect(result.valid).toBe(false);
177
+ expect(result.issues.some((i) => i.message.includes('"missing"'))).toBe(true);
178
+ });
179
+ });
180
+ //# sourceMappingURL=validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":"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"}