@formspec/build 0.1.0-alpha.31 → 0.1.0-alpha.33

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 CHANGED
@@ -19,11 +19,11 @@ Most app code can use `formspec`, but use `@formspec/build` directly when you ne
19
19
 
20
20
  ## Public Entry Points
21
21
 
22
- | Entry point | Purpose |
23
- | --------------------------- | -------------------------------------- |
24
- | `@formspec/build` | Public build APIs |
25
- | `@formspec/build/browser` | Browser-safe chain-DSL and IR surface |
26
- | `@formspec/build/internals` | Unstable low-level IR/analyzer APIs |
22
+ | Entry point | Purpose |
23
+ | --------------------------- | ------------------------------------- |
24
+ | `@formspec/build` | Public build APIs |
25
+ | `@formspec/build/browser` | Browser-safe chain-DSL and IR surface |
26
+ | `@formspec/build/internals` | Unstable low-level IR/analyzer APIs |
27
27
 
28
28
  ## Chain DSL Generation
29
29
 
@@ -63,6 +63,83 @@ const result = generateSchemasFromClass({
63
63
  });
64
64
  ```
65
65
 
66
+ ### Static Build Context
67
+
68
+ Use the static build context APIs when you need to inspect exports, declarations,
69
+ or method signatures before deciding what schemas to generate.
70
+
71
+ Public helpers in this workflow:
72
+
73
+ - `createStaticBuildContext(filePath)` - Create a reusable compiler-backed context from a file.
74
+ - `createStaticBuildContextFromProgram(program, filePath)` - Reuse a host-owned `ts.Program`.
75
+ - `resolveModuleExport(context, exportName?)` - Resolve any exported symbol, including functions and other non-schema declarations.
76
+ - `resolveModuleExportDeclaration(context, exportName?)` - Resolve only schema-source declarations (`class`, `interface`, `type` alias).
77
+ - `generateSchemasFromDeclaration(...)` - Generate from a resolved schema-source declaration.
78
+ - `generateSchemasFromParameter(...)` - Generate from a method or function parameter declaration.
79
+ - `generateSchemasFromReturnType(...)` - Generate from a method or function return type.
80
+ - `generateSchemasFromType(...)` - Generate directly from a resolved `ts.Type`.
81
+
82
+ Use `resolveModuleExportDeclaration(...)` when your tooling wants to hand a resolved
83
+ declaration straight to `generateSchemasFromDeclaration(...)`. Use `resolveModuleExport(...)`
84
+ when you need lower-level TypeScript access first, for example to inspect a function
85
+ export and then generate schemas from one of its signature types.
86
+
87
+ ```ts
88
+ import * as ts from "typescript";
89
+ import {
90
+ createStaticBuildContext,
91
+ generateSchemasFromDeclaration,
92
+ generateSchemasFromParameter,
93
+ generateSchemasFromReturnType,
94
+ resolveModuleExport,
95
+ resolveModuleExportDeclaration,
96
+ } from "@formspec/build";
97
+
98
+ const context = createStaticBuildContext("./src/service.ts");
99
+ const serviceDeclaration = resolveModuleExportDeclaration(context, "PaymentService");
100
+
101
+ if (serviceDeclaration && ts.isClassDeclaration(serviceDeclaration)) {
102
+ const submitMethod = serviceDeclaration.members.find(
103
+ (member): member is ts.MethodDeclaration =>
104
+ ts.isMethodDeclaration(member) &&
105
+ ts.isIdentifier(member.name) &&
106
+ member.name.text === "submit"
107
+ );
108
+
109
+ if (submitMethod?.parameters[0]) {
110
+ const inputSchemas = generateSchemasFromParameter({
111
+ context,
112
+ parameter: submitMethod.parameters[0],
113
+ });
114
+ }
115
+ }
116
+
117
+ const inputDeclaration = resolveModuleExportDeclaration(context, "SubmitInput");
118
+ if (inputDeclaration) {
119
+ const inputSchemas = generateSchemasFromDeclaration({
120
+ context,
121
+ declaration: inputDeclaration,
122
+ });
123
+ }
124
+
125
+ const paymentSymbol = resolveModuleExport(context, "submitPayment");
126
+ const paymentDeclaration = paymentSymbol?.declarations?.find(ts.isFunctionDeclaration);
127
+ if (paymentDeclaration) {
128
+ const outputSchemas = generateSchemasFromReturnType({
129
+ context,
130
+ declaration: paymentDeclaration,
131
+ });
132
+ }
133
+ ```
134
+
135
+ If you already own a `ts.Program`, use `createStaticBuildContextFromProgram(program, filePath)`
136
+ instead of letting FormSpec create one. If your tool has already resolved a raw
137
+ `ts.Type` or signature declaration, use `generateSchemasFromType(...)` or
138
+ `generateSchemasFromReturnType(...)` directly.
139
+
140
+ This is the supported public path for build-time analysis workflows that used to
141
+ require `@formspec/build/internals`.
142
+
66
143
  ### Supported TSDoc Examples
67
144
 
68
145
  ```ts
