@formspec/build 0.1.0-alpha.59 → 0.1.0-alpha.63

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 (45) hide show
  1. package/dist/analyzer/class-analyzer.d.ts +1 -1
  2. package/dist/analyzer/class-analyzer.d.ts.map +1 -1
  3. package/dist/analyzer/jsdoc-constraints.d.ts +0 -6
  4. package/dist/analyzer/jsdoc-constraints.d.ts.map +1 -1
  5. package/dist/analyzer/tsdoc-parser.d.ts +2 -5
  6. package/dist/analyzer/tsdoc-parser.d.ts.map +1 -1
  7. package/dist/browser.cjs +1 -1
  8. package/dist/browser.cjs.map +1 -1
  9. package/dist/browser.js +2 -2
  10. package/dist/browser.js.map +1 -1
  11. package/dist/build-alpha.d.ts +2 -1
  12. package/dist/build-beta.d.ts +2 -1
  13. package/dist/build-internal.d.ts +18 -15
  14. package/dist/build.d.ts +2 -1
  15. package/dist/canonicalize/chain-dsl-canonicalizer.d.ts +2 -1
  16. package/dist/canonicalize/chain-dsl-canonicalizer.d.ts.map +1 -1
  17. package/dist/canonicalize/tsdoc-canonicalizer.d.ts +2 -1
  18. package/dist/canonicalize/tsdoc-canonicalizer.d.ts.map +1 -1
  19. package/dist/cli.cjs +45 -316
  20. package/dist/cli.cjs.map +1 -1
  21. package/dist/cli.js +48 -319
  22. package/dist/cli.js.map +1 -1
  23. package/dist/extensions/registry.d.ts +2 -2
  24. package/dist/extensions/registry.d.ts.map +1 -1
  25. package/dist/generators/method-schema.d.ts +3 -2
  26. package/dist/generators/method-schema.d.ts.map +1 -1
  27. package/dist/index.cjs +44 -315
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.ts +2 -2
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +47 -318
  32. package/dist/index.js.map +1 -1
  33. package/dist/internals.cjs +44 -315
  34. package/dist/internals.cjs.map +1 -1
  35. package/dist/internals.js +47 -318
  36. package/dist/internals.js.map +1 -1
  37. package/dist/metadata/index.d.ts +1 -4
  38. package/dist/metadata/index.d.ts.map +1 -1
  39. package/dist/metadata/policy.d.ts +2 -6
  40. package/dist/metadata/policy.d.ts.map +1 -1
  41. package/dist/metadata/resolve.d.ts +3 -2
  42. package/dist/metadata/resolve.d.ts.map +1 -1
  43. package/dist/ui-schema/schema.d.ts +11 -28
  44. package/dist/ui-schema/schema.d.ts.map +1 -1
  45. package/package.json +8 -8
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import type * as ts from "typescript";
11
11
  import type { ExtensionDefinition, CustomTypeRegistration, CustomConstraintRegistration, CustomAnnotationRegistration, ConstraintTagRegistration, BuiltinConstraintBroadeningRegistration } from "@formspec/core/internals";
12
- import { type SyntheticCompilerDiagnostic } from "@formspec/analysis/internal";
12
+ import { type SetupDiagnostic } from "@formspec/analysis/internal";
13
13
  /**
14
14
  * The result of a successful extension type lookup.
15
15
  *
@@ -53,7 +53,7 @@ export interface ExtensionRegistry {
53
53
  *
54
54
  * @internal
55
55
  */
