@formspec/build 0.1.0-alpha.15 → 0.1.0-alpha.16

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.
Files changed (42) hide show
  1. package/dist/__tests__/fixtures/edge-cases.d.ts +11 -0
  2. package/dist/__tests__/fixtures/edge-cases.d.ts.map +1 -1
  3. package/dist/__tests__/fixtures/mixed-authoring-shipping-address.d.ts +30 -0
  4. package/dist/__tests__/fixtures/mixed-authoring-shipping-address.d.ts.map +1 -0
  5. package/dist/__tests__/mixed-authoring.test.d.ts +2 -0
  6. package/dist/__tests__/mixed-authoring.test.d.ts.map +1 -0
  7. package/dist/__tests__/parity/utils.d.ts +5 -3
  8. package/dist/__tests__/parity/utils.d.ts.map +1 -1
  9. package/dist/analyzer/class-analyzer.d.ts +4 -2
  10. package/dist/analyzer/class-analyzer.d.ts.map +1 -1
  11. package/dist/analyzer/tsdoc-parser.d.ts +20 -2
  12. package/dist/analyzer/tsdoc-parser.d.ts.map +1 -1
  13. package/dist/browser.cjs +172 -17
  14. package/dist/browser.cjs.map +1 -1
  15. package/dist/browser.d.ts.map +1 -1
  16. package/dist/browser.js +172 -17
  17. package/dist/browser.js.map +1 -1
  18. package/dist/build.d.ts +39 -1
  19. package/dist/canonicalize/tsdoc-canonicalizer.d.ts.map +1 -1
  20. package/dist/cli.cjs +634 -88
  21. package/dist/cli.cjs.map +1 -1
  22. package/dist/cli.js +634 -88
  23. package/dist/cli.js.map +1 -1
  24. package/dist/generators/mixed-authoring.d.ts +45 -0
  25. package/dist/generators/mixed-authoring.d.ts.map +1 -0
  26. package/dist/index.cjs +622 -87
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +621 -87
  31. package/dist/index.js.map +1 -1
  32. package/dist/internals.cjs +526 -91
  33. package/dist/internals.cjs.map +1 -1
  34. package/dist/internals.js +526 -91
  35. package/dist/internals.js.map +1 -1
  36. package/dist/json-schema/ir-generator.d.ts +3 -2
  37. package/dist/json-schema/ir-generator.d.ts.map +1 -1
  38. package/dist/ui-schema/ir-generator.d.ts.map +1 -1
  39. package/dist/validate/constraint-validator.d.ts.map +1 -1
  40. package/package.json +3 -3
  41. package/dist/__tests__/jsdoc-constraints.test.d.ts +0 -9
  42. package/dist/__tests__/jsdoc-constraints.test.d.ts.map +0 -1