@@ -57,7 +57,17 @@ export type AnalyzeTypeAliasToIRResult = {
57
57
  readonly ok: false;
58
58
  readonly error: string;
59
59
  };
60
- type AnalyzerMetadataPolicy = ReturnType<typeof normalizeMetadataPolicy>;
60
+ export interface DeclarationRootInfo {
61
+ readonly metadata?: ResolvedMetadata;
62
+ readonly annotations: readonly AnnotationNode[];
63
+ readonly diagnostics: readonly ConstraintSemanticDiagnostic[];
64
+ }
65
+ interface AnalyzerMetadataPolicy {
66
+ readonly raw: MetadataPolicyInput | undefined;
67
+ readonly normalized: ReturnType<typeof normalizeMetadataPolicy>;
68
+ }
69
+ export declare function createAnalyzerMetadataPolicy(input?: MetadataPolicyInput): AnalyzerMetadataPolicy;
70
+ export declare function analyzeDeclarationRootInfo(declaration: ts.ClassDeclaration | ts.InterfaceDeclaration | ts.TypeAliasDeclaration, checker: ts.TypeChecker, file?: string, extensionRegistry?: ExtensionRegistry, metadataPolicy?: MetadataPolicyInput): DeclarationRootInfo;
61
71
  /**
62
72
  * Analyzes a class declaration and produces canonical IR FieldNodes.
63
73
  */
