@formspec/decorators 0.1.0-alpha.3

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,464 @@
1
+ /**
2
+ * @formspec/decorators
3
+ *
4
+ * Decorators for FormSpec form definitions.
5
+ *
6
+ * These decorators work in two modes:
7
+ *
8
+ * 1. **Build-time (CLI generate)**: The FormSpec CLI reads decorators through
9
+ * static analysis and generates JSON Schema + UI Schema files directly.
10
+ *
11
+ * 2. **Runtime (with CLI codegen)**: Run `formspec codegen` to generate a type
12
+ * metadata file, then use `toFormSpec()` to generate specs at runtime.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import { Label, Min, Max, EnumOptions, toFormSpec } from '@formspec/decorators';
17
+ *
18
+ * class UserForm {
19
+ * @Label("Full Name")
20
+ * name!: string;
21
+ *
22
+ * @Label("Age")
23
+ * @Min(18)
24
+ * @Max(120)
25
+ * age?: number;
26
+ *
27
+ * @Label("Country")
28
+ * @EnumOptions([
29
+ * { id: "us", label: "United States" },
30
+ * { id: "ca", label: "Canada" }
31
+ * ])
32
+ * country!: "us" | "ca";
33
+ * }
34
+ *
35
+ * // After running: formspec codegen ./forms.ts -o ./__formspec_types__.ts
36
+ * // Import the generated file and use toFormSpec:
37
+ * import './__formspec_types__';
38
+ * const spec = toFormSpec(UserForm);
39
+ * ```
40
+ */
41
+ /** Type for property decorator */
42
+ type PropertyDecorator = (target: object, propertyKey: string) => void;
43
+ /** Type for enum option - can be a simple string or an object with id/label */
44
+ export type EnumOptionValue = string | {
45
+ id: string;
46
+ label: string;
47
+ };
48
+ /** Type for conditional visibility condition */
49
+ export interface ShowWhenCondition {
50
+ field: string;
51
+ value: unknown;
52
+ }
53
+ /** Decorator metadata stored at runtime */
54
+ export interface FieldDecoratorMetadata {
55
+ label?: string;
56
+ placeholder?: string;
57
+ description?: string;
58
+ min?: number;
59
+ max?: number;
60
+ step?: number;
61
+ minLength?: number;
62
+ maxLength?: number;
63
+ minItems?: number;
64
+ maxItems?: number;
65
+ pattern?: string;
66
+ options?: EnumOptionValue[];
67
+ showWhen?: ShowWhenCondition;
68
+ group?: string;
69
+ }
70
+ /**
71
+ * Type metadata emitted by the CLI codegen command.
72
+ *
73
+ * Describes the runtime type information for a field that TypeScript
74
+ * normally erases. Generated by `formspec codegen` from static analysis.
75
+ */
76
+ export interface TypeMetadata {
77
+ /** Base type: "string", "number", "boolean", "enum", "array", "object", "unknown" */
78
+ type: string;
79
+ /** For enum types, the possible literal values */
80
+ values?: unknown[];
81
+ /** For array types, metadata about the array element type */
82
+ itemType?: TypeMetadata;
83
+ /** For object types, metadata about each property */
84
+ properties?: Record<string, TypeMetadata>;
85
+ /** Whether the field accepts null */
86
+ nullable?: boolean;
87
+ /** Whether the field is optional (T | undefined or ?: modifier) */
88
+ optional?: boolean;
89
+ }
90
+ /**
91
+ * FormSpec field element representation.
92
+ *
93
+ * This is the internal format used by FormSpec to represent form fields.
94
+ * Generated from decorated classes via `toFormSpec()` or `buildFormSchemas()`.
95
+ */
96
+ export interface FormSpecField {
97
+ /** Field type: "text", "number", "boolean", "enum", "array", "object" */
98
+ _field: string;
99
+ /** Unique field identifier (property name) */
100
+ id: string;
101
+ /** Display label for the field */
102
+ label?: string;
103
+ /** Placeholder text for input fields */
104
+ placeholder?: string;
105
+ /** Help text or description */
106
+ description?: string;
107
+ /** Whether the field is required (non-optional) */
108
+ required?: boolean;
109
+ /** Minimum value for number fields */
110
+ min?: number;
111
+ /** Maximum value for number fields */
112
+ max?: number;
113
+ /** Step increment for number fields */
114
+ step?: number;
115
+ /** Minimum character length for text fields */
116
+ minLength?: number;
117
+ /** Maximum character length for text fields */
118
+ maxLength?: number;
119
+ /** Minimum items for array fields */
120
+ minItems?: number;
121
+ /** Maximum items for array fields */
122
+ maxItems?: number;
123
+ /** Regex pattern for text validation */
124
+ pattern?: string;
125
+ /** Enum options (strings or {id, label} objects) */
126
+ options?: EnumOptionValue[];
127
+ /** Conditional visibility rule */
128
+ showWhen?: ShowWhenCondition;
129
+ /** Group name for field grouping */
130
+ group?: string;
131
+ /** Nested fields for object/array types */
132
+ fields?: FormSpecField[];
133
+ }
134
+ /** FormSpec output (elements only, for backwards compatibility) */
135
+ export interface FormSpecOutput {
136
+ elements: FormSpecField[];
137
+ }
138
+ /**
139
+ * JSON Schema type (subset of JSON Schema draft-07).
140
+ *
141
+ * Used for validation schema output from `buildFormSchemas()`.
142
+ * Only includes properties used by FormSpec; not a complete JSON Schema type.
143
+ *
144
+ * @see https://json-schema.org/draft-07/schema
145
+ */
146
+ export interface JSONSchema7 {
147
+ /** JSON Schema dialect identifier */
148
+ $schema?: string;
149
+ /** Data type: "string", "number", "boolean", "object", "array" */
150
+ type?: string;
151
+ /** Object property schemas (for type: "object") */
152
+ properties?: Record<string, JSONSchema7>;
153
+ /** Required property names (for type: "object") */
154
+ required?: string[];
155
+ /** Human-readable title (from @Label decorator) */
156
+ title?: string;
157
+ /** Minimum numeric value (from @Min decorator) */
158
+ minimum?: number;
159
+ /** Maximum numeric value (from @Max decorator) */
160
+ maximum?: number;
161
+ /** Minimum string length (from @MinLength decorator) */
162
+ minLength?: number;
163
+ /** Maximum string length (from @MaxLength decorator) */
164
+ maxLength?: number;
165
+ /** Minimum array items (from @MinItems decorator) */
166
+ minItems?: number;
167
+ /** Maximum array items (from @MaxItems decorator) */
168
+ maxItems?: number;
169
+ /** Regex validation pattern (from @Pattern decorator) */
170
+ pattern?: string;
171
+ /** Enum values (for simple string enums) */
172
+ enum?: unknown[];
173
+ /** Enum with labels using oneOf/const pattern */
174
+ oneOf?: Array<{
175
+ const: unknown;
176
+ title?: string;
177
+ }>;
178
+ /** Array item schema (for type: "array") */
179
+ items?: JSONSchema7;
180
+ }
181
+ /**
182
+ * UI Schema element types for JSON Forms.
183
+ */
184
+ export interface UISchemaElement {
185
+ type: string;
186
+ elements?: UISchemaElement[];
187
+ scope?: string;
188
+ label?: string;
189
+ rule?: UISchemaRule;
190
+ }
191
+ /**
192
+ * UI Schema rule for conditional visibility.
193
+ */
194
+ export interface UISchemaRule {
195
+ effect: "SHOW" | "HIDE" | "ENABLE" | "DISABLE";
196
+ condition: {
197
+ scope: string;
198
+ schema: Record<string, unknown>;
199
+ };
200
+ }
201
+ /**
202
+ * Result of building form schemas.
203
+ * Matches the return type of `buildFormSchemas` from @formspec/build.
204
+ */
205
+ export interface BuildResult {
206
+ /** JSON Schema for validation */
207
+ readonly jsonSchema: JSONSchema7;
208
+ /** JSON Forms UI Schema for rendering */
209
+ readonly uiSchema: UISchemaElement;
210
+ }
211
+ /**
212
+ * Sets the display label for a field.
213
+ *
214
+ * @param text - The label text to display
215
+ * @example
216
+ * ```typescript
217
+ * @Label("Email Address")
218
+ * email!: string;
219
+ * ```
220
+ */
221
+ export declare function Label(text: string): PropertyDecorator;
222
+ /**
223
+ * Sets placeholder text for input fields.
224
+ *
225
+ * @param text - The placeholder text
226
+ * @example
227
+ * ```typescript
228
+ * @Placeholder("Enter your email...")
229
+ * email!: string;
230
+ * ```
231
+ */
232
+ export declare function Placeholder(text: string): PropertyDecorator;
233
+ /**
234
+ * Sets a description or help text for a field.
235
+ *
236
+ * @param text - The description text
237
+ * @example
238
+ * ```typescript
239
+ * @Description("We'll never share your email with anyone")
240
+ * email!: string;
241
+ * ```
242
+ */
243
+ export declare function Description(text: string): PropertyDecorator;
244
+ /**
245
+ * Sets the minimum allowed value for a numeric field.
246
+ *
247
+ * @param value - The minimum value
248
+ * @example
249
+ * ```typescript
250
+ * @Min(0)
251
+ * quantity!: number;
252
+ * ```
253
+ */
254
+ export declare function Min(value: number): PropertyDecorator;
255
+ /**
256
+ * Sets the maximum allowed value for a numeric field.
257
+ *
258
+ * @param value - The maximum value
259
+ * @example
260
+ * ```typescript
261
+ * @Max(100)
262
+ * percentage!: number;
263
+ * ```
264
+ */
265
+ export declare function Max(value: number): PropertyDecorator;
266
+ /**
267
+ * Sets the step increment for a numeric field.
268
+ *
269
+ * @param value - The step value
270
+ * @example
271
+ * ```typescript
272
+ * @Step(0.01)
273
+ * price!: number;
274
+ * ```
275
+ */
276
+ export declare function Step(value: number): PropertyDecorator;
277
+ /**
278
+ * Sets the minimum length for a string field.
279
+ *
280
+ * @param value - The minimum character count
281
+ * @example
282
+ * ```typescript
283
+ * @MinLength(1)
284
+ * name!: string;
285
+ * ```
286
+ */
287
+ export declare function MinLength(value: number): PropertyDecorator;
288
+ /**
289
+ * Sets the maximum length for a string field.
290
+ *
291
+ * @param value - The maximum character count
292
+ * @example
293
+ * ```typescript
294
+ * @MaxLength(255)
295
+ * bio!: string;
296
+ * ```
297
+ */
298
+ export declare function MaxLength(value: number): PropertyDecorator;
299
+ /**
300
+ * Sets a regex pattern for string validation.
301
+ *
302
+ * @param regex - The regex pattern as a string
303
+ * @example
304
+ * ```typescript
305
+ * @Pattern("^[a-z]+$")
306
+ * username!: string;
307
+ * ```
308
+ */
309
+ export declare function Pattern(regex: string): PropertyDecorator;
310
+ /**
311
+ * Sets the minimum number of items for an array field.
312
+ *
313
+ * @param value - The minimum item count
314
+ * @example
315
+ * ```typescript
316
+ * @MinItems(1)
317
+ * tags!: string[];
318
+ * ```
319
+ */
320
+ export declare function MinItems(value: number): PropertyDecorator;
321
+ /**
322
+ * Sets the maximum number of items for an array field.
323
+ *
324
+ * @param value - The maximum item count
325
+ * @example
326
+ * ```typescript
327
+ * @MaxItems(10)
328
+ * tags!: string[];
329
+ * ```
330
+ */
331
+ export declare function MaxItems(value: number): PropertyDecorator;
332
+ /**
333
+ * Provides custom options for enum fields with labels.
334
+ *
335
+ * Use this to provide human-readable labels for enum values,
336
+ * or to customize the order and display of options.
337
+ *
338
+ * @param options - Array of option values or {id, label} objects
339
+ * @example
340
+ * ```typescript
341
+ * @EnumOptions([
342
+ * { id: "us", label: "United States" },
343
+ * { id: "ca", label: "Canada" },
344
+ * { id: "uk", label: "United Kingdom" }
345
+ * ])
346
+ * country!: "us" | "ca" | "uk";
347
+ * ```
348
+ */
349
+ export declare function EnumOptions(options: EnumOptionValue[]): PropertyDecorator;
350
+ /**
351
+ * Makes a field conditionally visible based on another field's value.
352
+ *
353
+ * @param condition - Object specifying the field and value to match
354
+ * @example
355
+ * ```typescript
356
+ * @ShowWhen({ field: "contactMethod", value: "email" })
357
+ * emailAddress!: string;
358
+ *
359
+ * @ShowWhen({ field: "contactMethod", value: "phone" })
360
+ * phoneNumber!: string;
361
+ * ```
362
+ */
363
+ export declare function ShowWhen(condition: ShowWhenCondition): PropertyDecorator;
364
+ /**
365
+ * Groups fields together under a named section.
366
+ *
367
+ * @param name - The group name
368
+ * @example
369
+ * ```typescript
370
+ * @Group("Personal Information")
371
+ * @Label("First Name")
372
+ * firstName!: string;
373
+ *
374
+ * @Group("Personal Information")
375
+ * @Label("Last Name")
376
+ * lastName!: string;
377
+ *
378
+ * @Group("Contact Details")
379
+ * @Label("Email")
380
+ * email!: string;
381
+ * ```
382
+ */
383
+ export declare function Group(name: string): PropertyDecorator;
384
+ /**
385
+ * Generates a UI Schema from a decorated class at runtime.
386
+ *
387
+ * **Requirements:**
388
+ * - Run `formspec codegen` to generate type metadata for the class
389
+ * - Decorators must be applied to store field metadata
390
+ *
391
+ * @param ctor - The class constructor
392
+ * @returns FormSpec output with elements array
393
+ *
394
+ * @example
395
+ * ```typescript
396
+ * import { Label, toFormSpec } from '@formspec/decorators';
397
+ *
398
+ * class MyForm {
399
+ * @Label("Name")
400
+ * name!: string;
401
+ *
402
+ * @Label("Country")
403
+ * country!: "us" | "ca";
404
+ * }
405
+ *
406
+ * const spec = toFormSpec(MyForm);
407
+ * // { elements: [{ _field: "text", id: "name", label: "Name", required: true }, ...] }
408
+ * ```
409
+ */
410
+ export declare function toFormSpec<T extends new (...args: any[]) => any>(ctor: T): FormSpecOutput;
411
+ /**
412
+ * Gets the raw decorator metadata for a class.
413
+ *
414
+ * Useful for debugging or custom processing.
415
+ *
416
+ * @param ctor - The class constructor
417
+ * @returns Map of field names to decorator metadata
418
+ */
419
+ export declare function getDecoratorMetadata<T extends new (...args: any[]) => any>(ctor: T): Map<string, FieldDecoratorMetadata>;
420
+ /**
421
+ * Gets the raw type metadata for a class.
422
+ *
423
+ * Useful for debugging or custom processing.
424
+ *
425
+ * @param ctor - The class constructor
426
+ * @returns Record of field names to type metadata, or empty object if not transformed
427
+ */
428
+ export declare function getTypeMetadata<T extends new (...args: any[]) => any>(ctor: T): Record<string, TypeMetadata>;
429
+ /**
430
+ * Builds both JSON Schema and UI Schema from a decorated class at runtime.
431
+ *
432
+ * This function provides the same API as `buildFormSchemas` from `@formspec/build`,
433
+ * allowing consistent usage across both Chain DSL and Decorator DSL.
434
+ *
435
+ * **Requirements:**
436
+ * - Run `formspec codegen` to generate type metadata for the class
437
+ * - Decorators must be applied to store field metadata
438
+ *
439
+ * @param ctor - The class constructor
440
+ * @returns Object containing both jsonSchema and uiSchema
441
+ *
442
+ * @example
443
+ * ```typescript
444
+ * import { Label, buildFormSchemas } from '@formspec/decorators';
445
+ *
446
+ * class MyForm {
447
+ * @Label("Name")
448
+ * name!: string;
449
+ *
450
+ * @Label("Country")
451
+ * country!: "us" | "ca";
452
+ * }
453
+ *
454
+ * // After running: formspec codegen ./forms.ts -o ./__formspec_types__.ts
455
+ * // And importing: import './__formspec_types__';
456
+ *
457
+ * const { jsonSchema, uiSchema } = buildFormSchemas(MyForm);
458
+ * // jsonSchema: { $schema: "...", type: "object", properties: {...}, required: [...] }
459
+ * // uiSchema: { type: "VerticalLayout", elements: [...] }
460
+ * ```
461
+ */
462
+ export declare function buildFormSchemas<T extends new (...args: any[]) => any>(ctor: T): BuildResult;
463
+ export {};
464
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}