@formspec/build 0.1.0-alpha.59 → 0.1.0-alpha.61
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/dist/analyzer/class-analyzer.d.ts +1 -1
- package/dist/analyzer/class-analyzer.d.ts.map +1 -1
- package/dist/analyzer/jsdoc-constraints.d.ts +0 -6
- package/dist/analyzer/jsdoc-constraints.d.ts.map +1 -1
- package/dist/analyzer/tsdoc-parser.d.ts +2 -5
- package/dist/analyzer/tsdoc-parser.d.ts.map +1 -1
- package/dist/browser.cjs +1 -1
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js +2 -2
- package/dist/browser.js.map +1 -1
- package/dist/build-alpha.d.ts +2 -1
- package/dist/build-beta.d.ts +2 -1
- package/dist/build-internal.d.ts +18 -15
- package/dist/build.d.ts +2 -1
- package/dist/canonicalize/chain-dsl-canonicalizer.d.ts +2 -1
- package/dist/canonicalize/chain-dsl-canonicalizer.d.ts.map +1 -1
- package/dist/canonicalize/tsdoc-canonicalizer.d.ts +2 -1
- package/dist/canonicalize/tsdoc-canonicalizer.d.ts.map +1 -1
- package/dist/cli.cjs +45 -316
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +48 -319
- package/dist/cli.js.map +1 -1
- package/dist/extensions/registry.d.ts +2 -2
- package/dist/extensions/registry.d.ts.map +1 -1
- package/dist/generators/method-schema.d.ts +3 -2
- package/dist/generators/method-schema.d.ts.map +1 -1
- package/dist/index.cjs +44 -315
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -318
- package/dist/index.js.map +1 -1
- package/dist/internals.cjs +44 -315
- package/dist/internals.cjs.map +1 -1
- package/dist/internals.js +47 -318
- package/dist/internals.js.map +1 -1
- package/dist/metadata/index.d.ts +1 -4
- package/dist/metadata/index.d.ts.map +1 -1
- package/dist/metadata/policy.d.ts +2 -6
- package/dist/metadata/policy.d.ts.map +1 -1
- package/dist/metadata/resolve.d.ts +3 -2
- package/dist/metadata/resolve.d.ts.map +1 -1
- package/dist/ui-schema/schema.d.ts +11 -28
- package/dist/ui-schema/schema.d.ts.map +1 -1
- package/package.json +6 -6
|
@@ -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
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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.
|
|
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
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
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
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
2706
|
+
function emit(outcome, result) {
|
|
2912
2707
|
if (!logsEnabled) {
|
|
2913
|
-
return
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
2993
|
-
return
|
|
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,
|
|
2999
|
-
const baseMessage = `Target "${targetLabel}": constraint "${tagName}" is only valid on ${
|
|
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
|
-
|
|
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,
|
|
3153
|
-
hostType: checker !== void 0 && options?.hostType !== void 0 ? checker.typeToString(options.hostType, node,
|
|
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
|