56
- readonly setupDiagnostics: readonly SyntheticCompilerDiagnostic[];
56
+ readonly setupDiagnostics: readonly SetupDiagnostic[];
57
57
  /**
58
58
  * Look up a custom type registration by its fully-qualified type ID.
59
59
  *
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/extensions/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACtB,4BAA4B,EAC5B,4BAA4B,EAC5B,yBAAyB,EACzB,uCAAuC,EACxC,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAOL,KAAK,2BAA2B,EACjC,MAAM,6BAA6B,CAAC;AAMrC;;;;;;;;GAQG;AACH,MAAM,WAAW,yBAAyB;IACxC,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,YAAY,EAAE,sBAAsB,CAAC;CAC/C;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAEpD;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,gBAAgB,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAElE;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAAC;IAC7D;;;;;OAKG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS,CAAC;IACxE;;;;;;;;;OASG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS,CAAC;IAEtE;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,yBAAyB,GAAG,SAAS,CAAC;IAE3E;;;;;OAKG;IACH,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,4BAA4B,GAAG,SAAS,CAAC;IAC/E;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAC7B;QACE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,YAAY,EAAE,yBAAyB,CAAC;KAClD,GACD,SAAS,CAAC;IACd;;OAEG;IACH,+BAA+B,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAEb;QACE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,YAAY,EAAE,uCAAuC,CAAC;KAChE,GACD,SAAS,CAAC;IAEd;;;;;OAKG;IACH,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,4BAA4B,GAAG,SAAS,CAAC;CAChF;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,wBAAyB,SAAQ,iBAAiB;IACjE;;;;;;;;OAQG;IACH,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,yBAAyB,CAAC,GAAG,IAAI,CAAC;CACpE;AAmCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,SAAS,mBAAmB,EAAE,GACzC,wBAAwB,CAsM1B"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/extensions/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACtB,4BAA4B,EAC5B,4BAA4B,EAC5B,yBAAyB,EACzB,uCAAuC,EACxC,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AAMrC;;;;;;;;GAQG;AACH,MAAM,WAAW,yBAAyB;IACxC,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,YAAY,EAAE,sBAAsB,CAAC;CAC/C;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAEpD;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,gBAAgB,EAAE,SAAS,eAAe,EAAE,CAAC;IAEtD;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAAC;IAC7D;;;;;OAKG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS,CAAC;IACxE;;;;;;;;;OASG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS,CAAC;IAEtE;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,yBAAyB,GAAG,SAAS,CAAC;IAE3E;;;;;OAKG;IACH,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,4BAA4B,GAAG,SAAS,CAAC;IAC/E;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAC7B;QACE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,YAAY,EAAE,yBAAyB,CAAC;KAClD,GACD,SAAS,CAAC;IACd;;OAEG;IACH,+BAA+B,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAEb;QACE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,YAAY,EAAE,uCAAuC,CAAC;KAChE,GACD,SAAS,CAAC;IAEd;;;;;OAKG;IACH,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,4BAA4B,GAAG,SAAS,CAAC;CAChF;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,wBAAyB,SAAQ,iBAAiB;IACjE;;;;;;;;OAQG;IACH,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,yBAAyB,CAAC,GAAG,IAAI,CAAC;CACpE;AAmCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,SAAS,mBAAmB,EAAE,GACzC,wBAAwB,CAsM1B"}
@@ -32,7 +32,7 @@ export interface MethodSchemas {
32
32
  /**
33
33
  * Parameter schemas for a method.
34
34
  */