@@ -53,12 +53,23 @@ export declare class ArrayEdgeCases {
53
53
  export interface SelfRefRecord {
54
54
  [key: string]: SelfRefRecord;
55
55
  }
56
+ export interface StringMap {
57
+ [key: string]: string;
58
+ }
59
+ /**
60
+ * Various object type patterns.
61
+ */
62
+ export declare class CircularNode {
63
+ id: string;
64
+ next?: CircularNode;
65
+ }
56
66
  /**
57
67
  * Various object type patterns.
58
68
  */
59
69
  export declare class ObjectEdgeCases {
60
70
  emptyObject: {};
61
71
  stringRecord: Record<string, string>;
72
+ namedStringMap: StringMap;
62
73
  selfRefRecord: SelfRefRecord;
63
74
  deepNested: {
64
75
  level1: {
@@ -1 +1 @@
1
- {"version":3,"file":"edge-cases.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/edge-cases.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edge-cases.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/edge-cases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Static shipping-address model for mixed-authoring composition tests.
3
+ */
4
+ export declare class ShippingAddressModel {
5
+ /** @displayName Country */
6
+ country: string;
7
+ /** @displayName City */
8
+ city: string;
9
+ /** @displayName Postal Code */
10
+ postalCode?: string;
11
+ }
12
+ /**
13
+ * ChainDSL overlay for the runtime-backed city field.
14
+ */
15
+ export declare const shippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").DynamicEnumField<"city", "cities">]>;
16
+ export declare class NumericShippingAddressModel {
17
+ cityCode: number;
18
+ }
19
+ export declare const incompatibleShippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").DynamicEnumField<"cityCode", "cities">]>;
20
+ export declare class NestedShippingAddressModel {
21
+ address: {
22
+ city: string;
23
+ };
24
+ }
25
+ export declare const nestedShippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").ObjectField<"address", readonly [import("@formspec/core").DynamicEnumField<"city", "cities">]>]>;
26
+ export declare const duplicateShippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").DynamicEnumField<"city", "cities">, import("@formspec/core").DynamicEnumField<"city", "backup-cities">]>;
27
+ export declare const unknownShippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").DynamicEnumField<"region", "regions">]>;
28
+ export declare const constrainedShippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").TextField<"city">]>;
29
+ export declare const requiredShippingAddressOverlays: import("@formspec/core").FormSpec<readonly [import("@formspec/core").TextField<"postalCode">]>;
30
+ //# sourceMappingURL=mixed-authoring-shipping-address.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mixed-authoring-shipping-address.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/mixed-authoring-shipping-address.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,2BAA2B;IAC3B,OAAO,EAAG,MAAM,CAAC;IAEjB,wBAAwB;IACxB,IAAI,EAAG,MAAM,CAAC;IAEd,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,2GAInC,CAAC;AAEF,qBAAa,2BAA2B;IACtC,QAAQ,EAAG,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,mCAAmC,+GAE/C,CAAC;AAEF,qBAAa,0BAA0B;IACrC,OAAO,EAAG;QACR,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,eAAO,MAAM,6BAA6B,uKAEzC,CAAC;AAEF,eAAO,MAAM,gCAAgC,+KAG5C,CAAC;AAEF,eAAO,MAAM,8BAA8B,8GAAmD,CAAC;AAE/F,eAAO,MAAM,kCAAkC,0FAE9C,CAAC;AAEF,eAAO,MAAM,+BAA+B,gGAE3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mixed-authoring.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mixed-authoring.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mixed-authoring.test.ts"],"names":[],"mappings":""}
@@ -11,7 +11,7 @@
11
11
  * guarantees intact: if an IR node gains or loses a field, the provenance-free variants
12
12
  * here will fail to compile, catching shape regressions at type-check time.
13
13
  */
14
- import type { FormIR, FormIRElement, PrimitiveTypeNode, EnumMember, DynamicTypeNode, CustomTypeNode, NumericConstraintNode, LengthConstraintNode, PatternConstraintNode, ArrayCardinalityConstraintNode, EnumMemberConstraintNode, CustomConstraintNode, DisplayNameAnnotationNode, DescriptionAnnotationNode, PlaceholderAnnotationNode, DefaultValueAnnotationNode, DeprecatedAnnotationNode, FormatHintAnnotationNode, CustomAnnotationNode, JsonValue } from "@formspec/core";
14
+ import type { FormIR, FormIRElement, PrimitiveTypeNode, EnumMember, DynamicTypeNode, CustomTypeNode, NumericConstraintNode, LengthConstraintNode, PatternConstraintNode, ArrayCardinalityConstraintNode, EnumMemberConstraintNode, ConstConstraintNode, CustomConstraintNode, DisplayNameAnnotationNode, DescriptionAnnotationNode, FormatAnnotationNode, PlaceholderAnnotationNode, DefaultValueAnnotationNode, DeprecatedAnnotationNode, FormatHintAnnotationNode, CustomAnnotationNode, JsonValue } from "@formspec/core";
15
15
  /** Primitive type node has no `provenance` field — pass through unchanged. */
16
16
  export type ProvenanceFreePrimitiveTypeNode = PrimitiveTypeNode;
17
17
  /** Enum member has no `provenance` field. */
@@ -67,16 +67,18 @@ export type ProvenanceFreeLengthConstraintNode = Omit<LengthConstraintNode, "pro
67
67
  export type ProvenanceFreePatternConstraintNode = Omit<PatternConstraintNode, "provenance">;
68
68
  export type ProvenanceFreeArrayCardinalityConstraintNode = Omit<ArrayCardinalityConstraintNode, "provenance">;
69
69
  export type ProvenanceFreeEnumMemberConstraintNode = Omit<EnumMemberConstraintNode, "provenance">;
70
+ export type ProvenanceFreeConstConstraintNode = Omit<ConstConstraintNode, "provenance">;
70
71
  export type ProvenanceFreeCustomConstraintNode = Omit<CustomConstraintNode, "provenance">;
71
- export type ProvenanceFreeConstraintNode = ProvenanceFreeNumericConstraintNode | ProvenanceFreeLengthConstraintNode | ProvenanceFreePatternConstraintNode | ProvenanceFreeArrayCardinalityConstraintNode | ProvenanceFreeEnumMemberConstraintNode | ProvenanceFreeCustomConstraintNode;
72
+ export type ProvenanceFreeConstraintNode = ProvenanceFreeNumericConstraintNode | ProvenanceFreeLengthConstraintNode | ProvenanceFreePatternConstraintNode | ProvenanceFreeArrayCardinalityConstraintNode | ProvenanceFreeEnumMemberConstraintNode | ProvenanceFreeConstConstraintNode | ProvenanceFreeCustomConstraintNode;
72
73
  export type ProvenanceFreeDisplayNameAnnotationNode = Omit<DisplayNameAnnotationNode, "provenance">;
73
74
  export type ProvenanceFreeDescriptionAnnotationNode = Omit<DescriptionAnnotationNode, "provenance">;
75
+ export type ProvenanceFreeFormatAnnotationNode = Omit<FormatAnnotationNode, "provenance">;
74
76
  export type ProvenanceFreePlaceholderAnnotationNode = Omit<PlaceholderAnnotationNode, "provenance">;
75
77
  export type ProvenanceFreeDefaultValueAnnotationNode = Omit<DefaultValueAnnotationNode, "provenance">;
76
78
  export type ProvenanceFreeDeprecatedAnnotationNode = Omit<DeprecatedAnnotationNode, "provenance">;
77
79
  export type ProvenanceFreeFormatHintAnnotationNode = Omit<FormatHintAnnotationNode, "provenance">;
78
80
  export type ProvenanceFreeCustomAnnotationNode = Omit<CustomAnnotationNode, "provenance">;
79
- export type ProvenanceFreeAnnotationNode = ProvenanceFreeDisplayNameAnnotationNode | ProvenanceFreeDescriptionAnnotationNode | ProvenanceFreePlaceholderAnnotationNode | ProvenanceFreeDefaultValueAnnotationNode | ProvenanceFreeDeprecatedAnnotationNode | ProvenanceFreeFormatHintAnnotationNode | ProvenanceFreeCustomAnnotationNode;
81
+ export type ProvenanceFreeAnnotationNode = ProvenanceFreeDisplayNameAnnotationNode | ProvenanceFreeDescriptionAnnotationNode | ProvenanceFreeFormatAnnotationNode | ProvenanceFreePlaceholderAnnotationNode | ProvenanceFreeDefaultValueAnnotationNode | ProvenanceFreeDeprecatedAnnotationNode | ProvenanceFreeFormatHintAnnotationNode | ProvenanceFreeCustomAnnotationNode;
80
82
  /** Field node with `provenance` and `mergeHistory` stripped; nested structures recursively mapped. */
81
83
  export interface ProvenanceFreeFieldNode {
82
84
  readonly kind: "field";
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/__tests__/parity/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/__tests__/parity/utils.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  * All downstream generation routes through the canonical FormIR.
7
7
  */
8
8
  import * as ts from "typescript";
9
- import type { FieldNode, TypeNode, TypeDefinition, JsonValue } from "@formspec/core";
9
+ import type { FieldNode, TypeNode, AnnotationNode, TypeDefinition, JsonValue } from "@formspec/core";
10
10
  /**
11
11
  * Layout metadata extracted from `@Group` and `@ShowWhen` TSDoc tags.
12
12
  * One entry per field, in the same order as `fields`.
@@ -32,6 +32,8 @@ export interface IRClassAnalysis {
32
32
  readonly fieldLayouts: readonly FieldLayoutMetadata[];
33
33
  /** Named type definitions referenced by fields */
34
34
  readonly typeRegistry: Record<string, TypeDefinition>;
35
+ /** Root-level metadata for the analyzed declaration. */
36
+ readonly annotations?: readonly AnnotationNode[];
35
37
  /** Instance methods (retained for downstream method-schema generation) */
36
38
  readonly instanceMethods: readonly MethodInfo[];
37
39
  /** Static methods */
@@ -62,7 +64,7 @@ export declare function analyzeTypeAliasToIR(typeAlias: ts.TypeAliasDeclaration,
62
64
  /**
63
65
  * Resolves a TypeScript type to a canonical IR TypeNode.
64
66
  */
65
- export declare function resolveTypeNode(type: ts.Type, checker: ts.TypeChecker, file: string, typeRegistry: Record<string, TypeDefinition>, visiting: Set<ts.Type>): TypeNode;
67
+ export declare function resolveTypeNode(type: ts.Type, checker: ts.TypeChecker, file: string, typeRegistry: Record<string, TypeDefinition>, visiting: Set<ts.Type>, sourceNode?: ts.Node): TypeNode;
66
68
  /**
67
69
  * Analyzed method information.
68
70
  */
@@ -1 +1 @@
1
- {"version":3,"file":"class-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/class-analyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"class-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/class-analyzer.ts"],"names":[],"mappings":"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"}
@@ -10,11 +10,11 @@
10
10
  * 1. **Constraint tags** (all alphanumeric, TSDoc-compliant):
11
11
  * `@minimum`, `@maximum`, `@exclusiveMinimum`, `@exclusiveMaximum`,
12
12
  * `@multipleOf`, `@minLength`, `@maxLength`, `@minItems`, `@maxItems`,
13
- * `@pattern`, `@enumOptions`
13
+ * `@uniqueItems`, `@pattern`, `@enumOptions`, `@const`
14
14
  * — Parsed via TSDocParser as custom block tags.
15
15
  * Both camelCase and PascalCase forms are accepted (e.g., `@Minimum`).
16
16
  *
17
- * 2. **Annotation tags** (`@displayName`, `@description`):
17
+ * 2. **Annotation tags** (`@displayName`, `@description`, `@format`, `@placeholder`):
18
18
  * These are parsed as structured custom block tags and mapped directly
19
19
  * onto annotation IR nodes.
20
20
  *
@@ -38,6 +38,17 @@ export interface TSDocParseResult {
38
38
  /** Annotation IR nodes extracted from canonical TSDoc block tags. */
39
39
  readonly annotations: readonly AnnotationNode[];
40
40
  }
41
+ /**
42
+ * Display-name metadata extracted from a node's JSDoc tags.
43
+ *
44
+ * The root display name is returned separately from member-target labels so
45
+ * callers can apply the former to the enclosing type/form and the latter to
46
+ * enum members.
47
+ */
48
+ export interface DisplayNameMetadata {
49
+ readonly displayName?: string;
50
+ readonly memberDisplayNames: ReadonlyMap<string, string>;
51
+ }
41
52
  /**
42
53
  * Parses the JSDoc comment attached to a TypeScript AST node using the
43
54
  * official TSDoc parser and returns canonical IR constraint and annotation
@@ -58,6 +69,13 @@ export declare function parseTSDocTags(node: ts.Node, file?: string): TSDocParse
58
69
  * Falls back to the TS compiler API for nodes without doc comments.
59
70
  */
60
71
  export declare function hasDeprecatedTagTSDoc(node: ts.Node): boolean;
72
+ /**
73
+ * Extracts root and member-target display-name metadata from a node's JSDoc tags.
74
+ *
75
+ * Member-target display-name tags use the syntax `@displayName :member Label`.
76
+ * The first non-target `@displayName` is returned as the root display name.
77
+ */
78
+ export declare function extractDisplayNameMetadata(node: ts.Node): DisplayNameMetadata;
61
79
  /**
62
80
  * Extracts a path-target prefix (`:fieldName`) from constraint tag text.
63
81
  * Returns the parsed PathTarget and remaining text, or null if no path target.
@@ -1 +1 @@
1
- {"version":3,"file":"tsdoc-parser.d.ts","sourceRoot":"","sources":["../../src/analyzer/tsdoc-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAYjC,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,cAAc,EAInB,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AAwFxB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;IAChD,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;CACjD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,SAAK,GAAG,gBAAgB,CAkGzE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAsB5D;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQpD"}
1
+ {"version":3,"file":"tsdoc-parser.d.ts","sourceRoot":"","sources":["../../src/analyzer/tsdoc-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAYjC,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,cAAc,EAInB,KAAK,UAAU,EAEhB,MAAM,gBAAgB,CAAC;AAyFxB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;IAChD,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;CACjD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,SAAK,GAAG,gBAAgB,CAiKzE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAsB5D;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,mBAAmB,CA2B7E;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQpD"}
package/dist/browser.cjs CHANGED
@@ -380,6 +380,9 @@ function generateJsonSchemaFromIR(ir, options) {
380
380
  const ctx = makeContext(options);
381
381
  for (const [name, typeDef] of Object.entries(ir.typeRegistry)) {
382
382
  ctx.defs[name] = generateTypeNode(typeDef.type, ctx);
383
+ if (typeDef.annotations && typeDef.annotations.length > 0) {
384
+ applyAnnotations(ctx.defs[name], typeDef.annotations, ctx);
385
+ }
383
386
  }
384
387
  const properties = {};
385
388
  const required = [];
@@ -391,6 +394,9 @@ function generateJsonSchemaFromIR(ir, options) {
391
394
  properties,
392
395
  ...uniqueRequired.length > 0 && { required: uniqueRequired }
393
396
  };
397
+ if (ir.annotations && ir.annotations.length > 0) {
398
+ applyAnnotations(result, ir.annotations, ctx);
399
+ }
394
400
  if (Object.keys(ctx.defs).length > 0) {
395
401
  result.$defs = ctx.defs;
396
402
  }
@@ -420,22 +426,51 @@ function collectFields(elements, properties, required, ctx) {
420
426
  }
421
427
  function generateFieldSchema(field, ctx) {
422
428
  const schema = generateTypeNode(field.type, ctx);
429
+ const itemStringSchema = schema.type === "array" && schema.items?.type === "string" ? schema.items : void 0;
423
430
  const directConstraints = [];
431
+ const itemConstraints = [];
424
432
  const pathConstraints = [];
425
433
  for (const c of field.constraints) {
426
434
  if (c.path) {
427
435
  pathConstraints.push(c);
436
+ } else if (itemStringSchema !== void 0 && isStringItemConstraint(c)) {
437
+ itemConstraints.push(c);
428
438
  } else {
429
439
  directConstraints.push(c);
430
440
  }
431
441
  }
432
442
  applyConstraints(schema, directConstraints, ctx);
433
- applyAnnotations(schema, field.annotations, ctx);
443
+ if (itemStringSchema !== void 0) {
444
+ applyConstraints(itemStringSchema, itemConstraints, ctx);
445
+ }
446
+ const rootAnnotations = [];
447
+ const itemAnnotations = [];
448
+ for (const annotation of field.annotations) {
449
+ if (itemStringSchema !== void 0 && annotation.annotationKind === "format") {
450
+ itemAnnotations.push(annotation);
451
+ } else {
452
+ rootAnnotations.push(annotation);
453
+ }
454
+ }
455
+ applyAnnotations(schema, rootAnnotations, ctx);
456
+ if (itemStringSchema !== void 0) {
457
+ applyAnnotations(itemStringSchema, itemAnnotations, ctx);
458
+ }
434
459
  if (pathConstraints.length === 0) {
435
460
  return schema;
436
461
  }
437
462
  return applyPathTargetedConstraints(schema, pathConstraints, ctx);
438
463
  }
464
+ function isStringItemConstraint(constraint) {
465
+ switch (constraint.constraintKind) {
466
+ case "minLength":
467
+ case "maxLength":
468
+ case "pattern":
469
+ return true;
470
+ default:
471
+ return false;
472
+ }
473
+ }
439
474
  function applyPathTargetedConstraints(schema, pathConstraints, ctx) {
440
475
  if (schema.type === "array" && schema.items) {
441
476
  schema.items = applyPathTargetedConstraints(schema.items, pathConstraints, ctx);
@@ -653,6 +688,9 @@ function applyConstraints(schema, constraints, ctx) {
653
688
  case "uniqueItems":
654
689
  schema.uniqueItems = constraint.value;
655
690
  break;
691
+ case "const":
692
+ schema.const = constraint.value;
693
+ break;
656
694
  case "allowedMembers":
657
695
  break;
658
696
  case "custom":
@@ -677,8 +715,14 @@ function applyAnnotations(schema, annotations, ctx) {
677
715
  case "defaultValue":
678
716
  schema.default = annotation.value;
679
717
  break;
718
+ case "format":
719
+ schema.format = annotation.value;
720
+ break;
680
721
  case "deprecated":
681
722
  schema.deprecated = true;
723
+ if (annotation.message !== void 0 && annotation.message !== "") {
724
+ schema["x-formspec-deprecation-description"] = annotation.message;
725
+ }
682
726
  break;
683
727
  case "placeholder":
684
728
  break;
@@ -866,25 +910,31 @@ function createShowRule(fieldName, value) {
866
910
  }
867
911
  };
868
912
  }
913
+ function flattenConditionSchema(scope, schema) {
914
+ if (schema.allOf === void 0) {
915
+ if (scope === "#") {
916
+ return [schema];
917
+ }
918
+ const fieldName = scope.replace("#/properties/", "");
919
+ return [
920
+ {
921
+ properties: {
922
+ [fieldName]: schema
923
+ }
924
+ }
925
+ ];
926
+ }
927
+ return schema.allOf.flatMap((member) => flattenConditionSchema(scope, member));
928
+ }
869
929
  function combineRules(parentRule, childRule) {
870
- const parentCondition = parentRule.condition;
871
- const childCondition = childRule.condition;
872
930
  return {
873
931
  effect: "SHOW",
874
932
  condition: {
875
933
  scope: "#",
876
934
  schema: {
877
935
  allOf: [
878
- {
879
- properties: {
880
- [parentCondition.scope.replace("#/properties/", "")]: parentCondition.schema
881
- }
882
- },
883
- {
884
- properties: {
885
- [childCondition.scope.replace("#/properties/", "")]: childCondition.schema
886
- }
887
- }
936
+ ...flattenConditionSchema(parentRule.condition.scope, parentRule.condition.schema),
937
+ ...flattenConditionSchema(childRule.condition.scope, childRule.condition.schema)
888
938
  ]
889
939
  }
890
940
  }
@@ -892,10 +942,14 @@ function combineRules(parentRule, childRule) {
892
942
  }
893
943
  function fieldNodeToControl(field, parentRule) {
894
944
  const displayNameAnnotation = field.annotations.find((a) => a.annotationKind === "displayName");
945
+ const placeholderAnnotation = field.annotations.find((a) => a.annotationKind === "placeholder");
895
946
  const control = {
896
947
  type: "Control",
897
948
  scope: fieldToScope(field.name),
898
949
  ...displayNameAnnotation !== void 0 && { label: displayNameAnnotation.value },
950
+ ...placeholderAnnotation !== void 0 && {
951
+ options: { placeholder: placeholderAnnotation.value }
952
+ },
899
953
  ...parentRule !== void 0 && { rule: parentRule }
900
954
  };
901
955
  return control;
@@ -1090,6 +1144,15 @@ function addUnknownExtension(ctx, message, primary) {
1090
1144
  relatedLocations: []
1091
1145
  });
1092
1146
  }
1147
+ function addUnknownPathTarget(ctx, message, primary) {
1148
+ ctx.diagnostics.push({
1149
+ code: "UNKNOWN_PATH_TARGET",
1150
+ message,
1151
+ severity: "error",
1152
+ primaryLocation: primary,
1153
+ relatedLocations: []
1154
+ });
1155
+ }
1093
1156
  function addConstraintBroadening(ctx, message, primary, related) {
1094
1157
  ctx.diagnostics.push({
1095
1158
  code: "CONSTRAINT_BROADENING",
@@ -1110,6 +1173,45 @@ function findAllowedMembers(constraints) {
1110
1173
  (c) => c.constraintKind === "allowedMembers"
1111
1174
  );
1112
1175
  }
1176
+ function findConstConstraints(constraints) {
1177
+ return constraints.filter(
1178
+ (c) => c.constraintKind === "const"
1179
+ );
1180
+ }
1181
+ function jsonValueEquals(left, right) {
1182
+ if (left === right) {
1183
+ return true;
1184
+ }
1185
+ if (Array.isArray(left) || Array.isArray(right)) {
1186
+ if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length) {
1187
+ return false;
1188
+ }
1189
+ return left.every((item, index) => jsonValueEquals(item, right[index]));
1190
+ }
1191
+ if (isJsonObject(left) || isJsonObject(right)) {
1192
+ if (!isJsonObject(left) || !isJsonObject(right)) {
1193
+ return false;
1194
+ }
1195
+ const leftKeys = Object.keys(left).sort();
1196
+ const rightKeys = Object.keys(right).sort();
1197
+ if (leftKeys.length !== rightKeys.length) {
1198
+ return false;
1199
+ }
1200
+ return leftKeys.every((key, index) => {
1201
+ const rightKey = rightKeys[index];
1202
+ if (rightKey !== key) {
1203
+ return false;
1204
+ }
1205
+ const leftValue = left[key];
1206
+ const rightValue = right[rightKey];
1207
+ return leftValue !== void 0 && rightValue !== void 0 && jsonValueEquals(leftValue, rightValue);
1208
+ });
1209
+ }
1210
+ return false;
1211
+ }
1212
+ function isJsonObject(value) {
1213
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1214
+ }
1113
1215
  function isOrderedBoundConstraint(constraint) {
1114
1216
  return constraint.constraintKind === "minimum" || constraint.constraintKind === "exclusiveMinimum" || constraint.constraintKind === "minLength" || constraint.constraintKind === "minItems" || constraint.constraintKind === "maximum" || constraint.constraintKind === "exclusiveMaximum" || constraint.constraintKind === "maxLength" || constraint.constraintKind === "maxItems";
1115
1217
  }
@@ -1316,6 +1418,25 @@ function checkAllowedMembersContradiction(ctx, fieldName, constraints) {
1316
1418
  }
1317
1419
  }
1318
1420
  }
1421
+ function checkConstContradictions(ctx, fieldName, constraints) {
1422
+ const constConstraints = findConstConstraints(constraints);
1423
+ if (constConstraints.length < 2) return;
1424
+ const first = constConstraints[0];
1425
+ if (first === void 0) return;
1426
+ for (let i = 1; i < constConstraints.length; i++) {
1427
+ const current = constConstraints[i];
1428
+ if (current === void 0) continue;
1429
+ if (jsonValueEquals(first.value, current.value)) {
1430
+ continue;
1431
+ }
1432
+ addContradiction(
1433
+ ctx,
1434
+ `Field "${fieldName}": conflicting @const constraints require both ${JSON.stringify(first.value)} and ${JSON.stringify(current.value)}`,
1435
+ first.provenance,
1436
+ current.provenance
1437
+ );
1438
+ }
1439
+ }
1319
1440
  function typeLabel(type) {
1320
1441
  switch (type.kind) {
1321
1442
  case "primitive":
@@ -1388,6 +1509,8 @@ function checkConstraintOnType(ctx, fieldName, type, constraint) {
1388
1509
  const isString = effectiveType.kind === "primitive" && effectiveType.primitiveKind === "string";
1389
1510
  const isArray = effectiveType.kind === "array";
1390
1511
  const isEnum = effectiveType.kind === "enum";
1512
+ const arrayItemType = effectiveType.kind === "array" ? dereferenceType(ctx, effectiveType.items) : void 0;
1513
+ const isStringArray = arrayItemType?.kind === "primitive" && arrayItemType.primitiveKind === "string";
1391
1514
  const label = typeLabel(effectiveType);
1392
1515
  const ck = constraint.constraintKind;
1393
1516
  switch (ck) {
@@ -1408,10 +1531,10 @@ function checkConstraintOnType(ctx, fieldName, type, constraint) {
1408
1531
  case "minLength":
1409
1532
  case "maxLength":
1410
1533
  case "pattern": {
1411
- if (!isString) {
1534
+ if (!isString && !isStringArray) {
1412
1535
  addTypeMismatch(
1413
1536
  ctx,
1414
- `Field "${fieldName}": constraint "${ck}" is only valid on string fields, but field type is "${label}"`,
1537
+ `Field "${fieldName}": constraint "${ck}" is only valid on string fields or string array items, but field type is "${label}"`,
1415
1538
  constraint.provenance
1416
1539
  );
1417
1540
  }
@@ -1439,6 +1562,37 @@ function checkConstraintOnType(ctx, fieldName, type, constraint) {
1439
1562
  }
1440
1563
  break;
1441
1564
  }
1565
+ case "const": {
1566
+ const isPrimitiveConstType = effectiveType.kind === "primitive" && ["string", "number", "boolean", "null"].includes(effectiveType.primitiveKind) || effectiveType.kind === "enum";
1567
+ if (!isPrimitiveConstType) {
1568
+ addTypeMismatch(
1569
+ ctx,
1570
+ `Field "${fieldName}": constraint "const" is only valid on primitive or enum fields, but field type is "${label}"`,
1571
+ constraint.provenance
1572
+ );
1573
+ break;
1574
+ }
1575
+ if (effectiveType.kind === "primitive") {
1576
+ const valueType = constraint.value === null ? "null" : Array.isArray(constraint.value) ? "array" : typeof constraint.value;
1577
+ if (valueType !== effectiveType.primitiveKind) {
1578
+ addTypeMismatch(
1579
+ ctx,
1580
+ `Field "${fieldName}": @const value type "${valueType}" is incompatible with field type "${effectiveType.primitiveKind}"`,
1581
+ constraint.provenance
1582
+ );
1583
+ }
1584
+ break;
1585
+ }
1586
+ const memberValues = effectiveType.members.map((member) => member.value);
1587
+ if (!memberValues.some((member) => jsonValueEquals(member, constraint.value))) {
1588
+ addTypeMismatch(
1589
+ ctx,
1590
+ `Field "${fieldName}": @const value ${JSON.stringify(constraint.value)} is not one of the enum members`,
1591
+ constraint.provenance
1592
+ );
1593
+ }
1594
+ break;
1595
+ }
1442
1596
  case "custom": {
1443
1597
  checkCustomConstraint(ctx, fieldName, effectiveType, constraint);
1444
1598
  break;
@@ -1457,9 +1611,9 @@ function checkTypeApplicability(ctx, fieldName, type, constraints) {
1457
1611
  const resolution = resolvePathTargetType(ctx, type, constraint.path.segments);
1458
1612
  const targetFieldName = formatPathTargetFieldName(fieldName, constraint.path.segments);
1459
1613
  if (resolution.kind === "missing-property") {
1460
- addTypeMismatch(
1614
+ addUnknownPathTarget(
1461
1615
  ctx,
1462
- `Field "${fieldName}": path-targeted constraint "${constraint.constraintKind}" references unknown path segment "${resolution.segment}"`,
1616
+ `Field "${targetFieldName}": path-targeted constraint "${constraint.constraintKind}" references unknown path segment "${resolution.segment}"`,
1463
1617
  constraint.provenance
1464
1618
  );
1465
1619
  continue;
@@ -1519,6 +1673,7 @@ function validateConstraints(ctx, name, type, constraints) {
1519
1673
  checkNumericContradictions(ctx, name, constraints);
1520
1674
  checkLengthContradictions(ctx, name, constraints);
1521
1675
  checkAllowedMembersContradiction(ctx, name, constraints);
1676
+ checkConstContradictions(ctx, name, constraints);
1522
1677
  checkConstraintBroadening(ctx, name, constraints);
1523
1678
  checkTypeApplicability(ctx, name, type, constraints);
1524
1679
  }