@formspec/cli 0.1.0-alpha.8 → 0.1.0-alpha.9
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 +50 -37
- package/dist/__tests__/analyzer.test.d.ts +4 -1
- package/dist/__tests__/analyzer.test.d.ts.map +1 -1
- package/dist/__tests__/analyzer.test.js +5 -104
- package/dist/__tests__/analyzer.test.js.map +1 -1
- package/dist/__tests__/codegen.test.d.ts +4 -1
- package/dist/__tests__/codegen.test.d.ts.map +1 -1
- package/dist/__tests__/codegen.test.js +30 -484
- package/dist/__tests__/codegen.test.js.map +1 -1
- package/dist/__tests__/edge-cases.test.d.ts +5 -7
- package/dist/__tests__/edge-cases.test.d.ts.map +1 -1
- package/dist/__tests__/edge-cases.test.js +6 -373
- package/dist/__tests__/edge-cases.test.js.map +1 -1
- package/dist/__tests__/fixtures/edge-cases.d.ts.map +1 -1
- package/dist/__tests__/fixtures/edge-cases.js.map +1 -1
- package/dist/__tests__/integration.test.js +29 -18
- package/dist/__tests__/integration.test.js.map +1 -1
- package/dist/index.js +38 -18
- package/dist/index.js.map +1 -1
- package/dist/output/writer.d.ts +5 -5
- package/dist/output/writer.d.ts.map +1 -1
- package/dist/output/writer.js +13 -13
- package/dist/output/writer.js.map +1 -1
- package/dist/runtime/formspec-loader.d.ts.map +1 -1
- package/dist/runtime/formspec-loader.js +1 -3
- package/dist/runtime/formspec-loader.js.map +1 -1
- package/package.json +4 -4
- package/dist/analyzer/class-analyzer.d.ts +0 -75
- package/dist/analyzer/class-analyzer.d.ts.map +0 -1
- package/dist/analyzer/class-analyzer.js +0 -151
- package/dist/analyzer/class-analyzer.js.map +0 -1
- package/dist/analyzer/decorator-extractor.d.ts +0 -87
- package/dist/analyzer/decorator-extractor.d.ts.map +0 -1
- package/dist/analyzer/decorator-extractor.js +0 -193
- package/dist/analyzer/decorator-extractor.js.map +0 -1
- package/dist/analyzer/program.d.ts +0 -37
- package/dist/analyzer/program.d.ts.map +0 -1
- package/dist/analyzer/program.js +0 -89
- package/dist/analyzer/program.js.map +0 -1
- package/dist/analyzer/type-converter.d.ts +0 -97
- package/dist/analyzer/type-converter.d.ts.map +0 -1
- package/dist/analyzer/type-converter.js +0 -360
- package/dist/analyzer/type-converter.js.map +0 -1
- package/dist/codegen/index.d.ts +0 -76
- package/dist/codegen/index.d.ts.map +0 -1
- package/dist/codegen/index.js +0 -558
- package/dist/codegen/index.js.map +0 -1
- package/dist/generators/class-schema.d.ts +0 -43
- package/dist/generators/class-schema.d.ts.map +0 -1
- package/dist/generators/class-schema.js +0 -61
- package/dist/generators/class-schema.js.map +0 -1
- package/dist/generators/method-schema.d.ts +0 -57
- package/dist/generators/method-schema.d.ts.map +0 -1
- package/dist/generators/method-schema.js +0 -108
- package/dist/generators/method-schema.js.map +0 -1
package/README.md
CHANGED
|
@@ -53,14 +53,17 @@ formspec generate <file> [className] [options]
|
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
**Arguments:**
|
|
56
|
+
|
|
56
57
|
- `<file>` - Path to TypeScript source file
|
|
57
58
|
- `[className]` - Optional class name to analyze (required for decorated classes)
|
|
58
59
|
|
|
59
60
|
**Options:**
|
|
61
|
+
|
|
60
62
|
- `-o, --output <dir>` - Output directory (default: `./generated`)
|
|
61
63
|
- `-c, --compiled <path>` - Path to compiled JS file (auto-detected if omitted)
|
|
62
64
|
|
|
63
65
|
**Examples:**
|
|
66
|
+
|
|
64
67
|
```bash
|
|
65
68
|
# Generate from a decorated class
|
|
66
69
|
formspec generate ./src/forms.ts UserForm -o ./generated
|
|
@@ -78,12 +81,15 @@ formspec codegen <files...> [options]
|
|
|
78
81
|
```
|
|
79
82
|
|
|
80
83
|
**Arguments:**
|
|
84
|
+
|
|
81
85
|
- `<files...>` - TypeScript source files to analyze
|
|
82
86
|
|
|
83
87
|
**Options:**
|
|
88
|
+
|
|
84
89
|
- `-o, --output <file>` - Output file (default: `./__formspec_types__.ts`)
|
|
85
90
|
|
|
86
91
|
**Examples:**
|
|
92
|
+
|
|
87
93
|
```bash
|
|
88
94
|
# Generate type metadata for a single file
|
|
89
95
|
formspec codegen ./src/forms.ts -o ./src/__formspec_types__.ts
|
|
@@ -93,18 +99,20 @@ formspec codegen ./src/**/*.ts -o ./src/__formspec_types__.ts
|
|
|
93
99
|
```
|
|
94
100
|
|
|
95
101
|
**Usage in code:**
|
|
102
|
+
|
|
96
103
|
```typescript
|
|
97
104
|
// Import once at application entry point (side-effect import)
|
|
98
|
-
import
|
|
105
|
+
import "./__formspec_types__.js";
|
|
99
106
|
|
|
100
107
|
// Then use runtime schema generation
|
|
101
|
-
import { UserForm } from
|
|
102
|
-
import { buildFormSchemas } from
|
|
108
|
+
import { UserForm } from "./forms.js";
|
|
109
|
+
import { buildFormSchemas } from "@formspec/decorators";
|
|
103
110
|
|
|
104
111
|
const { jsonSchema, uiSchema } = buildFormSchemas(UserForm);
|
|
105
112
|
```
|
|
106
113
|
|
|
107
114
|
**When to use `codegen`:**
|
|
115
|
+
|
|
108
116
|
- You want to generate schemas at runtime (not build time)
|
|
109
117
|
- You're using the decorator DSL (not chain DSL)
|
|
110
118
|
- You need type information that TypeScript erases at compile time
|
|
@@ -165,11 +173,11 @@ Generated by `buildFormSchemas()` at runtime. Compatible with [JSON Forms](https
|
|
|
165
173
|
|
|
166
174
|
### Which Format to Use
|
|
167
175
|
|
|
168
|
-
| Use Case
|
|
169
|
-
|
|
170
|
-
| Custom form renderer
|
|
171
|
-
| JSON Forms library
|
|
172
|
-
| Server-side generation | Either
|
|
176
|
+
| Use Case | Format | Generated By |
|
|
177
|
+
| ---------------------- | --------------- | ------------------------ |
|
|
178
|
+
| Custom form renderer | FormSpec Native | `formspec generate` CLI |
|
|
179
|
+
| JSON Forms library | JSON Forms | `buildFormSchemas()` |
|
|
180
|
+
| Server-side generation | Either | Depends on your renderer |
|
|
173
181
|
|
|
174
182
|
Both formats are generated from the same FormSpec definition, ensuring consistency between build-time and runtime generation.
|
|
175
183
|
|
|
@@ -179,18 +187,20 @@ Both formats are generated from the same FormSpec definition, ensuring consisten
|
|
|
179
187
|
|
|
180
188
|
FormSpec offers two approaches for defining forms:
|
|
181
189
|
|
|
182
|
-
| Approach
|
|
183
|
-
|
|
184
|
-
| **Decorators + CLI** | Class-based data models, DTOs
|
|
185
|
-
| **Chain DSL**
|
|
190
|
+
| Approach | Best For | Schema Generation |
|
|
191
|
+
| -------------------- | ----------------------------------- | ------------------------------------------------------ |
|
|
192
|
+
| **Decorators + CLI** | Class-based data models, DTOs | Build-time (static analysis) or runtime (with codegen) |
|
|
193
|
+
| **Chain DSL** | Dynamic forms, runtime construction | Build-time or runtime (no code generation needed) |
|
|
186
194
|
|
|
187
195
|
**Use decorators + CLI when:**
|
|
196
|
+
|
|
188
197
|
- Your forms map directly to TypeScript classes or DTOs
|
|
189
198
|
- You prefer class-based modeling with validation constraints
|
|
190
199
|
- You want type information inferred from TypeScript (no redundant type hints)
|
|
191
200
|
- You need to generate schemas at build time for CI/CD pipelines
|
|
192
201
|
|
|
193
202
|
**Use Chain DSL (`@formspec/dsl`) when:**
|
|
203
|
+
|
|
194
204
|
- Forms are constructed dynamically at runtime
|
|
195
205
|
- Form definitions come from a database or API
|
|
196
206
|
- Forms don't correspond to specific TypeScript types
|
|
@@ -204,15 +214,15 @@ Both approaches produce identical JSON Schema and UI Schema output.
|
|
|
204
214
|
|
|
205
215
|
The CLI uses the TypeScript Compiler API to statically analyze your source files. It automatically infers:
|
|
206
216
|
|
|
207
|
-
| TypeScript Type
|
|
208
|
-
|
|
209
|
-
| `string`
|
|
210
|
-
| `number`
|
|
211
|
-
| `boolean`
|
|
212
|
-
| `"a" \| "b" \| "c"` | `{ "enum": ["a", "b", "c"] }`
|
|
213
|
-
| `string[]`
|
|
214
|
-
| `{ a: string }`
|
|
215
|
-
| `field?: T`
|
|
217
|
+
| TypeScript Type | JSON Schema | FormSpec Field |
|
|
218
|
+
| ------------------- | ------------------------------------------- | ---------------------------------------- |
|
|
219
|
+
| `string` | `{ "type": "string" }` | `{ "_field": "text" }` |
|
|
220
|
+
| `number` | `{ "type": "number" }` | `{ "_field": "number" }` |
|
|
221
|
+
| `boolean` | `{ "type": "boolean" }` | `{ "_field": "boolean" }` |
|
|
222
|
+
| `"a" \| "b" \| "c"` | `{ "enum": ["a", "b", "c"] }` | `{ "_field": "enum", "options": [...] }` |
|
|
223
|
+
| `string[]` | `{ "type": "array", "items": {...} }` | `{ "_field": "array" }` |
|
|
224
|
+
| `{ a: string }` | `{ "type": "object", "properties": {...} }` | `{ "_field": "object" }` |
|
|
225
|
+
| `field?: T` | not in `required` array | `{ "required": false }` |
|
|
216
226
|
|
|
217
227
|
### Decorator Recognition
|
|
218
228
|
|
|
@@ -220,21 +230,21 @@ The CLI recognizes decorators by name through static analysis. You don't need a
|
|
|
220
230
|
|
|
221
231
|
#### Supported Decorators
|
|
222
232
|
|
|
223
|
-
| Decorator
|
|
224
|
-
|
|
225
|
-
| `@Label(text)`
|
|
226
|
-
| `@Placeholder(text)` | Set placeholder text
|
|
227
|
-
| `@Description(text)` | Set field description
|
|
228
|
-
| `@Min(n)`
|
|
229
|
-
| `@Max(n)`
|
|
230
|
-
| `@MinLength(n)`
|
|
231
|
-
| `@MaxLength(n)`
|
|
232
|
-
| `@MinItems(n)`
|
|
233
|
-
| `@MaxItems(n)`
|
|
234
|
-
| `@Pattern(regex)`
|
|
235
|
-
| `@EnumOptions(opts)` | Override enum options
|
|
236
|
-
| `@ShowWhen(cond)`
|
|
237
|
-
| `@Group(name)`
|
|
233
|
+
| Decorator | Purpose | Example |
|
|
234
|
+
| -------------------- | ------------------------- | ---------------------------------------------------- |
|
|
235
|
+
| `@Label(text)` | Set field label | `@Label("Full Name")` |
|
|
236
|
+
| `@Placeholder(text)` | Set placeholder text | `@Placeholder("Enter name...")` |
|
|
237
|
+
| `@Description(text)` | Set field description | `@Description("Your legal name")` |
|
|
238
|
+
| `@Min(n)` | Set minimum value | `@Min(0)` |
|
|
239
|
+
| `@Max(n)` | Set maximum value | `@Max(100)` |
|
|
240
|
+
| `@MinLength(n)` | Set minimum string length | `@MinLength(1)` |
|
|
241
|
+
| `@MaxLength(n)` | Set maximum string length | `@MaxLength(255)` |
|
|
242
|
+
| `@MinItems(n)` | Set minimum array items | `@MinItems(1)` |
|
|
243
|
+
| `@MaxItems(n)` | Set maximum array items | `@MaxItems(10)` |
|
|
244
|
+
| `@Pattern(regex)` | Set validation pattern | `@Pattern("^[a-z]+$")` |
|
|
245
|
+
| `@EnumOptions(opts)` | Override enum options | `@EnumOptions([{id: "us", label: "United States"}])` |
|
|
246
|
+
| `@ShowWhen(cond)` | Conditional visibility | `@ShowWhen({ field: "type", value: "other" })` |
|
|
247
|
+
| `@Group(name)` | Group fields together | `@Group("Contact Info")` |
|
|
238
248
|
|
|
239
249
|
#### Using Decorators
|
|
240
250
|
|
|
@@ -365,7 +375,7 @@ class ContactForm {
|
|
|
365
375
|
@Label("Country")
|
|
366
376
|
@EnumOptions([
|
|
367
377
|
{ id: "us", label: "United States" },
|
|
368
|
-
{ id: "ca", label: "Canada" }
|
|
378
|
+
{ id: "ca", label: "Canada" },
|
|
369
379
|
])
|
|
370
380
|
country!: "us" | "ca";
|
|
371
381
|
}
|
|
@@ -374,6 +384,7 @@ class ContactForm {
|
|
|
374
384
|
Running `formspec generate ./contact-form.ts ContactForm` produces:
|
|
375
385
|
|
|
376
386
|
**schema.json:**
|
|
387
|
+
|
|
377
388
|
```json
|
|
378
389
|
{
|
|
379
390
|
"type": "object",
|
|
@@ -388,6 +399,7 @@ Running `formspec generate ./contact-form.ts ContactForm` produces:
|
|
|
388
399
|
```
|
|
389
400
|
|
|
390
401
|
**ux_spec.json:**
|
|
402
|
+
|
|
391
403
|
```json
|
|
392
404
|
{
|
|
393
405
|
"elements": [
|
|
@@ -458,6 +470,7 @@ formspec generate ./src/forms.ts MyClass -o ./generated
|
|
|
458
470
|
### Decorators Not Being Recognized
|
|
459
471
|
|
|
460
472
|
Ensure:
|
|
473
|
+
|
|
461
474
|
1. Decorator names match exactly (case-sensitive): `@Label`, not `@label`
|
|
462
475
|
2. Decorators are function calls: `@Label("text")`, not `@Label`
|
|
463
476
|
3. The decorator is imported (even if it's a stub)
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Unit tests for the analyzer module.
|
|
2
|
+
* Unit tests for the analyzer module (imported from @formspec/build).
|
|
3
|
+
*
|
|
4
|
+
* These tests verify that the CLI can use the analysis API from @formspec/build.
|
|
5
|
+
* Comprehensive analyzer tests are in @formspec/build.
|
|
3
6
|
*/
|
|
4
7
|
export {};
|
|
5
8
|
//# sourceMappingURL=analyzer.test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/analyzer.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"analyzer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/analyzer.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Unit tests for the analyzer module.
|
|
2
|
+
* Unit tests for the analyzer module (imported from @formspec/build).
|
|
3
|
+
*
|
|
4
|
+
* These tests verify that the CLI can use the analysis API from @formspec/build.
|
|
5
|
+
* Comprehensive analyzer tests are in @formspec/build.
|
|
3
6
|
*/
|
|
4
7
|
import { describe, it, expect } from "vitest";
|
|
5
8
|
import * as path from "node:path";
|
|
6
|
-
import { createProgramContext, findClassByName } from "
|
|
7
|
-
import { analyzeClass } from "../analyzer/class-analyzer.js";
|
|
8
|
-
import { convertType } from "../analyzer/type-converter.js";
|
|
9
|
+
import { createProgramContext, findClassByName, analyzeClass } from "@formspec/build/internals";
|
|
9
10
|
const fixturesDir = path.join(__dirname, "fixtures");
|
|
10
11
|
const sampleFormsPath = path.join(fixturesDir, "sample-forms.ts");
|
|
11
12
|
describe("program", () => {
|
|
@@ -65,105 +66,5 @@ describe("analyzeClass", () => {
|
|
|
65
66
|
expect(emailField?.optional).toBe(true);
|
|
66
67
|
expect(amountField?.optional).toBe(false);
|
|
67
68
|
});
|
|
68
|
-
it("analyzes instance methods", () => {
|
|
69
|
-
const ctx = createProgramContext(sampleFormsPath);
|
|
70
|
-
const classDecl = findClassByName(ctx.sourceFile, "InstallmentPlan");
|
|
71
|
-
if (!classDecl)
|
|
72
|
-
throw new Error("InstallmentPlan class not found");
|
|
73
|
-
const analysis = analyzeClass(classDecl, ctx.checker);
|
|
74
|
-
expect(analysis.instanceMethods).toHaveLength(2);
|
|
75
|
-
const methodNames = analysis.instanceMethods.map((m) => m.name);
|
|
76
|
-
expect(methodNames).toContain("activate");
|
|
77
|
-
expect(methodNames).toContain("cancelPlan");
|
|
78
|
-
});
|
|
79
|
-
it("analyzes static methods", () => {
|
|
80
|
-
const ctx = createProgramContext(sampleFormsPath);
|
|
81
|
-
const classDecl = findClassByName(ctx.sourceFile, "InstallmentPlan");
|
|
82
|
-
if (!classDecl)
|
|
83
|
-
throw new Error("InstallmentPlan class not found");
|
|
84
|
-
const analysis = analyzeClass(classDecl, ctx.checker);
|
|
85
|
-
expect(analysis.staticMethods).toHaveLength(1);
|
|
86
|
-
expect(analysis.staticMethods[0]?.name).toBe("createStandard");
|
|
87
|
-
});
|
|
88
|
-
it("detects InferSchema references in method parameters", () => {
|
|
89
|
-
const ctx = createProgramContext(sampleFormsPath);
|
|
90
|
-
const classDecl = findClassByName(ctx.sourceFile, "InstallmentPlan");
|
|
91
|
-
if (!classDecl)
|
|
92
|
-
throw new Error("InstallmentPlan class not found");
|
|
93
|
-
const analysis = analyzeClass(classDecl, ctx.checker);
|
|
94
|
-
const activateMethod = analysis.instanceMethods.find((m) => m.name === "activate");
|
|
95
|
-
expect(activateMethod?.parameters).toHaveLength(1);
|
|
96
|
-
expect(activateMethod?.parameters[0]?.formSpecExportName).toBe("ActivateParams");
|
|
97
|
-
const cancelMethod = analysis.instanceMethods.find((m) => m.name === "cancelPlan");
|
|
98
|
-
expect(cancelMethod?.parameters[0]?.formSpecExportName).toBe("CancelParams");
|
|
99
|
-
});
|
|
100
|
-
it("analyzes SimpleProduct without FormSpec references", () => {
|
|
101
|
-
const ctx = createProgramContext(sampleFormsPath);
|
|
102
|
-
const classDecl = findClassByName(ctx.sourceFile, "SimpleProduct");
|
|
103
|
-
if (!classDecl)
|
|
104
|
-
throw new Error("SimpleProduct class not found");
|
|
105
|
-
const analysis = analyzeClass(classDecl, ctx.checker);
|
|
106
|
-
expect(analysis.name).toBe("SimpleProduct");
|
|
107
|
-
expect(analysis.fields).toHaveLength(4);
|
|
108
|
-
expect(analysis.instanceMethods).toHaveLength(1);
|
|
109
|
-
expect(analysis.staticMethods).toHaveLength(0);
|
|
110
|
-
// The update method shouldn't have a FormSpec reference
|
|
111
|
-
const updateMethod = analysis.instanceMethods[0];
|
|
112
|
-
expect(updateMethod?.parameters[0]?.formSpecExportName).toBeNull();
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
describe("convertType", () => {
|
|
116
|
-
it("converts string type", () => {
|
|
117
|
-
const ctx = createProgramContext(sampleFormsPath);
|
|
118
|
-
const classDecl = findClassByName(ctx.sourceFile, "SimpleProduct");
|
|
119
|
-
if (!classDecl)
|
|
120
|
-
throw new Error("SimpleProduct class not found");
|
|
121
|
-
const analysis = analyzeClass(classDecl, ctx.checker);
|
|
122
|
-
const nameField = analysis.fields.find((f) => f.name === "name");
|
|
123
|
-
if (!nameField)
|
|
124
|
-
throw new Error("name field not found");
|
|
125
|
-
const result = convertType(nameField.type, ctx.checker);
|
|
126
|
-
expect(result.jsonSchema.type).toBe("string");
|
|
127
|
-
expect(result.formSpecFieldType).toBe("text");
|
|
128
|
-
});
|
|
129
|
-
it("converts number type", () => {
|
|
130
|
-
const ctx = createProgramContext(sampleFormsPath);
|
|
131
|
-
const classDecl = findClassByName(ctx.sourceFile, "SimpleProduct");
|
|
132
|
-
if (!classDecl)
|
|
133
|
-
throw new Error("SimpleProduct class not found");
|
|
134
|
-
const analysis = analyzeClass(classDecl, ctx.checker);
|
|
135
|
-
const priceField = analysis.fields.find((f) => f.name === "price");
|
|
136
|
-
if (!priceField)
|
|
137
|
-
throw new Error("price field not found");
|
|
138
|
-
const result = convertType(priceField.type, ctx.checker);
|
|
139
|
-
// price is optional so it's number | undefined
|
|
140
|
-
expect(result.formSpecFieldType).toBe("number");
|
|
141
|
-
});
|
|
142
|
-
it("converts boolean type", () => {
|
|
143
|
-
const ctx = createProgramContext(sampleFormsPath);
|
|
144
|
-
const classDecl = findClassByName(ctx.sourceFile, "SimpleProduct");
|
|
145
|
-
if (!classDecl)
|
|
146
|
-
throw new Error("SimpleProduct class not found");
|
|
147
|
-
const analysis = analyzeClass(classDecl, ctx.checker);
|
|
148
|
-
const activeField = analysis.fields.find((f) => f.name === "active");
|
|
149
|
-
if (!activeField)
|
|
150
|
-
throw new Error("active field not found");
|
|
151
|
-
const result = convertType(activeField.type, ctx.checker);
|
|
152
|
-
expect(result.jsonSchema.type).toBe("boolean");
|
|
153
|
-
expect(result.formSpecFieldType).toBe("boolean");
|
|
154
|
-
});
|
|
155
|
-
it("converts string literal union to enum", () => {
|
|
156
|
-
const ctx = createProgramContext(sampleFormsPath);
|
|
157
|
-
const classDecl = findClassByName(ctx.sourceFile, "InstallmentPlan");
|
|
158
|
-
if (!classDecl)
|
|
159
|
-
throw new Error("InstallmentPlan class not found");
|
|
160
|
-
const analysis = analyzeClass(classDecl, ctx.checker);
|
|
161
|
-
const statusField = analysis.fields.find((f) => f.name === "status");
|
|
162
|
-
if (!statusField)
|
|
163
|
-
throw new Error("status field not found");
|
|
164
|
-
const result = convertType(statusField.type, ctx.checker);
|
|
165
|
-
expect(result.jsonSchema.enum).toEqual(["active", "paused", "canceled"]);
|
|
166
|
-
expect(result.formSpecFieldType).toBe("enum");
|
|
167
|
-
});
|
|
168
69
|
});
|
|
169
70
|
//# sourceMappingURL=analyzer.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.test.js","sourceRoot":"","sources":["../../src/__tests__/analyzer.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"analyzer.test.js","sourceRoot":"","sources":["../../src/__tests__/analyzer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tests for the codegen type generation functions.
|
|
2
|
+
* Tests for the codegen type generation functions (imported from @formspec/build).
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive codegen tests are in @formspec/build.
|
|
5
|
+
* This file verifies the CLI can access the codegen API.
|
|
3
6
|
*/
|
|
4
7
|
export {};
|
|
5
8
|
//# sourceMappingURL=codegen.test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/codegen.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"codegen.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/codegen.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|