@@ -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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"}
@@ -14,9 +14,12 @@
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`, `@format`, `@placeholder`):
18
- * These are parsed as structured custom block tags and mapped directly
19
- * onto annotation IR nodes.
17
+ * 2. **Metadata and annotation tags** (`@apiName`, `@displayName`,
18
+ * `@format`, `@placeholder`):
19
+ * These are parsed as structured custom block tags so summary extraction
20
+ * stops at recognized FormSpec tags. `@displayName`, `@format`, and
21
+ * `@placeholder` also map onto annotation IR nodes, while `@apiName`
22
+ * remains metadata-only and is resolved separately by the class analyzer.
20
23
  *
21
24
  * The `@deprecated` tag is a standard TSDoc block tag, parsed structurally.
22
25
  *
@@ -1 +1 @@
1
- {"version":3,"file":"tsdoc-parser.d.ts","sourceRoot":"","sources":["../../src/analyzer/tsdoc-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAaL,KAAK,4BAA4B,EAGlC,MAAM,6BAA6B,CAAC;AAkBrC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EAEnB,KAAK,UAAU,EACf,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAqjBhE;;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;IAChD,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,SAAS,4BAA4B,EAAE,CAAC;CAC/D;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;IAC/B,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;CAC7B;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;AA4CD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,IAAI,SAAK,EACT,OAAO,CAAC,EAAE,iBAAiB,GAC1B,gBAAgB,CAiSlB;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,CAmC7E;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAEpD"}
1
+ {"version":3,"file":"tsdoc-parser.d.ts","sourceRoot":"","sources":["../../src/analyzer/tsdoc-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAcL,KAAK,4BAA4B,EAGlC,MAAM,6BAA6B,CAAC;AAkBrC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EAEnB,KAAK,UAAU,EACf,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA4lBhE;;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;IAChD,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,SAAS,4BAA4B,EAAE,CAAC;CAC/D;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;IAC/B,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;CAC7B;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;AA4DD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,IAAI,SAAK,EACT,OAAO,CAAC,EAAE,iBAAiB,GAC1B,gBAAgB,CAsSlB;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,CAmC7E;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAEpD"}
package/dist/browser.cjs CHANGED
@@ -1594,13 +1594,29 @@ function getSchemaExtension(schema, key) {
1594
1594
  }
1595
1595
 
1596
1596
  // src/extensions/registry.ts
1597
+ var import_internals3 = require("@formspec/core/internals");
1598
+ var import_internal = require("@formspec/analysis/internal");
1599
+ var BUILTIN_METADATA_TAGS = /* @__PURE__ */ new Set(["apiName", "displayName"]);
1600
+ function buildConstraintTagSources(extensions) {
1601
+ return extensions.map((extension) => ({
1602
+ extensionId: extension.extensionId,
1603
+ ...extension.constraintTags !== void 0 ? {
1604
+ constraintTags: extension.constraintTags.map((tag) => ({
1605
+ tagName: (0, import_internal.normalizeFormSpecTagName)(tag.tagName)
1606
+ }))
1607
+ } : {}
1608
+ }));
1609
+ }
1597
1610
  function createExtensionRegistry(extensions) {
1611
+ const reservedTagSources = buildConstraintTagSources(extensions);
1598
1612
  const typeMap = /* @__PURE__ */ new Map();
1599
1613
  const typeNameMap = /* @__PURE__ */ new Map();
1600
1614
  const constraintMap = /* @__PURE__ */ new Map();
1601
1615
  const constraintTagMap = /* @__PURE__ */ new Map();
1602
1616
  const builtinBroadeningMap = /* @__PURE__ */ new Map();
1603
1617
  const annotationMap = /* @__PURE__ */ new Map();
1618
+ const metadataSlotMap = /* @__PURE__ */ new Map();
1619
+ const metadataTagMap = /* @__PURE__ */ new Map();
1604
1620
  for (const ext of extensions) {
1605
1621
  if (ext.types !== void 0) {
1606
1622
  for (const type of ext.types) {
@@ -1643,10 +1659,11 @@ function createExtensionRegistry(extensions) {
1643
1659
  }
1644
1660
  if (ext.constraintTags !== void 0) {
1645
1661
  for (const tag of ext.constraintTags) {
1646
- if (constraintTagMap.has(tag.tagName)) {
1647
- throw new Error(`Duplicate custom constraint tag: "@${tag.tagName}"`);
1662
+ const canonicalTagName = (0, import_internal.normalizeFormSpecTagName)(tag.tagName);
1663
+ if (constraintTagMap.has(canonicalTagName)) {
1664
+ throw new Error(`Duplicate custom constraint tag: "@${canonicalTagName}"`);
1648
1665
  }
1649
- constraintTagMap.set(tag.tagName, {
1666
+ constraintTagMap.set(canonicalTagName, {
1650
1667
  extensionId: ext.extensionId,
1651
1668
  registration: tag
1652
1669
  });
@@ -1661,13 +1678,54 @@ function createExtensionRegistry(extensions) {
1661
1678
  annotationMap.set(qualifiedId, annotation);
1662
1679
  }
1663
1680
  }
1681
+ if (ext.metadataSlots !== void 0) {
1682
+ for (const slot of ext.metadataSlots) {
1683
+ if (metadataSlotMap.has(slot.slotId)) {
1684
+ throw new Error(`Duplicate metadata slot ID: "${slot.slotId}"`);
1685
+ }
1686
+ metadataSlotMap.set(slot.slotId, true);
1687
+ const canonicalTagName = (0, import_internal.normalizeFormSpecTagName)(slot.tagName);
1688
+ if (slot.allowBare === false && (slot.qualifiers?.length ?? 0) === 0) {
1689
+ throw new Error(
1690
+ `Metadata tag "@${canonicalTagName}" must allow bare usage or declare at least one qualifier.`
1691
+ );
1692
+ }
1693
+ if (metadataTagMap.has(canonicalTagName)) {
1694
+ throw new Error(`Duplicate metadata tag: "@${canonicalTagName}"`);
1695
+ }
1696
+ if (BUILTIN_METADATA_TAGS.has(canonicalTagName)) {
1697
+ throw new Error(
1698
+ `Metadata tag "@${canonicalTagName}" conflicts with built-in metadata tags.`
1699
+ );
1700
+ }
1701
+ if (constraintTagMap.has(canonicalTagName)) {
1702
+ throw new Error(
1703
+ `Metadata tag "@${canonicalTagName}" conflicts with existing FormSpec tag "@${canonicalTagName}".`
1704
+ );
1705
+ }
1706
+ if (Object.hasOwn(import_internals3.BUILTIN_CONSTRAINT_DEFINITIONS, (0, import_internals3.normalizeConstraintTagName)(canonicalTagName))) {
1707
+ throw new Error(
1708
+ `Metadata tag "@${canonicalTagName}" conflicts with existing FormSpec tag "@${(0, import_internals3.normalizeConstraintTagName)(canonicalTagName)}".`
1709
+ );
1710
+ }
1711
+ const existingTag = (0, import_internal.getTagDefinition)(canonicalTagName, reservedTagSources);
1712
+ if (existingTag !== null) {
1713
+ throw BUILTIN_METADATA_TAGS.has(existingTag.canonicalName) ? new Error(
1714
+ `Metadata tag "@${canonicalTagName}" conflicts with built-in metadata tags.`
1715
+ ) : new Error(
1716
+ `Metadata tag "@${canonicalTagName}" conflicts with existing FormSpec tag "@${existingTag.canonicalName}".`
1717
+ );
1718
+ }
1719
+ metadataTagMap.set(canonicalTagName, true);
1720
+ }
1721
+ }
1664
1722
  }
1665
1723
  return {
1666
1724
  extensions,
1667
1725
  findType: (typeId) => typeMap.get(typeId),
1668
1726
  findTypeByName: (typeName) => typeNameMap.get(typeName),
1669
1727
  findConstraint: (constraintId) => constraintMap.get(constraintId),
1670
- findConstraintTag: (tagName) => constraintTagMap.get(tagName),
1728
+ findConstraintTag: (tagName) => constraintTagMap.get((0, import_internal.normalizeFormSpecTagName)(tagName)),
1671
1729
  findBuiltinConstraintBroadening: (typeId, tagName) => builtinBroadeningMap.get(`${typeId}:${tagName}`),
1672
1730
  findAnnotation: (annotationId) => annotationMap.get(annotationId)
1673
1731
  };
@@ -1736,9 +1794,9 @@ var jsonSchema7Schema = import_zod3.z.lazy(
1736
1794
  );
1737
1795
 
1738
1796
  // src/validate/constraint-validator.ts
1739
- var import_internal = require("@formspec/analysis/internal");
1797
+ var import_internal2 = require("@formspec/analysis/internal");
1740
1798
  function validateFieldNode(ctx, field) {
1741
- const analysis = (0, import_internal.analyzeConstraintTargets)(
1799
+ const analysis = (0, import_internal2.analyzeConstraintTargets)(
1742
1800
  field.name,
1743
1801
  field.type,
1744
1802
  field.constraints,
@@ -1756,7 +1814,7 @@ function validateFieldNode(ctx, field) {
1756
1814
  }
1757
1815
  function validateObjectProperty(ctx, parentName, property) {
1758
1816
  const qualifiedName = `${parentName}.${property.name}`;
1759
- const analysis = (0, import_internal.analyzeConstraintTargets)(
1817
+ const analysis = (0, import_internal2.analyzeConstraintTargets)(
1760
1818
  qualifiedName,
1761
1819
  property.type,
1762
1820
  property.constraints,