@typespec/compiler 0.47.0-dev.2 → 0.47.0-dev.20
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/manifest.js +2 -2
- package/dist/src/config/config-to-options.d.ts +31 -0
- package/dist/src/config/config-to-options.d.ts.map +1 -0
- package/dist/src/config/config-to-options.js +54 -0
- package/dist/src/config/config-to-options.js.map +1 -0
- package/dist/src/config/index.d.ts +1 -0
- package/dist/src/config/index.d.ts.map +1 -1
- package/dist/src/config/index.js +1 -0
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/core/checker.d.ts.map +1 -1
- package/dist/src/core/checker.js +253 -85
- package/dist/src/core/checker.js.map +1 -1
- package/dist/src/core/cli/actions/compile/args.d.ts +1 -0
- package/dist/src/core/cli/actions/compile/args.d.ts.map +1 -1
- package/dist/src/core/cli/actions/compile/args.js +31 -64
- package/dist/src/core/cli/actions/compile/args.js.map +1 -1
- package/dist/src/core/cli/actions/compile/compile.d.ts +2 -1
- package/dist/src/core/cli/actions/compile/compile.d.ts.map +1 -1
- package/dist/src/core/cli/actions/compile/compile.js +61 -54
- package/dist/src/core/cli/actions/compile/compile.js.map +1 -1
- package/dist/src/core/cli/actions/compile/watch.d.ts +15 -0
- package/dist/src/core/cli/actions/compile/watch.d.ts.map +1 -0
- package/dist/src/core/cli/actions/compile/watch.js +59 -0
- package/dist/src/core/cli/actions/compile/watch.js.map +1 -0
- package/dist/src/core/cli/actions/format.d.ts +2 -1
- package/dist/src/core/cli/actions/format.d.ts.map +1 -1
- package/dist/src/core/cli/actions/format.js +1 -1
- package/dist/src/core/cli/actions/format.js.map +1 -1
- package/dist/src/core/cli/actions/info.d.ts +2 -2
- package/dist/src/core/cli/actions/info.d.ts.map +1 -1
- package/dist/src/core/cli/actions/info.js +1 -7
- package/dist/src/core/cli/actions/info.js.map +1 -1
- package/dist/src/core/cli/actions/init.d.ts +3 -2
- package/dist/src/core/cli/actions/init.d.ts.map +1 -1
- package/dist/src/core/cli/actions/init.js +3 -6
- package/dist/src/core/cli/actions/init.js.map +1 -1
- package/dist/src/core/cli/actions/vs.d.ts +4 -2
- package/dist/src/core/cli/actions/vs.d.ts.map +1 -1
- package/dist/src/core/cli/actions/vs.js +38 -19
- package/dist/src/core/cli/actions/vs.js.map +1 -1
- package/dist/src/core/cli/actions/vscode.d.ts +10 -2
- package/dist/src/core/cli/actions/vscode.d.ts.map +1 -1
- package/dist/src/core/cli/actions/vscode.js +18 -20
- package/dist/src/core/cli/actions/vscode.js.map +1 -1
- package/dist/src/core/cli/cli.js +16 -13
- package/dist/src/core/cli/cli.js.map +1 -1
- package/dist/src/core/cli/install-vsix.d.ts +2 -1
- package/dist/src/core/cli/install-vsix.d.ts.map +1 -1
- package/dist/src/core/cli/install-vsix.js +5 -4
- package/dist/src/core/cli/install-vsix.js.map +1 -1
- package/dist/src/core/cli/types.d.ts +6 -0
- package/dist/src/core/cli/types.d.ts.map +1 -0
- package/dist/src/core/cli/types.js +2 -0
- package/dist/src/core/cli/types.js.map +1 -0
- package/dist/src/core/cli/utils.d.ts +12 -4
- package/dist/src/core/cli/utils.d.ts.map +1 -1
- package/dist/src/core/cli/utils.js +27 -6
- package/dist/src/core/cli/utils.js.map +1 -1
- package/dist/src/core/deprecation.d.ts +31 -0
- package/dist/src/core/deprecation.d.ts.map +1 -0
- package/dist/src/core/deprecation.js +48 -0
- package/dist/src/core/deprecation.js.map +1 -0
- package/dist/src/core/formatter-fs.js +4 -4
- package/dist/src/core/formatter-fs.js.map +1 -1
- package/dist/src/core/formatter.d.ts +3 -3
- package/dist/src/core/formatter.d.ts.map +1 -1
- package/dist/src/core/formatter.js +4 -4
- package/dist/src/core/formatter.js.map +1 -1
- package/dist/src/core/index.d.ts +1 -0
- package/dist/src/core/index.d.ts.map +1 -1
- package/dist/src/core/index.js +1 -0
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/core/install.d.ts +2 -1
- package/dist/src/core/install.d.ts.map +1 -1
- package/dist/src/core/install.js +3 -5
- package/dist/src/core/install.js.map +1 -1
- package/dist/src/core/messages.d.ts +102 -2
- package/dist/src/core/messages.d.ts.map +1 -1
- package/dist/src/core/messages.js +34 -0
- package/dist/src/core/messages.js.map +1 -1
- package/dist/src/core/module-resolver.d.ts.map +1 -1
- package/dist/src/core/module-resolver.js.map +1 -1
- package/dist/src/core/options.d.ts +4 -0
- package/dist/src/core/options.d.ts.map +1 -1
- package/dist/src/core/parser.d.ts.map +1 -1
- package/dist/src/core/parser.js +36 -9
- package/dist/src/core/parser.js.map +1 -1
- package/dist/src/core/program.d.ts.map +1 -1
- package/dist/src/core/program.js +2 -0
- package/dist/src/core/program.js.map +1 -1
- package/dist/src/core/types.d.ts +10 -2
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/core/types.js.map +1 -1
- package/dist/src/core/util.d.ts +1 -0
- package/dist/src/core/util.d.ts.map +1 -1
- package/dist/src/core/util.js +1 -0
- package/dist/src/core/util.js.map +1 -1
- package/dist/src/emitter-framework/asset-emitter.js +2 -2
- package/dist/src/emitter-framework/asset-emitter.js.map +1 -1
- package/dist/src/emitter-framework/builders/object-builder.d.ts.map +1 -1
- package/dist/src/emitter-framework/builders/object-builder.js +1 -0
- package/dist/src/emitter-framework/builders/object-builder.js.map +1 -1
- package/dist/src/emitter-framework/type-emitter.d.ts +5 -5
- package/dist/src/emitter-framework/type-emitter.d.ts.map +1 -1
- package/dist/src/emitter-framework/type-emitter.js +13 -13
- package/dist/src/emitter-framework/type-emitter.js.map +1 -1
- package/dist/src/emitter-framework/types.d.ts +1 -1
- package/dist/src/emitter-framework/types.d.ts.map +1 -1
- package/dist/src/emitter-framework/types.js.map +1 -1
- package/dist/src/formatter/index.d.ts +1 -1
- package/dist/src/formatter/index.d.ts.map +1 -1
- package/dist/src/formatter/parser.d.ts +2 -6
- package/dist/src/formatter/parser.d.ts.map +1 -1
- package/dist/src/formatter/parser.js +1 -1
- package/dist/src/formatter/parser.js.map +1 -1
- package/dist/src/formatter/print/comment-handler.d.ts +1 -1
- package/dist/src/formatter/print/comment-handler.d.ts.map +1 -1
- package/dist/src/formatter/print/comment-handler.js +1 -2
- package/dist/src/formatter/print/comment-handler.js.map +1 -1
- package/dist/src/formatter/print/needs-parens.d.ts +1 -1
- package/dist/src/formatter/print/needs-parens.d.ts.map +1 -1
- package/dist/src/formatter/print/needs-parens.js +1 -0
- package/dist/src/formatter/print/needs-parens.js.map +1 -1
- package/dist/src/formatter/print/printer.d.ts +41 -40
- package/dist/src/formatter/print/printer.d.ts.map +1 -1
- package/dist/src/formatter/print/printer.js +6 -4
- package/dist/src/formatter/print/printer.js.map +1 -1
- package/dist/src/formatter/print/types.d.ts +3 -3
- package/dist/src/formatter/print/types.d.ts.map +1 -1
- package/dist/src/formatter/print/util.d.ts +3 -0
- package/dist/src/formatter/print/util.d.ts.map +1 -0
- package/dist/src/formatter/print/util.js +3 -0
- package/dist/src/formatter/print/util.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/init-template.d.ts +19 -1
- package/dist/src/init/init-template.d.ts.map +1 -1
- package/dist/src/init/init-template.js +15 -1
- package/dist/src/init/init-template.js.map +1 -1
- package/dist/src/init/init.d.ts +4 -4
- package/dist/src/init/init.d.ts.map +1 -1
- package/dist/src/init/init.js +41 -12
- package/dist/src/init/init.js.map +1 -1
- package/dist/src/lib/decorators.d.ts +1 -7
- package/dist/src/lib/decorators.d.ts.map +1 -1
- package/dist/src/lib/decorators.js +4 -11
- package/dist/src/lib/decorators.js.map +1 -1
- package/dist/src/server/completion.d.ts.map +1 -1
- package/dist/src/server/completion.js +9 -5
- package/dist/src/server/completion.js.map +1 -1
- package/dist/src/server/serverlib.d.ts.map +1 -1
- package/dist/src/server/serverlib.js +4 -2
- package/dist/src/server/serverlib.js.map +1 -1
- package/dist/src/server/symbol-structure.d.ts.map +1 -1
- package/dist/src/server/symbol-structure.js +3 -1
- package/dist/src/server/symbol-structure.js.map +1 -1
- package/dist/src/testing/types.d.ts.map +1 -1
- package/dist/src/testing/types.js.map +1 -1
- package/lib/decorators.tsp +8 -2
- package/lib/lib.tsp +1 -1
- package/package.json +2 -4
package/dist/src/core/checker.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { $docFromComment,
|
|
1
|
+
import { $docFromComment, getIndexer } from "../lib/decorators.js";
|
|
2
2
|
import { createSymbol, createSymbolTable } from "./binder.js";
|
|
3
|
+
import { getDeprecationDetails, markDeprecated } from "./deprecation.js";
|
|
3
4
|
import { ProjectionError, compilerAssert, reportDeprecated } from "./diagnostics.js";
|
|
4
5
|
import { validateInheritanceDiscriminatedUnions } from "./helpers/discriminator-utils.js";
|
|
5
6
|
import { getNamespaceFullName, getTypeName } from "./helpers/index.js";
|
|
@@ -487,7 +488,6 @@ export function createChecker(program) {
|
|
|
487
488
|
return errorType;
|
|
488
489
|
}
|
|
489
490
|
const type = checkTypeReferenceSymbol(sym, node, mapper, instantiateTemplate);
|
|
490
|
-
checkDeprecated(type, node);
|
|
491
491
|
return type;
|
|
492
492
|
}
|
|
493
493
|
function resolveTypeReference(node) {
|
|
@@ -498,16 +498,23 @@ export function createChecker(program) {
|
|
|
498
498
|
onCheckerDiagnostic = oldDiagnosticHook;
|
|
499
499
|
return [type === errorType ? undefined : type, diagnostics];
|
|
500
500
|
}
|
|
501
|
-
function
|
|
502
|
-
const
|
|
503
|
-
if (
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
501
|
+
function copyDeprecation(sourceType, destType) {
|
|
502
|
+
const deprecationDetails = getDeprecationDetails(program, sourceType);
|
|
503
|
+
if (deprecationDetails) {
|
|
504
|
+
markDeprecated(program, destType, deprecationDetails);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
function checkDeprecated(type, node, target) {
|
|
508
|
+
if (node) {
|
|
509
|
+
const deprecationDetails = getDeprecationDetails(program, node);
|
|
510
|
+
if (deprecationDetails) {
|
|
511
|
+
reportDeprecation(program, target, deprecationDetails.message, reportCheckerDiagnostic);
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
const deprecationDetails = getDeprecationDetails(program, type);
|
|
516
|
+
if (deprecationDetails) {
|
|
517
|
+
reportDeprecation(program, target, deprecationDetails.message, reportCheckerDiagnostic);
|
|
511
518
|
}
|
|
512
519
|
}
|
|
513
520
|
function checkTypeReferenceArgs(node, mapper) {
|
|
@@ -665,6 +672,11 @@ export function createChecker(program) {
|
|
|
665
672
|
}
|
|
666
673
|
}
|
|
667
674
|
}
|
|
675
|
+
// Check for deprecations here, first on symbol, then on type.
|
|
676
|
+
const declarationNode = sym === null || sym === void 0 ? void 0 : sym.declarations[0];
|
|
677
|
+
if (declarationNode && mapper === undefined) {
|
|
678
|
+
checkDeprecated(baseType, declarationNode, node);
|
|
679
|
+
}
|
|
668
680
|
return baseType;
|
|
669
681
|
}
|
|
670
682
|
/**
|
|
@@ -1070,7 +1082,8 @@ export function createChecker(program) {
|
|
|
1070
1082
|
function checkOperation(node, mapper, parentInterface) {
|
|
1071
1083
|
var _a;
|
|
1072
1084
|
const inInterface = ((_a = node.parent) === null || _a === void 0 ? void 0 : _a.kind) === SyntaxKind.InterfaceStatement;
|
|
1073
|
-
const
|
|
1085
|
+
const symbol = inInterface ? getSymbolForMember(node) : node.symbol;
|
|
1086
|
+
const links = symbol && getSymbolLinks(symbol);
|
|
1074
1087
|
if (links) {
|
|
1075
1088
|
if (links.declaredType && mapper === undefined) {
|
|
1076
1089
|
// we're not instantiating this operation and we've already checked it
|
|
@@ -1080,6 +1093,7 @@ export function createChecker(program) {
|
|
|
1080
1093
|
if (mapper === undefined && inInterface) {
|
|
1081
1094
|
compilerAssert(parentInterface, "Operation in interface should already have been checked.");
|
|
1082
1095
|
}
|
|
1096
|
+
checkTemplateDeclaration(node, mapper);
|
|
1083
1097
|
// If we are instantating operation inside of interface
|
|
1084
1098
|
if (isTemplatedNode(node) && mapper !== undefined && parentInterface) {
|
|
1085
1099
|
mapper = { ...mapper, partial: true };
|
|
@@ -1096,8 +1110,19 @@ export function createChecker(program) {
|
|
|
1096
1110
|
return errorType;
|
|
1097
1111
|
}
|
|
1098
1112
|
sourceOperation = baseOperation;
|
|
1113
|
+
const parameterModelSym = getOrCreateAugmentedSymbolTable(symbol.metatypeMembers).get("parameters");
|
|
1099
1114
|
// Reference the same return type and create the parameters type
|
|
1100
|
-
|
|
1115
|
+
const clone = initializeClone(baseOperation.parameters, {
|
|
1116
|
+
properties: createRekeyableMap(),
|
|
1117
|
+
});
|
|
1118
|
+
clone.properties = createRekeyableMap(Array.from(baseOperation.parameters.properties.entries()).map(([key, prop]) => [
|
|
1119
|
+
key,
|
|
1120
|
+
cloneTypeForSymbol(getMemberSymbol(parameterModelSym, prop.name), prop, {
|
|
1121
|
+
model: clone,
|
|
1122
|
+
sourceProperty: prop,
|
|
1123
|
+
}),
|
|
1124
|
+
]));
|
|
1125
|
+
parameters = finishType(clone);
|
|
1101
1126
|
returnType = baseOperation.returnType;
|
|
1102
1127
|
// Copy decorators from the base operation, inserting the base decorators first
|
|
1103
1128
|
decorators = [...baseOperation.decorators];
|
|
@@ -1567,6 +1592,14 @@ export function createChecker(program) {
|
|
|
1567
1592
|
}
|
|
1568
1593
|
function resolveMetaProperty(node, base) {
|
|
1569
1594
|
const resolved = resolveIdentifierInTable(node.id, base.metatypeMembers);
|
|
1595
|
+
if (!resolved) {
|
|
1596
|
+
reportCheckerDiagnostic(createDiagnostic({
|
|
1597
|
+
code: "invalid-ref",
|
|
1598
|
+
messageId: "metaProperty",
|
|
1599
|
+
format: { kind: getMemberKindName(base.declarations[0]), id: node.id.sv },
|
|
1600
|
+
target: node,
|
|
1601
|
+
}));
|
|
1602
|
+
}
|
|
1570
1603
|
return resolved;
|
|
1571
1604
|
}
|
|
1572
1605
|
function getMemberKindName(node) {
|
|
@@ -1574,6 +1607,8 @@ export function createChecker(program) {
|
|
|
1574
1607
|
case SyntaxKind.ModelStatement:
|
|
1575
1608
|
case SyntaxKind.ModelExpression:
|
|
1576
1609
|
return "Model";
|
|
1610
|
+
case SyntaxKind.ModelProperty:
|
|
1611
|
+
return "ModelProperty";
|
|
1577
1612
|
case SyntaxKind.EnumStatement:
|
|
1578
1613
|
return "Enum";
|
|
1579
1614
|
case SyntaxKind.InterfaceStatement:
|
|
@@ -1672,6 +1707,19 @@ export function createChecker(program) {
|
|
|
1672
1707
|
getTypeForNode(statement, undefined);
|
|
1673
1708
|
}
|
|
1674
1709
|
}
|
|
1710
|
+
/**
|
|
1711
|
+
* Check that the given node template parameters are valid if applicable.
|
|
1712
|
+
* @param node Node with template parameters
|
|
1713
|
+
* @param mapper Type mapper, set if instantiating the template, undefined otherwise.
|
|
1714
|
+
*/
|
|
1715
|
+
function checkTemplateDeclaration(node, mapper) {
|
|
1716
|
+
// If mapper is undefined it means we are checking the declaration of the template.
|
|
1717
|
+
if (mapper === undefined) {
|
|
1718
|
+
for (const templateParameter of node.templateParameters) {
|
|
1719
|
+
checkTemplateParameterDeclaration(templateParameter, undefined);
|
|
1720
|
+
}
|
|
1721
|
+
}
|
|
1722
|
+
}
|
|
1675
1723
|
function checkModel(node, mapper) {
|
|
1676
1724
|
if (node.kind === SyntaxKind.ModelStatement) {
|
|
1677
1725
|
return checkModelStatement(node, mapper);
|
|
@@ -1687,6 +1735,7 @@ export function createChecker(program) {
|
|
|
1687
1735
|
// we're not instantiating this model and we've already checked it
|
|
1688
1736
|
return links.declaredType;
|
|
1689
1737
|
}
|
|
1738
|
+
checkTemplateDeclaration(node, mapper);
|
|
1690
1739
|
const decorators = [];
|
|
1691
1740
|
const type = createType({
|
|
1692
1741
|
kind: "Model",
|
|
@@ -1701,7 +1750,6 @@ export function createChecker(program) {
|
|
|
1701
1750
|
const isBase = checkModelIs(node, node.is, mapper);
|
|
1702
1751
|
if (isBase) {
|
|
1703
1752
|
type.sourceModel = isBase;
|
|
1704
|
-
checkDeprecated(isBase, node.is);
|
|
1705
1753
|
// copy decorators
|
|
1706
1754
|
decorators.push(...isBase.decorators);
|
|
1707
1755
|
if (isBase.indexer) {
|
|
@@ -1725,7 +1773,7 @@ export function createChecker(program) {
|
|
|
1725
1773
|
else if (node.extends) {
|
|
1726
1774
|
type.baseModel = checkClassHeritage(node, node.extends, mapper);
|
|
1727
1775
|
if (type.baseModel) {
|
|
1728
|
-
|
|
1776
|
+
copyDeprecation(type.baseModel, type);
|
|
1729
1777
|
}
|
|
1730
1778
|
}
|
|
1731
1779
|
if (type.baseModel) {
|
|
@@ -1738,13 +1786,6 @@ export function createChecker(program) {
|
|
|
1738
1786
|
}
|
|
1739
1787
|
// Evaluate the properties after
|
|
1740
1788
|
checkModelProperties(node, type.properties, type, mapper);
|
|
1741
|
-
for (const prop of walkPropertiesInherited(type)) {
|
|
1742
|
-
const table = getOrCreateAugmentedSymbolTable(node.symbol.members);
|
|
1743
|
-
const sym = table.get(prop.name);
|
|
1744
|
-
if (sym) {
|
|
1745
|
-
mutate(sym).type = prop;
|
|
1746
|
-
}
|
|
1747
|
-
}
|
|
1748
1789
|
linkMapper(type, mapper);
|
|
1749
1790
|
if (shouldCreateTypeForTemplate(node, mapper)) {
|
|
1750
1791
|
finishType(type);
|
|
@@ -1808,7 +1849,7 @@ export function createChecker(program) {
|
|
|
1808
1849
|
}
|
|
1809
1850
|
else {
|
|
1810
1851
|
// spread property
|
|
1811
|
-
const newProperties = checkSpreadProperty(prop.target, parentModel, mapper);
|
|
1852
|
+
const newProperties = checkSpreadProperty(node.symbol, prop.target, parentModel, mapper);
|
|
1812
1853
|
for (const newProp of newProperties) {
|
|
1813
1854
|
linkIndirectMember(node, newProp, mapper);
|
|
1814
1855
|
checkPropertyCompatibleWithIndexer(parentModel, newProp, prop);
|
|
@@ -1908,6 +1949,9 @@ export function createChecker(program) {
|
|
|
1908
1949
|
break;
|
|
1909
1950
|
case SyntaxKind.UnionStatement:
|
|
1910
1951
|
for (const variant of node.options.values()) {
|
|
1952
|
+
if (!variant.id) {
|
|
1953
|
+
continue;
|
|
1954
|
+
}
|
|
1911
1955
|
const name = variant.id.sv;
|
|
1912
1956
|
bindMember(name, variant, 1024 /* SymbolFlags.UnionVariant */);
|
|
1913
1957
|
}
|
|
@@ -1953,40 +1997,68 @@ export function createChecker(program) {
|
|
|
1953
1997
|
}
|
|
1954
1998
|
}
|
|
1955
1999
|
}
|
|
1956
|
-
function
|
|
2000
|
+
function copyMembersToContainer(targetContainerSym, table) {
|
|
1957
2001
|
var _a;
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
2002
|
+
const members = (_a = augmentedSymbolTables.get(table)) !== null && _a !== void 0 ? _a : table;
|
|
2003
|
+
compilerAssert(targetContainerSym.members, "containerSym.members is undefined");
|
|
2004
|
+
const containerMembers = getOrCreateAugmentedSymbolTable(targetContainerSym.members);
|
|
2005
|
+
for (const member of members.values()) {
|
|
2006
|
+
bindMemberToContainer(targetContainerSym, containerMembers, member.name, member.declarations[0], member.flags);
|
|
2007
|
+
}
|
|
2008
|
+
}
|
|
2009
|
+
function bindMemberToContainer(containerSym, containerMembers, name, node, kind) {
|
|
2010
|
+
const sym = createSymbol(node, name, kind, containerSym);
|
|
2011
|
+
compilerAssert(containerSym.members, "containerSym.members is undefined");
|
|
2012
|
+
containerMembers.set(name, sym);
|
|
2013
|
+
}
|
|
2014
|
+
function bindMetaTypes(node) {
|
|
2015
|
+
const visited = new Set();
|
|
2016
|
+
function visit(node, symbol) {
|
|
2017
|
+
var _a;
|
|
2018
|
+
if (visited.has(node)) {
|
|
2019
|
+
return;
|
|
1968
2020
|
}
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
2021
|
+
visited.add(node);
|
|
2022
|
+
switch (node.kind) {
|
|
2023
|
+
case SyntaxKind.ModelProperty: {
|
|
2024
|
+
const sym = getSymbolForMember(node);
|
|
2025
|
+
if (sym) {
|
|
2026
|
+
const table = getOrCreateAugmentedSymbolTable(sym.metatypeMembers);
|
|
2027
|
+
table.set("type", node.value.kind === SyntaxKind.TypeReference
|
|
2028
|
+
? createSymbol(node.value, "", 2048 /* SymbolFlags.Alias */)
|
|
2029
|
+
: node.value.symbol);
|
|
2030
|
+
}
|
|
2031
|
+
break;
|
|
1975
2032
|
}
|
|
1976
|
-
|
|
1977
|
-
const
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
table.set("parameters",
|
|
1981
|
-
table.set("returnType",
|
|
2033
|
+
case SyntaxKind.OperationStatement: {
|
|
2034
|
+
const sym = (_a = symbol !== null && symbol !== void 0 ? symbol : node.symbol) !== null && _a !== void 0 ? _a : getSymbolForMember(node);
|
|
2035
|
+
const table = getOrCreateAugmentedSymbolTable(sym.metatypeMembers);
|
|
2036
|
+
if (node.signature.kind === SyntaxKind.OperationSignatureDeclaration) {
|
|
2037
|
+
table.set("parameters", node.signature.parameters.symbol);
|
|
2038
|
+
table.set("returnType", node.signature.returnType.symbol);
|
|
2039
|
+
}
|
|
2040
|
+
else {
|
|
2041
|
+
const sig = resolveTypeReferenceSym(node.signature.baseOperation, undefined);
|
|
2042
|
+
if (sig) {
|
|
2043
|
+
visit(sig.declarations[0], sig);
|
|
2044
|
+
const sigTable = getOrCreateAugmentedSymbolTable(sig.metatypeMembers);
|
|
2045
|
+
const sigParameterSym = sigTable.get("parameters");
|
|
2046
|
+
if (sigParameterSym !== undefined) {
|
|
2047
|
+
const parametersSym = createSymbol(sigParameterSym.declarations[0], "parameters", 2 /* SymbolFlags.Model */ & 674 /* SymbolFlags.MemberContainer */);
|
|
2048
|
+
copyMembersToContainer(parametersSym, sigParameterSym.members);
|
|
2049
|
+
table.set("parameters", parametersSym);
|
|
2050
|
+
table.set("returnType", sigTable.get("returnType"));
|
|
2051
|
+
}
|
|
2052
|
+
}
|
|
1982
2053
|
}
|
|
2054
|
+
break;
|
|
1983
2055
|
}
|
|
1984
|
-
break;
|
|
1985
2056
|
}
|
|
2057
|
+
visitChildren(node, (child) => {
|
|
2058
|
+
bindMetaTypes(child);
|
|
2059
|
+
});
|
|
1986
2060
|
}
|
|
1987
|
-
|
|
1988
|
-
bindMetaTypes(child);
|
|
1989
|
-
});
|
|
2061
|
+
visit(node);
|
|
1990
2062
|
}
|
|
1991
2063
|
/**
|
|
1992
2064
|
* Initializes a late bound symbol for the type. This is generally necessary when attempting to
|
|
@@ -2148,7 +2220,7 @@ export function createChecker(program) {
|
|
|
2148
2220
|
}
|
|
2149
2221
|
return isType;
|
|
2150
2222
|
}
|
|
2151
|
-
function checkSpreadProperty(targetNode, parentModel, mapper) {
|
|
2223
|
+
function checkSpreadProperty(parentModelSym, targetNode, parentModel, mapper) {
|
|
2152
2224
|
const targetType = getTypeForNode(targetNode, mapper);
|
|
2153
2225
|
if (targetType.kind === "TemplateParameter" || isErrorType(targetType)) {
|
|
2154
2226
|
return [];
|
|
@@ -2160,7 +2232,8 @@ export function createChecker(program) {
|
|
|
2160
2232
|
const props = [];
|
|
2161
2233
|
// copy each property
|
|
2162
2234
|
for (const prop of walkPropertiesInherited(targetType)) {
|
|
2163
|
-
|
|
2235
|
+
const memberSym = getMemberSymbol(parentModelSym, prop.name);
|
|
2236
|
+
props.push(cloneTypeForSymbol(memberSym, prop, {
|
|
2164
2237
|
sourceProperty: prop,
|
|
2165
2238
|
model: parentModel,
|
|
2166
2239
|
}));
|
|
@@ -2393,6 +2466,18 @@ export function createChecker(program) {
|
|
|
2393
2466
|
}
|
|
2394
2467
|
return valid;
|
|
2395
2468
|
}
|
|
2469
|
+
function checkAugmentDecorators(sym, targetType, mapper) {
|
|
2470
|
+
var _a;
|
|
2471
|
+
const augmentDecoratorNodes = (_a = augmentDecoratorsForSym.get(sym)) !== null && _a !== void 0 ? _a : [];
|
|
2472
|
+
const decorators = [];
|
|
2473
|
+
for (const decNode of augmentDecoratorNodes) {
|
|
2474
|
+
const decorator = checkDecorator(targetType, decNode, mapper);
|
|
2475
|
+
if (decorator) {
|
|
2476
|
+
decorators.unshift(decorator);
|
|
2477
|
+
}
|
|
2478
|
+
}
|
|
2479
|
+
return decorators;
|
|
2480
|
+
}
|
|
2396
2481
|
function checkDecorators(targetType, node, mapper) {
|
|
2397
2482
|
var _a, _b;
|
|
2398
2483
|
const sym = isMemberNode(node) ? (_a = getSymbolForMember(node)) !== null && _a !== void 0 ? _a : node.symbol : node.symbol;
|
|
@@ -2413,7 +2498,7 @@ export function createChecker(program) {
|
|
|
2413
2498
|
if (docComment) {
|
|
2414
2499
|
decorators.unshift({
|
|
2415
2500
|
decorator: $docFromComment,
|
|
2416
|
-
args: [{ value:
|
|
2501
|
+
args: [{ value: createLiteralType(docComment), jsValue: docComment }],
|
|
2417
2502
|
});
|
|
2418
2503
|
}
|
|
2419
2504
|
return decorators;
|
|
@@ -2435,6 +2520,7 @@ export function createChecker(program) {
|
|
|
2435
2520
|
// we're not instantiating this model and we've already checked it
|
|
2436
2521
|
return links.declaredType;
|
|
2437
2522
|
}
|
|
2523
|
+
checkTemplateDeclaration(node, mapper);
|
|
2438
2524
|
const decorators = [];
|
|
2439
2525
|
const type = createType({
|
|
2440
2526
|
kind: "Scalar",
|
|
@@ -2448,7 +2534,7 @@ export function createChecker(program) {
|
|
|
2448
2534
|
if (node.extends) {
|
|
2449
2535
|
type.baseScalar = checkScalarExtends(node, node.extends, mapper);
|
|
2450
2536
|
if (type.baseScalar) {
|
|
2451
|
-
|
|
2537
|
+
copyDeprecation(type.baseScalar, type);
|
|
2452
2538
|
type.baseScalar.derivedScalars.push(type);
|
|
2453
2539
|
}
|
|
2454
2540
|
}
|
|
@@ -2499,6 +2585,7 @@ export function createChecker(program) {
|
|
|
2499
2585
|
if (links.declaredType && mapper === undefined) {
|
|
2500
2586
|
return links.declaredType;
|
|
2501
2587
|
}
|
|
2588
|
+
checkTemplateDeclaration(node, mapper);
|
|
2502
2589
|
const aliasSymId = getNodeSymId(node);
|
|
2503
2590
|
if (pendingResolutions.has(aliasSymId)) {
|
|
2504
2591
|
if (mapper === undefined) {
|
|
@@ -2544,7 +2631,7 @@ export function createChecker(program) {
|
|
|
2544
2631
|
enumType.members.set(memberType.name, memberType);
|
|
2545
2632
|
}
|
|
2546
2633
|
else {
|
|
2547
|
-
const members = checkEnumSpreadMember(enumType, member.target, mapper, memberNames);
|
|
2634
|
+
const members = checkEnumSpreadMember(node.symbol, enumType, member.target, mapper, memberNames);
|
|
2548
2635
|
for (const memberType of members) {
|
|
2549
2636
|
linkIndirectMember(node, memberType, mapper);
|
|
2550
2637
|
enumType.members.set(memberType.name, memberType);
|
|
@@ -2567,6 +2654,7 @@ export function createChecker(program) {
|
|
|
2567
2654
|
// we're not instantiating this interface and we've already checked it
|
|
2568
2655
|
return links.declaredType;
|
|
2569
2656
|
}
|
|
2657
|
+
checkTemplateDeclaration(node, mapper);
|
|
2570
2658
|
const interfaceType = createType({
|
|
2571
2659
|
kind: "Interface",
|
|
2572
2660
|
decorators: [],
|
|
@@ -2593,11 +2681,15 @@ export function createChecker(program) {
|
|
|
2593
2681
|
target: extendsNode,
|
|
2594
2682
|
}));
|
|
2595
2683
|
}
|
|
2596
|
-
const newMember =
|
|
2684
|
+
const newMember = cloneTypeForSymbol(getMemberSymbol(node.symbol, member.name), member, {
|
|
2685
|
+
interface: interfaceType,
|
|
2686
|
+
});
|
|
2597
2687
|
// Don't link it it is overritten
|
|
2598
2688
|
if (!ownMembers.has(member.name)) {
|
|
2599
2689
|
linkIndirectMember(node, newMember, mapper);
|
|
2600
2690
|
}
|
|
2691
|
+
// Clone deprecation information
|
|
2692
|
+
copyDeprecation(member, newMember);
|
|
2601
2693
|
interfaceType.operations.set(newMember.name, newMember);
|
|
2602
2694
|
}
|
|
2603
2695
|
interfaceType.sourceInterfaces.push(extendsType);
|
|
@@ -2639,6 +2731,7 @@ export function createChecker(program) {
|
|
|
2639
2731
|
// we're not instantiating this union and we've already checked it
|
|
2640
2732
|
return links.declaredType;
|
|
2641
2733
|
}
|
|
2734
|
+
checkTemplateDeclaration(node, mapper);
|
|
2642
2735
|
const variants = createRekeyableMap();
|
|
2643
2736
|
const unionType = createType({
|
|
2644
2737
|
kind: "Union",
|
|
@@ -2685,7 +2778,7 @@ export function createChecker(program) {
|
|
|
2685
2778
|
// we're not instantiating this union variant and we've already checked it
|
|
2686
2779
|
return links.declaredType;
|
|
2687
2780
|
}
|
|
2688
|
-
const name = variantNode.id.sv;
|
|
2781
|
+
const name = variantNode.id ? variantNode.id.sv : Symbol("name");
|
|
2689
2782
|
const type = getTypeForNode(variantNode.value, mapper);
|
|
2690
2783
|
const variantType = createType({
|
|
2691
2784
|
kind: "UnionVariant",
|
|
@@ -2711,8 +2804,14 @@ export function createChecker(program) {
|
|
|
2711
2804
|
node.kind === SyntaxKind.OperationStatement ||
|
|
2712
2805
|
node.kind === SyntaxKind.UnionVariant);
|
|
2713
2806
|
}
|
|
2807
|
+
function getMemberSymbol(parentSym, name) {
|
|
2808
|
+
return parentSym ? getOrCreateAugmentedSymbolTable(parentSym.members).get(name) : undefined;
|
|
2809
|
+
}
|
|
2714
2810
|
function getSymbolForMember(node) {
|
|
2715
2811
|
var _a;
|
|
2812
|
+
if (!node.id) {
|
|
2813
|
+
return undefined;
|
|
2814
|
+
}
|
|
2716
2815
|
const name = node.id.sv;
|
|
2717
2816
|
const parentSym = (_a = node.parent) === null || _a === void 0 ? void 0 : _a.symbol;
|
|
2718
2817
|
return parentSym ? getOrCreateAugmentedSymbolTable(parentSym.members).get(name) : undefined;
|
|
@@ -2743,7 +2842,7 @@ export function createChecker(program) {
|
|
|
2743
2842
|
member.decorators = checkDecorators(member, node, mapper);
|
|
2744
2843
|
return finishType(member);
|
|
2745
2844
|
}
|
|
2746
|
-
function checkEnumSpreadMember(parentEnum, targetNode, mapper, existingMemberNames) {
|
|
2845
|
+
function checkEnumSpreadMember(parentEnumSym, parentEnum, targetNode, mapper, existingMemberNames) {
|
|
2747
2846
|
const members = [];
|
|
2748
2847
|
const targetType = getTypeForNode(targetNode, mapper);
|
|
2749
2848
|
if (!isErrorType(targetType)) {
|
|
@@ -2761,7 +2860,8 @@ export function createChecker(program) {
|
|
|
2761
2860
|
}
|
|
2762
2861
|
else {
|
|
2763
2862
|
existingMemberNames.add(member.name);
|
|
2764
|
-
const
|
|
2863
|
+
const memberSym = getMemberSymbol(parentEnumSym, member.name);
|
|
2864
|
+
const clonedMember = cloneTypeForSymbol(memberSym, member, {
|
|
2765
2865
|
enum: parentEnum,
|
|
2766
2866
|
sourceMember: member,
|
|
2767
2867
|
});
|
|
@@ -2773,6 +2873,29 @@ export function createChecker(program) {
|
|
|
2773
2873
|
}
|
|
2774
2874
|
return members;
|
|
2775
2875
|
}
|
|
2876
|
+
function checkDirectives(node, type) {
|
|
2877
|
+
var _a;
|
|
2878
|
+
let hasDeprecation = false;
|
|
2879
|
+
((_a = node.directives) !== null && _a !== void 0 ? _a : []).forEach((directive) => {
|
|
2880
|
+
if (directive.target.sv === "deprecated") {
|
|
2881
|
+
if (directive.arguments[0].kind !== SyntaxKind.StringLiteral) {
|
|
2882
|
+
reportCheckerDiagnostic(createDiagnostic({
|
|
2883
|
+
code: "invalid-deprecation-argument",
|
|
2884
|
+
target: directive.arguments[0],
|
|
2885
|
+
}));
|
|
2886
|
+
}
|
|
2887
|
+
if (hasDeprecation === true) {
|
|
2888
|
+
reportCheckerDiagnostic(createDiagnostic({ code: "duplicate-deprecation", target: node }));
|
|
2889
|
+
}
|
|
2890
|
+
else {
|
|
2891
|
+
hasDeprecation = true;
|
|
2892
|
+
markDeprecated(program, type, {
|
|
2893
|
+
message: directive.arguments[0].value,
|
|
2894
|
+
});
|
|
2895
|
+
}
|
|
2896
|
+
}
|
|
2897
|
+
});
|
|
2898
|
+
}
|
|
2776
2899
|
// the types here aren't ideal and could probably be refactored.
|
|
2777
2900
|
function createAndFinishType(typeDef) {
|
|
2778
2901
|
createType(typeDef);
|
|
@@ -2786,7 +2909,13 @@ export function createChecker(program) {
|
|
|
2786
2909
|
function createType(typeDef) {
|
|
2787
2910
|
Object.setPrototypeOf(typeDef, typePrototype);
|
|
2788
2911
|
typeDef.isFinished = false;
|
|
2789
|
-
|
|
2912
|
+
// If the type has an associated syntax node, check any directives that
|
|
2913
|
+
// might be attached.
|
|
2914
|
+
const createdType = typeDef;
|
|
2915
|
+
if (createdType.node) {
|
|
2916
|
+
checkDirectives(createdType.node, createdType);
|
|
2917
|
+
}
|
|
2918
|
+
return createdType;
|
|
2790
2919
|
}
|
|
2791
2920
|
function finishType(typeDef) {
|
|
2792
2921
|
return finishTypeForProgramAndChecker(program, typePrototype, typeDef);
|
|
@@ -2921,23 +3050,7 @@ export function createChecker(program) {
|
|
|
2921
3050
|
getSymbolLinks(globalNamespaceNode.symbol).type = type;
|
|
2922
3051
|
return type;
|
|
2923
3052
|
}
|
|
2924
|
-
|
|
2925
|
-
* Clone a type, resulting in an identical type with all the same decorators
|
|
2926
|
-
* applied. Decorators are re-run on the clone to achieve this.
|
|
2927
|
-
*
|
|
2928
|
-
* Care is taken to clone nested data structures that are part of the type.
|
|
2929
|
-
* Any type with e.g. a map or an array property must recreate the map or array
|
|
2930
|
-
* so that clones don't share the same object.
|
|
2931
|
-
*
|
|
2932
|
-
* For types which have sub-types that are part of it, e.g. enums with members,
|
|
2933
|
-
* unions with variants, or models with properties, the sub-types are cloned
|
|
2934
|
-
* as well.
|
|
2935
|
-
*
|
|
2936
|
-
* If the entire type graph needs to be cloned, then cloneType must be called
|
|
2937
|
-
* recursively by the caller.
|
|
2938
|
-
*/
|
|
2939
|
-
function cloneType(type, additionalProps = {}) {
|
|
2940
|
-
// TODO: this needs to handle other types
|
|
3053
|
+
function initializeClone(type, additionalProps) {
|
|
2941
3054
|
let clone;
|
|
2942
3055
|
switch (type.kind) {
|
|
2943
3056
|
case "Model":
|
|
@@ -2953,7 +3066,7 @@ export function createChecker(program) {
|
|
|
2953
3066
|
cloneType(prop, { model: newModel }),
|
|
2954
3067
|
]));
|
|
2955
3068
|
}
|
|
2956
|
-
clone =
|
|
3069
|
+
clone = newModel;
|
|
2957
3070
|
break;
|
|
2958
3071
|
case "Union":
|
|
2959
3072
|
const newUnion = createType({
|
|
@@ -2971,7 +3084,7 @@ export function createChecker(program) {
|
|
|
2971
3084
|
cloneType(prop, { union: newUnion }),
|
|
2972
3085
|
]));
|
|
2973
3086
|
}
|
|
2974
|
-
clone =
|
|
3087
|
+
clone = newUnion;
|
|
2975
3088
|
break;
|
|
2976
3089
|
case "Interface":
|
|
2977
3090
|
const newInterface = createType({
|
|
@@ -2986,7 +3099,7 @@ export function createChecker(program) {
|
|
|
2986
3099
|
cloneType(prop, { interface: newInterface }),
|
|
2987
3100
|
]));
|
|
2988
3101
|
}
|
|
2989
|
-
clone =
|
|
3102
|
+
clone = newInterface;
|
|
2990
3103
|
break;
|
|
2991
3104
|
case "Enum":
|
|
2992
3105
|
const newEnum = createType({
|
|
@@ -3001,16 +3114,35 @@ export function createChecker(program) {
|
|
|
3001
3114
|
cloneType(prop, { enum: newEnum }),
|
|
3002
3115
|
]));
|
|
3003
3116
|
}
|
|
3004
|
-
clone =
|
|
3117
|
+
clone = newEnum;
|
|
3005
3118
|
break;
|
|
3006
3119
|
default:
|
|
3007
|
-
clone =
|
|
3120
|
+
clone = createType({
|
|
3008
3121
|
...type,
|
|
3009
3122
|
...("decorators" in type ? { decorators: [...type.decorators] } : {}),
|
|
3010
3123
|
...additionalProps,
|
|
3011
3124
|
});
|
|
3012
3125
|
break;
|
|
3013
3126
|
}
|
|
3127
|
+
return clone;
|
|
3128
|
+
}
|
|
3129
|
+
/**
|
|
3130
|
+
* Clone a type, resulting in an identical type with all the same decorators
|
|
3131
|
+
* applied. Decorators are re-run on the clone to achieve this.
|
|
3132
|
+
*
|
|
3133
|
+
* Care is taken to clone nested data structures that are part of the type.
|
|
3134
|
+
* Any type with e.g. a map or an array property must recreate the map or array
|
|
3135
|
+
* so that clones don't share the same object.
|
|
3136
|
+
*
|
|
3137
|
+
* For types which have sub-types that are part of it, e.g. enums with members,
|
|
3138
|
+
* unions with variants, or models with properties, the sub-types are cloned
|
|
3139
|
+
* as well.
|
|
3140
|
+
*
|
|
3141
|
+
* If the entire type graph needs to be cloned, then cloneType must be called
|
|
3142
|
+
* recursively by the caller.
|
|
3143
|
+
*/
|
|
3144
|
+
function cloneType(type, additionalProps = {}) {
|
|
3145
|
+
const clone = finishType(initializeClone(type, additionalProps));
|
|
3014
3146
|
const projection = projectionsByType.get(type);
|
|
3015
3147
|
if (projection) {
|
|
3016
3148
|
projectionsByType.set(clone, projection);
|
|
@@ -3018,6 +3150,24 @@ export function createChecker(program) {
|
|
|
3018
3150
|
compilerAssert(clone.kind === type.kind, "cloneType must not change type kind");
|
|
3019
3151
|
return clone;
|
|
3020
3152
|
}
|
|
3153
|
+
/**
|
|
3154
|
+
* Clone a type linking to the given symbol.
|
|
3155
|
+
* @param sym Symbol which to associate the clone
|
|
3156
|
+
* @param type Type to clone
|
|
3157
|
+
* @param additionalProps Additional properties to set/override on the clone
|
|
3158
|
+
* @returns cloned type
|
|
3159
|
+
*/
|
|
3160
|
+
function cloneTypeForSymbol(sym, type, additionalProps = {}) {
|
|
3161
|
+
let clone = initializeClone(type, additionalProps);
|
|
3162
|
+
if ("decorators" in clone) {
|
|
3163
|
+
for (const dec of checkAugmentDecorators(sym, clone, undefined)) {
|
|
3164
|
+
clone.decorators.push(dec);
|
|
3165
|
+
}
|
|
3166
|
+
}
|
|
3167
|
+
clone = finishType(clone);
|
|
3168
|
+
compilerAssert(clone.kind === type.kind, "cloneType must not change type kind");
|
|
3169
|
+
return clone;
|
|
3170
|
+
}
|
|
3021
3171
|
function checkProjectionDeclaration(node) {
|
|
3022
3172
|
// todo: check for duplicate projection decls on individual types
|
|
3023
3173
|
// right now you can declare the same projection on a specific type
|
|
@@ -4250,8 +4400,19 @@ function finishTypeForProgramAndChecker(program, typePrototype, typeDef) {
|
|
|
4250
4400
|
typeDef.isFinished = true;
|
|
4251
4401
|
return typeDef;
|
|
4252
4402
|
}
|
|
4403
|
+
function reportDeprecation(program, target, message, reportFunc) {
|
|
4404
|
+
if (program.compilerOptions.ignoreDeprecated !== true) {
|
|
4405
|
+
reportFunc(createDiagnostic({
|
|
4406
|
+
code: "deprecated",
|
|
4407
|
+
format: {
|
|
4408
|
+
message,
|
|
4409
|
+
},
|
|
4410
|
+
target,
|
|
4411
|
+
}));
|
|
4412
|
+
}
|
|
4413
|
+
}
|
|
4253
4414
|
function applyDecoratorToType(program, decApp, target) {
|
|
4254
|
-
var _a;
|
|
4415
|
+
var _a, _b;
|
|
4255
4416
|
compilerAssert("decorators" in target, "Cannot apply decorator to non-decoratable type", target);
|
|
4256
4417
|
for (const arg of decApp.args) {
|
|
4257
4418
|
if (isErrorType(arg.value)) {
|
|
@@ -4259,6 +4420,13 @@ function applyDecoratorToType(program, decApp, target) {
|
|
|
4259
4420
|
return;
|
|
4260
4421
|
}
|
|
4261
4422
|
}
|
|
4423
|
+
// Is the decorator definition deprecated?
|
|
4424
|
+
if (decApp.definition) {
|
|
4425
|
+
const deprecation = getDeprecationDetails(program, decApp.definition);
|
|
4426
|
+
if (deprecation !== undefined) {
|
|
4427
|
+
reportDeprecation(program, (_a = decApp.node) !== null && _a !== void 0 ? _a : target, deprecation.message, program.reportDiagnostic);
|
|
4428
|
+
}
|
|
4429
|
+
}
|
|
4262
4430
|
// peel `fn` off to avoid setting `this`.
|
|
4263
4431
|
try {
|
|
4264
4432
|
const args = decApp.args.map((x) => x.jsValue);
|
|
@@ -4272,7 +4440,7 @@ function applyDecoratorToType(program, decApp, target) {
|
|
|
4272
4440
|
program.reportDiagnostic(createDiagnostic({
|
|
4273
4441
|
code: "decorator-fail",
|
|
4274
4442
|
format: { decoratorName: decApp.decorator.name, error: error.stack },
|
|
4275
|
-
target: (
|
|
4443
|
+
target: (_b = decApp.node) !== null && _b !== void 0 ? _b : target,
|
|
4276
4444
|
}));
|
|
4277
4445
|
}
|
|
4278
4446
|
else {
|