35
- export interface MethodParamsSchemas {
35
+ interface MethodParamsSchemas {
36
36
  /** JSON Schema for parameters */
37
37
  jsonSchema: JsonSchema2020;
38
38
  /** UI Schema / FormSpec for parameters (if available) */
@@ -43,7 +43,7 @@ export interface MethodParamsSchemas {
43
43
  /**
44
44
  * Options for generating method schemas.
45
45
  */
46
- export interface GenerateMethodSchemasOptions {
46
+ interface GenerateMethodSchemasOptions {
47
47
  /** JSON Schema representation to use for static enums. */
48
48
  readonly enumSerialization?: GenerateJsonSchemaFromIROptions["enumSerialization"] | undefined;
49
49
  }
@@ -69,4 +69,5 @@ export declare function generateMethodSchemas(method: MethodInfo, checker: ts.Ty
69
69
  * @returns Set of FormSpec export names
70
70
  */
71
71
  export declare function collectFormSpecReferences(methods: MethodInfo[]): Set<string>;
72
+ export {};
72
73
  //# sourceMappingURL=method-schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"method-schema.d.ts","sourceRoot":"","sources":["../../src/generators/method-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,+BAA+B,CAAC;AAG/E,OAAO,EAEL,KAAK,+BAA+B,EACpC,KAAK,cAAc,EACpB,MAAM,gCAAgC,CAAC;AAGxC;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnC,yBAAyB;IACzB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,UAAU,EAAE,cAAc,CAAC;IAC3B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gDAAgD;IAChD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,0DAA0D;IAC1D,QAAQ,CAAC,iBAAiB,CAAC,EAAE,+BAA+B,CAAC,mBAAmB,CAAC,GAAG,SAAS,CAAC;CAC/F;AAyED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,EACnD,OAAO,CAAC,EAAE,4BAA4B,GACrC,aAAa,CAYf;AAoED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAY5E"}
1
+ {"version":3,"file":"method-schema.d.ts","sourceRoot":"","sources":["../../src/generators/method-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,+BAA+B,CAAC;AAG/E,OAAO,EAEL,KAAK,+BAA+B,EACpC,KAAK,cAAc,EACpB,MAAM,gCAAgC,CAAC;AAGxC;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnC,yBAAyB;IACzB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED;;GAEG;AACH,UAAU,mBAAmB;IAC3B,iCAAiC;IACjC,UAAU,EAAE,cAAc,CAAC;IAC3B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gDAAgD;IAChD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,UAAU,4BAA4B;IACpC,0DAA0D;IAC1D,QAAQ,CAAC,iBAAiB,CAAC,EAAE,+BAA+B,CAAC,mBAAmB,CAAC,GAAG,SAAS,CAAC;CAC/F;AAyED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,EACnD,OAAO,CAAC,EAAE,4BAA4B,GACrC,aAAa,CAYf;AAoED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAY5E"}
package/dist/index.cjs CHANGED
@@ -2130,7 +2130,7 @@ function buildConstraintTagSources(extensions) {
2130
2130
  }));
2131
2131
  }
2132
2132
  function createExtensionRegistry(extensions) {
2133
- const registryLog = (0, import_internal.getSyntheticLogger)();
2133
+ const registryLog = (0, import_internal.getRegistryLogger)();
2134
2134
  registryLog.debug("createExtensionRegistry: constructing", {
2135
2135
  extensionCount: extensions.length,
2136
2136
  extensionIds: extensions.map((e) => e.extensionId)
@@ -2488,152 +2488,35 @@ var import_internal3 = require("@formspec/analysis/internal");
2488
2488
 
2489
2489
  // src/analyzer/tsdoc-parser.ts
2490
2490
  var import_internal5 = require("@formspec/analysis/internal");
2491
- function sharedTagValueOptions(options) {
2491
+ function sharedTagValueOptions(options, pathResolvedCustomTypeId) {
2492
2492
  return {
2493
2493
  ...options?.extensionRegistry !== void 0 ? { registry: options.extensionRegistry } : {},
2494
- ...options?.fieldType !== void 0 ? { fieldType: options.fieldType } : {}
2494
+ ...options?.fieldType !== void 0 ? { fieldType: options.fieldType } : {},
2495
+ ...pathResolvedCustomTypeId !== void 0 ? { pathResolvedCustomTypeId } : {}
2495
2496
  };
2496
2497
  }
2497
- var SYNTHETIC_TYPE_FORMAT_FLAGS = ts3.TypeFormatFlags.NoTruncation | ts3.TypeFormatFlags.UseAliasDefinedOutsideCurrentScope;
2498
- function getExtensionTypeNames(registry) {
2499
- if (registry === void 0) {
2500
- return /* @__PURE__ */ new Set();
2501
- }
2502
- return new Set(
2503
- registry.extensions.flatMap(
2504
- (ext) => (ext.types ?? []).flatMap((t) => t.tsTypeNames ?? [t.typeName])
2505
- )
2506
- );
2498
+ function customTypeIdForResolvedType(resolvedType, checker, registry) {
2499
+ if (registry === void 0) return void 0;
2500
+ const lookup = resolveCustomTypeFromTsType(resolvedType, checker, registry);
2501
+ return lookup === null ? void 0 : customTypeIdFromLookup(lookup);
2507
2502
  }
2508
- function collectImportedNames(sourceFile) {
2509
- const importedNames = /* @__PURE__ */ new Set();
2510
- for (const statement of sourceFile.statements) {
2511
- if (ts3.isImportDeclaration(statement) && statement.importClause !== void 0) {
2512
- const clause = statement.importClause;
2513
- if (clause.name !== void 0) {
2514
- importedNames.add(clause.name.text);
2515
- }
2516
- if (clause.namedBindings !== void 0) {
2517
- if (ts3.isNamedImports(clause.namedBindings)) {
2518
- for (const specifier of clause.namedBindings.elements) {
2519
- importedNames.add(specifier.name.text);
2520
- }
2521
- } else if (ts3.isNamespaceImport(clause.namedBindings)) {
2522
- importedNames.add(clause.namedBindings.name.text);
2523
- }
2524
- }
2525
- continue;
2526
- }
2527
- if (ts3.isImportEqualsDeclaration(statement)) {
2528
- importedNames.add(statement.name.text);
2529
- }
2530
- }
2531
- return importedNames;
2532
- }
2533
- function isNonReferenceIdentifier(node) {
2534
- const parent = node.parent;
2535
- if ((ts3.isBindingElement(parent) || ts3.isClassDeclaration(parent) || ts3.isEnumDeclaration(parent) || ts3.isEnumMember(parent) || ts3.isFunctionDeclaration(parent) || ts3.isFunctionExpression(parent) || ts3.isImportClause(parent) || ts3.isImportEqualsDeclaration(parent) || ts3.isImportSpecifier(parent) || ts3.isInterfaceDeclaration(parent) || ts3.isMethodDeclaration(parent) || ts3.isMethodSignature(parent) || ts3.isModuleDeclaration(parent) || ts3.isNamespaceExport(parent) || ts3.isNamespaceImport(parent) || ts3.isParameter(parent) || ts3.isPropertyDeclaration(parent) || ts3.isPropertySignature(parent) || ts3.isSetAccessorDeclaration(parent) || ts3.isGetAccessorDeclaration(parent) || ts3.isTypeAliasDeclaration(parent) || ts3.isTypeParameterDeclaration(parent) || ts3.isVariableDeclaration(parent)) && parent.name === node) {
2536
- return true;
2537
- }
2538
- if ((ts3.isPropertyAssignment(parent) || ts3.isPropertyAccessExpression(parent)) && parent.name === node) {
2539
- return true;
2540
- }
2541
- if (ts3.isQualifiedName(parent) && parent.right === node) {
2542
- return true;
2543
- }
2544
- return false;
2545
- }
2546
- function astReferencesImportedName(root, importedNames) {
2547
- if (importedNames.size === 0) {
2548
- return false;
2549
- }
2550
- let found = false;
2551
- const visit = (node) => {
2552
- if (found) return;
2553
- if (ts3.isIdentifier(node) && importedNames.has(node.text) && !isNonReferenceIdentifier(node)) {
2554
- found = true;
2555
- return;
2556
- }
2557
- ts3.forEachChild(node, visit);
2558
- };
2559
- visit(root);
2560
- return found;
2561
- }
2562
- function getObjectMembers(statement) {
2563
- if (ts3.isInterfaceDeclaration(statement)) {
2564
- return statement.members;
2565
- }
2566
- if (ts3.isTypeLiteralNode(statement.type)) {
2567
- return statement.type.members;
2568
- }
2569
- return void 0;
2570
- }
2571
- function rewriteImportedMemberTypes(statement, sourceFile, importedNames) {
2572
- const members = getObjectMembers(statement);
2573
- if (members === void 0) {
2574
- return null;
2575
- }
2576
- const replacements = [];
2577
- for (const member of members) {
2578
- if (!ts3.isPropertySignature(member)) {
2579
- if (astReferencesImportedName(member, importedNames)) {
2580
- return null;
2581
- }
2582
- continue;
2583
- }
2584
- const typeAnnotation = member.type;
2585
- if (typeAnnotation === void 0) continue;
2586
- if (astReferencesImportedName(typeAnnotation, importedNames)) {
2587
- replacements.push({
2588
- start: typeAnnotation.getStart(sourceFile),
2589
- end: typeAnnotation.getEnd()
2590
- });
2591
- }
2592
- }
2593
- if (replacements.length === 0) {
2594
- return statement.getText(sourceFile);
2595
- }
2596
- const stmtStart = statement.getStart(sourceFile);
2597
- let result = statement.getText(sourceFile);
2598
- for (const { start, end } of [...replacements].reverse()) {
2599
- result = result.slice(0, start - stmtStart) + "unknown" + result.slice(end - stmtStart);
2503
+ function resolvePathTargetCustomTypeId(parsedTag, subjectType, checker, registry) {
2504
+ if (parsedTag === null) return void 0;
2505
+ const target = parsedTag.target;
2506
+ if (target?.kind !== "path" || !target.valid || target.path === null) {
2507
+ return void 0;
2600
2508
  }
2601
- return result;
2602
- }
2603
- function buildSupportingDeclarations(sourceFile, extensionTypeNames) {
2604
- const importedNames = collectImportedNames(sourceFile);
2605
- const importedNamesToSkip = new Set(
2606
- [...importedNames].filter((name) => !extensionTypeNames.has(name))
2607
- );
2608
- const result = [];
2609
- for (const statement of sourceFile.statements) {
2610
- if (ts3.isImportDeclaration(statement)) continue;
2611
- if (ts3.isImportEqualsDeclaration(statement)) continue;
2612
- if (ts3.isExportDeclaration(statement) && statement.moduleSpecifier !== void 0) continue;
2613
- if (!astReferencesImportedName(statement, importedNamesToSkip)) {
2614
- result.push(statement.getText(sourceFile));
2615
- continue;
2616
- }
2617
- if (ts3.isInterfaceDeclaration(statement) || ts3.isTypeAliasDeclaration(statement)) {
2618
- const rewritten = rewriteImportedMemberTypes(statement, sourceFile, importedNamesToSkip);
2619
- if (rewritten !== null) {
2620
- result.push(rewritten);
2621
- }
2622
- }
2509
+ if (subjectType === void 0 || checker === void 0) {
2510
+ return void 0;
2623
2511
  }
2624
- return result;
2625
- }
2626
- function pushUniqueCompilerDiagnostics(target, additions) {
2627
- for (const diagnostic of additions) {
2628
- if ((diagnostic.code === "UNSUPPORTED_CUSTOM_TYPE_OVERRIDE" || diagnostic.code === "SYNTHETIC_SETUP_FAILURE") && target.some(
2629
- (existing) => existing.code === diagnostic.code && existing.message === diagnostic.message
2630
- )) {
2631
- continue;
2632
- }
2633
- target.push(diagnostic);
2512
+ const resolution = (0, import_internal4.resolvePathTargetType)(subjectType, checker, target.path.segments);
2513
+ if (resolution.kind !== "resolved") {
2514
+ return void 0;
2634
2515
  }
2516
+ return customTypeIdForResolvedType(resolution.type, checker, registry);
2635
2517
  }
2636
- function processConstraintTag(tagName, text, parsedTag, provenance, node, sourceFile, supportingDeclarations, options, constraints, diagnostics) {
2518
+ var TYPE_FORMAT_FLAGS = ts3.TypeFormatFlags.NoTruncation | ts3.TypeFormatFlags.UseAliasDefinedOutsideCurrentScope;
2519
+ function processConstraintTag(tagName, text, parsedTag, provenance, node, sourceFile, options, constraints, diagnostics) {
2637
2520
  const compilerDiagnostics = buildCompilerBackedConstraintDiagnostics(
2638
2521
  node,
2639
2522
  sourceFile,
@@ -2641,74 +2524,30 @@ function processConstraintTag(tagName, text, parsedTag, provenance, node, source
2641
2524
  parsedTag,
2642
2525
  text,
2643
2526
  provenance,
2644
- supportingDeclarations,
2645
2527
  options
2646
2528
  );
2647
2529
  if (compilerDiagnostics.length > 0) {
2648
- pushUniqueCompilerDiagnostics(diagnostics, compilerDiagnostics);
2530
+ diagnostics.push(...compilerDiagnostics);
2649
2531
  return;
2650
2532
  }
2533
+ const pathResolvedCustomTypeId = resolvePathTargetCustomTypeId(
2534
+ parsedTag,
2535
+ options?.subjectType,
2536
+ options?.checker,
2537
+ options?.extensionRegistry
2538
+ );
2651
2539
  const constraintNode = (0, import_internal4.parseConstraintTagValue)(
2652
2540
  tagName,
2653
2541
  text,
2654
2542
  provenance,
2655
- sharedTagValueOptions(options)
2543
+ sharedTagValueOptions(options, pathResolvedCustomTypeId)
2656
2544
  );
2657
2545
  if (constraintNode) {
2658
2546
  constraints.push(constraintNode);
2659
2547
  }
2660
2548
  }
2661
- function renderSyntheticArgumentExpression(valueKind, argumentText) {
2662
- const trimmed = argumentText.trim();
2663
- if (trimmed === "") {
2664
- return null;
2665
- }
2666
- switch (valueKind) {
2667
- case "number":
2668
- case "integer":
2669
- case "signedInteger":
2670
- if (trimmed === "Infinity" || trimmed === "-Infinity" || trimmed === "NaN") {
2671
- return trimmed;
2672
- }
2673
- return Number.isFinite(Number(trimmed)) ? trimmed : JSON.stringify(trimmed);
2674
- case "string":
2675
- return JSON.stringify(argumentText);
2676
- case "json":
2677
- try {
2678
- JSON.parse(trimmed);
2679
- return `(${trimmed})`;
2680
- } catch {
2681
- return JSON.stringify(trimmed);
2682
- }
2683
- case "boolean":
2684
- return trimmed === "true" || trimmed === "false" ? trimmed : JSON.stringify(trimmed);
2685
- case "condition":
2686
- return "undefined as unknown as FormSpecCondition";
2687
- case null:
2688
- return null;
2689
- default: {
2690
- return String(valueKind);
2691
- }
2692
- }
2693
- }
2694
- function getArrayElementType(type, checker) {
2695
- if (!checker.isArrayType(type)) {
2696
- return null;
2697
- }
2698
- return checker.getTypeArguments(type)[0] ?? null;
2699
- }
2700
2549
  function supportsConstraintCapability(type, checker, capability) {
2701
- if (capability === void 0) {
2702
- return true;
2703
- }
2704
- if ((0, import_internal4.hasTypeSemanticCapability)(type, checker, capability)) {
2705
- return true;
2706
- }
2707
- if (capability === "string-like") {
2708
- const itemType = getArrayElementType(type, checker);
2709
- return itemType !== null && (0, import_internal4.hasTypeSemanticCapability)(itemType, checker, capability);
2710
- }
2711
- return false;
2550
+ return (0, import_internal4._supportsConstraintCapability)(capability, type, checker);
2712
2551
  }
2713
2552
  var MAX_HINT_CANDIDATES = 5;
2714
2553
  var MAX_HINT_DEPTH = 3;
@@ -2835,53 +2674,11 @@ function placementLabel(placement) {
2835
2674
  }
2836
2675
  }
2837
2676
  }
2838
- function capabilityLabel(capability) {
2839
- switch (capability) {
2840
- case "numeric-comparable":
2841
- return "number";
2842
- case "string-like":
2843
- return "string";
2844
- case "array-like":
2845
- return "array";
2846
- case "enum-member-addressable":
2847
- return "enum";
2848
- case "json-like":
2849
- return "JSON-compatible";
2850
- case "object-like":
2851
- return "object";
2852
- case "condition-like":
2853
- return "conditional";
2854
- case void 0:
2855
- return "compatible";
2856
- default:
2857
- return capability;
2858
- }
2859
- }
2860
- function getBroadenedCustomTypeId(fieldType) {
2861
- if (fieldType?.kind === "custom") {
2862
- return fieldType.typeId;
2863
- }
2864
- if (fieldType?.kind !== "union") {
2865
- return void 0;
2866
- }
2867
- const customMembers = fieldType.members.filter(
2868
- (member) => member.kind === "custom"
2869
- );
2870
- if (customMembers.length !== 1) {
2871
- return void 0;
2872
- }
2873
- const nonCustomMembers = fieldType.members.filter((member) => member.kind !== "custom");
2874
- const allOtherMembersAreNull = nonCustomMembers.every(
2875
- (member) => member.kind === "primitive" && member.primitiveKind === "null"
2876
- );
2877
- const customMember = customMembers[0];
2878
- return allOtherMembersAreNull && customMember !== void 0 ? customMember.typeId : void 0;
2879
- }
2880
2677
  function hasBuiltinConstraintBroadening(tagName, options) {
2881
- const broadenedTypeId = getBroadenedCustomTypeId(options?.fieldType);
2678
+ const broadenedTypeId = (0, import_internal4.getBroadenedCustomTypeId)(options?.fieldType);
2882
2679
  return broadenedTypeId !== void 0 && options?.extensionRegistry?.findBuiltinConstraintBroadening(broadenedTypeId, tagName) !== void 0;
2883
2680
  }
2884
- function buildCompilerBackedConstraintDiagnostics(node, sourceFile, tagName, parsedTag, rawText, provenance, supportingDeclarations, options) {
2681
+ function buildCompilerBackedConstraintDiagnostics(node, sourceFile, tagName, parsedTag, rawText, provenance, options) {
2885
2682
  if (!(0, import_internals4.isBuiltinConstraintName)(tagName)) {
2886
2683
  return [];
2887
2684
  }
@@ -2901,16 +2698,14 @@ function buildCompilerBackedConstraintDiagnostics(node, sourceFile, tagName, par
2901
2698
  const nonNullPlacement = placement;
2902
2699
  const log = (0, import_internal5.getBuildLogger)();
2903
2700
  const broadeningLog = (0, import_internal5.getBroadeningLogger)();
2904
- const syntheticLog = (0, import_internal5.getSyntheticLogger)();
2905
2701
  const typedParserLog = (0, import_internal5.getTypedParserLogger)();
2906
2702
  const logsEnabled = log !== import_core3.noopLogger || broadeningLog !== import_core3.noopLogger;
2907
- const syntheticTraceEnabled = syntheticLog !== import_core3.noopLogger;
2908
2703
  const typedParserTraceEnabled = typedParserLog !== import_core3.noopLogger;
2909
2704
  const logStart = logsEnabled ? (0, import_internal5.nowMicros)() : 0;
2910
2705
  const subjectTypeKind = logsEnabled ? (0, import_internal5.describeTypeKind)(subjectType, checker) : "";
2911
- function emit(outcome, result2) {
2706
+ function emit(outcome, result) {
2912
2707
  if (!logsEnabled) {
2913
- return result2;
2708
+ return result;
2914
2709
  }
2915
2710
  const entry = {
2916
2711
  consumer: "build",
@@ -2924,7 +2719,7 @@ function buildCompilerBackedConstraintDiagnostics(node, sourceFile, tagName, par
2924
2719
  if (outcome === "bypass" || outcome === "D1" || outcome === "D2") {
2925
2720
  (0, import_internal5.logTagApplication)(broadeningLog, entry);
2926
2721
  }
2927
- return result2;
2722
+ return result;
2928
2723
  }
2929
2724
  if (!definition.placements.includes(placement)) {
2930
2725
  return emit("A-reject", [
@@ -2968,7 +2763,7 @@ function buildCompilerBackedConstraintDiagnostics(node, sourceFile, tagName, par
2968
2763
  ]);
2969
2764
  }
2970
2765
  if (resolution.kind === "unresolvable") {
2971
- const actualType = checker.typeToString(resolution.type, node, SYNTHETIC_TYPE_FORMAT_FLAGS);
2766
+ const actualType = checker.typeToString(resolution.type, node, TYPE_FORMAT_FLAGS);
2972
2767
  return emit("B-reject", [
2973
2768
  makeDiagnostic(
2974
2769
  "TYPE_MISMATCH",
@@ -2982,21 +2777,21 @@ function buildCompilerBackedConstraintDiagnostics(node, sourceFile, tagName, par
2982
2777
  }
2983
2778
  const hasBroadening = (() => {
2984
2779
  if (target === null) {
2985
- if ((0, import_internal3._isIntegerBrandedType)((0, import_internal4.stripNullishUnion)(subjectType)) && definition.capabilities.includes("numeric-comparable")) {
2780
+ if ((0, import_internal3._isIntegerBrandedType)((0, import_internal4.stripNullishUnion)(subjectType)) && definition.capabilities[0] === "numeric-comparable") {
2986
2781
  return true;
2987
2782
  }
2988
2783
  return hasBuiltinConstraintBroadening(tagName, options);
2989
2784
  }
2990
2785
  const registry = options?.extensionRegistry;
2991
2786
  if (registry === void 0) return false;
2992
- const resolved = resolveCustomTypeFromTsType(evaluatedType, checker, registry);
2993
- return resolved !== null && registry.findBuiltinConstraintBroadening(customTypeIdFromLookup(resolved), tagName) !== void 0;
2787
+ const typeId = customTypeIdForResolvedType(evaluatedType, checker, registry);
2788
+ return typeId !== void 0 && registry.findBuiltinConstraintBroadening(typeId, tagName) !== void 0;
2994
2789
  })();
2995
2790
  if (!hasBroadening) {
2996
2791
  const requiredCapability = definition.capabilities[0];
2997
2792
  if (requiredCapability !== void 0 && !supportsConstraintCapability(evaluatedType, checker, requiredCapability)) {
2998
- const actualType = checker.typeToString(evaluatedType, node, SYNTHETIC_TYPE_FORMAT_FLAGS);
2999
- const baseMessage = `Target "${targetLabel}": constraint "${tagName}" is only valid on ${capabilityLabel(requiredCapability)} targets, but field type is "${actualType}"`;
2793
+ const actualType = checker.typeToString(evaluatedType, node, TYPE_FORMAT_FLAGS);
2794
+ const baseMessage = `Target "${targetLabel}": constraint "${tagName}" is only valid on ${(0, import_internal4._capabilityLabel)(requiredCapability)} targets, but field type is "${actualType}"`;
3000
2795
  const hint = target === null ? buildPathTargetHint(
3001
2796
  subjectType,
3002
2797
  checker,
@@ -3044,68 +2839,7 @@ function buildCompilerBackedConstraintDiagnostics(node, sourceFile, tagName, par
3044
2839
  valueKind: typedParseResult.value.kind
3045
2840
  });
3046
2841
  }
3047
- const argumentExpression = renderSyntheticArgumentExpression(
3048
- definition.valueKind,
3049
- effectiveArgumentText
3050
- );
3051
- const subjectTypeText = checker.typeToString(subjectType, node, SYNTHETIC_TYPE_FORMAT_FLAGS);
3052
- const hostType = options?.hostType ?? subjectType;
3053
- const hostTypeText = checker.typeToString(hostType, node, SYNTHETIC_TYPE_FORMAT_FLAGS);
3054
- if (syntheticTraceEnabled) {
3055
- syntheticLog.trace("invoking synthetic checker", {
3056
- consumer: "build",
3057
- tag: tagName,
3058
- placement,
3059
- subjectTypeKind,
3060
- subjectTypeText
3061
- });
3062
- }
3063
- const result = (0, import_internal4.checkSyntheticTagApplication)({
3064
- tagName,
3065
- placement,
3066
- hostType: hostTypeText,
3067
- subjectType: subjectTypeText,
3068
- ...target?.kind === "path" ? { target: { kind: "path", text: target.rawText } } : {},
3069
- ...argumentExpression !== null ? { argumentExpression } : {},
3070
- supportingDeclarations,
3071
- ...options?.extensionRegistry !== void 0 ? {
3072
- extensions: options.extensionRegistry.extensions.map((extension) => ({
3073
- extensionId: extension.extensionId,
3074
- ...extension.constraintTags !== void 0 ? {
3075
- constraintTags: extension.constraintTags.map((tag) => ({ tagName: tag.tagName }))
3076
- } : {},
3077
- ...extension.metadataSlots !== void 0 ? {
3078
- metadataSlots: extension.metadataSlots
3079
- } : {},
3080
- ...extension.types !== void 0 ? {
3081
- customTypes: extension.types.map((t) => ({
3082
- tsTypeNames: t.tsTypeNames ?? [t.typeName]
3083
- }))
3084
- } : {}
3085
- }))
3086
- } : {}
3087
- });
3088
- if (result.diagnostics.length === 0) {
3089
- return emit("D-pass", []);
3090
- }
3091
- const setupDiagnostic = result.diagnostics.find((diagnostic) => diagnostic.kind !== "typescript");
3092
- if (setupDiagnostic !== void 0) {
3093
- return emit("C-reject", [
3094
- makeDiagnostic(
3095
- (0, import_internal5._mapSetupDiagnosticCode)(setupDiagnostic.kind),
3096
- setupDiagnostic.message,
3097
- provenance
3098
- )
3099
- ]);
3100
- }
3101
- const expectedLabel = definition.valueKind === null ? "compatible argument" : capabilityLabel(definition.valueKind);
3102
- return emit("C-reject", [
3103
- makeDiagnostic(
3104
- "TYPE_MISMATCH",
3105
- `Tag "@${tagName}" received an invalid argument for ${expectedLabel}.`,
3106
- provenance
3107
- )
3108
- ]);
2842
+ return emit("C-pass", []);
3109
2843
  }
3110
2844
  var parseResultCache = /* @__PURE__ */ new Map();
3111
2845
  function getExtensionTagNames(options) {
@@ -3149,8 +2883,8 @@ function getParseCacheKey(node, file, options) {
3149
2883
  start: node.getFullStart(),
3150
2884
  end: node.getEnd(),
3151
2885
  fieldType: options?.fieldType ?? null,
3152
- subjectType: checker !== void 0 && options?.subjectType !== void 0 ? checker.typeToString(options.subjectType, node, SYNTHETIC_TYPE_FORMAT_FLAGS) : null,
3153
- hostType: checker !== void 0 && options?.hostType !== void 0 ? checker.typeToString(options.hostType, node, SYNTHETIC_TYPE_FORMAT_FLAGS) : null,
2886
+ subjectType: checker !== void 0 && options?.subjectType !== void 0 ? checker.typeToString(options.subjectType, node, TYPE_FORMAT_FLAGS) : null,
2887
+ hostType: checker !== void 0 && options?.hostType !== void 0 ? checker.typeToString(options.hostType, node, TYPE_FORMAT_FLAGS) : null,
3154
2888
  extensions: getExtensionRegistryCacheKey(options?.extensionRegistry)
3155
2889
  });
3156
2890
  }
@@ -3179,8 +2913,6 @@ function parseTSDocTags(node, file = "", options) {
3179
2913
  let placeholderProvenance;
3180
2914
  const sourceFile = node.getSourceFile();
3181
2915
  const sourceText = sourceFile.getFullText();
3182
- const extensionTypeNames = getExtensionTypeNames(options?.extensionRegistry);
3183
- const supportingDeclarations = buildSupportingDeclarations(sourceFile, extensionTypeNames);
3184
2916
  const commentRanges = ts3.getLeadingCommentRanges(sourceText, node.getFullStart());
3185
2917
  const rawTextFallbacks = collectRawTextFallbacks(node, file);
3186
2918
  const extensionTagNames = getExtensionTagNames(options);
@@ -3245,7 +2977,6 @@ function parseTSDocTags(node, file = "", options) {
3245
2977
  provenance2,
3246
2978
  node,
3247
2979
  sourceFile,
3248
- supportingDeclarations,
3249
2980
  options,
3250
2981
  constraints,
3251
2982
  diagnostics
@@ -3263,7 +2994,6 @@ function parseTSDocTags(node, file = "", options) {
3263
2994
  provenance,
3264
2995
  node,
3265
2996
  sourceFile,
3266
- supportingDeclarations,
3267
2997
  options,
3268
2998
  constraints,
3269
2999
  diagnostics
@@ -3327,7 +3057,6 @@ function parseTSDocTags(node, file = "", options) {
3327
3057
  provenance,
3328
3058
  node,
3329
3059
  sourceFile,
3330
- supportingDeclarations,
3331
3060
  options,
3332
3061
  constraints,
3333
3062
  diagnostics