);
return updated;
}
function visitArrowFunction(node) {
const updated = factory2.updateArrowFunction(
node,
visitNodes2(node.modifiers, modifierVisitor, isModifier),
/*typeParameters*/
void 0,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
node.equalsGreaterThanToken,
visitFunctionBody(node.body, visitor, context)
);
return updated;
}
function visitParameter(node) {
if (parameterIsThisKeyword(node)) {
return void 0;
}
const updated = factory2.updateParameterDeclaration(
node,
visitNodes2(node.modifiers, (node2) => isDecorator(node2) ? visitor(node2) : void 0, isModifierLike),
node.dotDotDotToken,
Debug.checkDefined(visitNode(node.name, visitor, isBindingName)),
/*questionToken*/
void 0,
/*type*/
void 0,
visitNode(node.initializer, visitor, isExpression)
);
if (updated !== node) {
setCommentRange(updated, node);
setTextRange(updated, moveRangePastModifiers(node));
setSourceMapRange(updated, moveRangePastModifiers(node));
setEmitFlags(updated.name, 64 /* NoTrailingSourceMap */);
}
return updated;
}
function visitVariableStatement(node) {
if (isExportOfNamespace(node)) {
const variables = getInitializedVariables(node.declarationList);
if (variables.length === 0) {
return void 0;
}
return setTextRange(
factory2.createExpressionStatement(
factory2.inlineExpressions(
map(variables, transformInitializedVariable)
)
),
node
);
} else {
return visitEachChild(node, visitor, context);
}
}
function transformInitializedVariable(node) {
const name = node.name;
if (isBindingPattern(name)) {
return flattenDestructuringAssignment(
node,
visitor,
context,
0 /* All */,
/*needsValue*/
false,
createNamespaceExportExpression
);
} else {
return setTextRange(
factory2.createAssignment(
getNamespaceMemberNameWithSourceMapsAndWithoutComments(name),
Debug.checkDefined(visitNode(node.initializer, visitor, isExpression))
),
/*location*/
node
);
}
}
function visitVariableDeclaration(node) {
const updated = factory2.updateVariableDeclaration(
node,
Debug.checkDefined(visitNode(node.name, visitor, isBindingName)),
/*exclamationToken*/
void 0,
/*type*/
void 0,
visitNode(node.initializer, visitor, isExpression)
);
if (node.type) {
setTypeNode(updated.name, node.type);
}
return updated;
}
function visitParenthesizedExpression(node) {
const innerExpression = skipOuterExpressions(node.expression, ~6 /* Assertions */);
if (isAssertionExpression(innerExpression)) {
const expression = visitNode(node.expression, visitor, isExpression);
Debug.assert(expression);
return factory2.createPartiallyEmittedExpression(expression, node);
}
return visitEachChild(node, visitor, context);
}
function visitAssertionExpression(node) {
const expression = visitNode(node.expression, visitor, isExpression);
Debug.assert(expression);
return factory2.createPartiallyEmittedExpression(expression, node);
}
function visitNonNullExpression(node) {
const expression = visitNode(node.expression, visitor, isLeftHandSideExpression);
Debug.assert(expression);
return factory2.createPartiallyEmittedExpression(expression, node);
}
function visitSatisfiesExpression(node) {
const expression = visitNode(node.expression, visitor, isExpression);
Debug.assert(expression);
return factory2.createPartiallyEmittedExpression(expression, node);
}
function visitCallExpression(node) {
return factory2.updateCallExpression(
node,
Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
/*typeArguments*/
void 0,
visitNodes2(node.arguments, visitor, isExpression)
);
}
function visitNewExpression(node) {
return factory2.updateNewExpression(
node,
Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
/*typeArguments*/
void 0,
visitNodes2(node.arguments, visitor, isExpression)
);
}
function visitTaggedTemplateExpression(node) {
return factory2.updateTaggedTemplateExpression(
node,
Debug.checkDefined(visitNode(node.tag, visitor, isExpression)),
/*typeArguments*/
void 0,
Debug.checkDefined(visitNode(node.template, visitor, isTemplateLiteral))
);
}
function visitJsxSelfClosingElement(node) {
return factory2.updateJsxSelfClosingElement(
node,
Debug.checkDefined(visitNode(node.tagName, visitor, isJsxTagNameExpression)),
/*typeArguments*/
void 0,
Debug.checkDefined(visitNode(node.attributes, visitor, isJsxAttributes))
);
}
function visitJsxJsxOpeningElement(node) {
return factory2.updateJsxOpeningElement(
node,
Debug.checkDefined(visitNode(node.tagName, visitor, isJsxTagNameExpression)),
/*typeArguments*/
void 0,
Debug.checkDefined(visitNode(node.attributes, visitor, isJsxAttributes))
);
}
function shouldEmitEnumDeclaration(node) {
return !isEnumConst(node) || shouldPreserveConstEnums(compilerOptions);
}
function visitEnumDeclaration(node) {
if (!shouldEmitEnumDeclaration(node)) {
return factory2.createNotEmittedStatement(node);
}
const statements = [];
let emitFlags = 4 /* AdviseOnEmitNode */;
const varAdded = addVarForEnumOrModuleDeclaration(statements, node);
if (varAdded) {
if (moduleKind !== 4 /* System */ || currentLexicalScope !== currentSourceFile) {
emitFlags |= 1024 /* NoLeadingComments */;
}
}
const parameterName = getNamespaceParameterName(node);
const containerName = getNamespaceContainerName(node);
const exportName = isExportOfNamespace(node) ? factory2.getExternalModuleOrNamespaceExportName(
currentNamespaceContainerName,
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
) : factory2.getDeclarationName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
);
let moduleArg = factory2.createLogicalOr(
exportName,
factory2.createAssignment(
exportName,
factory2.createObjectLiteralExpression()
)
);
if (isExportOfNamespace(node)) {
const localName = factory2.getLocalName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
);
moduleArg = factory2.createAssignment(localName, moduleArg);
}
const enumStatement = factory2.createExpressionStatement(
factory2.createCallExpression(
factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
[factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
parameterName
)],
/*type*/
void 0,
transformEnumBody(node, containerName)
),
/*typeArguments*/
void 0,
[moduleArg]
)
);
setOriginalNode(enumStatement, node);
if (varAdded) {
setSyntheticLeadingComments(enumStatement, void 0);
setSyntheticTrailingComments(enumStatement, void 0);
}
setTextRange(enumStatement, node);
addEmitFlags(enumStatement, emitFlags);
statements.push(enumStatement);
return statements;
}
function transformEnumBody(node, localName) {
const savedCurrentNamespaceLocalName = currentNamespaceContainerName;
currentNamespaceContainerName = localName;
const statements = [];
startLexicalEnvironment();
const members = map(node.members, transformEnumMember);
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
addRange(statements, members);
currentNamespaceContainerName = savedCurrentNamespaceLocalName;
return factory2.createBlock(
setTextRange(
factory2.createNodeArray(statements),
/*location*/
node.members
),
/*multiLine*/
true
);
}
function transformEnumMember(member) {
const name = getExpressionForPropertyName(
member,
/*generateNameForComputedPropertyName*/
false
);
const valueExpression = transformEnumMemberDeclarationValue(member);
const innerAssignment = factory2.createAssignment(
factory2.createElementAccessExpression(
currentNamespaceContainerName,
name
),
valueExpression
);
const outerAssignment = valueExpression.kind === 11 /* StringLiteral */ ? innerAssignment : factory2.createAssignment(
factory2.createElementAccessExpression(
currentNamespaceContainerName,
innerAssignment
),
name
);
return setTextRange(
factory2.createExpressionStatement(
setTextRange(
outerAssignment,
member
)
),
member
);
}
function transformEnumMemberDeclarationValue(member) {
const value = resolver.getConstantValue(member);
if (value !== void 0) {
return typeof value === "string" ? factory2.createStringLiteral(value) : factory2.createNumericLiteral(value);
} else {
enableSubstitutionForNonQualifiedEnumMembers();
if (member.initializer) {
return Debug.checkDefined(visitNode(member.initializer, visitor, isExpression));
} else {
return factory2.createVoidZero();
}
}
}
function shouldEmitModuleDeclaration(nodeIn) {
const node = getParseTreeNode(nodeIn, isModuleDeclaration);
if (!node) {
return true;
}
return isInstantiatedModule(node, shouldPreserveConstEnums(compilerOptions));
}
function recordEmittedDeclarationInScope(node) {
if (!currentScopeFirstDeclarationsOfName) {
currentScopeFirstDeclarationsOfName = /* @__PURE__ */ new Map();
}
const name = declaredNameInScope(node);
if (!currentScopeFirstDeclarationsOfName.has(name)) {
currentScopeFirstDeclarationsOfName.set(name, node);
}
}
function isFirstEmittedDeclarationInScope(node) {
if (currentScopeFirstDeclarationsOfName) {
const name = declaredNameInScope(node);
return currentScopeFirstDeclarationsOfName.get(name) === node;
}
return true;
}
function declaredNameInScope(node) {
Debug.assertNode(node.name, isIdentifier);
return node.name.escapedText;
}
function addVarForEnumOrModuleDeclaration(statements, node) {
const varDecl = factory2.createVariableDeclaration(factory2.getLocalName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
));
const varFlags = currentLexicalScope.kind === 311 /* SourceFile */ ? 0 /* None */ : 1 /* Let */;
const statement = factory2.createVariableStatement(
visitNodes2(node.modifiers, modifierVisitor, isModifier),
factory2.createVariableDeclarationList([varDecl], varFlags)
);
setOriginalNode(varDecl, node);
setSyntheticLeadingComments(varDecl, void 0);
setSyntheticTrailingComments(varDecl, void 0);
setOriginalNode(statement, node);
recordEmittedDeclarationInScope(node);
if (isFirstEmittedDeclarationInScope(node)) {
if (node.kind === 265 /* EnumDeclaration */) {
setSourceMapRange(statement.declarationList, node);
} else {
setSourceMapRange(statement, node);
}
setCommentRange(statement, node);
addEmitFlags(statement, 2048 /* NoTrailingComments */);
statements.push(statement);
return true;
}
return false;
}
function visitModuleDeclaration(node) {
if (!shouldEmitModuleDeclaration(node)) {
return factory2.createNotEmittedStatement(node);
}
Debug.assertNode(node.name, isIdentifier, "A TypeScript namespace should have an Identifier name.");
enableSubstitutionForNamespaceExports();
const statements = [];
let emitFlags = 4 /* AdviseOnEmitNode */;
const varAdded = addVarForEnumOrModuleDeclaration(statements, node);
if (varAdded) {
if (moduleKind !== 4 /* System */ || currentLexicalScope !== currentSourceFile) {
emitFlags |= 1024 /* NoLeadingComments */;
}
}
const parameterName = getNamespaceParameterName(node);
const containerName = getNamespaceContainerName(node);
const exportName = isExportOfNamespace(node) ? factory2.getExternalModuleOrNamespaceExportName(
currentNamespaceContainerName,
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
) : factory2.getDeclarationName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
);
let moduleArg = factory2.createLogicalOr(
exportName,
factory2.createAssignment(
exportName,
factory2.createObjectLiteralExpression()
)
);
if (isExportOfNamespace(node)) {
const localName = factory2.getLocalName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
);
moduleArg = factory2.createAssignment(localName, moduleArg);
}
const moduleStatement = factory2.createExpressionStatement(
factory2.createCallExpression(
factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
[factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
parameterName
)],
/*type*/
void 0,
transformModuleBody(node, containerName)
),
/*typeArguments*/
void 0,
[moduleArg]
)
);
setOriginalNode(moduleStatement, node);
if (varAdded) {
setSyntheticLeadingComments(moduleStatement, void 0);
setSyntheticTrailingComments(moduleStatement, void 0);
}
setTextRange(moduleStatement, node);
addEmitFlags(moduleStatement, emitFlags);
statements.push(moduleStatement);
return statements;
}
function transformModuleBody(node, namespaceLocalName) {
const savedCurrentNamespaceContainerName = currentNamespaceContainerName;
const savedCurrentNamespace = currentNamespace;
const savedCurrentScopeFirstDeclarationsOfName = currentScopeFirstDeclarationsOfName;
currentNamespaceContainerName = namespaceLocalName;
currentNamespace = node;
currentScopeFirstDeclarationsOfName = void 0;
const statements = [];
startLexicalEnvironment();
let statementsLocation;
let blockLocation;
if (node.body) {
if (node.body.kind === 267 /* ModuleBlock */) {
saveStateAndInvoke(node.body, (body) => addRange(statements, visitNodes2(body.statements, namespaceElementVisitor, isStatement)));
statementsLocation = node.body.statements;
blockLocation = node.body;
} else {
const result = visitModuleDeclaration(node.body);
if (result) {
if (isArray(result)) {
addRange(statements, result);
} else {
statements.push(result);
}
}
const moduleBlock = getInnerMostModuleDeclarationFromDottedModule(node).body;
statementsLocation = moveRangePos(moduleBlock.statements, -1);
}
}
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
currentNamespaceContainerName = savedCurrentNamespaceContainerName;
currentNamespace = savedCurrentNamespace;
currentScopeFirstDeclarationsOfName = savedCurrentScopeFirstDeclarationsOfName;
const block = factory2.createBlock(
setTextRange(
factory2.createNodeArray(statements),
/*location*/
statementsLocation
),
/*multiLine*/
true
);
setTextRange(block, blockLocation);
if (!node.body || node.body.kind !== 267 /* ModuleBlock */) {
setEmitFlags(block, getEmitFlags(block) | 3072 /* NoComments */);
}
return block;
}
function getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration) {
if (moduleDeclaration.body.kind === 266 /* ModuleDeclaration */) {
const recursiveInnerModule = getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration.body);
return recursiveInnerModule || moduleDeclaration.body;
}
}
function visitImportDeclaration(node) {
if (!node.importClause) {
return node;
}
if (node.importClause.isTypeOnly) {
return void 0;
}
const importClause = visitNode(node.importClause, visitImportClause, isImportClause);
return importClause || compilerOptions.importsNotUsedAsValues === 1 /* Preserve */ || compilerOptions.importsNotUsedAsValues === 2 /* Error */ ? factory2.updateImportDeclaration(
node,
/*modifiers*/
void 0,
importClause,
node.moduleSpecifier,
node.assertClause
) : void 0;
}
function visitImportClause(node) {
Debug.assert(!node.isTypeOnly);
const name = shouldEmitAliasDeclaration(node) ? node.name : void 0;
const namedBindings = visitNode(node.namedBindings, visitNamedImportBindings, isNamedImportBindings);
return name || namedBindings ? factory2.updateImportClause(
node,
/*isTypeOnly*/
false,
name,
namedBindings
) : void 0;
}
function visitNamedImportBindings(node) {
if (node.kind === 273 /* NamespaceImport */) {
return shouldEmitAliasDeclaration(node) ? node : void 0;
} else {
const allowEmpty = compilerOptions.verbatimModuleSyntax || compilerOptions.preserveValueImports && (compilerOptions.importsNotUsedAsValues === 1 /* Preserve */ || compilerOptions.importsNotUsedAsValues === 2 /* Error */);
const elements = visitNodes2(node.elements, visitImportSpecifier, isImportSpecifier);
return allowEmpty || some(elements) ? factory2.updateNamedImports(node, elements) : void 0;
}
}
function visitImportSpecifier(node) {
return !node.isTypeOnly && shouldEmitAliasDeclaration(node) ? node : void 0;
}
function visitExportAssignment(node) {
return compilerOptions.verbatimModuleSyntax || resolver.isValueAliasDeclaration(node) ? visitEachChild(node, visitor, context) : void 0;
}
function visitExportDeclaration(node) {
if (node.isTypeOnly) {
return void 0;
}
if (!node.exportClause || isNamespaceExport(node.exportClause)) {
return node;
}
const allowEmpty = compilerOptions.verbatimModuleSyntax || !!node.moduleSpecifier && (compilerOptions.importsNotUsedAsValues === 1 /* Preserve */ || compilerOptions.importsNotUsedAsValues === 2 /* Error */);
const exportClause = visitNode(
node.exportClause,
(bindings) => visitNamedExportBindings(bindings, allowEmpty),
isNamedExportBindings
);
return exportClause ? factory2.updateExportDeclaration(
node,
/*modifiers*/
void 0,
node.isTypeOnly,
exportClause,
node.moduleSpecifier,
node.assertClause
) : void 0;
}
function visitNamedExports(node, allowEmpty) {
const elements = visitNodes2(node.elements, visitExportSpecifier, isExportSpecifier);
return allowEmpty || some(elements) ? factory2.updateNamedExports(node, elements) : void 0;
}
function visitNamespaceExports(node) {
return factory2.updateNamespaceExport(node, Debug.checkDefined(visitNode(node.name, visitor, isIdentifier)));
}
function visitNamedExportBindings(node, allowEmpty) {
return isNamespaceExport(node) ? visitNamespaceExports(node) : visitNamedExports(node, allowEmpty);
}
function visitExportSpecifier(node) {
return !node.isTypeOnly && (compilerOptions.verbatimModuleSyntax || resolver.isValueAliasDeclaration(node)) ? node : void 0;
}
function shouldEmitImportEqualsDeclaration(node) {
return shouldEmitAliasDeclaration(node) || !isExternalModule(currentSourceFile) && resolver.isTopLevelValueImportEqualsWithEntityName(node);
}
function visitImportEqualsDeclaration(node) {
if (node.isTypeOnly) {
return void 0;
}
if (isExternalModuleImportEqualsDeclaration(node)) {
const isReferenced = shouldEmitAliasDeclaration(node);
if (!isReferenced && compilerOptions.importsNotUsedAsValues === 1 /* Preserve */) {
return setOriginalNode(
setTextRange(
factory2.createImportDeclaration(
/*modifiers*/
void 0,
/*importClause*/
void 0,
node.moduleReference.expression,
/*assertClause*/
void 0
),
node
),
node
);
}
return isReferenced ? visitEachChild(node, visitor, context) : void 0;
}
if (!shouldEmitImportEqualsDeclaration(node)) {
return void 0;
}
const moduleReference = createExpressionFromEntityName(factory2, node.moduleReference);
setEmitFlags(moduleReference, 3072 /* NoComments */ | 4096 /* NoNestedComments */);
if (isNamedExternalModuleExport(node) || !isExportOfNamespace(node)) {
return setOriginalNode(
setTextRange(
factory2.createVariableStatement(
visitNodes2(node.modifiers, modifierVisitor, isModifier),
factory2.createVariableDeclarationList([
setOriginalNode(
factory2.createVariableDeclaration(
node.name,
/*exclamationToken*/
void 0,
/*type*/
void 0,
moduleReference
),
node
)
])
),
node
),
node
);
} else {
return setOriginalNode(
createNamespaceExport(
node.name,
moduleReference,
node
),
node
);
}
}
function isExportOfNamespace(node) {
return currentNamespace !== void 0 && hasSyntacticModifier(node, 1 /* Export */);
}
function isExternalModuleExport(node) {
return currentNamespace === void 0 && hasSyntacticModifier(node, 1 /* Export */);
}
function isNamedExternalModuleExport(node) {
return isExternalModuleExport(node) && !hasSyntacticModifier(node, 1024 /* Default */);
}
function isDefaultExternalModuleExport(node) {
return isExternalModuleExport(node) && hasSyntacticModifier(node, 1024 /* Default */);
}
function createExportMemberAssignmentStatement(node) {
const expression = factory2.createAssignment(
factory2.getExternalModuleOrNamespaceExportName(
currentNamespaceContainerName,
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
),
factory2.getLocalName(node)
);
setSourceMapRange(expression, createRange(node.name ? node.name.pos : node.pos, node.end));
const statement = factory2.createExpressionStatement(expression);
setSourceMapRange(statement, createRange(-1, node.end));
return statement;
}
function addExportMemberAssignment(statements, node) {
statements.push(createExportMemberAssignmentStatement(node));
}
function createNamespaceExport(exportName, exportValue, location) {
return setTextRange(
factory2.createExpressionStatement(
factory2.createAssignment(
factory2.getNamespaceMemberName(
currentNamespaceContainerName,
exportName,
/*allowComments*/
false,
/*allowSourceMaps*/
true
),
exportValue
)
),
location
);
}
function createNamespaceExportExpression(exportName, exportValue, location) {
return setTextRange(factory2.createAssignment(getNamespaceMemberNameWithSourceMapsAndWithoutComments(exportName), exportValue), location);
}
function getNamespaceMemberNameWithSourceMapsAndWithoutComments(name) {
return factory2.getNamespaceMemberName(
currentNamespaceContainerName,
name,
/*allowComments*/
false,
/*allowSourceMaps*/
true
);
}
function getNamespaceParameterName(node) {
const name = factory2.getGeneratedNameForNode(node);
setSourceMapRange(name, node.name);
return name;
}
function getNamespaceContainerName(node) {
return factory2.getGeneratedNameForNode(node);
}
function enableSubstitutionForNonQualifiedEnumMembers() {
if ((enabledSubstitutions & 8 /* NonQualifiedEnumMembers */) === 0) {
enabledSubstitutions |= 8 /* NonQualifiedEnumMembers */;
context.enableSubstitution(80 /* Identifier */);
}
}
function enableSubstitutionForNamespaceExports() {
if ((enabledSubstitutions & 2 /* NamespaceExports */) === 0) {
enabledSubstitutions |= 2 /* NamespaceExports */;
context.enableSubstitution(80 /* Identifier */);
context.enableSubstitution(303 /* ShorthandPropertyAssignment */);
context.enableEmitNotification(266 /* ModuleDeclaration */);
}
}
function isTransformedModuleDeclaration(node) {
return getOriginalNode(node).kind === 266 /* ModuleDeclaration */;
}
function isTransformedEnumDeclaration(node) {
return getOriginalNode(node).kind === 265 /* EnumDeclaration */;
}
function onEmitNode(hint, node, emitCallback) {
const savedApplicableSubstitutions = applicableSubstitutions;
const savedCurrentSourceFile = currentSourceFile;
if (isSourceFile(node)) {
currentSourceFile = node;
}
if (enabledSubstitutions & 2 /* NamespaceExports */ && isTransformedModuleDeclaration(node)) {
applicableSubstitutions |= 2 /* NamespaceExports */;
}
if (enabledSubstitutions & 8 /* NonQualifiedEnumMembers */ && isTransformedEnumDeclaration(node)) {
applicableSubstitutions |= 8 /* NonQualifiedEnumMembers */;
}
previousOnEmitNode(hint, node, emitCallback);
applicableSubstitutions = savedApplicableSubstitutions;
currentSourceFile = savedCurrentSourceFile;
}
function onSubstituteNode(hint, node) {
node = previousOnSubstituteNode(hint, node);
if (hint === 1 /* Expression */) {
return substituteExpression(node);
} else if (isShorthandPropertyAssignment(node)) {
return substituteShorthandPropertyAssignment(node);
}
return node;
}
function substituteShorthandPropertyAssignment(node) {
if (enabledSubstitutions & 2 /* NamespaceExports */) {
const name = node.name;
const exportedName = trySubstituteNamespaceExportedName(name);
if (exportedName) {
if (node.objectAssignmentInitializer) {
const initializer = factory2.createAssignment(exportedName, node.objectAssignmentInitializer);
return setTextRange(factory2.createPropertyAssignment(name, initializer), node);
}
return setTextRange(factory2.createPropertyAssignment(name, exportedName), node);
}
}
return node;
}
function substituteExpression(node) {
switch (node.kind) {
case 80 /* Identifier */:
return substituteExpressionIdentifier(node);
case 210 /* PropertyAccessExpression */:
return substitutePropertyAccessExpression(node);
case 211 /* ElementAccessExpression */:
return substituteElementAccessExpression(node);
}
return node;
}
function substituteExpressionIdentifier(node) {
return trySubstituteNamespaceExportedName(node) || node;
}
function trySubstituteNamespaceExportedName(node) {
if (enabledSubstitutions & applicableSubstitutions && !isGeneratedIdentifier(node) && !isLocalName(node)) {
const container = resolver.getReferencedExportContainer(
node,
/*prefixLocals*/
false
);
if (container && container.kind !== 311 /* SourceFile */) {
const substitute = applicableSubstitutions & 2 /* NamespaceExports */ && container.kind === 266 /* ModuleDeclaration */ || applicableSubstitutions & 8 /* NonQualifiedEnumMembers */ && container.kind === 265 /* EnumDeclaration */;
if (substitute) {
return setTextRange(
factory2.createPropertyAccessExpression(factory2.getGeneratedNameForNode(container), node),
/*location*/
node
);
}
}
}
return void 0;
}
function substitutePropertyAccessExpression(node) {
return substituteConstantValue(node);
}
function substituteElementAccessExpression(node) {
return substituteConstantValue(node);
}
function safeMultiLineComment(value) {
return value.replace(/\*\//g, "*_/");
}
function substituteConstantValue(node) {
const constantValue = tryGetConstEnumValue(node);
if (constantValue !== void 0) {
setConstantValue(node, constantValue);
const substitute = typeof constantValue === "string" ? factory2.createStringLiteral(constantValue) : factory2.createNumericLiteral(constantValue);
if (!compilerOptions.removeComments) {
const originalNode = getOriginalNode(node, isAccessExpression);
addSyntheticTrailingComment(substitute, 3 /* MultiLineCommentTrivia */, ` ${safeMultiLineComment(getTextOfNode(originalNode))} `);
}
return substitute;
}
return node;
}
function tryGetConstEnumValue(node) {
if (getIsolatedModules(compilerOptions)) {
return void 0;
}
return isPropertyAccessExpression(node) || isElementAccessExpression(node) ? resolver.getConstantValue(node) : void 0;
}
function shouldEmitAliasDeclaration(node) {
return compilerOptions.verbatimModuleSyntax || isInJSFile(node) || (compilerOptions.preserveValueImports ? resolver.isValueAliasDeclaration(node) : resolver.isReferencedAliasDeclaration(node));
}
}
// src/compiler/transformers/classFields.ts
function transformClassFields(context) {
const {
factory: factory2,
getEmitHelperFactory: emitHelpers,
hoistVariableDeclaration,
endLexicalEnvironment,
startLexicalEnvironment,
resumeLexicalEnvironment,
addBlockScopedVariable
} = context;
const resolver = context.getEmitResolver();
const compilerOptions = context.getCompilerOptions();
const languageVersion = getEmitScriptTarget(compilerOptions);
const useDefineForClassFields = getUseDefineForClassFields(compilerOptions);
const legacyDecorators = !!compilerOptions.experimentalDecorators;
const shouldTransformInitializersUsingSet = !useDefineForClassFields;
const shouldTransformInitializersUsingDefine = useDefineForClassFields && languageVersion < 9 /* ES2022 */;
const shouldTransformInitializers = shouldTransformInitializersUsingSet || shouldTransformInitializersUsingDefine;
const shouldTransformPrivateElementsOrClassStaticBlocks = languageVersion < 9 /* ES2022 */;
const shouldTransformAutoAccessors = languageVersion < 99 /* ESNext */ ? -1 /* True */ : !useDefineForClassFields ? 3 /* Maybe */ : 0 /* False */;
const shouldTransformThisInStaticInitializers = languageVersion < 9 /* ES2022 */;
const shouldTransformSuperInStaticInitializers = shouldTransformThisInStaticInitializers && languageVersion >= 2 /* ES2015 */;
const shouldTransformAnything = shouldTransformInitializers || shouldTransformPrivateElementsOrClassStaticBlocks || shouldTransformAutoAccessors === -1 /* True */;
const previousOnSubstituteNode = context.onSubstituteNode;
context.onSubstituteNode = onSubstituteNode;
const previousOnEmitNode = context.onEmitNode;
context.onEmitNode = onEmitNode;
let shouldTransformPrivateStaticElementsInFile = false;
let enabledSubstitutions;
let classAliases;
let pendingExpressions;
let pendingStatements;
let lexicalEnvironment;
const lexicalEnvironmentMap = /* @__PURE__ */ new Map();
let currentClassContainer;
let currentStaticPropertyDeclarationOrStaticBlock;
let shouldSubstituteThisWithClassThis = false;
let previousShouldSubstituteThisWithClassThis = false;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
if (node.isDeclarationFile) {
return node;
}
lexicalEnvironment = void 0;
shouldTransformPrivateStaticElementsInFile = !!(getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */);
if (!shouldTransformAnything && !shouldTransformPrivateStaticElementsInFile) {
return node;
}
const visited = visitEachChild(node, visitor, context);
addEmitHelpers(visited, context.readEmitHelpers());
return visited;
}
function modifierVisitor(node) {
switch (node.kind) {
case 129 /* AccessorKeyword */:
return shouldTransformAutoAccessorsInCurrentClass() ? void 0 : node;
default:
return tryCast(node, isModifier);
}
}
function visitor(node) {
if (!(node.transformFlags & 16777216 /* ContainsClassFields */) && !(node.transformFlags & 134234112 /* ContainsLexicalThisOrSuper */)) {
return node;
}
switch (node.kind) {
case 129 /* AccessorKeyword */:
return Debug.fail("Use `modifierVisitor` instead.");
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
case 230 /* ClassExpression */:
return visitClassExpression(
node,
/*referencedName*/
void 0
);
case 174 /* ClassStaticBlockDeclaration */:
case 171 /* PropertyDeclaration */:
return Debug.fail("Use `classElementVisitor` instead.");
case 302 /* PropertyAssignment */:
return visitPropertyAssignment(node);
case 242 /* VariableStatement */:
return visitVariableStatement(node);
case 259 /* VariableDeclaration */:
return visitVariableDeclaration(node);
case 168 /* Parameter */:
return visitParameterDeclaration(node);
case 207 /* BindingElement */:
return visitBindingElement(node);
case 276 /* ExportAssignment */:
return visitExportAssignment(node);
case 81 /* PrivateIdentifier */:
return visitPrivateIdentifier(node);
case 210 /* PropertyAccessExpression */:
return visitPropertyAccessExpression(node);
case 211 /* ElementAccessExpression */:
return visitElementAccessExpression(node);
case 223 /* PrefixUnaryExpression */:
case 224 /* PostfixUnaryExpression */:
return visitPreOrPostfixUnaryExpression(
node,
/*discarded*/
false
);
case 225 /* BinaryExpression */:
return visitBinaryExpression(
node,
/*discarded*/
false
);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(
node,
/*discarded*/
false,
/*referencedName*/
void 0
);
case 212 /* CallExpression */:
return visitCallExpression(node);
case 243 /* ExpressionStatement */:
return visitExpressionStatement(node);
case 214 /* TaggedTemplateExpression */:
return visitTaggedTemplateExpression(node);
case 247 /* ForStatement */:
return visitForStatement(node);
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
case 175 /* Constructor */:
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */: {
return setCurrentStaticPropertyDeclarationOrStaticBlockAnd(
/*current*/
void 0,
fallbackVisitor,
node
);
}
default:
return fallbackVisitor(node);
}
}
function fallbackVisitor(node) {
return visitEachChild(node, visitor, context);
}
function namedEvaluationVisitor(node, referencedName) {
switch (node.kind) {
case 359 /* PartiallyEmittedExpression */:
return visitPartiallyEmittedExpression(
node,
/*discarded*/
false,
referencedName
);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(
node,
/*discarded*/
false,
referencedName
);
case 230 /* ClassExpression */:
return visitClassExpression(node, referencedName);
default:
return visitor(node);
}
}
function discardedValueVisitor(node) {
switch (node.kind) {
case 223 /* PrefixUnaryExpression */:
case 224 /* PostfixUnaryExpression */:
return visitPreOrPostfixUnaryExpression(
node,
/*discarded*/
true
);
case 225 /* BinaryExpression */:
return visitBinaryExpression(
node,
/*discarded*/
true
);
case 360 /* CommaListExpression */:
return visitCommaListExpression(
node,
/*discarded*/
true
);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(
node,
/*discarded*/
true,
/*referencedName*/
void 0
);
default:
return visitor(node);
}
}
function heritageClauseVisitor(node) {
switch (node.kind) {
case 297 /* HeritageClause */:
return visitEachChild(node, heritageClauseVisitor, context);
case 232 /* ExpressionWithTypeArguments */:
return visitExpressionWithTypeArgumentsInHeritageClause(node);
default:
return visitor(node);
}
}
function assignmentTargetVisitor(node) {
switch (node.kind) {
case 209 /* ObjectLiteralExpression */:
case 208 /* ArrayLiteralExpression */:
return visitAssignmentPattern(node);
default:
return visitor(node);
}
}
function classElementVisitor(node) {
switch (node.kind) {
case 175 /* Constructor */:
return visitConstructorDeclaration(node);
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 173 /* MethodDeclaration */:
return setCurrentStaticPropertyDeclarationOrStaticBlockAnd(
/*current*/
void 0,
visitMethodOrAccessorDeclaration,
node
);
case 171 /* PropertyDeclaration */:
return setCurrentStaticPropertyDeclarationOrStaticBlockAnd(
/*current*/
void 0,
visitPropertyDeclaration,
node
);
case 174 /* ClassStaticBlockDeclaration */:
return visitClassStaticBlockDeclaration(node);
case 166 /* ComputedPropertyName */:
return visitComputedPropertyName(node);
case 239 /* SemicolonClassElement */:
return node;
default:
return isModifierLike(node) ? modifierVisitor(node) : visitor(node);
}
}
function propertyNameVisitor(node) {
switch (node.kind) {
case 166 /* ComputedPropertyName */:
return visitComputedPropertyName(node);
default:
return visitor(node);
}
}
function accessorFieldResultVisitor(node) {
switch (node.kind) {
case 171 /* PropertyDeclaration */:
return transformFieldInitializer(node);
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return classElementVisitor(node);
default:
Debug.assertMissingNode(node, "Expected node to either be a PropertyDeclaration, GetAccessorDeclaration, or SetAccessorDeclaration");
break;
}
}
function visitPrivateIdentifier(node) {
if (!shouldTransformPrivateElementsOrClassStaticBlocks) {
return node;
}
if (isStatement(node.parent)) {
return node;
}
return setOriginalNode(factory2.createIdentifier(""), node);
}
function transformPrivateIdentifierInInExpression(node) {
const info = accessPrivateIdentifier2(node.left);
if (info) {
const receiver = visitNode(node.right, visitor, isExpression);
return setOriginalNode(
emitHelpers().createClassPrivateFieldInHelper(info.brandCheckIdentifier, receiver),
node
);
}
return visitEachChild(node, visitor, context);
}
function visitPropertyAssignment(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const { referencedName, name } = visitReferencedPropertyName(node.name);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, referencedName), isExpression);
return factory2.updatePropertyAssignment(node, name, initializer);
}
return visitEachChild(node, visitor, context);
}
function visitVariableStatement(node) {
const savedPendingStatements = pendingStatements;
pendingStatements = [];
const visitedNode = visitEachChild(node, visitor, context);
const statement = some(pendingStatements) ? [visitedNode, ...pendingStatements] : visitedNode;
pendingStatements = savedPendingStatements;
return statement;
}
function getAssignedNameOfIdentifier(name, initializer) {
const originalClass = getOriginalNode(initializer, isClassLike);
return originalClass && !originalClass.name && hasSyntacticModifier(originalClass, 1024 /* Default */) ? factory2.createStringLiteral("default") : factory2.createStringLiteralFromNode(name);
}
function visitVariableDeclaration(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
const name = visitNode(node.name, visitor, isBindingName);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateVariableDeclaration(
node,
name,
/*exclamationToken*/
void 0,
/*type*/
void 0,
initializer
);
}
return visitEachChild(node, visitor, context);
}
function visitParameterDeclaration(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
const name = visitNode(node.name, visitor, isBindingName);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateParameterDeclaration(
node,
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
name,
/*questionToken*/
void 0,
/*type*/
void 0,
initializer
);
}
return visitEachChild(node, visitor, context);
}
function visitBindingElement(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
const propertyName = visitNode(node.propertyName, visitor, isPropertyName);
const name = visitNode(node.name, visitor, isBindingName);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateBindingElement(
node,
/*dotDotDotToken*/
void 0,
propertyName,
name,
initializer
);
}
return visitEachChild(node, visitor, context);
}
function visitExportAssignment(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = factory2.createStringLiteral(node.isExportEquals ? "" : "default");
const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
const expression = visitNode(node.expression, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateExportAssignment(node, modifiers, expression);
}
return visitEachChild(node, visitor, context);
}
function injectPendingExpressions(expression) {
if (some(pendingExpressions)) {
if (isParenthesizedExpression(expression)) {
pendingExpressions.push(expression.expression);
expression = factory2.updateParenthesizedExpression(expression, factory2.inlineExpressions(pendingExpressions));
} else {
pendingExpressions.push(expression);
expression = factory2.inlineExpressions(pendingExpressions);
}
pendingExpressions = void 0;
}
return expression;
}
function visitComputedPropertyName(node) {
const expression = visitNode(node.expression, visitor, isExpression);
return factory2.updateComputedPropertyName(node, injectPendingExpressions(expression));
}
function visitConstructorDeclaration(node) {
if (currentClassContainer) {
return transformConstructor(node, currentClassContainer);
}
return fallbackVisitor(node);
}
function shouldTransformClassElementToWeakMap(node) {
if (shouldTransformPrivateElementsOrClassStaticBlocks)
return true;
if (hasStaticModifier(node) && getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */)
return true;
return false;
}
function visitMethodOrAccessorDeclaration(node) {
Debug.assert(!hasDecorators(node));
if (!isPrivateIdentifierClassElementDeclaration(node) || !shouldTransformClassElementToWeakMap(node)) {
return visitEachChild(node, classElementVisitor, context);
}
const info = accessPrivateIdentifier2(node.name);
Debug.assert(info, "Undeclared private name for property declaration.");
if (!info.isValid) {
return node;
}
const functionName = getHoistedFunctionName(node);
if (functionName) {
getPendingExpressions().push(
factory2.createAssignment(
functionName,
factory2.createFunctionExpression(
filter(node.modifiers, (m) => isModifier(m) && !isStaticModifier(m) && !isAccessorModifier(m)),
node.asteriskToken,
functionName,
/*typeParameters*/
void 0,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
visitFunctionBody(node.body, visitor, context)
)
)
);
}
return void 0;
}
function setCurrentStaticPropertyDeclarationOrStaticBlockAnd(current, visitor2, arg) {
const savedCurrentStaticPropertyDeclarationOrStaticBlock = currentStaticPropertyDeclarationOrStaticBlock;
currentStaticPropertyDeclarationOrStaticBlock = current;
const result = visitor2(arg);
currentStaticPropertyDeclarationOrStaticBlock = savedCurrentStaticPropertyDeclarationOrStaticBlock;
return result;
}
function getHoistedFunctionName(node) {
Debug.assert(isPrivateIdentifier(node.name));
const info = accessPrivateIdentifier2(node.name);
Debug.assert(info, "Undeclared private name for property declaration.");
if (info.kind === "m" /* Method */) {
return info.methodName;
}
if (info.kind === "a" /* Accessor */) {
if (isGetAccessor(node)) {
return info.getterName;
}
if (isSetAccessor(node)) {
return info.setterName;
}
}
}
function transformAutoAccessor(node) {
const commentRange = getCommentRange(node);
const sourceMapRange = getSourceMapRange(node);
const name = node.name;
let getterName = name;
let setterName = name;
if (isComputedPropertyName(name) && !isSimpleInlineableExpression(name.expression)) {
const cacheAssignment = findComputedPropertyNameCacheAssignment(name);
if (cacheAssignment) {
getterName = factory2.updateComputedPropertyName(name, visitNode(name.expression, visitor, isExpression));
setterName = factory2.updateComputedPropertyName(name, cacheAssignment.left);
} else {
const temp = factory2.createTempVariable(hoistVariableDeclaration);
setSourceMapRange(temp, name.expression);
const expression = visitNode(name.expression, visitor, isExpression);
const assignment = factory2.createAssignment(temp, expression);
setSourceMapRange(assignment, name.expression);
getterName = factory2.updateComputedPropertyName(name, assignment);
setterName = factory2.updateComputedPropertyName(name, temp);
}
}
const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
const backingField = createAccessorPropertyBackingField(factory2, node, modifiers, node.initializer);
setOriginalNode(backingField, node);
setEmitFlags(backingField, 3072 /* NoComments */);
setSourceMapRange(backingField, sourceMapRange);
const getter = createAccessorPropertyGetRedirector(factory2, node, modifiers, getterName);
setOriginalNode(getter, node);
setCommentRange(getter, commentRange);
setSourceMapRange(getter, sourceMapRange);
const setter = createAccessorPropertySetRedirector(factory2, node, modifiers, setterName);
setOriginalNode(setter, node);
setEmitFlags(setter, 3072 /* NoComments */);
setSourceMapRange(setter, sourceMapRange);
return visitArray([backingField, getter, setter], accessorFieldResultVisitor, isClassElement);
}
function transformPrivateFieldInitializer(node) {
if (shouldTransformClassElementToWeakMap(node)) {
const info = accessPrivateIdentifier2(node.name);
Debug.assert(info, "Undeclared private name for property declaration.");
if (!info.isValid) {
return node;
}
if (info.isStatic && !shouldTransformPrivateElementsOrClassStaticBlocks) {
const statement = transformPropertyOrClassStaticBlock(node, factory2.createThis());
if (statement) {
return factory2.createClassStaticBlockDeclaration(factory2.createBlock(
[statement],
/*multiLine*/
true
));
}
}
return void 0;
}
if (shouldTransformInitializersUsingSet && !isStatic(node) && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) && lexicalEnvironment.data.facts & 16 /* WillHoistInitializersToConstructor */) {
return factory2.updatePropertyDeclaration(
node,
visitNodes2(node.modifiers, visitor, isModifierLike),
node.name,
/*questionOrExclamationToken*/
void 0,
/*type*/
void 0,
/*initializer*/
void 0
);
}
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const { referencedName, name } = visitReferencedPropertyName(node.name);
return factory2.updatePropertyDeclaration(
node,
visitNodes2(node.modifiers, modifierVisitor, isModifier),
name,
/*questionOrExclamationToken*/
void 0,
/*type*/
void 0,
visitNode(node.initializer, (child) => namedEvaluationVisitor(child, referencedName), isExpression)
);
}
return factory2.updatePropertyDeclaration(
node,
visitNodes2(node.modifiers, modifierVisitor, isModifier),
visitNode(node.name, propertyNameVisitor, isPropertyName),
/*questionOrExclamationToken*/
void 0,
/*type*/
void 0,
visitNode(node.initializer, visitor, isExpression)
);
}
function transformPublicFieldInitializer(node) {
if (shouldTransformInitializers && !isAutoAccessorPropertyDeclaration(node)) {
const expr = getPropertyNameExpressionIfNeeded(
node.name,
/*shouldHoist*/
!!node.initializer || useDefineForClassFields,
/*captureReferencedName*/
isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)
);
if (expr) {
getPendingExpressions().push(...flattenCommaList(expr));
}
if (isStatic(node) && !shouldTransformPrivateElementsOrClassStaticBlocks) {
const initializerStatement = transformPropertyOrClassStaticBlock(node, factory2.createThis());
if (initializerStatement) {
const staticBlock = factory2.createClassStaticBlockDeclaration(
factory2.createBlock([initializerStatement])
);
setOriginalNode(staticBlock, node);
setCommentRange(staticBlock, node);
setCommentRange(initializerStatement, { pos: -1, end: -1 });
setSyntheticLeadingComments(initializerStatement, void 0);
setSyntheticTrailingComments(initializerStatement, void 0);
return staticBlock;
}
}
return void 0;
}
return factory2.updatePropertyDeclaration(
node,
visitNodes2(node.modifiers, modifierVisitor, isModifier),
visitNode(node.name, propertyNameVisitor, isPropertyName),
/*questionOrExclamationToken*/
void 0,
/*type*/
void 0,
visitNode(node.initializer, visitor, isExpression)
);
}
function transformFieldInitializer(node) {
Debug.assert(!hasDecorators(node), "Decorators should already have been transformed and elided.");
return isPrivateIdentifierClassElementDeclaration(node) ? transformPrivateFieldInitializer(node) : transformPublicFieldInitializer(node);
}
function shouldTransformAutoAccessorsInCurrentClass() {
return shouldTransformAutoAccessors === -1 /* True */ || shouldTransformAutoAccessors === 3 /* Maybe */ && !!(lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) && !!(lexicalEnvironment.data.facts & 16 /* WillHoistInitializersToConstructor */);
}
function visitPropertyDeclaration(node) {
if (isAutoAccessorPropertyDeclaration(node) && (shouldTransformAutoAccessorsInCurrentClass() || hasStaticModifier(node) && getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */)) {
return transformAutoAccessor(node);
}
return transformFieldInitializer(node);
}
function createPrivateIdentifierAccess(info, receiver) {
return createPrivateIdentifierAccessHelper(info, visitNode(receiver, visitor, isExpression));
}
function createPrivateIdentifierAccessHelper(info, receiver) {
setCommentRange(receiver, moveRangePos(receiver, -1));
switch (info.kind) {
case "a" /* Accessor */:
return emitHelpers().createClassPrivateFieldGetHelper(
receiver,
info.brandCheckIdentifier,
info.kind,
info.getterName
);
case "m" /* Method */:
return emitHelpers().createClassPrivateFieldGetHelper(
receiver,
info.brandCheckIdentifier,
info.kind,
info.methodName
);
case "f" /* Field */:
return emitHelpers().createClassPrivateFieldGetHelper(
receiver,
info.brandCheckIdentifier,
info.kind,
info.isStatic ? info.variableName : void 0
);
case "untransformed":
return Debug.fail("Access helpers should not be created for untransformed private elements");
default:
Debug.assertNever(info, "Unknown private element type");
}
}
function visitPropertyAccessExpression(node) {
if (isPrivateIdentifier(node.name)) {
const privateIdentifierInfo = accessPrivateIdentifier2(node.name);
if (privateIdentifierInfo) {
return setTextRange(
setOriginalNode(
createPrivateIdentifierAccess(privateIdentifierInfo, node.expression),
node
),
node
);
}
}
if (shouldTransformSuperInStaticInitializers && isSuperProperty(node) && isIdentifier(node.name) && currentStaticPropertyDeclarationOrStaticBlock && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) {
const { classConstructor, superClassReference, facts } = lexicalEnvironment.data;
if (facts & 1 /* ClassWasDecorated */) {
return visitInvalidSuperProperty(node);
}
if (classConstructor && superClassReference) {
const superProperty = factory2.createReflectGetCall(
superClassReference,
factory2.createStringLiteralFromNode(node.name),
classConstructor
);
setOriginalNode(superProperty, node.expression);
setTextRange(superProperty, node.expression);
return superProperty;
}
}
return visitEachChild(node, visitor, context);
}
function visitElementAccessExpression(node) {
if (shouldTransformSuperInStaticInitializers && isSuperProperty(node) && currentStaticPropertyDeclarationOrStaticBlock && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) {
const { classConstructor, superClassReference, facts } = lexicalEnvironment.data;
if (facts & 1 /* ClassWasDecorated */) {
return visitInvalidSuperProperty(node);
}
if (classConstructor && superClassReference) {
const superProperty = factory2.createReflectGetCall(
superClassReference,
visitNode(node.argumentExpression, visitor, isExpression),
classConstructor
);
setOriginalNode(superProperty, node.expression);
setTextRange(superProperty, node.expression);
return superProperty;
}
}
return visitEachChild(node, visitor, context);
}
function visitPreOrPostfixUnaryExpression(node, discarded) {
if (node.operator === 46 /* PlusPlusToken */ || node.operator === 47 /* MinusMinusToken */) {
const operand = skipParentheses(node.operand);
if (isPrivateIdentifierPropertyAccessExpression(operand)) {
let info;
if (info = accessPrivateIdentifier2(operand.name)) {
const receiver = visitNode(operand.expression, visitor, isExpression);
const { readExpression, initializeExpression } = createCopiableReceiverExpr(receiver);
let expression = createPrivateIdentifierAccess(info, readExpression);
const temp = isPrefixUnaryExpression(node) || discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration);
expression = expandPreOrPostfixIncrementOrDecrementExpression(factory2, node, expression, hoistVariableDeclaration, temp);
expression = createPrivateIdentifierAssignment(
info,
initializeExpression || readExpression,
expression,
64 /* EqualsToken */
);
setOriginalNode(expression, node);
setTextRange(expression, node);
if (temp) {
expression = factory2.createComma(expression, temp);
setTextRange(expression, node);
}
return expression;
}
} else if (shouldTransformSuperInStaticInitializers && isSuperProperty(operand) && currentStaticPropertyDeclarationOrStaticBlock && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) {
const { classConstructor, superClassReference, facts } = lexicalEnvironment.data;
if (facts & 1 /* ClassWasDecorated */) {
const expression = visitInvalidSuperProperty(operand);
return isPrefixUnaryExpression(node) ? factory2.updatePrefixUnaryExpression(node, expression) : factory2.updatePostfixUnaryExpression(node, expression);
}
if (classConstructor && superClassReference) {
let setterName;
let getterName;
if (isPropertyAccessExpression(operand)) {
if (isIdentifier(operand.name)) {
getterName = setterName = factory2.createStringLiteralFromNode(operand.name);
}
} else {
if (isSimpleInlineableExpression(operand.argumentExpression)) {
getterName = setterName = operand.argumentExpression;
} else {
getterName = factory2.createTempVariable(hoistVariableDeclaration);
setterName = factory2.createAssignment(getterName, visitNode(operand.argumentExpression, visitor, isExpression));
}
}
if (setterName && getterName) {
let expression = factory2.createReflectGetCall(superClassReference, getterName, classConstructor);
setTextRange(expression, operand);
const temp = discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration);
expression = expandPreOrPostfixIncrementOrDecrementExpression(factory2, node, expression, hoistVariableDeclaration, temp);
expression = factory2.createReflectSetCall(superClassReference, setterName, expression, classConstructor);
setOriginalNode(expression, node);
setTextRange(expression, node);
if (temp) {
expression = factory2.createComma(expression, temp);
setTextRange(expression, node);
}
return expression;
}
}
}
}
return visitEachChild(node, visitor, context);
}
function visitForStatement(node) {
return factory2.updateForStatement(
node,
visitNode(node.initializer, discardedValueVisitor, isForInitializer),
visitNode(node.condition, visitor, isExpression),
visitNode(node.incrementor, discardedValueVisitor, isExpression),
visitIterationBody(node.statement, visitor, context)
);
}
function visitExpressionStatement(node) {
return factory2.updateExpressionStatement(
node,
visitNode(node.expression, discardedValueVisitor, isExpression)
);
}
function createCopiableReceiverExpr(receiver) {
const clone2 = nodeIsSynthesized(receiver) ? receiver : factory2.cloneNode(receiver);
if (isSimpleInlineableExpression(receiver)) {
return { readExpression: clone2, initializeExpression: void 0 };
}
const readExpression = factory2.createTempVariable(hoistVariableDeclaration);
const initializeExpression = factory2.createAssignment(readExpression, clone2);
return { readExpression, initializeExpression };
}
function visitCallExpression(node) {
var _a;
if (isPrivateIdentifierPropertyAccessExpression(node.expression) && accessPrivateIdentifier2(node.expression.name)) {
const { thisArg, target } = factory2.createCallBinding(node.expression, hoistVariableDeclaration, languageVersion);
if (isCallChain(node)) {
return factory2.updateCallChain(
node,
factory2.createPropertyAccessChain(visitNode(target, visitor, isExpression), node.questionDotToken, "call"),
/*questionDotToken*/
void 0,
/*typeArguments*/
void 0,
[visitNode(thisArg, visitor, isExpression), ...visitNodes2(node.arguments, visitor, isExpression)]
);
}
return factory2.updateCallExpression(
node,
factory2.createPropertyAccessExpression(visitNode(target, visitor, isExpression), "call"),
/*typeArguments*/
void 0,
[visitNode(thisArg, visitor, isExpression), ...visitNodes2(node.arguments, visitor, isExpression)]
);
}
if (shouldTransformSuperInStaticInitializers && isSuperProperty(node.expression) && currentStaticPropertyDeclarationOrStaticBlock && ((_a = lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) == null ? void 0 : _a.classConstructor)) {
const invocation = factory2.createFunctionCallCall(
visitNode(node.expression, visitor, isExpression),
lexicalEnvironment.data.classConstructor,
visitNodes2(node.arguments, visitor, isExpression)
);
setOriginalNode(invocation, node);
setTextRange(invocation, node);
return invocation;
}
return visitEachChild(node, visitor, context);
}
function visitTaggedTemplateExpression(node) {
var _a;
if (isPrivateIdentifierPropertyAccessExpression(node.tag) && accessPrivateIdentifier2(node.tag.name)) {
const { thisArg, target } = factory2.createCallBinding(node.tag, hoistVariableDeclaration, languageVersion);
return factory2.updateTaggedTemplateExpression(
node,
factory2.createCallExpression(
factory2.createPropertyAccessExpression(visitNode(target, visitor, isExpression), "bind"),
/*typeArguments*/
void 0,
[visitNode(thisArg, visitor, isExpression)]
),
/*typeArguments*/
void 0,
visitNode(node.template, visitor, isTemplateLiteral)
);
}
if (shouldTransformSuperInStaticInitializers && isSuperProperty(node.tag) && currentStaticPropertyDeclarationOrStaticBlock && ((_a = lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) == null ? void 0 : _a.classConstructor)) {
const invocation = factory2.createFunctionBindCall(
visitNode(node.tag, visitor, isExpression),
lexicalEnvironment.data.classConstructor,
[]
);
setOriginalNode(invocation, node);
setTextRange(invocation, node);
return factory2.updateTaggedTemplateExpression(
node,
invocation,
/*typeArguments*/
void 0,
visitNode(node.template, visitor, isTemplateLiteral)
);
}
return visitEachChild(node, visitor, context);
}
function transformClassStaticBlockDeclaration(node) {
if (lexicalEnvironment) {
lexicalEnvironmentMap.set(getOriginalNode(node), lexicalEnvironment);
}
if (shouldTransformPrivateElementsOrClassStaticBlocks) {
startLexicalEnvironment();
let statements = setCurrentStaticPropertyDeclarationOrStaticBlockAnd(
node,
(statements2) => visitNodes2(statements2, visitor, isStatement),
node.body.statements
);
statements = factory2.mergeLexicalEnvironment(statements, endLexicalEnvironment());
const iife = factory2.createImmediatelyInvokedArrowFunction(statements);
setOriginalNode(iife, node);
setTextRange(iife, node);
addEmitFlags(iife, 4 /* AdviseOnEmitNode */);
return iife;
}
}
function isAnonymousClassNeedingAssignedName(node) {
if (isClassExpression(node) && !node.name) {
const staticPropertiesOrClassStaticBlocks = getStaticPropertiesAndClassStaticBlock(node);
const classStaticBlock = find(staticPropertiesOrClassStaticBlocks, isClassStaticBlockDeclaration);
if (classStaticBlock) {
for (const statement of classStaticBlock.body.statements) {
if (isExpressionStatement(statement) && isCallToHelper(statement.expression, "___setFunctionName")) {
return false;
}
}
}
const hasTransformableStatics = (shouldTransformPrivateElementsOrClassStaticBlocks || !!(getInternalEmitFlags(node) && 32 /* TransformPrivateStaticElements */)) && some(staticPropertiesOrClassStaticBlocks, (node2) => isClassStaticBlockDeclaration(node2) || isPrivateIdentifierClassElementDeclaration(node2) || shouldTransformInitializers && isInitializedProperty(node2));
return hasTransformableStatics;
}
return false;
}
function visitBinaryExpression(node, discarded) {
if (isDestructuringAssignment(node)) {
const savedPendingExpressions = pendingExpressions;
pendingExpressions = void 0;
node = factory2.updateBinaryExpression(
node,
visitNode(node.left, assignmentTargetVisitor, isExpression),
node.operatorToken,
visitNode(node.right, visitor, isExpression)
);
const expr = some(pendingExpressions) ? factory2.inlineExpressions(compact([...pendingExpressions, node])) : node;
pendingExpressions = savedPendingExpressions;
return expr;
}
if (isAssignmentExpression(node)) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.left, node.right);
const left2 = visitNode(node.left, visitor, isExpression);
const right = visitNode(node.right, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateBinaryExpression(node, left2, node.operatorToken, right);
}
const left = skipOuterExpressions(node.left, 8 /* PartiallyEmittedExpressions */ | 1 /* Parentheses */);
if (isPrivateIdentifierPropertyAccessExpression(left)) {
const info = accessPrivateIdentifier2(left.name);
if (info) {
return setTextRange(
setOriginalNode(
createPrivateIdentifierAssignment(info, left.expression, node.right, node.operatorToken.kind),
node
),
node
);
}
} else if (shouldTransformSuperInStaticInitializers && isSuperProperty(node.left) && currentStaticPropertyDeclarationOrStaticBlock && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) {
const { classConstructor, superClassReference, facts } = lexicalEnvironment.data;
if (facts & 1 /* ClassWasDecorated */) {
return factory2.updateBinaryExpression(
node,
visitInvalidSuperProperty(node.left),
node.operatorToken,
visitNode(node.right, visitor, isExpression)
);
}
if (classConstructor && superClassReference) {
let setterName = isElementAccessExpression(node.left) ? visitNode(node.left.argumentExpression, visitor, isExpression) : isIdentifier(node.left.name) ? factory2.createStringLiteralFromNode(node.left.name) : void 0;
if (setterName) {
let expression = visitNode(node.right, visitor, isExpression);
if (isCompoundAssignment(node.operatorToken.kind)) {
let getterName = setterName;
if (!isSimpleInlineableExpression(setterName)) {
getterName = factory2.createTempVariable(hoistVariableDeclaration);
setterName = factory2.createAssignment(getterName, setterName);
}
const superPropertyGet = factory2.createReflectGetCall(
superClassReference,
getterName,
classConstructor
);
setOriginalNode(superPropertyGet, node.left);
setTextRange(superPropertyGet, node.left);
expression = factory2.createBinaryExpression(
superPropertyGet,
getNonAssignmentOperatorForCompoundAssignment(node.operatorToken.kind),
expression
);
setTextRange(expression, node);
}
const temp = discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration);
if (temp) {
expression = factory2.createAssignment(temp, expression);
setTextRange(temp, node);
}
expression = factory2.createReflectSetCall(
superClassReference,
setterName,
expression,
classConstructor
);
setOriginalNode(expression, node);
setTextRange(expression, node);
if (temp) {
expression = factory2.createComma(expression, temp);
setTextRange(expression, node);
}
return expression;
}
}
}
}
if (isPrivateIdentifierInExpression(node)) {
return transformPrivateIdentifierInInExpression(node);
}
return visitEachChild(node, visitor, context);
}
function visitCommaListExpression(node, discarded) {
const elements = discarded ? visitCommaListElements(node.elements, discardedValueVisitor) : visitCommaListElements(node.elements, visitor, discardedValueVisitor);
return factory2.updateCommaListExpression(node, elements);
}
function visitParenthesizedExpression(node, discarded, referencedName) {
const visitorFunc = discarded ? discardedValueVisitor : referencedName ? (node2) => namedEvaluationVisitor(node2, referencedName) : visitor;
const expression = visitNode(node.expression, visitorFunc, isExpression);
return factory2.updateParenthesizedExpression(node, expression);
}
function visitPartiallyEmittedExpression(node, discarded, referencedName) {
const visitorFunc = discarded ? discardedValueVisitor : referencedName ? (node2) => namedEvaluationVisitor(node2, referencedName) : visitor;
const expression = visitNode(node.expression, visitorFunc, isExpression);
return factory2.updatePartiallyEmittedExpression(node, expression);
}
function visitReferencedPropertyName(node) {
if (isPropertyNameLiteral(node) || isPrivateIdentifier(node)) {
const referencedName2 = factory2.createStringLiteralFromNode(node);
const name2 = visitNode(node, visitor, isPropertyName);
return { referencedName: referencedName2, name: name2 };
}
if (isPropertyNameLiteral(node.expression) && !isIdentifier(node.expression)) {
const referencedName2 = factory2.createStringLiteralFromNode(node.expression);
const name2 = visitNode(node, visitor, isPropertyName);
return { referencedName: referencedName2, name: name2 };
}
const referencedName = factory2.createTempVariable(hoistVariableDeclaration);
const key = emitHelpers().createPropKeyHelper(visitNode(node.expression, visitor, isExpression));
const assignment = factory2.createAssignment(referencedName, key);
const name = factory2.updateComputedPropertyName(node, injectPendingExpressions(assignment));
return { referencedName, name };
}
function createPrivateIdentifierAssignment(info, receiver, right, operator) {
receiver = visitNode(receiver, visitor, isExpression);
right = visitNode(right, visitor, isExpression);
if (isCompoundAssignment(operator)) {
const { readExpression, initializeExpression } = createCopiableReceiverExpr(receiver);
receiver = initializeExpression || readExpression;
right = factory2.createBinaryExpression(
createPrivateIdentifierAccessHelper(info, readExpression),
getNonAssignmentOperatorForCompoundAssignment(operator),
right
);
}
setCommentRange(receiver, moveRangePos(receiver, -1));
switch (info.kind) {
case "a" /* Accessor */:
return emitHelpers().createClassPrivateFieldSetHelper(
receiver,
info.brandCheckIdentifier,
right,
info.kind,
info.setterName
);
case "m" /* Method */:
return emitHelpers().createClassPrivateFieldSetHelper(
receiver,
info.brandCheckIdentifier,
right,
info.kind,
/*f*/
void 0
);
case "f" /* Field */:
return emitHelpers().createClassPrivateFieldSetHelper(
receiver,
info.brandCheckIdentifier,
right,
info.kind,
info.isStatic ? info.variableName : void 0
);
case "untransformed":
return Debug.fail("Access helpers should not be created for untransformed private elements");
default:
Debug.assertNever(info, "Unknown private element type");
}
}
function getPrivateInstanceMethodsAndAccessors(node) {
return filter(node.members, isNonStaticMethodOrAccessorWithPrivateName);
}
function getClassFacts(node) {
let facts = 0 /* None */;
const original = getOriginalNode(node);
if (isClassDeclaration(original) && classOrConstructorParameterIsDecorated(legacyDecorators, original)) {
facts |= 1 /* ClassWasDecorated */;
}
let containsPublicInstanceFields = false;
let containsInitializedPublicInstanceFields = false;
let containsInstancePrivateElements = false;
let containsInstanceAutoAccessors = false;
for (const member of node.members) {
if (isStatic(member)) {
if (member.name && (isPrivateIdentifier(member.name) || isAutoAccessorPropertyDeclaration(member)) && shouldTransformPrivateElementsOrClassStaticBlocks) {
facts |= 2 /* NeedsClassConstructorReference */;
}
if (isPropertyDeclaration(member) || isClassStaticBlockDeclaration(member)) {
if (shouldTransformThisInStaticInitializers && member.transformFlags & 16384 /* ContainsLexicalThis */) {
facts |= 8 /* NeedsSubstitutionForThisInClassStaticField */;
if (!(facts & 1 /* ClassWasDecorated */)) {
facts |= 2 /* NeedsClassConstructorReference */;
}
}
if (shouldTransformSuperInStaticInitializers && member.transformFlags & 134217728 /* ContainsLexicalSuper */) {
if (!(facts & 1 /* ClassWasDecorated */)) {
facts |= 2 /* NeedsClassConstructorReference */ | 4 /* NeedsClassSuperReference */;
}
}
}
} else if (!hasAbstractModifier(getOriginalNode(member))) {
if (isAutoAccessorPropertyDeclaration(member)) {
containsInstanceAutoAccessors = true;
containsInstancePrivateElements || (containsInstancePrivateElements = isPrivateIdentifierClassElementDeclaration(member));
} else if (isPrivateIdentifierClassElementDeclaration(member)) {
containsInstancePrivateElements = true;
} else if (isPropertyDeclaration(member)) {
containsPublicInstanceFields = true;
containsInitializedPublicInstanceFields || (containsInitializedPublicInstanceFields = !!member.initializer);
}
}
}
const willHoistInitializersToConstructor = shouldTransformInitializersUsingDefine && containsPublicInstanceFields || shouldTransformInitializersUsingSet && containsInitializedPublicInstanceFields || shouldTransformPrivateElementsOrClassStaticBlocks && containsInstancePrivateElements || shouldTransformPrivateElementsOrClassStaticBlocks && containsInstanceAutoAccessors && shouldTransformAutoAccessors === -1 /* True */;
if (willHoistInitializersToConstructor) {
facts |= 16 /* WillHoistInitializersToConstructor */;
}
return facts;
}
function visitExpressionWithTypeArgumentsInHeritageClause(node) {
var _a;
const facts = ((_a = lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) == null ? void 0 : _a.facts) || 0 /* None */;
if (facts & 4 /* NeedsClassSuperReference */) {
const temp = factory2.createTempVariable(
hoistVariableDeclaration,
/*reservedInNestedScopes*/
true
);
getClassLexicalEnvironment().superClassReference = temp;
return factory2.updateExpressionWithTypeArguments(
node,
factory2.createAssignment(
temp,
visitNode(node.expression, visitor, isExpression)
),
/*typeArguments*/
void 0
);
}
return visitEachChild(node, visitor, context);
}
function visitInNewClassLexicalEnvironment(node, referencedName, visitor2) {
const savedCurrentClassContainer = currentClassContainer;
const savedPendingExpressions = pendingExpressions;
const savedLexicalEnvironment = lexicalEnvironment;
currentClassContainer = node;
pendingExpressions = void 0;
startClassLexicalEnvironment();
const shouldAlwaysTransformPrivateStaticElements = getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */;
if (shouldTransformPrivateElementsOrClassStaticBlocks || shouldAlwaysTransformPrivateStaticElements) {
const name = getNameOfDeclaration(node);
if (name && isIdentifier(name)) {
getPrivateIdentifierEnvironment().data.className = name;
}
}
if (shouldTransformPrivateElementsOrClassStaticBlocks) {
const privateInstanceMethodsAndAccessors = getPrivateInstanceMethodsAndAccessors(node);
if (some(privateInstanceMethodsAndAccessors)) {
getPrivateIdentifierEnvironment().data.weakSetName = createHoistedVariableForClass(
"instances",
privateInstanceMethodsAndAccessors[0].name
);
}
}
const facts = getClassFacts(node);
if (facts) {
getClassLexicalEnvironment().facts = facts;
}
if (facts & 8 /* NeedsSubstitutionForThisInClassStaticField */) {
enableSubstitutionForClassStaticThisOrSuperReference();
}
const result = visitor2(node, facts, referencedName);
endClassLexicalEnvironment();
Debug.assert(lexicalEnvironment === savedLexicalEnvironment);
currentClassContainer = savedCurrentClassContainer;
pendingExpressions = savedPendingExpressions;
return result;
}
function visitClassDeclaration(node) {
return visitInNewClassLexicalEnvironment(
node,
/*referencedName*/
void 0,
visitClassDeclarationInNewClassLexicalEnvironment
);
}
function visitClassDeclarationInNewClassLexicalEnvironment(node, facts) {
var _a, _b;
let pendingClassReferenceAssignment;
if (facts & 2 /* NeedsClassConstructorReference */) {
if (shouldTransformPrivateElementsOrClassStaticBlocks && ((_a = node.emitNode) == null ? void 0 : _a.classThis)) {
getClassLexicalEnvironment().classConstructor = node.emitNode.classThis;
pendingClassReferenceAssignment = factory2.createAssignment(node.emitNode.classThis, factory2.getInternalName(node));
} else {
const temp = factory2.createTempVariable(
hoistVariableDeclaration,
/*reservedInNestedScopes*/
true
);
getClassLexicalEnvironment().classConstructor = factory2.cloneNode(temp);
pendingClassReferenceAssignment = factory2.createAssignment(temp, factory2.getInternalName(node));
}
if ((_b = node.emitNode) == null ? void 0 : _b.classThis) {
getClassLexicalEnvironment().classThis = node.emitNode.classThis;
}
}
const isExport = hasSyntacticModifier(node, 1 /* Export */);
const isDefault = hasSyntacticModifier(node, 1024 /* Default */);
let modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
const heritageClauses = visitNodes2(node.heritageClauses, heritageClauseVisitor, isHeritageClause);
const { members, prologue } = transformClassMembers(node);
const statements = [];
if (pendingClassReferenceAssignment) {
getPendingExpressions().unshift(pendingClassReferenceAssignment);
}
if (some(pendingExpressions)) {
statements.push(factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions)));
}
if (shouldTransformInitializersUsingSet || shouldTransformPrivateElementsOrClassStaticBlocks || getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */) {
const staticProperties = getStaticPropertiesAndClassStaticBlock(node);
if (some(staticProperties)) {
addPropertyOrClassStaticBlockStatements(statements, staticProperties, factory2.getInternalName(node));
}
}
if (statements.length > 0 && isExport && isDefault) {
modifiers = visitNodes2(modifiers, (node2) => isExportOrDefaultModifier(node2) ? void 0 : node2, isModifier);
statements.push(factory2.createExportAssignment(
/*modifiers*/
void 0,
/*isExportEquals*/
false,
factory2.getLocalName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
)
));
}
const classDecl = factory2.updateClassDeclaration(
node,
modifiers,
node.name,
/*typeParameters*/
void 0,
heritageClauses,
members
);
statements.unshift(classDecl);
if (prologue) {
statements.unshift(factory2.createExpressionStatement(prologue));
}
return statements;
}
function visitClassExpression(node, referencedName) {
return visitInNewClassLexicalEnvironment(node, referencedName, visitClassExpressionInNewClassLexicalEnvironment);
}
function visitClassExpressionInNewClassLexicalEnvironment(node, facts, referencedName) {
var _a, _b, _c, _d;
const isDecoratedClassDeclaration = !!(facts & 1 /* ClassWasDecorated */);
const staticPropertiesOrClassStaticBlocks = getStaticPropertiesAndClassStaticBlock(node);
const isClassWithConstructorReference = resolver.getNodeCheckFlags(node) & 1048576 /* ClassWithConstructorReference */;
let temp;
function createClassTempVar() {
var _a2;
if (shouldTransformPrivateElementsOrClassStaticBlocks && ((_a2 = node.emitNode) == null ? void 0 : _a2.classThis)) {
return getClassLexicalEnvironment().classConstructor = node.emitNode.classThis;
}
const classCheckFlags = resolver.getNodeCheckFlags(node);
const isClassWithConstructorReference2 = classCheckFlags & 1048576 /* ClassWithConstructorReference */;
const requiresBlockScopedVar = classCheckFlags & 32768 /* BlockScopedBindingInLoop */;
const temp2 = factory2.createTempVariable(requiresBlockScopedVar ? addBlockScopedVariable : hoistVariableDeclaration, !!isClassWithConstructorReference2);
getClassLexicalEnvironment().classConstructor = factory2.cloneNode(temp2);
return temp2;
}
if ((_a = node.emitNode) == null ? void 0 : _a.classThis) {
getClassLexicalEnvironment().classThis = node.emitNode.classThis;
}
if (facts & 2 /* NeedsClassConstructorReference */) {
temp ?? (temp = createClassTempVar());
}
const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
const heritageClauses = visitNodes2(node.heritageClauses, heritageClauseVisitor, isHeritageClause);
const { members, prologue } = transformClassMembers(node);
let classExpression = factory2.updateClassExpression(
node,
modifiers,
node.name,
/*typeParameters*/
void 0,
heritageClauses,
members
);
const expressions = [];
if (prologue) {
expressions.push(prologue);
}
const hasTransformableStatics = (shouldTransformPrivateElementsOrClassStaticBlocks || getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */) && some(staticPropertiesOrClassStaticBlocks, (node2) => isClassStaticBlockDeclaration(node2) || isPrivateIdentifierClassElementDeclaration(node2) || shouldTransformInitializers && isInitializedProperty(node2));
if (hasTransformableStatics || some(pendingExpressions) || referencedName) {
if (isDecoratedClassDeclaration) {
Debug.assertIsDefined(pendingStatements, "Decorated classes transformed by TypeScript are expected to be within a variable declaration.");
if (some(pendingExpressions)) {
addRange(pendingStatements, map(pendingExpressions, factory2.createExpressionStatement));
}
if (referencedName) {
if (shouldTransformPrivateElementsOrClassStaticBlocks) {
const setNameExpression = emitHelpers().createSetFunctionNameHelper(temp ?? ((_b = node.emitNode) == null ? void 0 : _b.classThis) ?? factory2.getInternalName(node), referencedName);
pendingStatements.push(factory2.createExpressionStatement(setNameExpression));
} else {
const setNameExpression = emitHelpers().createSetFunctionNameHelper(factory2.createThis(), referencedName);
classExpression = factory2.updateClassExpression(
classExpression,
classExpression.modifiers,
classExpression.name,
classExpression.typeParameters,
classExpression.heritageClauses,
[
factory2.createClassStaticBlockDeclaration(
factory2.createBlock([
factory2.createExpressionStatement(setNameExpression)
])
),
...classExpression.members
]
);
}
}
if (some(staticPropertiesOrClassStaticBlocks)) {
addPropertyOrClassStaticBlockStatements(pendingStatements, staticPropertiesOrClassStaticBlocks, ((_c = node.emitNode) == null ? void 0 : _c.classThis) ?? factory2.getInternalName(node));
}
if (temp) {
expressions.push(factory2.createAssignment(temp, classExpression));
} else if (shouldTransformPrivateElementsOrClassStaticBlocks && ((_d = node.emitNode) == null ? void 0 : _d.classThis)) {
expressions.push(factory2.createAssignment(node.emitNode.classThis, classExpression));
} else {
expressions.push(classExpression);
}
} else {
temp ?? (temp = createClassTempVar());
if (isClassWithConstructorReference) {
enableSubstitutionForClassAliases();
const alias = factory2.cloneNode(temp);
alias.emitNode.autoGenerate.flags &= ~8 /* ReservedInNestedScopes */;
classAliases[getOriginalNodeId(node)] = alias;
}
expressions.push(factory2.createAssignment(temp, classExpression));
addRange(expressions, pendingExpressions);
if (referencedName) {
expressions.push(emitHelpers().createSetFunctionNameHelper(temp, referencedName));
}
addRange(expressions, generateInitializedPropertyExpressionsOrClassStaticBlock(staticPropertiesOrClassStaticBlocks, temp));
expressions.push(factory2.cloneNode(temp));
}
} else {
expressions.push(classExpression);
}
if (expressions.length > 1) {
addEmitFlags(classExpression, 131072 /* Indented */);
expressions.forEach(startOnNewLine);
}
return factory2.inlineExpressions(expressions);
}
function visitClassStaticBlockDeclaration(node) {
if (!shouldTransformPrivateElementsOrClassStaticBlocks) {
return visitEachChild(node, visitor, context);
}
return void 0;
}
function transformClassMembers(node) {
const shouldTransformPrivateStaticElementsInClass = !!(getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */);
if (shouldTransformPrivateElementsOrClassStaticBlocks || shouldTransformPrivateStaticElementsInFile) {
for (const member of node.members) {
if (isPrivateIdentifierClassElementDeclaration(member)) {
if (shouldTransformClassElementToWeakMap(member)) {
addPrivateIdentifierToEnvironment(member, member.name, addPrivateIdentifierClassElementToEnvironment);
} else {
const privateEnv = getPrivateIdentifierEnvironment();
setPrivateIdentifier(privateEnv, member.name, { kind: "untransformed" });
}
}
}
if (shouldTransformPrivateElementsOrClassStaticBlocks) {
if (some(getPrivateInstanceMethodsAndAccessors(node))) {
createBrandCheckWeakSetForPrivateMethods();
}
}
if (shouldTransformAutoAccessorsInCurrentClass()) {
for (const member of node.members) {
if (isAutoAccessorPropertyDeclaration(member)) {
const storageName = factory2.getGeneratedPrivateNameForNode(
member.name,
/*prefix*/
void 0,
"_accessor_storage"
);
if (shouldTransformPrivateElementsOrClassStaticBlocks || shouldTransformPrivateStaticElementsInClass && hasStaticModifier(member)) {
addPrivateIdentifierToEnvironment(member, storageName, addPrivateIdentifierPropertyDeclarationToEnvironment);
} else {
const privateEnv = getPrivateIdentifierEnvironment();
setPrivateIdentifier(privateEnv, storageName, { kind: "untransformed" });
}
}
}
}
}
let members = visitNodes2(node.members, classElementVisitor, isClassElement);
let syntheticConstructor;
if (!some(members, isConstructorDeclaration)) {
syntheticConstructor = transformConstructor(
/*constructor*/
void 0,
node
);
}
let prologue;
let syntheticStaticBlock;
if (!shouldTransformPrivateElementsOrClassStaticBlocks && some(pendingExpressions)) {
let statement = factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions));
if (statement.transformFlags & 134234112 /* ContainsLexicalThisOrSuper */) {
const temp = factory2.createTempVariable(hoistVariableDeclaration);
const arrow = factory2.createArrowFunction(
/*modifiers*/
void 0,
/*typeParameters*/
void 0,
/*parameters*/
[],
/*type*/
void 0,
/*equalsGreaterThanToken*/
void 0,
factory2.createBlock([statement])
);
prologue = factory2.createAssignment(temp, arrow);
statement = factory2.createExpressionStatement(factory2.createCallExpression(
temp,
/*typeArguments*/
void 0,
[]
));
}
const block = factory2.createBlock([statement]);
syntheticStaticBlock = factory2.createClassStaticBlockDeclaration(block);
pendingExpressions = void 0;
}
if (syntheticConstructor || syntheticStaticBlock) {
let membersArray;
membersArray = append(membersArray, syntheticConstructor);
membersArray = append(membersArray, syntheticStaticBlock);
membersArray = addRange(membersArray, members);
members = setTextRange(
factory2.createNodeArray(membersArray),
/*location*/
node.members
);
}
return { members, prologue };
}
function createBrandCheckWeakSetForPrivateMethods() {
const { weakSetName } = getPrivateIdentifierEnvironment().data;
Debug.assert(weakSetName, "weakSetName should be set in private identifier environment");
getPendingExpressions().push(
factory2.createAssignment(
weakSetName,
factory2.createNewExpression(
factory2.createIdentifier("WeakSet"),
/*typeArguments*/
void 0,
[]
)
)
);
}
function transformConstructor(constructor, container) {
constructor = visitNode(constructor, visitor, isConstructorDeclaration);
if (!(lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) || !(lexicalEnvironment.data.facts & 16 /* WillHoistInitializersToConstructor */)) {
return constructor;
}
const extendsClauseElement = getEffectiveBaseTypeNode(container);
const isDerivedClass = !!(extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== 106 /* NullKeyword */);
const parameters = visitParameterList(constructor ? constructor.parameters : void 0, visitor, context);
const body = transformConstructorBody(container, constructor, isDerivedClass);
if (!body) {
return constructor;
}
if (constructor) {
Debug.assert(parameters);
return factory2.updateConstructorDeclaration(
constructor,
/*modifiers*/
void 0,
parameters,
body
);
}
return startOnNewLine(
setOriginalNode(
setTextRange(
factory2.createConstructorDeclaration(
/*modifiers*/
void 0,
parameters ?? [],
body
),
constructor || container
),
constructor
)
);
}
function transformConstructorBody(node, constructor, isDerivedClass) {
var _a;
const instanceProperties = getProperties(
node,
/*requireInitializer*/
false,
/*isStatic*/
false
);
let properties = instanceProperties;
if (!useDefineForClassFields) {
properties = filter(properties, (property) => !!property.initializer || isPrivateIdentifier(property.name) || hasAccessorModifier(property));
}
const privateMethodsAndAccessors = getPrivateInstanceMethodsAndAccessors(node);
const needsConstructorBody = some(properties) || some(privateMethodsAndAccessors);
if (!constructor && !needsConstructorBody) {
return visitFunctionBody(
/*node*/
void 0,
visitor,
context
);
}
resumeLexicalEnvironment();
const needsSyntheticConstructor = !constructor && isDerivedClass;
let indexOfFirstStatementAfterSuperAndPrologue = 0;
let prologueStatementCount = 0;
let superStatementIndex = -1;
let statements = [];
if ((_a = constructor == null ? void 0 : constructor.body) == null ? void 0 : _a.statements) {
prologueStatementCount = factory2.copyPrologue(
constructor.body.statements,
statements,
/*ensureUseStrict*/
false,
visitor
);
superStatementIndex = findSuperStatementIndex(constructor.body.statements, prologueStatementCount);
if (superStatementIndex >= 0) {
indexOfFirstStatementAfterSuperAndPrologue = superStatementIndex + 1;
statements = [
...statements.slice(0, prologueStatementCount),
...visitNodes2(constructor.body.statements, visitor, isStatement, prologueStatementCount, indexOfFirstStatementAfterSuperAndPrologue - prologueStatementCount),
...statements.slice(prologueStatementCount)
];
} else if (prologueStatementCount >= 0) {
indexOfFirstStatementAfterSuperAndPrologue = prologueStatementCount;
}
}
if (needsSyntheticConstructor) {
statements.push(
factory2.createExpressionStatement(
factory2.createCallExpression(
factory2.createSuper(),
/*typeArguments*/
void 0,
[factory2.createSpreadElement(factory2.createIdentifier("arguments"))]
)
)
);
}
let parameterPropertyDeclarationCount = 0;
if (constructor == null ? void 0 : constructor.body) {
for (let i = indexOfFirstStatementAfterSuperAndPrologue; i < constructor.body.statements.length; i++) {
const statement = constructor.body.statements[i];
if (isParameterPropertyDeclaration(getOriginalNode(statement), constructor)) {
parameterPropertyDeclarationCount++;
} else {
break;
}
}
if (parameterPropertyDeclarationCount > 0) {
indexOfFirstStatementAfterSuperAndPrologue += parameterPropertyDeclarationCount;
}
}
const receiver = factory2.createThis();
addInstanceMethodStatements(statements, privateMethodsAndAccessors, receiver);
if (constructor) {
const parameterProperties = filter(instanceProperties, (prop) => isParameterPropertyDeclaration(getOriginalNode(prop), constructor));
const nonParameterProperties = filter(properties, (prop) => !isParameterPropertyDeclaration(getOriginalNode(prop), constructor));
addPropertyOrClassStaticBlockStatements(statements, parameterProperties, receiver);
addPropertyOrClassStaticBlockStatements(statements, nonParameterProperties, receiver);
} else {
addPropertyOrClassStaticBlockStatements(statements, properties, receiver);
}
if (constructor) {
addRange(statements, visitNodes2(constructor.body.statements, visitor, isStatement, indexOfFirstStatementAfterSuperAndPrologue));
}
statements = factory2.mergeLexicalEnvironment(statements, endLexicalEnvironment());
if (statements.length === 0 && !constructor) {
return void 0;
}
const multiLine = (constructor == null ? void 0 : constructor.body) && constructor.body.statements.length >= statements.length ? constructor.body.multiLine ?? statements.length > 0 : statements.length > 0;
return setTextRange(
factory2.createBlock(
setTextRange(
factory2.createNodeArray(statements),
/*location*/
constructor ? constructor.body.statements : node.members
),
multiLine
),
/*location*/
constructor ? constructor.body : void 0
);
}
function addPropertyOrClassStaticBlockStatements(statements, properties, receiver) {
for (const property of properties) {
if (isStatic(property) && !shouldTransformPrivateElementsOrClassStaticBlocks) {
continue;
}
const statement = transformPropertyOrClassStaticBlock(property, receiver);
if (!statement) {
continue;
}
statements.push(statement);
}
}
function transformPropertyOrClassStaticBlock(property, receiver) {
const expression = isClassStaticBlockDeclaration(property) ? transformClassStaticBlockDeclaration(property) : transformProperty(property, receiver);
if (!expression) {
return void 0;
}
const statement = factory2.createExpressionStatement(expression);
setOriginalNode(statement, property);
addEmitFlags(statement, getEmitFlags(property) & 3072 /* NoComments */);
setCommentRange(statement, property);
const propertyOriginalNode = getOriginalNode(property);
if (isParameter(propertyOriginalNode)) {
setSourceMapRange(statement, propertyOriginalNode);
removeAllComments(statement);
} else {
setSourceMapRange(statement, moveRangePastModifiers(property));
}
setSyntheticLeadingComments(expression, void 0);
setSyntheticTrailingComments(expression, void 0);
if (hasAccessorModifier(propertyOriginalNode)) {
addEmitFlags(statement, 3072 /* NoComments */);
}
return statement;
}
function generateInitializedPropertyExpressionsOrClassStaticBlock(propertiesOrClassStaticBlocks, receiver) {
const expressions = [];
for (const property of propertiesOrClassStaticBlocks) {
const expression = isClassStaticBlockDeclaration(property) ? transformClassStaticBlockDeclaration(property) : transformProperty(property, receiver);
if (!expression) {
continue;
}
startOnNewLine(expression);
setOriginalNode(expression, property);
addEmitFlags(expression, getEmitFlags(property) & 3072 /* NoComments */);
setSourceMapRange(expression, moveRangePastModifiers(property));
setCommentRange(expression, property);
expressions.push(expression);
}
return expressions;
}
function transformProperty(property, receiver) {
var _a;
const savedCurrentStaticPropertyDeclarationOrStaticBlock = currentStaticPropertyDeclarationOrStaticBlock;
const transformed = transformPropertyWorker(property, receiver);
if (transformed && hasStaticModifier(property) && ((_a = lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) == null ? void 0 : _a.facts)) {
setOriginalNode(transformed, property);
addEmitFlags(transformed, 4 /* AdviseOnEmitNode */);
setSourceMapRange(transformed, getSourceMapRange(property.name));
lexicalEnvironmentMap.set(getOriginalNode(property), lexicalEnvironment);
}
currentStaticPropertyDeclarationOrStaticBlock = savedCurrentStaticPropertyDeclarationOrStaticBlock;
return transformed;
}
function transformPropertyWorker(property, receiver) {
const emitAssignment = !useDefineForClassFields;
let referencedName;
if (isNamedEvaluation(property, isAnonymousClassNeedingAssignedName)) {
if (isPropertyNameLiteral(property.name) || isPrivateIdentifier(property.name)) {
referencedName = factory2.createStringLiteralFromNode(property.name);
} else if (isPropertyNameLiteral(property.name.expression) && !isIdentifier(property.name.expression)) {
referencedName = factory2.createStringLiteralFromNode(property.name.expression);
} else {
referencedName = factory2.getGeneratedNameForNode(property.name);
}
}
const propertyName = hasAccessorModifier(property) ? factory2.getGeneratedPrivateNameForNode(property.name) : isComputedPropertyName(property.name) && !isSimpleInlineableExpression(property.name.expression) ? factory2.updateComputedPropertyName(property.name, factory2.getGeneratedNameForNode(property.name)) : property.name;
if (hasStaticModifier(property)) {
currentStaticPropertyDeclarationOrStaticBlock = property;
}
const initializerVisitor = referencedName ? (child) => namedEvaluationVisitor(child, referencedName) : visitor;
if (isPrivateIdentifier(propertyName) && shouldTransformClassElementToWeakMap(property)) {
const privateIdentifierInfo = accessPrivateIdentifier2(propertyName);
if (privateIdentifierInfo) {
if (privateIdentifierInfo.kind === "f" /* Field */) {
if (!privateIdentifierInfo.isStatic) {
return createPrivateInstanceFieldInitializer(
factory2,
receiver,
visitNode(property.initializer, initializerVisitor, isExpression),
privateIdentifierInfo.brandCheckIdentifier
);
} else {
return createPrivateStaticFieldInitializer(
factory2,
privateIdentifierInfo.variableName,
visitNode(property.initializer, initializerVisitor, isExpression)
);
}
} else {
return void 0;
}
} else {
Debug.fail("Undeclared private name for property declaration.");
}
}
if ((isPrivateIdentifier(propertyName) || hasStaticModifier(property)) && !property.initializer) {
return void 0;
}
const propertyOriginalNode = getOriginalNode(property);
if (hasSyntacticModifier(propertyOriginalNode, 256 /* Abstract */)) {
return void 0;
}
let initializer = visitNode(property.initializer, initializerVisitor, isExpression);
if (isParameterPropertyDeclaration(propertyOriginalNode, propertyOriginalNode.parent) && isIdentifier(propertyName)) {
const localName = factory2.cloneNode(propertyName);
if (initializer) {
if (isParenthesizedExpression(initializer) && isCommaExpression(initializer.expression) && isCallToHelper(initializer.expression.left, "___runInitializers") && isVoidExpression(initializer.expression.right) && isNumericLiteral(initializer.expression.right.expression)) {
initializer = initializer.expression.left;
}
initializer = factory2.inlineExpressions([initializer, localName]);
} else {
initializer = localName;
}
setEmitFlags(propertyName, 3072 /* NoComments */ | 96 /* NoSourceMap */);
setSourceMapRange(localName, propertyOriginalNode.name);
setEmitFlags(localName, 3072 /* NoComments */);
} else {
initializer ?? (initializer = factory2.createVoidZero());
}
if (emitAssignment || isPrivateIdentifier(propertyName)) {
const memberAccess = createMemberAccessForPropertyName(
factory2,
receiver,
propertyName,
/*location*/
propertyName
);
addEmitFlags(memberAccess, 1024 /* NoLeadingComments */);
const expression = factory2.createAssignment(memberAccess, initializer);
return expression;
} else {
const name = isComputedPropertyName(propertyName) ? propertyName.expression : isIdentifier(propertyName) ? factory2.createStringLiteral(unescapeLeadingUnderscores(propertyName.escapedText)) : propertyName;
const descriptor = factory2.createPropertyDescriptor({ value: initializer, configurable: true, writable: true, enumerable: true });
return factory2.createObjectDefinePropertyCall(receiver, name, descriptor);
}
}
function enableSubstitutionForClassAliases() {
if ((enabledSubstitutions & 1 /* ClassAliases */) === 0) {
enabledSubstitutions |= 1 /* ClassAliases */;
context.enableSubstitution(80 /* Identifier */);
classAliases = [];
}
}
function enableSubstitutionForClassStaticThisOrSuperReference() {
if ((enabledSubstitutions & 2 /* ClassStaticThisOrSuperReference */) === 0) {
enabledSubstitutions |= 2 /* ClassStaticThisOrSuperReference */;
context.enableSubstitution(110 /* ThisKeyword */);
context.enableEmitNotification(261 /* FunctionDeclaration */);
context.enableEmitNotification(217 /* FunctionExpression */);
context.enableEmitNotification(175 /* Constructor */);
context.enableEmitNotification(176 /* GetAccessor */);
context.enableEmitNotification(177 /* SetAccessor */);
context.enableEmitNotification(173 /* MethodDeclaration */);
context.enableEmitNotification(171 /* PropertyDeclaration */);
context.enableEmitNotification(166 /* ComputedPropertyName */);
}
}
function addInstanceMethodStatements(statements, methods, receiver) {
if (!shouldTransformPrivateElementsOrClassStaticBlocks || !some(methods)) {
return;
}
const { weakSetName } = getPrivateIdentifierEnvironment().data;
Debug.assert(weakSetName, "weakSetName should be set in private identifier environment");
statements.push(
factory2.createExpressionStatement(
createPrivateInstanceMethodInitializer(factory2, receiver, weakSetName)
)
);
}
function visitInvalidSuperProperty(node) {
return isPropertyAccessExpression(node) ? factory2.updatePropertyAccessExpression(
node,
factory2.createVoidZero(),
node.name
) : factory2.updateElementAccessExpression(
node,
factory2.createVoidZero(),
visitNode(node.argumentExpression, visitor, isExpression)
);
}
function getPropertyNameExpressionIfNeeded(name, shouldHoist, captureReferencedName) {
if (isComputedPropertyName(name)) {
const cacheAssignment = findComputedPropertyNameCacheAssignment(name);
let expression = visitNode(name.expression, visitor, isExpression);
const innerExpression = skipPartiallyEmittedExpressions(expression);
const inlinable = isSimpleInlineableExpression(innerExpression);
const alreadyTransformed = !!cacheAssignment || isAssignmentExpression(innerExpression) && isGeneratedIdentifier(innerExpression.left);
if (!alreadyTransformed && !inlinable && shouldHoist) {
const generatedName = factory2.getGeneratedNameForNode(name);
if (resolver.getNodeCheckFlags(name) & 32768 /* BlockScopedBindingInLoop */) {
addBlockScopedVariable(generatedName);
} else {
hoistVariableDeclaration(generatedName);
}
if (captureReferencedName) {
expression = emitHelpers().createPropKeyHelper(expression);
}
return factory2.createAssignment(generatedName, expression);
}
return inlinable || isIdentifier(innerExpression) ? void 0 : expression;
}
}
function startClassLexicalEnvironment() {
lexicalEnvironment = { previous: lexicalEnvironment, data: void 0 };
}
function endClassLexicalEnvironment() {
lexicalEnvironment = lexicalEnvironment == null ? void 0 : lexicalEnvironment.previous;
}
function getClassLexicalEnvironment() {
Debug.assert(lexicalEnvironment);
return lexicalEnvironment.data ?? (lexicalEnvironment.data = {
facts: 0 /* None */,
classConstructor: void 0,
classThis: void 0,
superClassReference: void 0
// privateIdentifierEnvironment: undefined,
});
}
function getPrivateIdentifierEnvironment() {
Debug.assert(lexicalEnvironment);
return lexicalEnvironment.privateEnv ?? (lexicalEnvironment.privateEnv = newPrivateEnvironment({
className: void 0,
weakSetName: void 0
}));
}
function getPendingExpressions() {
return pendingExpressions ?? (pendingExpressions = []);
}
function addPrivateIdentifierClassElementToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo) {
if (isAutoAccessorPropertyDeclaration(node)) {
addPrivateIdentifierAutoAccessorPropertyDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo);
} else if (isPropertyDeclaration(node)) {
addPrivateIdentifierPropertyDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo);
} else if (isMethodDeclaration(node)) {
addPrivateIdentifierMethodDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo);
} else if (isGetAccessorDeclaration(node)) {
addPrivateIdentifierGetAccessorDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo);
} else if (isSetAccessorDeclaration(node)) {
addPrivateIdentifierSetAccessorDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo);
}
}
function addPrivateIdentifierPropertyDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, _previousInfo) {
if (isStatic2) {
const brandCheckIdentifier = Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment");
const variableName = createHoistedVariableForPrivateName(name);
setPrivateIdentifier(privateEnv, name, {
kind: "f" /* Field */,
isStatic: true,
brandCheckIdentifier,
variableName,
isValid
});
} else {
const weakMapName = createHoistedVariableForPrivateName(name);
setPrivateIdentifier(privateEnv, name, {
kind: "f" /* Field */,
isStatic: false,
brandCheckIdentifier: weakMapName,
isValid
});
getPendingExpressions().push(factory2.createAssignment(
weakMapName,
factory2.createNewExpression(
factory2.createIdentifier("WeakMap"),
/*typeArguments*/
void 0,
[]
)
));
}
}
function addPrivateIdentifierMethodDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, _previousInfo) {
const methodName = createHoistedVariableForPrivateName(name);
const brandCheckIdentifier = isStatic2 ? Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment") : Debug.checkDefined(privateEnv.data.weakSetName, "weakSetName should be set in private identifier environment");
setPrivateIdentifier(privateEnv, name, {
kind: "m" /* Method */,
methodName,
brandCheckIdentifier,
isStatic: isStatic2,
isValid
});
}
function addPrivateIdentifierGetAccessorDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, previousInfo) {
const getterName = createHoistedVariableForPrivateName(name, "_get");
const brandCheckIdentifier = isStatic2 ? Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment") : Debug.checkDefined(privateEnv.data.weakSetName, "weakSetName should be set in private identifier environment");
if ((previousInfo == null ? void 0 : previousInfo.kind) === "a" /* Accessor */ && previousInfo.isStatic === isStatic2 && !previousInfo.getterName) {
previousInfo.getterName = getterName;
} else {
setPrivateIdentifier(privateEnv, name, {
kind: "a" /* Accessor */,
getterName,
setterName: void 0,
brandCheckIdentifier,
isStatic: isStatic2,
isValid
});
}
}
function addPrivateIdentifierSetAccessorDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, previousInfo) {
const setterName = createHoistedVariableForPrivateName(name, "_set");
const brandCheckIdentifier = isStatic2 ? Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment") : Debug.checkDefined(privateEnv.data.weakSetName, "weakSetName should be set in private identifier environment");
if ((previousInfo == null ? void 0 : previousInfo.kind) === "a" /* Accessor */ && previousInfo.isStatic === isStatic2 && !previousInfo.setterName) {
previousInfo.setterName = setterName;
} else {
setPrivateIdentifier(privateEnv, name, {
kind: "a" /* Accessor */,
getterName: void 0,
setterName,
brandCheckIdentifier,
isStatic: isStatic2,
isValid
});
}
}
function addPrivateIdentifierAutoAccessorPropertyDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, _previousInfo) {
const getterName = createHoistedVariableForPrivateName(name, "_get");
const setterName = createHoistedVariableForPrivateName(name, "_set");
const brandCheckIdentifier = isStatic2 ? Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment") : Debug.checkDefined(privateEnv.data.weakSetName, "weakSetName should be set in private identifier environment");
setPrivateIdentifier(privateEnv, name, {
kind: "a" /* Accessor */,
getterName,
setterName,
brandCheckIdentifier,
isStatic: isStatic2,
isValid
});
}
function addPrivateIdentifierToEnvironment(node, name, addDeclaration) {
const lex = getClassLexicalEnvironment();
const privateEnv = getPrivateIdentifierEnvironment();
const previousInfo = getPrivateIdentifier(privateEnv, name);
const isStatic2 = hasStaticModifier(node);
const isValid = !isReservedPrivateName(name) && previousInfo === void 0;
addDeclaration(node, name, lex, privateEnv, isStatic2, isValid, previousInfo);
}
function createHoistedVariableForClass(name, node, suffix) {
const { className } = getPrivateIdentifierEnvironment().data;
const prefix = className ? { prefix: "_", node: className, suffix: "_" } : "_";
const identifier = typeof name === "object" ? factory2.getGeneratedNameForNode(name, 16 /* Optimistic */ | 8 /* ReservedInNestedScopes */, prefix, suffix) : typeof name === "string" ? factory2.createUniqueName(name, 16 /* Optimistic */, prefix, suffix) : factory2.createTempVariable(
/*recordTempVariable*/
void 0,
/*reservedInNestedScopes*/
true,
prefix,
suffix
);
if (resolver.getNodeCheckFlags(node) & 32768 /* BlockScopedBindingInLoop */) {
addBlockScopedVariable(identifier);
} else {
hoistVariableDeclaration(identifier);
}
return identifier;
}
function createHoistedVariableForPrivateName(name, suffix) {
const text = tryGetTextOfPropertyName(name);
return createHoistedVariableForClass((text == null ? void 0 : text.substring(1)) ?? name, name, suffix);
}
function accessPrivateIdentifier2(name) {
const info = accessPrivateIdentifier(lexicalEnvironment, name);
return (info == null ? void 0 : info.kind) === "untransformed" ? void 0 : info;
}
function wrapPrivateIdentifierForDestructuringTarget(node) {
const parameter = factory2.getGeneratedNameForNode(node);
const info = accessPrivateIdentifier2(node.name);
if (!info) {
return visitEachChild(node, visitor, context);
}
let receiver = node.expression;
if (isThisProperty(node) || isSuperProperty(node) || !isSimpleCopiableExpression(node.expression)) {
receiver = factory2.createTempVariable(
hoistVariableDeclaration,
/*reservedInNestedScopes*/
true
);
getPendingExpressions().push(factory2.createBinaryExpression(receiver, 64 /* EqualsToken */, visitNode(node.expression, visitor, isExpression)));
}
return factory2.createAssignmentTargetWrapper(
parameter,
createPrivateIdentifierAssignment(
info,
receiver,
parameter,
64 /* EqualsToken */
)
);
}
function visitDestructuringAssignmentTarget(node) {
if (isObjectLiteralExpression(node) || isArrayLiteralExpression(node)) {
return visitAssignmentPattern(node);
}
if (isPrivateIdentifierPropertyAccessExpression(node)) {
return wrapPrivateIdentifierForDestructuringTarget(node);
} else if (shouldTransformSuperInStaticInitializers && isSuperProperty(node) && currentStaticPropertyDeclarationOrStaticBlock && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) {
const { classConstructor, superClassReference, facts } = lexicalEnvironment.data;
if (facts & 1 /* ClassWasDecorated */) {
return visitInvalidSuperProperty(node);
} else if (classConstructor && superClassReference) {
const name = isElementAccessExpression(node) ? visitNode(node.argumentExpression, visitor, isExpression) : isIdentifier(node.name) ? factory2.createStringLiteralFromNode(node.name) : void 0;
if (name) {
const temp = factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
return factory2.createAssignmentTargetWrapper(
temp,
factory2.createReflectSetCall(
superClassReference,
name,
temp,
classConstructor
)
);
}
}
}
return visitEachChild(node, visitor, context);
}
function visitAssignmentElement(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const left = visitDestructuringAssignmentTarget(node.left);
const assignedName = getAssignedNameOfIdentifier(node.left, node.right);
const right = visitNode(node.right, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateBinaryExpression(node, left, node.operatorToken, right);
}
if (isAssignmentExpression(
node,
/*excludeCompoundAssignment*/
true
)) {
const left = visitDestructuringAssignmentTarget(node.left);
const right = visitNode(node.right, visitor, isExpression);
return factory2.updateBinaryExpression(node, left, node.operatorToken, right);
}
return visitDestructuringAssignmentTarget(node);
}
function visitAssignmentRestElement(node) {
if (isLeftHandSideExpression(node.expression)) {
const expression = visitDestructuringAssignmentTarget(node.expression);
return factory2.updateSpreadElement(node, expression);
}
return visitEachChild(node, visitor, context);
}
function visitArrayAssignmentElement(node) {
if (isArrayBindingOrAssignmentElement(node)) {
if (isSpreadElement(node))
return visitAssignmentRestElement(node);
if (!isOmittedExpression(node))
return visitAssignmentElement(node);
}
return visitEachChild(node, visitor, context);
}
function visitAssignmentProperty(node) {
const name = visitNode(node.name, visitor, isPropertyName);
if (isAssignmentExpression(
node.initializer,
/*excludeCompoundAssignment*/
true
)) {
const assignmentElement = visitAssignmentElement(node.initializer);
return factory2.updatePropertyAssignment(node, name, assignmentElement);
}
if (isLeftHandSideExpression(node.initializer)) {
const assignmentElement = visitDestructuringAssignmentTarget(node.initializer);
return factory2.updatePropertyAssignment(node, name, assignmentElement);
}
return visitEachChild(node, visitor, context);
}
function visitShorthandAssignmentProperty(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.objectAssignmentInitializer);
const objectAssignmentInitializer = visitNode(node.objectAssignmentInitializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateShorthandPropertyAssignment(node, node.name, objectAssignmentInitializer);
}
return visitEachChild(node, visitor, context);
}
function visitAssignmentRestProperty(node) {
if (isLeftHandSideExpression(node.expression)) {
const expression = visitDestructuringAssignmentTarget(node.expression);
return factory2.updateSpreadAssignment(node, expression);
}
return visitEachChild(node, visitor, context);
}
function visitObjectAssignmentElement(node) {
Debug.assertNode(node, isObjectBindingOrAssignmentElement);
if (isSpreadAssignment(node))
return visitAssignmentRestProperty(node);
if (isShorthandPropertyAssignment(node))
return visitShorthandAssignmentProperty(node);
if (isPropertyAssignment(node))
return visitAssignmentProperty(node);
return visitEachChild(node, visitor, context);
}
function visitAssignmentPattern(node) {
if (isArrayLiteralExpression(node)) {
return factory2.updateArrayLiteralExpression(
node,
visitNodes2(node.elements, visitArrayAssignmentElement, isExpression)
);
} else {
return factory2.updateObjectLiteralExpression(
node,
visitNodes2(node.properties, visitObjectAssignmentElement, isObjectLiteralElementLike)
);
}
}
function onEmitNode(hint, node, emitCallback) {
const original = getOriginalNode(node);
const lex = lexicalEnvironmentMap.get(original);
if (lex) {
const savedLexicalEnvironment = lexicalEnvironment;
const savedPreviousShouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis;
lexicalEnvironment = lex;
previousShouldSubstituteThisWithClassThis = shouldSubstituteThisWithClassThis;
shouldSubstituteThisWithClassThis = !isClassStaticBlockDeclaration(original) || !(getInternalEmitFlags(original) & 32 /* TransformPrivateStaticElements */);
previousOnEmitNode(hint, node, emitCallback);
shouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis;
previousShouldSubstituteThisWithClassThis = savedPreviousShouldSubstituteThisWithClassThis;
lexicalEnvironment = savedLexicalEnvironment;
return;
}
switch (node.kind) {
case 217 /* FunctionExpression */:
if (isArrowFunction(original) || getEmitFlags(node) & 524288 /* AsyncFunctionBody */) {
break;
}
case 261 /* FunctionDeclaration */:
case 175 /* Constructor */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 173 /* MethodDeclaration */:
case 171 /* PropertyDeclaration */: {
const savedLexicalEnvironment = lexicalEnvironment;
const savedPreviousShouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis;
lexicalEnvironment = void 0;
previousShouldSubstituteThisWithClassThis = shouldSubstituteThisWithClassThis;
shouldSubstituteThisWithClassThis = false;
previousOnEmitNode(hint, node, emitCallback);
shouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis;
previousShouldSubstituteThisWithClassThis = savedPreviousShouldSubstituteThisWithClassThis;
lexicalEnvironment = savedLexicalEnvironment;
return;
}
case 166 /* ComputedPropertyName */: {
const savedLexicalEnvironment = lexicalEnvironment;
const savedShouldSubstituteThisWithClassThis = shouldSubstituteThisWithClassThis;
lexicalEnvironment = lexicalEnvironment == null ? void 0 : lexicalEnvironment.previous;
shouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis;
previousOnEmitNode(hint, node, emitCallback);
shouldSubstituteThisWithClassThis = savedShouldSubstituteThisWithClassThis;
lexicalEnvironment = savedLexicalEnvironment;
return;
}
}
previousOnEmitNode(hint, node, emitCallback);
}
function onSubstituteNode(hint, node) {
node = previousOnSubstituteNode(hint, node);
if (hint === 1 /* Expression */) {
return substituteExpression(node);
}
return node;
}
function substituteExpression(node) {
switch (node.kind) {
case 80 /* Identifier */:
return substituteExpressionIdentifier(node);
case 110 /* ThisKeyword */:
return substituteThisExpression(node);
}
return node;
}
function substituteThisExpression(node) {
if (enabledSubstitutions & 2 /* ClassStaticThisOrSuperReference */ && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) {
const { facts, classConstructor, classThis } = lexicalEnvironment.data;
if (facts & 1 /* ClassWasDecorated */ && legacyDecorators) {
return factory2.createParenthesizedExpression(factory2.createVoidZero());
}
const substituteThis = shouldSubstituteThisWithClassThis ? classThis ?? classConstructor : classConstructor;
if (substituteThis) {
return setTextRange(
setOriginalNode(
factory2.cloneNode(substituteThis),
node
),
node
);
}
}
return node;
}
function substituteExpressionIdentifier(node) {
return trySubstituteClassAlias(node) || node;
}
function trySubstituteClassAlias(node) {
if (enabledSubstitutions & 1 /* ClassAliases */) {
if (resolver.getNodeCheckFlags(node) & 2097152 /* ConstructorReferenceInClass */) {
const declaration = resolver.getReferencedValueDeclaration(node);
if (declaration) {
const classAlias = classAliases[declaration.id];
if (classAlias) {
const clone2 = factory2.cloneNode(classAlias);
setSourceMapRange(clone2, node);
setCommentRange(clone2, node);
return clone2;
}
}
}
}
return void 0;
}
}
function createPrivateStaticFieldInitializer(factory2, variableName, initializer) {
return factory2.createAssignment(
variableName,
factory2.createObjectLiteralExpression([
factory2.createPropertyAssignment("value", initializer || factory2.createVoidZero())
])
);
}
function createPrivateInstanceFieldInitializer(factory2, receiver, initializer, weakMapName) {
return factory2.createCallExpression(
factory2.createPropertyAccessExpression(weakMapName, "set"),
/*typeArguments*/
void 0,
[receiver, initializer || factory2.createVoidZero()]
);
}
function createPrivateInstanceMethodInitializer(factory2, receiver, weakSetName) {
return factory2.createCallExpression(
factory2.createPropertyAccessExpression(weakSetName, "add"),
/*typeArguments*/
void 0,
[receiver]
);
}
function isReservedPrivateName(node) {
return !isGeneratedPrivateIdentifier(node) && node.escapedText === "#constructor";
}
function isPrivateIdentifierInExpression(node) {
return isPrivateIdentifier(node.left) && node.operatorToken.kind === 103 /* InKeyword */;
}
// src/compiler/transformers/typeSerializer.ts
function createRuntimeTypeSerializer(context) {
const {
factory: factory2,
hoistVariableDeclaration
} = context;
const resolver = context.getEmitResolver();
const compilerOptions = context.getCompilerOptions();
const languageVersion = getEmitScriptTarget(compilerOptions);
const strictNullChecks = getStrictOptionValue(compilerOptions, "strictNullChecks");
let currentLexicalScope;
let currentNameScope;
return {
serializeTypeNode: (serializerContext, node) => setSerializerContextAnd(serializerContext, serializeTypeNode, node),
serializeTypeOfNode: (serializerContext, node) => setSerializerContextAnd(serializerContext, serializeTypeOfNode, node),
serializeParameterTypesOfNode: (serializerContext, node, container) => setSerializerContextAnd(serializerContext, serializeParameterTypesOfNode, node, container),
serializeReturnTypeOfNode: (serializerContext, node) => setSerializerContextAnd(serializerContext, serializeReturnTypeOfNode, node)
};
function setSerializerContextAnd(serializerContext, cb, node, arg) {
const savedCurrentLexicalScope = currentLexicalScope;
const savedCurrentNameScope = currentNameScope;
currentLexicalScope = serializerContext.currentLexicalScope;
currentNameScope = serializerContext.currentNameScope;
const result = arg === void 0 ? cb(node) : cb(node, arg);
currentLexicalScope = savedCurrentLexicalScope;
currentNameScope = savedCurrentNameScope;
return result;
}
function getAccessorTypeNode(node) {
const accessors = resolver.getAllAccessorDeclarations(node);
return accessors.setAccessor && getSetAccessorTypeAnnotationNode(accessors.setAccessor) || accessors.getAccessor && getEffectiveReturnTypeNode(accessors.getAccessor);
}
function serializeTypeOfNode(node) {
switch (node.kind) {
case 171 /* PropertyDeclaration */:
case 168 /* Parameter */:
return serializeTypeNode(node.type);
case 177 /* SetAccessor */:
case 176 /* GetAccessor */:
return serializeTypeNode(getAccessorTypeNode(node));
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 173 /* MethodDeclaration */:
return factory2.createIdentifier("Function");
default:
return factory2.createVoidZero();
}
}
function serializeParameterTypesOfNode(node, container) {
const valueDeclaration = isClassLike(node) ? getFirstConstructorWithBody(node) : isFunctionLike(node) && nodeIsPresent(node.body) ? node : void 0;
const expressions = [];
if (valueDeclaration) {
const parameters = getParametersOfDecoratedDeclaration(valueDeclaration, container);
const numParameters = parameters.length;
for (let i = 0; i < numParameters; i++) {
const parameter = parameters[i];
if (i === 0 && isIdentifier(parameter.name) && parameter.name.escapedText === "this") {
continue;
}
if (parameter.dotDotDotToken) {
expressions.push(serializeTypeNode(getRestParameterElementType(parameter.type)));
} else {
expressions.push(serializeTypeOfNode(parameter));
}
}
}
return factory2.createArrayLiteralExpression(expressions);
}
function getParametersOfDecoratedDeclaration(node, container) {
if (container && node.kind === 176 /* GetAccessor */) {
const { setAccessor } = getAllAccessorDeclarations(container.members, node);
if (setAccessor) {
return setAccessor.parameters;
}
}
return node.parameters;
}
function serializeReturnTypeOfNode(node) {
if (isFunctionLike(node) && node.type) {
return serializeTypeNode(node.type);
} else if (isAsyncFunction(node)) {
return factory2.createIdentifier("Promise");
}
return factory2.createVoidZero();
}
function serializeTypeNode(node) {
if (node === void 0) {
return factory2.createIdentifier("Object");
}
node = skipTypeParentheses(node);
switch (node.kind) {
case 116 /* VoidKeyword */:
case 157 /* UndefinedKeyword */:
case 146 /* NeverKeyword */:
return factory2.createVoidZero();
case 183 /* FunctionType */:
case 184 /* ConstructorType */:
return factory2.createIdentifier("Function");
case 187 /* ArrayType */:
case 188 /* TupleType */:
return factory2.createIdentifier("Array");
case 181 /* TypePredicate */:
return node.assertsModifier ? factory2.createVoidZero() : factory2.createIdentifier("Boolean");
case 136 /* BooleanKeyword */:
return factory2.createIdentifier("Boolean");
case 202 /* TemplateLiteralType */:
case 154 /* StringKeyword */:
return factory2.createIdentifier("String");
case 151 /* ObjectKeyword */:
return factory2.createIdentifier("Object");
case 200 /* LiteralType */:
return serializeLiteralOfLiteralTypeNode(node.literal);
case 150 /* NumberKeyword */:
return factory2.createIdentifier("Number");
case 162 /* BigIntKeyword */:
return getGlobalConstructor("BigInt", 7 /* ES2020 */);
case 155 /* SymbolKeyword */:
return getGlobalConstructor("Symbol", 2 /* ES2015 */);
case 182 /* TypeReference */:
return serializeTypeReferenceNode(node);
case 192 /* IntersectionType */:
return serializeUnionOrIntersectionConstituents(
node.types,
/*isIntersection*/
true
);
case 191 /* UnionType */:
return serializeUnionOrIntersectionConstituents(
node.types,
/*isIntersection*/
false
);
case 193 /* ConditionalType */:
return serializeUnionOrIntersectionConstituents(
[node.trueType, node.falseType],
/*isIntersection*/
false
);
case 197 /* TypeOperator */:
if (node.operator === 148 /* ReadonlyKeyword */) {
return serializeTypeNode(node.type);
}
break;
case 185 /* TypeQuery */:
case 198 /* IndexedAccessType */:
case 199 /* MappedType */:
case 186 /* TypeLiteral */:
case 133 /* AnyKeyword */:
case 159 /* UnknownKeyword */:
case 196 /* ThisType */:
case 204 /* ImportType */:
break;
case 318 /* JSDocAllType */:
case 319 /* JSDocUnknownType */:
case 323 /* JSDocFunctionType */:
case 324 /* JSDocVariadicType */:
case 325 /* JSDocNamepathType */:
break;
case 320 /* JSDocNullableType */:
case 321 /* JSDocNonNullableType */:
case 322 /* JSDocOptionalType */:
return serializeTypeNode(node.type);
default:
return Debug.failBadSyntaxKind(node);
}
return factory2.createIdentifier("Object");
}
function serializeLiteralOfLiteralTypeNode(node) {
switch (node.kind) {
case 11 /* StringLiteral */:
case 15 /* NoSubstitutionTemplateLiteral */:
return factory2.createIdentifier("String");
case 223 /* PrefixUnaryExpression */: {
const operand = node.operand;
switch (operand.kind) {
case 9 /* NumericLiteral */:
case 10 /* BigIntLiteral */:
return serializeLiteralOfLiteralTypeNode(operand);
default:
return Debug.failBadSyntaxKind(operand);
}
}
case 9 /* NumericLiteral */:
return factory2.createIdentifier("Number");
case 10 /* BigIntLiteral */:
return getGlobalConstructor("BigInt", 7 /* ES2020 */);
case 112 /* TrueKeyword */:
case 97 /* FalseKeyword */:
return factory2.createIdentifier("Boolean");
case 106 /* NullKeyword */:
return factory2.createVoidZero();
default:
return Debug.failBadSyntaxKind(node);
}
}
function serializeUnionOrIntersectionConstituents(types, isIntersection) {
let serializedType;
for (let typeNode of types) {
typeNode = skipTypeParentheses(typeNode);
if (typeNode.kind === 146 /* NeverKeyword */) {
if (isIntersection)
return factory2.createVoidZero();
continue;
}
if (typeNode.kind === 159 /* UnknownKeyword */) {
if (!isIntersection)
return factory2.createIdentifier("Object");
continue;
}
if (typeNode.kind === 133 /* AnyKeyword */) {
return factory2.createIdentifier("Object");
}
if (!strictNullChecks && (isLiteralTypeNode(typeNode) && typeNode.literal.kind === 106 /* NullKeyword */ || typeNode.kind === 157 /* UndefinedKeyword */)) {
continue;
}
const serializedConstituent = serializeTypeNode(typeNode);
if (isIdentifier(serializedConstituent) && serializedConstituent.escapedText === "Object") {
return serializedConstituent;
}
if (serializedType) {
if (!equateSerializedTypeNodes(serializedType, serializedConstituent)) {
return factory2.createIdentifier("Object");
}
} else {
serializedType = serializedConstituent;
}
}
return serializedType ?? factory2.createVoidZero();
}
function equateSerializedTypeNodes(left, right) {
return (
// temp vars used in fallback
isGeneratedIdentifier(left) ? isGeneratedIdentifier(right) : (
// entity names
isIdentifier(left) ? isIdentifier(right) && left.escapedText === right.escapedText : isPropertyAccessExpression(left) ? isPropertyAccessExpression(right) && equateSerializedTypeNodes(left.expression, right.expression) && equateSerializedTypeNodes(left.name, right.name) : (
// `void 0`
isVoidExpression(left) ? isVoidExpression(right) && isNumericLiteral(left.expression) && left.expression.text === "0" && isNumericLiteral(right.expression) && right.expression.text === "0" : (
// `"undefined"` or `"function"` in `typeof` checks
isStringLiteral(left) ? isStringLiteral(right) && left.text === right.text : (
// used in `typeof` checks for fallback
isTypeOfExpression(left) ? isTypeOfExpression(right) && equateSerializedTypeNodes(left.expression, right.expression) : (
// parens in `typeof` checks with temps
isParenthesizedExpression(left) ? isParenthesizedExpression(right) && equateSerializedTypeNodes(left.expression, right.expression) : (
// conditionals used in fallback
isConditionalExpression(left) ? isConditionalExpression(right) && equateSerializedTypeNodes(left.condition, right.condition) && equateSerializedTypeNodes(left.whenTrue, right.whenTrue) && equateSerializedTypeNodes(left.whenFalse, right.whenFalse) : (
// logical binary and assignments used in fallback
isBinaryExpression(left) ? isBinaryExpression(right) && left.operatorToken.kind === right.operatorToken.kind && equateSerializedTypeNodes(left.left, right.left) && equateSerializedTypeNodes(left.right, right.right) : false
)
)
)
)
)
)
)
);
}
function serializeTypeReferenceNode(node) {
const kind = resolver.getTypeReferenceSerializationKind(node.typeName, currentNameScope ?? currentLexicalScope);
switch (kind) {
case 0 /* Unknown */:
if (findAncestor(node, (n) => n.parent && isConditionalTypeNode(n.parent) && (n.parent.trueType === n || n.parent.falseType === n))) {
return factory2.createIdentifier("Object");
}
const serialized = serializeEntityNameAsExpressionFallback(node.typeName);
const temp = factory2.createTempVariable(hoistVariableDeclaration);
return factory2.createConditionalExpression(
factory2.createTypeCheck(factory2.createAssignment(temp, serialized), "function"),
/*questionToken*/
void 0,
temp,
/*colonToken*/
void 0,
factory2.createIdentifier("Object")
);
case 1 /* TypeWithConstructSignatureAndValue */:
return serializeEntityNameAsExpression(node.typeName);
case 2 /* VoidNullableOrNeverType */:
return factory2.createVoidZero();
case 4 /* BigIntLikeType */:
return getGlobalConstructor("BigInt", 7 /* ES2020 */);
case 6 /* BooleanType */:
return factory2.createIdentifier("Boolean");
case 3 /* NumberLikeType */:
return factory2.createIdentifier("Number");
case 5 /* StringLikeType */:
return factory2.createIdentifier("String");
case 7 /* ArrayLikeType */:
return factory2.createIdentifier("Array");
case 8 /* ESSymbolType */:
return getGlobalConstructor("Symbol", 2 /* ES2015 */);
case 10 /* TypeWithCallSignature */:
return factory2.createIdentifier("Function");
case 9 /* Promise */:
return factory2.createIdentifier("Promise");
case 11 /* ObjectType */:
return factory2.createIdentifier("Object");
default:
return Debug.assertNever(kind);
}
}
function createCheckedValue(left, right) {
return factory2.createLogicalAnd(
factory2.createStrictInequality(factory2.createTypeOfExpression(left), factory2.createStringLiteral("undefined")),
right
);
}
function serializeEntityNameAsExpressionFallback(node) {
if (node.kind === 80 /* Identifier */) {
const copied = serializeEntityNameAsExpression(node);
return createCheckedValue(copied, copied);
}
if (node.left.kind === 80 /* Identifier */) {
return createCheckedValue(serializeEntityNameAsExpression(node.left), serializeEntityNameAsExpression(node));
}
const left = serializeEntityNameAsExpressionFallback(node.left);
const temp = factory2.createTempVariable(hoistVariableDeclaration);
return factory2.createLogicalAnd(
factory2.createLogicalAnd(
left.left,
factory2.createStrictInequality(factory2.createAssignment(temp, left.right), factory2.createVoidZero())
),
factory2.createPropertyAccessExpression(temp, node.right)
);
}
function serializeEntityNameAsExpression(node) {
switch (node.kind) {
case 80 /* Identifier */:
const name = setParent(setTextRange(parseNodeFactory.cloneNode(node), node), node.parent);
name.original = void 0;
setParent(name, getParseTreeNode(currentLexicalScope));
return name;
case 165 /* QualifiedName */:
return serializeQualifiedNameAsExpression(node);
}
}
function serializeQualifiedNameAsExpression(node) {
return factory2.createPropertyAccessExpression(serializeEntityNameAsExpression(node.left), node.right);
}
function getGlobalConstructorWithFallback(name) {
return factory2.createConditionalExpression(
factory2.createTypeCheck(factory2.createIdentifier(name), "function"),
/*questionToken*/
void 0,
factory2.createIdentifier(name),
/*colonToken*/
void 0,
factory2.createIdentifier("Object")
);
}
function getGlobalConstructor(name, minLanguageVersion) {
return languageVersion < minLanguageVersion ? getGlobalConstructorWithFallback(name) : factory2.createIdentifier(name);
}
}
// src/compiler/transformers/legacyDecorators.ts
function transformLegacyDecorators(context) {
const {
factory: factory2,
getEmitHelperFactory: emitHelpers,
hoistVariableDeclaration
} = context;
const resolver = context.getEmitResolver();
const compilerOptions = context.getCompilerOptions();
const languageVersion = getEmitScriptTarget(compilerOptions);
const previousOnSubstituteNode = context.onSubstituteNode;
context.onSubstituteNode = onSubstituteNode;
let classAliases;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
const visited = visitEachChild(node, visitor, context);
addEmitHelpers(visited, context.readEmitHelpers());
return visited;
}
function modifierVisitor(node) {
return isDecorator(node) ? void 0 : node;
}
function visitor(node) {
if (!(node.transformFlags & 33554432 /* ContainsDecorators */)) {
return node;
}
switch (node.kind) {
case 169 /* Decorator */:
return void 0;
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
case 230 /* ClassExpression */:
return visitClassExpression(node);
case 175 /* Constructor */:
return visitConstructorDeclaration(node);
case 173 /* MethodDeclaration */:
return visitMethodDeclaration(node);
case 177 /* SetAccessor */:
return visitSetAccessorDeclaration(node);
case 176 /* GetAccessor */:
return visitGetAccessorDeclaration(node);
case 171 /* PropertyDeclaration */:
return visitPropertyDeclaration(node);
case 168 /* Parameter */:
return visitParameterDeclaration(node);
default:
return visitEachChild(node, visitor, context);
}
}
function visitClassDeclaration(node) {
if (!(classOrConstructorParameterIsDecorated(
/*useLegacyDecorators*/
true,
node
) || childIsDecorated(
/*useLegacyDecorators*/
true,
node
))) {
return visitEachChild(node, visitor, context);
}
const statements = classOrConstructorParameterIsDecorated(
/*useLegacyDecorators*/
true,
node
) ? transformClassDeclarationWithClassDecorators(node, node.name) : transformClassDeclarationWithoutClassDecorators(node, node.name);
return singleOrMany(statements);
}
function decoratorContainsPrivateIdentifierInExpression(decorator) {
return !!(decorator.transformFlags & 536870912 /* ContainsPrivateIdentifierInExpression */);
}
function parameterDecoratorsContainPrivateIdentifierInExpression(parameterDecorators) {
return some(parameterDecorators, decoratorContainsPrivateIdentifierInExpression);
}
function hasClassElementWithDecoratorContainingPrivateIdentifierInExpression(node) {
for (const member of node.members) {
if (!canHaveDecorators(member))
continue;
const allDecorators = getAllDecoratorsOfClassElement(
member,
node,
/*useLegacyDecorators*/
true
);
if (some(allDecorators == null ? void 0 : allDecorators.decorators, decoratorContainsPrivateIdentifierInExpression))
return true;
if (some(allDecorators == null ? void 0 : allDecorators.parameters, parameterDecoratorsContainPrivateIdentifierInExpression))
return true;
}
return false;
}
function transformDecoratorsOfClassElements(node, members) {
let decorationStatements = [];
addClassElementDecorationStatements(
decorationStatements,
node,
/*isStatic*/
false
);
addClassElementDecorationStatements(
decorationStatements,
node,
/*isStatic*/
true
);
if (hasClassElementWithDecoratorContainingPrivateIdentifierInExpression(node)) {
members = setTextRange(factory2.createNodeArray([
...members,
factory2.createClassStaticBlockDeclaration(
factory2.createBlock(
decorationStatements,
/*multiLine*/
true
)
)
]), members);
decorationStatements = void 0;
}
return { decorationStatements, members };
}
function transformClassDeclarationWithoutClassDecorators(node, name) {
const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
const heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause);
let members = visitNodes2(node.members, visitor, isClassElement);
let decorationStatements = [];
({ members, decorationStatements } = transformDecoratorsOfClassElements(node, members));
const updated = factory2.updateClassDeclaration(
node,
modifiers,
name,
/*typeParameters*/
void 0,
heritageClauses,
members
);
return addRange([updated], decorationStatements);
}
function transformClassDeclarationWithClassDecorators(node, name) {
const isExport = hasSyntacticModifier(node, 1 /* Export */);
const isDefault = hasSyntacticModifier(node, 1024 /* Default */);
const modifiers = visitNodes2(node.modifiers, (node2) => isExportOrDefaultModifier(node2) || isDecorator(node2) ? void 0 : node2, isModifierLike);
const location = moveRangePastModifiers(node);
const classAlias = getClassAliasIfNeeded(node);
const declName = languageVersion < 2 /* ES2015 */ ? factory2.getInternalName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
) : factory2.getLocalName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
);
const heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause);
let members = visitNodes2(node.members, visitor, isClassElement);
let decorationStatements = [];
({ members, decorationStatements } = transformDecoratorsOfClassElements(node, members));
const assignClassAliasInStaticBlock = languageVersion >= 9 /* ES2022 */ && !!classAlias && some(members, (member) => isPropertyDeclaration(member) && hasSyntacticModifier(member, 32 /* Static */) || isClassStaticBlockDeclaration(member));
if (assignClassAliasInStaticBlock) {
members = setTextRange(factory2.createNodeArray([
factory2.createClassStaticBlockDeclaration(
factory2.createBlock([
factory2.createExpressionStatement(
factory2.createAssignment(classAlias, factory2.createThis())
)
])
),
...members
]), members);
}
const classExpression = factory2.createClassExpression(
modifiers,
name && isGeneratedIdentifier(name) ? void 0 : name,
/*typeParameters*/
void 0,
heritageClauses,
members
);
setOriginalNode(classExpression, node);
setTextRange(classExpression, location);
const varDecl = factory2.createVariableDeclaration(
declName,
/*exclamationToken*/
void 0,
/*type*/
void 0,
classAlias && !assignClassAliasInStaticBlock ? factory2.createAssignment(classAlias, classExpression) : classExpression
);
setOriginalNode(varDecl, node);
let varModifiers;
if (isExport && !isDefault) {
varModifiers = factory2.createModifiersFromModifierFlags(1 /* Export */);
}
const statement = factory2.createVariableStatement(
varModifiers,
factory2.createVariableDeclarationList([
varDecl
], 1 /* Let */)
);
setOriginalNode(statement, node);
setTextRange(statement, location);
setCommentRange(statement, node);
const statements = [statement];
addRange(statements, decorationStatements);
addConstructorDecorationStatement(statements, node);
if (isExport && isDefault) {
statements.push(factory2.createExportAssignment(
/*modifiers*/
void 0,
/*isExportEquals*/
false,
declName
));
}
return statements;
}
function visitClassExpression(node) {
return factory2.updateClassExpression(
node,
visitNodes2(node.modifiers, modifierVisitor, isModifier),
node.name,
/*typeParameters*/
void 0,
visitNodes2(node.heritageClauses, visitor, isHeritageClause),
visitNodes2(node.members, visitor, isClassElement)
);
}
function visitConstructorDeclaration(node) {
return factory2.updateConstructorDeclaration(
node,
visitNodes2(node.modifiers, modifierVisitor, isModifier),
visitNodes2(node.parameters, visitor, isParameter),
visitNode(node.body, visitor, isBlock)
);
}
function finishClassElement(updated, original) {
if (updated !== original) {
setCommentRange(updated, original);
setSourceMapRange(updated, moveRangePastModifiers(original));
}
return updated;
}
function visitMethodDeclaration(node) {
return finishClassElement(factory2.updateMethodDeclaration(
node,
visitNodes2(node.modifiers, modifierVisitor, isModifier),
node.asteriskToken,
Debug.checkDefined(visitNode(node.name, visitor, isPropertyName)),
/*questionToken*/
void 0,
/*typeParameters*/
void 0,
visitNodes2(node.parameters, visitor, isParameter),
/*type*/
void 0,
visitNode(node.body, visitor, isBlock)
), node);
}
function visitGetAccessorDeclaration(node) {
return finishClassElement(factory2.updateGetAccessorDeclaration(
node,
visitNodes2(node.modifiers, modifierVisitor, isModifier),
Debug.checkDefined(visitNode(node.name, visitor, isPropertyName)),
visitNodes2(node.parameters, visitor, isParameter),
/*type*/
void 0,
visitNode(node.body, visitor, isBlock)
), node);
}
function visitSetAccessorDeclaration(node) {
return finishClassElement(factory2.updateSetAccessorDeclaration(
node,
visitNodes2(node.modifiers, modifierVisitor, isModifier),
Debug.checkDefined(visitNode(node.name, visitor, isPropertyName)),
visitNodes2(node.parameters, visitor, isParameter),
visitNode(node.body, visitor, isBlock)
), node);
}
function visitPropertyDeclaration(node) {
if (node.flags & 16777216 /* Ambient */ || hasSyntacticModifier(node, 2 /* Ambient */)) {
return void 0;
}
return finishClassElement(factory2.updatePropertyDeclaration(
node,
visitNodes2(node.modifiers, modifierVisitor, isModifier),
Debug.checkDefined(visitNode(node.name, visitor, isPropertyName)),
/*questionOrExclamationToken*/
void 0,
/*type*/
void 0,
visitNode(node.initializer, visitor, isExpression)
), node);
}
function visitParameterDeclaration(node) {
const updated = factory2.updateParameterDeclaration(
node,
elideNodes(factory2, node.modifiers),
node.dotDotDotToken,
Debug.checkDefined(visitNode(node.name, visitor, isBindingName)),
/*questionToken*/
void 0,
/*type*/
void 0,
visitNode(node.initializer, visitor, isExpression)
);
if (updated !== node) {
setCommentRange(updated, node);
setTextRange(updated, moveRangePastModifiers(node));
setSourceMapRange(updated, moveRangePastModifiers(node));
setEmitFlags(updated.name, 64 /* NoTrailingSourceMap */);
}
return updated;
}
function isSyntheticMetadataDecorator(node) {
return isCallToHelper(node.expression, "___metadata");
}
function transformAllDecoratorsOfDeclaration(allDecorators) {
if (!allDecorators) {
return void 0;
}
const { false: decorators, true: metadata } = groupBy(allDecorators.decorators, isSyntheticMetadataDecorator);
const decoratorExpressions = [];
addRange(decoratorExpressions, map(decorators, transformDecorator));
addRange(decoratorExpressions, flatMap(allDecorators.parameters, transformDecoratorsOfParameter));
addRange(decoratorExpressions, map(metadata, transformDecorator));
return decoratorExpressions;
}
function addClassElementDecorationStatements(statements, node, isStatic2) {
addRange(statements, map(generateClassElementDecorationExpressions(node, isStatic2), (expr) => factory2.createExpressionStatement(expr)));
}
function isDecoratedClassElement(member, isStaticElement, parent) {
return nodeOrChildIsDecorated(
/*useLegacyDecorators*/
true,
member,
parent
) && isStaticElement === isStatic(member);
}
function getDecoratedClassElements(node, isStatic2) {
return filter(node.members, (m) => isDecoratedClassElement(m, isStatic2, node));
}
function generateClassElementDecorationExpressions(node, isStatic2) {
const members = getDecoratedClassElements(node, isStatic2);
let expressions;
for (const member of members) {
expressions = append(expressions, generateClassElementDecorationExpression(node, member));
}
return expressions;
}
function generateClassElementDecorationExpression(node, member) {
const allDecorators = getAllDecoratorsOfClassElement(
member,
node,
/*useLegacyDecorators*/
true
);
const decoratorExpressions = transformAllDecoratorsOfDeclaration(allDecorators);
if (!decoratorExpressions) {
return void 0;
}
const prefix = getClassMemberPrefix(node, member);
const memberName = getExpressionForPropertyName(
member,
/*generateNameForComputedPropertyName*/
!hasSyntacticModifier(member, 2 /* Ambient */)
);
const descriptor = languageVersion > 0 /* ES3 */ ? isPropertyDeclaration(member) && !hasAccessorModifier(member) ? factory2.createVoidZero() : factory2.createNull() : void 0;
const helper = emitHelpers().createDecorateHelper(
decoratorExpressions,
prefix,
memberName,
descriptor
);
setEmitFlags(helper, 3072 /* NoComments */);
setSourceMapRange(helper, moveRangePastModifiers(member));
return helper;
}
function addConstructorDecorationStatement(statements, node) {
const expression = generateConstructorDecorationExpression(node);
if (expression) {
statements.push(setOriginalNode(factory2.createExpressionStatement(expression), node));
}
}
function generateConstructorDecorationExpression(node) {
const allDecorators = getAllDecoratorsOfClass(node);
const decoratorExpressions = transformAllDecoratorsOfDeclaration(allDecorators);
if (!decoratorExpressions) {
return void 0;
}
const classAlias = classAliases && classAliases[getOriginalNodeId(node)];
const localName = languageVersion < 2 /* ES2015 */ ? factory2.getInternalName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
) : factory2.getDeclarationName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
);
const decorate = emitHelpers().createDecorateHelper(decoratorExpressions, localName);
const expression = factory2.createAssignment(localName, classAlias ? factory2.createAssignment(classAlias, decorate) : decorate);
setEmitFlags(expression, 3072 /* NoComments */);
setSourceMapRange(expression, moveRangePastModifiers(node));
return expression;
}
function transformDecorator(decorator) {
return Debug.checkDefined(visitNode(decorator.expression, visitor, isExpression));
}
function transformDecoratorsOfParameter(decorators, parameterOffset) {
let expressions;
if (decorators) {
expressions = [];
for (const decorator of decorators) {
const helper = emitHelpers().createParamHelper(
transformDecorator(decorator),
parameterOffset
);
setTextRange(helper, decorator.expression);
setEmitFlags(helper, 3072 /* NoComments */);
expressions.push(helper);
}
}
return expressions;
}
function getExpressionForPropertyName(member, generateNameForComputedPropertyName) {
const name = member.name;
if (isPrivateIdentifier(name)) {
return factory2.createIdentifier("");
} else if (isComputedPropertyName(name)) {
return generateNameForComputedPropertyName && !isSimpleInlineableExpression(name.expression) ? factory2.getGeneratedNameForNode(name) : name.expression;
} else if (isIdentifier(name)) {
return factory2.createStringLiteral(idText(name));
} else {
return factory2.cloneNode(name);
}
}
function enableSubstitutionForClassAliases() {
if (!classAliases) {
context.enableSubstitution(80 /* Identifier */);
classAliases = [];
}
}
function getClassAliasIfNeeded(node) {
if (resolver.getNodeCheckFlags(node) & 1048576 /* ClassWithConstructorReference */) {
enableSubstitutionForClassAliases();
const classAlias = factory2.createUniqueName(node.name && !isGeneratedIdentifier(node.name) ? idText(node.name) : "default");
classAliases[getOriginalNodeId(node)] = classAlias;
hoistVariableDeclaration(classAlias);
return classAlias;
}
}
function getClassPrototype(node) {
return factory2.createPropertyAccessExpression(factory2.getDeclarationName(node), "prototype");
}
function getClassMemberPrefix(node, member) {
return isStatic(member) ? factory2.getDeclarationName(node) : getClassPrototype(node);
}
function onSubstituteNode(hint, node) {
node = previousOnSubstituteNode(hint, node);
if (hint === 1 /* Expression */) {
return substituteExpression(node);
}
return node;
}
function substituteExpression(node) {
switch (node.kind) {
case 80 /* Identifier */:
return substituteExpressionIdentifier(node);
}
return node;
}
function substituteExpressionIdentifier(node) {
return trySubstituteClassAlias(node) ?? node;
}
function trySubstituteClassAlias(node) {
if (classAliases) {
if (resolver.getNodeCheckFlags(node) & 2097152 /* ConstructorReferenceInClass */) {
const declaration = resolver.getReferencedValueDeclaration(node);
if (declaration) {
const classAlias = classAliases[declaration.id];
if (classAlias) {
const clone2 = factory2.cloneNode(classAlias);
setSourceMapRange(clone2, node);
setCommentRange(clone2, node);
return clone2;
}
}
}
}
return void 0;
}
}
// src/compiler/transformers/esDecorators.ts
function transformESDecorators(context) {
const {
factory: factory2,
getEmitHelperFactory: emitHelpers,
startLexicalEnvironment,
endLexicalEnvironment,
hoistVariableDeclaration
} = context;
const compilerOptions = context.getCompilerOptions();
const languageVersion = getEmitScriptTarget(compilerOptions);
let top;
let classInfo;
let classThis;
let classSuper;
let pendingExpressions;
let shouldTransformPrivateStaticElementsInFile;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
top = void 0;
shouldTransformPrivateStaticElementsInFile = false;
const visited = visitEachChild(node, visitor, context);
addEmitHelpers(visited, context.readEmitHelpers());
if (shouldTransformPrivateStaticElementsInFile) {
addInternalEmitFlags(visited, 32 /* TransformPrivateStaticElements */);
shouldTransformPrivateStaticElementsInFile = false;
}
return visited;
}
function updateState() {
classInfo = void 0;
classThis = void 0;
classSuper = void 0;
switch (top == null ? void 0 : top.kind) {
case "class":
classInfo = top.classInfo;
break;
case "class-element":
classInfo = top.next.classInfo;
classThis = top.classThis;
classSuper = top.classSuper;
break;
case "name":
const grandparent = top.next.next.next;
if ((grandparent == null ? void 0 : grandparent.kind) === "class-element") {
classInfo = grandparent.next.classInfo;
classThis = grandparent.classThis;
classSuper = grandparent.classSuper;
}
break;
}
}
function enterClass(classInfo2) {
top = { kind: "class", next: top, classInfo: classInfo2, savedPendingExpressions: pendingExpressions };
pendingExpressions = void 0;
updateState();
}
function exitClass() {
Debug.assert((top == null ? void 0 : top.kind) === "class", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class' but got '${top == null ? void 0 : top.kind}' instead.`);
pendingExpressions = top.savedPendingExpressions;
top = top.next;
updateState();
}
function enterClassElement(node) {
var _a, _b;
Debug.assert((top == null ? void 0 : top.kind) === "class", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class' but got '${top == null ? void 0 : top.kind}' instead.`);
top = { kind: "class-element", next: top };
if (isClassStaticBlockDeclaration(node) || isPropertyDeclaration(node) && hasStaticModifier(node)) {
top.classThis = (_a = top.next.classInfo) == null ? void 0 : _a.classThis;
top.classSuper = (_b = top.next.classInfo) == null ? void 0 : _b.classSuper;
}
updateState();
}
function exitClassElement() {
var _a;
Debug.assert((top == null ? void 0 : top.kind) === "class-element", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class-element' but got '${top == null ? void 0 : top.kind}' instead.`);
Debug.assert(((_a = top.next) == null ? void 0 : _a.kind) === "class", "Incorrect value for top.next.kind.", () => {
var _a2;
return `Expected top.next.kind to be 'class' but got '${(_a2 = top.next) == null ? void 0 : _a2.kind}' instead.`;
});
top = top.next;
updateState();
}
function enterName() {
Debug.assert((top == null ? void 0 : top.kind) === "class-element", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class-element' but got '${top == null ? void 0 : top.kind}' instead.`);
top = { kind: "name", next: top };
updateState();
}
function exitName() {
Debug.assert((top == null ? void 0 : top.kind) === "name", "Incorrect value for top.kind.", () => `Expected top.kind to be 'name' but got '${top == null ? void 0 : top.kind}' instead.`);
top = top.next;
updateState();
}
function enterOther() {
if ((top == null ? void 0 : top.kind) === "other") {
Debug.assert(!pendingExpressions);
top.depth++;
} else {
top = { kind: "other", next: top, depth: 0, savedPendingExpressions: pendingExpressions };
pendingExpressions = void 0;
updateState();
}
}
function exitOther() {
Debug.assert((top == null ? void 0 : top.kind) === "other", "Incorrect value for top.kind.", () => `Expected top.kind to be 'other' but got '${top == null ? void 0 : top.kind}' instead.`);
if (top.depth > 0) {
Debug.assert(!pendingExpressions);
top.depth--;
} else {
pendingExpressions = top.savedPendingExpressions;
top = top.next;
updateState();
}
}
function shouldVisitNode(node) {
return !!(node.transformFlags & 33554432 /* ContainsDecorators */) || !!classThis && !!(node.transformFlags & 16384 /* ContainsLexicalThis */) || !!classThis && !!classSuper && !!(node.transformFlags & 134217728 /* ContainsLexicalSuper */);
}
function visitor(node) {
if (!shouldVisitNode(node)) {
return node;
}
switch (node.kind) {
case 169 /* Decorator */:
return Debug.fail("Use `modifierVisitor` instead.");
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
case 230 /* ClassExpression */:
return visitClassExpression(
node,
/*referencedName*/
void 0
);
case 175 /* Constructor */:
case 171 /* PropertyDeclaration */:
case 174 /* ClassStaticBlockDeclaration */:
return Debug.fail("Not supported outside of a class. Use 'classElementVisitor' instead.");
case 168 /* Parameter */:
return visitParameterDeclaration(node);
case 225 /* BinaryExpression */:
return visitBinaryExpression(
node,
/*discarded*/
false
);
case 302 /* PropertyAssignment */:
return visitPropertyAssignment(node);
case 259 /* VariableDeclaration */:
return visitVariableDeclaration(node);
case 207 /* BindingElement */:
return visitBindingElement(node);
case 276 /* ExportAssignment */:
return visitExportAssignment(node);
case 110 /* ThisKeyword */:
return visitThisExpression(node);
case 247 /* ForStatement */:
return visitForStatement(node);
case 243 /* ExpressionStatement */:
return visitExpressionStatement(node);
case 360 /* CommaListExpression */:
return visitCommaListExpression(
node,
/*discarded*/
false
);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(
node,
/*discarded*/
false,
/*referencedName*/
void 0
);
case 359 /* PartiallyEmittedExpression */:
return visitPartiallyEmittedExpression(
node,
/*discarded*/
false,
/*referencedName*/
void 0
);
case 212 /* CallExpression */:
return visitCallExpression(node);
case 214 /* TaggedTemplateExpression */:
return visitTaggedTemplateExpression(node);
case 223 /* PrefixUnaryExpression */:
case 224 /* PostfixUnaryExpression */:
return visitPreOrPostfixUnaryExpression(
node,
/*discarded*/
false
);
case 210 /* PropertyAccessExpression */:
return visitPropertyAccessExpression(node);
case 211 /* ElementAccessExpression */:
return visitElementAccessExpression(node);
case 166 /* ComputedPropertyName */:
return visitComputedPropertyName(node);
case 173 /* MethodDeclaration */:
case 177 /* SetAccessor */:
case 176 /* GetAccessor */:
case 217 /* FunctionExpression */:
case 261 /* FunctionDeclaration */: {
enterOther();
const result = visitEachChild(node, fallbackVisitor, context);
exitOther();
return result;
}
default:
return visitEachChild(node, fallbackVisitor, context);
}
}
function fallbackVisitor(node) {
switch (node.kind) {
case 169 /* Decorator */:
return void 0;
default:
return visitor(node);
}
}
function modifierVisitor(node) {
switch (node.kind) {
case 169 /* Decorator */:
return void 0;
default:
return node;
}
}
function classElementVisitor(node) {
switch (node.kind) {
case 175 /* Constructor */:
return visitConstructorDeclaration(node);
case 173 /* MethodDeclaration */:
return visitMethodDeclaration(node);
case 176 /* GetAccessor */:
return visitGetAccessorDeclaration(node);
case 177 /* SetAccessor */:
return visitSetAccessorDeclaration(node);
case 171 /* PropertyDeclaration */:
return visitPropertyDeclaration(node);
case 174 /* ClassStaticBlockDeclaration */:
return visitClassStaticBlockDeclaration(node);
default:
return visitor(node);
}
}
function namedEvaluationVisitor(node, referencedName) {
switch (node.kind) {
case 359 /* PartiallyEmittedExpression */:
return visitPartiallyEmittedExpression(
node,
/*discarded*/
false,
referencedName
);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(
node,
/*discarded*/
false,
referencedName
);
case 230 /* ClassExpression */:
return visitClassExpression(node, referencedName);
default:
return visitor(node);
}
}
function discardedValueVisitor(node) {
switch (node.kind) {
case 223 /* PrefixUnaryExpression */:
case 224 /* PostfixUnaryExpression */:
return visitPreOrPostfixUnaryExpression(
node,
/*discarded*/
true
);
case 225 /* BinaryExpression */:
return visitBinaryExpression(
node,
/*discarded*/
true
);
case 360 /* CommaListExpression */:
return visitCommaListExpression(
node,
/*discarded*/
true
);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(
node,
/*discarded*/
true,
/*referencedName*/
void 0
);
default:
return visitor(node);
}
}
function getHelperVariableName(node) {
let declarationName = node.name && isIdentifier(node.name) && !isGeneratedIdentifier(node.name) ? idText(node.name) : node.name && isPrivateIdentifier(node.name) && !isGeneratedIdentifier(node.name) ? idText(node.name).slice(1) : node.name && isStringLiteral(node.name) && isIdentifierText(node.name.text, 99 /* ESNext */) ? node.name.text : isClassLike(node) ? "class" : "member";
if (isGetAccessor(node))
declarationName = `get_${declarationName}`;
if (isSetAccessor(node))
declarationName = `set_${declarationName}`;
if (node.name && isPrivateIdentifier(node.name))
declarationName = `private_${declarationName}`;
if (isStatic(node))
declarationName = `static_${declarationName}`;
return "_" + declarationName;
}
function createHelperVariable(node, suffix) {
return factory2.createUniqueName(`${getHelperVariableName(node)}_${suffix}`, 16 /* Optimistic */ | 8 /* ReservedInNestedScopes */);
}
function createLet(name, initializer) {
return factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
name,
/*exclamationToken*/
void 0,
/*type*/
void 0,
initializer
)
], 1 /* Let */)
);
}
function createClassInfo(node) {
let instanceExtraInitializersName;
let staticExtraInitializersName;
let hasStaticInitializers = false;
let hasNonAmbientInstanceFields = false;
let hasStaticPrivateClassElements = false;
for (const member of node.members) {
if (isNamedClassElement(member) && nodeOrChildIsDecorated(
/*useLegacyDecorators*/
false,
member,
node
)) {
if (hasStaticModifier(member)) {
staticExtraInitializersName ?? (staticExtraInitializersName = factory2.createUniqueName("_staticExtraInitializers", 16 /* Optimistic */));
} else {
instanceExtraInitializersName ?? (instanceExtraInitializersName = factory2.createUniqueName("_instanceExtraInitializers", 16 /* Optimistic */));
}
}
if (isClassStaticBlockDeclaration(member)) {
hasStaticInitializers = true;
} else if (isPropertyDeclaration(member)) {
if (hasStaticModifier(member)) {
hasStaticInitializers || (hasStaticInitializers = !!member.initializer || hasDecorators(member));
} else {
hasNonAmbientInstanceFields || (hasNonAmbientInstanceFields = !isAmbientPropertyDeclaration(member));
}
}
if ((isPrivateIdentifierClassElementDeclaration(member) || isAutoAccessorPropertyDeclaration(member)) && hasStaticModifier(member)) {
hasStaticPrivateClassElements = true;
}
if (staticExtraInitializersName && instanceExtraInitializersName && hasStaticInitializers && hasNonAmbientInstanceFields && hasStaticPrivateClassElements) {
break;
}
}
return {
class: node,
instanceExtraInitializersName,
staticExtraInitializersName,
hasStaticInitializers,
hasNonAmbientInstanceFields,
hasStaticPrivateClassElements
};
}
function containsLexicalSuperInStaticInitializer(node) {
for (const member of node.members) {
if (isClassStaticBlockDeclaration(member) || isPropertyDeclaration(member) && hasStaticModifier(member)) {
if (member.transformFlags & 134217728 /* ContainsLexicalSuper */) {
return true;
}
}
}
return false;
}
function transformClassLike(node, className) {
var _a;
startLexicalEnvironment();
const classReference = factory2.getLocalName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
false,
/*ignoreAssignedName*/
true
);
const classInfo2 = createClassInfo(node);
const classDefinitionStatements = [];
let leadingBlockStatements;
let trailingBlockStatements;
let syntheticConstructor;
let heritageClauses;
let shouldTransformPrivateStaticElementsInClass = false;
const classDecorators = transformAllDecoratorsOfDeclaration(getAllDecoratorsOfClass(node));
if (classDecorators) {
classInfo2.classDecoratorsName = factory2.createUniqueName("_classDecorators", 16 /* Optimistic */);
classInfo2.classDescriptorName = factory2.createUniqueName("_classDescriptor", 16 /* Optimistic */);
classInfo2.classExtraInitializersName = factory2.createUniqueName("_classExtraInitializers", 16 /* Optimistic */);
classInfo2.classThis = factory2.createUniqueName("_classThis", 16 /* Optimistic */);
classDefinitionStatements.push(
createLet(classInfo2.classDecoratorsName, factory2.createArrayLiteralExpression(classDecorators)),
createLet(classInfo2.classDescriptorName),
createLet(classInfo2.classExtraInitializersName, factory2.createArrayLiteralExpression()),
createLet(classInfo2.classThis)
);
if (classInfo2.hasStaticPrivateClassElements) {
shouldTransformPrivateStaticElementsInClass = true;
shouldTransformPrivateStaticElementsInFile = true;
}
}
if (classDecorators && containsLexicalSuperInStaticInitializer(node)) {
const extendsClause = getHeritageClause(node.heritageClauses, 96 /* ExtendsKeyword */);
const extendsElement = extendsClause && firstOrUndefined(extendsClause.types);
const extendsExpression = extendsElement && visitNode(extendsElement.expression, visitor, isExpression);
if (extendsExpression) {
classInfo2.classSuper = factory2.createUniqueName("_classSuper", 16 /* Optimistic */);
const unwrapped = skipOuterExpressions(extendsExpression);
const safeExtendsExpression = isClassExpression(unwrapped) && !unwrapped.name || isFunctionExpression(unwrapped) && !unwrapped.name || isArrowFunction(unwrapped) ? factory2.createComma(factory2.createNumericLiteral(0), extendsExpression) : extendsExpression;
classDefinitionStatements.push(createLet(classInfo2.classSuper, safeExtendsExpression));
const updatedExtendsElement = factory2.updateExpressionWithTypeArguments(
extendsElement,
classInfo2.classSuper,
/*typeArguments*/
void 0
);
const updatedExtendsClause = factory2.updateHeritageClause(extendsClause, [updatedExtendsElement]);
heritageClauses = factory2.createNodeArray([updatedExtendsClause]);
}
} else {
heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause);
}
const renamedClassThis = classInfo2.classThis ?? factory2.createThis();
const needsSetNameHelper = !((_a = getOriginalNode(node, isClassLike)) == null ? void 0 : _a.name) && (classDecorators || !isStringLiteral(className) || !isEmptyStringLiteral(className));
if (needsSetNameHelper) {
const setNameExpr = emitHelpers().createSetFunctionNameHelper(factory2.createThis(), className);
leadingBlockStatements = append(leadingBlockStatements, factory2.createExpressionStatement(setNameExpr));
}
enterClass(classInfo2);
let members = visitNodes2(node.members, classElementVisitor, isClassElement);
if (pendingExpressions) {
let outerThis;
for (let expression of pendingExpressions) {
expression = visitNode(expression, function thisVisitor(node2) {
if (!(node2.transformFlags & 16384 /* ContainsLexicalThis */)) {
return node2;
}
switch (node2.kind) {
case 110 /* ThisKeyword */:
if (!outerThis) {
outerThis = factory2.createUniqueName("_outerThis", 16 /* Optimistic */);
classDefinitionStatements.unshift(createLet(outerThis, factory2.createThis()));
}
return outerThis;
default:
return visitEachChild(node2, thisVisitor, context);
}
}, isExpression);
const statement = factory2.createExpressionStatement(expression);
leadingBlockStatements = append(leadingBlockStatements, statement);
}
pendingExpressions = void 0;
}
exitClass();
if (classInfo2.instanceExtraInitializersName && !getFirstConstructorWithBody(node)) {
const initializerStatements = prepareConstructor(node, classInfo2);
if (initializerStatements) {
const extendsClauseElement = getEffectiveBaseTypeNode(node);
const isDerivedClass = !!(extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== 106 /* NullKeyword */);
const constructorStatements = [];
if (isDerivedClass) {
const spreadArguments = factory2.createSpreadElement(factory2.createIdentifier("arguments"));
const superCall = factory2.createCallExpression(
factory2.createSuper(),
/*typeArguments*/
void 0,
[spreadArguments]
);
constructorStatements.push(factory2.createExpressionStatement(superCall));
}
addRange(constructorStatements, initializerStatements);
const constructorBody = factory2.createBlock(
constructorStatements,
/*multiLine*/
true
);
syntheticConstructor = factory2.createConstructorDeclaration(
/*modifiers*/
void 0,
[],
constructorBody
);
}
}
if (classInfo2.staticExtraInitializersName) {
classDefinitionStatements.push(
createLet(classInfo2.staticExtraInitializersName, factory2.createArrayLiteralExpression())
);
}
if (classInfo2.instanceExtraInitializersName) {
classDefinitionStatements.push(
createLet(classInfo2.instanceExtraInitializersName, factory2.createArrayLiteralExpression())
);
}
if (classInfo2.memberInfos) {
forEachEntry(classInfo2.memberInfos, (memberInfo, member) => {
if (isStatic(member)) {
classDefinitionStatements.push(createLet(memberInfo.memberDecoratorsName));
if (memberInfo.memberInitializersName) {
classDefinitionStatements.push(createLet(memberInfo.memberInitializersName, factory2.createArrayLiteralExpression()));
}
if (memberInfo.memberDescriptorName) {
classDefinitionStatements.push(createLet(memberInfo.memberDescriptorName));
}
}
});
}
if (classInfo2.memberInfos) {
forEachEntry(classInfo2.memberInfos, (memberInfo, member) => {
if (!isStatic(member)) {
classDefinitionStatements.push(createLet(memberInfo.memberDecoratorsName));
if (memberInfo.memberInitializersName) {
classDefinitionStatements.push(createLet(memberInfo.memberInitializersName, factory2.createArrayLiteralExpression()));
}
if (memberInfo.memberDescriptorName) {
classDefinitionStatements.push(createLet(memberInfo.memberDescriptorName));
}
}
});
}
leadingBlockStatements = addRange(leadingBlockStatements, classInfo2.staticNonFieldDecorationStatements);
leadingBlockStatements = addRange(leadingBlockStatements, classInfo2.nonStaticNonFieldDecorationStatements);
leadingBlockStatements = addRange(leadingBlockStatements, classInfo2.staticFieldDecorationStatements);
leadingBlockStatements = addRange(leadingBlockStatements, classInfo2.nonStaticFieldDecorationStatements);
if (classInfo2.classDescriptorName && classInfo2.classDecoratorsName && classInfo2.classExtraInitializersName && classInfo2.classThis) {
leadingBlockStatements ?? (leadingBlockStatements = []);
const valueProperty = factory2.createPropertyAssignment("value", factory2.createThis());
const classDescriptor = factory2.createObjectLiteralExpression([valueProperty]);
const classDescriptorAssignment = factory2.createAssignment(classInfo2.classDescriptorName, classDescriptor);
const classNameReference = factory2.createPropertyAccessExpression(factory2.createThis(), "name");
const esDecorateHelper2 = emitHelpers().createESDecorateHelper(
factory2.createNull(),
classDescriptorAssignment,
classInfo2.classDecoratorsName,
{ kind: "class", name: classNameReference },
factory2.createNull(),
classInfo2.classExtraInitializersName
);
const esDecorateStatement = factory2.createExpressionStatement(esDecorateHelper2);
setSourceMapRange(esDecorateStatement, moveRangePastDecorators(node));
leadingBlockStatements.push(esDecorateStatement);
const classDescriptorValueReference = factory2.createPropertyAccessExpression(classInfo2.classDescriptorName, "value");
const classThisAssignment = factory2.createAssignment(classInfo2.classThis, classDescriptorValueReference);
const classReferenceAssignment = factory2.createAssignment(classReference, classThisAssignment);
leadingBlockStatements.push(factory2.createExpressionStatement(classReferenceAssignment));
}
if (classInfo2.staticExtraInitializersName) {
const runStaticInitializersHelper = emitHelpers().createRunInitializersHelper(renamedClassThis, classInfo2.staticExtraInitializersName);
const runStaticInitializersStatement = factory2.createExpressionStatement(runStaticInitializersHelper);
setSourceMapRange(runStaticInitializersStatement, node.name ?? moveRangePastDecorators(node));
leadingBlockStatements = append(leadingBlockStatements, runStaticInitializersStatement);
}
if (classInfo2.classExtraInitializersName) {
const runClassInitializersHelper = emitHelpers().createRunInitializersHelper(renamedClassThis, classInfo2.classExtraInitializersName);
const runClassInitializersStatement = factory2.createExpressionStatement(runClassInitializersHelper);
setSourceMapRange(runClassInitializersStatement, node.name ?? moveRangePastDecorators(node));
trailingBlockStatements = append(trailingBlockStatements, runClassInitializersStatement);
}
if (leadingBlockStatements && trailingBlockStatements && !classInfo2.hasStaticInitializers) {
addRange(leadingBlockStatements, trailingBlockStatements);
trailingBlockStatements = void 0;
}
let newMembers = members;
if (leadingBlockStatements) {
const leadingStaticBlockBody = factory2.createBlock(
leadingBlockStatements,
/*multiLine*/
true
);
const leadingStaticBlock = factory2.createClassStaticBlockDeclaration(leadingStaticBlockBody);
if (shouldTransformPrivateStaticElementsInClass) {
setInternalEmitFlags(leadingStaticBlock, 32 /* TransformPrivateStaticElements */);
}
newMembers = [leadingStaticBlock, ...newMembers];
}
if (syntheticConstructor) {
newMembers = [...newMembers, syntheticConstructor];
}
if (trailingBlockStatements) {
const trailingStaticBlockBody = factory2.createBlock(
trailingBlockStatements,
/*multiLine*/
true
);
const trailingStaticBlock = factory2.createClassStaticBlockDeclaration(trailingStaticBlockBody);
newMembers = [...newMembers, trailingStaticBlock];
}
if (newMembers !== members) {
members = setTextRange(factory2.createNodeArray(newMembers), members);
}
const lexicalEnvironment = endLexicalEnvironment();
let classExpression;
if (classDecorators) {
classExpression = factory2.createClassExpression(
/*modifiers*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
heritageClauses,
members
);
const classReferenceDeclaration = factory2.createVariableDeclaration(
classReference,
/*exclamationToken*/
void 0,
/*type*/
void 0,
classExpression
);
const classReferenceVarDeclList = factory2.createVariableDeclarationList([classReferenceDeclaration]);
const returnExpr = classInfo2.classThis ? factory2.createAssignment(classReference, classInfo2.classThis) : classReference;
classDefinitionStatements.push(
factory2.createVariableStatement(
/*modifiers*/
void 0,
classReferenceVarDeclList
),
factory2.createReturnStatement(returnExpr)
);
} else {
classExpression = factory2.createClassExpression(
/*modifiers*/
void 0,
node.name,
/*typeParameters*/
void 0,
heritageClauses,
members
);
classDefinitionStatements.push(factory2.createReturnStatement(classExpression));
}
if (shouldTransformPrivateStaticElementsInClass) {
addInternalEmitFlags(classExpression, 32 /* TransformPrivateStaticElements */);
for (const member of classExpression.members) {
if ((isPrivateIdentifierClassElementDeclaration(member) || isAutoAccessorPropertyDeclaration(member)) && hasStaticModifier(member)) {
addInternalEmitFlags(member, 32 /* TransformPrivateStaticElements */);
}
}
}
setOriginalNode(classExpression, node);
getOrCreateEmitNode(classExpression).classThis = classInfo2.classThis;
return factory2.createImmediatelyInvokedArrowFunction(factory2.mergeLexicalEnvironment(classDefinitionStatements, lexicalEnvironment));
}
function isDecoratedClassLike(node) {
return classOrConstructorParameterIsDecorated(
/*useLegacyDecorators*/
false,
node
) || childIsDecorated(
/*useLegacyDecorators*/
false,
node
);
}
function visitClassDeclaration(node) {
if (isDecoratedClassLike(node)) {
if (hasSyntacticModifier(node, 1 /* Export */) && hasSyntacticModifier(node, 1024 /* Default */)) {
const originalClass = getOriginalNode(node, isClassLike) ?? node;
const className = originalClass.name ? factory2.createStringLiteralFromNode(originalClass.name) : factory2.createStringLiteral("default");
const iife = transformClassLike(node, className);
const statement = factory2.createExportDefault(iife);
setOriginalNode(statement, node);
setCommentRange(statement, getCommentRange(node));
setSourceMapRange(statement, moveRangePastDecorators(node));
return statement;
} else {
Debug.assertIsDefined(node.name, "A class declaration that is not a default export must have a name.");
const iife = transformClassLike(node, factory2.createStringLiteralFromNode(node.name));
const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
const declName = languageVersion <= 2 /* ES2015 */ ? factory2.getInternalName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
) : factory2.getLocalName(
node,
/*allowComments*/
false,
/*allowSourceMaps*/
true
);
const varDecl = factory2.createVariableDeclaration(
declName,
/*exclamationToken*/
void 0,
/*type*/
void 0,
iife
);
setOriginalNode(varDecl, node);
const varDecls = factory2.createVariableDeclarationList([varDecl], 1 /* Let */);
const statement = factory2.createVariableStatement(modifiers, varDecls);
setOriginalNode(statement, node);
setCommentRange(statement, getCommentRange(node));
return statement;
}
} else {
const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
const heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause);
enterClass(
/*classInfo*/
void 0
);
const members = visitNodes2(node.members, classElementVisitor, isClassElement);
exitClass();
return factory2.updateClassDeclaration(
node,
modifiers,
node.name,
/*typeParameters*/
void 0,
heritageClauses,
members
);
}
}
function visitClassExpression(node, referencedName) {
if (isDecoratedClassLike(node)) {
const className = node.name ? factory2.createStringLiteralFromNode(node.name) : referencedName ?? factory2.createStringLiteral("");
const iife = transformClassLike(node, className);
setOriginalNode(iife, node);
return iife;
} else {
const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
const heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause);
enterClass(
/*classInfo*/
void 0
);
const members = visitNodes2(node.members, classElementVisitor, isClassElement);
exitClass();
return factory2.updateClassExpression(
node,
modifiers,
node.name,
/*typeParameters*/
void 0,
heritageClauses,
members
);
}
}
function prepareConstructor(_parent, classInfo2) {
if (classInfo2.instanceExtraInitializersName && !classInfo2.hasNonAmbientInstanceFields) {
const statements = [];
statements.push(
factory2.createExpressionStatement(
emitHelpers().createRunInitializersHelper(
factory2.createThis(),
classInfo2.instanceExtraInitializersName
)
)
);
return statements;
}
}
function visitConstructorDeclaration(node) {
enterClassElement(node);
const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
const parameters = visitNodes2(node.parameters, visitor, isParameter);
let body;
if (node.body && classInfo) {
const initializerStatements = prepareConstructor(classInfo.class, classInfo);
if (initializerStatements) {
const statements = [];
const nonPrologueStart = factory2.copyPrologue(
node.body.statements,
statements,
/*ensureUseStrict*/
false,
visitor
);
const superStatementIndex = findSuperStatementIndex(node.body.statements, nonPrologueStart);
if (superStatementIndex >= 0) {
addRange(statements, visitNodes2(node.body.statements, visitor, isStatement, nonPrologueStart, superStatementIndex + 1 - nonPrologueStart));
addRange(statements, initializerStatements);
addRange(statements, visitNodes2(node.body.statements, visitor, isStatement, superStatementIndex + 1));
} else {
addRange(statements, initializerStatements);
addRange(statements, visitNodes2(node.body.statements, visitor, isStatement));
}
body = factory2.createBlock(
statements,
/*multiLine*/
true
);
setOriginalNode(body, node.body);
setTextRange(body, node.body);
}
}
body ?? (body = visitNode(node.body, visitor, isBlock));
exitClassElement();
return factory2.updateConstructorDeclaration(node, modifiers, parameters, body);
}
function finishClassElement(updated, original) {
if (updated !== original) {
setCommentRange(updated, original);
setSourceMapRange(updated, moveRangePastDecorators(original));
}
return updated;
}
function partialTransformClassElement(member, useNamedEvaluation, classInfo2, createDescriptor) {
let referencedName;
let name;
let initializersName;
let thisArg;
let descriptorName;
if (!classInfo2) {
const modifiers2 = visitNodes2(member.modifiers, modifierVisitor, isModifier);
enterName();
if (useNamedEvaluation) {
({ referencedName, name } = visitReferencedPropertyName(member.name));
} else {
name = visitPropertyName(member.name);
}
exitName();
return { modifiers: modifiers2, referencedName, name, initializersName, descriptorName, thisArg };
}
const memberDecorators = transformAllDecoratorsOfDeclaration(getAllDecoratorsOfClassElement(
member,
classInfo2.class,
/*useLegacyDecorators*/
false
));
const modifiers = visitNodes2(member.modifiers, modifierVisitor, isModifier);
if (memberDecorators) {
const memberDecoratorsName = createHelperVariable(member, "decorators");
const memberDecoratorsArray = factory2.createArrayLiteralExpression(memberDecorators);
const memberDecoratorsAssignment = factory2.createAssignment(memberDecoratorsName, memberDecoratorsArray);
const memberInfo = { memberDecoratorsName };
classInfo2.memberInfos ?? (classInfo2.memberInfos = /* @__PURE__ */ new Map());
classInfo2.memberInfos.set(member, memberInfo);
pendingExpressions ?? (pendingExpressions = []);
pendingExpressions.push(memberDecoratorsAssignment);
const statements = isMethodOrAccessor(member) || isAutoAccessorPropertyDeclaration(member) ? isStatic(member) ? classInfo2.staticNonFieldDecorationStatements ?? (classInfo2.staticNonFieldDecorationStatements = []) : classInfo2.nonStaticNonFieldDecorationStatements ?? (classInfo2.nonStaticNonFieldDecorationStatements = []) : isPropertyDeclaration(member) && !isAutoAccessorPropertyDeclaration(member) ? isStatic(member) ? classInfo2.staticFieldDecorationStatements ?? (classInfo2.staticFieldDecorationStatements = []) : classInfo2.nonStaticFieldDecorationStatements ?? (classInfo2.nonStaticFieldDecorationStatements = []) : Debug.fail();
const kind = isGetAccessorDeclaration(member) ? "getter" : isSetAccessorDeclaration(member) ? "setter" : isMethodDeclaration(member) ? "method" : isAutoAccessorPropertyDeclaration(member) ? "accessor" : isPropertyDeclaration(member) ? "field" : Debug.fail();
let propertyName;
if (isIdentifier(member.name) || isPrivateIdentifier(member.name)) {
propertyName = { computed: false, name: member.name };
} else if (isPropertyNameLiteral(member.name)) {
propertyName = { computed: true, name: factory2.createStringLiteralFromNode(member.name) };
} else {
const expression = member.name.expression;
if (isPropertyNameLiteral(expression) && !isIdentifier(expression)) {
propertyName = { computed: true, name: factory2.createStringLiteralFromNode(expression) };
} else {
enterName();
({ referencedName, name } = visitReferencedPropertyName(member.name));
propertyName = { computed: true, name: referencedName };
exitName();
}
}
const context2 = {
kind,
name: propertyName,
static: isStatic(member),
private: isPrivateIdentifier(member.name),
access: {
// 15.7.3 CreateDecoratorAccessObject (kind, name)
// 2. If _kind_ is ~field~, ~method~, ~accessor~, or ~getter~, then ...
get: isPropertyDeclaration(member) || isGetAccessorDeclaration(member) || isMethodDeclaration(member),
// 3. If _kind_ is ~field~, ~accessor~, or ~setter~, then ...
set: isPropertyDeclaration(member) || isSetAccessorDeclaration(member)
}
};
const extraInitializers = isStatic(member) ? classInfo2.staticExtraInitializersName ?? (classInfo2.staticExtraInitializersName = factory2.createUniqueName("_staticExtraInitializers", 16 /* Optimistic */)) : classInfo2.instanceExtraInitializersName ?? (classInfo2.instanceExtraInitializersName = factory2.createUniqueName("_instanceExtraInitializers", 16 /* Optimistic */));
if (isMethodOrAccessor(member)) {
let descriptor;
if (isPrivateIdentifierClassElementDeclaration(member) && createDescriptor) {
descriptor = createDescriptor(member, visitNodes2(modifiers, (node) => tryCast(node, isAsyncModifier), isModifier));
memberInfo.memberDescriptorName = descriptorName = createHelperVariable(member, "descriptor");
descriptor = factory2.createAssignment(descriptorName, descriptor);
}
const esDecorateExpression = emitHelpers().createESDecorateHelper(factory2.createThis(), descriptor ?? factory2.createNull(), memberDecoratorsName, context2, factory2.createNull(), extraInitializers);
const esDecorateStatement = factory2.createExpressionStatement(esDecorateExpression);
setSourceMapRange(esDecorateStatement, moveRangePastDecorators(member));
statements.push(esDecorateStatement);
} else if (isPropertyDeclaration(member)) {
initializersName = memberInfo.memberInitializersName ?? (memberInfo.memberInitializersName = createHelperVariable(member, "initializers"));
if (isStatic(member)) {
thisArg = classInfo2.classThis;
}
let descriptor;
if (isPrivateIdentifierClassElementDeclaration(member) && hasAccessorModifier(member) && createDescriptor) {
descriptor = createDescriptor(
member,
/*modifiers*/
void 0
);
memberInfo.memberDescriptorName = descriptorName = createHelperVariable(member, "descriptor");
descriptor = factory2.createAssignment(descriptorName, descriptor);
}
const esDecorateExpression = emitHelpers().createESDecorateHelper(
isAutoAccessorPropertyDeclaration(member) ? factory2.createThis() : factory2.createNull(),
descriptor ?? factory2.createNull(),
memberDecoratorsName,
context2,
initializersName,
extraInitializers
);
const esDecorateStatement = factory2.createExpressionStatement(esDecorateExpression);
setSourceMapRange(esDecorateStatement, moveRangePastDecorators(member));
statements.push(esDecorateStatement);
}
}
if (name === void 0) {
enterName();
if (useNamedEvaluation) {
({ referencedName, name } = visitReferencedPropertyName(member.name));
} else {
name = visitPropertyName(member.name);
}
exitName();
}
if (!some(modifiers) && (isMethodDeclaration(member) || isPropertyDeclaration(member))) {
setEmitFlags(name, 1024 /* NoLeadingComments */);
}
return { modifiers, referencedName, name, initializersName, descriptorName, thisArg };
}
function visitMethodDeclaration(node) {
enterClassElement(node);
const { modifiers, name, descriptorName } = partialTransformClassElement(
node,
/*useNamedEvaluation*/
false,
classInfo,
createMethodDescriptorObject
);
if (descriptorName) {
exitClassElement();
return finishClassElement(createMethodDescriptorForwarder(modifiers, name, descriptorName), node);
} else {
const parameters = visitNodes2(node.parameters, visitor, isParameter);
const body = visitNode(node.body, visitor, isBlock);
exitClassElement();
return finishClassElement(factory2.updateMethodDeclaration(
node,
modifiers,
node.asteriskToken,
name,
/*questionToken*/
void 0,
/*typeParameters*/
void 0,
parameters,
/*type*/
void 0,
body
), node);
}
}
function visitGetAccessorDeclaration(node) {
enterClassElement(node);
const { modifiers, name, descriptorName } = partialTransformClassElement(
node,
/*useNamedEvaluation*/
false,
classInfo,
createGetAccessorDescriptorObject
);
if (descriptorName) {
exitClassElement();
return finishClassElement(createGetAccessorDescriptorForwarder(modifiers, name, descriptorName), node);
} else {
const parameters = visitNodes2(node.parameters, visitor, isParameter);
const body = visitNode(node.body, visitor, isBlock);
exitClassElement();
return finishClassElement(factory2.updateGetAccessorDeclaration(
node,
modifiers,
name,
parameters,
/*type*/
void 0,
body
), node);
}
}
function visitSetAccessorDeclaration(node) {
enterClassElement(node);
const { modifiers, name, descriptorName } = partialTransformClassElement(
node,
/*useNamedEvaluation*/
false,
classInfo,
createSetAccessorDescriptorObject
);
if (descriptorName) {
exitClassElement();
return finishClassElement(createSetAccessorDescriptorForwarder(modifiers, name, descriptorName), node);
} else {
const parameters = visitNodes2(node.parameters, visitor, isParameter);
const body = visitNode(node.body, visitor, isBlock);
exitClassElement();
return finishClassElement(factory2.updateSetAccessorDeclaration(node, modifiers, name, parameters, body), node);
}
}
function visitClassStaticBlockDeclaration(node) {
enterClassElement(node);
if (classInfo)
classInfo.hasStaticInitializers = true;
const result = visitEachChild(node, visitor, context);
exitClassElement();
return result;
}
function visitPropertyDeclaration(node) {
enterClassElement(node);
Debug.assert(!isAmbientPropertyDeclaration(node), "Not yet implemented.");
const useNamedEvaluation = isNamedEvaluation(node, isAnonymousClassNeedingAssignedName);
const { modifiers, name, referencedName, initializersName, descriptorName, thisArg } = partialTransformClassElement(node, useNamedEvaluation, classInfo, hasAccessorModifier(node) ? createAccessorPropertyDescriptorObject : void 0);
startLexicalEnvironment();
let initializer = referencedName ? visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, referencedName), isExpression) : visitNode(node.initializer, visitor, isExpression);
if (initializersName) {
initializer = emitHelpers().createRunInitializersHelper(
thisArg ?? factory2.createThis(),
initializersName,
initializer ?? factory2.createVoidZero()
);
}
if (!isStatic(node) && (classInfo == null ? void 0 : classInfo.instanceExtraInitializersName) && !(classInfo == null ? void 0 : classInfo.hasInjectedInstanceInitializers)) {
classInfo.hasInjectedInstanceInitializers = true;
initializer ?? (initializer = factory2.createVoidZero());
initializer = factory2.createParenthesizedExpression(factory2.createComma(
emitHelpers().createRunInitializersHelper(
factory2.createThis(),
classInfo.instanceExtraInitializersName
),
initializer
));
}
if (isStatic(node) && classInfo && initializer) {
classInfo.hasStaticInitializers = true;
}
const declarations = endLexicalEnvironment();
if (some(declarations)) {
initializer = factory2.createImmediatelyInvokedArrowFunction([
...declarations,
factory2.createReturnStatement(initializer)
]);
}
exitClassElement();
if (hasAccessorModifier(node) && descriptorName) {
const commentRange = getCommentRange(node);
const sourceMapRange = getSourceMapRange(node);
const name2 = node.name;
let getterName = name2;
let setterName = name2;
if (isComputedPropertyName(name2) && !isSimpleInlineableExpression(name2.expression)) {
const cacheAssignment = findComputedPropertyNameCacheAssignment(name2);
if (cacheAssignment) {
getterName = factory2.updateComputedPropertyName(name2, visitNode(name2.expression, visitor, isExpression));
setterName = factory2.updateComputedPropertyName(name2, cacheAssignment.left);
} else {
const temp = factory2.createTempVariable(hoistVariableDeclaration);
setSourceMapRange(temp, name2.expression);
const expression = visitNode(name2.expression, visitor, isExpression);
const assignment = factory2.createAssignment(temp, expression);
setSourceMapRange(assignment, name2.expression);
getterName = factory2.updateComputedPropertyName(name2, assignment);
setterName = factory2.updateComputedPropertyName(name2, temp);
}
}
const modifiersWithoutAccessor = visitNodes2(modifiers, (node2) => node2.kind !== 129 /* AccessorKeyword */ ? node2 : void 0, isModifier);
const backingField = createAccessorPropertyBackingField(factory2, node, modifiersWithoutAccessor, initializer);
setOriginalNode(backingField, node);
setEmitFlags(backingField, 3072 /* NoComments */);
setSourceMapRange(backingField, sourceMapRange);
setSourceMapRange(backingField.name, node.name);
const getter = createGetAccessorDescriptorForwarder(modifiersWithoutAccessor, getterName, descriptorName);
setOriginalNode(getter, node);
setCommentRange(getter, commentRange);
setSourceMapRange(getter, sourceMapRange);
const setter = createSetAccessorDescriptorForwarder(modifiersWithoutAccessor, setterName, descriptorName);
setOriginalNode(setter, node);
setEmitFlags(setter, 3072 /* NoComments */);
setSourceMapRange(setter, sourceMapRange);
return [backingField, getter, setter];
}
return finishClassElement(factory2.updatePropertyDeclaration(
node,
modifiers,
name,
/*questionOrExclamationToken*/
void 0,
/*type*/
void 0,
initializer
), node);
}
function visitThisExpression(node) {
return classThis ?? node;
}
function visitCallExpression(node) {
if (isSuperProperty(node.expression) && classThis) {
const expression = visitNode(node.expression, visitor, isExpression);
const argumentsList = visitNodes2(node.arguments, visitor, isExpression);
const invocation = factory2.createFunctionCallCall(expression, classThis, argumentsList);
setOriginalNode(invocation, node);
setTextRange(invocation, node);
return invocation;
}
return visitEachChild(node, visitor, context);
}
function visitTaggedTemplateExpression(node) {
if (isSuperProperty(node.tag) && classThis) {
const tag = visitNode(node.tag, visitor, isExpression);
const boundTag = factory2.createFunctionBindCall(tag, classThis, []);
setOriginalNode(boundTag, node);
setTextRange(boundTag, node);
const template = visitNode(node.template, visitor, isTemplateLiteral);
return factory2.updateTaggedTemplateExpression(
node,
boundTag,
/*typeArguments*/
void 0,
template
);
}
return visitEachChild(node, visitor, context);
}
function visitPropertyAccessExpression(node) {
if (isSuperProperty(node) && isIdentifier(node.name) && classThis && classSuper) {
const propertyName = factory2.createStringLiteralFromNode(node.name);
const superProperty = factory2.createReflectGetCall(classSuper, propertyName, classThis);
setOriginalNode(superProperty, node.expression);
setTextRange(superProperty, node.expression);
return superProperty;
}
return visitEachChild(node, visitor, context);
}
function visitElementAccessExpression(node) {
if (isSuperProperty(node) && classThis && classSuper) {
const propertyName = visitNode(node.argumentExpression, visitor, isExpression);
const superProperty = factory2.createReflectGetCall(classSuper, propertyName, classThis);
setOriginalNode(superProperty, node.expression);
setTextRange(superProperty, node.expression);
return superProperty;
}
return visitEachChild(node, visitor, context);
}
function visitParameterDeclaration(node) {
let updated;
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
const name = visitNode(node.name, visitor, isBindingName);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
updated = factory2.updateParameterDeclaration(
node,
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
name,
/*questionToken*/
void 0,
/*type*/
void 0,
initializer
);
} else {
updated = factory2.updateParameterDeclaration(
node,
/*modifiers*/
void 0,
node.dotDotDotToken,
visitNode(node.name, visitor, isBindingName),
/*questionToken*/
void 0,
/*type*/
void 0,
visitNode(node.initializer, visitor, isExpression)
);
}
if (updated !== node) {
setCommentRange(updated, node);
setTextRange(updated, moveRangePastModifiers(node));
setSourceMapRange(updated, moveRangePastModifiers(node));
setEmitFlags(updated.name, 64 /* NoTrailingSourceMap */);
}
return updated;
}
function isAnonymousClassNeedingAssignedName(node) {
return isClassExpression(node) && !node.name && isDecoratedClassLike(node);
}
function visitForStatement(node) {
return factory2.updateForStatement(
node,
visitNode(node.initializer, discardedValueVisitor, isForInitializer),
visitNode(node.condition, visitor, isExpression),
visitNode(node.incrementor, discardedValueVisitor, isExpression),
visitIterationBody(node.statement, visitor, context)
);
}
function visitExpressionStatement(node) {
return visitEachChild(node, discardedValueVisitor, context);
}
function visitBinaryExpression(node, discarded) {
if (isDestructuringAssignment(node)) {
const left = visitAssignmentPattern(node.left);
const right = visitNode(node.right, visitor, isExpression);
return factory2.updateBinaryExpression(node, left, node.operatorToken, right);
}
if (isAssignmentExpression(node)) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.left, node.right);
const left = visitNode(node.left, visitor, isExpression);
const right = visitNode(node.right, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateBinaryExpression(node, left, node.operatorToken, right);
}
if (isSuperProperty(node.left) && classThis && classSuper) {
let setterName = isElementAccessExpression(node.left) ? visitNode(node.left.argumentExpression, visitor, isExpression) : isIdentifier(node.left.name) ? factory2.createStringLiteralFromNode(node.left.name) : void 0;
if (setterName) {
let expression = visitNode(node.right, visitor, isExpression);
if (isCompoundAssignment(node.operatorToken.kind)) {
let getterName = setterName;
if (!isSimpleInlineableExpression(setterName)) {
getterName = factory2.createTempVariable(hoistVariableDeclaration);
setterName = factory2.createAssignment(getterName, setterName);
}
const superPropertyGet = factory2.createReflectGetCall(
classSuper,
getterName,
classThis
);
setOriginalNode(superPropertyGet, node.left);
setTextRange(superPropertyGet, node.left);
expression = factory2.createBinaryExpression(
superPropertyGet,
getNonAssignmentOperatorForCompoundAssignment(node.operatorToken.kind),
expression
);
setTextRange(expression, node);
}
const temp = discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration);
if (temp) {
expression = factory2.createAssignment(temp, expression);
setTextRange(temp, node);
}
expression = factory2.createReflectSetCall(
classSuper,
setterName,
expression,
classThis
);
setOriginalNode(expression, node);
setTextRange(expression, node);
if (temp) {
expression = factory2.createComma(expression, temp);
setTextRange(expression, node);
}
return expression;
}
}
}
if (node.operatorToken.kind === 28 /* CommaToken */) {
const left = visitNode(node.left, discardedValueVisitor, isExpression);
const right = visitNode(node.right, discarded ? discardedValueVisitor : visitor, isExpression);
return factory2.updateBinaryExpression(node, left, node.operatorToken, right);
}
return visitEachChild(node, visitor, context);
}
function visitPreOrPostfixUnaryExpression(node, discarded) {
if (node.operator === 46 /* PlusPlusToken */ || node.operator === 47 /* MinusMinusToken */) {
const operand = skipParentheses(node.operand);
if (isSuperProperty(operand) && classThis && classSuper) {
let setterName = isElementAccessExpression(operand) ? visitNode(operand.argumentExpression, visitor, isExpression) : isIdentifier(operand.name) ? factory2.createStringLiteralFromNode(operand.name) : void 0;
if (setterName) {
let getterName = setterName;
if (!isSimpleInlineableExpression(setterName)) {
getterName = factory2.createTempVariable(hoistVariableDeclaration);
setterName = factory2.createAssignment(getterName, setterName);
}
let expression = factory2.createReflectGetCall(classSuper, getterName, classThis);
setOriginalNode(expression, node);
setTextRange(expression, node);
const temp = discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration);
expression = expandPreOrPostfixIncrementOrDecrementExpression(factory2, node, expression, hoistVariableDeclaration, temp);
expression = factory2.createReflectSetCall(classSuper, setterName, expression, classThis);
setOriginalNode(expression, node);
setTextRange(expression, node);
if (temp) {
expression = factory2.createComma(expression, temp);
setTextRange(expression, node);
}
return expression;
}
}
}
return visitEachChild(node, visitor, context);
}
function visitCommaListExpression(node, discarded) {
const elements = discarded ? visitCommaListElements(node.elements, discardedValueVisitor) : visitCommaListElements(node.elements, visitor, discardedValueVisitor);
return factory2.updateCommaListExpression(node, elements);
}
function visitReferencedPropertyName(node) {
if (isPropertyNameLiteral(node) || isPrivateIdentifier(node)) {
const referencedName2 = factory2.createStringLiteralFromNode(node);
const name2 = visitNode(node, visitor, isPropertyName);
return { referencedName: referencedName2, name: name2 };
}
if (isPropertyNameLiteral(node.expression) && !isIdentifier(node.expression)) {
const referencedName2 = factory2.createStringLiteralFromNode(node.expression);
const name2 = visitNode(node, visitor, isPropertyName);
return { referencedName: referencedName2, name: name2 };
}
const referencedName = factory2.getGeneratedNameForNode(node);
hoistVariableDeclaration(referencedName);
const key = emitHelpers().createPropKeyHelper(visitNode(node.expression, visitor, isExpression));
const assignment = factory2.createAssignment(referencedName, key);
const name = factory2.updateComputedPropertyName(node, injectPendingExpressions(assignment));
return { referencedName, name };
}
function visitPropertyName(node) {
if (isComputedPropertyName(node)) {
return visitComputedPropertyName(node);
}
return visitNode(node, visitor, isPropertyName);
}
function visitComputedPropertyName(node) {
let expression = visitNode(node.expression, visitor, isExpression);
if (!isSimpleInlineableExpression(expression)) {
expression = injectPendingExpressions(expression);
}
return factory2.updateComputedPropertyName(node, expression);
}
function visitPropertyAssignment(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const { referencedName, name } = visitReferencedPropertyName(node.name);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, referencedName), isExpression);
return factory2.updatePropertyAssignment(node, name, initializer);
}
return visitEachChild(node, visitor, context);
}
function visitVariableDeclaration(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
const name = visitNode(node.name, visitor, isBindingName);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateVariableDeclaration(
node,
name,
/*exclamationToken*/
void 0,
/*type*/
void 0,
initializer
);
}
return visitEachChild(node, visitor, context);
}
function visitBindingElement(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
const propertyName = visitNode(node.propertyName, visitor, isPropertyName);
const name = visitNode(node.name, visitor, isBindingName);
const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateBindingElement(
node,
/*dotDotDotToken*/
void 0,
propertyName,
name,
initializer
);
}
return visitEachChild(node, visitor, context);
}
function visitDestructuringAssignmentTarget(node) {
if (isObjectLiteralExpression(node) || isArrayLiteralExpression(node)) {
return visitAssignmentPattern(node);
}
if (isSuperProperty(node) && classThis && classSuper) {
const propertyName = isElementAccessExpression(node) ? visitNode(node.argumentExpression, visitor, isExpression) : isIdentifier(node.name) ? factory2.createStringLiteralFromNode(node.name) : void 0;
if (propertyName) {
const paramName = factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
const expression = factory2.createAssignmentTargetWrapper(
paramName,
factory2.createReflectSetCall(
classSuper,
propertyName,
paramName,
classThis
)
);
setOriginalNode(expression, node);
setTextRange(expression, node);
return expression;
}
}
return visitEachChild(node, visitor, context);
}
function visitAssignmentElement(node) {
if (isAssignmentExpression(
node,
/*excludeCompoundAssignment*/
true
)) {
const assignmentTarget = visitDestructuringAssignmentTarget(node.left);
let initializer;
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.left, node.right);
initializer = visitNode(node.right, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
} else {
initializer = visitNode(node.right, visitor, isExpression);
}
return factory2.updateBinaryExpression(node, assignmentTarget, node.operatorToken, initializer);
} else {
return visitDestructuringAssignmentTarget(node);
}
}
function visitAssignmentRestElement(node) {
if (isLeftHandSideExpression(node.expression)) {
const expression = visitDestructuringAssignmentTarget(node.expression);
return factory2.updateSpreadElement(node, expression);
}
return visitEachChild(node, visitor, context);
}
function visitArrayAssignmentElement(node) {
Debug.assertNode(node, isArrayBindingOrAssignmentElement);
if (isSpreadElement(node))
return visitAssignmentRestElement(node);
if (!isOmittedExpression(node))
return visitAssignmentElement(node);
return visitEachChild(node, visitor, context);
}
function visitAssignmentProperty(node) {
const name = visitNode(node.name, visitor, isPropertyName);
if (isAssignmentExpression(
node.initializer,
/*excludeCompoundAssignment*/
true
)) {
const assignmentElement = visitAssignmentElement(node.initializer);
return factory2.updatePropertyAssignment(node, name, assignmentElement);
}
if (isLeftHandSideExpression(node.initializer)) {
const assignmentElement = visitDestructuringAssignmentTarget(node.initializer);
return factory2.updatePropertyAssignment(node, name, assignmentElement);
}
return visitEachChild(node, visitor, context);
}
function visitShorthandAssignmentProperty(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const assignedName = getAssignedNameOfIdentifier(node.name, node.objectAssignmentInitializer);
const name = visitNode(node.name, visitor, isIdentifier);
const objectAssignmentInitializer = visitNode(node.objectAssignmentInitializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
return factory2.updateShorthandPropertyAssignment(node, name, objectAssignmentInitializer);
}
return visitEachChild(node, visitor, context);
}
function visitAssignmentRestProperty(node) {
if (isLeftHandSideExpression(node.expression)) {
const expression = visitDestructuringAssignmentTarget(node.expression);
return factory2.updateSpreadAssignment(node, expression);
}
return visitEachChild(node, visitor, context);
}
function visitObjectAssignmentElement(node) {
Debug.assertNode(node, isObjectBindingOrAssignmentElement);
if (isSpreadAssignment(node))
return visitAssignmentRestProperty(node);
if (isShorthandPropertyAssignment(node))
return visitShorthandAssignmentProperty(node);
if (isPropertyAssignment(node))
return visitAssignmentProperty(node);
return visitEachChild(node, visitor, context);
}
function visitAssignmentPattern(node) {
if (isArrayLiteralExpression(node)) {
const elements = visitNodes2(node.elements, visitArrayAssignmentElement, isExpression);
return factory2.updateArrayLiteralExpression(node, elements);
} else {
const properties = visitNodes2(node.properties, visitObjectAssignmentElement, isObjectLiteralElementLike);
return factory2.updateObjectLiteralExpression(node, properties);
}
}
function visitExportAssignment(node) {
if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
const referencedName = factory2.createStringLiteral(node.isExportEquals ? "" : "default");
const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
const expression = visitNode(node.expression, (node2) => namedEvaluationVisitor(node2, referencedName), isExpression);
return factory2.updateExportAssignment(node, modifiers, expression);
}
return visitEachChild(node, visitor, context);
}
function visitParenthesizedExpression(node, discarded, referencedName) {
const visitorFunc = discarded ? discardedValueVisitor : referencedName ? (node2) => namedEvaluationVisitor(node2, referencedName) : visitor;
const expression = visitNode(node.expression, visitorFunc, isExpression);
return factory2.updateParenthesizedExpression(node, expression);
}
function visitPartiallyEmittedExpression(node, discarded, referencedName) {
const visitorFunc = discarded ? discardedValueVisitor : referencedName ? (node2) => namedEvaluationVisitor(node2, referencedName) : visitor;
const expression = visitNode(node.expression, visitorFunc, isExpression);
return factory2.updatePartiallyEmittedExpression(node, expression);
}
function injectPendingExpressions(expression) {
if (some(pendingExpressions)) {
if (isParenthesizedExpression(expression)) {
pendingExpressions.push(expression.expression);
expression = factory2.updateParenthesizedExpression(expression, factory2.inlineExpressions(pendingExpressions));
} else {
pendingExpressions.push(expression);
expression = factory2.inlineExpressions(pendingExpressions);
}
pendingExpressions = void 0;
}
return expression;
}
function transformAllDecoratorsOfDeclaration(allDecorators) {
if (!allDecorators) {
return void 0;
}
const decoratorExpressions = [];
addRange(decoratorExpressions, map(allDecorators.decorators, transformDecorator));
return decoratorExpressions;
}
function transformDecorator(decorator) {
const expression = visitNode(decorator.expression, visitor, isExpression);
setEmitFlags(expression, 3072 /* NoComments */);
return expression;
}
function createDescriptorMethod(original, name, modifiers, asteriskToken, kind, parameters, body) {
const func = factory2.createFunctionExpression(
modifiers,
asteriskToken,
/*name*/
void 0,
/*typeParameters*/
void 0,
parameters,
/*type*/
void 0,
body ?? factory2.createBlock([])
);
setOriginalNode(func, original);
setSourceMapRange(func, moveRangePastDecorators(original));
setEmitFlags(func, 3072 /* NoComments */);
const prefix = kind === "get" || kind === "set" ? kind : void 0;
const functionName = factory2.createStringLiteralFromNode(
name,
/*isSingleQuote*/
void 0
);
const namedFunction = emitHelpers().createSetFunctionNameHelper(func, functionName, prefix);
const method = factory2.createPropertyAssignment(factory2.createIdentifier(kind), namedFunction);
setOriginalNode(method, original);
setSourceMapRange(method, moveRangePastDecorators(original));
setEmitFlags(method, 3072 /* NoComments */);
return method;
}
function createMethodDescriptorObject(node, modifiers) {
return factory2.createObjectLiteralExpression([
createDescriptorMethod(
node,
node.name,
modifiers,
node.asteriskToken,
"value",
visitNodes2(node.parameters, visitor, isParameter),
visitNode(node.body, visitor, isBlock)
)
]);
}
function createGetAccessorDescriptorObject(node, modifiers) {
return factory2.createObjectLiteralExpression([
createDescriptorMethod(
node,
node.name,
modifiers,
/*asteriskToken*/
void 0,
"get",
[],
visitNode(node.body, visitor, isBlock)
)
]);
}
function createSetAccessorDescriptorObject(node, modifiers) {
return factory2.createObjectLiteralExpression([
createDescriptorMethod(
node,
node.name,
modifiers,
/*asteriskToken*/
void 0,
"set",
visitNodes2(node.parameters, visitor, isParameter),
visitNode(node.body, visitor, isBlock)
)
]);
}
function createAccessorPropertyDescriptorObject(node, modifiers) {
return factory2.createObjectLiteralExpression([
createDescriptorMethod(
node,
node.name,
modifiers,
/*asteriskToken*/
void 0,
"get",
[],
factory2.createBlock([
factory2.createReturnStatement(
factory2.createPropertyAccessExpression(
factory2.createThis(),
factory2.getGeneratedPrivateNameForNode(node.name)
)
)
])
),
createDescriptorMethod(
node,
node.name,
modifiers,
/*asteriskToken*/
void 0,
"set",
[factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
"value"
)],
factory2.createBlock([
factory2.createExpressionStatement(
factory2.createAssignment(
factory2.createPropertyAccessExpression(
factory2.createThis(),
factory2.getGeneratedPrivateNameForNode(node.name)
),
factory2.createIdentifier("value")
)
)
])
)
]);
}
function createMethodDescriptorForwarder(modifiers, name, descriptorName) {
modifiers = visitNodes2(modifiers, (node) => isStaticModifier(node) ? node : void 0, isModifier);
return factory2.createGetAccessorDeclaration(
modifiers,
name,
[],
/*type*/
void 0,
factory2.createBlock([
factory2.createReturnStatement(
factory2.createPropertyAccessExpression(
descriptorName,
factory2.createIdentifier("value")
)
)
])
);
}
function createGetAccessorDescriptorForwarder(modifiers, name, descriptorName) {
modifiers = visitNodes2(modifiers, (node) => isStaticModifier(node) ? node : void 0, isModifier);
return factory2.createGetAccessorDeclaration(
modifiers,
name,
[],
/*type*/
void 0,
factory2.createBlock([
factory2.createReturnStatement(
factory2.createFunctionCallCall(
factory2.createPropertyAccessExpression(
descriptorName,
factory2.createIdentifier("get")
),
factory2.createThis(),
[]
)
)
])
);
}
function createSetAccessorDescriptorForwarder(modifiers, name, descriptorName) {
modifiers = visitNodes2(modifiers, (node) => isStaticModifier(node) ? node : void 0, isModifier);
return factory2.createSetAccessorDeclaration(
modifiers,
name,
[factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
"value"
)],
factory2.createBlock([
factory2.createReturnStatement(
factory2.createFunctionCallCall(
factory2.createPropertyAccessExpression(
descriptorName,
factory2.createIdentifier("set")
),
factory2.createThis(),
[factory2.createIdentifier("value")]
)
)
])
);
}
function getAssignedNameOfIdentifier(name, initializer) {
const originalClass = getOriginalNode(initializer, isClassLike);
return originalClass && !originalClass.name && hasSyntacticModifier(originalClass, 1024 /* Default */) ? factory2.createStringLiteral("default") : factory2.createStringLiteralFromNode(name);
}
}
// src/compiler/transformers/es2017.ts
function transformES2017(context) {
const {
factory: factory2,
getEmitHelperFactory: emitHelpers,
resumeLexicalEnvironment,
endLexicalEnvironment,
hoistVariableDeclaration
} = context;
const resolver = context.getEmitResolver();
const compilerOptions = context.getCompilerOptions();
const languageVersion = getEmitScriptTarget(compilerOptions);
let enabledSubstitutions;
let enclosingSuperContainerFlags = 0;
let enclosingFunctionParameterNames;
let capturedSuperProperties;
let hasSuperElementAccess;
const substitutedSuperAccessors = [];
let contextFlags = 0 /* None */;
const previousOnEmitNode = context.onEmitNode;
const previousOnSubstituteNode = context.onSubstituteNode;
context.onEmitNode = onEmitNode;
context.onSubstituteNode = onSubstituteNode;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
if (node.isDeclarationFile) {
return node;
}
setContextFlag(1 /* NonTopLevel */, false);
setContextFlag(2 /* HasLexicalThis */, !isEffectiveStrictModeSourceFile(node, compilerOptions));
const visited = visitEachChild(node, visitor, context);
addEmitHelpers(visited, context.readEmitHelpers());
return visited;
}
function setContextFlag(flag, val) {
contextFlags = val ? contextFlags | flag : contextFlags & ~flag;
}
function inContext(flags) {
return (contextFlags & flags) !== 0;
}
function inTopLevelContext() {
return !inContext(1 /* NonTopLevel */);
}
function inHasLexicalThisContext() {
return inContext(2 /* HasLexicalThis */);
}
function doWithContext(flags, cb, value) {
const contextFlagsToSet = flags & ~contextFlags;
if (contextFlagsToSet) {
setContextFlag(
contextFlagsToSet,
/*val*/
true
);
const result = cb(value);
setContextFlag(
contextFlagsToSet,
/*val*/
false
);
return result;
}
return cb(value);
}
function visitDefault(node) {
return visitEachChild(node, visitor, context);
}
function visitor(node) {
if ((node.transformFlags & 256 /* ContainsES2017 */) === 0) {
return node;
}
switch (node.kind) {
case 134 /* AsyncKeyword */:
return void 0;
case 222 /* AwaitExpression */:
return visitAwaitExpression(node);
case 173 /* MethodDeclaration */:
return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitMethodDeclaration, node);
case 261 /* FunctionDeclaration */:
return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitFunctionDeclaration, node);
case 217 /* FunctionExpression */:
return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitFunctionExpression, node);
case 218 /* ArrowFunction */:
return doWithContext(1 /* NonTopLevel */, visitArrowFunction, node);
case 210 /* PropertyAccessExpression */:
if (capturedSuperProperties && isPropertyAccessExpression(node) && node.expression.kind === 108 /* SuperKeyword */) {
capturedSuperProperties.add(node.name.escapedText);
}
return visitEachChild(node, visitor, context);
case 211 /* ElementAccessExpression */:
if (capturedSuperProperties && node.expression.kind === 108 /* SuperKeyword */) {
hasSuperElementAccess = true;
}
return visitEachChild(node, visitor, context);
case 176 /* GetAccessor */:
return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitGetAccessorDeclaration, node);
case 177 /* SetAccessor */:
return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitSetAccessorDeclaration, node);
case 175 /* Constructor */:
return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitConstructorDeclaration, node);
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitDefault, node);
default:
return visitEachChild(node, visitor, context);
}
}
function asyncBodyVisitor(node) {
if (isNodeWithPossibleHoistedDeclaration(node)) {
switch (node.kind) {
case 242 /* VariableStatement */:
return visitVariableStatementInAsyncBody(node);
case 247 /* ForStatement */:
return visitForStatementInAsyncBody(node);
case 248 /* ForInStatement */:
return visitForInStatementInAsyncBody(node);
case 249 /* ForOfStatement */:
return visitForOfStatementInAsyncBody(node);
case 298 /* CatchClause */:
return visitCatchClauseInAsyncBody(node);
case 240 /* Block */:
case 254 /* SwitchStatement */:
case 268 /* CaseBlock */:
case 295 /* CaseClause */:
case 296 /* DefaultClause */:
case 257 /* TryStatement */:
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
case 244 /* IfStatement */:
case 253 /* WithStatement */:
case 255 /* LabeledStatement */:
return visitEachChild(node, asyncBodyVisitor, context);
default:
return Debug.assertNever(node, "Unhandled node.");
}
}
return visitor(node);
}
function visitCatchClauseInAsyncBody(node) {
const catchClauseNames = /* @__PURE__ */ new Set();
recordDeclarationName(node.variableDeclaration, catchClauseNames);
let catchClauseUnshadowedNames;
catchClauseNames.forEach((_, escapedName) => {
if (enclosingFunctionParameterNames.has(escapedName)) {
if (!catchClauseUnshadowedNames) {
catchClauseUnshadowedNames = new Set(enclosingFunctionParameterNames);
}
catchClauseUnshadowedNames.delete(escapedName);
}
});
if (catchClauseUnshadowedNames) {
const savedEnclosingFunctionParameterNames = enclosingFunctionParameterNames;
enclosingFunctionParameterNames = catchClauseUnshadowedNames;
const result = visitEachChild(node, asyncBodyVisitor, context);
enclosingFunctionParameterNames = savedEnclosingFunctionParameterNames;
return result;
} else {
return visitEachChild(node, asyncBodyVisitor, context);
}
}
function visitVariableStatementInAsyncBody(node) {
if (isVariableDeclarationListWithCollidingName(node.declarationList)) {
const expression = visitVariableDeclarationListWithCollidingNames(
node.declarationList,
/*hasReceiver*/
false
);
return expression ? factory2.createExpressionStatement(expression) : void 0;
}
return visitEachChild(node, visitor, context);
}
function visitForInStatementInAsyncBody(node) {
return factory2.updateForInStatement(
node,
isVariableDeclarationListWithCollidingName(node.initializer) ? visitVariableDeclarationListWithCollidingNames(
node.initializer,
/*hasReceiver*/
true
) : Debug.checkDefined(visitNode(node.initializer, visitor, isForInitializer)),
Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
visitIterationBody(node.statement, asyncBodyVisitor, context)
);
}
function visitForOfStatementInAsyncBody(node) {
return factory2.updateForOfStatement(
node,
visitNode(node.awaitModifier, visitor, isAwaitKeyword),
isVariableDeclarationListWithCollidingName(node.initializer) ? visitVariableDeclarationListWithCollidingNames(
node.initializer,
/*hasReceiver*/
true
) : Debug.checkDefined(visitNode(node.initializer, visitor, isForInitializer)),
Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
visitIterationBody(node.statement, asyncBodyVisitor, context)
);
}
function visitForStatementInAsyncBody(node) {
const initializer = node.initializer;
return factory2.updateForStatement(
node,
isVariableDeclarationListWithCollidingName(initializer) ? visitVariableDeclarationListWithCollidingNames(
initializer,
/*hasReceiver*/
false
) : visitNode(node.initializer, visitor, isForInitializer),
visitNode(node.condition, visitor, isExpression),
visitNode(node.incrementor, visitor, isExpression),
visitIterationBody(node.statement, asyncBodyVisitor, context)
);
}
function visitAwaitExpression(node) {
if (inTopLevelContext()) {
return visitEachChild(node, visitor, context);
}
return setOriginalNode(
setTextRange(
factory2.createYieldExpression(
/*asteriskToken*/
void 0,
visitNode(node.expression, visitor, isExpression)
),
node
),
node
);
}
function visitConstructorDeclaration(node) {
return factory2.updateConstructorDeclaration(
node,
visitNodes2(node.modifiers, visitor, isModifier),
visitParameterList(node.parameters, visitor, context),
transformMethodBody(node)
);
}
function visitMethodDeclaration(node) {
return factory2.updateMethodDeclaration(
node,
visitNodes2(node.modifiers, visitor, isModifierLike),
node.asteriskToken,
node.name,
/*questionToken*/
void 0,
/*typeParameters*/
void 0,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
getFunctionFlags(node) & 2 /* Async */ ? transformAsyncFunctionBody(node) : transformMethodBody(node)
);
}
function visitGetAccessorDeclaration(node) {
return factory2.updateGetAccessorDeclaration(
node,
visitNodes2(node.modifiers, visitor, isModifierLike),
node.name,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
transformMethodBody(node)
);
}
function visitSetAccessorDeclaration(node) {
return factory2.updateSetAccessorDeclaration(
node,
visitNodes2(node.modifiers, visitor, isModifierLike),
node.name,
visitParameterList(node.parameters, visitor, context),
transformMethodBody(node)
);
}
function visitFunctionDeclaration(node) {
return factory2.updateFunctionDeclaration(
node,
visitNodes2(node.modifiers, visitor, isModifierLike),
node.asteriskToken,
node.name,
/*typeParameters*/
void 0,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
getFunctionFlags(node) & 2 /* Async */ ? transformAsyncFunctionBody(node) : visitFunctionBody(node.body, visitor, context)
);
}
function visitFunctionExpression(node) {
return factory2.updateFunctionExpression(
node,
visitNodes2(node.modifiers, visitor, isModifier),
node.asteriskToken,
node.name,
/*typeParameters*/
void 0,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
getFunctionFlags(node) & 2 /* Async */ ? transformAsyncFunctionBody(node) : visitFunctionBody(node.body, visitor, context)
);
}
function visitArrowFunction(node) {
return factory2.updateArrowFunction(
node,
visitNodes2(node.modifiers, visitor, isModifier),
/*typeParameters*/
void 0,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
node.equalsGreaterThanToken,
getFunctionFlags(node) & 2 /* Async */ ? transformAsyncFunctionBody(node) : visitFunctionBody(node.body, visitor, context)
);
}
function recordDeclarationName({ name }, names) {
if (isIdentifier(name)) {
names.add(name.escapedText);
} else {
for (const element of name.elements) {
if (!isOmittedExpression(element)) {
recordDeclarationName(element, names);
}
}
}
}
function isVariableDeclarationListWithCollidingName(node) {
return !!node && isVariableDeclarationList(node) && !(node.flags & 3 /* BlockScoped */) && node.declarations.some(collidesWithParameterName);
}
function visitVariableDeclarationListWithCollidingNames(node, hasReceiver) {
hoistVariableDeclarationList(node);
const variables = getInitializedVariables(node);
if (variables.length === 0) {
if (hasReceiver) {
return visitNode(factory2.converters.convertToAssignmentElementTarget(node.declarations[0].name), visitor, isExpression);
}
return void 0;
}
return factory2.inlineExpressions(map(variables, transformInitializedVariable));
}
function hoistVariableDeclarationList(node) {
forEach(node.declarations, hoistVariable);
}
function hoistVariable({ name }) {
if (isIdentifier(name)) {
hoistVariableDeclaration(name);
} else {
for (const element of name.elements) {
if (!isOmittedExpression(element)) {
hoistVariable(element);
}
}
}
}
function transformInitializedVariable(node) {
const converted = setSourceMapRange(
factory2.createAssignment(
factory2.converters.convertToAssignmentElementTarget(node.name),
node.initializer
),
node
);
return Debug.checkDefined(visitNode(converted, visitor, isExpression));
}
function collidesWithParameterName({ name }) {
if (isIdentifier(name)) {
return enclosingFunctionParameterNames.has(name.escapedText);
} else {
for (const element of name.elements) {
if (!isOmittedExpression(element) && collidesWithParameterName(element)) {
return true;
}
}
}
return false;
}
function transformMethodBody(node) {
Debug.assertIsDefined(node.body);
const savedCapturedSuperProperties = capturedSuperProperties;
const savedHasSuperElementAccess = hasSuperElementAccess;
capturedSuperProperties = /* @__PURE__ */ new Set();
hasSuperElementAccess = false;
let updated = visitFunctionBody(node.body, visitor, context);
const originalMethod = getOriginalNode(node, isFunctionLikeDeclaration);
const emitSuperHelpers = languageVersion >= 2 /* ES2015 */ && resolver.getNodeCheckFlags(node) & (256 /* MethodWithSuperPropertyAssignmentInAsync */ | 128 /* MethodWithSuperPropertyAccessInAsync */) && (getFunctionFlags(originalMethod) & 3 /* AsyncGenerator */) !== 3 /* AsyncGenerator */;
if (emitSuperHelpers) {
enableSubstitutionForAsyncMethodsWithSuper();
if (capturedSuperProperties.size) {
const variableStatement = createSuperAccessVariableStatement(factory2, resolver, node, capturedSuperProperties);
substitutedSuperAccessors[getNodeId(variableStatement)] = true;
const statements = updated.statements.slice();
insertStatementsAfterStandardPrologue(statements, [variableStatement]);
updated = factory2.updateBlock(updated, statements);
}
if (hasSuperElementAccess) {
if (resolver.getNodeCheckFlags(node) & 256 /* MethodWithSuperPropertyAssignmentInAsync */) {
addEmitHelper(updated, advancedAsyncSuperHelper);
} else if (resolver.getNodeCheckFlags(node) & 128 /* MethodWithSuperPropertyAccessInAsync */) {
addEmitHelper(updated, asyncSuperHelper);
}
}
}
capturedSuperProperties = savedCapturedSuperProperties;
hasSuperElementAccess = savedHasSuperElementAccess;
return updated;
}
function transformAsyncFunctionBody(node) {
resumeLexicalEnvironment();
const original = getOriginalNode(node, isFunctionLike);
const nodeType = original.type;
const promiseConstructor = languageVersion < 2 /* ES2015 */ ? getPromiseConstructor(nodeType) : void 0;
const isArrowFunction2 = node.kind === 218 /* ArrowFunction */;
const hasLexicalArguments = (resolver.getNodeCheckFlags(node) & 512 /* CaptureArguments */) !== 0;
const savedEnclosingFunctionParameterNames = enclosingFunctionParameterNames;
enclosingFunctionParameterNames = /* @__PURE__ */ new Set();
for (const parameter of node.parameters) {
recordDeclarationName(parameter, enclosingFunctionParameterNames);
}
const savedCapturedSuperProperties = capturedSuperProperties;
const savedHasSuperElementAccess = hasSuperElementAccess;
if (!isArrowFunction2) {
capturedSuperProperties = /* @__PURE__ */ new Set();
hasSuperElementAccess = false;
}
let result;
if (!isArrowFunction2) {
const statements = [];
const statementOffset = factory2.copyPrologue(
node.body.statements,
statements,
/*ensureUseStrict*/
false,
visitor
);
statements.push(
factory2.createReturnStatement(
emitHelpers().createAwaiterHelper(
inHasLexicalThisContext(),
hasLexicalArguments,
promiseConstructor,
transformAsyncFunctionBodyWorker(node.body, statementOffset)
)
)
);
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
const emitSuperHelpers = languageVersion >= 2 /* ES2015 */ && resolver.getNodeCheckFlags(node) & (256 /* MethodWithSuperPropertyAssignmentInAsync */ | 128 /* MethodWithSuperPropertyAccessInAsync */);
if (emitSuperHelpers) {
enableSubstitutionForAsyncMethodsWithSuper();
if (capturedSuperProperties.size) {
const variableStatement = createSuperAccessVariableStatement(factory2, resolver, node, capturedSuperProperties);
substitutedSuperAccessors[getNodeId(variableStatement)] = true;
insertStatementsAfterStandardPrologue(statements, [variableStatement]);
}
}
const block = factory2.createBlock(
statements,
/*multiLine*/
true
);
setTextRange(block, node.body);
if (emitSuperHelpers && hasSuperElementAccess) {
if (resolver.getNodeCheckFlags(node) & 256 /* MethodWithSuperPropertyAssignmentInAsync */) {
addEmitHelper(block, advancedAsyncSuperHelper);
} else if (resolver.getNodeCheckFlags(node) & 128 /* MethodWithSuperPropertyAccessInAsync */) {
addEmitHelper(block, asyncSuperHelper);
}
}
result = block;
} else {
const expression = emitHelpers().createAwaiterHelper(
inHasLexicalThisContext(),
hasLexicalArguments,
promiseConstructor,
transformAsyncFunctionBodyWorker(node.body)
);
const declarations = endLexicalEnvironment();
if (some(declarations)) {
const block = factory2.converters.convertToFunctionBlock(expression);
result = factory2.updateBlock(block, setTextRange(factory2.createNodeArray(concatenate(declarations, block.statements)), block.statements));
} else {
result = expression;
}
}
enclosingFunctionParameterNames = savedEnclosingFunctionParameterNames;
if (!isArrowFunction2) {
capturedSuperProperties = savedCapturedSuperProperties;
hasSuperElementAccess = savedHasSuperElementAccess;
}
return result;
}
function transformAsyncFunctionBodyWorker(body, start) {
if (isBlock(body)) {
return factory2.updateBlock(body, visitNodes2(body.statements, asyncBodyVisitor, isStatement, start));
} else {
return factory2.converters.convertToFunctionBlock(Debug.checkDefined(visitNode(body, asyncBodyVisitor, isConciseBody)));
}
}
function getPromiseConstructor(type) {
const typeName = type && getEntityNameFromTypeNode(type);
if (typeName && isEntityName(typeName)) {
const serializationKind = resolver.getTypeReferenceSerializationKind(typeName);
if (serializationKind === 1 /* TypeWithConstructSignatureAndValue */ || serializationKind === 0 /* Unknown */) {
return typeName;
}
}
return void 0;
}
function enableSubstitutionForAsyncMethodsWithSuper() {
if ((enabledSubstitutions & 1 /* AsyncMethodsWithSuper */) === 0) {
enabledSubstitutions |= 1 /* AsyncMethodsWithSuper */;
context.enableSubstitution(212 /* CallExpression */);
context.enableSubstitution(210 /* PropertyAccessExpression */);
context.enableSubstitution(211 /* ElementAccessExpression */);
context.enableEmitNotification(262 /* ClassDeclaration */);
context.enableEmitNotification(173 /* MethodDeclaration */);
context.enableEmitNotification(176 /* GetAccessor */);
context.enableEmitNotification(177 /* SetAccessor */);
context.enableEmitNotification(175 /* Constructor */);
context.enableEmitNotification(242 /* VariableStatement */);
}
}
function onEmitNode(hint, node, emitCallback) {
if (enabledSubstitutions & 1 /* AsyncMethodsWithSuper */ && isSuperContainer(node)) {
const superContainerFlags = resolver.getNodeCheckFlags(node) & (128 /* MethodWithSuperPropertyAccessInAsync */ | 256 /* MethodWithSuperPropertyAssignmentInAsync */);
if (superContainerFlags !== enclosingSuperContainerFlags) {
const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags;
enclosingSuperContainerFlags = superContainerFlags;
previousOnEmitNode(hint, node, emitCallback);
enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags;
return;
}
} else if (enabledSubstitutions && substitutedSuperAccessors[getNodeId(node)]) {
const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags;
enclosingSuperContainerFlags = 0;
previousOnEmitNode(hint, node, emitCallback);
enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags;
return;
}
previousOnEmitNode(hint, node, emitCallback);
}
function onSubstituteNode(hint, node) {
node = previousOnSubstituteNode(hint, node);
if (hint === 1 /* Expression */ && enclosingSuperContainerFlags) {
return substituteExpression(node);
}
return node;
}
function substituteExpression(node) {
switch (node.kind) {
case 210 /* PropertyAccessExpression */:
return substitutePropertyAccessExpression(node);
case 211 /* ElementAccessExpression */:
return substituteElementAccessExpression(node);
case 212 /* CallExpression */:
return substituteCallExpression(node);
}
return node;
}
function substitutePropertyAccessExpression(node) {
if (node.expression.kind === 108 /* SuperKeyword */) {
return setTextRange(
factory2.createPropertyAccessExpression(
factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */),
node.name
),
node
);
}
return node;
}
function substituteElementAccessExpression(node) {
if (node.expression.kind === 108 /* SuperKeyword */) {
return createSuperElementAccessInAsyncMethod(
node.argumentExpression,
node
);
}
return node;
}
function substituteCallExpression(node) {
const expression = node.expression;
if (isSuperProperty(expression)) {
const argumentExpression = isPropertyAccessExpression(expression) ? substitutePropertyAccessExpression(expression) : substituteElementAccessExpression(expression);
return factory2.createCallExpression(
factory2.createPropertyAccessExpression(argumentExpression, "call"),
/*typeArguments*/
void 0,
[
factory2.createThis(),
...node.arguments
]
);
}
return node;
}
function isSuperContainer(node) {
const kind = node.kind;
return kind === 262 /* ClassDeclaration */ || kind === 175 /* Constructor */ || kind === 173 /* MethodDeclaration */ || kind === 176 /* GetAccessor */ || kind === 177 /* SetAccessor */;
}
function createSuperElementAccessInAsyncMethod(argumentExpression, location) {
if (enclosingSuperContainerFlags & 256 /* MethodWithSuperPropertyAssignmentInAsync */) {
return setTextRange(
factory2.createPropertyAccessExpression(
factory2.createCallExpression(
factory2.createUniqueName("_superIndex", 16 /* Optimistic */ | 32 /* FileLevel */),
/*typeArguments*/
void 0,
[argumentExpression]
),
"value"
),
location
);
} else {
return setTextRange(
factory2.createCallExpression(
factory2.createUniqueName("_superIndex", 16 /* Optimistic */ | 32 /* FileLevel */),
/*typeArguments*/
void 0,
[argumentExpression]
),
location
);
}
}
}
function createSuperAccessVariableStatement(factory2, resolver, node, names) {
const hasBinding = (resolver.getNodeCheckFlags(node) & 256 /* MethodWithSuperPropertyAssignmentInAsync */) !== 0;
const accessors = [];
names.forEach((_, key) => {
const name = unescapeLeadingUnderscores(key);
const getterAndSetter = [];
getterAndSetter.push(factory2.createPropertyAssignment(
"get",
factory2.createArrowFunction(
/*modifiers*/
void 0,
/*typeParameters*/
void 0,
/* parameters */
[],
/*type*/
void 0,
/*equalsGreaterThanToken*/
void 0,
setEmitFlags(
factory2.createPropertyAccessExpression(
setEmitFlags(
factory2.createSuper(),
8 /* NoSubstitution */
),
name
),
8 /* NoSubstitution */
)
)
));
if (hasBinding) {
getterAndSetter.push(
factory2.createPropertyAssignment(
"set",
factory2.createArrowFunction(
/*modifiers*/
void 0,
/*typeParameters*/
void 0,
/* parameters */
[
factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
"v",
/*questionToken*/
void 0,
/*type*/
void 0,
/*initializer*/
void 0
)
],
/*type*/
void 0,
/*equalsGreaterThanToken*/
void 0,
factory2.createAssignment(
setEmitFlags(
factory2.createPropertyAccessExpression(
setEmitFlags(
factory2.createSuper(),
8 /* NoSubstitution */
),
name
),
8 /* NoSubstitution */
),
factory2.createIdentifier("v")
)
)
)
);
}
accessors.push(
factory2.createPropertyAssignment(
name,
factory2.createObjectLiteralExpression(getterAndSetter)
)
);
});
return factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(
[
factory2.createVariableDeclaration(
factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */),
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createCallExpression(
factory2.createPropertyAccessExpression(
factory2.createIdentifier("Object"),
"create"
),
/*typeArguments*/
void 0,
[
factory2.createNull(),
factory2.createObjectLiteralExpression(
accessors,
/*multiLine*/
true
)
]
)
)
],
2 /* Const */
)
);
}
// src/compiler/transformers/es2018.ts
function transformES2018(context) {
const {
factory: factory2,
getEmitHelperFactory: emitHelpers,
resumeLexicalEnvironment,
endLexicalEnvironment,
hoistVariableDeclaration
} = context;
const resolver = context.getEmitResolver();
const compilerOptions = context.getCompilerOptions();
const languageVersion = getEmitScriptTarget(compilerOptions);
const previousOnEmitNode = context.onEmitNode;
context.onEmitNode = onEmitNode;
const previousOnSubstituteNode = context.onSubstituteNode;
context.onSubstituteNode = onSubstituteNode;
let exportedVariableStatement = false;
let enabledSubstitutions;
let enclosingFunctionFlags;
let parametersWithPrecedingObjectRestOrSpread;
let enclosingSuperContainerFlags = 0;
let hierarchyFacts = 0;
let currentSourceFile;
let taggedTemplateStringDeclarations;
let capturedSuperProperties;
let hasSuperElementAccess;
const substitutedSuperAccessors = [];
return chainBundle(context, transformSourceFile);
function affectsSubtree(excludeFacts, includeFacts) {
return hierarchyFacts !== (hierarchyFacts & ~excludeFacts | includeFacts);
}
function enterSubtree(excludeFacts, includeFacts) {
const ancestorFacts = hierarchyFacts;
hierarchyFacts = (hierarchyFacts & ~excludeFacts | includeFacts) & 3 /* AncestorFactsMask */;
return ancestorFacts;
}
function exitSubtree(ancestorFacts) {
hierarchyFacts = ancestorFacts;
}
function recordTaggedTemplateString(temp) {
taggedTemplateStringDeclarations = append(
taggedTemplateStringDeclarations,
factory2.createVariableDeclaration(temp)
);
}
function transformSourceFile(node) {
if (node.isDeclarationFile) {
return node;
}
currentSourceFile = node;
const visited = visitSourceFile(node);
addEmitHelpers(visited, context.readEmitHelpers());
currentSourceFile = void 0;
taggedTemplateStringDeclarations = void 0;
return visited;
}
function visitor(node) {
return visitorWorker(
node,
/*expressionResultIsUnused*/
false
);
}
function visitorWithUnusedExpressionResult(node) {
return visitorWorker(
node,
/*expressionResultIsUnused*/
true
);
}
function visitorNoAsyncModifier(node) {
if (node.kind === 134 /* AsyncKeyword */) {
return void 0;
}
return node;
}
function doWithHierarchyFacts(cb, value, excludeFacts, includeFacts) {
if (affectsSubtree(excludeFacts, includeFacts)) {
const ancestorFacts = enterSubtree(excludeFacts, includeFacts);
const result = cb(value);
exitSubtree(ancestorFacts);
return result;
}
return cb(value);
}
function visitDefault(node) {
return visitEachChild(node, visitor, context);
}
function visitorWorker(node, expressionResultIsUnused2) {
if ((node.transformFlags & 128 /* ContainsES2018 */) === 0) {
return node;
}
switch (node.kind) {
case 222 /* AwaitExpression */:
return visitAwaitExpression(node);
case 228 /* YieldExpression */:
return visitYieldExpression(node);
case 252 /* ReturnStatement */:
return visitReturnStatement(node);
case 255 /* LabeledStatement */:
return visitLabeledStatement(node);
case 209 /* ObjectLiteralExpression */:
return visitObjectLiteralExpression(node);
case 225 /* BinaryExpression */:
return visitBinaryExpression(node, expressionResultIsUnused2);
case 360 /* CommaListExpression */:
return visitCommaListExpression(node, expressionResultIsUnused2);
case 298 /* CatchClause */:
return visitCatchClause(node);
case 242 /* VariableStatement */:
return visitVariableStatement(node);
case 259 /* VariableDeclaration */:
return visitVariableDeclaration(node);
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
case 248 /* ForInStatement */:
return doWithHierarchyFacts(
visitDefault,
node,
0 /* IterationStatementExcludes */,
2 /* IterationStatementIncludes */
);
case 249 /* ForOfStatement */:
return visitForOfStatement(
node,
/*outermostLabeledStatement*/
void 0
);
case 247 /* ForStatement */:
return doWithHierarchyFacts(
visitForStatement,
node,
0 /* IterationStatementExcludes */,
2 /* IterationStatementIncludes */
);
case 221 /* VoidExpression */:
return visitVoidExpression(node);
case 175 /* Constructor */:
return doWithHierarchyFacts(
visitConstructorDeclaration,
node,
2 /* ClassOrFunctionExcludes */,
1 /* ClassOrFunctionIncludes */
);
case 173 /* MethodDeclaration */:
return doWithHierarchyFacts(
visitMethodDeclaration,
node,
2 /* ClassOrFunctionExcludes */,
1 /* ClassOrFunctionIncludes */
);
case 176 /* GetAccessor */:
return doWithHierarchyFacts(
visitGetAccessorDeclaration,
node,
2 /* ClassOrFunctionExcludes */,
1 /* ClassOrFunctionIncludes */
);
case 177 /* SetAccessor */:
return doWithHierarchyFacts(
visitSetAccessorDeclaration,
node,
2 /* ClassOrFunctionExcludes */,
1 /* ClassOrFunctionIncludes */
);
case 261 /* FunctionDeclaration */:
return doWithHierarchyFacts(
visitFunctionDeclaration,
node,
2 /* ClassOrFunctionExcludes */,
1 /* ClassOrFunctionIncludes */
);
case 217 /* FunctionExpression */:
return doWithHierarchyFacts(
visitFunctionExpression,
node,
2 /* ClassOrFunctionExcludes */,
1 /* ClassOrFunctionIncludes */
);
case 218 /* ArrowFunction */:
return doWithHierarchyFacts(
visitArrowFunction,
node,
2 /* ArrowFunctionExcludes */,
0 /* ArrowFunctionIncludes */
);
case 168 /* Parameter */:
return visitParameter(node);
case 243 /* ExpressionStatement */:
return visitExpressionStatement(node);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(node, expressionResultIsUnused2);
case 214 /* TaggedTemplateExpression */:
return visitTaggedTemplateExpression(node);
case 210 /* PropertyAccessExpression */:
if (capturedSuperProperties && isPropertyAccessExpression(node) && node.expression.kind === 108 /* SuperKeyword */) {
capturedSuperProperties.add(node.name.escapedText);
}
return visitEachChild(node, visitor, context);
case 211 /* ElementAccessExpression */:
if (capturedSuperProperties && node.expression.kind === 108 /* SuperKeyword */) {
hasSuperElementAccess = true;
}
return visitEachChild(node, visitor, context);
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
return doWithHierarchyFacts(
visitDefault,
node,
2 /* ClassOrFunctionExcludes */,
1 /* ClassOrFunctionIncludes */
);
default:
return visitEachChild(node, visitor, context);
}
}
function visitAwaitExpression(node) {
if (enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */) {
return setOriginalNode(
setTextRange(
factory2.createYieldExpression(
/*asteriskToken*/
void 0,
emitHelpers().createAwaitHelper(visitNode(node.expression, visitor, isExpression))
),
/*location*/
node
),
node
);
}
return visitEachChild(node, visitor, context);
}
function visitYieldExpression(node) {
if (enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */) {
if (node.asteriskToken) {
const expression = visitNode(Debug.checkDefined(node.expression), visitor, isExpression);
return setOriginalNode(
setTextRange(
factory2.createYieldExpression(
/*asteriskToken*/
void 0,
emitHelpers().createAwaitHelper(
factory2.updateYieldExpression(
node,
node.asteriskToken,
setTextRange(
emitHelpers().createAsyncDelegatorHelper(
setTextRange(
emitHelpers().createAsyncValuesHelper(expression),
expression
)
),
expression
)
)
)
),
node
),
node
);
}
return setOriginalNode(
setTextRange(
factory2.createYieldExpression(
/*asteriskToken*/
void 0,
createDownlevelAwait(
node.expression ? visitNode(node.expression, visitor, isExpression) : factory2.createVoidZero()
)
),
node
),
node
);
}
return visitEachChild(node, visitor, context);
}
function visitReturnStatement(node) {
if (enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */) {
return factory2.updateReturnStatement(node, createDownlevelAwait(
node.expression ? visitNode(node.expression, visitor, isExpression) : factory2.createVoidZero()
));
}
return visitEachChild(node, visitor, context);
}
function visitLabeledStatement(node) {
if (enclosingFunctionFlags & 2 /* Async */) {
const statement = unwrapInnermostStatementOfLabel(node);
if (statement.kind === 249 /* ForOfStatement */ && statement.awaitModifier) {
return visitForOfStatement(statement, node);
}
return factory2.restoreEnclosingLabel(visitNode(statement, visitor, isStatement, factory2.liftToBlock), node);
}
return visitEachChild(node, visitor, context);
}
function chunkObjectLiteralElements(elements) {
let chunkObject;
const objects = [];
for (const e of elements) {
if (e.kind === 304 /* SpreadAssignment */) {
if (chunkObject) {
objects.push(factory2.createObjectLiteralExpression(chunkObject));
chunkObject = void 0;
}
const target = e.expression;
objects.push(visitNode(target, visitor, isExpression));
} else {
chunkObject = append(chunkObject, e.kind === 302 /* PropertyAssignment */ ? factory2.createPropertyAssignment(e.name, visitNode(e.initializer, visitor, isExpression)) : visitNode(e, visitor, isObjectLiteralElementLike));
}
}
if (chunkObject) {
objects.push(factory2.createObjectLiteralExpression(chunkObject));
}
return objects;
}
function visitObjectLiteralExpression(node) {
if (node.transformFlags & 65536 /* ContainsObjectRestOrSpread */) {
const objects = chunkObjectLiteralElements(node.properties);
if (objects.length && objects[0].kind !== 209 /* ObjectLiteralExpression */) {
objects.unshift(factory2.createObjectLiteralExpression());
}
let expression = objects[0];
if (objects.length > 1) {
for (let i = 1; i < objects.length; i++) {
expression = emitHelpers().createAssignHelper([expression, objects[i]]);
}
return expression;
} else {
return emitHelpers().createAssignHelper(objects);
}
}
return visitEachChild(node, visitor, context);
}
function visitExpressionStatement(node) {
return visitEachChild(node, visitorWithUnusedExpressionResult, context);
}
function visitParenthesizedExpression(node, expressionResultIsUnused2) {
return visitEachChild(node, expressionResultIsUnused2 ? visitorWithUnusedExpressionResult : visitor, context);
}
function visitSourceFile(node) {
const ancestorFacts = enterSubtree(
2 /* SourceFileExcludes */,
isEffectiveStrictModeSourceFile(node, compilerOptions) ? 0 /* StrictModeSourceFileIncludes */ : 1 /* SourceFileIncludes */
);
exportedVariableStatement = false;
const visited = visitEachChild(node, visitor, context);
const statement = concatenate(visited.statements, taggedTemplateStringDeclarations && [
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(taggedTemplateStringDeclarations)
)
]);
const result = factory2.updateSourceFile(visited, setTextRange(factory2.createNodeArray(statement), node.statements));
exitSubtree(ancestorFacts);
return result;
}
function visitTaggedTemplateExpression(node) {
return processTaggedTemplateExpression(
context,
node,
visitor,
currentSourceFile,
recordTaggedTemplateString,
0 /* LiftRestriction */
);
}
function visitBinaryExpression(node, expressionResultIsUnused2) {
if (isDestructuringAssignment(node) && containsObjectRestOrSpread(node.left)) {
return flattenDestructuringAssignment(
node,
visitor,
context,
1 /* ObjectRest */,
!expressionResultIsUnused2
);
}
if (node.operatorToken.kind === 28 /* CommaToken */) {
return factory2.updateBinaryExpression(
node,
visitNode(node.left, visitorWithUnusedExpressionResult, isExpression),
node.operatorToken,
visitNode(node.right, expressionResultIsUnused2 ? visitorWithUnusedExpressionResult : visitor, isExpression)
);
}
return visitEachChild(node, visitor, context);
}
function visitCommaListExpression(node, expressionResultIsUnused2) {
if (expressionResultIsUnused2) {
return visitEachChild(node, visitorWithUnusedExpressionResult, context);
}
let result;
for (let i = 0; i < node.elements.length; i++) {
const element = node.elements[i];
const visited = visitNode(element, i < node.elements.length - 1 ? visitorWithUnusedExpressionResult : visitor, isExpression);
if (result || visited !== element) {
result || (result = node.elements.slice(0, i));
result.push(visited);
}
}
const elements = result ? setTextRange(factory2.createNodeArray(result), node.elements) : node.elements;
return factory2.updateCommaListExpression(node, elements);
}
function visitCatchClause(node) {
if (node.variableDeclaration && isBindingPattern(node.variableDeclaration.name) && node.variableDeclaration.name.transformFlags & 65536 /* ContainsObjectRestOrSpread */) {
const name = factory2.getGeneratedNameForNode(node.variableDeclaration.name);
const updatedDecl = factory2.updateVariableDeclaration(
node.variableDeclaration,
node.variableDeclaration.name,
/*exclamationToken*/
void 0,
/*type*/
void 0,
name
);
const visitedBindings = flattenDestructuringBinding(updatedDecl, visitor, context, 1 /* ObjectRest */);
let block = visitNode(node.block, visitor, isBlock);
if (some(visitedBindings)) {
block = factory2.updateBlock(block, [
factory2.createVariableStatement(
/*modifiers*/
void 0,
visitedBindings
),
...block.statements
]);
}
return factory2.updateCatchClause(
node,
factory2.updateVariableDeclaration(
node.variableDeclaration,
name,
/*exclamationToken*/
void 0,
/*type*/
void 0,
/*initializer*/
void 0
),
block
);
}
return visitEachChild(node, visitor, context);
}
function visitVariableStatement(node) {
if (hasSyntacticModifier(node, 1 /* Export */)) {
const savedExportedVariableStatement = exportedVariableStatement;
exportedVariableStatement = true;
const visited = visitEachChild(node, visitor, context);
exportedVariableStatement = savedExportedVariableStatement;
return visited;
}
return visitEachChild(node, visitor, context);
}
function visitVariableDeclaration(node) {
if (exportedVariableStatement) {
const savedExportedVariableStatement = exportedVariableStatement;
exportedVariableStatement = false;
const visited = visitVariableDeclarationWorker(
node,
/*exportedVariableStatement*/
true
);
exportedVariableStatement = savedExportedVariableStatement;
return visited;
}
return visitVariableDeclarationWorker(
node,
/*exportedVariableStatement*/
false
);
}
function visitVariableDeclarationWorker(node, exportedVariableStatement2) {
if (isBindingPattern(node.name) && node.name.transformFlags & 65536 /* ContainsObjectRestOrSpread */) {
return flattenDestructuringBinding(
node,
visitor,
context,
1 /* ObjectRest */,
/*rval*/
void 0,
exportedVariableStatement2
);
}
return visitEachChild(node, visitor, context);
}
function visitForStatement(node) {
return factory2.updateForStatement(
node,
visitNode(node.initializer, visitorWithUnusedExpressionResult, isForInitializer),
visitNode(node.condition, visitor, isExpression),
visitNode(node.incrementor, visitorWithUnusedExpressionResult, isExpression),
visitIterationBody(node.statement, visitor, context)
);
}
function visitVoidExpression(node) {
return visitEachChild(node, visitorWithUnusedExpressionResult, context);
}
function visitForOfStatement(node, outermostLabeledStatement) {
const ancestorFacts = enterSubtree(0 /* IterationStatementExcludes */, 2 /* IterationStatementIncludes */);
if (node.initializer.transformFlags & 65536 /* ContainsObjectRestOrSpread */ || isAssignmentPattern(node.initializer) && containsObjectRestOrSpread(node.initializer)) {
node = transformForOfStatementWithObjectRest(node);
}
const result = node.awaitModifier ? transformForAwaitOfStatement(node, outermostLabeledStatement, ancestorFacts) : factory2.restoreEnclosingLabel(visitEachChild(node, visitor, context), outermostLabeledStatement);
exitSubtree(ancestorFacts);
return result;
}
function transformForOfStatementWithObjectRest(node) {
const initializerWithoutParens = skipParentheses(node.initializer);
if (isVariableDeclarationList(initializerWithoutParens) || isAssignmentPattern(initializerWithoutParens)) {
let bodyLocation;
let statementsLocation;
const temp = factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
const statements = [createForOfBindingStatement(factory2, initializerWithoutParens, temp)];
if (isBlock(node.statement)) {
addRange(statements, node.statement.statements);
bodyLocation = node.statement;
statementsLocation = node.statement.statements;
} else if (node.statement) {
append(statements, node.statement);
bodyLocation = node.statement;
statementsLocation = node.statement;
}
return factory2.updateForOfStatement(
node,
node.awaitModifier,
setTextRange(
factory2.createVariableDeclarationList(
[
setTextRange(factory2.createVariableDeclaration(temp), node.initializer)
],
1 /* Let */
),
node.initializer
),
node.expression,
setTextRange(
factory2.createBlock(
setTextRange(factory2.createNodeArray(statements), statementsLocation),
/*multiLine*/
true
),
bodyLocation
)
);
}
return node;
}
function convertForOfStatementHead(node, boundValue, nonUserCode) {
const value = factory2.createTempVariable(hoistVariableDeclaration);
const iteratorValueExpression = factory2.createAssignment(value, boundValue);
const iteratorValueStatement = factory2.createExpressionStatement(iteratorValueExpression);
setSourceMapRange(iteratorValueStatement, node.expression);
const exitNonUserCodeExpression = factory2.createAssignment(nonUserCode, factory2.createFalse());
const exitNonUserCodeStatement = factory2.createExpressionStatement(exitNonUserCodeExpression);
setSourceMapRange(exitNonUserCodeStatement, node.expression);
const statements = [iteratorValueStatement, exitNonUserCodeStatement];
const binding = createForOfBindingStatement(factory2, node.initializer, value);
statements.push(visitNode(binding, visitor, isStatement));
let bodyLocation;
let statementsLocation;
const statement = visitIterationBody(node.statement, visitor, context);
if (isBlock(statement)) {
addRange(statements, statement.statements);
bodyLocation = statement;
statementsLocation = statement.statements;
} else {
statements.push(statement);
}
return setTextRange(
factory2.createBlock(
setTextRange(factory2.createNodeArray(statements), statementsLocation),
/*multiLine*/
true
),
bodyLocation
);
}
function createDownlevelAwait(expression) {
return enclosingFunctionFlags & 1 /* Generator */ ? factory2.createYieldExpression(
/*asteriskToken*/
void 0,
emitHelpers().createAwaitHelper(expression)
) : factory2.createAwaitExpression(expression);
}
function transformForAwaitOfStatement(node, outermostLabeledStatement, ancestorFacts) {
const expression = visitNode(node.expression, visitor, isExpression);
const iterator = isIdentifier(expression) ? factory2.getGeneratedNameForNode(expression) : factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
const result = isIdentifier(expression) ? factory2.getGeneratedNameForNode(iterator) : factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
const nonUserCode = factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
const done = factory2.createTempVariable(hoistVariableDeclaration);
const errorRecord = factory2.createUniqueName("e");
const catchVariable = factory2.getGeneratedNameForNode(errorRecord);
const returnMethod = factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
const callValues = setTextRange(emitHelpers().createAsyncValuesHelper(expression), node.expression);
const callNext = factory2.createCallExpression(
factory2.createPropertyAccessExpression(iterator, "next"),
/*typeArguments*/
void 0,
[]
);
const getDone = factory2.createPropertyAccessExpression(result, "done");
const getValue = factory2.createPropertyAccessExpression(result, "value");
const callReturn = factory2.createFunctionCallCall(returnMethod, iterator, []);
hoistVariableDeclaration(errorRecord);
hoistVariableDeclaration(returnMethod);
const initializer = ancestorFacts & 2 /* IterationContainer */ ? factory2.inlineExpressions([factory2.createAssignment(errorRecord, factory2.createVoidZero()), callValues]) : callValues;
const forStatement = setEmitFlags(
setTextRange(
factory2.createForStatement(
/*initializer*/
setEmitFlags(
setTextRange(
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
nonUserCode,
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createTrue()
),
setTextRange(factory2.createVariableDeclaration(
iterator,
/*exclamationToken*/
void 0,
/*type*/
void 0,
initializer
), node.expression),
factory2.createVariableDeclaration(result)
]),
node.expression
),
4194304 /* NoHoisting */
),
/*condition*/
factory2.inlineExpressions([
factory2.createAssignment(result, createDownlevelAwait(callNext)),
factory2.createAssignment(done, getDone),
factory2.createLogicalNot(done)
]),
/*incrementor*/
factory2.createAssignment(nonUserCode, factory2.createTrue()),
/*statement*/
convertForOfStatementHead(node, getValue, nonUserCode)
),
/*location*/
node
),
512 /* NoTokenTrailingSourceMaps */
);
setOriginalNode(forStatement, node);
return factory2.createTryStatement(
factory2.createBlock([
factory2.restoreEnclosingLabel(
forStatement,
outermostLabeledStatement
)
]),
factory2.createCatchClause(
factory2.createVariableDeclaration(catchVariable),
setEmitFlags(
factory2.createBlock([
factory2.createExpressionStatement(
factory2.createAssignment(
errorRecord,
factory2.createObjectLiteralExpression([
factory2.createPropertyAssignment("error", catchVariable)
])
)
)
]),
1 /* SingleLine */
)
),
factory2.createBlock([
factory2.createTryStatement(
/*tryBlock*/
factory2.createBlock([
setEmitFlags(
factory2.createIfStatement(
factory2.createLogicalAnd(
factory2.createLogicalAnd(
factory2.createLogicalNot(nonUserCode),
factory2.createLogicalNot(done)
),
factory2.createAssignment(
returnMethod,
factory2.createPropertyAccessExpression(iterator, "return")
)
),
factory2.createExpressionStatement(createDownlevelAwait(callReturn))
),
1 /* SingleLine */
)
]),
/*catchClause*/
void 0,
/*finallyBlock*/
setEmitFlags(
factory2.createBlock([
setEmitFlags(
factory2.createIfStatement(
errorRecord,
factory2.createThrowStatement(
factory2.createPropertyAccessExpression(errorRecord, "error")
)
),
1 /* SingleLine */
)
]),
1 /* SingleLine */
)
)
])
);
}
function parameterVisitor(node) {
Debug.assertNode(node, isParameter);
return visitParameter(node);
}
function visitParameter(node) {
if (parametersWithPrecedingObjectRestOrSpread == null ? void 0 : parametersWithPrecedingObjectRestOrSpread.has(node)) {
return factory2.updateParameterDeclaration(
node,
/*modifiers*/
void 0,
node.dotDotDotToken,
isBindingPattern(node.name) ? factory2.getGeneratedNameForNode(node) : node.name,
/*questionToken*/
void 0,
/*type*/
void 0,
/*initializer*/
void 0
);
}
if (node.transformFlags & 65536 /* ContainsObjectRestOrSpread */) {
return factory2.updateParameterDeclaration(
node,
/*modifiers*/
void 0,
node.dotDotDotToken,
factory2.getGeneratedNameForNode(node),
/*questionToken*/
void 0,
/*type*/
void 0,
visitNode(node.initializer, visitor, isExpression)
);
}
return visitEachChild(node, visitor, context);
}
function collectParametersWithPrecedingObjectRestOrSpread(node) {
let parameters;
for (const parameter of node.parameters) {
if (parameters) {
parameters.add(parameter);
} else if (parameter.transformFlags & 65536 /* ContainsObjectRestOrSpread */) {
parameters = /* @__PURE__ */ new Set();
}
}
return parameters;
}
function visitConstructorDeclaration(node) {
const savedEnclosingFunctionFlags = enclosingFunctionFlags;
const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
enclosingFunctionFlags = getFunctionFlags(node);
parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
const updated = factory2.updateConstructorDeclaration(
node,
node.modifiers,
visitParameterList(node.parameters, parameterVisitor, context),
transformFunctionBody(node)
);
enclosingFunctionFlags = savedEnclosingFunctionFlags;
parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
return updated;
}
function visitGetAccessorDeclaration(node) {
const savedEnclosingFunctionFlags = enclosingFunctionFlags;
const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
enclosingFunctionFlags = getFunctionFlags(node);
parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
const updated = factory2.updateGetAccessorDeclaration(
node,
node.modifiers,
visitNode(node.name, visitor, isPropertyName),
visitParameterList(node.parameters, parameterVisitor, context),
/*type*/
void 0,
transformFunctionBody(node)
);
enclosingFunctionFlags = savedEnclosingFunctionFlags;
parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
return updated;
}
function visitSetAccessorDeclaration(node) {
const savedEnclosingFunctionFlags = enclosingFunctionFlags;
const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
enclosingFunctionFlags = getFunctionFlags(node);
parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
const updated = factory2.updateSetAccessorDeclaration(
node,
node.modifiers,
visitNode(node.name, visitor, isPropertyName),
visitParameterList(node.parameters, parameterVisitor, context),
transformFunctionBody(node)
);
enclosingFunctionFlags = savedEnclosingFunctionFlags;
parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
return updated;
}
function visitMethodDeclaration(node) {
const savedEnclosingFunctionFlags = enclosingFunctionFlags;
const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
enclosingFunctionFlags = getFunctionFlags(node);
parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
const updated = factory2.updateMethodDeclaration(
node,
enclosingFunctionFlags & 1 /* Generator */ ? visitNodes2(node.modifiers, visitorNoAsyncModifier, isModifierLike) : node.modifiers,
enclosingFunctionFlags & 2 /* Async */ ? void 0 : node.asteriskToken,
visitNode(node.name, visitor, isPropertyName),
visitNode(
/*node*/
void 0,
visitor,
isQuestionToken
),
/*typeParameters*/
void 0,
visitParameterList(node.parameters, parameterVisitor, context),
/*type*/
void 0,
enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody(node)
);
enclosingFunctionFlags = savedEnclosingFunctionFlags;
parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
return updated;
}
function visitFunctionDeclaration(node) {
const savedEnclosingFunctionFlags = enclosingFunctionFlags;
const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
enclosingFunctionFlags = getFunctionFlags(node);
parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
const updated = factory2.updateFunctionDeclaration(
node,
enclosingFunctionFlags & 1 /* Generator */ ? visitNodes2(node.modifiers, visitorNoAsyncModifier, isModifier) : node.modifiers,
enclosingFunctionFlags & 2 /* Async */ ? void 0 : node.asteriskToken,
node.name,
/*typeParameters*/
void 0,
visitParameterList(node.parameters, parameterVisitor, context),
/*type*/
void 0,
enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody(node)
);
enclosingFunctionFlags = savedEnclosingFunctionFlags;
parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
return updated;
}
function visitArrowFunction(node) {
const savedEnclosingFunctionFlags = enclosingFunctionFlags;
const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
enclosingFunctionFlags = getFunctionFlags(node);
parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
const updated = factory2.updateArrowFunction(
node,
node.modifiers,
/*typeParameters*/
void 0,
visitParameterList(node.parameters, parameterVisitor, context),
/*type*/
void 0,
node.equalsGreaterThanToken,
transformFunctionBody(node)
);
enclosingFunctionFlags = savedEnclosingFunctionFlags;
parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
return updated;
}
function visitFunctionExpression(node) {
const savedEnclosingFunctionFlags = enclosingFunctionFlags;
const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
enclosingFunctionFlags = getFunctionFlags(node);
parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
const updated = factory2.updateFunctionExpression(
node,
enclosingFunctionFlags & 1 /* Generator */ ? visitNodes2(node.modifiers, visitorNoAsyncModifier, isModifier) : node.modifiers,
enclosingFunctionFlags & 2 /* Async */ ? void 0 : node.asteriskToken,
node.name,
/*typeParameters*/
void 0,
visitParameterList(node.parameters, parameterVisitor, context),
/*type*/
void 0,
enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody(node)
);
enclosingFunctionFlags = savedEnclosingFunctionFlags;
parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
return updated;
}
function transformAsyncGeneratorFunctionBody(node) {
resumeLexicalEnvironment();
const statements = [];
const statementOffset = factory2.copyPrologue(
node.body.statements,
statements,
/*ensureUseStrict*/
false,
visitor
);
appendObjectRestAssignmentsIfNeeded(statements, node);
const savedCapturedSuperProperties = capturedSuperProperties;
const savedHasSuperElementAccess = hasSuperElementAccess;
capturedSuperProperties = /* @__PURE__ */ new Set();
hasSuperElementAccess = false;
const returnStatement = factory2.createReturnStatement(
emitHelpers().createAsyncGeneratorHelper(
factory2.createFunctionExpression(
/*modifiers*/
void 0,
factory2.createToken(42 /* AsteriskToken */),
node.name && factory2.getGeneratedNameForNode(node.name),
/*typeParameters*/
void 0,
/*parameters*/
[],
/*type*/
void 0,
factory2.updateBlock(
node.body,
visitLexicalEnvironment(node.body.statements, visitor, context, statementOffset)
)
),
!!(hierarchyFacts & 1 /* HasLexicalThis */)
)
);
const emitSuperHelpers = languageVersion >= 2 /* ES2015 */ && resolver.getNodeCheckFlags(node) & (256 /* MethodWithSuperPropertyAssignmentInAsync */ | 128 /* MethodWithSuperPropertyAccessInAsync */);
if (emitSuperHelpers) {
enableSubstitutionForAsyncMethodsWithSuper();
const variableStatement = createSuperAccessVariableStatement(factory2, resolver, node, capturedSuperProperties);
substitutedSuperAccessors[getNodeId(variableStatement)] = true;
insertStatementsAfterStandardPrologue(statements, [variableStatement]);
}
statements.push(returnStatement);
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
const block = factory2.updateBlock(node.body, statements);
if (emitSuperHelpers && hasSuperElementAccess) {
if (resolver.getNodeCheckFlags(node) & 256 /* MethodWithSuperPropertyAssignmentInAsync */) {
addEmitHelper(block, advancedAsyncSuperHelper);
} else if (resolver.getNodeCheckFlags(node) & 128 /* MethodWithSuperPropertyAccessInAsync */) {
addEmitHelper(block, asyncSuperHelper);
}
}
capturedSuperProperties = savedCapturedSuperProperties;
hasSuperElementAccess = savedHasSuperElementAccess;
return block;
}
function transformFunctionBody(node) {
resumeLexicalEnvironment();
let statementOffset = 0;
const statements = [];
const body = visitNode(node.body, visitor, isConciseBody) ?? factory2.createBlock([]);
if (isBlock(body)) {
statementOffset = factory2.copyPrologue(
body.statements,
statements,
/*ensureUseStrict*/
false,
visitor
);
}
addRange(statements, appendObjectRestAssignmentsIfNeeded(
/*statements*/
void 0,
node
));
const leadingStatements = endLexicalEnvironment();
if (statementOffset > 0 || some(statements) || some(leadingStatements)) {
const block = factory2.converters.convertToFunctionBlock(
body,
/*multiLine*/
true
);
insertStatementsAfterStandardPrologue(statements, leadingStatements);
addRange(statements, block.statements.slice(statementOffset));
return factory2.updateBlock(block, setTextRange(factory2.createNodeArray(statements), block.statements));
}
return body;
}
function appendObjectRestAssignmentsIfNeeded(statements, node) {
let containsPrecedingObjectRestOrSpread = false;
for (const parameter of node.parameters) {
if (containsPrecedingObjectRestOrSpread) {
if (isBindingPattern(parameter.name)) {
if (parameter.name.elements.length > 0) {
const declarations = flattenDestructuringBinding(
parameter,
visitor,
context,
0 /* All */,
factory2.getGeneratedNameForNode(parameter)
);
if (some(declarations)) {
const declarationList = factory2.createVariableDeclarationList(declarations);
const statement = factory2.createVariableStatement(
/*modifiers*/
void 0,
declarationList
);
setEmitFlags(statement, 2097152 /* CustomPrologue */);
statements = append(statements, statement);
}
} else if (parameter.initializer) {
const name = factory2.getGeneratedNameForNode(parameter);
const initializer = visitNode(parameter.initializer, visitor, isExpression);
const assignment = factory2.createAssignment(name, initializer);
const statement = factory2.createExpressionStatement(assignment);
setEmitFlags(statement, 2097152 /* CustomPrologue */);
statements = append(statements, statement);
}
} else if (parameter.initializer) {
const name = factory2.cloneNode(parameter.name);
setTextRange(name, parameter.name);
setEmitFlags(name, 96 /* NoSourceMap */);
const initializer = visitNode(parameter.initializer, visitor, isExpression);
addEmitFlags(initializer, 96 /* NoSourceMap */ | 3072 /* NoComments */);
const assignment = factory2.createAssignment(name, initializer);
setTextRange(assignment, parameter);
setEmitFlags(assignment, 3072 /* NoComments */);
const block = factory2.createBlock([factory2.createExpressionStatement(assignment)]);
setTextRange(block, parameter);
setEmitFlags(block, 1 /* SingleLine */ | 64 /* NoTrailingSourceMap */ | 768 /* NoTokenSourceMaps */ | 3072 /* NoComments */);
const typeCheck = factory2.createTypeCheck(factory2.cloneNode(parameter.name), "undefined");
const statement = factory2.createIfStatement(typeCheck, block);
startOnNewLine(statement);
setTextRange(statement, parameter);
setEmitFlags(statement, 768 /* NoTokenSourceMaps */ | 64 /* NoTrailingSourceMap */ | 2097152 /* CustomPrologue */ | 3072 /* NoComments */);
statements = append(statements, statement);
}
} else if (parameter.transformFlags & 65536 /* ContainsObjectRestOrSpread */) {
containsPrecedingObjectRestOrSpread = true;
const declarations = flattenDestructuringBinding(
parameter,
visitor,
context,
1 /* ObjectRest */,
factory2.getGeneratedNameForNode(parameter),
/*hoistTempVariables*/
false,
/*skipInitializer*/
true
);
if (some(declarations)) {
const declarationList = factory2.createVariableDeclarationList(declarations);
const statement = factory2.createVariableStatement(
/*modifiers*/
void 0,
declarationList
);
setEmitFlags(statement, 2097152 /* CustomPrologue */);
statements = append(statements, statement);
}
}
}
return statements;
}
function enableSubstitutionForAsyncMethodsWithSuper() {
if ((enabledSubstitutions & 1 /* AsyncMethodsWithSuper */) === 0) {
enabledSubstitutions |= 1 /* AsyncMethodsWithSuper */;
context.enableSubstitution(212 /* CallExpression */);
context.enableSubstitution(210 /* PropertyAccessExpression */);
context.enableSubstitution(211 /* ElementAccessExpression */);
context.enableEmitNotification(262 /* ClassDeclaration */);
context.enableEmitNotification(173 /* MethodDeclaration */);
context.enableEmitNotification(176 /* GetAccessor */);
context.enableEmitNotification(177 /* SetAccessor */);
context.enableEmitNotification(175 /* Constructor */);
context.enableEmitNotification(242 /* VariableStatement */);
}
}
function onEmitNode(hint, node, emitCallback) {
if (enabledSubstitutions & 1 /* AsyncMethodsWithSuper */ && isSuperContainer(node)) {
const superContainerFlags = resolver.getNodeCheckFlags(node) & (128 /* MethodWithSuperPropertyAccessInAsync */ | 256 /* MethodWithSuperPropertyAssignmentInAsync */);
if (superContainerFlags !== enclosingSuperContainerFlags) {
const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags;
enclosingSuperContainerFlags = superContainerFlags;
previousOnEmitNode(hint, node, emitCallback);
enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags;
return;
}
} else if (enabledSubstitutions && substitutedSuperAccessors[getNodeId(node)]) {
const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags;
enclosingSuperContainerFlags = 0;
previousOnEmitNode(hint, node, emitCallback);
enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags;
return;
}
previousOnEmitNode(hint, node, emitCallback);
}
function onSubstituteNode(hint, node) {
node = previousOnSubstituteNode(hint, node);
if (hint === 1 /* Expression */ && enclosingSuperContainerFlags) {
return substituteExpression(node);
}
return node;
}
function substituteExpression(node) {
switch (node.kind) {
case 210 /* PropertyAccessExpression */:
return substitutePropertyAccessExpression(node);
case 211 /* ElementAccessExpression */:
return substituteElementAccessExpression(node);
case 212 /* CallExpression */:
return substituteCallExpression(node);
}
return node;
}
function substitutePropertyAccessExpression(node) {
if (node.expression.kind === 108 /* SuperKeyword */) {
return setTextRange(
factory2.createPropertyAccessExpression(
factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */),
node.name
),
node
);
}
return node;
}
function substituteElementAccessExpression(node) {
if (node.expression.kind === 108 /* SuperKeyword */) {
return createSuperElementAccessInAsyncMethod(
node.argumentExpression,
node
);
}
return node;
}
function substituteCallExpression(node) {
const expression = node.expression;
if (isSuperProperty(expression)) {
const argumentExpression = isPropertyAccessExpression(expression) ? substitutePropertyAccessExpression(expression) : substituteElementAccessExpression(expression);
return factory2.createCallExpression(
factory2.createPropertyAccessExpression(argumentExpression, "call"),
/*typeArguments*/
void 0,
[
factory2.createThis(),
...node.arguments
]
);
}
return node;
}
function isSuperContainer(node) {
const kind = node.kind;
return kind === 262 /* ClassDeclaration */ || kind === 175 /* Constructor */ || kind === 173 /* MethodDeclaration */ || kind === 176 /* GetAccessor */ || kind === 177 /* SetAccessor */;
}
function createSuperElementAccessInAsyncMethod(argumentExpression, location) {
if (enclosingSuperContainerFlags & 256 /* MethodWithSuperPropertyAssignmentInAsync */) {
return setTextRange(
factory2.createPropertyAccessExpression(
factory2.createCallExpression(
factory2.createIdentifier("_superIndex"),
/*typeArguments*/
void 0,
[argumentExpression]
),
"value"
),
location
);
} else {
return setTextRange(
factory2.createCallExpression(
factory2.createIdentifier("_superIndex"),
/*typeArguments*/
void 0,
[argumentExpression]
),
location
);
}
}
}
// src/compiler/transformers/es2019.ts
function transformES2019(context) {
const factory2 = context.factory;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
if (node.isDeclarationFile) {
return node;
}
return visitEachChild(node, visitor, context);
}
function visitor(node) {
if ((node.transformFlags & 64 /* ContainsES2019 */) === 0) {
return node;
}
switch (node.kind) {
case 298 /* CatchClause */:
return visitCatchClause(node);
default:
return visitEachChild(node, visitor, context);
}
}
function visitCatchClause(node) {
if (!node.variableDeclaration) {
return factory2.updateCatchClause(
node,
factory2.createVariableDeclaration(factory2.createTempVariable(
/*recordTempVariable*/
void 0
)),
visitNode(node.block, visitor, isBlock)
);
}
return visitEachChild(node, visitor, context);
}
}
// src/compiler/transformers/es2020.ts
function transformES2020(context) {
const {
factory: factory2,
hoistVariableDeclaration
} = context;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
if (node.isDeclarationFile) {
return node;
}
return visitEachChild(node, visitor, context);
}
function visitor(node) {
if ((node.transformFlags & 32 /* ContainsES2020 */) === 0) {
return node;
}
switch (node.kind) {
case 212 /* CallExpression */: {
const updated = visitNonOptionalCallExpression(
node,
/*captureThisArg*/
false
);
Debug.assertNotNode(updated, isSyntheticReference);
return updated;
}
case 210 /* PropertyAccessExpression */:
case 211 /* ElementAccessExpression */:
if (isOptionalChain(node)) {
const updated = visitOptionalExpression(
node,
/*captureThisArg*/
false,
/*isDelete*/
false
);
Debug.assertNotNode(updated, isSyntheticReference);
return updated;
}
return visitEachChild(node, visitor, context);
case 225 /* BinaryExpression */:
if (node.operatorToken.kind === 61 /* QuestionQuestionToken */) {
return transformNullishCoalescingExpression(node);
}
return visitEachChild(node, visitor, context);
case 219 /* DeleteExpression */:
return visitDeleteExpression(node);
default:
return visitEachChild(node, visitor, context);
}
}
function flattenChain(chain) {
Debug.assertNotNode(chain, isNonNullChain);
const links = [chain];
while (!chain.questionDotToken && !isTaggedTemplateExpression(chain)) {
chain = cast(skipPartiallyEmittedExpressions(chain.expression), isOptionalChain);
Debug.assertNotNode(chain, isNonNullChain);
links.unshift(chain);
}
return { expression: chain.expression, chain: links };
}
function visitNonOptionalParenthesizedExpression(node, captureThisArg, isDelete) {
const expression = visitNonOptionalExpression(node.expression, captureThisArg, isDelete);
if (isSyntheticReference(expression)) {
return factory2.createSyntheticReferenceExpression(factory2.updateParenthesizedExpression(node, expression.expression), expression.thisArg);
}
return factory2.updateParenthesizedExpression(node, expression);
}
function visitNonOptionalPropertyOrElementAccessExpression(node, captureThisArg, isDelete) {
if (isOptionalChain(node)) {
return visitOptionalExpression(node, captureThisArg, isDelete);
}
let expression = visitNode(node.expression, visitor, isExpression);
Debug.assertNotNode(expression, isSyntheticReference);
let thisArg;
if (captureThisArg) {
if (!isSimpleCopiableExpression(expression)) {
thisArg = factory2.createTempVariable(hoistVariableDeclaration);
expression = factory2.createAssignment(thisArg, expression);
} else {
thisArg = expression;
}
}
expression = node.kind === 210 /* PropertyAccessExpression */ ? factory2.updatePropertyAccessExpression(node, expression, visitNode(node.name, visitor, isIdentifier)) : factory2.updateElementAccessExpression(node, expression, visitNode(node.argumentExpression, visitor, isExpression));
return thisArg ? factory2.createSyntheticReferenceExpression(expression, thisArg) : expression;
}
function visitNonOptionalCallExpression(node, captureThisArg) {
if (isOptionalChain(node)) {
return visitOptionalExpression(
node,
captureThisArg,
/*isDelete*/
false
);
}
if (isParenthesizedExpression(node.expression) && isOptionalChain(skipParentheses(node.expression))) {
const expression = visitNonOptionalParenthesizedExpression(
node.expression,
/*captureThisArg*/
true,
/*isDelete*/
false
);
const args = visitNodes2(node.arguments, visitor, isExpression);
if (isSyntheticReference(expression)) {
return setTextRange(factory2.createFunctionCallCall(expression.expression, expression.thisArg, args), node);
}
return factory2.updateCallExpression(
node,
expression,
/*typeArguments*/
void 0,
args
);
}
return visitEachChild(node, visitor, context);
}
function visitNonOptionalExpression(node, captureThisArg, isDelete) {
switch (node.kind) {
case 216 /* ParenthesizedExpression */:
return visitNonOptionalParenthesizedExpression(node, captureThisArg, isDelete);
case 210 /* PropertyAccessExpression */:
case 211 /* ElementAccessExpression */:
return visitNonOptionalPropertyOrElementAccessExpression(node, captureThisArg, isDelete);
case 212 /* CallExpression */:
return visitNonOptionalCallExpression(node, captureThisArg);
default:
return visitNode(node, visitor, isExpression);
}
}
function visitOptionalExpression(node, captureThisArg, isDelete) {
const { expression, chain } = flattenChain(node);
const left = visitNonOptionalExpression(
skipPartiallyEmittedExpressions(expression),
isCallChain(chain[0]),
/*isDelete*/
false
);
let leftThisArg = isSyntheticReference(left) ? left.thisArg : void 0;
let capturedLeft = isSyntheticReference(left) ? left.expression : left;
let leftExpression = factory2.restoreOuterExpressions(expression, capturedLeft, 8 /* PartiallyEmittedExpressions */);
if (!isSimpleCopiableExpression(capturedLeft)) {
capturedLeft = factory2.createTempVariable(hoistVariableDeclaration);
leftExpression = factory2.createAssignment(capturedLeft, leftExpression);
}
let rightExpression = capturedLeft;
let thisArg;
for (let i = 0; i < chain.length; i++) {
const segment = chain[i];
switch (segment.kind) {
case 210 /* PropertyAccessExpression */:
case 211 /* ElementAccessExpression */:
if (i === chain.length - 1 && captureThisArg) {
if (!isSimpleCopiableExpression(rightExpression)) {
thisArg = factory2.createTempVariable(hoistVariableDeclaration);
rightExpression = factory2.createAssignment(thisArg, rightExpression);
} else {
thisArg = rightExpression;
}
}
rightExpression = segment.kind === 210 /* PropertyAccessExpression */ ? factory2.createPropertyAccessExpression(rightExpression, visitNode(segment.name, visitor, isIdentifier)) : factory2.createElementAccessExpression(rightExpression, visitNode(segment.argumentExpression, visitor, isExpression));
break;
case 212 /* CallExpression */:
if (i === 0 && leftThisArg) {
if (!isGeneratedIdentifier(leftThisArg)) {
leftThisArg = factory2.cloneNode(leftThisArg);
addEmitFlags(leftThisArg, 3072 /* NoComments */);
}
rightExpression = factory2.createFunctionCallCall(
rightExpression,
leftThisArg.kind === 108 /* SuperKeyword */ ? factory2.createThis() : leftThisArg,
visitNodes2(segment.arguments, visitor, isExpression)
);
} else {
rightExpression = factory2.createCallExpression(
rightExpression,
/*typeArguments*/
void 0,
visitNodes2(segment.arguments, visitor, isExpression)
);
}
break;
}
setOriginalNode(rightExpression, segment);
}
const target = isDelete ? factory2.createConditionalExpression(
createNotNullCondition(
leftExpression,
capturedLeft,
/*invert*/
true
),
/*questionToken*/
void 0,
factory2.createTrue(),
/*colonToken*/
void 0,
factory2.createDeleteExpression(rightExpression)
) : factory2.createConditionalExpression(
createNotNullCondition(
leftExpression,
capturedLeft,
/*invert*/
true
),
/*questionToken*/
void 0,
factory2.createVoidZero(),
/*colonToken*/
void 0,
rightExpression
);
setTextRange(target, node);
return thisArg ? factory2.createSyntheticReferenceExpression(target, thisArg) : target;
}
function createNotNullCondition(left, right, invert) {
return factory2.createBinaryExpression(
factory2.createBinaryExpression(
left,
factory2.createToken(invert ? 37 /* EqualsEqualsEqualsToken */ : 38 /* ExclamationEqualsEqualsToken */),
factory2.createNull()
),
factory2.createToken(invert ? 57 /* BarBarToken */ : 56 /* AmpersandAmpersandToken */),
factory2.createBinaryExpression(
right,
factory2.createToken(invert ? 37 /* EqualsEqualsEqualsToken */ : 38 /* ExclamationEqualsEqualsToken */),
factory2.createVoidZero()
)
);
}
function transformNullishCoalescingExpression(node) {
let left = visitNode(node.left, visitor, isExpression);
let right = left;
if (!isSimpleCopiableExpression(left)) {
right = factory2.createTempVariable(hoistVariableDeclaration);
left = factory2.createAssignment(right, left);
}
return setTextRange(factory2.createConditionalExpression(
createNotNullCondition(left, right),
/*questionToken*/
void 0,
right,
/*colonToken*/
void 0,
visitNode(node.right, visitor, isExpression)
), node);
}
function visitDeleteExpression(node) {
return isOptionalChain(skipParentheses(node.expression)) ? setOriginalNode(visitNonOptionalExpression(
node.expression,
/*captureThisArg*/
false,
/*isDelete*/
true
), node) : factory2.updateDeleteExpression(node, visitNode(node.expression, visitor, isExpression));
}
}
// src/compiler/transformers/es2021.ts
function transformES2021(context) {
const {
hoistVariableDeclaration,
factory: factory2
} = context;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
if (node.isDeclarationFile) {
return node;
}
return visitEachChild(node, visitor, context);
}
function visitor(node) {
if ((node.transformFlags & 16 /* ContainsES2021 */) === 0) {
return node;
}
if (isLogicalOrCoalescingAssignmentExpression(node)) {
return transformLogicalAssignment(node);
}
return visitEachChild(node, visitor, context);
}
function transformLogicalAssignment(binaryExpression) {
const operator = binaryExpression.operatorToken;
const nonAssignmentOperator = getNonAssignmentOperatorForCompoundAssignment(operator.kind);
let left = skipParentheses(visitNode(binaryExpression.left, visitor, isLeftHandSideExpression));
let assignmentTarget = left;
const right = skipParentheses(visitNode(binaryExpression.right, visitor, isExpression));
if (isAccessExpression(left)) {
const propertyAccessTargetSimpleCopiable = isSimpleCopiableExpression(left.expression);
const propertyAccessTarget = propertyAccessTargetSimpleCopiable ? left.expression : factory2.createTempVariable(hoistVariableDeclaration);
const propertyAccessTargetAssignment = propertyAccessTargetSimpleCopiable ? left.expression : factory2.createAssignment(
propertyAccessTarget,
left.expression
);
if (isPropertyAccessExpression(left)) {
assignmentTarget = factory2.createPropertyAccessExpression(
propertyAccessTarget,
left.name
);
left = factory2.createPropertyAccessExpression(
propertyAccessTargetAssignment,
left.name
);
} else {
const elementAccessArgumentSimpleCopiable = isSimpleCopiableExpression(left.argumentExpression);
const elementAccessArgument = elementAccessArgumentSimpleCopiable ? left.argumentExpression : factory2.createTempVariable(hoistVariableDeclaration);
assignmentTarget = factory2.createElementAccessExpression(
propertyAccessTarget,
elementAccessArgument
);
left = factory2.createElementAccessExpression(
propertyAccessTargetAssignment,
elementAccessArgumentSimpleCopiable ? left.argumentExpression : factory2.createAssignment(
elementAccessArgument,
left.argumentExpression
)
);
}
}
return factory2.createBinaryExpression(
left,
nonAssignmentOperator,
factory2.createParenthesizedExpression(
factory2.createAssignment(
assignmentTarget,
right
)
)
);
}
}
// src/compiler/transformers/esnext.ts
function transformESNext(context) {
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
if (node.isDeclarationFile) {
return node;
}
return visitEachChild(node, visitor, context);
}
function visitor(node) {
if ((node.transformFlags & 4 /* ContainsESNext */) === 0) {
return node;
}
switch (node.kind) {
default:
return visitEachChild(node, visitor, context);
}
}
}
// src/compiler/transformers/jsx.ts
function transformJsx(context) {
const {
factory: factory2,
getEmitHelperFactory: emitHelpers
} = context;
const compilerOptions = context.getCompilerOptions();
let currentSourceFile;
let currentFileState;
return chainBundle(context, transformSourceFile);
function getCurrentFileNameExpression() {
if (currentFileState.filenameDeclaration) {
return currentFileState.filenameDeclaration.name;
}
const declaration = factory2.createVariableDeclaration(
factory2.createUniqueName("_jsxFileName", 16 /* Optimistic */ | 32 /* FileLevel */),
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createStringLiteral(currentSourceFile.fileName)
);
currentFileState.filenameDeclaration = declaration;
return currentFileState.filenameDeclaration.name;
}
function getJsxFactoryCalleePrimitive(isStaticChildren) {
return compilerOptions.jsx === 5 /* ReactJSXDev */ ? "jsxDEV" : isStaticChildren ? "jsxs" : "jsx";
}
function getJsxFactoryCallee(isStaticChildren) {
const type = getJsxFactoryCalleePrimitive(isStaticChildren);
return getImplicitImportForName(type);
}
function getImplicitJsxFragmentReference() {
return getImplicitImportForName("Fragment");
}
function getImplicitImportForName(name) {
var _a, _b;
const importSource = name === "createElement" ? currentFileState.importSpecifier : getJSXRuntimeImport(currentFileState.importSpecifier, compilerOptions);
const existing = (_b = (_a = currentFileState.utilizedImplicitRuntimeImports) == null ? void 0 : _a.get(importSource)) == null ? void 0 : _b.get(name);
if (existing) {
return existing.name;
}
if (!currentFileState.utilizedImplicitRuntimeImports) {
currentFileState.utilizedImplicitRuntimeImports = /* @__PURE__ */ new Map();
}
let specifierSourceImports = currentFileState.utilizedImplicitRuntimeImports.get(importSource);
if (!specifierSourceImports) {
specifierSourceImports = /* @__PURE__ */ new Map();
currentFileState.utilizedImplicitRuntimeImports.set(importSource, specifierSourceImports);
}
const generatedName = factory2.createUniqueName(`_${name}`, 16 /* Optimistic */ | 32 /* FileLevel */ | 64 /* AllowNameSubstitution */);
const specifier = factory2.createImportSpecifier(
/*isTypeOnly*/
false,
factory2.createIdentifier(name),
generatedName
);
setIdentifierGeneratedImportReference(generatedName, specifier);
specifierSourceImports.set(name, specifier);
return generatedName;
}
function transformSourceFile(node) {
if (node.isDeclarationFile) {
return node;
}
currentSourceFile = node;
currentFileState = {};
currentFileState.importSpecifier = getJSXImplicitImportBase(compilerOptions, node);
let visited = visitEachChild(node, visitor, context);
addEmitHelpers(visited, context.readEmitHelpers());
let statements = visited.statements;
if (currentFileState.filenameDeclaration) {
statements = insertStatementAfterCustomPrologue(statements.slice(), factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList([currentFileState.filenameDeclaration], 2 /* Const */)
));
}
if (currentFileState.utilizedImplicitRuntimeImports) {
for (const [importSource, importSpecifiersMap] of arrayFrom(currentFileState.utilizedImplicitRuntimeImports.entries())) {
if (isExternalModule(node)) {
const importStatement = factory2.createImportDeclaration(
/*modifiers*/
void 0,
factory2.createImportClause(
/*isTypeOnly*/
false,
/*name*/
void 0,
factory2.createNamedImports(arrayFrom(importSpecifiersMap.values()))
),
factory2.createStringLiteral(importSource),
/*assertClause*/
void 0
);
setParentRecursive(
importStatement,
/*incremental*/
false
);
statements = insertStatementAfterCustomPrologue(statements.slice(), importStatement);
} else if (isExternalOrCommonJsModule(node)) {
const requireStatement = factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
factory2.createObjectBindingPattern(arrayFrom(importSpecifiersMap.values(), (s) => factory2.createBindingElement(
/*dotDotDotToken*/
void 0,
s.propertyName,
s.name
))),
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createCallExpression(
factory2.createIdentifier("require"),
/*typeArguments*/
void 0,
[factory2.createStringLiteral(importSource)]
)
)
], 2 /* Const */)
);
setParentRecursive(
requireStatement,
/*incremental*/
false
);
statements = insertStatementAfterCustomPrologue(statements.slice(), requireStatement);
} else {
}
}
}
if (statements !== visited.statements) {
visited = factory2.updateSourceFile(visited, statements);
}
currentFileState = void 0;
return visited;
}
function visitor(node) {
if (node.transformFlags & 2 /* ContainsJsx */) {
return visitorWorker(node);
} else {
return node;
}
}
function visitorWorker(node) {
switch (node.kind) {
case 283 /* JsxElement */:
return visitJsxElement(
node,
/*isChild*/
false
);
case 284 /* JsxSelfClosingElement */:
return visitJsxSelfClosingElement(
node,
/*isChild*/
false
);
case 287 /* JsxFragment */:
return visitJsxFragment(
node,
/*isChild*/
false
);
case 293 /* JsxExpression */:
return visitJsxExpression(node);
default:
return visitEachChild(node, visitor, context);
}
}
function transformJsxChildToExpression(node) {
switch (node.kind) {
case 12 /* JsxText */:
return visitJsxText(node);
case 293 /* JsxExpression */:
return visitJsxExpression(node);
case 283 /* JsxElement */:
return visitJsxElement(
node,
/*isChild*/
true
);
case 284 /* JsxSelfClosingElement */:
return visitJsxSelfClosingElement(
node,
/*isChild*/
true
);
case 287 /* JsxFragment */:
return visitJsxFragment(
node,
/*isChild*/
true
);
default:
return Debug.failBadSyntaxKind(node);
}
}
function hasProto(obj) {
return obj.properties.some((p) => isPropertyAssignment(p) && (isIdentifier(p.name) && idText(p.name) === "__proto__" || isStringLiteral(p.name) && p.name.text === "__proto__"));
}
function hasKeyAfterPropsSpread(node) {
let spread = false;
for (const elem of node.attributes.properties) {
if (isJsxSpreadAttribute(elem) && (!isObjectLiteralExpression(elem.expression) || elem.expression.properties.some(isSpreadAssignment))) {
spread = true;
} else if (spread && isJsxAttribute(elem) && isIdentifier(elem.name) && elem.name.escapedText === "key") {
return true;
}
}
return false;
}
function shouldUseCreateElement(node) {
return currentFileState.importSpecifier === void 0 || hasKeyAfterPropsSpread(node);
}
function visitJsxElement(node, isChild) {
const tagTransform = shouldUseCreateElement(node.openingElement) ? visitJsxOpeningLikeElementCreateElement : visitJsxOpeningLikeElementJSX;
return tagTransform(
node.openingElement,
node.children,
isChild,
/*location*/
node
);
}
function visitJsxSelfClosingElement(node, isChild) {
const tagTransform = shouldUseCreateElement(node) ? visitJsxOpeningLikeElementCreateElement : visitJsxOpeningLikeElementJSX;
return tagTransform(
node,
/*children*/
void 0,
isChild,
/*location*/
node
);
}
function visitJsxFragment(node, isChild) {
const tagTransform = currentFileState.importSpecifier === void 0 ? visitJsxOpeningFragmentCreateElement : visitJsxOpeningFragmentJSX;
return tagTransform(
node.openingFragment,
node.children,
isChild,
/*location*/
node
);
}
function convertJsxChildrenToChildrenPropObject(children) {
const prop = convertJsxChildrenToChildrenPropAssignment(children);
return prop && factory2.createObjectLiteralExpression([prop]);
}
function convertJsxChildrenToChildrenPropAssignment(children) {
const nonWhitespaceChildren = getSemanticJsxChildren(children);
if (length(nonWhitespaceChildren) === 1 && !nonWhitespaceChildren[0].dotDotDotToken) {
const result2 = transformJsxChildToExpression(nonWhitespaceChildren[0]);
return result2 && factory2.createPropertyAssignment("children", result2);
}
const result = mapDefined(children, transformJsxChildToExpression);
return length(result) ? factory2.createPropertyAssignment("children", factory2.createArrayLiteralExpression(result)) : void 0;
}
function visitJsxOpeningLikeElementJSX(node, children, isChild, location) {
const tagName = getTagName(node);
const childrenProp = children && children.length ? convertJsxChildrenToChildrenPropAssignment(children) : void 0;
const keyAttr = find(node.attributes.properties, (p) => !!p.name && isIdentifier(p.name) && p.name.escapedText === "key");
const attrs = keyAttr ? filter(node.attributes.properties, (p) => p !== keyAttr) : node.attributes.properties;
const objectProperties = length(attrs) ? transformJsxAttributesToObjectProps(attrs, childrenProp) : factory2.createObjectLiteralExpression(childrenProp ? [childrenProp] : emptyArray);
return visitJsxOpeningLikeElementOrFragmentJSX(
tagName,
objectProperties,
keyAttr,
children || emptyArray,
isChild,
location
);
}
function visitJsxOpeningLikeElementOrFragmentJSX(tagName, objectProperties, keyAttr, children, isChild, location) {
var _a;
const nonWhitespaceChildren = getSemanticJsxChildren(children);
const isStaticChildren = length(nonWhitespaceChildren) > 1 || !!((_a = nonWhitespaceChildren[0]) == null ? void 0 : _a.dotDotDotToken);
const args = [tagName, objectProperties];
if (keyAttr) {
args.push(transformJsxAttributeInitializer(keyAttr.initializer));
}
if (compilerOptions.jsx === 5 /* ReactJSXDev */) {
const originalFile = getOriginalNode(currentSourceFile);
if (originalFile && isSourceFile(originalFile)) {
if (keyAttr === void 0) {
args.push(factory2.createVoidZero());
}
args.push(isStaticChildren ? factory2.createTrue() : factory2.createFalse());
const lineCol = getLineAndCharacterOfPosition(originalFile, location.pos);
args.push(factory2.createObjectLiteralExpression([
factory2.createPropertyAssignment("fileName", getCurrentFileNameExpression()),
factory2.createPropertyAssignment("lineNumber", factory2.createNumericLiteral(lineCol.line + 1)),
factory2.createPropertyAssignment("columnNumber", factory2.createNumericLiteral(lineCol.character + 1))
]));
args.push(factory2.createThis());
}
}
const element = setTextRange(
factory2.createCallExpression(
getJsxFactoryCallee(isStaticChildren),
/*typeArguments*/
void 0,
args
),
location
);
if (isChild) {
startOnNewLine(element);
}
return element;
}
function visitJsxOpeningLikeElementCreateElement(node, children, isChild, location) {
const tagName = getTagName(node);
const attrs = node.attributes.properties;
const objectProperties = length(attrs) ? transformJsxAttributesToObjectProps(attrs) : factory2.createNull();
const callee = currentFileState.importSpecifier === void 0 ? createJsxFactoryExpression(
factory2,
context.getEmitResolver().getJsxFactoryEntity(currentSourceFile),
compilerOptions.reactNamespace,
// TODO: GH#18217
node
) : getImplicitImportForName("createElement");
const element = createExpressionForJsxElement(
factory2,
callee,
tagName,
objectProperties,
mapDefined(children, transformJsxChildToExpression),
location
);
if (isChild) {
startOnNewLine(element);
}
return element;
}
function visitJsxOpeningFragmentJSX(_node, children, isChild, location) {
let childrenProps;
if (children && children.length) {
const result = convertJsxChildrenToChildrenPropObject(children);
if (result) {
childrenProps = result;
}
}
return visitJsxOpeningLikeElementOrFragmentJSX(
getImplicitJsxFragmentReference(),
childrenProps || factory2.createObjectLiteralExpression([]),
/*keyAttr*/
void 0,
children,
isChild,
location
);
}
function visitJsxOpeningFragmentCreateElement(node, children, isChild, location) {
const element = createExpressionForJsxFragment(
factory2,
context.getEmitResolver().getJsxFactoryEntity(currentSourceFile),
context.getEmitResolver().getJsxFragmentFactoryEntity(currentSourceFile),
compilerOptions.reactNamespace,
// TODO: GH#18217
mapDefined(children, transformJsxChildToExpression),
node,
location
);
if (isChild) {
startOnNewLine(element);
}
return element;
}
function transformJsxSpreadAttributeToProps(node) {
if (isObjectLiteralExpression(node.expression) && !hasProto(node.expression)) {
return node.expression.properties;
}
return factory2.createSpreadAssignment(Debug.checkDefined(visitNode(node.expression, visitor, isExpression)));
}
function transformJsxAttributesToObjectProps(attrs, children) {
const target = getEmitScriptTarget(compilerOptions);
return target && target >= 5 /* ES2018 */ ? factory2.createObjectLiteralExpression(transformJsxAttributesToProps(attrs, children)) : transformJsxAttributesToExpression(attrs, children);
}
function transformJsxAttributesToProps(attrs, children) {
const props = flatten(spanMap(attrs, isJsxSpreadAttribute, (attrs2, isSpread) => flatten(map(attrs2, (attr) => isSpread ? transformJsxSpreadAttributeToProps(attr) : transformJsxAttributeToObjectLiteralElement(attr)))));
if (children) {
props.push(children);
}
return props;
}
function transformJsxAttributesToExpression(attrs, children) {
const expressions = [];
let properties = [];
for (const attr of attrs) {
if (isJsxSpreadAttribute(attr)) {
if (isObjectLiteralExpression(attr.expression) && !hasProto(attr.expression)) {
for (const prop of attr.expression.properties) {
if (isSpreadAssignment(prop)) {
finishObjectLiteralIfNeeded();
expressions.push(prop.expression);
continue;
}
properties.push(prop);
}
continue;
}
finishObjectLiteralIfNeeded();
expressions.push(Debug.checkDefined(visitNode(attr.expression, visitor, isExpression)));
continue;
}
properties.push(transformJsxAttributeToObjectLiteralElement(attr));
}
if (children) {
properties.push(children);
}
finishObjectLiteralIfNeeded();
if (expressions.length && !isObjectLiteralExpression(expressions[0])) {
expressions.unshift(factory2.createObjectLiteralExpression());
}
return singleOrUndefined(expressions) || emitHelpers().createAssignHelper(expressions);
function finishObjectLiteralIfNeeded() {
if (properties.length) {
expressions.push(factory2.createObjectLiteralExpression(properties));
properties = [];
}
}
}
function transformJsxAttributeToObjectLiteralElement(node) {
const name = getAttributeName(node);
const expression = transformJsxAttributeInitializer(node.initializer);
return factory2.createPropertyAssignment(name, expression);
}
function transformJsxAttributeInitializer(node) {
if (node === void 0) {
return factory2.createTrue();
}
if (node.kind === 11 /* StringLiteral */) {
const singleQuote = node.singleQuote !== void 0 ? node.singleQuote : !isStringDoubleQuoted(node, currentSourceFile);
const literal = factory2.createStringLiteral(tryDecodeEntities(node.text) || node.text, singleQuote);
return setTextRange(literal, node);
}
if (node.kind === 293 /* JsxExpression */) {
if (node.expression === void 0) {
return factory2.createTrue();
}
return Debug.checkDefined(visitNode(node.expression, visitor, isExpression));
}
if (isJsxElement(node)) {
return visitJsxElement(
node,
/*isChild*/
false
);
}
if (isJsxSelfClosingElement(node)) {
return visitJsxSelfClosingElement(
node,
/*isChild*/
false
);
}
if (isJsxFragment(node)) {
return visitJsxFragment(
node,
/*isChild*/
false
);
}
return Debug.failBadSyntaxKind(node);
}
function visitJsxText(node) {
const fixed = fixupWhitespaceAndDecodeEntities(node.text);
return fixed === void 0 ? void 0 : factory2.createStringLiteral(fixed);
}
function fixupWhitespaceAndDecodeEntities(text) {
let acc;
let firstNonWhitespace = 0;
let lastNonWhitespace = -1;
for (let i = 0; i < text.length; i++) {
const c = text.charCodeAt(i);
if (isLineBreak(c)) {
if (firstNonWhitespace !== -1 && lastNonWhitespace !== -1) {
acc = addLineOfJsxText(acc, text.substr(firstNonWhitespace, lastNonWhitespace - firstNonWhitespace + 1));
}
firstNonWhitespace = -1;
} else if (!isWhiteSpaceSingleLine(c)) {
lastNonWhitespace = i;
if (firstNonWhitespace === -1) {
firstNonWhitespace = i;
}
}
}
return firstNonWhitespace !== -1 ? addLineOfJsxText(acc, text.substr(firstNonWhitespace)) : acc;
}
function addLineOfJsxText(acc, trimmedLine) {
const decoded = decodeEntities(trimmedLine);
return acc === void 0 ? decoded : acc + " " + decoded;
}
function decodeEntities(text) {
return text.replace(/&((#((\d+)|x([\da-fA-F]+)))|(\w+));/g, (match, _all, _number, _digits, decimal, hex, word) => {
if (decimal) {
return utf16EncodeAsString(parseInt(decimal, 10));
} else if (hex) {
return utf16EncodeAsString(parseInt(hex, 16));
} else {
const ch = entities.get(word);
return ch ? utf16EncodeAsString(ch) : match;
}
});
}
function tryDecodeEntities(text) {
const decoded = decodeEntities(text);
return decoded === text ? void 0 : decoded;
}
function getTagName(node) {
if (node.kind === 283 /* JsxElement */) {
return getTagName(node.openingElement);
} else {
const tagName = node.tagName;
if (isIdentifier(tagName) && isIntrinsicJsxName(tagName.escapedText)) {
return factory2.createStringLiteral(idText(tagName));
} else if (isJsxNamespacedName(tagName)) {
return factory2.createStringLiteral(idText(tagName.namespace) + ":" + idText(tagName.name));
} else {
return createExpressionFromEntityName(factory2, tagName);
}
}
}
function getAttributeName(node) {
const name = node.name;
if (isIdentifier(name)) {
const text = idText(name);
return /^[A-Za-z_]\w*$/.test(text) ? name : factory2.createStringLiteral(text);
}
return factory2.createStringLiteral(idText(name.namespace) + ":" + idText(name.name));
}
function visitJsxExpression(node) {
const expression = visitNode(node.expression, visitor, isExpression);
return node.dotDotDotToken ? factory2.createSpreadElement(expression) : expression;
}
}
var entities = new Map(Object.entries({
quot: 34,
amp: 38,
apos: 39,
lt: 60,
gt: 62,
nbsp: 160,
iexcl: 161,
cent: 162,
pound: 163,
curren: 164,
yen: 165,
brvbar: 166,
sect: 167,
uml: 168,
copy: 169,
ordf: 170,
laquo: 171,
not: 172,
shy: 173,
reg: 174,
macr: 175,
deg: 176,
plusmn: 177,
sup2: 178,
sup3: 179,
acute: 180,
micro: 181,
para: 182,
middot: 183,
cedil: 184,
sup1: 185,
ordm: 186,
raquo: 187,
frac14: 188,
frac12: 189,
frac34: 190,
iquest: 191,
Agrave: 192,
Aacute: 193,
Acirc: 194,
Atilde: 195,
Auml: 196,
Aring: 197,
AElig: 198,
Ccedil: 199,
Egrave: 200,
Eacute: 201,
Ecirc: 202,
Euml: 203,
Igrave: 204,
Iacute: 205,
Icirc: 206,
Iuml: 207,
ETH: 208,
Ntilde: 209,
Ograve: 210,
Oacute: 211,
Ocirc: 212,
Otilde: 213,
Ouml: 214,
times: 215,
Oslash: 216,
Ugrave: 217,
Uacute: 218,
Ucirc: 219,
Uuml: 220,
Yacute: 221,
THORN: 222,
szlig: 223,
agrave: 224,
aacute: 225,
acirc: 226,
atilde: 227,
auml: 228,
aring: 229,
aelig: 230,
ccedil: 231,
egrave: 232,
eacute: 233,
ecirc: 234,
euml: 235,
igrave: 236,
iacute: 237,
icirc: 238,
iuml: 239,
eth: 240,
ntilde: 241,
ograve: 242,
oacute: 243,
ocirc: 244,
otilde: 245,
ouml: 246,
divide: 247,
oslash: 248,
ugrave: 249,
uacute: 250,
ucirc: 251,
uuml: 252,
yacute: 253,
thorn: 254,
yuml: 255,
OElig: 338,
oelig: 339,
Scaron: 352,
scaron: 353,
Yuml: 376,
fnof: 402,
circ: 710,
tilde: 732,
Alpha: 913,
Beta: 914,
Gamma: 915,
Delta: 916,
Epsilon: 917,
Zeta: 918,
Eta: 919,
Theta: 920,
Iota: 921,
Kappa: 922,
Lambda: 923,
Mu: 924,
Nu: 925,
Xi: 926,
Omicron: 927,
Pi: 928,
Rho: 929,
Sigma: 931,
Tau: 932,
Upsilon: 933,
Phi: 934,
Chi: 935,
Psi: 936,
Omega: 937,
alpha: 945,
beta: 946,
gamma: 947,
delta: 948,
epsilon: 949,
zeta: 950,
eta: 951,
theta: 952,
iota: 953,
kappa: 954,
lambda: 955,
mu: 956,
nu: 957,
xi: 958,
omicron: 959,
pi: 960,
rho: 961,
sigmaf: 962,
sigma: 963,
tau: 964,
upsilon: 965,
phi: 966,
chi: 967,
psi: 968,
omega: 969,
thetasym: 977,
upsih: 978,
piv: 982,
ensp: 8194,
emsp: 8195,
thinsp: 8201,
zwnj: 8204,
zwj: 8205,
lrm: 8206,
rlm: 8207,
ndash: 8211,
mdash: 8212,
lsquo: 8216,
rsquo: 8217,
sbquo: 8218,
ldquo: 8220,
rdquo: 8221,
bdquo: 8222,
dagger: 8224,
Dagger: 8225,
bull: 8226,
hellip: 8230,
permil: 8240,
prime: 8242,
Prime: 8243,
lsaquo: 8249,
rsaquo: 8250,
oline: 8254,
frasl: 8260,
euro: 8364,
image: 8465,
weierp: 8472,
real: 8476,
trade: 8482,
alefsym: 8501,
larr: 8592,
uarr: 8593,
rarr: 8594,
darr: 8595,
harr: 8596,
crarr: 8629,
lArr: 8656,
uArr: 8657,
rArr: 8658,
dArr: 8659,
hArr: 8660,
forall: 8704,
part: 8706,
exist: 8707,
empty: 8709,
nabla: 8711,
isin: 8712,
notin: 8713,
ni: 8715,
prod: 8719,
sum: 8721,
minus: 8722,
lowast: 8727,
radic: 8730,
prop: 8733,
infin: 8734,
ang: 8736,
and: 8743,
or: 8744,
cap: 8745,
cup: 8746,
int: 8747,
there4: 8756,
sim: 8764,
cong: 8773,
asymp: 8776,
ne: 8800,
equiv: 8801,
le: 8804,
ge: 8805,
sub: 8834,
sup: 8835,
nsub: 8836,
sube: 8838,
supe: 8839,
oplus: 8853,
otimes: 8855,
perp: 8869,
sdot: 8901,
lceil: 8968,
rceil: 8969,
lfloor: 8970,
rfloor: 8971,
lang: 9001,
rang: 9002,
loz: 9674,
spades: 9824,
clubs: 9827,
hearts: 9829,
diams: 9830
}));
// src/compiler/transformers/es2016.ts
function transformES2016(context) {
const {
factory: factory2,
hoistVariableDeclaration
} = context;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
if (node.isDeclarationFile) {
return node;
}
return visitEachChild(node, visitor, context);
}
function visitor(node) {
if ((node.transformFlags & 512 /* ContainsES2016 */) === 0) {
return node;
}
switch (node.kind) {
case 225 /* BinaryExpression */:
return visitBinaryExpression(node);
default:
return visitEachChild(node, visitor, context);
}
}
function visitBinaryExpression(node) {
switch (node.operatorToken.kind) {
case 68 /* AsteriskAsteriskEqualsToken */:
return visitExponentiationAssignmentExpression(node);
case 43 /* AsteriskAsteriskToken */:
return visitExponentiationExpression(node);
default:
return visitEachChild(node, visitor, context);
}
}
function visitExponentiationAssignmentExpression(node) {
let target;
let value;
const left = visitNode(node.left, visitor, isExpression);
const right = visitNode(node.right, visitor, isExpression);
if (isElementAccessExpression(left)) {
const expressionTemp = factory2.createTempVariable(hoistVariableDeclaration);
const argumentExpressionTemp = factory2.createTempVariable(hoistVariableDeclaration);
target = setTextRange(
factory2.createElementAccessExpression(
setTextRange(factory2.createAssignment(expressionTemp, left.expression), left.expression),
setTextRange(factory2.createAssignment(argumentExpressionTemp, left.argumentExpression), left.argumentExpression)
),
left
);
value = setTextRange(
factory2.createElementAccessExpression(
expressionTemp,
argumentExpressionTemp
),
left
);
} else if (isPropertyAccessExpression(left)) {
const expressionTemp = factory2.createTempVariable(hoistVariableDeclaration);
target = setTextRange(
factory2.createPropertyAccessExpression(
setTextRange(factory2.createAssignment(expressionTemp, left.expression), left.expression),
left.name
),
left
);
value = setTextRange(
factory2.createPropertyAccessExpression(
expressionTemp,
left.name
),
left
);
} else {
target = left;
value = left;
}
return setTextRange(
factory2.createAssignment(
target,
setTextRange(factory2.createGlobalMethodCall("Math", "pow", [value, right]), node)
),
node
);
}
function visitExponentiationExpression(node) {
const left = visitNode(node.left, visitor, isExpression);
const right = visitNode(node.right, visitor, isExpression);
return setTextRange(factory2.createGlobalMethodCall("Math", "pow", [left, right]), node);
}
}
// src/compiler/transformers/es2015.ts
function createSpreadSegment(kind, expression) {
return { kind, expression };
}
function transformES2015(context) {
const {
factory: factory2,
getEmitHelperFactory: emitHelpers,
startLexicalEnvironment,
resumeLexicalEnvironment,
endLexicalEnvironment,
hoistVariableDeclaration
} = context;
const compilerOptions = context.getCompilerOptions();
const resolver = context.getEmitResolver();
const previousOnSubstituteNode = context.onSubstituteNode;
const previousOnEmitNode = context.onEmitNode;
context.onEmitNode = onEmitNode;
context.onSubstituteNode = onSubstituteNode;
let currentSourceFile;
let currentText;
let hierarchyFacts;
let taggedTemplateStringDeclarations;
function recordTaggedTemplateString(temp) {
taggedTemplateStringDeclarations = append(
taggedTemplateStringDeclarations,
factory2.createVariableDeclaration(temp)
);
}
let convertedLoopState;
let enabledSubstitutions;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
if (node.isDeclarationFile) {
return node;
}
currentSourceFile = node;
currentText = node.text;
const visited = visitSourceFile(node);
addEmitHelpers(visited, context.readEmitHelpers());
currentSourceFile = void 0;
currentText = void 0;
taggedTemplateStringDeclarations = void 0;
hierarchyFacts = 0 /* None */;
return visited;
}
function enterSubtree(excludeFacts, includeFacts) {
const ancestorFacts = hierarchyFacts;
hierarchyFacts = (hierarchyFacts & ~excludeFacts | includeFacts) & 32767 /* AncestorFactsMask */;
return ancestorFacts;
}
function exitSubtree(ancestorFacts, excludeFacts, includeFacts) {
hierarchyFacts = (hierarchyFacts & ~excludeFacts | includeFacts) & -32768 /* SubtreeFactsMask */ | ancestorFacts;
}
function isReturnVoidStatementInConstructorWithCapturedSuper(node) {
return (hierarchyFacts & 8192 /* ConstructorWithCapturedSuper */) !== 0 && node.kind === 252 /* ReturnStatement */ && !node.expression;
}
function isOrMayContainReturnCompletion(node) {
return node.transformFlags & 4194304 /* ContainsHoistedDeclarationOrCompletion */ && (isReturnStatement(node) || isIfStatement(node) || isWithStatement(node) || isSwitchStatement(node) || isCaseBlock(node) || isCaseClause(node) || isDefaultClause(node) || isTryStatement(node) || isCatchClause(node) || isLabeledStatement(node) || isIterationStatement(
node,
/*lookInLabeledStatements*/
false
) || isBlock(node));
}
function shouldVisitNode(node) {
return (node.transformFlags & 1024 /* ContainsES2015 */) !== 0 || convertedLoopState !== void 0 || hierarchyFacts & 8192 /* ConstructorWithCapturedSuper */ && isOrMayContainReturnCompletion(node) || isIterationStatement(
node,
/*lookInLabeledStatements*/
false
) && shouldConvertIterationStatement(node) || (getInternalEmitFlags(node) & 1 /* TypeScriptClassWrapper */) !== 0;
}
function visitor(node) {
return shouldVisitNode(node) ? visitorWorker(
node,
/*expressionResultIsUnused*/
false
) : node;
}
function visitorWithUnusedExpressionResult(node) {
return shouldVisitNode(node) ? visitorWorker(
node,
/*expressionResultIsUnused*/
true
) : node;
}
function classWrapperStatementVisitor(node) {
if (shouldVisitNode(node)) {
const original = getOriginalNode(node);
if (isPropertyDeclaration(original) && hasStaticModifier(original)) {
const ancestorFacts = enterSubtree(
32670 /* StaticInitializerExcludes */,
16449 /* StaticInitializerIncludes */
);
const result = visitorWorker(
node,
/*expressionResultIsUnused*/
false
);
exitSubtree(ancestorFacts, 98304 /* FunctionSubtreeExcludes */, 0 /* None */);
return result;
}
return visitorWorker(
node,
/*expressionResultIsUnused*/
false
);
}
return node;
}
function callExpressionVisitor(node) {
if (node.kind === 108 /* SuperKeyword */) {
return visitSuperKeyword(
/*isExpressionOfCall*/
true
);
}
return visitor(node);
}
function visitorWorker(node, expressionResultIsUnused2) {
switch (node.kind) {
case 126 /* StaticKeyword */:
return void 0;
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
case 230 /* ClassExpression */:
return visitClassExpression(node);
case 168 /* Parameter */:
return visitParameter(node);
case 261 /* FunctionDeclaration */:
return visitFunctionDeclaration(node);
case 218 /* ArrowFunction */:
return visitArrowFunction(node);
case 217 /* FunctionExpression */:
return visitFunctionExpression(node);
case 259 /* VariableDeclaration */:
return visitVariableDeclaration(node);
case 80 /* Identifier */:
return visitIdentifier(node);
case 260 /* VariableDeclarationList */:
return visitVariableDeclarationList(node);
case 254 /* SwitchStatement */:
return visitSwitchStatement(node);
case 268 /* CaseBlock */:
return visitCaseBlock(node);
case 240 /* Block */:
return visitBlock(
node,
/*isFunctionBody*/
false
);
case 251 /* BreakStatement */:
case 250 /* ContinueStatement */:
return visitBreakOrContinueStatement(node);
case 255 /* LabeledStatement */:
return visitLabeledStatement(node);
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
return visitDoOrWhileStatement(
node,
/*outermostLabeledStatement*/
void 0
);
case 247 /* ForStatement */:
return visitForStatement(
node,
/*outermostLabeledStatement*/
void 0
);
case 248 /* ForInStatement */:
return visitForInStatement(
node,
/*outermostLabeledStatement*/
void 0
);
case 249 /* ForOfStatement */:
return visitForOfStatement(
node,
/*outermostLabeledStatement*/
void 0
);
case 243 /* ExpressionStatement */:
return visitExpressionStatement(node);
case 209 /* ObjectLiteralExpression */:
return visitObjectLiteralExpression(node);
case 298 /* CatchClause */:
return visitCatchClause(node);
case 303 /* ShorthandPropertyAssignment */:
return visitShorthandPropertyAssignment(node);
case 166 /* ComputedPropertyName */:
return visitComputedPropertyName(node);
case 208 /* ArrayLiteralExpression */:
return visitArrayLiteralExpression(node);
case 212 /* CallExpression */:
return visitCallExpression(node);
case 213 /* NewExpression */:
return visitNewExpression(node);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(node, expressionResultIsUnused2);
case 225 /* BinaryExpression */:
return visitBinaryExpression(node, expressionResultIsUnused2);
case 360 /* CommaListExpression */:
return visitCommaListExpression(node, expressionResultIsUnused2);
case 15 /* NoSubstitutionTemplateLiteral */:
case 16 /* TemplateHead */:
case 17 /* TemplateMiddle */:
case 18 /* TemplateTail */:
return visitTemplateLiteral(node);
case 11 /* StringLiteral */:
return visitStringLiteral(node);
case 9 /* NumericLiteral */:
return visitNumericLiteral(node);
case 214 /* TaggedTemplateExpression */:
return visitTaggedTemplateExpression(node);
case 227 /* TemplateExpression */:
return visitTemplateExpression(node);
case 228 /* YieldExpression */:
return visitYieldExpression(node);
case 229 /* SpreadElement */:
return visitSpreadElement(node);
case 108 /* SuperKeyword */:
return visitSuperKeyword(
/*isExpressionOfCall*/
false
);
case 110 /* ThisKeyword */:
return visitThisKeyword(node);
case 235 /* MetaProperty */:
return visitMetaProperty(node);
case 173 /* MethodDeclaration */:
return visitMethodDeclaration(node);
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return visitAccessorDeclaration(node);
case 242 /* VariableStatement */:
return visitVariableStatement(node);
case 252 /* ReturnStatement */:
return visitReturnStatement(node);
case 221 /* VoidExpression */:
return visitVoidExpression(node);
default:
return visitEachChild(node, visitor, context);
}
}
function visitSourceFile(node) {
const ancestorFacts = enterSubtree(8064 /* SourceFileExcludes */, 64 /* SourceFileIncludes */);
const prologue = [];
const statements = [];
startLexicalEnvironment();
const statementOffset = factory2.copyPrologue(
node.statements,
prologue,
/*ensureUseStrict*/
false,
visitor
);
addRange(statements, visitNodes2(node.statements, visitor, isStatement, statementOffset));
if (taggedTemplateStringDeclarations) {
statements.push(
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(taggedTemplateStringDeclarations)
)
);
}
factory2.mergeLexicalEnvironment(prologue, endLexicalEnvironment());
insertCaptureThisForNodeIfNeeded(prologue, node);
exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
return factory2.updateSourceFile(
node,
setTextRange(factory2.createNodeArray(concatenate(prologue, statements)), node.statements)
);
}
function visitSwitchStatement(node) {
if (convertedLoopState !== void 0) {
const savedAllowedNonLabeledJumps = convertedLoopState.allowedNonLabeledJumps;
convertedLoopState.allowedNonLabeledJumps |= 2 /* Break */;
const result = visitEachChild(node, visitor, context);
convertedLoopState.allowedNonLabeledJumps = savedAllowedNonLabeledJumps;
return result;
}
return visitEachChild(node, visitor, context);
}
function visitCaseBlock(node) {
const ancestorFacts = enterSubtree(7104 /* BlockScopeExcludes */, 0 /* BlockScopeIncludes */);
const updated = visitEachChild(node, visitor, context);
exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
return updated;
}
function returnCapturedThis(node) {
return setOriginalNode(factory2.createReturnStatement(factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */)), node);
}
function visitReturnStatement(node) {
if (convertedLoopState) {
convertedLoopState.nonLocalJumps |= 8 /* Return */;
if (isReturnVoidStatementInConstructorWithCapturedSuper(node)) {
node = returnCapturedThis(node);
}
return factory2.createReturnStatement(
factory2.createObjectLiteralExpression(
[
factory2.createPropertyAssignment(
factory2.createIdentifier("value"),
node.expression ? Debug.checkDefined(visitNode(node.expression, visitor, isExpression)) : factory2.createVoidZero()
)
]
)
);
} else if (isReturnVoidStatementInConstructorWithCapturedSuper(node)) {
return returnCapturedThis(node);
}
return visitEachChild(node, visitor, context);
}
function visitThisKeyword(node) {
if (hierarchyFacts & 2 /* ArrowFunction */ && !(hierarchyFacts & 16384 /* StaticInitializer */)) {
hierarchyFacts |= 65536 /* CapturedLexicalThis */;
}
if (convertedLoopState) {
if (hierarchyFacts & 2 /* ArrowFunction */) {
convertedLoopState.containsLexicalThis = true;
return node;
}
return convertedLoopState.thisName || (convertedLoopState.thisName = factory2.createUniqueName("this"));
}
return node;
}
function visitVoidExpression(node) {
return visitEachChild(node, visitorWithUnusedExpressionResult, context);
}
function visitIdentifier(node) {
if (convertedLoopState) {
if (resolver.isArgumentsLocalBinding(node)) {
return convertedLoopState.argumentsName || (convertedLoopState.argumentsName = factory2.createUniqueName("arguments"));
}
}
if (node.flags & 128 /* IdentifierHasExtendedUnicodeEscape */) {
return setOriginalNode(setTextRange(
factory2.createIdentifier(unescapeLeadingUnderscores(node.escapedText)),
node
), node);
}
return node;
}
function visitBreakOrContinueStatement(node) {
if (convertedLoopState) {
const jump = node.kind === 251 /* BreakStatement */ ? 2 /* Break */ : 4 /* Continue */;
const canUseBreakOrContinue = node.label && convertedLoopState.labels && convertedLoopState.labels.get(idText(node.label)) || !node.label && convertedLoopState.allowedNonLabeledJumps & jump;
if (!canUseBreakOrContinue) {
let labelMarker;
const label = node.label;
if (!label) {
if (node.kind === 251 /* BreakStatement */) {
convertedLoopState.nonLocalJumps |= 2 /* Break */;
labelMarker = "break";
} else {
convertedLoopState.nonLocalJumps |= 4 /* Continue */;
labelMarker = "continue";
}
} else {
if (node.kind === 251 /* BreakStatement */) {
labelMarker = `break-${label.escapedText}`;
setLabeledJump(
convertedLoopState,
/*isBreak*/
true,
idText(label),
labelMarker
);
} else {
labelMarker = `continue-${label.escapedText}`;
setLabeledJump(
convertedLoopState,
/*isBreak*/
false,
idText(label),
labelMarker
);
}
}
let returnExpression = factory2.createStringLiteral(labelMarker);
if (convertedLoopState.loopOutParameters.length) {
const outParams = convertedLoopState.loopOutParameters;
let expr;
for (let i = 0; i < outParams.length; i++) {
const copyExpr = copyOutParameter(outParams[i], 1 /* ToOutParameter */);
if (i === 0) {
expr = copyExpr;
} else {
expr = factory2.createBinaryExpression(expr, 28 /* CommaToken */, copyExpr);
}
}
returnExpression = factory2.createBinaryExpression(expr, 28 /* CommaToken */, returnExpression);
}
return factory2.createReturnStatement(returnExpression);
}
}
return visitEachChild(node, visitor, context);
}
function visitClassDeclaration(node) {
const variable = factory2.createVariableDeclaration(
factory2.getLocalName(
node,
/*allowComments*/
true
),
/*exclamationToken*/
void 0,
/*type*/
void 0,
transformClassLikeDeclarationToExpression(node)
);
setOriginalNode(variable, node);
const statements = [];
const statement = factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList([variable])
);
setOriginalNode(statement, node);
setTextRange(statement, node);
startOnNewLine(statement);
statements.push(statement);
if (hasSyntacticModifier(node, 1 /* Export */)) {
const exportStatement = hasSyntacticModifier(node, 1024 /* Default */) ? factory2.createExportDefault(factory2.getLocalName(node)) : factory2.createExternalModuleExport(factory2.getLocalName(node));
setOriginalNode(exportStatement, statement);
statements.push(exportStatement);
}
return singleOrMany(statements);
}
function visitClassExpression(node) {
return transformClassLikeDeclarationToExpression(node);
}
function transformClassLikeDeclarationToExpression(node) {
if (node.name) {
enableSubstitutionsForBlockScopedBindings();
}
const extendsClauseElement = getClassExtendsHeritageElement(node);
const classFunction = factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
extendsClauseElement ? [factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */)
)] : [],
/*type*/
void 0,
transformClassBody(node, extendsClauseElement)
);
setEmitFlags(classFunction, getEmitFlags(node) & 131072 /* Indented */ | 1048576 /* ReuseTempVariableScope */);
const inner = factory2.createPartiallyEmittedExpression(classFunction);
setTextRangeEnd(inner, node.end);
setEmitFlags(inner, 3072 /* NoComments */);
const outer = factory2.createPartiallyEmittedExpression(inner);
setTextRangeEnd(outer, skipTrivia(currentText, node.pos));
setEmitFlags(outer, 3072 /* NoComments */);
const result = factory2.createParenthesizedExpression(
factory2.createCallExpression(
outer,
/*typeArguments*/
void 0,
extendsClauseElement ? [Debug.checkDefined(visitNode(extendsClauseElement.expression, visitor, isExpression))] : []
)
);
addSyntheticLeadingComment(result, 3 /* MultiLineCommentTrivia */, "* @class ");
return result;
}
function transformClassBody(node, extendsClauseElement) {
const statements = [];
const name = factory2.getInternalName(node);
const constructorLikeName = isIdentifierANonContextualKeyword(name) ? factory2.getGeneratedNameForNode(name) : name;
startLexicalEnvironment();
addExtendsHelperIfNeeded(statements, node, extendsClauseElement);
addConstructor(statements, node, constructorLikeName, extendsClauseElement);
addClassMembers(statements, node);
const closingBraceLocation = createTokenRange(skipTrivia(currentText, node.members.end), 20 /* CloseBraceToken */);
const outer = factory2.createPartiallyEmittedExpression(constructorLikeName);
setTextRangeEnd(outer, closingBraceLocation.end);
setEmitFlags(outer, 3072 /* NoComments */);
const statement = factory2.createReturnStatement(outer);
setTextRangePos(statement, closingBraceLocation.pos);
setEmitFlags(statement, 3072 /* NoComments */ | 768 /* NoTokenSourceMaps */);
statements.push(statement);
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
const block = factory2.createBlock(
setTextRange(
factory2.createNodeArray(statements),
/*location*/
node.members
),
/*multiLine*/
true
);
setEmitFlags(block, 3072 /* NoComments */);
return block;
}
function addExtendsHelperIfNeeded(statements, node, extendsClauseElement) {
if (extendsClauseElement) {
statements.push(
setTextRange(
factory2.createExpressionStatement(
emitHelpers().createExtendsHelper(factory2.getInternalName(node))
),
/*location*/
extendsClauseElement
)
);
}
}
function addConstructor(statements, node, name, extendsClauseElement) {
const savedConvertedLoopState = convertedLoopState;
convertedLoopState = void 0;
const ancestorFacts = enterSubtree(32662 /* ConstructorExcludes */, 73 /* ConstructorIncludes */);
const constructor = getFirstConstructorWithBody(node);
const hasSynthesizedSuper = hasSynthesizedDefaultSuperCall(constructor, extendsClauseElement !== void 0);
const constructorFunction = factory2.createFunctionDeclaration(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
name,
/*typeParameters*/
void 0,
transformConstructorParameters(constructor, hasSynthesizedSuper),
/*type*/
void 0,
transformConstructorBody(constructor, node, extendsClauseElement, hasSynthesizedSuper)
);
setTextRange(constructorFunction, constructor || node);
if (extendsClauseElement) {
setEmitFlags(constructorFunction, 16 /* CapturesThis */);
}
statements.push(constructorFunction);
exitSubtree(ancestorFacts, 98304 /* FunctionSubtreeExcludes */, 0 /* None */);
convertedLoopState = savedConvertedLoopState;
}
function transformConstructorParameters(constructor, hasSynthesizedSuper) {
return visitParameterList(constructor && !hasSynthesizedSuper ? constructor.parameters : void 0, visitor, context) || [];
}
function createDefaultConstructorBody(node, isDerivedClass) {
const statements = [];
resumeLexicalEnvironment();
factory2.mergeLexicalEnvironment(statements, endLexicalEnvironment());
if (isDerivedClass) {
statements.push(factory2.createReturnStatement(createDefaultSuperCallOrThis()));
}
const statementsArray = factory2.createNodeArray(statements);
setTextRange(statementsArray, node.members);
const block = factory2.createBlock(
statementsArray,
/*multiLine*/
true
);
setTextRange(block, node);
setEmitFlags(block, 3072 /* NoComments */);
return block;
}
function transformConstructorBody(constructor, node, extendsClauseElement, hasSynthesizedSuper) {
const isDerivedClass = !!extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== 106 /* NullKeyword */;
if (!constructor)
return createDefaultConstructorBody(node, isDerivedClass);
const prologue = [];
const statements = [];
resumeLexicalEnvironment();
const existingPrologue = takeWhile(constructor.body.statements, isPrologueDirective);
const { superCall, superStatementIndex } = findSuperCallAndStatementIndex(constructor.body.statements, existingPrologue);
const postSuperStatementsStart = superStatementIndex === -1 ? existingPrologue.length : superStatementIndex + 1;
let statementOffset = postSuperStatementsStart;
if (!hasSynthesizedSuper)
statementOffset = factory2.copyStandardPrologue(
constructor.body.statements,
prologue,
statementOffset,
/*ensureUseStrict*/
false
);
if (!hasSynthesizedSuper)
statementOffset = factory2.copyCustomPrologue(
constructor.body.statements,
statements,
statementOffset,
visitor,
/*filter*/
void 0
);
let superCallExpression;
if (hasSynthesizedSuper) {
superCallExpression = createDefaultSuperCallOrThis();
} else if (superCall) {
superCallExpression = visitSuperCallInBody(superCall);
}
if (superCallExpression) {
hierarchyFacts |= 8192 /* ConstructorWithCapturedSuper */;
}
addDefaultValueAssignmentsIfNeeded2(prologue, constructor);
addRestParameterIfNeeded(prologue, constructor, hasSynthesizedSuper);
addRange(statements, visitNodes2(
constructor.body.statements,
visitor,
isStatement,
/*start*/
statementOffset
));
factory2.mergeLexicalEnvironment(prologue, endLexicalEnvironment());
insertCaptureNewTargetIfNeeded(
prologue,
constructor,
/*copyOnWrite*/
false
);
if (isDerivedClass || superCallExpression) {
if (superCallExpression && postSuperStatementsStart === constructor.body.statements.length && !(constructor.body.transformFlags & 16384 /* ContainsLexicalThis */)) {
const superCall2 = cast(cast(superCallExpression, isBinaryExpression).left, isCallExpression);
const returnStatement = factory2.createReturnStatement(superCallExpression);
setCommentRange(returnStatement, getCommentRange(superCall2));
setEmitFlags(superCall2, 3072 /* NoComments */);
statements.push(returnStatement);
} else {
if (superStatementIndex <= existingPrologue.length) {
insertCaptureThisForNode(statements, constructor, superCallExpression || createActualThis());
} else {
insertCaptureThisForNode(prologue, constructor, createActualThis());
if (superCallExpression) {
insertSuperThisCaptureThisForNode(statements, superCallExpression);
}
}
if (!isSufficientlyCoveredByReturnStatements(constructor.body)) {
statements.push(factory2.createReturnStatement(factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */)));
}
}
} else {
insertCaptureThisForNodeIfNeeded(prologue, constructor);
}
const body = factory2.createBlock(
setTextRange(
factory2.createNodeArray(
[
...existingPrologue,
...prologue,
...superStatementIndex <= existingPrologue.length ? emptyArray : visitNodes2(constructor.body.statements, visitor, isStatement, existingPrologue.length, superStatementIndex - existingPrologue.length),
...statements
]
),
/*location*/
constructor.body.statements
),
/*multiLine*/
true
);
setTextRange(body, constructor.body);
return body;
}
function findSuperCallAndStatementIndex(originalBodyStatements, existingPrologue) {
for (let i = existingPrologue.length; i < originalBodyStatements.length; i += 1) {
const superCall = getSuperCallFromStatement(originalBodyStatements[i]);
if (superCall) {
return {
superCall,
superStatementIndex: i
};
}
}
return {
superStatementIndex: -1
};
}
function isSufficientlyCoveredByReturnStatements(statement) {
if (statement.kind === 252 /* ReturnStatement */) {
return true;
} else if (statement.kind === 244 /* IfStatement */) {
const ifStatement = statement;
if (ifStatement.elseStatement) {
return isSufficientlyCoveredByReturnStatements(ifStatement.thenStatement) && isSufficientlyCoveredByReturnStatements(ifStatement.elseStatement);
}
} else if (statement.kind === 240 /* Block */) {
const lastStatement = lastOrUndefined(statement.statements);
if (lastStatement && isSufficientlyCoveredByReturnStatements(lastStatement)) {
return true;
}
}
return false;
}
function createActualThis() {
return setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */);
}
function createDefaultSuperCallOrThis() {
return factory2.createLogicalOr(
factory2.createLogicalAnd(
factory2.createStrictInequality(
factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */),
factory2.createNull()
),
factory2.createFunctionApplyCall(
factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */),
createActualThis(),
factory2.createIdentifier("arguments")
)
),
createActualThis()
);
}
function visitParameter(node) {
if (node.dotDotDotToken) {
return void 0;
} else if (isBindingPattern(node.name)) {
return setOriginalNode(
setTextRange(
factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
factory2.getGeneratedNameForNode(node),
/*questionToken*/
void 0,
/*type*/
void 0,
/*initializer*/
void 0
),
/*location*/
node
),
/*original*/
node
);
} else if (node.initializer) {
return setOriginalNode(
setTextRange(
factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
node.name,
/*questionToken*/
void 0,
/*type*/
void 0,
/*initializer*/
void 0
),
/*location*/
node
),
/*original*/
node
);
} else {
return node;
}
}
function hasDefaultValueOrBindingPattern(node) {
return node.initializer !== void 0 || isBindingPattern(node.name);
}
function addDefaultValueAssignmentsIfNeeded2(statements, node) {
if (!some(node.parameters, hasDefaultValueOrBindingPattern)) {
return false;
}
let added = false;
for (const parameter of node.parameters) {
const { name, initializer, dotDotDotToken } = parameter;
if (dotDotDotToken) {
continue;
}
if (isBindingPattern(name)) {
added = insertDefaultValueAssignmentForBindingPattern(statements, parameter, name, initializer) || added;
} else if (initializer) {
insertDefaultValueAssignmentForInitializer(statements, parameter, name, initializer);
added = true;
}
}
return added;
}
function insertDefaultValueAssignmentForBindingPattern(statements, parameter, name, initializer) {
if (name.elements.length > 0) {
insertStatementAfterCustomPrologue(
statements,
setEmitFlags(
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(
flattenDestructuringBinding(
parameter,
visitor,
context,
0 /* All */,
factory2.getGeneratedNameForNode(parameter)
)
)
),
2097152 /* CustomPrologue */
)
);
return true;
} else if (initializer) {
insertStatementAfterCustomPrologue(
statements,
setEmitFlags(
factory2.createExpressionStatement(
factory2.createAssignment(
factory2.getGeneratedNameForNode(parameter),
Debug.checkDefined(visitNode(initializer, visitor, isExpression))
)
),
2097152 /* CustomPrologue */
)
);
return true;
}
return false;
}
function insertDefaultValueAssignmentForInitializer(statements, parameter, name, initializer) {
initializer = Debug.checkDefined(visitNode(initializer, visitor, isExpression));
const statement = factory2.createIfStatement(
factory2.createTypeCheck(factory2.cloneNode(name), "undefined"),
setEmitFlags(
setTextRange(
factory2.createBlock([
factory2.createExpressionStatement(
setEmitFlags(
setTextRange(
factory2.createAssignment(
// TODO(rbuckton): Does this need to be parented?
setEmitFlags(setParent(setTextRange(factory2.cloneNode(name), name), name.parent), 96 /* NoSourceMap */),
setEmitFlags(initializer, 96 /* NoSourceMap */ | getEmitFlags(initializer) | 3072 /* NoComments */)
),
parameter
),
3072 /* NoComments */
)
)
]),
parameter
),
1 /* SingleLine */ | 64 /* NoTrailingSourceMap */ | 768 /* NoTokenSourceMaps */ | 3072 /* NoComments */
)
);
startOnNewLine(statement);
setTextRange(statement, parameter);
setEmitFlags(statement, 768 /* NoTokenSourceMaps */ | 64 /* NoTrailingSourceMap */ | 2097152 /* CustomPrologue */ | 3072 /* NoComments */);
insertStatementAfterCustomPrologue(statements, statement);
}
function shouldAddRestParameter(node, inConstructorWithSynthesizedSuper) {
return !!(node && node.dotDotDotToken && !inConstructorWithSynthesizedSuper);
}
function addRestParameterIfNeeded(statements, node, inConstructorWithSynthesizedSuper) {
const prologueStatements = [];
const parameter = lastOrUndefined(node.parameters);
if (!shouldAddRestParameter(parameter, inConstructorWithSynthesizedSuper)) {
return false;
}
const declarationName = parameter.name.kind === 80 /* Identifier */ ? setParent(setTextRange(factory2.cloneNode(parameter.name), parameter.name), parameter.name.parent) : factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
setEmitFlags(declarationName, 96 /* NoSourceMap */);
const expressionName = parameter.name.kind === 80 /* Identifier */ ? factory2.cloneNode(parameter.name) : declarationName;
const restIndex = node.parameters.length - 1;
const temp = factory2.createLoopVariable();
prologueStatements.push(
setEmitFlags(
setTextRange(
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
declarationName,
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createArrayLiteralExpression([])
)
])
),
/*location*/
parameter
),
2097152 /* CustomPrologue */
)
);
const forStatement = factory2.createForStatement(
setTextRange(
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
temp,
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createNumericLiteral(restIndex)
)
]),
parameter
),
setTextRange(
factory2.createLessThan(
temp,
factory2.createPropertyAccessExpression(factory2.createIdentifier("arguments"), "length")
),
parameter
),
setTextRange(factory2.createPostfixIncrement(temp), parameter),
factory2.createBlock([
startOnNewLine(
setTextRange(
factory2.createExpressionStatement(
factory2.createAssignment(
factory2.createElementAccessExpression(
expressionName,
restIndex === 0 ? temp : factory2.createSubtract(temp, factory2.createNumericLiteral(restIndex))
),
factory2.createElementAccessExpression(factory2.createIdentifier("arguments"), temp)
)
),
/*location*/
parameter
)
)
])
);
setEmitFlags(forStatement, 2097152 /* CustomPrologue */);
startOnNewLine(forStatement);
prologueStatements.push(forStatement);
if (parameter.name.kind !== 80 /* Identifier */) {
prologueStatements.push(
setEmitFlags(
setTextRange(
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(
flattenDestructuringBinding(parameter, visitor, context, 0 /* All */, expressionName)
)
),
parameter
),
2097152 /* CustomPrologue */
)
);
}
insertStatementsAfterCustomPrologue(statements, prologueStatements);
return true;
}
function insertCaptureThisForNodeIfNeeded(statements, node) {
if (hierarchyFacts & 65536 /* CapturedLexicalThis */ && node.kind !== 218 /* ArrowFunction */) {
insertCaptureThisForNode(statements, node, factory2.createThis());
return true;
}
return false;
}
function insertSuperThisCaptureThisForNode(statements, superExpression) {
enableSubstitutionsForCapturedThis();
const assignSuperExpression = factory2.createExpressionStatement(
factory2.createBinaryExpression(
factory2.createThis(),
64 /* EqualsToken */,
superExpression
)
);
insertStatementAfterCustomPrologue(statements, assignSuperExpression);
setCommentRange(assignSuperExpression, getOriginalNode(superExpression).parent);
}
function insertCaptureThisForNode(statements, node, initializer) {
enableSubstitutionsForCapturedThis();
const captureThisStatement = factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */),
/*exclamationToken*/
void 0,
/*type*/
void 0,
initializer
)
])
);
setEmitFlags(captureThisStatement, 3072 /* NoComments */ | 2097152 /* CustomPrologue */);
setSourceMapRange(captureThisStatement, node);
insertStatementAfterCustomPrologue(statements, captureThisStatement);
}
function insertCaptureNewTargetIfNeeded(statements, node, copyOnWrite) {
if (hierarchyFacts & 32768 /* NewTarget */) {
let newTarget;
switch (node.kind) {
case 218 /* ArrowFunction */:
return statements;
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
newTarget = factory2.createVoidZero();
break;
case 175 /* Constructor */:
newTarget = factory2.createPropertyAccessExpression(
setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */),
"constructor"
);
break;
case 261 /* FunctionDeclaration */:
case 217 /* FunctionExpression */:
newTarget = factory2.createConditionalExpression(
factory2.createLogicalAnd(
setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */),
factory2.createBinaryExpression(
setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */),
104 /* InstanceOfKeyword */,
factory2.getLocalName(node)
)
),
/*questionToken*/
void 0,
factory2.createPropertyAccessExpression(
setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */),
"constructor"
),
/*colonToken*/
void 0,
factory2.createVoidZero()
);
break;
default:
return Debug.failBadSyntaxKind(node);
}
const captureNewTargetStatement = factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
factory2.createUniqueName("_newTarget", 16 /* Optimistic */ | 32 /* FileLevel */),
/*exclamationToken*/
void 0,
/*type*/
void 0,
newTarget
)
])
);
setEmitFlags(captureNewTargetStatement, 3072 /* NoComments */ | 2097152 /* CustomPrologue */);
if (copyOnWrite) {
statements = statements.slice();
}
insertStatementAfterCustomPrologue(statements, captureNewTargetStatement);
}
return statements;
}
function addClassMembers(statements, node) {
for (const member of node.members) {
switch (member.kind) {
case 239 /* SemicolonClassElement */:
statements.push(transformSemicolonClassElementToStatement(member));
break;
case 173 /* MethodDeclaration */:
statements.push(transformClassMethodDeclarationToStatement(getClassMemberPrefix(node, member), member, node));
break;
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
const accessors = getAllAccessorDeclarations(node.members, member);
if (member === accessors.firstAccessor) {
statements.push(transformAccessorsToStatement(getClassMemberPrefix(node, member), accessors, node));
}
break;
case 175 /* Constructor */:
case 174 /* ClassStaticBlockDeclaration */:
break;
default:
Debug.failBadSyntaxKind(member, currentSourceFile && currentSourceFile.fileName);
break;
}
}
}
function transformSemicolonClassElementToStatement(member) {
return setTextRange(factory2.createEmptyStatement(), member);
}
function transformClassMethodDeclarationToStatement(receiver, member, container) {
const commentRange = getCommentRange(member);
const sourceMapRange = getSourceMapRange(member);
const memberFunction = transformFunctionLikeToExpression(
member,
/*location*/
member,
/*name*/
void 0,
container
);
const propertyName = visitNode(member.name, visitor, isPropertyName);
Debug.assert(propertyName);
let e;
if (!isPrivateIdentifier(propertyName) && getUseDefineForClassFields(context.getCompilerOptions())) {
const name = isComputedPropertyName(propertyName) ? propertyName.expression : isIdentifier(propertyName) ? factory2.createStringLiteral(unescapeLeadingUnderscores(propertyName.escapedText)) : propertyName;
e = factory2.createObjectDefinePropertyCall(receiver, name, factory2.createPropertyDescriptor({ value: memberFunction, enumerable: false, writable: true, configurable: true }));
} else {
const memberName = createMemberAccessForPropertyName(
factory2,
receiver,
propertyName,
/*location*/
member.name
);
e = factory2.createAssignment(memberName, memberFunction);
}
setEmitFlags(memberFunction, 3072 /* NoComments */);
setSourceMapRange(memberFunction, sourceMapRange);
const statement = setTextRange(
factory2.createExpressionStatement(e),
/*location*/
member
);
setOriginalNode(statement, member);
setCommentRange(statement, commentRange);
setEmitFlags(statement, 96 /* NoSourceMap */);
return statement;
}
function transformAccessorsToStatement(receiver, accessors, container) {
const statement = factory2.createExpressionStatement(transformAccessorsToExpression(
receiver,
accessors,
container,
/*startsOnNewLine*/
false
));
setEmitFlags(statement, 3072 /* NoComments */);
setSourceMapRange(statement, getSourceMapRange(accessors.firstAccessor));
return statement;
}
function transformAccessorsToExpression(receiver, { firstAccessor, getAccessor, setAccessor }, container, startsOnNewLine) {
const target = setParent(setTextRange(factory2.cloneNode(receiver), receiver), receiver.parent);
setEmitFlags(target, 3072 /* NoComments */ | 64 /* NoTrailingSourceMap */);
setSourceMapRange(target, firstAccessor.name);
const visitedAccessorName = visitNode(firstAccessor.name, visitor, isPropertyName);
Debug.assert(visitedAccessorName);
if (isPrivateIdentifier(visitedAccessorName)) {
return Debug.failBadSyntaxKind(visitedAccessorName, "Encountered unhandled private identifier while transforming ES2015.");
}
const propertyName = createExpressionForPropertyName(factory2, visitedAccessorName);
setEmitFlags(propertyName, 3072 /* NoComments */ | 32 /* NoLeadingSourceMap */);
setSourceMapRange(propertyName, firstAccessor.name);
const properties = [];
if (getAccessor) {
const getterFunction = transformFunctionLikeToExpression(
getAccessor,
/*location*/
void 0,
/*name*/
void 0,
container
);
setSourceMapRange(getterFunction, getSourceMapRange(getAccessor));
setEmitFlags(getterFunction, 1024 /* NoLeadingComments */);
const getter = factory2.createPropertyAssignment("get", getterFunction);
setCommentRange(getter, getCommentRange(getAccessor));
properties.push(getter);
}
if (setAccessor) {
const setterFunction = transformFunctionLikeToExpression(
setAccessor,
/*location*/
void 0,
/*name*/
void 0,
container
);
setSourceMapRange(setterFunction, getSourceMapRange(setAccessor));
setEmitFlags(setterFunction, 1024 /* NoLeadingComments */);
const setter = factory2.createPropertyAssignment("set", setterFunction);
setCommentRange(setter, getCommentRange(setAccessor));
properties.push(setter);
}
properties.push(
factory2.createPropertyAssignment("enumerable", getAccessor || setAccessor ? factory2.createFalse() : factory2.createTrue()),
factory2.createPropertyAssignment("configurable", factory2.createTrue())
);
const call = factory2.createCallExpression(
factory2.createPropertyAccessExpression(factory2.createIdentifier("Object"), "defineProperty"),
/*typeArguments*/
void 0,
[
target,
propertyName,
factory2.createObjectLiteralExpression(
properties,
/*multiLine*/
true
)
]
);
if (startsOnNewLine) {
startOnNewLine(call);
}
return call;
}
function visitArrowFunction(node) {
if (node.transformFlags & 16384 /* ContainsLexicalThis */ && !(hierarchyFacts & 16384 /* StaticInitializer */)) {
hierarchyFacts |= 65536 /* CapturedLexicalThis */;
}
const savedConvertedLoopState = convertedLoopState;
convertedLoopState = void 0;
const ancestorFacts = enterSubtree(15232 /* ArrowFunctionExcludes */, 66 /* ArrowFunctionIncludes */);
const func = factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
transformFunctionBody(node)
);
setTextRange(func, node);
setOriginalNode(func, node);
setEmitFlags(func, 16 /* CapturesThis */);
exitSubtree(ancestorFacts, 0 /* ArrowFunctionSubtreeExcludes */, 0 /* None */);
convertedLoopState = savedConvertedLoopState;
return func;
}
function visitFunctionExpression(node) {
const ancestorFacts = getEmitFlags(node) & 524288 /* AsyncFunctionBody */ ? enterSubtree(32662 /* AsyncFunctionBodyExcludes */, 69 /* AsyncFunctionBodyIncludes */) : enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */);
const savedConvertedLoopState = convertedLoopState;
convertedLoopState = void 0;
const parameters = visitParameterList(node.parameters, visitor, context);
const body = transformFunctionBody(node);
const name = hierarchyFacts & 32768 /* NewTarget */ ? factory2.getLocalName(node) : node.name;
exitSubtree(ancestorFacts, 98304 /* FunctionSubtreeExcludes */, 0 /* None */);
convertedLoopState = savedConvertedLoopState;
return factory2.updateFunctionExpression(
node,
/*modifiers*/
void 0,
node.asteriskToken,
name,
/*typeParameters*/
void 0,
parameters,
/*type*/
void 0,
body
);
}
function visitFunctionDeclaration(node) {
const savedConvertedLoopState = convertedLoopState;
convertedLoopState = void 0;
const ancestorFacts = enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */);
const parameters = visitParameterList(node.parameters, visitor, context);
const body = transformFunctionBody(node);
const name = hierarchyFacts & 32768 /* NewTarget */ ? factory2.getLocalName(node) : node.name;
exitSubtree(ancestorFacts, 98304 /* FunctionSubtreeExcludes */, 0 /* None */);
convertedLoopState = savedConvertedLoopState;
return factory2.updateFunctionDeclaration(
node,
visitNodes2(node.modifiers, visitor, isModifier),
node.asteriskToken,
name,
/*typeParameters*/
void 0,
parameters,
/*type*/
void 0,
body
);
}
function transformFunctionLikeToExpression(node, location, name, container) {
const savedConvertedLoopState = convertedLoopState;
convertedLoopState = void 0;
const ancestorFacts = container && isClassLike(container) && !isStatic(node) ? enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */ | 8 /* NonStaticClassElement */) : enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */);
const parameters = visitParameterList(node.parameters, visitor, context);
const body = transformFunctionBody(node);
if (hierarchyFacts & 32768 /* NewTarget */ && !name && (node.kind === 261 /* FunctionDeclaration */ || node.kind === 217 /* FunctionExpression */)) {
name = factory2.getGeneratedNameForNode(node);
}
exitSubtree(ancestorFacts, 98304 /* FunctionSubtreeExcludes */, 0 /* None */);
convertedLoopState = savedConvertedLoopState;
return setOriginalNode(
setTextRange(
factory2.createFunctionExpression(
/*modifiers*/
void 0,
node.asteriskToken,
name,
/*typeParameters*/
void 0,
parameters,
/*type*/
void 0,
body
),
location
),
/*original*/
node
);
}
function transformFunctionBody(node) {
let multiLine = false;
let singleLine = false;
let statementsLocation;
let closeBraceLocation;
const prologue = [];
const statements = [];
const body = node.body;
let statementOffset;
resumeLexicalEnvironment();
if (isBlock(body)) {
statementOffset = factory2.copyStandardPrologue(
body.statements,
prologue,
0,
/*ensureUseStrict*/
false
);
statementOffset = factory2.copyCustomPrologue(body.statements, statements, statementOffset, visitor, isHoistedFunction);
statementOffset = factory2.copyCustomPrologue(body.statements, statements, statementOffset, visitor, isHoistedVariableStatement);
}
multiLine = addDefaultValueAssignmentsIfNeeded2(statements, node) || multiLine;
multiLine = addRestParameterIfNeeded(
statements,
node,
/*inConstructorWithSynthesizedSuper*/
false
) || multiLine;
if (isBlock(body)) {
statementOffset = factory2.copyCustomPrologue(body.statements, statements, statementOffset, visitor);
statementsLocation = body.statements;
addRange(statements, visitNodes2(body.statements, visitor, isStatement, statementOffset));
if (!multiLine && body.multiLine) {
multiLine = true;
}
} else {
Debug.assert(node.kind === 218 /* ArrowFunction */);
statementsLocation = moveRangeEnd(body, -1);
const equalsGreaterThanToken = node.equalsGreaterThanToken;
if (!nodeIsSynthesized(equalsGreaterThanToken) && !nodeIsSynthesized(body)) {
if (rangeEndIsOnSameLineAsRangeStart(equalsGreaterThanToken, body, currentSourceFile)) {
singleLine = true;
} else {
multiLine = true;
}
}
const expression = visitNode(body, visitor, isExpression);
const returnStatement = factory2.createReturnStatement(expression);
setTextRange(returnStatement, body);
moveSyntheticComments(returnStatement, body);
setEmitFlags(returnStatement, 768 /* NoTokenSourceMaps */ | 64 /* NoTrailingSourceMap */ | 2048 /* NoTrailingComments */);
statements.push(returnStatement);
closeBraceLocation = body;
}
factory2.mergeLexicalEnvironment(prologue, endLexicalEnvironment());
insertCaptureNewTargetIfNeeded(
prologue,
node,
/*copyOnWrite*/
false
);
insertCaptureThisForNodeIfNeeded(prologue, node);
if (some(prologue)) {
multiLine = true;
}
statements.unshift(...prologue);
if (isBlock(body) && arrayIsEqualTo(statements, body.statements)) {
return body;
}
const block = factory2.createBlock(setTextRange(factory2.createNodeArray(statements), statementsLocation), multiLine);
setTextRange(block, node.body);
if (!multiLine && singleLine) {
setEmitFlags(block, 1 /* SingleLine */);
}
if (closeBraceLocation) {
setTokenSourceMapRange(block, 20 /* CloseBraceToken */, closeBraceLocation);
}
setOriginalNode(block, node.body);
return block;
}
function visitBlock(node, isFunctionBody) {
if (isFunctionBody) {
return visitEachChild(node, visitor, context);
}
const ancestorFacts = hierarchyFacts & 256 /* IterationStatement */ ? enterSubtree(7104 /* IterationStatementBlockExcludes */, 512 /* IterationStatementBlockIncludes */) : enterSubtree(6976 /* BlockExcludes */, 128 /* BlockIncludes */);
const updated = visitEachChild(node, visitor, context);
exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
return updated;
}
function visitExpressionStatement(node) {
return visitEachChild(node, visitorWithUnusedExpressionResult, context);
}
function visitParenthesizedExpression(node, expressionResultIsUnused2) {
return visitEachChild(node, expressionResultIsUnused2 ? visitorWithUnusedExpressionResult : visitor, context);
}
function visitBinaryExpression(node, expressionResultIsUnused2) {
if (isDestructuringAssignment(node)) {
return flattenDestructuringAssignment(
node,
visitor,
context,
0 /* All */,
!expressionResultIsUnused2
);
}
if (node.operatorToken.kind === 28 /* CommaToken */) {
return factory2.updateBinaryExpression(
node,
Debug.checkDefined(visitNode(node.left, visitorWithUnusedExpressionResult, isExpression)),
node.operatorToken,
Debug.checkDefined(visitNode(node.right, expressionResultIsUnused2 ? visitorWithUnusedExpressionResult : visitor, isExpression))
);
}
return visitEachChild(node, visitor, context);
}
function visitCommaListExpression(node, expressionResultIsUnused2) {
if (expressionResultIsUnused2) {
return visitEachChild(node, visitorWithUnusedExpressionResult, context);
}
let result;
for (let i = 0; i < node.elements.length; i++) {
const element = node.elements[i];
const visited = visitNode(element, i < node.elements.length - 1 ? visitorWithUnusedExpressionResult : visitor, isExpression);
if (result || visited !== element) {
result || (result = node.elements.slice(0, i));
Debug.assert(visited);
result.push(visited);
}
}
const elements = result ? setTextRange(factory2.createNodeArray(result), node.elements) : node.elements;
return factory2.updateCommaListExpression(node, elements);
}
function isVariableStatementOfTypeScriptClassWrapper(node) {
return node.declarationList.declarations.length === 1 && !!node.declarationList.declarations[0].initializer && !!(getInternalEmitFlags(node.declarationList.declarations[0].initializer) & 1 /* TypeScriptClassWrapper */);
}
function visitVariableStatement(node) {
const ancestorFacts = enterSubtree(0 /* None */, hasSyntacticModifier(node, 1 /* Export */) ? 32 /* ExportedVariableStatement */ : 0 /* None */);
let updated;
if (convertedLoopState && (node.declarationList.flags & 3 /* BlockScoped */) === 0 && !isVariableStatementOfTypeScriptClassWrapper(node)) {
let assignments;
for (const decl of node.declarationList.declarations) {
hoistVariableDeclarationDeclaredInConvertedLoop(convertedLoopState, decl);
if (decl.initializer) {
let assignment;
if (isBindingPattern(decl.name)) {
assignment = flattenDestructuringAssignment(
decl,
visitor,
context,
0 /* All */
);
} else {
assignment = factory2.createBinaryExpression(decl.name, 64 /* EqualsToken */, Debug.checkDefined(visitNode(decl.initializer, visitor, isExpression)));
setTextRange(assignment, decl);
}
assignments = append(assignments, assignment);
}
}
if (assignments) {
updated = setTextRange(factory2.createExpressionStatement(factory2.inlineExpressions(assignments)), node);
} else {
updated = void 0;
}
} else {
updated = visitEachChild(node, visitor, context);
}
exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
return updated;
}
function visitVariableDeclarationList(node) {
if (node.flags & 3 /* BlockScoped */ || node.transformFlags & 524288 /* ContainsBindingPattern */) {
if (node.flags & 3 /* BlockScoped */) {
enableSubstitutionsForBlockScopedBindings();
}
const declarations = visitNodes2(node.declarations, node.flags & 1 /* Let */ ? visitVariableDeclarationInLetDeclarationList : visitVariableDeclaration, isVariableDeclaration);
const declarationList = factory2.createVariableDeclarationList(declarations);
setOriginalNode(declarationList, node);
setTextRange(declarationList, node);
setCommentRange(declarationList, node);
if (node.transformFlags & 524288 /* ContainsBindingPattern */ && (isBindingPattern(node.declarations[0].name) || isBindingPattern(last(node.declarations).name))) {
setSourceMapRange(declarationList, getRangeUnion(declarations));
}
return declarationList;
}
return visitEachChild(node, visitor, context);
}
function getRangeUnion(declarations) {
let pos = -1, end = -1;
for (const node of declarations) {
pos = pos === -1 ? node.pos : node.pos === -1 ? pos : Math.min(pos, node.pos);
end = Math.max(end, node.end);
}
return createRange(pos, end);
}
function shouldEmitExplicitInitializerForLetDeclaration(node) {
const flags = resolver.getNodeCheckFlags(node);
const isCapturedInFunction = flags & 16384 /* CapturedBlockScopedBinding */;
const isDeclaredInLoop = flags & 32768 /* BlockScopedBindingInLoop */;
const emittedAsTopLevel = (hierarchyFacts & 64 /* TopLevel */) !== 0 || isCapturedInFunction && isDeclaredInLoop && (hierarchyFacts & 512 /* IterationStatementBlock */) !== 0;
const emitExplicitInitializer = !emittedAsTopLevel && (hierarchyFacts & 4096 /* ForInOrForOfStatement */) === 0 && (!resolver.isDeclarationWithCollidingName(node) || isDeclaredInLoop && !isCapturedInFunction && (hierarchyFacts & (2048 /* ForStatement */ | 4096 /* ForInOrForOfStatement */)) === 0);
return emitExplicitInitializer;
}
function visitVariableDeclarationInLetDeclarationList(node) {
const name = node.name;
if (isBindingPattern(name)) {
return visitVariableDeclaration(node);
}
if (!node.initializer && shouldEmitExplicitInitializerForLetDeclaration(node)) {
return factory2.updateVariableDeclaration(
node,
node.name,
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createVoidZero()
);
}
return visitEachChild(node, visitor, context);
}
function visitVariableDeclaration(node) {
const ancestorFacts = enterSubtree(32 /* ExportedVariableStatement */, 0 /* None */);
let updated;
if (isBindingPattern(node.name)) {
updated = flattenDestructuringBinding(
node,
visitor,
context,
0 /* All */,
/*rval*/
void 0,
(ancestorFacts & 32 /* ExportedVariableStatement */) !== 0
);
} else {
updated = visitEachChild(node, visitor, context);
}
exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
return updated;
}
function recordLabel(node) {
convertedLoopState.labels.set(idText(node.label), true);
}
function resetLabel(node) {
convertedLoopState.labels.set(idText(node.label), false);
}
function visitLabeledStatement(node) {
if (convertedLoopState && !convertedLoopState.labels) {
convertedLoopState.labels = /* @__PURE__ */ new Map();
}
const statement = unwrapInnermostStatementOfLabel(node, convertedLoopState && recordLabel);
return isIterationStatement(
statement,
/*lookInLabeledStatements*/
false
) ? visitIterationStatement(
statement,
/*outermostLabeledStatement*/
node
) : factory2.restoreEnclosingLabel(Debug.checkDefined(visitNode(statement, visitor, isStatement, factory2.liftToBlock)), node, convertedLoopState && resetLabel);
}
function visitIterationStatement(node, outermostLabeledStatement) {
switch (node.kind) {
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
return visitDoOrWhileStatement(node, outermostLabeledStatement);
case 247 /* ForStatement */:
return visitForStatement(node, outermostLabeledStatement);
case 248 /* ForInStatement */:
return visitForInStatement(node, outermostLabeledStatement);
case 249 /* ForOfStatement */:
return visitForOfStatement(node, outermostLabeledStatement);
}
}
function visitIterationStatementWithFacts(excludeFacts, includeFacts, node, outermostLabeledStatement, convert) {
const ancestorFacts = enterSubtree(excludeFacts, includeFacts);
const updated = convertIterationStatementBodyIfNecessary(node, outermostLabeledStatement, ancestorFacts, convert);
exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
return updated;
}
function visitDoOrWhileStatement(node, outermostLabeledStatement) {
return visitIterationStatementWithFacts(
0 /* DoOrWhileStatementExcludes */,
1280 /* DoOrWhileStatementIncludes */,
node,
outermostLabeledStatement
);
}
function visitForStatement(node, outermostLabeledStatement) {
return visitIterationStatementWithFacts(
5056 /* ForStatementExcludes */,
3328 /* ForStatementIncludes */,
node,
outermostLabeledStatement
);
}
function visitEachChildOfForStatement2(node) {
return factory2.updateForStatement(
node,
visitNode(node.initializer, visitorWithUnusedExpressionResult, isForInitializer),
visitNode(node.condition, visitor, isExpression),
visitNode(node.incrementor, visitorWithUnusedExpressionResult, isExpression),
Debug.checkDefined(visitNode(node.statement, visitor, isStatement, factory2.liftToBlock))
);
}
function visitForInStatement(node, outermostLabeledStatement) {
return visitIterationStatementWithFacts(
3008 /* ForInOrForOfStatementExcludes */,
5376 /* ForInOrForOfStatementIncludes */,
node,
outermostLabeledStatement
);
}
function visitForOfStatement(node, outermostLabeledStatement) {
return visitIterationStatementWithFacts(
3008 /* ForInOrForOfStatementExcludes */,
5376 /* ForInOrForOfStatementIncludes */,
node,
outermostLabeledStatement,
compilerOptions.downlevelIteration ? convertForOfStatementForIterable : convertForOfStatementForArray
);
}
function convertForOfStatementHead(node, boundValue, convertedLoopBodyStatements) {
const statements = [];
const initializer = node.initializer;
if (isVariableDeclarationList(initializer)) {
if (node.initializer.flags & 3 /* BlockScoped */) {
enableSubstitutionsForBlockScopedBindings();
}
const firstOriginalDeclaration = firstOrUndefined(initializer.declarations);
if (firstOriginalDeclaration && isBindingPattern(firstOriginalDeclaration.name)) {
const declarations = flattenDestructuringBinding(
firstOriginalDeclaration,
visitor,
context,
0 /* All */,
boundValue
);
const declarationList = setTextRange(factory2.createVariableDeclarationList(declarations), node.initializer);
setOriginalNode(declarationList, node.initializer);
setSourceMapRange(declarationList, createRange(declarations[0].pos, last(declarations).end));
statements.push(
factory2.createVariableStatement(
/*modifiers*/
void 0,
declarationList
)
);
} else {
statements.push(
setTextRange(
factory2.createVariableStatement(
/*modifiers*/
void 0,
setOriginalNode(
setTextRange(
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
firstOriginalDeclaration ? firstOriginalDeclaration.name : factory2.createTempVariable(
/*recordTempVariable*/
void 0
),
/*exclamationToken*/
void 0,
/*type*/
void 0,
boundValue
)
]),
moveRangePos(initializer, -1)
),
initializer
)
),
moveRangeEnd(initializer, -1)
)
);
}
} else {
const assignment = factory2.createAssignment(initializer, boundValue);
if (isDestructuringAssignment(assignment)) {
statements.push(factory2.createExpressionStatement(visitBinaryExpression(
assignment,
/*expressionResultIsUnused*/
true
)));
} else {
setTextRangeEnd(assignment, initializer.end);
statements.push(setTextRange(factory2.createExpressionStatement(Debug.checkDefined(visitNode(assignment, visitor, isExpression))), moveRangeEnd(initializer, -1)));
}
}
if (convertedLoopBodyStatements) {
return createSyntheticBlockForConvertedStatements(addRange(statements, convertedLoopBodyStatements));
} else {
const statement = visitNode(node.statement, visitor, isStatement, factory2.liftToBlock);
Debug.assert(statement);
if (isBlock(statement)) {
return factory2.updateBlock(statement, setTextRange(factory2.createNodeArray(concatenate(statements, statement.statements)), statement.statements));
} else {
statements.push(statement);
return createSyntheticBlockForConvertedStatements(statements);
}
}
}
function createSyntheticBlockForConvertedStatements(statements) {
return setEmitFlags(
factory2.createBlock(
factory2.createNodeArray(statements),
/*multiLine*/
true
),
96 /* NoSourceMap */ | 768 /* NoTokenSourceMaps */
);
}
function convertForOfStatementForArray(node, outermostLabeledStatement, convertedLoopBodyStatements) {
const expression = visitNode(node.expression, visitor, isExpression);
Debug.assert(expression);
const counter = factory2.createLoopVariable();
const rhsReference = isIdentifier(expression) ? factory2.getGeneratedNameForNode(expression) : factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
setEmitFlags(expression, 96 /* NoSourceMap */ | getEmitFlags(expression));
const forStatement = setTextRange(
factory2.createForStatement(
/*initializer*/
setEmitFlags(
setTextRange(
factory2.createVariableDeclarationList([
setTextRange(factory2.createVariableDeclaration(
counter,
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createNumericLiteral(0)
), moveRangePos(node.expression, -1)),
setTextRange(factory2.createVariableDeclaration(
rhsReference,
/*exclamationToken*/
void 0,
/*type*/
void 0,
expression
), node.expression)
]),
node.expression
),
4194304 /* NoHoisting */
),
/*condition*/
setTextRange(
factory2.createLessThan(
counter,
factory2.createPropertyAccessExpression(rhsReference, "length")
),
node.expression
),
/*incrementor*/
setTextRange(factory2.createPostfixIncrement(counter), node.expression),
/*statement*/
convertForOfStatementHead(
node,
factory2.createElementAccessExpression(rhsReference, counter),
convertedLoopBodyStatements
)
),
/*location*/
node
);
setEmitFlags(forStatement, 512 /* NoTokenTrailingSourceMaps */);
setTextRange(forStatement, node);
return factory2.restoreEnclosingLabel(forStatement, outermostLabeledStatement, convertedLoopState && resetLabel);
}
function convertForOfStatementForIterable(node, outermostLabeledStatement, convertedLoopBodyStatements, ancestorFacts) {
const expression = visitNode(node.expression, visitor, isExpression);
Debug.assert(expression);
const iterator = isIdentifier(expression) ? factory2.getGeneratedNameForNode(expression) : factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
const result = isIdentifier(expression) ? factory2.getGeneratedNameForNode(iterator) : factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
const errorRecord = factory2.createUniqueName("e");
const catchVariable = factory2.getGeneratedNameForNode(errorRecord);
const returnMethod = factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
const values = setTextRange(emitHelpers().createValuesHelper(expression), node.expression);
const next = factory2.createCallExpression(
factory2.createPropertyAccessExpression(iterator, "next"),
/*typeArguments*/
void 0,
[]
);
hoistVariableDeclaration(errorRecord);
hoistVariableDeclaration(returnMethod);
const initializer = ancestorFacts & 1024 /* IterationContainer */ ? factory2.inlineExpressions([factory2.createAssignment(errorRecord, factory2.createVoidZero()), values]) : values;
const forStatement = setEmitFlags(
setTextRange(
factory2.createForStatement(
/*initializer*/
setEmitFlags(
setTextRange(
factory2.createVariableDeclarationList([
setTextRange(factory2.createVariableDeclaration(
iterator,
/*exclamationToken*/
void 0,
/*type*/
void 0,
initializer
), node.expression),
factory2.createVariableDeclaration(
result,
/*exclamationToken*/
void 0,
/*type*/
void 0,
next
)
]),
node.expression
),
4194304 /* NoHoisting */
),
/*condition*/
factory2.createLogicalNot(factory2.createPropertyAccessExpression(result, "done")),
/*incrementor*/
factory2.createAssignment(result, next),
/*statement*/
convertForOfStatementHead(
node,
factory2.createPropertyAccessExpression(result, "value"),
convertedLoopBodyStatements
)
),
/*location*/
node
),
512 /* NoTokenTrailingSourceMaps */
);
return factory2.createTryStatement(
factory2.createBlock([
factory2.restoreEnclosingLabel(
forStatement,
outermostLabeledStatement,
convertedLoopState && resetLabel
)
]),
factory2.createCatchClause(
factory2.createVariableDeclaration(catchVariable),
setEmitFlags(
factory2.createBlock([
factory2.createExpressionStatement(
factory2.createAssignment(
errorRecord,
factory2.createObjectLiteralExpression([
factory2.createPropertyAssignment("error", catchVariable)
])
)
)
]),
1 /* SingleLine */
)
),
factory2.createBlock([
factory2.createTryStatement(
/*tryBlock*/
factory2.createBlock([
setEmitFlags(
factory2.createIfStatement(
factory2.createLogicalAnd(
factory2.createLogicalAnd(
result,
factory2.createLogicalNot(
factory2.createPropertyAccessExpression(result, "done")
)
),
factory2.createAssignment(
returnMethod,
factory2.createPropertyAccessExpression(iterator, "return")
)
),
factory2.createExpressionStatement(
factory2.createFunctionCallCall(returnMethod, iterator, [])
)
),
1 /* SingleLine */
)
]),
/*catchClause*/
void 0,
/*finallyBlock*/
setEmitFlags(
factory2.createBlock([
setEmitFlags(
factory2.createIfStatement(
errorRecord,
factory2.createThrowStatement(
factory2.createPropertyAccessExpression(errorRecord, "error")
)
),
1 /* SingleLine */
)
]),
1 /* SingleLine */
)
)
])
);
}
function visitObjectLiteralExpression(node) {
const properties = node.properties;
let numInitialProperties = -1, hasComputed = false;
for (let i = 0; i < properties.length; i++) {
const property = properties[i];
if (property.transformFlags & 1048576 /* ContainsYield */ && hierarchyFacts & 4 /* AsyncFunctionBody */ || (hasComputed = Debug.checkDefined(property.name).kind === 166 /* ComputedPropertyName */)) {
numInitialProperties = i;
break;
}
}
if (numInitialProperties < 0) {
return visitEachChild(node, visitor, context);
}
const temp = factory2.createTempVariable(hoistVariableDeclaration);
const expressions = [];
const assignment = factory2.createAssignment(
temp,
setEmitFlags(
factory2.createObjectLiteralExpression(
visitNodes2(properties, visitor, isObjectLiteralElementLike, 0, numInitialProperties),
node.multiLine
),
hasComputed ? 131072 /* Indented */ : 0
)
);
if (node.multiLine) {
startOnNewLine(assignment);
}
expressions.push(assignment);
addObjectLiteralMembers(expressions, node, temp, numInitialProperties);
expressions.push(node.multiLine ? startOnNewLine(setParent(setTextRange(factory2.cloneNode(temp), temp), temp.parent)) : temp);
return factory2.inlineExpressions(expressions);
}
function shouldConvertPartOfIterationStatement(node) {
return (resolver.getNodeCheckFlags(node) & 8192 /* ContainsCapturedBlockScopeBinding */) !== 0;
}
function shouldConvertInitializerOfForStatement(node) {
return isForStatement(node) && !!node.initializer && shouldConvertPartOfIterationStatement(node.initializer);
}
function shouldConvertConditionOfForStatement(node) {
return isForStatement(node) && !!node.condition && shouldConvertPartOfIterationStatement(node.condition);
}
function shouldConvertIncrementorOfForStatement(node) {
return isForStatement(node) && !!node.incrementor && shouldConvertPartOfIterationStatement(node.incrementor);
}
function shouldConvertIterationStatement(node) {
return shouldConvertBodyOfIterationStatement(node) || shouldConvertInitializerOfForStatement(node);
}
function shouldConvertBodyOfIterationStatement(node) {
return (resolver.getNodeCheckFlags(node) & 4096 /* LoopWithCapturedBlockScopedBinding */) !== 0;
}
function hoistVariableDeclarationDeclaredInConvertedLoop(state, node) {
if (!state.hoistedLocalVariables) {
state.hoistedLocalVariables = [];
}
visit(node.name);
function visit(node2) {
if (node2.kind === 80 /* Identifier */) {
state.hoistedLocalVariables.push(node2);
} else {
for (const element of node2.elements) {
if (!isOmittedExpression(element)) {
visit(element.name);
}
}
}
}
}
function convertIterationStatementBodyIfNecessary(node, outermostLabeledStatement, ancestorFacts, convert) {
if (!shouldConvertIterationStatement(node)) {
let saveAllowedNonLabeledJumps;
if (convertedLoopState) {
saveAllowedNonLabeledJumps = convertedLoopState.allowedNonLabeledJumps;
convertedLoopState.allowedNonLabeledJumps = 2 /* Break */ | 4 /* Continue */;
}
const result = convert ? convert(
node,
outermostLabeledStatement,
/*convertedLoopBodyStatements*/
void 0,
ancestorFacts
) : factory2.restoreEnclosingLabel(
isForStatement(node) ? visitEachChildOfForStatement2(node) : visitEachChild(node, visitor, context),
outermostLabeledStatement,
convertedLoopState && resetLabel
);
if (convertedLoopState) {
convertedLoopState.allowedNonLabeledJumps = saveAllowedNonLabeledJumps;
}
return result;
}
const currentState = createConvertedLoopState(node);
const statements = [];
const outerConvertedLoopState = convertedLoopState;
convertedLoopState = currentState;
const initializerFunction = shouldConvertInitializerOfForStatement(node) ? createFunctionForInitializerOfForStatement(node, currentState) : void 0;
const bodyFunction = shouldConvertBodyOfIterationStatement(node) ? createFunctionForBodyOfIterationStatement(node, currentState, outerConvertedLoopState) : void 0;
convertedLoopState = outerConvertedLoopState;
if (initializerFunction)
statements.push(initializerFunction.functionDeclaration);
if (bodyFunction)
statements.push(bodyFunction.functionDeclaration);
addExtraDeclarationsForConvertedLoop(statements, currentState, outerConvertedLoopState);
if (initializerFunction) {
statements.push(generateCallToConvertedLoopInitializer(initializerFunction.functionName, initializerFunction.containsYield));
}
let loop;
if (bodyFunction) {
if (convert) {
loop = convert(node, outermostLabeledStatement, bodyFunction.part, ancestorFacts);
} else {
const clone2 = convertIterationStatementCore(node, initializerFunction, factory2.createBlock(
bodyFunction.part,
/*multiLine*/
true
));
loop = factory2.restoreEnclosingLabel(clone2, outermostLabeledStatement, convertedLoopState && resetLabel);
}
} else {
const clone2 = convertIterationStatementCore(node, initializerFunction, Debug.checkDefined(visitNode(node.statement, visitor, isStatement, factory2.liftToBlock)));
loop = factory2.restoreEnclosingLabel(clone2, outermostLabeledStatement, convertedLoopState && resetLabel);
}
statements.push(loop);
return statements;
}
function convertIterationStatementCore(node, initializerFunction, convertedLoopBody) {
switch (node.kind) {
case 247 /* ForStatement */:
return convertForStatement(node, initializerFunction, convertedLoopBody);
case 248 /* ForInStatement */:
return convertForInStatement(node, convertedLoopBody);
case 249 /* ForOfStatement */:
return convertForOfStatement(node, convertedLoopBody);
case 245 /* DoStatement */:
return convertDoStatement(node, convertedLoopBody);
case 246 /* WhileStatement */:
return convertWhileStatement(node, convertedLoopBody);
default:
return Debug.failBadSyntaxKind(node, "IterationStatement expected");
}
}
function convertForStatement(node, initializerFunction, convertedLoopBody) {
const shouldConvertCondition = node.condition && shouldConvertPartOfIterationStatement(node.condition);
const shouldConvertIncrementor = shouldConvertCondition || node.incrementor && shouldConvertPartOfIterationStatement(node.incrementor);
return factory2.updateForStatement(
node,
visitNode(initializerFunction ? initializerFunction.part : node.initializer, visitorWithUnusedExpressionResult, isForInitializer),
visitNode(shouldConvertCondition ? void 0 : node.condition, visitor, isExpression),
visitNode(shouldConvertIncrementor ? void 0 : node.incrementor, visitorWithUnusedExpressionResult, isExpression),
convertedLoopBody
);
}
function convertForOfStatement(node, convertedLoopBody) {
return factory2.updateForOfStatement(
node,
/*awaitModifier*/
void 0,
Debug.checkDefined(visitNode(node.initializer, visitor, isForInitializer)),
Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
convertedLoopBody
);
}
function convertForInStatement(node, convertedLoopBody) {
return factory2.updateForInStatement(
node,
Debug.checkDefined(visitNode(node.initializer, visitor, isForInitializer)),
Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
convertedLoopBody
);
}
function convertDoStatement(node, convertedLoopBody) {
return factory2.updateDoStatement(
node,
convertedLoopBody,
Debug.checkDefined(visitNode(node.expression, visitor, isExpression))
);
}
function convertWhileStatement(node, convertedLoopBody) {
return factory2.updateWhileStatement(
node,
Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
convertedLoopBody
);
}
function createConvertedLoopState(node) {
let loopInitializer;
switch (node.kind) {
case 247 /* ForStatement */:
case 248 /* ForInStatement */:
case 249 /* ForOfStatement */:
const initializer = node.initializer;
if (initializer && initializer.kind === 260 /* VariableDeclarationList */) {
loopInitializer = initializer;
}
break;
}
const loopParameters = [];
const loopOutParameters = [];
if (loopInitializer && getCombinedNodeFlags(loopInitializer) & 3 /* BlockScoped */) {
const hasCapturedBindingsInForHead = shouldConvertInitializerOfForStatement(node) || shouldConvertConditionOfForStatement(node) || shouldConvertIncrementorOfForStatement(node);
for (const decl of loopInitializer.declarations) {
processLoopVariableDeclaration(node, decl, loopParameters, loopOutParameters, hasCapturedBindingsInForHead);
}
}
const currentState = { loopParameters, loopOutParameters };
if (convertedLoopState) {
if (convertedLoopState.argumentsName) {
currentState.argumentsName = convertedLoopState.argumentsName;
}
if (convertedLoopState.thisName) {
currentState.thisName = convertedLoopState.thisName;
}
if (convertedLoopState.hoistedLocalVariables) {
currentState.hoistedLocalVariables = convertedLoopState.hoistedLocalVariables;
}
}
return currentState;
}
function addExtraDeclarationsForConvertedLoop(statements, state, outerState) {
let extraVariableDeclarations;
if (state.argumentsName) {
if (outerState) {
outerState.argumentsName = state.argumentsName;
} else {
(extraVariableDeclarations || (extraVariableDeclarations = [])).push(
factory2.createVariableDeclaration(
state.argumentsName,
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createIdentifier("arguments")
)
);
}
}
if (state.thisName) {
if (outerState) {
outerState.thisName = state.thisName;
} else {
(extraVariableDeclarations || (extraVariableDeclarations = [])).push(
factory2.createVariableDeclaration(
state.thisName,
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createIdentifier("this")
)
);
}
}
if (state.hoistedLocalVariables) {
if (outerState) {
outerState.hoistedLocalVariables = state.hoistedLocalVariables;
} else {
if (!extraVariableDeclarations) {
extraVariableDeclarations = [];
}
for (const identifier of state.hoistedLocalVariables) {
extraVariableDeclarations.push(factory2.createVariableDeclaration(identifier));
}
}
}
if (state.loopOutParameters.length) {
if (!extraVariableDeclarations) {
extraVariableDeclarations = [];
}
for (const outParam of state.loopOutParameters) {
extraVariableDeclarations.push(factory2.createVariableDeclaration(outParam.outParamName));
}
}
if (state.conditionVariable) {
if (!extraVariableDeclarations) {
extraVariableDeclarations = [];
}
extraVariableDeclarations.push(factory2.createVariableDeclaration(
state.conditionVariable,
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createFalse()
));
}
if (extraVariableDeclarations) {
statements.push(factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(extraVariableDeclarations)
));
}
}
function createOutVariable(p) {
return factory2.createVariableDeclaration(
p.originalName,
/*exclamationToken*/
void 0,
/*type*/
void 0,
p.outParamName
);
}
function createFunctionForInitializerOfForStatement(node, currentState) {
const functionName = factory2.createUniqueName("_loop_init");
const containsYield = (node.initializer.transformFlags & 1048576 /* ContainsYield */) !== 0;
let emitFlags = 0 /* None */;
if (currentState.containsLexicalThis)
emitFlags |= 16 /* CapturesThis */;
if (containsYield && hierarchyFacts & 4 /* AsyncFunctionBody */)
emitFlags |= 524288 /* AsyncFunctionBody */;
const statements = [];
statements.push(factory2.createVariableStatement(
/*modifiers*/
void 0,
node.initializer
));
copyOutParameters(currentState.loopOutParameters, 2 /* Initializer */, 1 /* ToOutParameter */, statements);
const functionDeclaration = factory2.createVariableStatement(
/*modifiers*/
void 0,
setEmitFlags(
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
functionName,
/*exclamationToken*/
void 0,
/*type*/
void 0,
setEmitFlags(
factory2.createFunctionExpression(
/*modifiers*/
void 0,
containsYield ? factory2.createToken(42 /* AsteriskToken */) : void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
/*parameters*/
void 0,
/*type*/
void 0,
Debug.checkDefined(visitNode(
factory2.createBlock(
statements,
/*multiLine*/
true
),
visitor,
isBlock
))
),
emitFlags
)
)
]),
4194304 /* NoHoisting */
)
);
const part = factory2.createVariableDeclarationList(map(currentState.loopOutParameters, createOutVariable));
return { functionName, containsYield, functionDeclaration, part };
}
function createFunctionForBodyOfIterationStatement(node, currentState, outerState) {
const functionName = factory2.createUniqueName("_loop");
startLexicalEnvironment();
const statement = visitNode(node.statement, visitor, isStatement, factory2.liftToBlock);
const lexicalEnvironment = endLexicalEnvironment();
const statements = [];
if (shouldConvertConditionOfForStatement(node) || shouldConvertIncrementorOfForStatement(node)) {
currentState.conditionVariable = factory2.createUniqueName("inc");
if (node.incrementor) {
statements.push(factory2.createIfStatement(
currentState.conditionVariable,
factory2.createExpressionStatement(Debug.checkDefined(visitNode(node.incrementor, visitor, isExpression))),
factory2.createExpressionStatement(factory2.createAssignment(currentState.conditionVariable, factory2.createTrue()))
));
} else {
statements.push(factory2.createIfStatement(
factory2.createLogicalNot(currentState.conditionVariable),
factory2.createExpressionStatement(factory2.createAssignment(currentState.conditionVariable, factory2.createTrue()))
));
}
if (shouldConvertConditionOfForStatement(node)) {
statements.push(factory2.createIfStatement(
factory2.createPrefixUnaryExpression(54 /* ExclamationToken */, Debug.checkDefined(visitNode(node.condition, visitor, isExpression))),
Debug.checkDefined(visitNode(factory2.createBreakStatement(), visitor, isStatement))
));
}
}
Debug.assert(statement);
if (isBlock(statement)) {
addRange(statements, statement.statements);
} else {
statements.push(statement);
}
copyOutParameters(currentState.loopOutParameters, 1 /* Body */, 1 /* ToOutParameter */, statements);
insertStatementsAfterStandardPrologue(statements, lexicalEnvironment);
const loopBody = factory2.createBlock(
statements,
/*multiLine*/
true
);
if (isBlock(statement))
setOriginalNode(loopBody, statement);
const containsYield = (node.statement.transformFlags & 1048576 /* ContainsYield */) !== 0;
let emitFlags = 1048576 /* ReuseTempVariableScope */;
if (currentState.containsLexicalThis)
emitFlags |= 16 /* CapturesThis */;
if (containsYield && (hierarchyFacts & 4 /* AsyncFunctionBody */) !== 0)
emitFlags |= 524288 /* AsyncFunctionBody */;
const functionDeclaration = factory2.createVariableStatement(
/*modifiers*/
void 0,
setEmitFlags(
factory2.createVariableDeclarationList(
[
factory2.createVariableDeclaration(
functionName,
/*exclamationToken*/
void 0,
/*type*/
void 0,
setEmitFlags(
factory2.createFunctionExpression(
/*modifiers*/
void 0,
containsYield ? factory2.createToken(42 /* AsteriskToken */) : void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
currentState.loopParameters,
/*type*/
void 0,
loopBody
),
emitFlags
)
)
]
),
4194304 /* NoHoisting */
)
);
const part = generateCallToConvertedLoop(functionName, currentState, outerState, containsYield);
return { functionName, containsYield, functionDeclaration, part };
}
function copyOutParameter(outParam, copyDirection) {
const source = copyDirection === 0 /* ToOriginal */ ? outParam.outParamName : outParam.originalName;
const target = copyDirection === 0 /* ToOriginal */ ? outParam.originalName : outParam.outParamName;
return factory2.createBinaryExpression(target, 64 /* EqualsToken */, source);
}
function copyOutParameters(outParams, partFlags, copyDirection, statements) {
for (const outParam of outParams) {
if (outParam.flags & partFlags) {
statements.push(factory2.createExpressionStatement(copyOutParameter(outParam, copyDirection)));
}
}
}
function generateCallToConvertedLoopInitializer(initFunctionExpressionName, containsYield) {
const call = factory2.createCallExpression(
initFunctionExpressionName,
/*typeArguments*/
void 0,
[]
);
const callResult = containsYield ? factory2.createYieldExpression(
factory2.createToken(42 /* AsteriskToken */),
setEmitFlags(call, 8388608 /* Iterator */)
) : call;
return factory2.createExpressionStatement(callResult);
}
function generateCallToConvertedLoop(loopFunctionExpressionName, state, outerState, containsYield) {
const statements = [];
const isSimpleLoop = !(state.nonLocalJumps & ~4 /* Continue */) && !state.labeledNonLocalBreaks && !state.labeledNonLocalContinues;
const call = factory2.createCallExpression(
loopFunctionExpressionName,
/*typeArguments*/
void 0,
map(state.loopParameters, (p) => p.name)
);
const callResult = containsYield ? factory2.createYieldExpression(
factory2.createToken(42 /* AsteriskToken */),
setEmitFlags(call, 8388608 /* Iterator */)
) : call;
if (isSimpleLoop) {
statements.push(factory2.createExpressionStatement(callResult));
copyOutParameters(state.loopOutParameters, 1 /* Body */, 0 /* ToOriginal */, statements);
} else {
const loopResultName = factory2.createUniqueName("state");
const stateVariable = factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(
[factory2.createVariableDeclaration(
loopResultName,
/*exclamationToken*/
void 0,
/*type*/
void 0,
callResult
)]
)
);
statements.push(stateVariable);
copyOutParameters(state.loopOutParameters, 1 /* Body */, 0 /* ToOriginal */, statements);
if (state.nonLocalJumps & 8 /* Return */) {
let returnStatement;
if (outerState) {
outerState.nonLocalJumps |= 8 /* Return */;
returnStatement = factory2.createReturnStatement(loopResultName);
} else {
returnStatement = factory2.createReturnStatement(factory2.createPropertyAccessExpression(loopResultName, "value"));
}
statements.push(
factory2.createIfStatement(
factory2.createTypeCheck(loopResultName, "object"),
returnStatement
)
);
}
if (state.nonLocalJumps & 2 /* Break */) {
statements.push(
factory2.createIfStatement(
factory2.createStrictEquality(
loopResultName,
factory2.createStringLiteral("break")
),
factory2.createBreakStatement()
)
);
}
if (state.labeledNonLocalBreaks || state.labeledNonLocalContinues) {
const caseClauses = [];
processLabeledJumps(
state.labeledNonLocalBreaks,
/*isBreak*/
true,
loopResultName,
outerState,
caseClauses
);
processLabeledJumps(
state.labeledNonLocalContinues,
/*isBreak*/
false,
loopResultName,
outerState,
caseClauses
);
statements.push(
factory2.createSwitchStatement(
loopResultName,
factory2.createCaseBlock(caseClauses)
)
);
}
}
return statements;
}
function setLabeledJump(state, isBreak, labelText, labelMarker) {
if (isBreak) {
if (!state.labeledNonLocalBreaks) {
state.labeledNonLocalBreaks = /* @__PURE__ */ new Map();
}
state.labeledNonLocalBreaks.set(labelText, labelMarker);
} else {
if (!state.labeledNonLocalContinues) {
state.labeledNonLocalContinues = /* @__PURE__ */ new Map();
}
state.labeledNonLocalContinues.set(labelText, labelMarker);
}
}
function processLabeledJumps(table, isBreak, loopResultName, outerLoop, caseClauses) {
if (!table) {
return;
}
table.forEach((labelMarker, labelText) => {
const statements = [];
if (!outerLoop || outerLoop.labels && outerLoop.labels.get(labelText)) {
const label = factory2.createIdentifier(labelText);
statements.push(isBreak ? factory2.createBreakStatement(label) : factory2.createContinueStatement(label));
} else {
setLabeledJump(outerLoop, isBreak, labelText, labelMarker);
statements.push(factory2.createReturnStatement(loopResultName));
}
caseClauses.push(factory2.createCaseClause(factory2.createStringLiteral(labelMarker), statements));
});
}
function processLoopVariableDeclaration(container, decl, loopParameters, loopOutParameters, hasCapturedBindingsInForHead) {
const name = decl.name;
if (isBindingPattern(name)) {
for (const element of name.elements) {
if (!isOmittedExpression(element)) {
processLoopVariableDeclaration(container, element, loopParameters, loopOutParameters, hasCapturedBindingsInForHead);
}
}
} else {
loopParameters.push(factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
name
));
const checkFlags = resolver.getNodeCheckFlags(decl);
if (checkFlags & 262144 /* NeedsLoopOutParameter */ || hasCapturedBindingsInForHead) {
const outParamName = factory2.createUniqueName("out_" + idText(name));
let flags = 0 /* None */;
if (checkFlags & 262144 /* NeedsLoopOutParameter */) {
flags |= 1 /* Body */;
}
if (isForStatement(container)) {
if (container.initializer && resolver.isBindingCapturedByNode(container.initializer, decl)) {
flags |= 2 /* Initializer */;
}
if (container.condition && resolver.isBindingCapturedByNode(container.condition, decl) || container.incrementor && resolver.isBindingCapturedByNode(container.incrementor, decl)) {
flags |= 1 /* Body */;
}
}
loopOutParameters.push({ flags, originalName: name, outParamName });
}
}
}
function addObjectLiteralMembers(expressions, node, receiver, start) {
const properties = node.properties;
const numProperties = properties.length;
for (let i = start; i < numProperties; i++) {
const property = properties[i];
switch (property.kind) {
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
const accessors = getAllAccessorDeclarations(node.properties, property);
if (property === accessors.firstAccessor) {
expressions.push(transformAccessorsToExpression(receiver, accessors, node, !!node.multiLine));
}
break;
case 173 /* MethodDeclaration */:
expressions.push(transformObjectLiteralMethodDeclarationToExpression(property, receiver, node, node.multiLine));
break;
case 302 /* PropertyAssignment */:
expressions.push(transformPropertyAssignmentToExpression(property, receiver, node.multiLine));
break;
case 303 /* ShorthandPropertyAssignment */:
expressions.push(transformShorthandPropertyAssignmentToExpression(property, receiver, node.multiLine));
break;
default:
Debug.failBadSyntaxKind(node);
break;
}
}
}
function transformPropertyAssignmentToExpression(property, receiver, startsOnNewLine) {
const expression = factory2.createAssignment(
createMemberAccessForPropertyName(
factory2,
receiver,
Debug.checkDefined(visitNode(property.name, visitor, isPropertyName))
),
Debug.checkDefined(visitNode(property.initializer, visitor, isExpression))
);
setTextRange(expression, property);
if (startsOnNewLine) {
startOnNewLine(expression);
}
return expression;
}
function transformShorthandPropertyAssignmentToExpression(property, receiver, startsOnNewLine) {
const expression = factory2.createAssignment(
createMemberAccessForPropertyName(
factory2,
receiver,
Debug.checkDefined(visitNode(property.name, visitor, isPropertyName))
),
factory2.cloneNode(property.name)
);
setTextRange(expression, property);
if (startsOnNewLine) {
startOnNewLine(expression);
}
return expression;
}
function transformObjectLiteralMethodDeclarationToExpression(method, receiver, container, startsOnNewLine) {
const expression = factory2.createAssignment(
createMemberAccessForPropertyName(
factory2,
receiver,
Debug.checkDefined(visitNode(method.name, visitor, isPropertyName))
),
transformFunctionLikeToExpression(
method,
/*location*/
method,
/*name*/
void 0,
container
)
);
setTextRange(expression, method);
if (startsOnNewLine) {
startOnNewLine(expression);
}
return expression;
}
function visitCatchClause(node) {
const ancestorFacts = enterSubtree(7104 /* BlockScopeExcludes */, 0 /* BlockScopeIncludes */);
let updated;
Debug.assert(!!node.variableDeclaration, "Catch clause variable should always be present when downleveling ES2015.");
if (isBindingPattern(node.variableDeclaration.name)) {
const temp = factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
const newVariableDeclaration = factory2.createVariableDeclaration(temp);
setTextRange(newVariableDeclaration, node.variableDeclaration);
const vars = flattenDestructuringBinding(
node.variableDeclaration,
visitor,
context,
0 /* All */,
temp
);
const list = factory2.createVariableDeclarationList(vars);
setTextRange(list, node.variableDeclaration);
const destructure = factory2.createVariableStatement(
/*modifiers*/
void 0,
list
);
updated = factory2.updateCatchClause(node, newVariableDeclaration, addStatementToStartOfBlock(node.block, destructure));
} else {
updated = visitEachChild(node, visitor, context);
}
exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
return updated;
}
function addStatementToStartOfBlock(block, statement) {
const transformedStatements = visitNodes2(block.statements, visitor, isStatement);
return factory2.updateBlock(block, [statement, ...transformedStatements]);
}
function visitMethodDeclaration(node) {
Debug.assert(!isComputedPropertyName(node.name));
const functionExpression = transformFunctionLikeToExpression(
node,
/*location*/
moveRangePos(node, -1),
/*name*/
void 0,
/*container*/
void 0
);
setEmitFlags(functionExpression, 1024 /* NoLeadingComments */ | getEmitFlags(functionExpression));
return setTextRange(
factory2.createPropertyAssignment(
node.name,
functionExpression
),
/*location*/
node
);
}
function visitAccessorDeclaration(node) {
Debug.assert(!isComputedPropertyName(node.name));
const savedConvertedLoopState = convertedLoopState;
convertedLoopState = void 0;
const ancestorFacts = enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */);
let updated;
const parameters = visitParameterList(node.parameters, visitor, context);
const body = transformFunctionBody(node);
if (node.kind === 176 /* GetAccessor */) {
updated = factory2.updateGetAccessorDeclaration(node, node.modifiers, node.name, parameters, node.type, body);
} else {
updated = factory2.updateSetAccessorDeclaration(node, node.modifiers, node.name, parameters, body);
}
exitSubtree(ancestorFacts, 98304 /* FunctionSubtreeExcludes */, 0 /* None */);
convertedLoopState = savedConvertedLoopState;
return updated;
}
function visitShorthandPropertyAssignment(node) {
return setTextRange(
factory2.createPropertyAssignment(
node.name,
visitIdentifier(factory2.cloneNode(node.name))
),
/*location*/
node
);
}
function visitComputedPropertyName(node) {
return visitEachChild(node, visitor, context);
}
function visitYieldExpression(node) {
return visitEachChild(node, visitor, context);
}
function visitArrayLiteralExpression(node) {
if (some(node.elements, isSpreadElement)) {
return transformAndSpreadElements(
node.elements,
/*isArgumentList*/
false,
!!node.multiLine,
/*hasTrailingComma*/
!!node.elements.hasTrailingComma
);
}
return visitEachChild(node, visitor, context);
}
function visitCallExpression(node) {
if (getInternalEmitFlags(node) & 1 /* TypeScriptClassWrapper */) {
return visitTypeScriptClassWrapper(node);
}
const expression = skipOuterExpressions(node.expression);
if (expression.kind === 108 /* SuperKeyword */ || isSuperProperty(expression) || some(node.arguments, isSpreadElement)) {
return visitCallExpressionWithPotentialCapturedThisAssignment(
node,
/*assignToCapturedThis*/
true
);
}
return factory2.updateCallExpression(
node,
Debug.checkDefined(visitNode(node.expression, callExpressionVisitor, isExpression)),
/*typeArguments*/
void 0,
visitNodes2(node.arguments, visitor, isExpression)
);
}
function visitTypeScriptClassWrapper(node) {
const body = cast(cast(skipOuterExpressions(node.expression), isArrowFunction).body, isBlock);
const isVariableStatementWithInitializer = (stmt) => isVariableStatement(stmt) && !!first(stmt.declarationList.declarations).initializer;
const savedConvertedLoopState = convertedLoopState;
convertedLoopState = void 0;
const bodyStatements = visitNodes2(body.statements, classWrapperStatementVisitor, isStatement);
convertedLoopState = savedConvertedLoopState;
const classStatements = filter(bodyStatements, isVariableStatementWithInitializer);
const remainingStatements = filter(bodyStatements, (stmt) => !isVariableStatementWithInitializer(stmt));
const varStatement = cast(first(classStatements), isVariableStatement);
const variable = varStatement.declarationList.declarations[0];
const initializer = skipOuterExpressions(variable.initializer);
let aliasAssignment = tryCast(initializer, isAssignmentExpression);
if (!aliasAssignment && isBinaryExpression(initializer) && initializer.operatorToken.kind === 28 /* CommaToken */) {
aliasAssignment = tryCast(initializer.left, isAssignmentExpression);
}
const call = cast(aliasAssignment ? skipOuterExpressions(aliasAssignment.right) : initializer, isCallExpression);
const func = cast(skipOuterExpressions(call.expression), isFunctionExpression);
const funcStatements = func.body.statements;
let classBodyStart = 0;
let classBodyEnd = -1;
const statements = [];
if (aliasAssignment) {
const extendsCall = tryCast(funcStatements[classBodyStart], isExpressionStatement);
if (extendsCall) {
statements.push(extendsCall);
classBodyStart++;
}
statements.push(funcStatements[classBodyStart]);
classBodyStart++;
statements.push(
factory2.createExpressionStatement(
factory2.createAssignment(
aliasAssignment.left,
cast(variable.name, isIdentifier)
)
)
);
}
while (!isReturnStatement(elementAt(funcStatements, classBodyEnd))) {
classBodyEnd--;
}
addRange(statements, funcStatements, classBodyStart, classBodyEnd);
if (classBodyEnd < -1) {
addRange(statements, funcStatements, classBodyEnd + 1);
}
const returnStatement = tryCast(elementAt(funcStatements, classBodyEnd), isReturnStatement);
for (const statement of remainingStatements) {
if (isReturnStatement(statement) && (returnStatement == null ? void 0 : returnStatement.expression) && !isIdentifier(returnStatement.expression)) {
statements.push(returnStatement);
} else {
statements.push(statement);
}
}
addRange(
statements,
classStatements,
/*start*/
1
);
return factory2.restoreOuterExpressions(
node.expression,
factory2.restoreOuterExpressions(
variable.initializer,
factory2.restoreOuterExpressions(
aliasAssignment && aliasAssignment.right,
factory2.updateCallExpression(
call,
factory2.restoreOuterExpressions(
call.expression,
factory2.updateFunctionExpression(
func,
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
func.parameters,
/*type*/
void 0,
factory2.updateBlock(
func.body,
statements
)
)
),
/*typeArguments*/
void 0,
call.arguments
)
)
)
);
}
function visitSuperCallInBody(node) {
return visitCallExpressionWithPotentialCapturedThisAssignment(
node,
/*assignToCapturedThis*/
false
);
}
function visitCallExpressionWithPotentialCapturedThisAssignment(node, assignToCapturedThis) {
if (node.transformFlags & 32768 /* ContainsRestOrSpread */ || node.expression.kind === 108 /* SuperKeyword */ || isSuperProperty(skipOuterExpressions(node.expression))) {
const { target, thisArg } = factory2.createCallBinding(node.expression, hoistVariableDeclaration);
if (node.expression.kind === 108 /* SuperKeyword */) {
setEmitFlags(thisArg, 8 /* NoSubstitution */);
}
let resultingCall;
if (node.transformFlags & 32768 /* ContainsRestOrSpread */) {
resultingCall = factory2.createFunctionApplyCall(
Debug.checkDefined(visitNode(target, callExpressionVisitor, isExpression)),
node.expression.kind === 108 /* SuperKeyword */ ? thisArg : Debug.checkDefined(visitNode(thisArg, visitor, isExpression)),
transformAndSpreadElements(
node.arguments,
/*isArgumentList*/
true,
/*multiLine*/
false,
/*hasTrailingComma*/
false
)
);
} else {
resultingCall = setTextRange(
factory2.createFunctionCallCall(
Debug.checkDefined(visitNode(target, callExpressionVisitor, isExpression)),
node.expression.kind === 108 /* SuperKeyword */ ? thisArg : Debug.checkDefined(visitNode(thisArg, visitor, isExpression)),
visitNodes2(node.arguments, visitor, isExpression)
),
node
);
}
if (node.expression.kind === 108 /* SuperKeyword */) {
const initializer = factory2.createLogicalOr(
resultingCall,
createActualThis()
);
resultingCall = assignToCapturedThis ? factory2.createAssignment(factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */), initializer) : initializer;
}
return setOriginalNode(resultingCall, node);
}
return visitEachChild(node, visitor, context);
}
function visitNewExpression(node) {
if (some(node.arguments, isSpreadElement)) {
const { target, thisArg } = factory2.createCallBinding(factory2.createPropertyAccessExpression(node.expression, "bind"), hoistVariableDeclaration);
return factory2.createNewExpression(
factory2.createFunctionApplyCall(
Debug.checkDefined(visitNode(target, visitor, isExpression)),
thisArg,
transformAndSpreadElements(
factory2.createNodeArray([factory2.createVoidZero(), ...node.arguments]),
/*isArgumentList*/
true,
/*multiLine*/
false,
/*hasTrailingComma*/
false
)
),
/*typeArguments*/
void 0,
[]
);
}
return visitEachChild(node, visitor, context);
}
function transformAndSpreadElements(elements, isArgumentList, multiLine, hasTrailingComma) {
const numElements = elements.length;
const segments = flatten(
// As we visit each element, we return one of two functions to use as the "key":
// - `visitSpanOfSpreads` for one or more contiguous `...` spread expressions, i.e. `...a, ...b` in `[1, 2, ...a, ...b]`
// - `visitSpanOfNonSpreads` for one or more contiguous non-spread elements, i.e. `1, 2`, in `[1, 2, ...a, ...b]`
spanMap(
elements,
partitionSpread,
(partition, visitPartition, _start, end) => visitPartition(partition, multiLine, hasTrailingComma && end === numElements)
)
);
if (segments.length === 1) {
const firstSegment = segments[0];
if (isArgumentList && !compilerOptions.downlevelIteration || isPackedArrayLiteral(firstSegment.expression) || isCallToHelper(firstSegment.expression, "___spreadArray")) {
return firstSegment.expression;
}
}
const helpers = emitHelpers();
const startsWithSpread = segments[0].kind !== 0 /* None */;
let expression = startsWithSpread ? factory2.createArrayLiteralExpression() : segments[0].expression;
for (let i = startsWithSpread ? 0 : 1; i < segments.length; i++) {
const segment = segments[i];
expression = helpers.createSpreadArrayHelper(
expression,
segment.expression,
segment.kind === 1 /* UnpackedSpread */ && !isArgumentList
);
}
return expression;
}
function partitionSpread(node) {
return isSpreadElement(node) ? visitSpanOfSpreads : visitSpanOfNonSpreads;
}
function visitSpanOfSpreads(chunk) {
return map(chunk, visitExpressionOfSpread);
}
function visitExpressionOfSpread(node) {
Debug.assertNode(node, isSpreadElement);
let expression = visitNode(node.expression, visitor, isExpression);
Debug.assert(expression);
const isCallToReadHelper = isCallToHelper(expression, "___read");
let kind = isCallToReadHelper || isPackedArrayLiteral(expression) ? 2 /* PackedSpread */ : 1 /* UnpackedSpread */;
if (compilerOptions.downlevelIteration && kind === 1 /* UnpackedSpread */ && !isArrayLiteralExpression(expression) && !isCallToReadHelper) {
expression = emitHelpers().createReadHelper(
expression,
/*count*/
void 0
);
kind = 2 /* PackedSpread */;
}
return createSpreadSegment(kind, expression);
}
function visitSpanOfNonSpreads(chunk, multiLine, hasTrailingComma) {
const expression = factory2.createArrayLiteralExpression(
visitNodes2(factory2.createNodeArray(chunk, hasTrailingComma), visitor, isExpression),
multiLine
);
return createSpreadSegment(0 /* None */, expression);
}
function visitSpreadElement(node) {
return visitNode(node.expression, visitor, isExpression);
}
function visitTemplateLiteral(node) {
return setTextRange(factory2.createStringLiteral(node.text), node);
}
function visitStringLiteral(node) {
if (node.hasExtendedUnicodeEscape) {
return setTextRange(factory2.createStringLiteral(node.text), node);
}
return node;
}
function visitNumericLiteral(node) {
if (node.numericLiteralFlags & 384 /* BinaryOrOctalSpecifier */) {
return setTextRange(factory2.createNumericLiteral(node.text), node);
}
return node;
}
function visitTaggedTemplateExpression(node) {
return processTaggedTemplateExpression(
context,
node,
visitor,
currentSourceFile,
recordTaggedTemplateString,
1 /* All */
);
}
function visitTemplateExpression(node) {
let expression = factory2.createStringLiteral(node.head.text);
for (const span of node.templateSpans) {
const args = [Debug.checkDefined(visitNode(span.expression, visitor, isExpression))];
if (span.literal.text.length > 0) {
args.push(factory2.createStringLiteral(span.literal.text));
}
expression = factory2.createCallExpression(
factory2.createPropertyAccessExpression(expression, "concat"),
/*typeArguments*/
void 0,
args
);
}
return setTextRange(expression, node);
}
function visitSuperKeyword(isExpressionOfCall) {
return hierarchyFacts & 8 /* NonStaticClassElement */ && !isExpressionOfCall ? factory2.createPropertyAccessExpression(factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */), "prototype") : factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */);
}
function visitMetaProperty(node) {
if (node.keywordToken === 105 /* NewKeyword */ && node.name.escapedText === "target") {
hierarchyFacts |= 32768 /* NewTarget */;
return factory2.createUniqueName("_newTarget", 16 /* Optimistic */ | 32 /* FileLevel */);
}
return node;
}
function onEmitNode(hint, node, emitCallback) {
if (enabledSubstitutions & 1 /* CapturedThis */ && isFunctionLike(node)) {
const ancestorFacts = enterSubtree(
32670 /* FunctionExcludes */,
getEmitFlags(node) & 16 /* CapturesThis */ ? 65 /* FunctionIncludes */ | 16 /* CapturesThis */ : 65 /* FunctionIncludes */
);
previousOnEmitNode(hint, node, emitCallback);
exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
return;
}
previousOnEmitNode(hint, node, emitCallback);
}
function enableSubstitutionsForBlockScopedBindings() {
if ((enabledSubstitutions & 2 /* BlockScopedBindings */) === 0) {
enabledSubstitutions |= 2 /* BlockScopedBindings */;
context.enableSubstitution(80 /* Identifier */);
}
}
function enableSubstitutionsForCapturedThis() {
if ((enabledSubstitutions & 1 /* CapturedThis */) === 0) {
enabledSubstitutions |= 1 /* CapturedThis */;
context.enableSubstitution(110 /* ThisKeyword */);
context.enableEmitNotification(175 /* Constructor */);
context.enableEmitNotification(173 /* MethodDeclaration */);
context.enableEmitNotification(176 /* GetAccessor */);
context.enableEmitNotification(177 /* SetAccessor */);
context.enableEmitNotification(218 /* ArrowFunction */);
context.enableEmitNotification(217 /* FunctionExpression */);
context.enableEmitNotification(261 /* FunctionDeclaration */);
}
}
function onSubstituteNode(hint, node) {
node = previousOnSubstituteNode(hint, node);
if (hint === 1 /* Expression */) {
return substituteExpression(node);
}
if (isIdentifier(node)) {
return substituteIdentifier(node);
}
return node;
}
function substituteIdentifier(node) {
if (enabledSubstitutions & 2 /* BlockScopedBindings */ && !isInternalName(node)) {
const original = getParseTreeNode(node, isIdentifier);
if (original && isNameOfDeclarationWithCollidingName(original)) {
return setTextRange(factory2.getGeneratedNameForNode(original), node);
}
}
return node;
}
function isNameOfDeclarationWithCollidingName(node) {
switch (node.parent.kind) {
case 207 /* BindingElement */:
case 262 /* ClassDeclaration */:
case 265 /* EnumDeclaration */:
case 259 /* VariableDeclaration */:
return node.parent.name === node && resolver.isDeclarationWithCollidingName(node.parent);
}
return false;
}
function substituteExpression(node) {
switch (node.kind) {
case 80 /* Identifier */:
return substituteExpressionIdentifier(node);
case 110 /* ThisKeyword */:
return substituteThisKeyword(node);
}
return node;
}
function substituteExpressionIdentifier(node) {
if (enabledSubstitutions & 2 /* BlockScopedBindings */ && !isInternalName(node)) {
const declaration = resolver.getReferencedDeclarationWithCollidingName(node);
if (declaration && !(isClassLike(declaration) && isPartOfClassBody(declaration, node))) {
return setTextRange(factory2.getGeneratedNameForNode(getNameOfDeclaration(declaration)), node);
}
}
return node;
}
function isPartOfClassBody(declaration, node) {
let currentNode = getParseTreeNode(node);
if (!currentNode || currentNode === declaration || currentNode.end <= declaration.pos || currentNode.pos >= declaration.end) {
return false;
}
const blockScope = getEnclosingBlockScopeContainer(declaration);
while (currentNode) {
if (currentNode === blockScope || currentNode === declaration) {
return false;
}
if (isClassElement(currentNode) && currentNode.parent === declaration) {
return true;
}
currentNode = currentNode.parent;
}
return false;
}
function substituteThisKeyword(node) {
if (enabledSubstitutions & 1 /* CapturedThis */ && hierarchyFacts & 16 /* CapturesThis */) {
return setTextRange(factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */), node);
}
return node;
}
function getClassMemberPrefix(node, member) {
return isStatic(member) ? factory2.getInternalName(node) : factory2.createPropertyAccessExpression(factory2.getInternalName(node), "prototype");
}
function hasSynthesizedDefaultSuperCall(constructor, hasExtendsClause) {
if (!constructor || !hasExtendsClause) {
return false;
}
if (some(constructor.parameters)) {
return false;
}
const statement = firstOrUndefined(constructor.body.statements);
if (!statement || !nodeIsSynthesized(statement) || statement.kind !== 243 /* ExpressionStatement */) {
return false;
}
const statementExpression = statement.expression;
if (!nodeIsSynthesized(statementExpression) || statementExpression.kind !== 212 /* CallExpression */) {
return false;
}
const callTarget = statementExpression.expression;
if (!nodeIsSynthesized(callTarget) || callTarget.kind !== 108 /* SuperKeyword */) {
return false;
}
const callArgument = singleOrUndefined(statementExpression.arguments);
if (!callArgument || !nodeIsSynthesized(callArgument) || callArgument.kind !== 229 /* SpreadElement */) {
return false;
}
const expression = callArgument.expression;
return isIdentifier(expression) && expression.escapedText === "arguments";
}
}
// src/compiler/transformers/es5.ts
function transformES5(context) {
const { factory: factory2 } = context;
const compilerOptions = context.getCompilerOptions();
let previousOnEmitNode;
let noSubstitution;
if (compilerOptions.jsx === 1 /* Preserve */ || compilerOptions.jsx === 3 /* ReactNative */) {
previousOnEmitNode = context.onEmitNode;
context.onEmitNode = onEmitNode;
context.enableEmitNotification(285 /* JsxOpeningElement */);
context.enableEmitNotification(286 /* JsxClosingElement */);
context.enableEmitNotification(284 /* JsxSelfClosingElement */);
noSubstitution = [];
}
const previousOnSubstituteNode = context.onSubstituteNode;
context.onSubstituteNode = onSubstituteNode;
context.enableSubstitution(210 /* PropertyAccessExpression */);
context.enableSubstitution(302 /* PropertyAssignment */);
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
return node;
}
function onEmitNode(hint, node, emitCallback) {
switch (node.kind) {
case 285 /* JsxOpeningElement */:
case 286 /* JsxClosingElement */:
case 284 /* JsxSelfClosingElement */:
const tagName = node.tagName;
noSubstitution[getOriginalNodeId(tagName)] = true;
break;
}
previousOnEmitNode(hint, node, emitCallback);
}
function onSubstituteNode(hint, node) {
if (node.id && noSubstitution && noSubstitution[node.id]) {
return previousOnSubstituteNode(hint, node);
}
node = previousOnSubstituteNode(hint, node);
if (isPropertyAccessExpression(node)) {
return substitutePropertyAccessExpression(node);
} else if (isPropertyAssignment(node)) {
return substitutePropertyAssignment(node);
}
return node;
}
function substitutePropertyAccessExpression(node) {
if (isPrivateIdentifier(node.name)) {
return node;
}
const literalName = trySubstituteReservedName(node.name);
if (literalName) {
return setTextRange(factory2.createElementAccessExpression(node.expression, literalName), node);
}
return node;
}
function substitutePropertyAssignment(node) {
const literalName = isIdentifier(node.name) && trySubstituteReservedName(node.name);
if (literalName) {
return factory2.updatePropertyAssignment(node, literalName, node.initializer);
}
return node;
}
function trySubstituteReservedName(name) {
const token = identifierToKeywordKind(name);
if (token !== void 0 && token >= 83 /* FirstReservedWord */ && token <= 118 /* LastReservedWord */) {
return setTextRange(factory2.createStringLiteralFromNode(name), name);
}
return void 0;
}
}
// src/compiler/transformers/generators.ts
function getInstructionName(instruction) {
switch (instruction) {
case 2 /* Return */:
return "return";
case 3 /* Break */:
return "break";
case 4 /* Yield */:
return "yield";
case 5 /* YieldStar */:
return "yield*";
case 7 /* Endfinally */:
return "endfinally";
default:
return void 0;
}
}
function transformGenerators(context) {
const {
factory: factory2,
getEmitHelperFactory: emitHelpers,
resumeLexicalEnvironment,
endLexicalEnvironment,
hoistFunctionDeclaration,
hoistVariableDeclaration
} = context;
const compilerOptions = context.getCompilerOptions();
const languageVersion = getEmitScriptTarget(compilerOptions);
const resolver = context.getEmitResolver();
const previousOnSubstituteNode = context.onSubstituteNode;
context.onSubstituteNode = onSubstituteNode;
let renamedCatchVariables;
let renamedCatchVariableDeclarations;
let inGeneratorFunctionBody;
let inStatementContainingYield;
let blocks;
let blockOffsets;
let blockActions;
let blockStack;
let labelOffsets;
let labelExpressions;
let nextLabelId = 1;
let operations;
let operationArguments;
let operationLocations;
let state;
let blockIndex = 0;
let labelNumber = 0;
let labelNumbers;
let lastOperationWasAbrupt;
let lastOperationWasCompletion;
let clauses;
let statements;
let exceptionBlockStack;
let currentExceptionBlock;
let withBlockStack;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
if (node.isDeclarationFile || (node.transformFlags & 2048 /* ContainsGenerator */) === 0) {
return node;
}
const visited = visitEachChild(node, visitor, context);
addEmitHelpers(visited, context.readEmitHelpers());
return visited;
}
function visitor(node) {
const transformFlags = node.transformFlags;
if (inStatementContainingYield) {
return visitJavaScriptInStatementContainingYield(node);
} else if (inGeneratorFunctionBody) {
return visitJavaScriptInGeneratorFunctionBody(node);
} else if (isFunctionLikeDeclaration(node) && node.asteriskToken) {
return visitGenerator(node);
} else if (transformFlags & 2048 /* ContainsGenerator */) {
return visitEachChild(node, visitor, context);
} else {
return node;
}
}
function visitJavaScriptInStatementContainingYield(node) {
switch (node.kind) {
case 245 /* DoStatement */:
return visitDoStatement(node);
case 246 /* WhileStatement */:
return visitWhileStatement(node);
case 254 /* SwitchStatement */:
return visitSwitchStatement(node);
case 255 /* LabeledStatement */:
return visitLabeledStatement(node);
default:
return visitJavaScriptInGeneratorFunctionBody(node);
}
}
function visitJavaScriptInGeneratorFunctionBody(node) {
switch (node.kind) {
case 261 /* FunctionDeclaration */:
return visitFunctionDeclaration(node);
case 217 /* FunctionExpression */:
return visitFunctionExpression(node);
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return visitAccessorDeclaration(node);
case 242 /* VariableStatement */:
return visitVariableStatement(node);
case 247 /* ForStatement */:
return visitForStatement(node);
case 248 /* ForInStatement */:
return visitForInStatement(node);
case 251 /* BreakStatement */:
return visitBreakStatement(node);
case 250 /* ContinueStatement */:
return visitContinueStatement(node);
case 252 /* ReturnStatement */:
return visitReturnStatement(node);
default:
if (node.transformFlags & 1048576 /* ContainsYield */) {
return visitJavaScriptContainingYield(node);
} else if (node.transformFlags & (2048 /* ContainsGenerator */ | 4194304 /* ContainsHoistedDeclarationOrCompletion */)) {
return visitEachChild(node, visitor, context);
} else {
return node;
}
}
}
function visitJavaScriptContainingYield(node) {
switch (node.kind) {
case 225 /* BinaryExpression */:
return visitBinaryExpression(node);
case 360 /* CommaListExpression */:
return visitCommaListExpression(node);
case 226 /* ConditionalExpression */:
return visitConditionalExpression(node);
case 228 /* YieldExpression */:
return visitYieldExpression(node);
case 208 /* ArrayLiteralExpression */:
return visitArrayLiteralExpression(node);
case 209 /* ObjectLiteralExpression */:
return visitObjectLiteralExpression(node);
case 211 /* ElementAccessExpression */:
return visitElementAccessExpression(node);
case 212 /* CallExpression */:
return visitCallExpression(node);
case 213 /* NewExpression */:
return visitNewExpression(node);
default:
return visitEachChild(node, visitor, context);
}
}
function visitGenerator(node) {
switch (node.kind) {
case 261 /* FunctionDeclaration */:
return visitFunctionDeclaration(node);
case 217 /* FunctionExpression */:
return visitFunctionExpression(node);
default:
return Debug.failBadSyntaxKind(node);
}
}
function visitFunctionDeclaration(node) {
if (node.asteriskToken) {
node = setOriginalNode(
setTextRange(
factory2.createFunctionDeclaration(
node.modifiers,
/*asteriskToken*/
void 0,
node.name,
/*typeParameters*/
void 0,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
transformGeneratorFunctionBody(node.body)
),
/*location*/
node
),
node
);
} else {
const savedInGeneratorFunctionBody = inGeneratorFunctionBody;
const savedInStatementContainingYield = inStatementContainingYield;
inGeneratorFunctionBody = false;
inStatementContainingYield = false;
node = visitEachChild(node, visitor, context);
inGeneratorFunctionBody = savedInGeneratorFunctionBody;
inStatementContainingYield = savedInStatementContainingYield;
}
if (inGeneratorFunctionBody) {
hoistFunctionDeclaration(node);
return void 0;
} else {
return node;
}
}
function visitFunctionExpression(node) {
if (node.asteriskToken) {
node = setOriginalNode(
setTextRange(
factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
node.name,
/*typeParameters*/
void 0,
visitParameterList(node.parameters, visitor, context),
/*type*/
void 0,
transformGeneratorFunctionBody(node.body)
),
/*location*/
node
),
node
);
} else {
const savedInGeneratorFunctionBody = inGeneratorFunctionBody;
const savedInStatementContainingYield = inStatementContainingYield;
inGeneratorFunctionBody = false;
inStatementContainingYield = false;
node = visitEachChild(node, visitor, context);
inGeneratorFunctionBody = savedInGeneratorFunctionBody;
inStatementContainingYield = savedInStatementContainingYield;
}
return node;
}
function visitAccessorDeclaration(node) {
const savedInGeneratorFunctionBody = inGeneratorFunctionBody;
const savedInStatementContainingYield = inStatementContainingYield;
inGeneratorFunctionBody = false;
inStatementContainingYield = false;
node = visitEachChild(node, visitor, context);
inGeneratorFunctionBody = savedInGeneratorFunctionBody;
inStatementContainingYield = savedInStatementContainingYield;
return node;
}
function transformGeneratorFunctionBody(body) {
const statements2 = [];
const savedInGeneratorFunctionBody = inGeneratorFunctionBody;
const savedInStatementContainingYield = inStatementContainingYield;
const savedBlocks = blocks;
const savedBlockOffsets = blockOffsets;
const savedBlockActions = blockActions;
const savedBlockStack = blockStack;
const savedLabelOffsets = labelOffsets;
const savedLabelExpressions = labelExpressions;
const savedNextLabelId = nextLabelId;
const savedOperations = operations;
const savedOperationArguments = operationArguments;
const savedOperationLocations = operationLocations;
const savedState = state;
inGeneratorFunctionBody = true;
inStatementContainingYield = false;
blocks = void 0;
blockOffsets = void 0;
blockActions = void 0;
blockStack = void 0;
labelOffsets = void 0;
labelExpressions = void 0;
nextLabelId = 1;
operations = void 0;
operationArguments = void 0;
operationLocations = void 0;
state = factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
resumeLexicalEnvironment();
const statementOffset = factory2.copyPrologue(
body.statements,
statements2,
/*ensureUseStrict*/
false,
visitor
);
transformAndEmitStatements(body.statements, statementOffset);
const buildResult = build2();
insertStatementsAfterStandardPrologue(statements2, endLexicalEnvironment());
statements2.push(factory2.createReturnStatement(buildResult));
inGeneratorFunctionBody = savedInGeneratorFunctionBody;
inStatementContainingYield = savedInStatementContainingYield;
blocks = savedBlocks;
blockOffsets = savedBlockOffsets;
blockActions = savedBlockActions;
blockStack = savedBlockStack;
labelOffsets = savedLabelOffsets;
labelExpressions = savedLabelExpressions;
nextLabelId = savedNextLabelId;
operations = savedOperations;
operationArguments = savedOperationArguments;
operationLocations = savedOperationLocations;
state = savedState;
return setTextRange(factory2.createBlock(statements2, body.multiLine), body);
}
function visitVariableStatement(node) {
if (node.transformFlags & 1048576 /* ContainsYield */) {
transformAndEmitVariableDeclarationList(node.declarationList);
return void 0;
} else {
if (getEmitFlags(node) & 2097152 /* CustomPrologue */) {
return node;
}
for (const variable of node.declarationList.declarations) {
hoistVariableDeclaration(variable.name);
}
const variables = getInitializedVariables(node.declarationList);
if (variables.length === 0) {
return void 0;
}
return setSourceMapRange(
factory2.createExpressionStatement(
factory2.inlineExpressions(
map(variables, transformInitializedVariable)
)
),
node
);
}
}
function visitBinaryExpression(node) {
const assoc = getExpressionAssociativity(node);
switch (assoc) {
case 0 /* Left */:
return visitLeftAssociativeBinaryExpression(node);
case 1 /* Right */:
return visitRightAssociativeBinaryExpression(node);
default:
return Debug.assertNever(assoc);
}
}
function visitRightAssociativeBinaryExpression(node) {
const { left, right } = node;
if (containsYield(right)) {
let target;
switch (left.kind) {
case 210 /* PropertyAccessExpression */:
target = factory2.updatePropertyAccessExpression(
left,
cacheExpression(Debug.checkDefined(visitNode(left.expression, visitor, isLeftHandSideExpression))),
left.name
);
break;
case 211 /* ElementAccessExpression */:
target = factory2.updateElementAccessExpression(
left,
cacheExpression(Debug.checkDefined(visitNode(left.expression, visitor, isLeftHandSideExpression))),
cacheExpression(Debug.checkDefined(visitNode(left.argumentExpression, visitor, isExpression)))
);
break;
default:
target = Debug.checkDefined(visitNode(left, visitor, isExpression));
break;
}
const operator = node.operatorToken.kind;
if (isCompoundAssignment(operator)) {
return setTextRange(
factory2.createAssignment(
target,
setTextRange(
factory2.createBinaryExpression(
cacheExpression(target),
getNonAssignmentOperatorForCompoundAssignment(operator),
Debug.checkDefined(visitNode(right, visitor, isExpression))
),
node
)
),
node
);
} else {
return factory2.updateBinaryExpression(node, target, node.operatorToken, Debug.checkDefined(visitNode(right, visitor, isExpression)));
}
}
return visitEachChild(node, visitor, context);
}
function visitLeftAssociativeBinaryExpression(node) {
if (containsYield(node.right)) {
if (isLogicalOperator(node.operatorToken.kind)) {
return visitLogicalBinaryExpression(node);
} else if (node.operatorToken.kind === 28 /* CommaToken */) {
return visitCommaExpression(node);
}
return factory2.updateBinaryExpression(
node,
cacheExpression(Debug.checkDefined(visitNode(node.left, visitor, isExpression))),
node.operatorToken,
Debug.checkDefined(visitNode(node.right, visitor, isExpression))
);
}
return visitEachChild(node, visitor, context);
}
function visitCommaExpression(node) {
let pendingExpressions = [];
visit(node.left);
visit(node.right);
return factory2.inlineExpressions(pendingExpressions);
function visit(node2) {
if (isBinaryExpression(node2) && node2.operatorToken.kind === 28 /* CommaToken */) {
visit(node2.left);
visit(node2.right);
} else {
if (containsYield(node2) && pendingExpressions.length > 0) {
emitWorker(1 /* Statement */, [factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions))]);
pendingExpressions = [];
}
pendingExpressions.push(Debug.checkDefined(visitNode(node2, visitor, isExpression)));
}
}
}
function visitCommaListExpression(node) {
let pendingExpressions = [];
for (const elem of node.elements) {
if (isBinaryExpression(elem) && elem.operatorToken.kind === 28 /* CommaToken */) {
pendingExpressions.push(visitCommaExpression(elem));
} else {
if (containsYield(elem) && pendingExpressions.length > 0) {
emitWorker(1 /* Statement */, [factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions))]);
pendingExpressions = [];
}
pendingExpressions.push(Debug.checkDefined(visitNode(elem, visitor, isExpression)));
}
}
return factory2.inlineExpressions(pendingExpressions);
}
function visitLogicalBinaryExpression(node) {
const resultLabel = defineLabel();
const resultLocal = declareLocal();
emitAssignment(
resultLocal,
Debug.checkDefined(visitNode(node.left, visitor, isExpression)),
/*location*/
node.left
);
if (node.operatorToken.kind === 56 /* AmpersandAmpersandToken */) {
emitBreakWhenFalse(
resultLabel,
resultLocal,
/*location*/
node.left
);
} else {
emitBreakWhenTrue(
resultLabel,
resultLocal,
/*location*/
node.left
);
}
emitAssignment(
resultLocal,
Debug.checkDefined(visitNode(node.right, visitor, isExpression)),
/*location*/
node.right
);
markLabel(resultLabel);
return resultLocal;
}
function visitConditionalExpression(node) {
if (containsYield(node.whenTrue) || containsYield(node.whenFalse)) {
const whenFalseLabel = defineLabel();
const resultLabel = defineLabel();
const resultLocal = declareLocal();
emitBreakWhenFalse(
whenFalseLabel,
Debug.checkDefined(visitNode(node.condition, visitor, isExpression)),
/*location*/
node.condition
);
emitAssignment(
resultLocal,
Debug.checkDefined(visitNode(node.whenTrue, visitor, isExpression)),
/*location*/
node.whenTrue
);
emitBreak(resultLabel);
markLabel(whenFalseLabel);
emitAssignment(
resultLocal,
Debug.checkDefined(visitNode(node.whenFalse, visitor, isExpression)),
/*location*/
node.whenFalse
);
markLabel(resultLabel);
return resultLocal;
}
return visitEachChild(node, visitor, context);
}
function visitYieldExpression(node) {
const resumeLabel = defineLabel();
const expression = visitNode(node.expression, visitor, isExpression);
if (node.asteriskToken) {
const iterator = (getEmitFlags(node.expression) & 8388608 /* Iterator */) === 0 ? setTextRange(emitHelpers().createValuesHelper(expression), node) : expression;
emitYieldStar(
iterator,
/*location*/
node
);
} else {
emitYield(
expression,
/*location*/
node
);
}
markLabel(resumeLabel);
return createGeneratorResume(
/*location*/
node
);
}
function visitArrayLiteralExpression(node) {
return visitElements(
node.elements,
/*leadingElement*/
void 0,
/*location*/
void 0,
node.multiLine
);
}
function visitElements(elements, leadingElement, location, multiLine) {
const numInitialElements = countInitialNodesWithoutYield(elements);
let temp;
if (numInitialElements > 0) {
temp = declareLocal();
const initialElements = visitNodes2(elements, visitor, isExpression, 0, numInitialElements);
emitAssignment(
temp,
factory2.createArrayLiteralExpression(
leadingElement ? [leadingElement, ...initialElements] : initialElements
)
);
leadingElement = void 0;
}
const expressions = reduceLeft(elements, reduceElement, [], numInitialElements);
return temp ? factory2.createArrayConcatCall(temp, [factory2.createArrayLiteralExpression(expressions, multiLine)]) : setTextRange(
factory2.createArrayLiteralExpression(leadingElement ? [leadingElement, ...expressions] : expressions, multiLine),
location
);
function reduceElement(expressions2, element) {
if (containsYield(element) && expressions2.length > 0) {
const hasAssignedTemp = temp !== void 0;
if (!temp) {
temp = declareLocal();
}
emitAssignment(
temp,
hasAssignedTemp ? factory2.createArrayConcatCall(
temp,
[factory2.createArrayLiteralExpression(expressions2, multiLine)]
) : factory2.createArrayLiteralExpression(
leadingElement ? [leadingElement, ...expressions2] : expressions2,
multiLine
)
);
leadingElement = void 0;
expressions2 = [];
}
expressions2.push(Debug.checkDefined(visitNode(element, visitor, isExpression)));
return expressions2;
}
}
function visitObjectLiteralExpression(node) {
const properties = node.properties;
const multiLine = node.multiLine;
const numInitialProperties = countInitialNodesWithoutYield(properties);
const temp = declareLocal();
emitAssignment(
temp,
factory2.createObjectLiteralExpression(
visitNodes2(properties, visitor, isObjectLiteralElementLike, 0, numInitialProperties),
multiLine
)
);
const expressions = reduceLeft(properties, reduceProperty, [], numInitialProperties);
expressions.push(multiLine ? startOnNewLine(setParent(setTextRange(factory2.cloneNode(temp), temp), temp.parent)) : temp);
return factory2.inlineExpressions(expressions);
function reduceProperty(expressions2, property) {
if (containsYield(property) && expressions2.length > 0) {
emitStatement(factory2.createExpressionStatement(factory2.inlineExpressions(expressions2)));
expressions2 = [];
}
const expression = createExpressionForObjectLiteralElementLike(factory2, node, property, temp);
const visited = visitNode(expression, visitor, isExpression);
if (visited) {
if (multiLine) {
startOnNewLine(visited);
}
expressions2.push(visited);
}
return expressions2;
}
}
function visitElementAccessExpression(node) {
if (containsYield(node.argumentExpression)) {
return factory2.updateElementAccessExpression(
node,
cacheExpression(Debug.checkDefined(visitNode(node.expression, visitor, isLeftHandSideExpression))),
Debug.checkDefined(visitNode(node.argumentExpression, visitor, isExpression))
);
}
return visitEachChild(node, visitor, context);
}
function visitCallExpression(node) {
if (!isImportCall(node) && forEach(node.arguments, containsYield)) {
const { target, thisArg } = factory2.createCallBinding(
node.expression,
hoistVariableDeclaration,
languageVersion,
/*cacheIdentifiers*/
true
);
return setOriginalNode(
setTextRange(
factory2.createFunctionApplyCall(
cacheExpression(Debug.checkDefined(visitNode(target, visitor, isLeftHandSideExpression))),
thisArg,
visitElements(node.arguments)
),
node
),
node
);
}
return visitEachChild(node, visitor, context);
}
function visitNewExpression(node) {
if (forEach(node.arguments, containsYield)) {
const { target, thisArg } = factory2.createCallBinding(factory2.createPropertyAccessExpression(node.expression, "bind"), hoistVariableDeclaration);
return setOriginalNode(
setTextRange(
factory2.createNewExpression(
factory2.createFunctionApplyCall(
cacheExpression(Debug.checkDefined(visitNode(target, visitor, isExpression))),
thisArg,
visitElements(
node.arguments,
/*leadingElement*/
factory2.createVoidZero()
)
),
/*typeArguments*/
void 0,
[]
),
node
),
node
);
}
return visitEachChild(node, visitor, context);
}
function transformAndEmitStatements(statements2, start = 0) {
const numStatements = statements2.length;
for (let i = start; i < numStatements; i++) {
transformAndEmitStatement(statements2[i]);
}
}
function transformAndEmitEmbeddedStatement(node) {
if (isBlock(node)) {
transformAndEmitStatements(node.statements);
} else {
transformAndEmitStatement(node);
}
}
function transformAndEmitStatement(node) {
const savedInStatementContainingYield = inStatementContainingYield;
if (!inStatementContainingYield) {
inStatementContainingYield = containsYield(node);
}
transformAndEmitStatementWorker(node);
inStatementContainingYield = savedInStatementContainingYield;
}
function transformAndEmitStatementWorker(node) {
switch (node.kind) {
case 240 /* Block */:
return transformAndEmitBlock(node);
case 243 /* ExpressionStatement */:
return transformAndEmitExpressionStatement(node);
case 244 /* IfStatement */:
return transformAndEmitIfStatement(node);
case 245 /* DoStatement */:
return transformAndEmitDoStatement(node);
case 246 /* WhileStatement */:
return transformAndEmitWhileStatement(node);
case 247 /* ForStatement */:
return transformAndEmitForStatement(node);
case 248 /* ForInStatement */:
return transformAndEmitForInStatement(node);
case 250 /* ContinueStatement */:
return transformAndEmitContinueStatement(node);
case 251 /* BreakStatement */:
return transformAndEmitBreakStatement(node);
case 252 /* ReturnStatement */:
return transformAndEmitReturnStatement(node);
case 253 /* WithStatement */:
return transformAndEmitWithStatement(node);
case 254 /* SwitchStatement */:
return transformAndEmitSwitchStatement(node);
case 255 /* LabeledStatement */:
return transformAndEmitLabeledStatement(node);
case 256 /* ThrowStatement */:
return transformAndEmitThrowStatement(node);
case 257 /* TryStatement */:
return transformAndEmitTryStatement(node);
default:
return emitStatement(visitNode(node, visitor, isStatement));
}
}
function transformAndEmitBlock(node) {
if (containsYield(node)) {
transformAndEmitStatements(node.statements);
} else {
emitStatement(visitNode(node, visitor, isStatement));
}
}
function transformAndEmitExpressionStatement(node) {
emitStatement(visitNode(node, visitor, isStatement));
}
function transformAndEmitVariableDeclarationList(node) {
for (const variable of node.declarations) {
const name = factory2.cloneNode(variable.name);
setCommentRange(name, variable.name);
hoistVariableDeclaration(name);
}
const variables = getInitializedVariables(node);
const numVariables = variables.length;
let variablesWritten = 0;
let pendingExpressions = [];
while (variablesWritten < numVariables) {
for (let i = variablesWritten; i < numVariables; i++) {
const variable = variables[i];
if (containsYield(variable.initializer) && pendingExpressions.length > 0) {
break;
}
pendingExpressions.push(transformInitializedVariable(variable));
}
if (pendingExpressions.length) {
emitStatement(factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions)));
variablesWritten += pendingExpressions.length;
pendingExpressions = [];
}
}
return void 0;
}
function transformInitializedVariable(node) {
return setSourceMapRange(
factory2.createAssignment(
setSourceMapRange(factory2.cloneNode(node.name), node.name),
Debug.checkDefined(visitNode(node.initializer, visitor, isExpression))
),
node
);
}
function transformAndEmitIfStatement(node) {
if (containsYield(node)) {
if (containsYield(node.thenStatement) || containsYield(node.elseStatement)) {
const endLabel = defineLabel();
const elseLabel = node.elseStatement ? defineLabel() : void 0;
emitBreakWhenFalse(
node.elseStatement ? elseLabel : endLabel,
Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
/*location*/
node.expression
);
transformAndEmitEmbeddedStatement(node.thenStatement);
if (node.elseStatement) {
emitBreak(endLabel);
markLabel(elseLabel);
transformAndEmitEmbeddedStatement(node.elseStatement);
}
markLabel(endLabel);
} else {
emitStatement(visitNode(node, visitor, isStatement));
}
} else {
emitStatement(visitNode(node, visitor, isStatement));
}
}
function transformAndEmitDoStatement(node) {
if (containsYield(node)) {
const conditionLabel = defineLabel();
const loopLabel = defineLabel();
beginLoopBlock(
/*continueLabel*/
conditionLabel
);
markLabel(loopLabel);
transformAndEmitEmbeddedStatement(node.statement);
markLabel(conditionLabel);
emitBreakWhenTrue(loopLabel, Debug.checkDefined(visitNode(node.expression, visitor, isExpression)));
endLoopBlock();
} else {
emitStatement(visitNode(node, visitor, isStatement));
}
}
function visitDoStatement(node) {
if (inStatementContainingYield) {
beginScriptLoopBlock();
node = visitEachChild(node, visitor, context);
endLoopBlock();
return node;
} else {
return visitEachChild(node, visitor, context);
}
}
function transformAndEmitWhileStatement(node) {
if (containsYield(node)) {
const loopLabel = defineLabel();
const endLabel = beginLoopBlock(loopLabel);
markLabel(loopLabel);
emitBreakWhenFalse(endLabel, Debug.checkDefined(visitNode(node.expression, visitor, isExpression)));
transformAndEmitEmbeddedStatement(node.statement);
emitBreak(loopLabel);
endLoopBlock();
} else {
emitStatement(visitNode(node, visitor, isStatement));
}
}
function visitWhileStatement(node) {
if (inStatementContainingYield) {
beginScriptLoopBlock();
node = visitEachChild(node, visitor, context);
endLoopBlock();
return node;
} else {
return visitEachChild(node, visitor, context);
}
}
function transformAndEmitForStatement(node) {
if (containsYield(node)) {
const conditionLabel = defineLabel();
const incrementLabel = defineLabel();
const endLabel = beginLoopBlock(incrementLabel);
if (node.initializer) {
const initializer = node.initializer;
if (isVariableDeclarationList(initializer)) {
transformAndEmitVariableDeclarationList(initializer);
} else {
emitStatement(
setTextRange(
factory2.createExpressionStatement(
Debug.checkDefined(visitNode(initializer, visitor, isExpression))
),
initializer
)
);
}
}
markLabel(conditionLabel);
if (node.condition) {
emitBreakWhenFalse(endLabel, Debug.checkDefined(visitNode(node.condition, visitor, isExpression)));
}
transformAndEmitEmbeddedStatement(node.statement);
markLabel(incrementLabel);
if (node.incrementor) {
emitStatement(
setTextRange(
factory2.createExpressionStatement(
Debug.checkDefined(visitNode(node.incrementor, visitor, isExpression))
),
node.incrementor
)
);
}
emitBreak(conditionLabel);
endLoopBlock();
} else {
emitStatement(visitNode(node, visitor, isStatement));
}
}
function visitForStatement(node) {
if (inStatementContainingYield) {
beginScriptLoopBlock();
}
const initializer = node.initializer;
if (initializer && isVariableDeclarationList(initializer)) {
for (const variable of initializer.declarations) {
hoistVariableDeclaration(variable.name);
}
const variables = getInitializedVariables(initializer);
node = factory2.updateForStatement(
node,
variables.length > 0 ? factory2.inlineExpressions(map(variables, transformInitializedVariable)) : void 0,
visitNode(node.condition, visitor, isExpression),
visitNode(node.incrementor, visitor, isExpression),
visitIterationBody(node.statement, visitor, context)
);
} else {
node = visitEachChild(node, visitor, context);
}
if (inStatementContainingYield) {
endLoopBlock();
}
return node;
}
function transformAndEmitForInStatement(node) {
if (containsYield(node)) {
const obj = declareLocal();
const keysArray = declareLocal();
const key = declareLocal();
const keysIndex = factory2.createLoopVariable();
const initializer = node.initializer;
hoistVariableDeclaration(keysIndex);
emitAssignment(obj, Debug.checkDefined(visitNode(node.expression, visitor, isExpression)));
emitAssignment(keysArray, factory2.createArrayLiteralExpression());
emitStatement(
factory2.createForInStatement(
key,
obj,
factory2.createExpressionStatement(
factory2.createCallExpression(
factory2.createPropertyAccessExpression(keysArray, "push"),
/*typeArguments*/
void 0,
[key]
)
)
)
);
emitAssignment(keysIndex, factory2.createNumericLiteral(0));
const conditionLabel = defineLabel();
const incrementLabel = defineLabel();
const endLoopLabel = beginLoopBlock(incrementLabel);
markLabel(conditionLabel);
emitBreakWhenFalse(endLoopLabel, factory2.createLessThan(keysIndex, factory2.createPropertyAccessExpression(keysArray, "length")));
emitAssignment(key, factory2.createElementAccessExpression(keysArray, keysIndex));
emitBreakWhenFalse(incrementLabel, factory2.createBinaryExpression(key, 103 /* InKeyword */, obj));
let variable;
if (isVariableDeclarationList(initializer)) {
for (const variable2 of initializer.declarations) {
hoistVariableDeclaration(variable2.name);
}
variable = factory2.cloneNode(initializer.declarations[0].name);
} else {
variable = Debug.checkDefined(visitNode(initializer, visitor, isExpression));
Debug.assert(isLeftHandSideExpression(variable));
}
emitAssignment(variable, key);
transformAndEmitEmbeddedStatement(node.statement);
markLabel(incrementLabel);
emitStatement(factory2.createExpressionStatement(factory2.createPostfixIncrement(keysIndex)));
emitBreak(conditionLabel);
endLoopBlock();
} else {
emitStatement(visitNode(node, visitor, isStatement));
}
}
function visitForInStatement(node) {
if (inStatementContainingYield) {
beginScriptLoopBlock();
}
const initializer = node.initializer;
if (isVariableDeclarationList(initializer)) {
for (const variable of initializer.declarations) {
hoistVariableDeclaration(variable.name);
}
node = factory2.updateForInStatement(
node,
initializer.declarations[0].name,
Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
Debug.checkDefined(visitNode(node.statement, visitor, isStatement, factory2.liftToBlock))
);
} else {
node = visitEachChild(node, visitor, context);
}
if (inStatementContainingYield) {
endLoopBlock();
}
return node;
}
function transformAndEmitContinueStatement(node) {
const label = findContinueTarget(node.label ? idText(node.label) : void 0);
if (label > 0) {
emitBreak(
label,
/*location*/
node
);
} else {
emitStatement(node);
}
}
function visitContinueStatement(node) {
if (inStatementContainingYield) {
const label = findContinueTarget(node.label && idText(node.label));
if (label > 0) {
return createInlineBreak(
label,
/*location*/
node
);
}
}
return visitEachChild(node, visitor, context);
}
function transformAndEmitBreakStatement(node) {
const label = findBreakTarget(node.label ? idText(node.label) : void 0);
if (label > 0) {
emitBreak(
label,
/*location*/
node
);
} else {
emitStatement(node);
}
}
function visitBreakStatement(node) {
if (inStatementContainingYield) {
const label = findBreakTarget(node.label && idText(node.label));
if (label > 0) {
return createInlineBreak(
label,
/*location*/
node
);
}
}
return visitEachChild(node, visitor, context);
}
function transformAndEmitReturnStatement(node) {
emitReturn(
visitNode(node.expression, visitor, isExpression),
/*location*/
node
);
}
function visitReturnStatement(node) {
return createInlineReturn(
visitNode(node.expression, visitor, isExpression),
/*location*/
node
);
}
function transformAndEmitWithStatement(node) {
if (containsYield(node)) {
beginWithBlock(cacheExpression(Debug.checkDefined(visitNode(node.expression, visitor, isExpression))));
transformAndEmitEmbeddedStatement(node.statement);
endWithBlock();
} else {
emitStatement(visitNode(node, visitor, isStatement));
}
}
function transformAndEmitSwitchStatement(node) {
if (containsYield(node.caseBlock)) {
const caseBlock = node.caseBlock;
const numClauses = caseBlock.clauses.length;
const endLabel = beginSwitchBlock();
const expression = cacheExpression(Debug.checkDefined(visitNode(node.expression, visitor, isExpression)));
const clauseLabels = [];
let defaultClauseIndex = -1;
for (let i = 0; i < numClauses; i++) {
const clause = caseBlock.clauses[i];
clauseLabels.push(defineLabel());
if (clause.kind === 296 /* DefaultClause */ && defaultClauseIndex === -1) {
defaultClauseIndex = i;
}
}
let clausesWritten = 0;
let pendingClauses = [];
while (clausesWritten < numClauses) {
let defaultClausesSkipped = 0;
for (let i = clausesWritten; i < numClauses; i++) {
const clause = caseBlock.clauses[i];
if (clause.kind === 295 /* CaseClause */) {
if (containsYield(clause.expression) && pendingClauses.length > 0) {
break;
}
pendingClauses.push(
factory2.createCaseClause(
Debug.checkDefined(visitNode(clause.expression, visitor, isExpression)),
[
createInlineBreak(
clauseLabels[i],
/*location*/
clause.expression
)
]
)
);
} else {
defaultClausesSkipped++;
}
}
if (pendingClauses.length) {
emitStatement(factory2.createSwitchStatement(expression, factory2.createCaseBlock(pendingClauses)));
clausesWritten += pendingClauses.length;
pendingClauses = [];
}
if (defaultClausesSkipped > 0) {
clausesWritten += defaultClausesSkipped;
defaultClausesSkipped = 0;
}
}
if (defaultClauseIndex >= 0) {
emitBreak(clauseLabels[defaultClauseIndex]);
} else {
emitBreak(endLabel);
}
for (let i = 0; i < numClauses; i++) {
markLabel(clauseLabels[i]);
transformAndEmitStatements(caseBlock.clauses[i].statements);
}
endSwitchBlock();
} else {
emitStatement(visitNode(node, visitor, isStatement));
}
}
function visitSwitchStatement(node) {
if (inStatementContainingYield) {
beginScriptSwitchBlock();
}
node = visitEachChild(node, visitor, context);
if (inStatementContainingYield) {
endSwitchBlock();
}
return node;
}
function transformAndEmitLabeledStatement(node) {
if (containsYield(node)) {
beginLabeledBlock(idText(node.label));
transformAndEmitEmbeddedStatement(node.statement);
endLabeledBlock();
} else {
emitStatement(visitNode(node, visitor, isStatement));
}
}
function visitLabeledStatement(node) {
if (inStatementContainingYield) {
beginScriptLabeledBlock(idText(node.label));
}
node = visitEachChild(node, visitor, context);
if (inStatementContainingYield) {
endLabeledBlock();
}
return node;
}
function transformAndEmitThrowStatement(node) {
emitThrow(
Debug.checkDefined(visitNode(node.expression ?? factory2.createVoidZero(), visitor, isExpression)),
/*location*/
node
);
}
function transformAndEmitTryStatement(node) {
if (containsYield(node)) {
beginExceptionBlock();
transformAndEmitEmbeddedStatement(node.tryBlock);
if (node.catchClause) {
beginCatchBlock(node.catchClause.variableDeclaration);
transformAndEmitEmbeddedStatement(node.catchClause.block);
}
if (node.finallyBlock) {
beginFinallyBlock();
transformAndEmitEmbeddedStatement(node.finallyBlock);
}
endExceptionBlock();
} else {
emitStatement(visitEachChild(node, visitor, context));
}
}
function containsYield(node) {
return !!node && (node.transformFlags & 1048576 /* ContainsYield */) !== 0;
}
function countInitialNodesWithoutYield(nodes) {
const numNodes = nodes.length;
for (let i = 0; i < numNodes; i++) {
if (containsYield(nodes[i])) {
return i;
}
}
return -1;
}
function onSubstituteNode(hint, node) {
node = previousOnSubstituteNode(hint, node);
if (hint === 1 /* Expression */) {
return substituteExpression(node);
}
return node;
}
function substituteExpression(node) {
if (isIdentifier(node)) {
return substituteExpressionIdentifier(node);
}
return node;
}
function substituteExpressionIdentifier(node) {
if (!isGeneratedIdentifier(node) && renamedCatchVariables && renamedCatchVariables.has(idText(node))) {
const original = getOriginalNode(node);
if (isIdentifier(original) && original.parent) {
const declaration = resolver.getReferencedValueDeclaration(original);
if (declaration) {
const name = renamedCatchVariableDeclarations[getOriginalNodeId(declaration)];
if (name) {
const clone2 = setParent(setTextRange(factory2.cloneNode(name), name), name.parent);
setSourceMapRange(clone2, node);
setCommentRange(clone2, node);
return clone2;
}
}
}
}
return node;
}
function cacheExpression(node) {
if (isGeneratedIdentifier(node) || getEmitFlags(node) & 8192 /* HelperName */) {
return node;
}
const temp = factory2.createTempVariable(hoistVariableDeclaration);
emitAssignment(
temp,
node,
/*location*/
node
);
return temp;
}
function declareLocal(name) {
const temp = name ? factory2.createUniqueName(name) : factory2.createTempVariable(
/*recordTempVariable*/
void 0
);
hoistVariableDeclaration(temp);
return temp;
}
function defineLabel() {
if (!labelOffsets) {
labelOffsets = [];
}
const label = nextLabelId;
nextLabelId++;
labelOffsets[label] = -1;
return label;
}
function markLabel(label) {
Debug.assert(labelOffsets !== void 0, "No labels were defined.");
labelOffsets[label] = operations ? operations.length : 0;
}
function beginBlock(block) {
if (!blocks) {
blocks = [];
blockActions = [];
blockOffsets = [];
blockStack = [];
}
const index = blockActions.length;
blockActions[index] = 0 /* Open */;
blockOffsets[index] = operations ? operations.length : 0;
blocks[index] = block;
blockStack.push(block);
return index;
}
function endBlock() {
const block = peekBlock();
if (block === void 0)
return Debug.fail("beginBlock was never called.");
const index = blockActions.length;
blockActions[index] = 1 /* Close */;
blockOffsets[index] = operations ? operations.length : 0;
blocks[index] = block;
blockStack.pop();
return block;
}
function peekBlock() {
return lastOrUndefined(blockStack);
}
function peekBlockKind() {
const block = peekBlock();
return block && block.kind;
}
function beginWithBlock(expression) {
const startLabel = defineLabel();
const endLabel = defineLabel();
markLabel(startLabel);
beginBlock({
kind: 1 /* With */,
expression,
startLabel,
endLabel
});
}
function endWithBlock() {
Debug.assert(peekBlockKind() === 1 /* With */);
const block = endBlock();
markLabel(block.endLabel);
}
function beginExceptionBlock() {
const startLabel = defineLabel();
const endLabel = defineLabel();
markLabel(startLabel);
beginBlock({
kind: 0 /* Exception */,
state: 0 /* Try */,
startLabel,
endLabel
});
emitNop();
return endLabel;
}
function beginCatchBlock(variable) {
Debug.assert(peekBlockKind() === 0 /* Exception */);
let name;
if (isGeneratedIdentifier(variable.name)) {
name = variable.name;
hoistVariableDeclaration(variable.name);
} else {
const text = idText(variable.name);
name = declareLocal(text);
if (!renamedCatchVariables) {
renamedCatchVariables = /* @__PURE__ */ new Map();
renamedCatchVariableDeclarations = [];
context.enableSubstitution(80 /* Identifier */);
}
renamedCatchVariables.set(text, true);
renamedCatchVariableDeclarations[getOriginalNodeId(variable)] = name;
}
const exception = peekBlock();
Debug.assert(exception.state < 1 /* Catch */);
const endLabel = exception.endLabel;
emitBreak(endLabel);
const catchLabel = defineLabel();
markLabel(catchLabel);
exception.state = 1 /* Catch */;
exception.catchVariable = name;
exception.catchLabel = catchLabel;
emitAssignment(name, factory2.createCallExpression(
factory2.createPropertyAccessExpression(state, "sent"),
/*typeArguments*/
void 0,
[]
));
emitNop();
}
function beginFinallyBlock() {
Debug.assert(peekBlockKind() === 0 /* Exception */);
const exception = peekBlock();
Debug.assert(exception.state < 2 /* Finally */);
const endLabel = exception.endLabel;
emitBreak(endLabel);
const finallyLabel = defineLabel();
markLabel(finallyLabel);
exception.state = 2 /* Finally */;
exception.finallyLabel = finallyLabel;
}
function endExceptionBlock() {
Debug.assert(peekBlockKind() === 0 /* Exception */);
const exception = endBlock();
const state2 = exception.state;
if (state2 < 2 /* Finally */) {
emitBreak(exception.endLabel);
} else {
emitEndfinally();
}
markLabel(exception.endLabel);
emitNop();
exception.state = 3 /* Done */;
}
function beginScriptLoopBlock() {
beginBlock({
kind: 3 /* Loop */,
isScript: true,
breakLabel: -1,
continueLabel: -1
});
}
function beginLoopBlock(continueLabel) {
const breakLabel = defineLabel();
beginBlock({
kind: 3 /* Loop */,
isScript: false,
breakLabel,
continueLabel
});
return breakLabel;
}
function endLoopBlock() {
Debug.assert(peekBlockKind() === 3 /* Loop */);
const block = endBlock();
const breakLabel = block.breakLabel;
if (!block.isScript) {
markLabel(breakLabel);
}
}
function beginScriptSwitchBlock() {
beginBlock({
kind: 2 /* Switch */,
isScript: true,
breakLabel: -1
});
}
function beginSwitchBlock() {
const breakLabel = defineLabel();
beginBlock({
kind: 2 /* Switch */,
isScript: false,
breakLabel
});
return breakLabel;
}
function endSwitchBlock() {
Debug.assert(peekBlockKind() === 2 /* Switch */);
const block = endBlock();
const breakLabel = block.breakLabel;
if (!block.isScript) {
markLabel(breakLabel);
}
}
function beginScriptLabeledBlock(labelText) {
beginBlock({
kind: 4 /* Labeled */,
isScript: true,
labelText,
breakLabel: -1
});
}
function beginLabeledBlock(labelText) {
const breakLabel = defineLabel();
beginBlock({
kind: 4 /* Labeled */,
isScript: false,
labelText,
breakLabel
});
}
function endLabeledBlock() {
Debug.assert(peekBlockKind() === 4 /* Labeled */);
const block = endBlock();
if (!block.isScript) {
markLabel(block.breakLabel);
}
}
function supportsUnlabeledBreak(block) {
return block.kind === 2 /* Switch */ || block.kind === 3 /* Loop */;
}
function supportsLabeledBreakOrContinue(block) {
return block.kind === 4 /* Labeled */;
}
function supportsUnlabeledContinue(block) {
return block.kind === 3 /* Loop */;
}
function hasImmediateContainingLabeledBlock(labelText, start) {
for (let j = start; j >= 0; j--) {
const containingBlock = blockStack[j];
if (supportsLabeledBreakOrContinue(containingBlock)) {
if (containingBlock.labelText === labelText) {
return true;
}
} else {
break;
}
}
return false;
}
function findBreakTarget(labelText) {
if (blockStack) {
if (labelText) {
for (let i = blockStack.length - 1; i >= 0; i--) {
const block = blockStack[i];
if (supportsLabeledBreakOrContinue(block) && block.labelText === labelText) {
return block.breakLabel;
} else if (supportsUnlabeledBreak(block) && hasImmediateContainingLabeledBlock(labelText, i - 1)) {
return block.breakLabel;
}
}
} else {
for (let i = blockStack.length - 1; i >= 0; i--) {
const block = blockStack[i];
if (supportsUnlabeledBreak(block)) {
return block.breakLabel;
}
}
}
}
return 0;
}
function findContinueTarget(labelText) {
if (blockStack) {
if (labelText) {
for (let i = blockStack.length - 1; i >= 0; i--) {
const block = blockStack[i];
if (supportsUnlabeledContinue(block) && hasImmediateContainingLabeledBlock(labelText, i - 1)) {
return block.continueLabel;
}
}
} else {
for (let i = blockStack.length - 1; i >= 0; i--) {
const block = blockStack[i];
if (supportsUnlabeledContinue(block)) {
return block.continueLabel;
}
}
}
}
return 0;
}
function createLabel(label) {
if (label !== void 0 && label > 0) {
if (labelExpressions === void 0) {
labelExpressions = [];
}
const expression = factory2.createNumericLiteral(-1);
if (labelExpressions[label] === void 0) {
labelExpressions[label] = [expression];
} else {
labelExpressions[label].push(expression);
}
return expression;
}
return factory2.createOmittedExpression();
}
function createInstruction(instruction) {
const literal = factory2.createNumericLiteral(instruction);
addSyntheticTrailingComment(literal, 3 /* MultiLineCommentTrivia */, getInstructionName(instruction));
return literal;
}
function createInlineBreak(label, location) {
Debug.assertLessThan(0, label, "Invalid label");
return setTextRange(
factory2.createReturnStatement(
factory2.createArrayLiteralExpression([
createInstruction(3 /* Break */),
createLabel(label)
])
),
location
);
}
function createInlineReturn(expression, location) {
return setTextRange(
factory2.createReturnStatement(
factory2.createArrayLiteralExpression(
expression ? [createInstruction(2 /* Return */), expression] : [createInstruction(2 /* Return */)]
)
),
location
);
}
function createGeneratorResume(location) {
return setTextRange(
factory2.createCallExpression(
factory2.createPropertyAccessExpression(state, "sent"),
/*typeArguments*/
void 0,
[]
),
location
);
}
function emitNop() {
emitWorker(0 /* Nop */);
}
function emitStatement(node) {
if (node) {
emitWorker(1 /* Statement */, [node]);
} else {
emitNop();
}
}
function emitAssignment(left, right, location) {
emitWorker(2 /* Assign */, [left, right], location);
}
function emitBreak(label, location) {
emitWorker(3 /* Break */, [label], location);
}
function emitBreakWhenTrue(label, condition, location) {
emitWorker(4 /* BreakWhenTrue */, [label, condition], location);
}
function emitBreakWhenFalse(label, condition, location) {
emitWorker(5 /* BreakWhenFalse */, [label, condition], location);
}
function emitYieldStar(expression, location) {
emitWorker(7 /* YieldStar */, [expression], location);
}
function emitYield(expression, location) {
emitWorker(6 /* Yield */, [expression], location);
}
function emitReturn(expression, location) {
emitWorker(8 /* Return */, [expression], location);
}
function emitThrow(expression, location) {
emitWorker(9 /* Throw */, [expression], location);
}
function emitEndfinally() {
emitWorker(10 /* Endfinally */);
}
function emitWorker(code, args, location) {
if (operations === void 0) {
operations = [];
operationArguments = [];
operationLocations = [];
}
if (labelOffsets === void 0) {
markLabel(defineLabel());
}
const operationIndex = operations.length;
operations[operationIndex] = code;
operationArguments[operationIndex] = args;
operationLocations[operationIndex] = location;
}
function build2() {
blockIndex = 0;
labelNumber = 0;
labelNumbers = void 0;
lastOperationWasAbrupt = false;
lastOperationWasCompletion = false;
clauses = void 0;
statements = void 0;
exceptionBlockStack = void 0;
currentExceptionBlock = void 0;
withBlockStack = void 0;
const buildResult = buildStatements();
return emitHelpers().createGeneratorHelper(
setEmitFlags(
factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
[factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
state
)],
/*type*/
void 0,
factory2.createBlock(
buildResult,
/*multiLine*/
buildResult.length > 0
)
),
1048576 /* ReuseTempVariableScope */
)
);
}
function buildStatements() {
if (operations) {
for (let operationIndex = 0; operationIndex < operations.length; operationIndex++) {
writeOperation(operationIndex);
}
flushFinalLabel(operations.length);
} else {
flushFinalLabel(0);
}
if (clauses) {
const labelExpression = factory2.createPropertyAccessExpression(state, "label");
const switchStatement = factory2.createSwitchStatement(labelExpression, factory2.createCaseBlock(clauses));
return [startOnNewLine(switchStatement)];
}
if (statements) {
return statements;
}
return [];
}
function flushLabel() {
if (!statements) {
return;
}
appendLabel(
/*markLabelEnd*/
!lastOperationWasAbrupt
);
lastOperationWasAbrupt = false;
lastOperationWasCompletion = false;
labelNumber++;
}
function flushFinalLabel(operationIndex) {
if (isFinalLabelReachable(operationIndex)) {
tryEnterLabel(operationIndex);
withBlockStack = void 0;
writeReturn(
/*expression*/
void 0,
/*operationLocation*/
void 0
);
}
if (statements && clauses) {
appendLabel(
/*markLabelEnd*/
false
);
}
updateLabelExpressions();
}
function isFinalLabelReachable(operationIndex) {
if (!lastOperationWasCompletion) {
return true;
}
if (!labelOffsets || !labelExpressions) {
return false;
}
for (let label = 0; label < labelOffsets.length; label++) {
if (labelOffsets[label] === operationIndex && labelExpressions[label]) {
return true;
}
}
return false;
}
function appendLabel(markLabelEnd) {
if (!clauses) {
clauses = [];
}
if (statements) {
if (withBlockStack) {
for (let i = withBlockStack.length - 1; i >= 0; i--) {
const withBlock = withBlockStack[i];
statements = [factory2.createWithStatement(withBlock.expression, factory2.createBlock(statements))];
}
}
if (currentExceptionBlock) {
const { startLabel, catchLabel, finallyLabel, endLabel } = currentExceptionBlock;
statements.unshift(
factory2.createExpressionStatement(
factory2.createCallExpression(
factory2.createPropertyAccessExpression(factory2.createPropertyAccessExpression(state, "trys"), "push"),
/*typeArguments*/
void 0,
[
factory2.createArrayLiteralExpression([
createLabel(startLabel),
createLabel(catchLabel),
createLabel(finallyLabel),
createLabel(endLabel)
])
]
)
)
);
currentExceptionBlock = void 0;
}
if (markLabelEnd) {
statements.push(
factory2.createExpressionStatement(
factory2.createAssignment(
factory2.createPropertyAccessExpression(state, "label"),
factory2.createNumericLiteral(labelNumber + 1)
)
)
);
}
}
clauses.push(
factory2.createCaseClause(
factory2.createNumericLiteral(labelNumber),
statements || []
)
);
statements = void 0;
}
function tryEnterLabel(operationIndex) {
if (!labelOffsets) {
return;
}
for (let label = 0; label < labelOffsets.length; label++) {
if (labelOffsets[label] === operationIndex) {
flushLabel();
if (labelNumbers === void 0) {
labelNumbers = [];
}
if (labelNumbers[labelNumber] === void 0) {
labelNumbers[labelNumber] = [label];
} else {
labelNumbers[labelNumber].push(label);
}
}
}
}
function updateLabelExpressions() {
if (labelExpressions !== void 0 && labelNumbers !== void 0) {
for (let labelNumber2 = 0; labelNumber2 < labelNumbers.length; labelNumber2++) {
const labels = labelNumbers[labelNumber2];
if (labels !== void 0) {
for (const label of labels) {
const expressions = labelExpressions[label];
if (expressions !== void 0) {
for (const expression of expressions) {
expression.text = String(labelNumber2);
}
}
}
}
}
}
}
function tryEnterOrLeaveBlock(operationIndex) {
if (blocks) {
for (; blockIndex < blockActions.length && blockOffsets[blockIndex] <= operationIndex; blockIndex++) {
const block = blocks[blockIndex];
const blockAction = blockActions[blockIndex];
switch (block.kind) {
case 0 /* Exception */:
if (blockAction === 0 /* Open */) {
if (!exceptionBlockStack) {
exceptionBlockStack = [];
}
if (!statements) {
statements = [];
}
exceptionBlockStack.push(currentExceptionBlock);
currentExceptionBlock = block;
} else if (blockAction === 1 /* Close */) {
currentExceptionBlock = exceptionBlockStack.pop();
}
break;
case 1 /* With */:
if (blockAction === 0 /* Open */) {
if (!withBlockStack) {
withBlockStack = [];
}
withBlockStack.push(block);
} else if (blockAction === 1 /* Close */) {
withBlockStack.pop();
}
break;
}
}
}
}
function writeOperation(operationIndex) {
tryEnterLabel(operationIndex);
tryEnterOrLeaveBlock(operationIndex);
if (lastOperationWasAbrupt) {
return;
}
lastOperationWasAbrupt = false;
lastOperationWasCompletion = false;
const opcode = operations[operationIndex];
if (opcode === 0 /* Nop */) {
return;
} else if (opcode === 10 /* Endfinally */) {
return writeEndfinally();
}
const args = operationArguments[operationIndex];
if (opcode === 1 /* Statement */) {
return writeStatement(args[0]);
}
const location = operationLocations[operationIndex];
switch (opcode) {
case 2 /* Assign */:
return writeAssign(args[0], args[1], location);
case 3 /* Break */:
return writeBreak(args[0], location);
case 4 /* BreakWhenTrue */:
return writeBreakWhenTrue(args[0], args[1], location);
case 5 /* BreakWhenFalse */:
return writeBreakWhenFalse(args[0], args[1], location);
case 6 /* Yield */:
return writeYield(args[0], location);
case 7 /* YieldStar */:
return writeYieldStar(args[0], location);
case 8 /* Return */:
return writeReturn(args[0], location);
case 9 /* Throw */:
return writeThrow(args[0], location);
}
}
function writeStatement(statement) {
if (statement) {
if (!statements) {
statements = [statement];
} else {
statements.push(statement);
}
}
}
function writeAssign(left, right, operationLocation) {
writeStatement(setTextRange(factory2.createExpressionStatement(factory2.createAssignment(left, right)), operationLocation));
}
function writeThrow(expression, operationLocation) {
lastOperationWasAbrupt = true;
lastOperationWasCompletion = true;
writeStatement(setTextRange(factory2.createThrowStatement(expression), operationLocation));
}
function writeReturn(expression, operationLocation) {
lastOperationWasAbrupt = true;
lastOperationWasCompletion = true;
writeStatement(
setEmitFlags(
setTextRange(
factory2.createReturnStatement(
factory2.createArrayLiteralExpression(
expression ? [createInstruction(2 /* Return */), expression] : [createInstruction(2 /* Return */)]
)
),
operationLocation
),
768 /* NoTokenSourceMaps */
)
);
}
function writeBreak(label, operationLocation) {
lastOperationWasAbrupt = true;
writeStatement(
setEmitFlags(
setTextRange(
factory2.createReturnStatement(
factory2.createArrayLiteralExpression([
createInstruction(3 /* Break */),
createLabel(label)
])
),
operationLocation
),
768 /* NoTokenSourceMaps */
)
);
}
function writeBreakWhenTrue(label, condition, operationLocation) {
writeStatement(
setEmitFlags(
factory2.createIfStatement(
condition,
setEmitFlags(
setTextRange(
factory2.createReturnStatement(
factory2.createArrayLiteralExpression([
createInstruction(3 /* Break */),
createLabel(label)
])
),
operationLocation
),
768 /* NoTokenSourceMaps */
)
),
1 /* SingleLine */
)
);
}
function writeBreakWhenFalse(label, condition, operationLocation) {
writeStatement(
setEmitFlags(
factory2.createIfStatement(
factory2.createLogicalNot(condition),
setEmitFlags(
setTextRange(
factory2.createReturnStatement(
factory2.createArrayLiteralExpression([
createInstruction(3 /* Break */),
createLabel(label)
])
),
operationLocation
),
768 /* NoTokenSourceMaps */
)
),
1 /* SingleLine */
)
);
}
function writeYield(expression, operationLocation) {
lastOperationWasAbrupt = true;
writeStatement(
setEmitFlags(
setTextRange(
factory2.createReturnStatement(
factory2.createArrayLiteralExpression(
expression ? [createInstruction(4 /* Yield */), expression] : [createInstruction(4 /* Yield */)]
)
),
operationLocation
),
768 /* NoTokenSourceMaps */
)
);
}
function writeYieldStar(expression, operationLocation) {
lastOperationWasAbrupt = true;
writeStatement(
setEmitFlags(
setTextRange(
factory2.createReturnStatement(
factory2.createArrayLiteralExpression([
createInstruction(5 /* YieldStar */),
expression
])
),
operationLocation
),
768 /* NoTokenSourceMaps */
)
);
}
function writeEndfinally() {
lastOperationWasAbrupt = true;
writeStatement(
factory2.createReturnStatement(
factory2.createArrayLiteralExpression([
createInstruction(7 /* Endfinally */)
])
)
);
}
}
// src/compiler/transformers/module/module.ts
function transformModule(context) {
function getTransformModuleDelegate(moduleKind2) {
switch (moduleKind2) {
case 2 /* AMD */:
return transformAMDModule;
case 3 /* UMD */:
return transformUMDModule;
default:
return transformCommonJSModule;
}
}
const {
factory: factory2,
getEmitHelperFactory: emitHelpers,
startLexicalEnvironment,
endLexicalEnvironment,
hoistVariableDeclaration
} = context;
const compilerOptions = context.getCompilerOptions();
const resolver = context.getEmitResolver();
const host = context.getEmitHost();
const languageVersion = getEmitScriptTarget(compilerOptions);
const moduleKind = getEmitModuleKind(compilerOptions);
const previousOnSubstituteNode = context.onSubstituteNode;
const previousOnEmitNode = context.onEmitNode;
context.onSubstituteNode = onSubstituteNode;
context.onEmitNode = onEmitNode;
context.enableSubstitution(212 /* CallExpression */);
context.enableSubstitution(214 /* TaggedTemplateExpression */);
context.enableSubstitution(80 /* Identifier */);
context.enableSubstitution(225 /* BinaryExpression */);
context.enableSubstitution(303 /* ShorthandPropertyAssignment */);
context.enableEmitNotification(311 /* SourceFile */);
const moduleInfoMap = [];
let currentSourceFile;
let currentModuleInfo;
const noSubstitution = [];
let needUMDDynamicImportHelper;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
if (node.isDeclarationFile || !(isEffectiveExternalModule(node, compilerOptions) || node.transformFlags & 8388608 /* ContainsDynamicImport */ || isJsonSourceFile(node) && hasJsonModuleEmitEnabled(compilerOptions) && outFile(compilerOptions))) {
return node;
}
currentSourceFile = node;
currentModuleInfo = collectExternalModuleInfo(context, node, resolver, compilerOptions);
moduleInfoMap[getOriginalNodeId(node)] = currentModuleInfo;
const transformModule2 = getTransformModuleDelegate(moduleKind);
const updated = transformModule2(node);
currentSourceFile = void 0;
currentModuleInfo = void 0;
needUMDDynamicImportHelper = false;
return updated;
}
function shouldEmitUnderscoreUnderscoreESModule() {
if (!currentModuleInfo.exportEquals && isExternalModule(currentSourceFile)) {
return true;
}
return false;
}
function transformCommonJSModule(node) {
startLexicalEnvironment();
const statements = [];
const ensureUseStrict = getStrictOptionValue(compilerOptions, "alwaysStrict") || !compilerOptions.noImplicitUseStrict && isExternalModule(currentSourceFile);
const statementOffset = factory2.copyPrologue(node.statements, statements, ensureUseStrict && !isJsonSourceFile(node), topLevelVisitor);
if (shouldEmitUnderscoreUnderscoreESModule()) {
append(statements, createUnderscoreUnderscoreESModule());
}
if (length(currentModuleInfo.exportedNames)) {
const chunkSize = 50;
for (let i = 0; i < currentModuleInfo.exportedNames.length; i += chunkSize) {
append(
statements,
factory2.createExpressionStatement(
reduceLeft(
currentModuleInfo.exportedNames.slice(i, i + chunkSize),
(prev, nextId) => factory2.createAssignment(factory2.createPropertyAccessExpression(factory2.createIdentifier("exports"), factory2.createIdentifier(idText(nextId))), prev),
factory2.createVoidZero()
)
)
);
}
}
append(statements, visitNode(currentModuleInfo.externalHelpersImportDeclaration, topLevelVisitor, isStatement));
addRange(statements, visitNodes2(node.statements, topLevelVisitor, isStatement, statementOffset));
addExportEqualsIfNeeded(
statements,
/*emitAsReturn*/
false
);
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
const updated = factory2.updateSourceFile(node, setTextRange(factory2.createNodeArray(statements), node.statements));
addEmitHelpers(updated, context.readEmitHelpers());
return updated;
}
function transformAMDModule(node) {
const define = factory2.createIdentifier("define");
const moduleName = tryGetModuleNameFromFile(factory2, node, host, compilerOptions);
const jsonSourceFile = isJsonSourceFile(node) && node;
const { aliasedModuleNames, unaliasedModuleNames, importAliasNames } = collectAsynchronousDependencies(
node,
/*includeNonAmdDependencies*/
true
);
const updated = factory2.updateSourceFile(
node,
setTextRange(
factory2.createNodeArray([
factory2.createExpressionStatement(
factory2.createCallExpression(
define,
/*typeArguments*/
void 0,
[
// Add the module name (if provided).
...moduleName ? [moduleName] : [],
// Add the dependency array argument:
//
// ["require", "exports", module1", "module2", ...]
factory2.createArrayLiteralExpression(jsonSourceFile ? emptyArray : [
factory2.createStringLiteral("require"),
factory2.createStringLiteral("exports"),
...aliasedModuleNames,
...unaliasedModuleNames
]),
// Add the module body function argument:
//
// function (require, exports, module1, module2) ...
jsonSourceFile ? jsonSourceFile.statements.length ? jsonSourceFile.statements[0].expression : factory2.createObjectLiteralExpression() : factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
[
factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
"require"
),
factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
"exports"
),
...importAliasNames
],
/*type*/
void 0,
transformAsynchronousModuleBody(node)
)
]
)
)
]),
/*location*/
node.statements
)
);
addEmitHelpers(updated, context.readEmitHelpers());
return updated;
}
function transformUMDModule(node) {
const { aliasedModuleNames, unaliasedModuleNames, importAliasNames } = collectAsynchronousDependencies(
node,
/*includeNonAmdDependencies*/
false
);
const moduleName = tryGetModuleNameFromFile(factory2, node, host, compilerOptions);
const umdHeader = factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
[factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
"factory"
)],
/*type*/
void 0,
setTextRange(
factory2.createBlock(
[
factory2.createIfStatement(
factory2.createLogicalAnd(
factory2.createTypeCheck(factory2.createIdentifier("module"), "object"),
factory2.createTypeCheck(factory2.createPropertyAccessExpression(factory2.createIdentifier("module"), "exports"), "object")
),
factory2.createBlock([
factory2.createVariableStatement(
/*modifiers*/
void 0,
[
factory2.createVariableDeclaration(
"v",
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createCallExpression(
factory2.createIdentifier("factory"),
/*typeArguments*/
void 0,
[
factory2.createIdentifier("require"),
factory2.createIdentifier("exports")
]
)
)
]
),
setEmitFlags(
factory2.createIfStatement(
factory2.createStrictInequality(
factory2.createIdentifier("v"),
factory2.createIdentifier("undefined")
),
factory2.createExpressionStatement(
factory2.createAssignment(
factory2.createPropertyAccessExpression(factory2.createIdentifier("module"), "exports"),
factory2.createIdentifier("v")
)
)
),
1 /* SingleLine */
)
]),
factory2.createIfStatement(
factory2.createLogicalAnd(
factory2.createTypeCheck(factory2.createIdentifier("define"), "function"),
factory2.createPropertyAccessExpression(factory2.createIdentifier("define"), "amd")
),
factory2.createBlock([
factory2.createExpressionStatement(
factory2.createCallExpression(
factory2.createIdentifier("define"),
/*typeArguments*/
void 0,
[
// Add the module name (if provided).
...moduleName ? [moduleName] : [],
factory2.createArrayLiteralExpression([
factory2.createStringLiteral("require"),
factory2.createStringLiteral("exports"),
...aliasedModuleNames,
...unaliasedModuleNames
]),
factory2.createIdentifier("factory")
]
)
)
])
)
)
],
/*multiLine*/
true
),
/*location*/
void 0
)
);
const updated = factory2.updateSourceFile(
node,
setTextRange(
factory2.createNodeArray([
factory2.createExpressionStatement(
factory2.createCallExpression(
umdHeader,
/*typeArguments*/
void 0,
[
// Add the module body function argument:
//
// function (require, exports) ...
factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
[
factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
"require"
),
factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
"exports"
),
...importAliasNames
],
/*type*/
void 0,
transformAsynchronousModuleBody(node)
)
]
)
)
]),
/*location*/
node.statements
)
);
addEmitHelpers(updated, context.readEmitHelpers());
return updated;
}
function collectAsynchronousDependencies(node, includeNonAmdDependencies) {
const aliasedModuleNames = [];
const unaliasedModuleNames = [];
const importAliasNames = [];
for (const amdDependency of node.amdDependencies) {
if (amdDependency.name) {
aliasedModuleNames.push(factory2.createStringLiteral(amdDependency.path));
importAliasNames.push(factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
amdDependency.name
));
} else {
unaliasedModuleNames.push(factory2.createStringLiteral(amdDependency.path));
}
}
for (const importNode of currentModuleInfo.externalImports) {
const externalModuleName = getExternalModuleNameLiteral(factory2, importNode, currentSourceFile, host, resolver, compilerOptions);
const importAliasName = getLocalNameForExternalImport(factory2, importNode, currentSourceFile);
if (externalModuleName) {
if (includeNonAmdDependencies && importAliasName) {
setEmitFlags(importAliasName, 8 /* NoSubstitution */);
aliasedModuleNames.push(externalModuleName);
importAliasNames.push(factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
importAliasName
));
} else {
unaliasedModuleNames.push(externalModuleName);
}
}
}
return { aliasedModuleNames, unaliasedModuleNames, importAliasNames };
}
function getAMDImportExpressionForImport(node) {
if (isImportEqualsDeclaration(node) || isExportDeclaration(node) || !getExternalModuleNameLiteral(factory2, node, currentSourceFile, host, resolver, compilerOptions)) {
return void 0;
}
const name = getLocalNameForExternalImport(factory2, node, currentSourceFile);
const expr = getHelperExpressionForImport(node, name);
if (expr === name) {
return void 0;
}
return factory2.createExpressionStatement(factory2.createAssignment(name, expr));
}
function transformAsynchronousModuleBody(node) {
startLexicalEnvironment();
const statements = [];
const statementOffset = factory2.copyPrologue(
node.statements,
statements,
/*ensureUseStrict*/
!compilerOptions.noImplicitUseStrict,
topLevelVisitor
);
if (shouldEmitUnderscoreUnderscoreESModule()) {
append(statements, createUnderscoreUnderscoreESModule());
}
if (length(currentModuleInfo.exportedNames)) {
append(statements, factory2.createExpressionStatement(reduceLeft(currentModuleInfo.exportedNames, (prev, nextId) => factory2.createAssignment(factory2.createPropertyAccessExpression(factory2.createIdentifier("exports"), factory2.createIdentifier(idText(nextId))), prev), factory2.createVoidZero())));
}
append(statements, visitNode(currentModuleInfo.externalHelpersImportDeclaration, topLevelVisitor, isStatement));
if (moduleKind === 2 /* AMD */) {
addRange(statements, mapDefined(currentModuleInfo.externalImports, getAMDImportExpressionForImport));
}
addRange(statements, visitNodes2(node.statements, topLevelVisitor, isStatement, statementOffset));
addExportEqualsIfNeeded(
statements,
/*emitAsReturn*/
true
);
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
const body = factory2.createBlock(
statements,
/*multiLine*/
true
);
if (needUMDDynamicImportHelper) {
addEmitHelper(body, dynamicImportUMDHelper);
}
return body;
}
function addExportEqualsIfNeeded(statements, emitAsReturn) {
if (currentModuleInfo.exportEquals) {
const expressionResult = visitNode(currentModuleInfo.exportEquals.expression, visitor, isExpression);
if (expressionResult) {
if (emitAsReturn) {
const statement = factory2.createReturnStatement(expressionResult);
setTextRange(statement, currentModuleInfo.exportEquals);
setEmitFlags(statement, 768 /* NoTokenSourceMaps */ | 3072 /* NoComments */);
statements.push(statement);
} else {
const statement = factory2.createExpressionStatement(
factory2.createAssignment(
factory2.createPropertyAccessExpression(
factory2.createIdentifier("module"),
"exports"
),
expressionResult
)
);
setTextRange(statement, currentModuleInfo.exportEquals);
setEmitFlags(statement, 3072 /* NoComments */);
statements.push(statement);
}
}
}
}
function topLevelVisitor(node) {
switch (node.kind) {
case 271 /* ImportDeclaration */:
return visitImportDeclaration(node);
case 270 /* ImportEqualsDeclaration */:
return visitImportEqualsDeclaration(node);
case 277 /* ExportDeclaration */:
return visitExportDeclaration(node);
case 276 /* ExportAssignment */:
return visitExportAssignment(node);
case 261 /* FunctionDeclaration */:
return visitFunctionDeclaration(node);
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
default:
return topLevelNestedVisitor(node);
}
}
function topLevelNestedVisitor(node) {
switch (node.kind) {
case 242 /* VariableStatement */:
return visitVariableStatement(node);
case 261 /* FunctionDeclaration */:
return visitFunctionDeclaration(node);
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
case 247 /* ForStatement */:
return visitForStatement(
node,
/*isTopLevel*/
true
);
case 248 /* ForInStatement */:
return visitForInStatement(node);
case 249 /* ForOfStatement */:
return visitForOfStatement(node);
case 245 /* DoStatement */:
return visitDoStatement(node);
case 246 /* WhileStatement */:
return visitWhileStatement(node);
case 255 /* LabeledStatement */:
return visitLabeledStatement(node);
case 253 /* WithStatement */:
return visitWithStatement(node);
case 244 /* IfStatement */:
return visitIfStatement(node);
case 254 /* SwitchStatement */:
return visitSwitchStatement(node);
case 268 /* CaseBlock */:
return visitCaseBlock(node);
case 295 /* CaseClause */:
return visitCaseClause(node);
case 296 /* DefaultClause */:
return visitDefaultClause(node);
case 257 /* TryStatement */:
return visitTryStatement(node);
case 298 /* CatchClause */:
return visitCatchClause(node);
case 240 /* Block */:
return visitBlock(node);
default:
return visitor(node);
}
}
function visitorWorker(node, valueIsDiscarded) {
if (!(node.transformFlags & (8388608 /* ContainsDynamicImport */ | 4096 /* ContainsDestructuringAssignment */ | 268435456 /* ContainsUpdateExpressionForIdentifier */))) {
return node;
}
switch (node.kind) {
case 247 /* ForStatement */:
return visitForStatement(
node,
/*isTopLevel*/
false
);
case 243 /* ExpressionStatement */:
return visitExpressionStatement(node);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(node, valueIsDiscarded);
case 359 /* PartiallyEmittedExpression */:
return visitPartiallyEmittedExpression(node, valueIsDiscarded);
case 212 /* CallExpression */:
if (isImportCall(node) && currentSourceFile.impliedNodeFormat === void 0) {
return visitImportCallExpression(node);
}
break;
case 225 /* BinaryExpression */:
if (isDestructuringAssignment(node)) {
return visitDestructuringAssignment(node, valueIsDiscarded);
}
break;
case 223 /* PrefixUnaryExpression */:
case 224 /* PostfixUnaryExpression */:
return visitPreOrPostfixUnaryExpression(node, valueIsDiscarded);
}
return visitEachChild(node, visitor, context);
}
function visitor(node) {
return visitorWorker(
node,
/*valueIsDiscarded*/
false
);
}
function discardedValueVisitor(node) {
return visitorWorker(
node,
/*valueIsDiscarded*/
true
);
}
function destructuringNeedsFlattening(node) {
if (isObjectLiteralExpression(node)) {
for (const elem of node.properties) {
switch (elem.kind) {
case 302 /* PropertyAssignment */:
if (destructuringNeedsFlattening(elem.initializer)) {
return true;
}
break;
case 303 /* ShorthandPropertyAssignment */:
if (destructuringNeedsFlattening(elem.name)) {
return true;
}
break;
case 304 /* SpreadAssignment */:
if (destructuringNeedsFlattening(elem.expression)) {
return true;
}
break;
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return false;
default:
Debug.assertNever(elem, "Unhandled object member kind");
}
}
} else if (isArrayLiteralExpression(node)) {
for (const elem of node.elements) {
if (isSpreadElement(elem)) {
if (destructuringNeedsFlattening(elem.expression)) {
return true;
}
} else if (destructuringNeedsFlattening(elem)) {
return true;
}
}
} else if (isIdentifier(node)) {
return length(getExports(node)) > (isExportName(node) ? 1 : 0);
}
return false;
}
function visitDestructuringAssignment(node, valueIsDiscarded) {
if (destructuringNeedsFlattening(node.left)) {
return flattenDestructuringAssignment(node, visitor, context, 0 /* All */, !valueIsDiscarded, createAllExportExpressions);
}
return visitEachChild(node, visitor, context);
}
function visitForStatement(node, isTopLevel) {
if (isTopLevel && node.initializer && isVariableDeclarationList(node.initializer) && !(node.initializer.flags & 3 /* BlockScoped */)) {
const exportStatements = appendExportsOfVariableDeclarationList(
/*statements*/
void 0,
node.initializer,
/*isForInOrOfInitializer*/
false
);
if (exportStatements) {
const statements = [];
const varDeclList = visitNode(node.initializer, discardedValueVisitor, isVariableDeclarationList);
const varStatement = factory2.createVariableStatement(
/*modifiers*/
void 0,
varDeclList
);
statements.push(varStatement);
addRange(statements, exportStatements);
const condition = visitNode(node.condition, visitor, isExpression);
const incrementor = visitNode(node.incrementor, discardedValueVisitor, isExpression);
const body = visitIterationBody(node.statement, isTopLevel ? topLevelNestedVisitor : visitor, context);
statements.push(factory2.updateForStatement(
node,
/*initializer*/
void 0,
condition,
incrementor,
body
));
return statements;
}
}
return factory2.updateForStatement(
node,
visitNode(node.initializer, discardedValueVisitor, isForInitializer),
visitNode(node.condition, visitor, isExpression),
visitNode(node.incrementor, discardedValueVisitor, isExpression),
visitIterationBody(node.statement, isTopLevel ? topLevelNestedVisitor : visitor, context)
);
}
function visitForInStatement(node) {
if (isVariableDeclarationList(node.initializer) && !(node.initializer.flags & 3 /* BlockScoped */)) {
const exportStatements = appendExportsOfVariableDeclarationList(
/*statements*/
void 0,
node.initializer,
/*isForInOrOfInitializer*/
true
);
if (some(exportStatements)) {
const initializer = visitNode(node.initializer, discardedValueVisitor, isForInitializer);
const expression = visitNode(node.expression, visitor, isExpression);
const body = visitIterationBody(node.statement, topLevelNestedVisitor, context);
const mergedBody = isBlock(body) ? factory2.updateBlock(body, [...exportStatements, ...body.statements]) : factory2.createBlock(
[...exportStatements, body],
/*multiLine*/
true
);
return factory2.updateForInStatement(node, initializer, expression, mergedBody);
}
}
return factory2.updateForInStatement(
node,
visitNode(node.initializer, discardedValueVisitor, isForInitializer),
visitNode(node.expression, visitor, isExpression),
visitIterationBody(node.statement, topLevelNestedVisitor, context)
);
}
function visitForOfStatement(node) {
if (isVariableDeclarationList(node.initializer) && !(node.initializer.flags & 3 /* BlockScoped */)) {
const exportStatements = appendExportsOfVariableDeclarationList(
/*statements*/
void 0,
node.initializer,
/*isForInOrOfInitializer*/
true
);
const initializer = visitNode(node.initializer, discardedValueVisitor, isForInitializer);
const expression = visitNode(node.expression, visitor, isExpression);
let body = visitIterationBody(node.statement, topLevelNestedVisitor, context);
if (some(exportStatements)) {
body = isBlock(body) ? factory2.updateBlock(body, [...exportStatements, ...body.statements]) : factory2.createBlock(
[...exportStatements, body],
/*multiLine*/
true
);
}
return factory2.updateForOfStatement(node, node.awaitModifier, initializer, expression, body);
}
return factory2.updateForOfStatement(
node,
node.awaitModifier,
visitNode(node.initializer, discardedValueVisitor, isForInitializer),
visitNode(node.expression, visitor, isExpression),
visitIterationBody(node.statement, topLevelNestedVisitor, context)
);
}
function visitDoStatement(node) {
return factory2.updateDoStatement(
node,
visitIterationBody(node.statement, topLevelNestedVisitor, context),
visitNode(node.expression, visitor, isExpression)
);
}
function visitWhileStatement(node) {
return factory2.updateWhileStatement(
node,
visitNode(node.expression, visitor, isExpression),
visitIterationBody(node.statement, topLevelNestedVisitor, context)
);
}
function visitLabeledStatement(node) {
return factory2.updateLabeledStatement(
node,
node.label,
Debug.checkDefined(visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock))
);
}
function visitWithStatement(node) {
return factory2.updateWithStatement(
node,
visitNode(node.expression, visitor, isExpression),
Debug.checkDefined(visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock))
);
}
function visitIfStatement(node) {
return factory2.updateIfStatement(
node,
visitNode(node.expression, visitor, isExpression),
Debug.checkDefined(visitNode(node.thenStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock)),
visitNode(node.elseStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock)
);
}
function visitSwitchStatement(node) {
return factory2.updateSwitchStatement(
node,
visitNode(node.expression, visitor, isExpression),
Debug.checkDefined(visitNode(node.caseBlock, topLevelNestedVisitor, isCaseBlock))
);
}
function visitCaseBlock(node) {
return factory2.updateCaseBlock(
node,
visitNodes2(node.clauses, topLevelNestedVisitor, isCaseOrDefaultClause)
);
}
function visitCaseClause(node) {
return factory2.updateCaseClause(
node,
visitNode(node.expression, visitor, isExpression),
visitNodes2(node.statements, topLevelNestedVisitor, isStatement)
);
}
function visitDefaultClause(node) {
return visitEachChild(node, topLevelNestedVisitor, context);
}
function visitTryStatement(node) {
return visitEachChild(node, topLevelNestedVisitor, context);
}
function visitCatchClause(node) {
return factory2.updateCatchClause(
node,
node.variableDeclaration,
Debug.checkDefined(visitNode(node.block, topLevelNestedVisitor, isBlock))
);
}
function visitBlock(node) {
node = visitEachChild(node, topLevelNestedVisitor, context);
return node;
}
function visitExpressionStatement(node) {
return factory2.updateExpressionStatement(
node,
visitNode(node.expression, discardedValueVisitor, isExpression)
);
}
function visitParenthesizedExpression(node, valueIsDiscarded) {
return factory2.updateParenthesizedExpression(node, visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, isExpression));
}
function visitPartiallyEmittedExpression(node, valueIsDiscarded) {
return factory2.updatePartiallyEmittedExpression(node, visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, isExpression));
}
function visitPreOrPostfixUnaryExpression(node, valueIsDiscarded) {
if ((node.operator === 46 /* PlusPlusToken */ || node.operator === 47 /* MinusMinusToken */) && isIdentifier(node.operand) && !isGeneratedIdentifier(node.operand) && !isLocalName(node.operand) && !isDeclarationNameOfEnumOrNamespace(node.operand)) {
const exportedNames = getExports(node.operand);
if (exportedNames) {
let temp;
let expression = visitNode(node.operand, visitor, isExpression);
if (isPrefixUnaryExpression(node)) {
expression = factory2.updatePrefixUnaryExpression(node, expression);
} else {
expression = factory2.updatePostfixUnaryExpression(node, expression);
if (!valueIsDiscarded) {
temp = factory2.createTempVariable(hoistVariableDeclaration);
expression = factory2.createAssignment(temp, expression);
setTextRange(expression, node);
}
expression = factory2.createComma(expression, factory2.cloneNode(node.operand));
setTextRange(expression, node);
}
for (const exportName of exportedNames) {
noSubstitution[getNodeId(expression)] = true;
expression = createExportExpression(exportName, expression);
setTextRange(expression, node);
}
if (temp) {
noSubstitution[getNodeId(expression)] = true;
expression = factory2.createComma(expression, temp);
setTextRange(expression, node);
}
return expression;
}
}
return visitEachChild(node, visitor, context);
}
function visitImportCallExpression(node) {
if (moduleKind === 0 /* None */ && languageVersion >= 7 /* ES2020 */) {
return visitEachChild(node, visitor, context);
}
const externalModuleName = getExternalModuleNameLiteral(factory2, node, currentSourceFile, host, resolver, compilerOptions);
const firstArgument = visitNode(firstOrUndefined(node.arguments), visitor, isExpression);
const argument = externalModuleName && (!firstArgument || !isStringLiteral(firstArgument) || firstArgument.text !== externalModuleName.text) ? externalModuleName : firstArgument;
const containsLexicalThis = !!(node.transformFlags & 16384 /* ContainsLexicalThis */);
switch (compilerOptions.module) {
case 2 /* AMD */:
return createImportCallExpressionAMD(argument, containsLexicalThis);
case 3 /* UMD */:
return createImportCallExpressionUMD(argument ?? factory2.createVoidZero(), containsLexicalThis);
case 1 /* CommonJS */:
default:
return createImportCallExpressionCommonJS(argument);
}
}
function createImportCallExpressionUMD(arg, containsLexicalThis) {
needUMDDynamicImportHelper = true;
if (isSimpleCopiableExpression(arg)) {
const argClone = isGeneratedIdentifier(arg) ? arg : isStringLiteral(arg) ? factory2.createStringLiteralFromNode(arg) : setEmitFlags(setTextRange(factory2.cloneNode(arg), arg), 3072 /* NoComments */);
return factory2.createConditionalExpression(
/*condition*/
factory2.createIdentifier("__syncRequire"),
/*questionToken*/
void 0,
/*whenTrue*/
createImportCallExpressionCommonJS(arg),
/*colonToken*/
void 0,
/*whenFalse*/
createImportCallExpressionAMD(argClone, containsLexicalThis)
);
} else {
const temp = factory2.createTempVariable(hoistVariableDeclaration);
return factory2.createComma(factory2.createAssignment(temp, arg), factory2.createConditionalExpression(
/*condition*/
factory2.createIdentifier("__syncRequire"),
/*questionToken*/
void 0,
/*whenTrue*/
createImportCallExpressionCommonJS(
temp,
/*isInlineable*/
true
),
/*colonToken*/
void 0,
/*whenFalse*/
createImportCallExpressionAMD(temp, containsLexicalThis)
));
}
}
function createImportCallExpressionAMD(arg, containsLexicalThis) {
const resolve = factory2.createUniqueName("resolve");
const reject = factory2.createUniqueName("reject");
const parameters = [
factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
/*name*/
resolve
),
factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
/*name*/
reject
)
];
const body = factory2.createBlock([
factory2.createExpressionStatement(
factory2.createCallExpression(
factory2.createIdentifier("require"),
/*typeArguments*/
void 0,
[factory2.createArrayLiteralExpression([arg || factory2.createOmittedExpression()]), resolve, reject]
)
)
]);
let func;
if (languageVersion >= 2 /* ES2015 */) {
func = factory2.createArrowFunction(
/*modifiers*/
void 0,
/*typeParameters*/
void 0,
parameters,
/*type*/
void 0,
/*equalsGreaterThanToken*/
void 0,
body
);
} else {
func = factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
parameters,
/*type*/
void 0,
body
);
if (containsLexicalThis) {
setEmitFlags(func, 16 /* CapturesThis */);
}
}
const promise = factory2.createNewExpression(
factory2.createIdentifier("Promise"),
/*typeArguments*/
void 0,
[func]
);
if (getESModuleInterop(compilerOptions)) {
return factory2.createCallExpression(
factory2.createPropertyAccessExpression(promise, factory2.createIdentifier("then")),
/*typeArguments*/
void 0,
[emitHelpers().createImportStarCallbackHelper()]
);
}
return promise;
}
function createImportCallExpressionCommonJS(arg, isInlineable) {
const needSyncEval = arg && !isSimpleInlineableExpression(arg) && !isInlineable;
const promiseResolveCall = factory2.createCallExpression(
factory2.createPropertyAccessExpression(factory2.createIdentifier("Promise"), "resolve"),
/*typeArguments*/
void 0,
/*argumentsArray*/
needSyncEval ? languageVersion >= 2 /* ES2015 */ ? [
factory2.createTemplateExpression(factory2.createTemplateHead(""), [
factory2.createTemplateSpan(arg, factory2.createTemplateTail(""))
])
] : [
factory2.createCallExpression(
factory2.createPropertyAccessExpression(factory2.createStringLiteral(""), "concat"),
/*typeArguments*/
void 0,
[arg]
)
] : []
);
let requireCall = factory2.createCallExpression(
factory2.createIdentifier("require"),
/*typeArguments*/
void 0,
needSyncEval ? [factory2.createIdentifier("s")] : arg ? [arg] : []
);
if (getESModuleInterop(compilerOptions)) {
requireCall = emitHelpers().createImportStarHelper(requireCall);
}
const parameters = needSyncEval ? [
factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
/*name*/
"s"
)
] : [];
let func;
if (languageVersion >= 2 /* ES2015 */) {
func = factory2.createArrowFunction(
/*modifiers*/
void 0,
/*typeParameters*/
void 0,
/*parameters*/
parameters,
/*type*/
void 0,
/*equalsGreaterThanToken*/
void 0,
requireCall
);
} else {
func = factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
/*parameters*/
parameters,
/*type*/
void 0,
factory2.createBlock([factory2.createReturnStatement(requireCall)])
);
}
const downleveledImport = factory2.createCallExpression(
factory2.createPropertyAccessExpression(promiseResolveCall, "then"),
/*typeArguments*/
void 0,
[func]
);
return downleveledImport;
}
function getHelperExpressionForExport(node, innerExpr) {
if (!getESModuleInterop(compilerOptions) || getInternalEmitFlags(node) & 2 /* NeverApplyImportHelper */) {
return innerExpr;
}
if (getExportNeedsImportStarHelper(node)) {
return emitHelpers().createImportStarHelper(innerExpr);
}
return innerExpr;
}
function getHelperExpressionForImport(node, innerExpr) {
if (!getESModuleInterop(compilerOptions) || getInternalEmitFlags(node) & 2 /* NeverApplyImportHelper */) {
return innerExpr;
}
if (getImportNeedsImportStarHelper(node)) {
return emitHelpers().createImportStarHelper(innerExpr);
}
if (getImportNeedsImportDefaultHelper(node)) {
return emitHelpers().createImportDefaultHelper(innerExpr);
}
return innerExpr;
}
function visitImportDeclaration(node) {
let statements;
const namespaceDeclaration = getNamespaceDeclarationNode(node);
if (moduleKind !== 2 /* AMD */) {
if (!node.importClause) {
return setOriginalNode(setTextRange(factory2.createExpressionStatement(createRequireCall(node)), node), node);
} else {
const variables = [];
if (namespaceDeclaration && !isDefaultImport(node)) {
variables.push(
factory2.createVariableDeclaration(
factory2.cloneNode(namespaceDeclaration.name),
/*exclamationToken*/
void 0,
/*type*/
void 0,
getHelperExpressionForImport(node, createRequireCall(node))
)
);
} else {
variables.push(
factory2.createVariableDeclaration(
factory2.getGeneratedNameForNode(node),
/*exclamationToken*/
void 0,
/*type*/
void 0,
getHelperExpressionForImport(node, createRequireCall(node))
)
);
if (namespaceDeclaration && isDefaultImport(node)) {
variables.push(
factory2.createVariableDeclaration(
factory2.cloneNode(namespaceDeclaration.name),
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.getGeneratedNameForNode(node)
)
);
}
}
statements = append(
statements,
setOriginalNode(
setTextRange(
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(
variables,
languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */
)
),
/*location*/
node
),
/*original*/
node
)
);
}
} else if (namespaceDeclaration && isDefaultImport(node)) {
statements = append(
statements,
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(
[
setOriginalNode(
setTextRange(
factory2.createVariableDeclaration(
factory2.cloneNode(namespaceDeclaration.name),
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.getGeneratedNameForNode(node)
),
/*location*/
node
),
/*original*/
node
)
],
languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */
)
)
);
}
statements = appendExportsOfImportDeclaration(statements, node);
return singleOrMany(statements);
}
function createRequireCall(importNode) {
const moduleName = getExternalModuleNameLiteral(factory2, importNode, currentSourceFile, host, resolver, compilerOptions);
const args = [];
if (moduleName) {
args.push(moduleName);
}
return factory2.createCallExpression(
factory2.createIdentifier("require"),
/*typeArguments*/
void 0,
args
);
}
function visitImportEqualsDeclaration(node) {
Debug.assert(isExternalModuleImportEqualsDeclaration(node), "import= for internal module references should be handled in an earlier transformer.");
let statements;
if (moduleKind !== 2 /* AMD */) {
if (hasSyntacticModifier(node, 1 /* Export */)) {
statements = append(
statements,
setOriginalNode(
setTextRange(
factory2.createExpressionStatement(
createExportExpression(
node.name,
createRequireCall(node)
)
),
node
),
node
)
);
} else {
statements = append(
statements,
setOriginalNode(
setTextRange(
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(
[
factory2.createVariableDeclaration(
factory2.cloneNode(node.name),
/*exclamationToken*/
void 0,
/*type*/
void 0,
createRequireCall(node)
)
],
/*flags*/
languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */
)
),
node
),
node
)
);
}
} else {
if (hasSyntacticModifier(node, 1 /* Export */)) {
statements = append(
statements,
setOriginalNode(
setTextRange(
factory2.createExpressionStatement(
createExportExpression(factory2.getExportName(node), factory2.getLocalName(node))
),
node
),
node
)
);
}
}
statements = appendExportsOfImportEqualsDeclaration(statements, node);
return singleOrMany(statements);
}
function visitExportDeclaration(node) {
if (!node.moduleSpecifier) {
return void 0;
}
const generatedName = factory2.getGeneratedNameForNode(node);
if (node.exportClause && isNamedExports(node.exportClause)) {
const statements = [];
if (moduleKind !== 2 /* AMD */) {
statements.push(
setOriginalNode(
setTextRange(
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
generatedName,
/*exclamationToken*/
void 0,
/*type*/
void 0,
createRequireCall(node)
)
])
),
/*location*/
node
),
/* original */
node
)
);
}
for (const specifier of node.exportClause.elements) {
if (languageVersion === 0 /* ES3 */) {
statements.push(
setOriginalNode(
setTextRange(
factory2.createExpressionStatement(
emitHelpers().createCreateBindingHelper(generatedName, factory2.createStringLiteralFromNode(specifier.propertyName || specifier.name), specifier.propertyName ? factory2.createStringLiteralFromNode(specifier.name) : void 0)
),
specifier
),
specifier
)
);
} else {
const exportNeedsImportDefault = !!getESModuleInterop(compilerOptions) && !(getInternalEmitFlags(node) & 2 /* NeverApplyImportHelper */) && idText(specifier.propertyName || specifier.name) === "default";
const exportedValue = factory2.createPropertyAccessExpression(
exportNeedsImportDefault ? emitHelpers().createImportDefaultHelper(generatedName) : generatedName,
specifier.propertyName || specifier.name
);
statements.push(
setOriginalNode(
setTextRange(
factory2.createExpressionStatement(
createExportExpression(
factory2.getExportName(specifier),
exportedValue,
/*location*/
void 0,
/*liveBinding*/
true
)
),
specifier
),
specifier
)
);
}
}
return singleOrMany(statements);
} else if (node.exportClause) {
const statements = [];
statements.push(
setOriginalNode(
setTextRange(
factory2.createExpressionStatement(
createExportExpression(
factory2.cloneNode(node.exportClause.name),
getHelperExpressionForExport(node, moduleKind !== 2 /* AMD */ ? createRequireCall(node) : isExportNamespaceAsDefaultDeclaration(node) ? generatedName : factory2.createIdentifier(idText(node.exportClause.name)))
)
),
node
),
node
)
);
return singleOrMany(statements);
} else {
return setOriginalNode(
setTextRange(
factory2.createExpressionStatement(
emitHelpers().createExportStarHelper(moduleKind !== 2 /* AMD */ ? createRequireCall(node) : generatedName)
),
node
),
node
);
}
}
function visitExportAssignment(node) {
if (node.isExportEquals) {
return void 0;
}
return createExportStatement(
factory2.createIdentifier("default"),
visitNode(node.expression, visitor, isExpression),
/*location*/
node,
/*allowComments*/
true
);
}
function visitFunctionDeclaration(node) {
let statements;
if (hasSyntacticModifier(node, 1 /* Export */)) {
statements = append(
statements,
setOriginalNode(
setTextRange(
factory2.createFunctionDeclaration(
visitNodes2(node.modifiers, modifierVisitor, isModifier),
node.asteriskToken,
factory2.getDeclarationName(
node,
/*allowComments*/
true,
/*allowSourceMaps*/
true
),
/*typeParameters*/
void 0,
visitNodes2(node.parameters, visitor, isParameter),
/*type*/
void 0,
visitEachChild(node.body, visitor, context)
),
/*location*/
node
),
/*original*/
node
)
);
} else {
statements = append(statements, visitEachChild(node, visitor, context));
}
statements = appendExportsOfHoistedDeclaration(statements, node);
return singleOrMany(statements);
}
function visitClassDeclaration(node) {
let statements;
if (hasSyntacticModifier(node, 1 /* Export */)) {
statements = append(
statements,
setOriginalNode(
setTextRange(
factory2.createClassDeclaration(
visitNodes2(node.modifiers, modifierVisitor, isModifierLike),
factory2.getDeclarationName(
node,
/*allowComments*/
true,
/*allowSourceMaps*/
true
),
/*typeParameters*/
void 0,
visitNodes2(node.heritageClauses, visitor, isHeritageClause),
visitNodes2(node.members, visitor, isClassElement)
),
node
),
node
)
);
} else {
statements = append(statements, visitEachChild(node, visitor, context));
}
statements = appendExportsOfHoistedDeclaration(statements, node);
return singleOrMany(statements);
}
function visitVariableStatement(node) {
let statements;
let variables;
let expressions;
if (hasSyntacticModifier(node, 1 /* Export */)) {
let modifiers;
let removeCommentsOnExpressions = false;
for (const variable of node.declarationList.declarations) {
if (isIdentifier(variable.name) && isLocalName(variable.name)) {
if (!modifiers) {
modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
}
if (variable.initializer) {
const updatedVariable = factory2.updateVariableDeclaration(
variable,
variable.name,
/*exclamationToken*/
void 0,
/*type*/
void 0,
createExportExpression(
variable.name,
visitNode(variable.initializer, visitor, isExpression)
)
);
variables = append(variables, updatedVariable);
} else {
variables = append(variables, variable);
}
} else if (variable.initializer) {
if (!isBindingPattern(variable.name) && (isArrowFunction(variable.initializer) || isFunctionExpression(variable.initializer) || isClassExpression(variable.initializer))) {
const expression = factory2.createAssignment(
setTextRange(
factory2.createPropertyAccessExpression(
factory2.createIdentifier("exports"),
variable.name
),
/*location*/
variable.name
),
factory2.createIdentifier(getTextOfIdentifierOrLiteral(variable.name))
);
const updatedVariable = factory2.createVariableDeclaration(
variable.name,
variable.exclamationToken,
variable.type,
visitNode(variable.initializer, visitor, isExpression)
);
variables = append(variables, updatedVariable);
expressions = append(expressions, expression);
removeCommentsOnExpressions = true;
} else {
expressions = append(expressions, transformInitializedVariable(variable));
}
}
}
if (variables) {
statements = append(statements, factory2.updateVariableStatement(node, modifiers, factory2.updateVariableDeclarationList(node.declarationList, variables)));
}
if (expressions) {
const statement = setOriginalNode(setTextRange(factory2.createExpressionStatement(factory2.inlineExpressions(expressions)), node), node);
if (removeCommentsOnExpressions) {
removeAllComments(statement);
}
statements = append(statements, statement);
}
} else {
statements = append(statements, visitEachChild(node, visitor, context));
}
statements = appendExportsOfVariableStatement(statements, node);
return singleOrMany(statements);
}
function createAllExportExpressions(name, value, location) {
const exportedNames = getExports(name);
if (exportedNames) {
let expression = isExportName(name) ? value : factory2.createAssignment(name, value);
for (const exportName of exportedNames) {
setEmitFlags(expression, 8 /* NoSubstitution */);
expression = createExportExpression(
exportName,
expression,
/*location*/
location
);
}
return expression;
}
return factory2.createAssignment(name, value);
}
function transformInitializedVariable(node) {
if (isBindingPattern(node.name)) {
return flattenDestructuringAssignment(
visitNode(node, visitor, isInitializedVariable),
visitor,
context,
0 /* All */,
/*needsValue*/
false,
createAllExportExpressions
);
} else {
return factory2.createAssignment(
setTextRange(
factory2.createPropertyAccessExpression(
factory2.createIdentifier("exports"),
node.name
),
/*location*/
node.name
),
node.initializer ? visitNode(node.initializer, visitor, isExpression) : factory2.createVoidZero()
);
}
}
function appendExportsOfImportDeclaration(statements, decl) {
if (currentModuleInfo.exportEquals) {
return statements;
}
const importClause = decl.importClause;
if (!importClause) {
return statements;
}
if (importClause.name) {
statements = appendExportsOfDeclaration(statements, importClause);
}
const namedBindings = importClause.namedBindings;
if (namedBindings) {
switch (namedBindings.kind) {
case 273 /* NamespaceImport */:
statements = appendExportsOfDeclaration(statements, namedBindings);
break;
case 274 /* NamedImports */:
for (const importBinding of namedBindings.elements) {
statements = appendExportsOfDeclaration(
statements,
importBinding,
/*liveBinding*/
true
);
}
break;
}
}
return statements;
}
function appendExportsOfImportEqualsDeclaration(statements, decl) {
if (currentModuleInfo.exportEquals) {
return statements;
}
return appendExportsOfDeclaration(statements, decl);
}
function appendExportsOfVariableStatement(statements, node) {
return appendExportsOfVariableDeclarationList(
statements,
node.declarationList,
/*isForInOrOfInitializer*/
false
);
}
function appendExportsOfVariableDeclarationList(statements, node, isForInOrOfInitializer) {
if (currentModuleInfo.exportEquals) {
return statements;
}
for (const decl of node.declarations) {
statements = appendExportsOfBindingElement(statements, decl, isForInOrOfInitializer);
}
return statements;
}
function appendExportsOfBindingElement(statements, decl, isForInOrOfInitializer) {
if (currentModuleInfo.exportEquals) {
return statements;
}
if (isBindingPattern(decl.name)) {
for (const element of decl.name.elements) {
if (!isOmittedExpression(element)) {
statements = appendExportsOfBindingElement(statements, element, isForInOrOfInitializer);
}
}
} else if (!isGeneratedIdentifier(decl.name) && (!isVariableDeclaration(decl) || decl.initializer || isForInOrOfInitializer)) {
statements = appendExportsOfDeclaration(statements, decl);
}
return statements;
}
function appendExportsOfHoistedDeclaration(statements, decl) {
if (currentModuleInfo.exportEquals) {
return statements;
}
if (hasSyntacticModifier(decl, 1 /* Export */)) {
const exportName = hasSyntacticModifier(decl, 1024 /* Default */) ? factory2.createIdentifier("default") : factory2.getDeclarationName(decl);
statements = appendExportStatement(
statements,
exportName,
factory2.getLocalName(decl),
/*location*/
decl
);
}
if (decl.name) {
statements = appendExportsOfDeclaration(statements, decl);
}
return statements;
}
function appendExportsOfDeclaration(statements, decl, liveBinding) {
const name = factory2.getDeclarationName(decl);
const exportSpecifiers = currentModuleInfo.exportSpecifiers.get(idText(name));
if (exportSpecifiers) {
for (const exportSpecifier of exportSpecifiers) {
statements = appendExportStatement(
statements,
exportSpecifier.name,
name,
/*location*/
exportSpecifier.name,
/*allowComments*/
void 0,
liveBinding
);
}
}
return statements;
}
function appendExportStatement(statements, exportName, expression, location, allowComments, liveBinding) {
statements = append(statements, createExportStatement(exportName, expression, location, allowComments, liveBinding));
return statements;
}
function createUnderscoreUnderscoreESModule() {
let statement;
if (languageVersion === 0 /* ES3 */) {
statement = factory2.createExpressionStatement(
createExportExpression(
factory2.createIdentifier("__esModule"),
factory2.createTrue()
)
);
} else {
statement = factory2.createExpressionStatement(
factory2.createCallExpression(
factory2.createPropertyAccessExpression(factory2.createIdentifier("Object"), "defineProperty"),
/*typeArguments*/
void 0,
[
factory2.createIdentifier("exports"),
factory2.createStringLiteral("__esModule"),
factory2.createObjectLiteralExpression([
factory2.createPropertyAssignment("value", factory2.createTrue())
])
]
)
);
}
setEmitFlags(statement, 2097152 /* CustomPrologue */);
return statement;
}
function createExportStatement(name, value, location, allowComments, liveBinding) {
const statement = setTextRange(factory2.createExpressionStatement(createExportExpression(
name,
value,
/*location*/
void 0,
liveBinding
)), location);
startOnNewLine(statement);
if (!allowComments) {
setEmitFlags(statement, 3072 /* NoComments */);
}
return statement;
}
function createExportExpression(name, value, location, liveBinding) {
return setTextRange(
liveBinding && languageVersion !== 0 /* ES3 */ ? factory2.createCallExpression(
factory2.createPropertyAccessExpression(
factory2.createIdentifier("Object"),
"defineProperty"
),
/*typeArguments*/
void 0,
[
factory2.createIdentifier("exports"),
factory2.createStringLiteralFromNode(name),
factory2.createObjectLiteralExpression([
factory2.createPropertyAssignment("enumerable", factory2.createTrue()),
factory2.createPropertyAssignment("get", factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
/*parameters*/
[],
/*type*/
void 0,
factory2.createBlock([factory2.createReturnStatement(value)])
))
])
]
) : factory2.createAssignment(
factory2.createPropertyAccessExpression(
factory2.createIdentifier("exports"),
factory2.cloneNode(name)
),
value
),
location
);
}
function modifierVisitor(node) {
switch (node.kind) {
case 95 /* ExportKeyword */:
case 90 /* DefaultKeyword */:
return void 0;
}
return node;
}
function onEmitNode(hint, node, emitCallback) {
if (node.kind === 311 /* SourceFile */) {
currentSourceFile = node;
currentModuleInfo = moduleInfoMap[getOriginalNodeId(currentSourceFile)];
previousOnEmitNode(hint, node, emitCallback);
currentSourceFile = void 0;
currentModuleInfo = void 0;
} else {
previousOnEmitNode(hint, node, emitCallback);
}
}
function onSubstituteNode(hint, node) {
node = previousOnSubstituteNode(hint, node);
if (node.id && noSubstitution[node.id]) {
return node;
}
if (hint === 1 /* Expression */) {
return substituteExpression(node);
} else if (isShorthandPropertyAssignment(node)) {
return substituteShorthandPropertyAssignment(node);
}
return node;
}
function substituteShorthandPropertyAssignment(node) {
const name = node.name;
const exportedOrImportedName = substituteExpressionIdentifier(name);
if (exportedOrImportedName !== name) {
if (node.objectAssignmentInitializer) {
const initializer = factory2.createAssignment(exportedOrImportedName, node.objectAssignmentInitializer);
return setTextRange(factory2.createPropertyAssignment(name, initializer), node);
}
return setTextRange(factory2.createPropertyAssignment(name, exportedOrImportedName), node);
}
return node;
}
function substituteExpression(node) {
switch (node.kind) {
case 80 /* Identifier */:
return substituteExpressionIdentifier(node);
case 212 /* CallExpression */:
return substituteCallExpression(node);
case 214 /* TaggedTemplateExpression */:
return substituteTaggedTemplateExpression(node);
case 225 /* BinaryExpression */:
return substituteBinaryExpression(node);
}
return node;
}
function substituteCallExpression(node) {
if (isIdentifier(node.expression)) {
const expression = substituteExpressionIdentifier(node.expression);
noSubstitution[getNodeId(expression)] = true;
if (!isIdentifier(expression) && !(getEmitFlags(node.expression) & 8192 /* HelperName */)) {
return addInternalEmitFlags(
factory2.updateCallExpression(
node,
expression,
/*typeArguments*/
void 0,
node.arguments
),
16 /* IndirectCall */
);
}
}
return node;
}
function substituteTaggedTemplateExpression(node) {
if (isIdentifier(node.tag)) {
const tag = substituteExpressionIdentifier(node.tag);
noSubstitution[getNodeId(tag)] = true;
if (!isIdentifier(tag) && !(getEmitFlags(node.tag) & 8192 /* HelperName */)) {
return addInternalEmitFlags(
factory2.updateTaggedTemplateExpression(
node,
tag,
/*typeArguments*/
void 0,
node.template
),
16 /* IndirectCall */
);
}
}
return node;
}
function substituteExpressionIdentifier(node) {
var _a, _b;
if (getEmitFlags(node) & 8192 /* HelperName */) {
const externalHelpersModuleName = getExternalHelpersModuleName(currentSourceFile);
if (externalHelpersModuleName) {
return factory2.createPropertyAccessExpression(externalHelpersModuleName, node);
}
return node;
} else if (!(isGeneratedIdentifier(node) && !(node.emitNode.autoGenerate.flags & 64 /* AllowNameSubstitution */)) && !isLocalName(node)) {
const exportContainer = resolver.getReferencedExportContainer(node, isExportName(node));
if (exportContainer && exportContainer.kind === 311 /* SourceFile */) {
return setTextRange(
factory2.createPropertyAccessExpression(
factory2.createIdentifier("exports"),
factory2.cloneNode(node)
),
/*location*/
node
);
}
const importDeclaration = resolver.getReferencedImportDeclaration(node);
if (importDeclaration) {
if (isImportClause(importDeclaration)) {
return setTextRange(
factory2.createPropertyAccessExpression(
factory2.getGeneratedNameForNode(importDeclaration.parent),
factory2.createIdentifier("default")
),
/*location*/
node
);
} else if (isImportSpecifier(importDeclaration)) {
const name = importDeclaration.propertyName || importDeclaration.name;
return setTextRange(
factory2.createPropertyAccessExpression(
factory2.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) == null ? void 0 : _a.parent) == null ? void 0 : _b.parent) || importDeclaration),
factory2.cloneNode(name)
),
/*location*/
node
);
}
}
}
return node;
}
function substituteBinaryExpression(node) {
if (isAssignmentOperator(node.operatorToken.kind) && isIdentifier(node.left) && !isGeneratedIdentifier(node.left) && !isLocalName(node.left)) {
const exportedNames = getExports(node.left);
if (exportedNames) {
let expression = node;
for (const exportName of exportedNames) {
noSubstitution[getNodeId(expression)] = true;
expression = createExportExpression(
exportName,
expression,
/*location*/
node
);
}
return expression;
}
}
return node;
}
function getExports(name) {
if (!isGeneratedIdentifier(name)) {
const importDeclaration = resolver.getReferencedImportDeclaration(name);
if (importDeclaration) {
return currentModuleInfo == null ? void 0 : currentModuleInfo.exportedBindings[getOriginalNodeId(importDeclaration)];
}
const bindingsSet = /* @__PURE__ */ new Set();
const declarations = resolver.getReferencedValueDeclarations(name);
if (declarations) {
for (const declaration of declarations) {
const bindings = currentModuleInfo == null ? void 0 : currentModuleInfo.exportedBindings[getOriginalNodeId(declaration)];
if (bindings) {
for (const binding of bindings) {
bindingsSet.add(binding);
}
}
}
if (bindingsSet.size) {
return arrayFrom(bindingsSet);
}
}
}
}
}
var dynamicImportUMDHelper = {
name: "typescript:dynamicimport-sync-require",
scoped: true,
text: `
var __syncRequire = typeof module === "object" && typeof module.exports === "object";`
};
// src/compiler/transformers/module/system.ts
function transformSystemModule(context) {
const {
factory: factory2,
startLexicalEnvironment,
endLexicalEnvironment,
hoistVariableDeclaration
} = context;
const compilerOptions = context.getCompilerOptions();
const resolver = context.getEmitResolver();
const host = context.getEmitHost();
const previousOnSubstituteNode = context.onSubstituteNode;
const previousOnEmitNode = context.onEmitNode;
context.onSubstituteNode = onSubstituteNode;
context.onEmitNode = onEmitNode;
context.enableSubstitution(80 /* Identifier */);
context.enableSubstitution(303 /* ShorthandPropertyAssignment */);
context.enableSubstitution(225 /* BinaryExpression */);
context.enableSubstitution(235 /* MetaProperty */);
context.enableEmitNotification(311 /* SourceFile */);
const moduleInfoMap = [];
const exportFunctionsMap = [];
const noSubstitutionMap = [];
const contextObjectMap = [];
let currentSourceFile;
let moduleInfo;
let exportFunction;
let contextObject;
let hoistedStatements;
let enclosingBlockScopedContainer;
let noSubstitution;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
if (node.isDeclarationFile || !(isEffectiveExternalModule(node, compilerOptions) || node.transformFlags & 8388608 /* ContainsDynamicImport */)) {
return node;
}
const id = getOriginalNodeId(node);
currentSourceFile = node;
enclosingBlockScopedContainer = node;
moduleInfo = moduleInfoMap[id] = collectExternalModuleInfo(context, node, resolver, compilerOptions);
exportFunction = factory2.createUniqueName("exports");
exportFunctionsMap[id] = exportFunction;
contextObject = contextObjectMap[id] = factory2.createUniqueName("context");
const dependencyGroups = collectDependencyGroups(moduleInfo.externalImports);
const moduleBodyBlock = createSystemModuleBody(node, dependencyGroups);
const moduleBodyFunction = factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
[
factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
exportFunction
),
factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
contextObject
)
],
/*type*/
void 0,
moduleBodyBlock
);
const moduleName = tryGetModuleNameFromFile(factory2, node, host, compilerOptions);
const dependencies = factory2.createArrayLiteralExpression(map(dependencyGroups, (dependencyGroup) => dependencyGroup.name));
const updated = setEmitFlags(
factory2.updateSourceFile(
node,
setTextRange(
factory2.createNodeArray([
factory2.createExpressionStatement(
factory2.createCallExpression(
factory2.createPropertyAccessExpression(factory2.createIdentifier("System"), "register"),
/*typeArguments*/
void 0,
moduleName ? [moduleName, dependencies, moduleBodyFunction] : [dependencies, moduleBodyFunction]
)
)
]),
node.statements
)
),
2048 /* NoTrailingComments */
);
if (!outFile(compilerOptions)) {
moveEmitHelpers(updated, moduleBodyBlock, (helper) => !helper.scoped);
}
if (noSubstitution) {
noSubstitutionMap[id] = noSubstitution;
noSubstitution = void 0;
}
currentSourceFile = void 0;
moduleInfo = void 0;
exportFunction = void 0;
contextObject = void 0;
hoistedStatements = void 0;
enclosingBlockScopedContainer = void 0;
return updated;
}
function collectDependencyGroups(externalImports) {
const groupIndices = /* @__PURE__ */ new Map();
const dependencyGroups = [];
for (const externalImport of externalImports) {
const externalModuleName = getExternalModuleNameLiteral(factory2, externalImport, currentSourceFile, host, resolver, compilerOptions);
if (externalModuleName) {
const text = externalModuleName.text;
const groupIndex = groupIndices.get(text);
if (groupIndex !== void 0) {
dependencyGroups[groupIndex].externalImports.push(externalImport);
} else {
groupIndices.set(text, dependencyGroups.length);
dependencyGroups.push({
name: externalModuleName,
externalImports: [externalImport]
});
}
}
}
return dependencyGroups;
}
function createSystemModuleBody(node, dependencyGroups) {
const statements = [];
startLexicalEnvironment();
const ensureUseStrict = getStrictOptionValue(compilerOptions, "alwaysStrict") || !compilerOptions.noImplicitUseStrict && isExternalModule(currentSourceFile);
const statementOffset = factory2.copyPrologue(node.statements, statements, ensureUseStrict, topLevelVisitor);
statements.push(
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
"__moduleName",
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createLogicalAnd(
contextObject,
factory2.createPropertyAccessExpression(contextObject, "id")
)
)
])
)
);
visitNode(moduleInfo.externalHelpersImportDeclaration, topLevelVisitor, isStatement);
const executeStatements = visitNodes2(node.statements, topLevelVisitor, isStatement, statementOffset);
addRange(statements, hoistedStatements);
insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
const exportStarFunction = addExportStarIfNeeded(statements);
const modifiers = node.transformFlags & 2097152 /* ContainsAwait */ ? factory2.createModifiersFromModifierFlags(512 /* Async */) : void 0;
const moduleObject = factory2.createObjectLiteralExpression(
[
factory2.createPropertyAssignment(
"setters",
createSettersArray(exportStarFunction, dependencyGroups)
),
factory2.createPropertyAssignment(
"execute",
factory2.createFunctionExpression(
modifiers,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
/*parameters*/
[],
/*type*/
void 0,
factory2.createBlock(
executeStatements,
/*multiLine*/
true
)
)
)
],
/*multiLine*/
true
);
statements.push(factory2.createReturnStatement(moduleObject));
return factory2.createBlock(
statements,
/*multiLine*/
true
);
}
function addExportStarIfNeeded(statements) {
if (!moduleInfo.hasExportStarsToExportValues) {
return;
}
if (!moduleInfo.exportedNames && moduleInfo.exportSpecifiers.size === 0) {
let hasExportDeclarationWithExportClause = false;
for (const externalImport of moduleInfo.externalImports) {
if (externalImport.kind === 277 /* ExportDeclaration */ && externalImport.exportClause) {
hasExportDeclarationWithExportClause = true;
break;
}
}
if (!hasExportDeclarationWithExportClause) {
const exportStarFunction2 = createExportStarFunction(
/*localNames*/
void 0
);
statements.push(exportStarFunction2);
return exportStarFunction2.name;
}
}
const exportedNames = [];
if (moduleInfo.exportedNames) {
for (const exportedLocalName of moduleInfo.exportedNames) {
if (exportedLocalName.escapedText === "default") {
continue;
}
exportedNames.push(
factory2.createPropertyAssignment(
factory2.createStringLiteralFromNode(exportedLocalName),
factory2.createTrue()
)
);
}
}
const exportedNamesStorageRef = factory2.createUniqueName("exportedNames");
statements.push(
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
exportedNamesStorageRef,
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createObjectLiteralExpression(
exportedNames,
/*multiLine*/
true
)
)
])
)
);
const exportStarFunction = createExportStarFunction(exportedNamesStorageRef);
statements.push(exportStarFunction);
return exportStarFunction.name;
}
function createExportStarFunction(localNames) {
const exportStarFunction = factory2.createUniqueName("exportStar");
const m = factory2.createIdentifier("m");
const n = factory2.createIdentifier("n");
const exports = factory2.createIdentifier("exports");
let condition = factory2.createStrictInequality(n, factory2.createStringLiteral("default"));
if (localNames) {
condition = factory2.createLogicalAnd(
condition,
factory2.createLogicalNot(
factory2.createCallExpression(
factory2.createPropertyAccessExpression(localNames, "hasOwnProperty"),
/*typeArguments*/
void 0,
[n]
)
)
);
}
return factory2.createFunctionDeclaration(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
exportStarFunction,
/*typeParameters*/
void 0,
[factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
m
)],
/*type*/
void 0,
factory2.createBlock(
[
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(
exports,
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createObjectLiteralExpression([])
)
])
),
factory2.createForInStatement(
factory2.createVariableDeclarationList([
factory2.createVariableDeclaration(n)
]),
m,
factory2.createBlock([
setEmitFlags(
factory2.createIfStatement(
condition,
factory2.createExpressionStatement(
factory2.createAssignment(
factory2.createElementAccessExpression(exports, n),
factory2.createElementAccessExpression(m, n)
)
)
),
1 /* SingleLine */
)
])
),
factory2.createExpressionStatement(
factory2.createCallExpression(
exportFunction,
/*typeArguments*/
void 0,
[exports]
)
)
],
/*multiLine*/
true
)
);
}
function createSettersArray(exportStarFunction, dependencyGroups) {
const setters = [];
for (const group2 of dependencyGroups) {
const localName = forEach(group2.externalImports, (i) => getLocalNameForExternalImport(factory2, i, currentSourceFile));
const parameterName = localName ? factory2.getGeneratedNameForNode(localName) : factory2.createUniqueName("");
const statements = [];
for (const entry of group2.externalImports) {
const importVariableName = getLocalNameForExternalImport(factory2, entry, currentSourceFile);
switch (entry.kind) {
case 271 /* ImportDeclaration */:
if (!entry.importClause) {
break;
}
case 270 /* ImportEqualsDeclaration */:
Debug.assert(importVariableName !== void 0);
statements.push(
factory2.createExpressionStatement(
factory2.createAssignment(importVariableName, parameterName)
)
);
if (hasSyntacticModifier(entry, 1 /* Export */)) {
statements.push(
factory2.createExpressionStatement(
factory2.createCallExpression(
exportFunction,
/*typeArguments*/
void 0,
[
factory2.createStringLiteral(idText(importVariableName)),
parameterName
]
)
)
);
}
break;
case 277 /* ExportDeclaration */:
Debug.assert(importVariableName !== void 0);
if (entry.exportClause) {
if (isNamedExports(entry.exportClause)) {
const properties = [];
for (const e of entry.exportClause.elements) {
properties.push(
factory2.createPropertyAssignment(
factory2.createStringLiteral(idText(e.name)),
factory2.createElementAccessExpression(
parameterName,
factory2.createStringLiteral(idText(e.propertyName || e.name))
)
)
);
}
statements.push(
factory2.createExpressionStatement(
factory2.createCallExpression(
exportFunction,
/*typeArguments*/
void 0,
[factory2.createObjectLiteralExpression(
properties,
/*multiLine*/
true
)]
)
)
);
} else {
statements.push(
factory2.createExpressionStatement(
factory2.createCallExpression(
exportFunction,
/*typeArguments*/
void 0,
[
factory2.createStringLiteral(idText(entry.exportClause.name)),
parameterName
]
)
)
);
}
} else {
statements.push(
factory2.createExpressionStatement(
factory2.createCallExpression(
exportStarFunction,
/*typeArguments*/
void 0,
[parameterName]
)
)
);
}
break;
}
}
setters.push(
factory2.createFunctionExpression(
/*modifiers*/
void 0,
/*asteriskToken*/
void 0,
/*name*/
void 0,
/*typeParameters*/
void 0,
[factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
parameterName
)],
/*type*/
void 0,
factory2.createBlock(
statements,
/*multiLine*/
true
)
)
);
}
return factory2.createArrayLiteralExpression(
setters,
/*multiLine*/
true
);
}
function topLevelVisitor(node) {
switch (node.kind) {
case 271 /* ImportDeclaration */:
return visitImportDeclaration(node);
case 270 /* ImportEqualsDeclaration */:
return visitImportEqualsDeclaration(node);
case 277 /* ExportDeclaration */:
return visitExportDeclaration(node);
case 276 /* ExportAssignment */:
return visitExportAssignment(node);
default:
return topLevelNestedVisitor(node);
}
}
function visitImportDeclaration(node) {
let statements;
if (node.importClause) {
hoistVariableDeclaration(getLocalNameForExternalImport(factory2, node, currentSourceFile));
}
return singleOrMany(appendExportsOfImportDeclaration(statements, node));
}
function visitExportDeclaration(node) {
Debug.assertIsDefined(node);
return void 0;
}
function visitImportEqualsDeclaration(node) {
Debug.assert(isExternalModuleImportEqualsDeclaration(node), "import= for internal module references should be handled in an earlier transformer.");
let statements;
hoistVariableDeclaration(getLocalNameForExternalImport(factory2, node, currentSourceFile));
return singleOrMany(appendExportsOfImportEqualsDeclaration(statements, node));
}
function visitExportAssignment(node) {
if (node.isExportEquals) {
return void 0;
}
const expression = visitNode(node.expression, visitor, isExpression);
return createExportStatement(
factory2.createIdentifier("default"),
expression,
/*allowComments*/
true
);
}
function visitFunctionDeclaration(node) {
if (hasSyntacticModifier(node, 1 /* Export */)) {
hoistedStatements = append(
hoistedStatements,
factory2.updateFunctionDeclaration(
node,
visitNodes2(node.modifiers, modifierVisitor, isModifierLike),
node.asteriskToken,
factory2.getDeclarationName(
node,
/*allowComments*/
true,
/*allowSourceMaps*/
true
),
/*typeParameters*/
void 0,
visitNodes2(node.parameters, visitor, isParameter),
/*type*/
void 0,
visitNode(node.body, visitor, isBlock)
)
);
} else {
hoistedStatements = append(hoistedStatements, visitEachChild(node, visitor, context));
}
hoistedStatements = appendExportsOfHoistedDeclaration(hoistedStatements, node);
return void 0;
}
function visitClassDeclaration(node) {
let statements;
const name = factory2.getLocalName(node);
hoistVariableDeclaration(name);
statements = append(
statements,
setTextRange(
factory2.createExpressionStatement(
factory2.createAssignment(
name,
setTextRange(
factory2.createClassExpression(
visitNodes2(node.modifiers, modifierVisitor, isModifierLike),
node.name,
/*typeParameters*/
void 0,
visitNodes2(node.heritageClauses, visitor, isHeritageClause),
visitNodes2(node.members, visitor, isClassElement)
),
node
)
)
),
node
)
);
statements = appendExportsOfHoistedDeclaration(statements, node);
return singleOrMany(statements);
}
function visitVariableStatement(node) {
if (!shouldHoistVariableDeclarationList(node.declarationList)) {
return visitNode(node, visitor, isStatement);
}
let expressions;
const isExportedDeclaration = hasSyntacticModifier(node, 1 /* Export */);
for (const variable of node.declarationList.declarations) {
if (variable.initializer) {
expressions = append(expressions, transformInitializedVariable(variable, isExportedDeclaration));
} else {
hoistBindingElement(variable);
}
}
let statements;
if (expressions) {
statements = append(statements, setTextRange(factory2.createExpressionStatement(factory2.inlineExpressions(expressions)), node));
}
statements = appendExportsOfVariableStatement(
statements,
node,
/*exportSelf*/
false
);
return singleOrMany(statements);
}
function hoistBindingElement(node) {
if (isBindingPattern(node.name)) {
for (const element of node.name.elements) {
if (!isOmittedExpression(element)) {
hoistBindingElement(element);
}
}
} else {
hoistVariableDeclaration(factory2.cloneNode(node.name));
}
}
function shouldHoistVariableDeclarationList(node) {
return (getEmitFlags(node) & 4194304 /* NoHoisting */) === 0 && (enclosingBlockScopedContainer.kind === 311 /* SourceFile */ || (getOriginalNode(node).flags & 3 /* BlockScoped */) === 0);
}
function transformInitializedVariable(node, isExportedDeclaration) {
const createAssignment = isExportedDeclaration ? createExportedVariableAssignment : createNonExportedVariableAssignment;
return isBindingPattern(node.name) ? flattenDestructuringAssignment(
node,
visitor,
context,
0 /* All */,
/*needsValue*/
false,
createAssignment
) : node.initializer ? createAssignment(node.name, visitNode(node.initializer, visitor, isExpression)) : node.name;
}
function createExportedVariableAssignment(name, value, location) {
return createVariableAssignment(
name,
value,
location,
/*isExportedDeclaration*/
true
);
}
function createNonExportedVariableAssignment(name, value, location) {
return createVariableAssignment(
name,
value,
location,
/*isExportedDeclaration*/
false
);
}
function createVariableAssignment(name, value, location, isExportedDeclaration) {
hoistVariableDeclaration(factory2.cloneNode(name));
return isExportedDeclaration ? createExportExpression(name, preventSubstitution(setTextRange(factory2.createAssignment(name, value), location))) : preventSubstitution(setTextRange(factory2.createAssignment(name, value), location));
}
function appendExportsOfImportDeclaration(statements, decl) {
if (moduleInfo.exportEquals) {
return statements;
}
const importClause = decl.importClause;
if (!importClause) {
return statements;
}
if (importClause.name) {
statements = appendExportsOfDeclaration(statements, importClause);
}
const namedBindings = importClause.namedBindings;
if (namedBindings) {
switch (namedBindings.kind) {
case 273 /* NamespaceImport */:
statements = appendExportsOfDeclaration(statements, namedBindings);
break;
case 274 /* NamedImports */:
for (const importBinding of namedBindings.elements) {
statements = appendExportsOfDeclaration(statements, importBinding);
}
break;
}
}
return statements;
}
function appendExportsOfImportEqualsDeclaration(statements, decl) {
if (moduleInfo.exportEquals) {
return statements;
}
return appendExportsOfDeclaration(statements, decl);
}
function appendExportsOfVariableStatement(statements, node, exportSelf) {
if (moduleInfo.exportEquals) {
return statements;
}
for (const decl of node.declarationList.declarations) {
if (decl.initializer || exportSelf) {
statements = appendExportsOfBindingElement(statements, decl, exportSelf);
}
}
return statements;
}
function appendExportsOfBindingElement(statements, decl, exportSelf) {
if (moduleInfo.exportEquals) {
return statements;
}
if (isBindingPattern(decl.name)) {
for (const element of decl.name.elements) {
if (!isOmittedExpression(element)) {
statements = appendExportsOfBindingElement(statements, element, exportSelf);
}
}
} else if (!isGeneratedIdentifier(decl.name)) {
let excludeName;
if (exportSelf) {
statements = appendExportStatement(statements, decl.name, factory2.getLocalName(decl));
excludeName = idText(decl.name);
}
statements = appendExportsOfDeclaration(statements, decl, excludeName);
}
return statements;
}
function appendExportsOfHoistedDeclaration(statements, decl) {
if (moduleInfo.exportEquals) {
return statements;
}
let excludeName;
if (hasSyntacticModifier(decl, 1 /* Export */)) {
const exportName = hasSyntacticModifier(decl, 1024 /* Default */) ? factory2.createStringLiteral("default") : decl.name;
statements = appendExportStatement(statements, exportName, factory2.getLocalName(decl));
excludeName = getTextOfIdentifierOrLiteral(exportName);
}
if (decl.name) {
statements = appendExportsOfDeclaration(statements, decl, excludeName);
}
return statements;
}
function appendExportsOfDeclaration(statements, decl, excludeName) {
if (moduleInfo.exportEquals) {
return statements;
}
const name = factory2.getDeclarationName(decl);
const exportSpecifiers = moduleInfo.exportSpecifiers.get(idText(name));
if (exportSpecifiers) {
for (const exportSpecifier of exportSpecifiers) {
if (exportSpecifier.name.escapedText !== excludeName) {
statements = appendExportStatement(statements, exportSpecifier.name, name);
}
}
}
return statements;
}
function appendExportStatement(statements, exportName, expression, allowComments) {
statements = append(statements, createExportStatement(exportName, expression, allowComments));
return statements;
}
function createExportStatement(name, value, allowComments) {
const statement = factory2.createExpressionStatement(createExportExpression(name, value));
startOnNewLine(statement);
if (!allowComments) {
setEmitFlags(statement, 3072 /* NoComments */);
}
return statement;
}
function createExportExpression(name, value) {
const exportName = isIdentifier(name) ? factory2.createStringLiteralFromNode(name) : name;
setEmitFlags(value, getEmitFlags(value) | 3072 /* NoComments */);
return setCommentRange(factory2.createCallExpression(
exportFunction,
/*typeArguments*/
void 0,
[exportName, value]
), value);
}
function topLevelNestedVisitor(node) {
switch (node.kind) {
case 242 /* VariableStatement */:
return visitVariableStatement(node);
case 261 /* FunctionDeclaration */:
return visitFunctionDeclaration(node);
case 262 /* ClassDeclaration */:
return visitClassDeclaration(node);
case 247 /* ForStatement */:
return visitForStatement(
node,
/*isTopLevel*/
true
);
case 248 /* ForInStatement */:
return visitForInStatement(node);
case 249 /* ForOfStatement */:
return visitForOfStatement(node);
case 245 /* DoStatement */:
return visitDoStatement(node);
case 246 /* WhileStatement */:
return visitWhileStatement(node);
case 255 /* LabeledStatement */:
return visitLabeledStatement(node);
case 253 /* WithStatement */:
return visitWithStatement(node);
case 244 /* IfStatement */:
return visitIfStatement(node);
case 254 /* SwitchStatement */:
return visitSwitchStatement(node);
case 268 /* CaseBlock */:
return visitCaseBlock(node);
case 295 /* CaseClause */:
return visitCaseClause(node);
case 296 /* DefaultClause */:
return visitDefaultClause(node);
case 257 /* TryStatement */:
return visitTryStatement(node);
case 298 /* CatchClause */:
return visitCatchClause(node);
case 240 /* Block */:
return visitBlock(node);
default:
return visitor(node);
}
}
function visitForStatement(node, isTopLevel) {
const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
enclosingBlockScopedContainer = node;
node = factory2.updateForStatement(
node,
visitNode(node.initializer, isTopLevel ? visitForInitializer : discardedValueVisitor, isForInitializer),
visitNode(node.condition, visitor, isExpression),
visitNode(node.incrementor, discardedValueVisitor, isExpression),
visitIterationBody(node.statement, isTopLevel ? topLevelNestedVisitor : visitor, context)
);
enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
return node;
}
function visitForInStatement(node) {
const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
enclosingBlockScopedContainer = node;
node = factory2.updateForInStatement(
node,
visitForInitializer(node.initializer),
visitNode(node.expression, visitor, isExpression),
visitIterationBody(node.statement, topLevelNestedVisitor, context)
);
enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
return node;
}
function visitForOfStatement(node) {
const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
enclosingBlockScopedContainer = node;
node = factory2.updateForOfStatement(
node,
node.awaitModifier,
visitForInitializer(node.initializer),
visitNode(node.expression, visitor, isExpression),
visitIterationBody(node.statement, topLevelNestedVisitor, context)
);
enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
return node;
}
function shouldHoistForInitializer(node) {
return isVariableDeclarationList(node) && shouldHoistVariableDeclarationList(node);
}
function visitForInitializer(node) {
if (shouldHoistForInitializer(node)) {
let expressions;
for (const variable of node.declarations) {
expressions = append(expressions, transformInitializedVariable(
variable,
/*isExportedDeclaration*/
false
));
if (!variable.initializer) {
hoistBindingElement(variable);
}
}
return expressions ? factory2.inlineExpressions(expressions) : factory2.createOmittedExpression();
} else {
return visitNode(node, discardedValueVisitor, isForInitializer);
}
}
function visitDoStatement(node) {
return factory2.updateDoStatement(
node,
visitIterationBody(node.statement, topLevelNestedVisitor, context),
visitNode(node.expression, visitor, isExpression)
);
}
function visitWhileStatement(node) {
return factory2.updateWhileStatement(
node,
visitNode(node.expression, visitor, isExpression),
visitIterationBody(node.statement, topLevelNestedVisitor, context)
);
}
function visitLabeledStatement(node) {
return factory2.updateLabeledStatement(
node,
node.label,
Debug.checkDefined(visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock))
);
}
function visitWithStatement(node) {
return factory2.updateWithStatement(
node,
visitNode(node.expression, visitor, isExpression),
Debug.checkDefined(visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock))
);
}
function visitIfStatement(node) {
return factory2.updateIfStatement(
node,
visitNode(node.expression, visitor, isExpression),
Debug.checkDefined(visitNode(node.thenStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock)),
visitNode(node.elseStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock)
);
}
function visitSwitchStatement(node) {
return factory2.updateSwitchStatement(
node,
visitNode(node.expression, visitor, isExpression),
Debug.checkDefined(visitNode(node.caseBlock, topLevelNestedVisitor, isCaseBlock))
);
}
function visitCaseBlock(node) {
const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
enclosingBlockScopedContainer = node;
node = factory2.updateCaseBlock(
node,
visitNodes2(node.clauses, topLevelNestedVisitor, isCaseOrDefaultClause)
);
enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
return node;
}
function visitCaseClause(node) {
return factory2.updateCaseClause(
node,
visitNode(node.expression, visitor, isExpression),
visitNodes2(node.statements, topLevelNestedVisitor, isStatement)
);
}
function visitDefaultClause(node) {
return visitEachChild(node, topLevelNestedVisitor, context);
}
function visitTryStatement(node) {
return visitEachChild(node, topLevelNestedVisitor, context);
}
function visitCatchClause(node) {
const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
enclosingBlockScopedContainer = node;
node = factory2.updateCatchClause(
node,
node.variableDeclaration,
Debug.checkDefined(visitNode(node.block, topLevelNestedVisitor, isBlock))
);
enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
return node;
}
function visitBlock(node) {
const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
enclosingBlockScopedContainer = node;
node = visitEachChild(node, topLevelNestedVisitor, context);
enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
return node;
}
function visitorWorker(node, valueIsDiscarded) {
if (!(node.transformFlags & (4096 /* ContainsDestructuringAssignment */ | 8388608 /* ContainsDynamicImport */ | 268435456 /* ContainsUpdateExpressionForIdentifier */))) {
return node;
}
switch (node.kind) {
case 247 /* ForStatement */:
return visitForStatement(
node,
/*isTopLevel*/
false
);
case 243 /* ExpressionStatement */:
return visitExpressionStatement(node);
case 216 /* ParenthesizedExpression */:
return visitParenthesizedExpression(node, valueIsDiscarded);
case 359 /* PartiallyEmittedExpression */:
return visitPartiallyEmittedExpression(node, valueIsDiscarded);
case 225 /* BinaryExpression */:
if (isDestructuringAssignment(node)) {
return visitDestructuringAssignment(node, valueIsDiscarded);
}
break;
case 212 /* CallExpression */:
if (isImportCall(node)) {
return visitImportCallExpression(node);
}
break;
case 223 /* PrefixUnaryExpression */:
case 224 /* PostfixUnaryExpression */:
return visitPrefixOrPostfixUnaryExpression(node, valueIsDiscarded);
}
return visitEachChild(node, visitor, context);
}
function visitor(node) {
return visitorWorker(
node,
/*valueIsDiscarded*/
false
);
}
function discardedValueVisitor(node) {
return visitorWorker(
node,
/*valueIsDiscarded*/
true
);
}
function visitExpressionStatement(node) {
return factory2.updateExpressionStatement(node, visitNode(node.expression, discardedValueVisitor, isExpression));
}
function visitParenthesizedExpression(node, valueIsDiscarded) {
return factory2.updateParenthesizedExpression(node, visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, isExpression));
}
function visitPartiallyEmittedExpression(node, valueIsDiscarded) {
return factory2.updatePartiallyEmittedExpression(node, visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, isExpression));
}
function visitImportCallExpression(node) {
const externalModuleName = getExternalModuleNameLiteral(factory2, node, currentSourceFile, host, resolver, compilerOptions);
const firstArgument = visitNode(firstOrUndefined(node.arguments), visitor, isExpression);
const argument = externalModuleName && (!firstArgument || !isStringLiteral(firstArgument) || firstArgument.text !== externalModuleName.text) ? externalModuleName : firstArgument;
return factory2.createCallExpression(
factory2.createPropertyAccessExpression(
contextObject,
factory2.createIdentifier("import")
),
/*typeArguments*/
void 0,
argument ? [argument] : []
);
}
function visitDestructuringAssignment(node, valueIsDiscarded) {
if (hasExportedReferenceInDestructuringTarget(node.left)) {
return flattenDestructuringAssignment(
node,
visitor,
context,
0 /* All */,
!valueIsDiscarded
);
}
return visitEachChild(node, visitor, context);
}
function hasExportedReferenceInDestructuringTarget(node) {
if (isAssignmentExpression(
node,
/*excludeCompoundAssignment*/
true
)) {
return hasExportedReferenceInDestructuringTarget(node.left);
} else if (isSpreadElement(node)) {
return hasExportedReferenceInDestructuringTarget(node.expression);
} else if (isObjectLiteralExpression(node)) {
return some(node.properties, hasExportedReferenceInDestructuringTarget);
} else if (isArrayLiteralExpression(node)) {
return some(node.elements, hasExportedReferenceInDestructuringTarget);
} else if (isShorthandPropertyAssignment(node)) {
return hasExportedReferenceInDestructuringTarget(node.name);
} else if (isPropertyAssignment(node)) {
return hasExportedReferenceInDestructuringTarget(node.initializer);
} else if (isIdentifier(node)) {
const container = resolver.getReferencedExportContainer(node);
return container !== void 0 && container.kind === 311 /* SourceFile */;
} else {
return false;
}
}
function visitPrefixOrPostfixUnaryExpression(node, valueIsDiscarded) {
if ((node.operator === 46 /* PlusPlusToken */ || node.operator === 47 /* MinusMinusToken */) && isIdentifier(node.operand) && !isGeneratedIdentifier(node.operand) && !isLocalName(node.operand) && !isDeclarationNameOfEnumOrNamespace(node.operand)) {
const exportedNames = getExports(node.operand);
if (exportedNames) {
let temp;
let expression = visitNode(node.operand, visitor, isExpression);
if (isPrefixUnaryExpression(node)) {
expression = factory2.updatePrefixUnaryExpression(node, expression);
} else {
expression = factory2.updatePostfixUnaryExpression(node, expression);
if (!valueIsDiscarded) {
temp = factory2.createTempVariable(hoistVariableDeclaration);
expression = factory2.createAssignment(temp, expression);
setTextRange(expression, node);
}
expression = factory2.createComma(expression, factory2.cloneNode(node.operand));
setTextRange(expression, node);
}
for (const exportName of exportedNames) {
expression = createExportExpression(exportName, preventSubstitution(expression));
}
if (temp) {
expression = factory2.createComma(expression, temp);
setTextRange(expression, node);
}
return expression;
}
}
return visitEachChild(node, visitor, context);
}
function modifierVisitor(node) {
switch (node.kind) {
case 95 /* ExportKeyword */:
case 90 /* DefaultKeyword */:
return void 0;
}
return node;
}
function onEmitNode(hint, node, emitCallback) {
if (node.kind === 311 /* SourceFile */) {
const id = getOriginalNodeId(node);
currentSourceFile = node;
moduleInfo = moduleInfoMap[id];
exportFunction = exportFunctionsMap[id];
noSubstitution = noSubstitutionMap[id];
contextObject = contextObjectMap[id];
if (noSubstitution) {
delete noSubstitutionMap[id];
}
previousOnEmitNode(hint, node, emitCallback);
currentSourceFile = void 0;
moduleInfo = void 0;
exportFunction = void 0;
contextObject = void 0;
noSubstitution = void 0;
} else {
previousOnEmitNode(hint, node, emitCallback);
}
}
function onSubstituteNode(hint, node) {
node = previousOnSubstituteNode(hint, node);
if (isSubstitutionPrevented(node)) {
return node;
}
if (hint === 1 /* Expression */) {
return substituteExpression(node);
} else if (hint === 4 /* Unspecified */) {
return substituteUnspecified(node);
}
return node;
}
function substituteUnspecified(node) {
switch (node.kind) {
case 303 /* ShorthandPropertyAssignment */:
return substituteShorthandPropertyAssignment(node);
}
return node;
}
function substituteShorthandPropertyAssignment(node) {
var _a, _b;
const name = node.name;
if (!isGeneratedIdentifier(name) && !isLocalName(name)) {
const importDeclaration = resolver.getReferencedImportDeclaration(name);
if (importDeclaration) {
if (isImportClause(importDeclaration)) {
return setTextRange(
factory2.createPropertyAssignment(
factory2.cloneNode(name),
factory2.createPropertyAccessExpression(
factory2.getGeneratedNameForNode(importDeclaration.parent),
factory2.createIdentifier("default")
)
),
/*location*/
node
);
} else if (isImportSpecifier(importDeclaration)) {
return setTextRange(
factory2.createPropertyAssignment(
factory2.cloneNode(name),
factory2.createPropertyAccessExpression(
factory2.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) == null ? void 0 : _a.parent) == null ? void 0 : _b.parent) || importDeclaration),
factory2.cloneNode(importDeclaration.propertyName || importDeclaration.name)
)
),
/*location*/
node
);
}
}
}
return node;
}
function substituteExpression(node) {
switch (node.kind) {
case 80 /* Identifier */:
return substituteExpressionIdentifier(node);
case 225 /* BinaryExpression */:
return substituteBinaryExpression(node);
case 235 /* MetaProperty */:
return substituteMetaProperty(node);
}
return node;
}
function substituteExpressionIdentifier(node) {
var _a, _b;
if (getEmitFlags(node) & 8192 /* HelperName */) {
const externalHelpersModuleName = getExternalHelpersModuleName(currentSourceFile);
if (externalHelpersModuleName) {
return factory2.createPropertyAccessExpression(externalHelpersModuleName, node);
}
return node;
}
if (!isGeneratedIdentifier(node) && !isLocalName(node)) {
const importDeclaration = resolver.getReferencedImportDeclaration(node);
if (importDeclaration) {
if (isImportClause(importDeclaration)) {
return setTextRange(
factory2.createPropertyAccessExpression(
factory2.getGeneratedNameForNode(importDeclaration.parent),
factory2.createIdentifier("default")
),
/*location*/
node
);
} else if (isImportSpecifier(importDeclaration)) {
return setTextRange(
factory2.createPropertyAccessExpression(
factory2.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) == null ? void 0 : _a.parent) == null ? void 0 : _b.parent) || importDeclaration),
factory2.cloneNode(importDeclaration.propertyName || importDeclaration.name)
),
/*location*/
node
);
}
}
}
return node;
}
function substituteBinaryExpression(node) {
if (isAssignmentOperator(node.operatorToken.kind) && isIdentifier(node.left) && !isGeneratedIdentifier(node.left) && !isLocalName(node.left)) {
const exportedNames = getExports(node.left);
if (exportedNames) {
let expression = node;
for (const exportName of exportedNames) {
expression = createExportExpression(exportName, preventSubstitution(expression));
}
return expression;
}
}
return node;
}
function substituteMetaProperty(node) {
if (isImportMeta(node)) {
return factory2.createPropertyAccessExpression(contextObject, factory2.createIdentifier("meta"));
}
return node;
}
function getExports(name) {
let exportedNames;
const valueDeclaration = getReferencedDeclaration(name);
if (valueDeclaration) {
const exportContainer = resolver.getReferencedExportContainer(
name,
/*prefixLocals*/
false
);
if (exportContainer && exportContainer.kind === 311 /* SourceFile */) {
exportedNames = append(exportedNames, factory2.getDeclarationName(valueDeclaration));
}
exportedNames = addRange(exportedNames, moduleInfo == null ? void 0 : moduleInfo.exportedBindings[getOriginalNodeId(valueDeclaration)]);
}
return exportedNames;
}
function getReferencedDeclaration(name) {
if (!isGeneratedIdentifier(name)) {
const importDeclaration = resolver.getReferencedImportDeclaration(name);
if (importDeclaration)
return importDeclaration;
const valueDeclaration = resolver.getReferencedValueDeclaration(name);
if (valueDeclaration && (moduleInfo == null ? void 0 : moduleInfo.exportedBindings[getOriginalNodeId(valueDeclaration)]))
return valueDeclaration;
const declarations = resolver.getReferencedValueDeclarations(name);
if (declarations) {
for (const declaration of declarations) {
if (declaration !== valueDeclaration && (moduleInfo == null ? void 0 : moduleInfo.exportedBindings[getOriginalNodeId(declaration)]))
return declaration;
}
}
return valueDeclaration;
}
}
function preventSubstitution(node) {
if (noSubstitution === void 0)
noSubstitution = [];
noSubstitution[getNodeId(node)] = true;
return node;
}
function isSubstitutionPrevented(node) {
return noSubstitution && node.id && noSubstitution[node.id];
}
}
// src/compiler/transformers/module/esnextAnd2015.ts
function transformECMAScriptModule(context) {
const {
factory: factory2,
getEmitHelperFactory: emitHelpers
} = context;
const host = context.getEmitHost();
const resolver = context.getEmitResolver();
const compilerOptions = context.getCompilerOptions();
const languageVersion = getEmitScriptTarget(compilerOptions);
const previousOnEmitNode = context.onEmitNode;
const previousOnSubstituteNode = context.onSubstituteNode;
context.onEmitNode = onEmitNode;
context.onSubstituteNode = onSubstituteNode;
context.enableEmitNotification(311 /* SourceFile */);
context.enableSubstitution(80 /* Identifier */);
let helperNameSubstitutions;
let currentSourceFile;
let importRequireStatements;
return chainBundle(context, transformSourceFile);
function transformSourceFile(node) {
if (node.isDeclarationFile) {
return node;
}
if (isExternalModule(node) || getIsolatedModules(compilerOptions)) {
currentSourceFile = node;
importRequireStatements = void 0;
let result = updateExternalModule(node);
currentSourceFile = void 0;
if (importRequireStatements) {
result = factory2.updateSourceFile(
result,
setTextRange(factory2.createNodeArray(insertStatementsAfterCustomPrologue(result.statements.slice(), importRequireStatements)), result.statements)
);
}
if (!isExternalModule(node) || some(result.statements, isExternalModuleIndicator)) {
return result;
}
return factory2.updateSourceFile(
result,
setTextRange(factory2.createNodeArray([...result.statements, createEmptyExports(factory2)]), result.statements)
);
}
return node;
}
function updateExternalModule(node) {
const externalHelpersImportDeclaration = createExternalHelpersImportDeclarationIfNeeded(factory2, emitHelpers(), node, compilerOptions);
if (externalHelpersImportDeclaration) {
const statements = [];
const statementOffset = factory2.copyPrologue(node.statements, statements);
append(statements, externalHelpersImportDeclaration);
addRange(statements, visitNodes2(node.statements, visitor, isStatement, statementOffset));
return factory2.updateSourceFile(
node,
setTextRange(factory2.createNodeArray(statements), node.statements)
);
} else {
return visitEachChild(node, visitor, context);
}
}
function visitor(node) {
switch (node.kind) {
case 270 /* ImportEqualsDeclaration */:
return getEmitModuleKind(compilerOptions) >= 100 /* Node16 */ ? visitImportEqualsDeclaration(node) : void 0;
case 276 /* ExportAssignment */:
return visitExportAssignment(node);
case 277 /* ExportDeclaration */:
const exportDecl = node;
return visitExportDeclaration(exportDecl);
}
return node;
}
function createRequireCall(importNode) {
const moduleName = getExternalModuleNameLiteral(factory2, importNode, Debug.checkDefined(currentSourceFile), host, resolver, compilerOptions);
const args = [];
if (moduleName) {
args.push(moduleName);
}
if (!importRequireStatements) {
const createRequireName = factory2.createUniqueName("_createRequire", 16 /* Optimistic */ | 32 /* FileLevel */);
const importStatement = factory2.createImportDeclaration(
/*modifiers*/
void 0,
factory2.createImportClause(
/*isTypeOnly*/
false,
/*name*/
void 0,
factory2.createNamedImports([
factory2.createImportSpecifier(
/*isTypeOnly*/
false,
factory2.createIdentifier("createRequire"),
createRequireName
)
])
),
factory2.createStringLiteral("module")
);
const requireHelperName = factory2.createUniqueName("__require", 16 /* Optimistic */ | 32 /* FileLevel */);
const requireStatement = factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(
[
factory2.createVariableDeclaration(
requireHelperName,
/*exclamationToken*/
void 0,
/*type*/
void 0,
factory2.createCallExpression(
factory2.cloneNode(createRequireName),
/*typeArguments*/
void 0,
[
factory2.createPropertyAccessExpression(factory2.createMetaProperty(102 /* ImportKeyword */, factory2.createIdentifier("meta")), factory2.createIdentifier("url"))
]
)
)
],
/*flags*/
languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */
)
);
importRequireStatements = [importStatement, requireStatement];
}
const name = importRequireStatements[1].declarationList.declarations[0].name;
Debug.assertNode(name, isIdentifier);
return factory2.createCallExpression(
factory2.cloneNode(name),
/*typeArguments*/
void 0,
args
);
}
function visitImportEqualsDeclaration(node) {
Debug.assert(isExternalModuleImportEqualsDeclaration(node), "import= for internal module references should be handled in an earlier transformer.");
let statements;
statements = append(
statements,
setOriginalNode(
setTextRange(
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(
[
factory2.createVariableDeclaration(
factory2.cloneNode(node.name),
/*exclamationToken*/
void 0,
/*type*/
void 0,
createRequireCall(node)
)
],
/*flags*/
languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */
)
),
node
),
node
)
);
statements = appendExportsOfImportEqualsDeclaration(statements, node);
return singleOrMany(statements);
}
function appendExportsOfImportEqualsDeclaration(statements, node) {
if (hasSyntacticModifier(node, 1 /* Export */)) {
statements = append(statements, factory2.createExportDeclaration(
/*modifiers*/
void 0,
node.isTypeOnly,
factory2.createNamedExports([factory2.createExportSpecifier(
/*isTypeOnly*/
false,
/*propertyName*/
void 0,
idText(node.name)
)])
));
}
return statements;
}
function visitExportAssignment(node) {
return node.isExportEquals ? void 0 : node;
}
function visitExportDeclaration(node) {
if (compilerOptions.module !== void 0 && compilerOptions.module > 5 /* ES2015 */) {
return node;
}
if (!node.exportClause || !isNamespaceExport(node.exportClause) || !node.moduleSpecifier) {
return node;
}
const oldIdentifier = node.exportClause.name;
const synthName = factory2.getGeneratedNameForNode(oldIdentifier);
const importDecl = factory2.createImportDeclaration(
/*modifiers*/
void 0,
factory2.createImportClause(
/*isTypeOnly*/
false,
/*name*/
void 0,
factory2.createNamespaceImport(
synthName
)
),
node.moduleSpecifier,
node.assertClause
);
setOriginalNode(importDecl, node.exportClause);
const exportDecl = isExportNamespaceAsDefaultDeclaration(node) ? factory2.createExportDefault(synthName) : factory2.createExportDeclaration(
/*modifiers*/
void 0,
/*isTypeOnly*/
false,
factory2.createNamedExports([factory2.createExportSpecifier(
/*isTypeOnly*/
false,
synthName,
oldIdentifier
)])
);
setOriginalNode(exportDecl, node);
return [importDecl, exportDecl];
}
function onEmitNode(hint, node, emitCallback) {
if (isSourceFile(node)) {
if ((isExternalModule(node) || getIsolatedModules(compilerOptions)) && compilerOptions.importHelpers) {
helperNameSubstitutions = /* @__PURE__ */ new Map();
}
previousOnEmitNode(hint, node, emitCallback);
helperNameSubstitutions = void 0;
} else {
previousOnEmitNode(hint, node, emitCallback);
}
}
function onSubstituteNode(hint, node) {
node = previousOnSubstituteNode(hint, node);
if (helperNameSubstitutions && isIdentifier(node) && getEmitFlags(node) & 8192 /* HelperName */) {
return substituteHelperName(node);
}
return node;
}
function substituteHelperName(node) {
const name = idText(node);
let substitution = helperNameSubstitutions.get(name);
if (!substitution) {
helperNameSubstitutions.set(name, substitution = factory2.createUniqueName(name, 16 /* Optimistic */ | 32 /* FileLevel */));
}
return substitution;
}
}
// src/compiler/transformers/module/node.ts
function transformNodeModule(context) {
const previousOnSubstituteNode = context.onSubstituteNode;
const previousOnEmitNode = context.onEmitNode;
const esmTransform = transformECMAScriptModule(context);
const esmOnSubstituteNode = context.onSubstituteNode;
const esmOnEmitNode = context.onEmitNode;
context.onSubstituteNode = previousOnSubstituteNode;
context.onEmitNode = previousOnEmitNode;
const cjsTransform = transformModule(context);
const cjsOnSubstituteNode = context.onSubstituteNode;
const cjsOnEmitNode = context.onEmitNode;
context.onSubstituteNode = onSubstituteNode;
context.onEmitNode = onEmitNode;
context.enableSubstitution(311 /* SourceFile */);
context.enableEmitNotification(311 /* SourceFile */);
let currentSourceFile;
return transformSourceFileOrBundle;
function onSubstituteNode(hint, node) {
if (isSourceFile(node)) {
currentSourceFile = node;
return previousOnSubstituteNode(hint, node);
} else {
if (!currentSourceFile) {
return previousOnSubstituteNode(hint, node);
}
if (currentSourceFile.impliedNodeFormat === 99 /* ESNext */) {
return esmOnSubstituteNode(hint, node);
}
return cjsOnSubstituteNode(hint, node);
}
}
function onEmitNode(hint, node, emitCallback) {
if (isSourceFile(node)) {
currentSourceFile = node;
}
if (!currentSourceFile) {
return previousOnEmitNode(hint, node, emitCallback);
}
if (currentSourceFile.impliedNodeFormat === 99 /* ESNext */) {
return esmOnEmitNode(hint, node, emitCallback);
}
return cjsOnEmitNode(hint, node, emitCallback);
}
function getModuleTransformForFile(file) {
return file.impliedNodeFormat === 99 /* ESNext */ ? esmTransform : cjsTransform;
}
function transformSourceFile(node) {
if (node.isDeclarationFile) {
return node;
}
currentSourceFile = node;
const result = getModuleTransformForFile(node)(node);
currentSourceFile = void 0;
Debug.assert(isSourceFile(result));
return result;
}
function transformSourceFileOrBundle(node) {
return node.kind === 311 /* SourceFile */ ? transformSourceFile(node) : transformBundle(node);
}
function transformBundle(node) {
return context.factory.createBundle(map(node.sourceFiles, transformSourceFile), node.prepends);
}
}
// src/compiler/transformers/declarations/diagnostics.ts
function canProduceDiagnostics(node) {
return isVariableDeclaration(node) || isPropertyDeclaration(node) || isPropertySignature(node) || isBindingElement(node) || isSetAccessor(node) || isGetAccessor(node) || isConstructSignatureDeclaration(node) || isCallSignatureDeclaration(node) || isMethodDeclaration(node) || isMethodSignature(node) || isFunctionDeclaration(node) || isParameter(node) || isTypeParameterDeclaration(node) || isExpressionWithTypeArguments(node) || isImportEqualsDeclaration(node) || isTypeAliasDeclaration(node) || isConstructorDeclaration(node) || isIndexSignatureDeclaration(node) || isPropertyAccessExpression(node) || isElementAccessExpression(node) || isBinaryExpression(node) || isJSDocTypeAlias(node);
}
function createGetSymbolAccessibilityDiagnosticForNodeName(node) {
if (isSetAccessor(node) || isGetAccessor(node)) {
return getAccessorNameVisibilityError;
} else if (isMethodSignature(node) || isMethodDeclaration(node)) {
return getMethodNameVisibilityError;
} else {
return createGetSymbolAccessibilityDiagnosticForNode(node);
}
function getAccessorNameVisibilityError(symbolAccessibilityResult) {
const diagnosticMessage = getAccessorNameVisibilityDiagnosticMessage(symbolAccessibilityResult);
return diagnosticMessage !== void 0 ? {
diagnosticMessage,
errorNode: node,
typeName: node.name
} : void 0;
}
function getAccessorNameVisibilityDiagnosticMessage(symbolAccessibilityResult) {
if (isStatic(node)) {
return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1;
} else if (node.parent.kind === 262 /* ClassDeclaration */) {
return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1;
} else {
return symbolAccessibilityResult.errorModuleName ? Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1;
}
}
function getMethodNameVisibilityError(symbolAccessibilityResult) {
const diagnosticMessage = getMethodNameVisibilityDiagnosticMessage(symbolAccessibilityResult);
return diagnosticMessage !== void 0 ? {
diagnosticMessage,
errorNode: node,
typeName: node.name
} : void 0;
}
function getMethodNameVisibilityDiagnosticMessage(symbolAccessibilityResult) {
if (isStatic(node)) {
return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_private_name_1;
} else if (node.parent.kind === 262 /* ClassDeclaration */) {
return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_method_0_of_exported_class_has_or_is_using_private_name_1;
} else {
return symbolAccessibilityResult.errorModuleName ? Diagnostics.Method_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Method_0_of_exported_interface_has_or_is_using_private_name_1;
}
}
}
function createGetSymbolAccessibilityDiagnosticForNode(node) {
if (isVariableDeclaration(node) || isPropertyDeclaration(node) || isPropertySignature(node) || isPropertyAccessExpression(node) || isElementAccessExpression(node) || isBinaryExpression(node) || isBindingElement(node) || isConstructorDeclaration(node)) {
return getVariableDeclarationTypeVisibilityError;
} else if (isSetAccessor(node) || isGetAccessor(node)) {
return getAccessorDeclarationTypeVisibilityError;
} else if (isConstructSignatureDeclaration(node) || isCallSignatureDeclaration(node) || isMethodDeclaration(node) || isMethodSignature(node) || isFunctionDeclaration(node) || isIndexSignatureDeclaration(node)) {
return getReturnTypeVisibilityError;
} else if (isParameter(node)) {
if (isParameterPropertyDeclaration(node, node.parent) && hasSyntacticModifier(node.parent, 8 /* Private */)) {
return getVariableDeclarationTypeVisibilityError;
}
return getParameterDeclarationTypeVisibilityError;
} else if (isTypeParameterDeclaration(node)) {
return getTypeParameterConstraintVisibilityError;
} else if (isExpressionWithTypeArguments(node)) {
return getHeritageClauseVisibilityError;
} else if (isImportEqualsDeclaration(node)) {
return getImportEntityNameVisibilityError;
} else if (isTypeAliasDeclaration(node) || isJSDocTypeAlias(node)) {
return getTypeAliasDeclarationVisibilityError;
} else {
return Debug.assertNever(node, `Attempted to set a declaration diagnostic context for unhandled node kind: ${Debug.formatSyntaxKind(node.kind)}`);
}
function getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult) {
if (node.kind === 259 /* VariableDeclaration */ || node.kind === 207 /* BindingElement */) {
return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Exported_variable_0_has_or_is_using_private_name_1;
} else if (node.kind === 171 /* PropertyDeclaration */ || node.kind === 210 /* PropertyAccessExpression */ || node.kind === 211 /* ElementAccessExpression */ || node.kind === 225 /* BinaryExpression */ || node.kind === 170 /* PropertySignature */ || node.kind === 168 /* Parameter */ && hasSyntacticModifier(node.parent, 8 /* Private */)) {
if (isStatic(node)) {
return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1;
} else if (node.parent.kind === 262 /* ClassDeclaration */ || node.kind === 168 /* Parameter */) {
return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1;
} else {
return symbolAccessibilityResult.errorModuleName ? Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1;
}
}
}
function getVariableDeclarationTypeVisibilityError(symbolAccessibilityResult) {
const diagnosticMessage = getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult);
return diagnosticMessage !== void 0 ? {
diagnosticMessage,
errorNode: node,
typeName: node.name
} : void 0;
}
function getAccessorDeclarationTypeVisibilityError(symbolAccessibilityResult) {
let diagnosticMessage;
if (node.kind === 177 /* SetAccessor */) {
if (isStatic(node)) {
diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_private_name_1;
} else {
diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_private_name_1;
}
} else {
if (isStatic(node)) {
diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_private_name_1;
} else {
diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_private_name_1;
}
}
return {
diagnosticMessage,
errorNode: node.name,
typeName: node.name
};
}
function getReturnTypeVisibilityError(symbolAccessibilityResult) {
let diagnosticMessage;
switch (node.kind) {
case 179 /* ConstructSignature */:
diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0;
break;
case 178 /* CallSignature */:
diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0;
break;
case 180 /* IndexSignature */:
diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0;
break;
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
if (isStatic(node)) {
diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0;
} else if (node.parent.kind === 262 /* ClassDeclaration */) {
diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0;
} else {
diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0;
}
break;
case 261 /* FunctionDeclaration */:
diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_exported_function_has_or_is_using_private_name_0;
break;
default:
return Debug.fail("This is unknown kind for signature: " + node.kind);
}
return {
diagnosticMessage,
errorNode: node.name || node
};
}
function getParameterDeclarationTypeVisibilityError(symbolAccessibilityResult) {
const diagnosticMessage = getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult);
return diagnosticMessage !== void 0 ? {
diagnosticMessage,
errorNode: node,
typeName: node.name
} : void 0;
}
function getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult) {
switch (node.parent.kind) {
case 175 /* Constructor */:
return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1;
case 179 /* ConstructSignature */:
case 184 /* ConstructorType */:
return symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
case 178 /* CallSignature */:
return symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
case 180 /* IndexSignature */:
return symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_private_name_1;
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
if (isStatic(node.parent)) {
return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
} else if (node.parent.parent.kind === 262 /* ClassDeclaration */) {
return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
} else {
return symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
}
case 261 /* FunctionDeclaration */:
case 183 /* FunctionType */:
return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_exported_function_has_or_is_using_private_name_1;
case 177 /* SetAccessor */:
case 176 /* GetAccessor */:
return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_accessor_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_accessor_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_accessor_has_or_is_using_private_name_1;
default:
return Debug.fail(`Unknown parent for parameter: ${Debug.formatSyntaxKind(node.parent.kind)}`);
}
}
function getTypeParameterConstraintVisibilityError() {
let diagnosticMessage;
switch (node.parent.kind) {
case 262 /* ClassDeclaration */:
diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_class_has_or_is_using_private_name_1;
break;
case 263 /* InterfaceDeclaration */:
diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1;
break;
case 199 /* MappedType */:
diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_mapped_object_type_is_using_private_name_1;
break;
case 184 /* ConstructorType */:
case 179 /* ConstructSignature */:
diagnosticMessage = Diagnostics.Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
break;
case 178 /* CallSignature */:
diagnosticMessage = Diagnostics.Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
break;
case 173 /* MethodDeclaration */:
case 172 /* MethodSignature */:
if (isStatic(node.parent)) {
diagnosticMessage = Diagnostics.Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
} else if (node.parent.parent.kind === 262 /* ClassDeclaration */) {
diagnosticMessage = Diagnostics.Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
} else {
diagnosticMessage = Diagnostics.Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
}
break;
case 183 /* FunctionType */:
case 261 /* FunctionDeclaration */:
diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_function_has_or_is_using_private_name_1;
break;
case 194 /* InferType */:
diagnosticMessage = Diagnostics.Extends_clause_for_inferred_type_0_has_or_is_using_private_name_1;
break;
case 264 /* TypeAliasDeclaration */:
diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_type_alias_has_or_is_using_private_name_1;
break;
default:
return Debug.fail("This is unknown parent for type parameter: " + node.parent.kind);
}
return {
diagnosticMessage,
errorNode: node,
typeName: node.name
};
}
function getHeritageClauseVisibilityError() {
let diagnosticMessage;
if (isClassDeclaration(node.parent.parent)) {
diagnosticMessage = isHeritageClause(node.parent) && node.parent.token === 119 /* ImplementsKeyword */ ? Diagnostics.Implements_clause_of_exported_class_0_has_or_is_using_private_name_1 : node.parent.parent.name ? Diagnostics.extends_clause_of_exported_class_0_has_or_is_using_private_name_1 : Diagnostics.extends_clause_of_exported_class_has_or_is_using_private_name_0;
} else {
diagnosticMessage = Diagnostics.extends_clause_of_exported_interface_0_has_or_is_using_private_name_1;
}
return {
diagnosticMessage,
errorNode: node,
typeName: getNameOfDeclaration(node.parent.parent)
};
}
function getImportEntityNameVisibilityError() {
return {
diagnosticMessage: Diagnostics.Import_declaration_0_is_using_private_name_1,
errorNode: node,
typeName: node.name
};
}
function getTypeAliasDeclarationVisibilityError(symbolAccessibilityResult) {
return {
diagnosticMessage: symbolAccessibilityResult.errorModuleName ? Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1_from_module_2 : Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1,
errorNode: isJSDocTypeAlias(node) ? Debug.checkDefined(node.typeExpression) : node.type,
typeName: isJSDocTypeAlias(node) ? getNameOfDeclaration(node) : node.name
};
}
}
// src/compiler/transformers/declarations.ts
function getDeclarationDiagnostics(host, resolver, file) {
const compilerOptions = host.getCompilerOptions();
const result = transformNodes(
resolver,
host,
factory,
compilerOptions,
file ? [file] : filter(host.getSourceFiles(), isSourceFileNotJson),
[transformDeclarations],
/*allowDtsFiles*/
false
);
return result.diagnostics;
}
function hasInternalAnnotation(range, currentSourceFile) {
const comment = currentSourceFile.text.substring(range.pos, range.end);
return stringContains(comment, "@internal");
}
function isInternalDeclaration(node, currentSourceFile) {
const parseTreeNode = getParseTreeNode(node);
if (parseTreeNode && parseTreeNode.kind === 168 /* Parameter */) {
const paramIdx = parseTreeNode.parent.parameters.indexOf(parseTreeNode);
const previousSibling = paramIdx > 0 ? parseTreeNode.parent.parameters[paramIdx - 1] : void 0;
const text = currentSourceFile.text;
const commentRanges = previousSibling ? concatenate(
// to handle
// ... parameters, /** @internal */
// public param: string
getTrailingCommentRanges(text, skipTrivia(
text,
previousSibling.end + 1,
/*stopAfterLineBreak*/
false,
/*stopAtComments*/
true
)),
getLeadingCommentRanges(text, node.pos)
) : getTrailingCommentRanges(text, skipTrivia(
text,
node.pos,
/*stopAfterLineBreak*/
false,
/*stopAtComments*/
true
));
return commentRanges && commentRanges.length && hasInternalAnnotation(last(commentRanges), currentSourceFile);
}
const leadingCommentRanges = parseTreeNode && getLeadingCommentRangesOfNode(parseTreeNode, currentSourceFile);
return !!forEach(leadingCommentRanges, (range) => {
return hasInternalAnnotation(range, currentSourceFile);
});
}
var declarationEmitNodeBuilderFlags = 1024 /* MultilineObjectLiterals */ | 2048 /* WriteClassExpressionAsTypeLiteral */ | 4096 /* UseTypeOfFunction */ | 8 /* UseStructuralFallback */ | 524288 /* AllowEmptyTuple */ | 4 /* GenerateNamesForShadowedTypeParams */ | 1 /* NoTruncation */;
function transformDeclarations(context) {
const throwDiagnostic = () => Debug.fail("Diagnostic emitted without context");
let getSymbolAccessibilityDiagnostic = throwDiagnostic;
let needsDeclare = true;
let isBundledEmit = false;
let resultHasExternalModuleIndicator = false;
let needsScopeFixMarker = false;
let resultHasScopeMarker = false;
let enclosingDeclaration;
let necessaryTypeReferences;
let lateMarkedStatements;
let lateStatementReplacementMap;
let suppressNewDiagnosticContexts;
let exportedModulesFromDeclarationEmit;
const { factory: factory2 } = context;
const host = context.getEmitHost();
const symbolTracker = {
trackSymbol,
reportInaccessibleThisError,
reportInaccessibleUniqueSymbolError,
reportCyclicStructureError,
reportPrivateInBaseOfClassExpression,
reportLikelyUnsafeImportRequiredError,
reportTruncationError,
moduleResolverHost: host,
trackReferencedAmbientModule,
trackExternalModuleSymbolOfImportTypeNode,
reportNonlocalAugmentation,
reportNonSerializableProperty,
reportImportTypeNodeResolutionModeOverride
};
let errorNameNode;
let errorFallbackNode;
let currentSourceFile;
let refs;
let libs2;
let emittedImports;
const resolver = context.getEmitResolver();
const options = context.getCompilerOptions();
const { noResolve, stripInternal } = options;
return transformRoot;
function recordTypeReferenceDirectivesIfNecessary(typeReferenceDirectives) {
if (!typeReferenceDirectives) {
return;
}
necessaryTypeReferences = necessaryTypeReferences || /* @__PURE__ */ new Set();
for (const ref of typeReferenceDirectives) {
necessaryTypeReferences.add(ref);
}
}
function trackReferencedAmbientModule(node, symbol) {
const directives = resolver.getTypeReferenceDirectivesForSymbol(symbol, 67108863 /* All */);
if (length(directives)) {
return recordTypeReferenceDirectivesIfNecessary(directives);
}
const container = getSourceFileOfNode(node);
refs.set(getOriginalNodeId(container), container);
}
function handleSymbolAccessibilityError(symbolAccessibilityResult) {
if (symbolAccessibilityResult.accessibility === 0 /* Accessible */) {
if (symbolAccessibilityResult && symbolAccessibilityResult.aliasesToMakeVisible) {
if (!lateMarkedStatements) {
lateMarkedStatements = symbolAccessibilityResult.aliasesToMakeVisible;
} else {
for (const ref of symbolAccessibilityResult.aliasesToMakeVisible) {
pushIfUnique(lateMarkedStatements, ref);
}
}
}
} else {
const errorInfo = getSymbolAccessibilityDiagnostic(symbolAccessibilityResult);
if (errorInfo) {
if (errorInfo.typeName) {
context.addDiagnostic(createDiagnosticForNode(
symbolAccessibilityResult.errorNode || errorInfo.errorNode,
errorInfo.diagnosticMessage,
getTextOfNode(errorInfo.typeName),
symbolAccessibilityResult.errorSymbolName,
symbolAccessibilityResult.errorModuleName
));
} else {
context.addDiagnostic(createDiagnosticForNode(
symbolAccessibilityResult.errorNode || errorInfo.errorNode,
errorInfo.diagnosticMessage,
symbolAccessibilityResult.errorSymbolName,
symbolAccessibilityResult.errorModuleName
));
}
return true;
}
}
return false;
}
function trackExternalModuleSymbolOfImportTypeNode(symbol) {
if (!isBundledEmit) {
(exportedModulesFromDeclarationEmit || (exportedModulesFromDeclarationEmit = [])).push(symbol);
}
}
function trackSymbol(symbol, enclosingDeclaration2, meaning) {
if (symbol.flags & 262144 /* TypeParameter */)
return false;
const issuedDiagnostic = handleSymbolAccessibilityError(resolver.isSymbolAccessible(
symbol,
enclosingDeclaration2,
meaning,
/*shouldComputeAliasToMarkVisible*/
true
));
recordTypeReferenceDirectivesIfNecessary(resolver.getTypeReferenceDirectivesForSymbol(symbol, meaning));
return issuedDiagnostic;
}
function reportPrivateInBaseOfClassExpression(propertyName) {
if (errorNameNode || errorFallbackNode) {
context.addDiagnostic(
createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.Property_0_of_exported_class_expression_may_not_be_private_or_protected, propertyName)
);
}
}
function errorDeclarationNameWithFallback() {
return errorNameNode ? declarationNameToString(errorNameNode) : errorFallbackNode && getNameOfDeclaration(errorFallbackNode) ? declarationNameToString(getNameOfDeclaration(errorFallbackNode)) : errorFallbackNode && isExportAssignment(errorFallbackNode) ? errorFallbackNode.isExportEquals ? "export=" : "default" : "(Missing)";
}
function reportInaccessibleUniqueSymbolError() {
if (errorNameNode || errorFallbackNode) {
context.addDiagnostic(createDiagnosticForNode(
errorNameNode || errorFallbackNode,
Diagnostics.The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary,
errorDeclarationNameWithFallback(),
"unique symbol"
));
}
}
function reportCyclicStructureError() {
if (errorNameNode || errorFallbackNode) {
context.addDiagnostic(createDiagnosticForNode(
errorNameNode || errorFallbackNode,
Diagnostics.The_inferred_type_of_0_references_a_type_with_a_cyclic_structure_which_cannot_be_trivially_serialized_A_type_annotation_is_necessary,
errorDeclarationNameWithFallback()
));
}
}
function reportInaccessibleThisError() {
if (errorNameNode || errorFallbackNode) {
context.addDiagnostic(createDiagnosticForNode(
errorNameNode || errorFallbackNode,
Diagnostics.The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary,
errorDeclarationNameWithFallback(),
"this"
));
}
}
function reportLikelyUnsafeImportRequiredError(specifier) {
if (errorNameNode || errorFallbackNode) {
context.addDiagnostic(createDiagnosticForNode(
errorNameNode || errorFallbackNode,
Diagnostics.The_inferred_type_of_0_cannot_be_named_without_a_reference_to_1_This_is_likely_not_portable_A_type_annotation_is_necessary,
errorDeclarationNameWithFallback(),
specifier
));
}
}
function reportTruncationError() {
if (errorNameNode || errorFallbackNode) {
context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_inferred_type_of_this_node_exceeds_the_maximum_length_the_compiler_will_serialize_An_explicit_type_annotation_is_needed));
}
}
function reportNonlocalAugmentation(containingFile, parentSymbol, symbol) {
var _a;
const primaryDeclaration = (_a = parentSymbol.declarations) == null ? void 0 : _a.find((d) => getSourceFileOfNode(d) === containingFile);
const augmentingDeclarations = filter(symbol.declarations, (d) => getSourceFileOfNode(d) !== containingFile);
if (primaryDeclaration && augmentingDeclarations) {
for (const augmentations of augmentingDeclarations) {
context.addDiagnostic(addRelatedInfo(
createDiagnosticForNode(augmentations, Diagnostics.Declaration_augments_declaration_in_another_file_This_cannot_be_serialized),
createDiagnosticForNode(primaryDeclaration, Diagnostics.This_is_the_declaration_being_augmented_Consider_moving_the_augmenting_declaration_into_the_same_file)
));
}
}
}
function reportNonSerializableProperty(propertyName) {
if (errorNameNode || errorFallbackNode) {
context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_type_of_this_node_cannot_be_serialized_because_its_property_0_cannot_be_serialized, propertyName));
}
}
function reportImportTypeNodeResolutionModeOverride() {
if (!isNightly() && (errorNameNode || errorFallbackNode)) {
context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_type_of_this_expression_cannot_be_named_without_a_resolution_mode_assertion_which_is_an_unstable_feature_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next));
}
}
function transformDeclarationsForJS(sourceFile, bundled) {
const oldDiag = getSymbolAccessibilityDiagnostic;
getSymbolAccessibilityDiagnostic = (s) => s.errorNode && canProduceDiagnostics(s.errorNode) ? createGetSymbolAccessibilityDiagnosticForNode(s.errorNode)(s) : {
diagnosticMessage: s.errorModuleName ? Diagnostics.Declaration_emit_for_this_file_requires_using_private_name_0_from_module_1_An_explicit_type_annotation_may_unblock_declaration_emit : Diagnostics.Declaration_emit_for_this_file_requires_using_private_name_0_An_explicit_type_annotation_may_unblock_declaration_emit,
errorNode: s.errorNode || sourceFile
};
const result = resolver.getDeclarationStatementsForSourceFile(sourceFile, declarationEmitNodeBuilderFlags, symbolTracker, bundled);
getSymbolAccessibilityDiagnostic = oldDiag;
return result;
}
function transformRoot(node) {
if (node.kind === 311 /* SourceFile */ && node.isDeclarationFile) {
return node;
}
if (node.kind === 312 /* Bundle */) {
isBundledEmit = true;
refs = /* @__PURE__ */ new Map();
libs2 = /* @__PURE__ */ new Map();
let hasNoDefaultLib = false;
const bundle = factory2.createBundle(map(
node.sourceFiles,
(sourceFile) => {
if (sourceFile.isDeclarationFile)
return void 0;
hasNoDefaultLib = hasNoDefaultLib || sourceFile.hasNoDefaultLib;
currentSourceFile = sourceFile;
enclosingDeclaration = sourceFile;
lateMarkedStatements = void 0;
suppressNewDiagnosticContexts = false;
lateStatementReplacementMap = /* @__PURE__ */ new Map();
getSymbolAccessibilityDiagnostic = throwDiagnostic;
needsScopeFixMarker = false;
resultHasScopeMarker = false;
collectReferences(sourceFile, refs);
collectLibs(sourceFile, libs2);
if (isExternalOrCommonJsModule(sourceFile) || isJsonSourceFile(sourceFile)) {
resultHasExternalModuleIndicator = false;
needsDeclare = false;
const statements = isSourceFileJS(sourceFile) ? factory2.createNodeArray(transformDeclarationsForJS(
sourceFile,
/*bundled*/
true
)) : visitNodes2(sourceFile.statements, visitDeclarationStatements, isStatement);
const newFile = factory2.updateSourceFile(
sourceFile,
[factory2.createModuleDeclaration(
[factory2.createModifier(138 /* DeclareKeyword */)],
factory2.createStringLiteral(getResolvedExternalModuleName(context.getEmitHost(), sourceFile)),
factory2.createModuleBlock(setTextRange(factory2.createNodeArray(transformAndReplaceLatePaintedStatements(statements)), sourceFile.statements))
)],
/*isDeclarationFile*/
true,
/*referencedFiles*/
[],
/*typeReferences*/
[],
/*hasNoDefaultLib*/
false,
/*libReferences*/
[]
);
return newFile;
}
needsDeclare = true;
const updated2 = isSourceFileJS(sourceFile) ? factory2.createNodeArray(transformDeclarationsForJS(sourceFile)) : visitNodes2(sourceFile.statements, visitDeclarationStatements, isStatement);
return factory2.updateSourceFile(
sourceFile,
transformAndReplaceLatePaintedStatements(updated2),
/*isDeclarationFile*/
true,
/*referencedFiles*/
[],
/*typeReferences*/
[],
/*hasNoDefaultLib*/
false,
/*libReferences*/
[]
);
}
), mapDefined(node.prepends, (prepend) => {
if (prepend.kind === 314 /* InputFiles */) {
const sourceFile = createUnparsedSourceFile(prepend, "dts", stripInternal);
hasNoDefaultLib = hasNoDefaultLib || !!sourceFile.hasNoDefaultLib;
collectReferences(sourceFile, refs);
recordTypeReferenceDirectivesIfNecessary(map(sourceFile.typeReferenceDirectives, (ref) => [ref.fileName, ref.resolutionMode]));
collectLibs(sourceFile, libs2);
return sourceFile;
}
return prepend;
}));
bundle.syntheticFileReferences = [];
bundle.syntheticTypeReferences = getFileReferencesForUsedTypeReferences();
bundle.syntheticLibReferences = getLibReferences();
bundle.hasNoDefaultLib = hasNoDefaultLib;
const outputFilePath2 = getDirectoryPath(normalizeSlashes(getOutputPathsFor(
node,
host,
/*forceDtsPaths*/
true
).declarationFilePath));
const referenceVisitor2 = mapReferencesIntoArray(bundle.syntheticFileReferences, outputFilePath2);
refs.forEach(referenceVisitor2);
return bundle;
}
needsDeclare = true;
needsScopeFixMarker = false;
resultHasScopeMarker = false;
enclosingDeclaration = node;
currentSourceFile = node;
getSymbolAccessibilityDiagnostic = throwDiagnostic;
isBundledEmit = false;
resultHasExternalModuleIndicator = false;
suppressNewDiagnosticContexts = false;
lateMarkedStatements = void 0;
lateStatementReplacementMap = /* @__PURE__ */ new Map();
necessaryTypeReferences = void 0;
refs = collectReferences(currentSourceFile, /* @__PURE__ */ new Map());
libs2 = collectLibs(currentSourceFile, /* @__PURE__ */ new Map());
const references = [];
const outputFilePath = getDirectoryPath(normalizeSlashes(getOutputPathsFor(
node,
host,
/*forceDtsPaths*/
true
).declarationFilePath));
const referenceVisitor = mapReferencesIntoArray(references, outputFilePath);
let combinedStatements;
if (isSourceFileJS(currentSourceFile)) {
combinedStatements = factory2.createNodeArray(transformDeclarationsForJS(node));
refs.forEach(referenceVisitor);
emittedImports = filter(combinedStatements, isAnyImportSyntax);
} else {
const statements = visitNodes2(node.statements, visitDeclarationStatements, isStatement);
combinedStatements = setTextRange(factory2.createNodeArray(transformAndReplaceLatePaintedStatements(statements)), node.statements);
refs.forEach(referenceVisitor);
emittedImports = filter(combinedStatements, isAnyImportSyntax);
if (isExternalModule(node) && (!resultHasExternalModuleIndicator || needsScopeFixMarker && !resultHasScopeMarker)) {
combinedStatements = setTextRange(factory2.createNodeArray([...combinedStatements, createEmptyExports(factory2)]), combinedStatements);
}
}
const updated = factory2.updateSourceFile(
node,
combinedStatements,
/*isDeclarationFile*/
true,
references,
getFileReferencesForUsedTypeReferences(),
node.hasNoDefaultLib,
getLibReferences()
);
updated.exportedModulesFromDeclarationEmit = exportedModulesFromDeclarationEmit;
return updated;
function getLibReferences() {
return arrayFrom(libs2.keys(), (lib) => ({ fileName: lib, pos: -1, end: -1 }));
}
function getFileReferencesForUsedTypeReferences() {
return necessaryTypeReferences ? mapDefined(arrayFrom(necessaryTypeReferences.keys()), getFileReferenceForSpecifierModeTuple) : [];
}
function getFileReferenceForSpecifierModeTuple([typeName, mode]) {
if (emittedImports) {
for (const importStatement of emittedImports) {
if (isImportEqualsDeclaration(importStatement) && isExternalModuleReference(importStatement.moduleReference)) {
const expr = importStatement.moduleReference.expression;
if (isStringLiteralLike(expr) && expr.text === typeName) {
return void 0;
}
} else if (isImportDeclaration(importStatement) && isStringLiteral(importStatement.moduleSpecifier) && importStatement.moduleSpecifier.text === typeName) {
return void 0;
}
}
}
return { fileName: typeName, pos: -1, end: -1, ...mode ? { resolutionMode: mode } : void 0 };
}
function mapReferencesIntoArray(references2, outputFilePath2) {
return (file) => {
let declFileName;
if (file.isDeclarationFile) {
declFileName = file.fileName;
} else {
if (isBundledEmit && contains(node.sourceFiles, file))
return;
const paths = getOutputPathsFor(
file,
host,
/*forceDtsPaths*/
true
);
declFileName = paths.declarationFilePath || paths.jsFilePath || file.fileName;
}
if (declFileName) {
const specifier = getModuleSpecifier(
options,
currentSourceFile,
toPath(outputFilePath2, host.getCurrentDirectory(), host.getCanonicalFileName),
toPath(declFileName, host.getCurrentDirectory(), host.getCanonicalFileName),
host
);
if (!pathIsRelative(specifier)) {
recordTypeReferenceDirectivesIfNecessary([[
specifier,
/*mode*/
void 0
]]);
return;
}
let fileName = getRelativePathToDirectoryOrUrl(
outputFilePath2,
declFileName,
host.getCurrentDirectory(),
host.getCanonicalFileName,
/*isAbsolutePathAnUrl*/
false
);
if (startsWith(fileName, "./") && hasExtension(fileName)) {
fileName = fileName.substring(2);
}
if (startsWith(fileName, "node_modules/") || pathContainsNodeModules(fileName)) {
return;
}
references2.push({ pos: -1, end: -1, fileName });
}
};
}
}
function collectReferences(sourceFile, ret) {
if (noResolve || !isUnparsedSource(sourceFile) && isSourceFileJS(sourceFile))
return ret;
forEach(sourceFile.referencedFiles, (f) => {
const elem = host.getSourceFileFromReference(sourceFile, f);
if (elem) {
ret.set(getOriginalNodeId(elem), elem);
}
});
return ret;
}
function collectLibs(sourceFile, ret) {
forEach(sourceFile.libReferenceDirectives, (ref) => {
const lib = host.getLibFileFromReference(ref);
if (lib) {
ret.set(toFileNameLowerCase(ref.fileName), true);
}
});
return ret;
}
function filterBindingPatternInitializersAndRenamings(name) {
if (name.kind === 80 /* Identifier */) {
return name;
} else {
if (name.kind === 206 /* ArrayBindingPattern */) {
return factory2.updateArrayBindingPattern(name, visitNodes2(name.elements, visitBindingElement, isArrayBindingElement));
} else {
return factory2.updateObjectBindingPattern(name, visitNodes2(name.elements, visitBindingElement, isBindingElement));
}
}
function visitBindingElement(elem) {
if (elem.kind === 231 /* OmittedExpression */) {
return elem;
}
if (elem.propertyName && isIdentifier(elem.propertyName) && isIdentifier(elem.name) && !elem.symbol.isReferenced && !isIdentifierANonContextualKeyword(elem.propertyName)) {
return factory2.updateBindingElement(
elem,
elem.dotDotDotToken,
/*propertyName*/
void 0,
elem.propertyName,
shouldPrintWithInitializer(elem) ? elem.initializer : void 0
);
}
return factory2.updateBindingElement(
elem,
elem.dotDotDotToken,
elem.propertyName,
filterBindingPatternInitializersAndRenamings(elem.name),
shouldPrintWithInitializer(elem) ? elem.initializer : void 0
);
}
}
function ensureParameter(p, modifierMask, type) {
let oldDiag;
if (!suppressNewDiagnosticContexts) {
oldDiag = getSymbolAccessibilityDiagnostic;
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(p);
}
const newParam = factory2.updateParameterDeclaration(
p,
maskModifiers(factory2, p, modifierMask),
p.dotDotDotToken,
filterBindingPatternInitializersAndRenamings(p.name),
resolver.isOptionalParameter(p) ? p.questionToken || factory2.createToken(58 /* QuestionToken */) : void 0,
ensureType(
p,
type || p.type,
/*ignorePrivate*/
true
),
// Ignore private param props, since this type is going straight back into a param
ensureNoInitializer(p)
);
if (!suppressNewDiagnosticContexts) {
getSymbolAccessibilityDiagnostic = oldDiag;
}
return newParam;
}
function shouldPrintWithInitializer(node) {
return canHaveLiteralInitializer(node) && resolver.isLiteralConstDeclaration(getParseTreeNode(node));
}
function ensureNoInitializer(node) {
if (shouldPrintWithInitializer(node)) {
return resolver.createLiteralConstValue(getParseTreeNode(node), symbolTracker);
}
return void 0;
}
function ensureType(node, type, ignorePrivate) {
if (!ignorePrivate && hasEffectiveModifier(node, 8 /* Private */)) {
return;
}
if (shouldPrintWithInitializer(node)) {
return;
}
const shouldUseResolverType = node.kind === 168 /* Parameter */ && (resolver.isRequiredInitializedParameter(node) || resolver.isOptionalUninitializedParameterProperty(node));
if (type && !shouldUseResolverType) {
return visitNode(type, visitDeclarationSubtree, isTypeNode);
}
if (!getParseTreeNode(node)) {
return type ? visitNode(type, visitDeclarationSubtree, isTypeNode) : factory2.createKeywordTypeNode(133 /* AnyKeyword */);
}
if (node.kind === 177 /* SetAccessor */) {
return factory2.createKeywordTypeNode(133 /* AnyKeyword */);
}
errorNameNode = node.name;
let oldDiag;
if (!suppressNewDiagnosticContexts) {
oldDiag = getSymbolAccessibilityDiagnostic;
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(node);
}
if (node.kind === 259 /* VariableDeclaration */ || node.kind === 207 /* BindingElement */) {
return cleanup(resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker));
}
if (node.kind === 168 /* Parameter */ || node.kind === 171 /* PropertyDeclaration */ || node.kind === 170 /* PropertySignature */) {
if (isPropertySignature(node) || !node.initializer)
return cleanup(resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker, shouldUseResolverType));
return cleanup(resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker, shouldUseResolverType) || resolver.createTypeOfExpression(node.initializer, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker));
}
return cleanup(resolver.createReturnTypeOfSignatureDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker));
function cleanup(returnValue) {
errorNameNode = void 0;
if (!suppressNewDiagnosticContexts) {
getSymbolAccessibilityDiagnostic = oldDiag;
}
return returnValue || factory2.createKeywordTypeNode(133 /* AnyKeyword */);
}
}
function isDeclarationAndNotVisible(node) {
node = getParseTreeNode(node);
switch (node.kind) {
case 261 /* FunctionDeclaration */:
case 266 /* ModuleDeclaration */:
case 263 /* InterfaceDeclaration */:
case 262 /* ClassDeclaration */:
case 264 /* TypeAliasDeclaration */:
case 265 /* EnumDeclaration */:
return !resolver.isDeclarationVisible(node);
case 259 /* VariableDeclaration */:
return !getBindingNameVisible(node);
case 270 /* ImportEqualsDeclaration */:
case 271 /* ImportDeclaration */:
case 277 /* ExportDeclaration */:
case 276 /* ExportAssignment */:
return false;
case 174 /* ClassStaticBlockDeclaration */:
return true;
}
return false;
}
function shouldEmitFunctionProperties(input) {
var _a;
if (input.body) {
return true;
}
const overloadSignatures = (_a = input.symbol.declarations) == null ? void 0 : _a.filter((decl) => isFunctionDeclaration(decl) && !decl.body);
return !overloadSignatures || overloadSignatures.indexOf(input) === overloadSignatures.length - 1;
}
function getBindingNameVisible(elem) {
if (isOmittedExpression(elem)) {
return false;
}
if (isBindingPattern(elem.name)) {
return some(elem.name.elements, getBindingNameVisible);
} else {
return resolver.isDeclarationVisible(elem);
}
}
function updateParamsList(node, params, modifierMask) {
if (hasEffectiveModifier(node, 8 /* Private */)) {
return factory2.createNodeArray();
}
const newParams = map(params, (p) => ensureParameter(p, modifierMask));
if (!newParams) {
return factory2.createNodeArray();
}
return factory2.createNodeArray(newParams, params.hasTrailingComma);
}
function updateAccessorParamsList(input, isPrivate) {
let newParams;
if (!isPrivate) {
const thisParameter = getThisParameter(input);
if (thisParameter) {
newParams = [ensureParameter(thisParameter)];
}
}
if (isSetAccessorDeclaration(input)) {
let newValueParameter;
if (!isPrivate) {
const valueParameter = getSetAccessorValueParameter(input);
if (valueParameter) {
const accessorType = getTypeAnnotationFromAllAccessorDeclarations(input, resolver.getAllAccessorDeclarations(input));
newValueParameter = ensureParameter(
valueParameter,
/*modifierMask*/
void 0,
accessorType
);
}
}
if (!newValueParameter) {
newValueParameter = factory2.createParameterDeclaration(
/*modifiers*/
void 0,
/*dotDotDotToken*/
void 0,
"value"
);
}
newParams = append(newParams, newValueParameter);
}
return factory2.createNodeArray(newParams || emptyArray);
}
function ensureTypeParams(node, params) {
return hasEffectiveModifier(node, 8 /* Private */) ? void 0 : visitNodes2(params, visitDeclarationSubtree, isTypeParameterDeclaration);
}
function isEnclosingDeclaration(node) {
return isSourceFile(node) || isTypeAliasDeclaration(node) || isModuleDeclaration(node) || isClassDeclaration(node) || isInterfaceDeclaration(node) || isFunctionLike(node) || isIndexSignatureDeclaration(node) || isMappedTypeNode(node);
}
function checkEntityNameVisibility(entityName, enclosingDeclaration2) {
const visibilityResult = resolver.isEntityNameVisible(entityName, enclosingDeclaration2);
handleSymbolAccessibilityError(visibilityResult);
recordTypeReferenceDirectivesIfNecessary(resolver.getTypeReferenceDirectivesForEntityName(entityName));
}
function preserveJsDoc(updated, original) {
if (hasJSDocNodes(updated) && hasJSDocNodes(original)) {
updated.jsDoc = original.jsDoc;
}
return setCommentRange(updated, getCommentRange(original));
}
function rewriteModuleSpecifier(parent, input) {
if (!input)
return void 0;
resultHasExternalModuleIndicator = resultHasExternalModuleIndicator || parent.kind !== 266 /* ModuleDeclaration */ && parent.kind !== 204 /* ImportType */;
if (isStringLiteralLike(input)) {
if (isBundledEmit) {
const newName = getExternalModuleNameFromDeclaration(context.getEmitHost(), resolver, parent);
if (newName) {
return factory2.createStringLiteral(newName);
}
} else {
const symbol = resolver.getSymbolOfExternalModuleSpecifier(input);
if (symbol) {
(exportedModulesFromDeclarationEmit || (exportedModulesFromDeclarationEmit = [])).push(symbol);
}
}
}
return input;
}
function transformImportEqualsDeclaration(decl) {
if (!resolver.isDeclarationVisible(decl))
return;
if (decl.moduleReference.kind === 282 /* ExternalModuleReference */) {
const specifier = getExternalModuleImportEqualsDeclarationExpression(decl);
return factory2.updateImportEqualsDeclaration(
decl,
decl.modifiers,
decl.isTypeOnly,
decl.name,
factory2.updateExternalModuleReference(decl.moduleReference, rewriteModuleSpecifier(decl, specifier))
);
} else {
const oldDiag = getSymbolAccessibilityDiagnostic;
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(decl);
checkEntityNameVisibility(decl.moduleReference, enclosingDeclaration);
getSymbolAccessibilityDiagnostic = oldDiag;
return decl;
}
}
function transformImportDeclaration(decl) {
if (!decl.importClause) {
return factory2.updateImportDeclaration(
decl,
decl.modifiers,
decl.importClause,
rewriteModuleSpecifier(decl, decl.moduleSpecifier),
getResolutionModeOverrideForClauseInNightly(decl.assertClause)
);
}
const visibleDefaultBinding = decl.importClause && decl.importClause.name && resolver.isDeclarationVisible(decl.importClause) ? decl.importClause.name : void 0;
if (!decl.importClause.namedBindings) {
return visibleDefaultBinding && factory2.updateImportDeclaration(decl, decl.modifiers, factory2.updateImportClause(
decl.importClause,
decl.importClause.isTypeOnly,
visibleDefaultBinding,
/*namedBindings*/
void 0
), rewriteModuleSpecifier(decl, decl.moduleSpecifier), getResolutionModeOverrideForClauseInNightly(decl.assertClause));
}
if (decl.importClause.namedBindings.kind === 273 /* NamespaceImport */) {
const namedBindings = resolver.isDeclarationVisible(decl.importClause.namedBindings) ? decl.importClause.namedBindings : (
/*namedBindings*/
void 0
);
return visibleDefaultBinding || namedBindings ? factory2.updateImportDeclaration(decl, decl.modifiers, factory2.updateImportClause(
decl.importClause,
decl.importClause.isTypeOnly,
visibleDefaultBinding,
namedBindings
), rewriteModuleSpecifier(decl, decl.moduleSpecifier), getResolutionModeOverrideForClauseInNightly(decl.assertClause)) : void 0;
}
const bindingList = mapDefined(decl.importClause.namedBindings.elements, (b) => resolver.isDeclarationVisible(b) ? b : void 0);
if (bindingList && bindingList.length || visibleDefaultBinding) {
return factory2.updateImportDeclaration(
decl,
decl.modifiers,
factory2.updateImportClause(
decl.importClause,
decl.importClause.isTypeOnly,
visibleDefaultBinding,
bindingList && bindingList.length ? factory2.updateNamedImports(decl.importClause.namedBindings, bindingList) : void 0
),
rewriteModuleSpecifier(decl, decl.moduleSpecifier),
getResolutionModeOverrideForClauseInNightly(decl.assertClause)
);
}
if (resolver.isImportRequiredByAugmentation(decl)) {
return factory2.updateImportDeclaration(
decl,
decl.modifiers,
/*importClause*/
void 0,
rewriteModuleSpecifier(decl, decl.moduleSpecifier),
getResolutionModeOverrideForClauseInNightly(decl.assertClause)
);
}
}
function getResolutionModeOverrideForClauseInNightly(assertClause) {
const mode = getResolutionModeOverrideForClause(assertClause);
if (mode !== void 0) {
if (!isNightly()) {
context.addDiagnostic(createDiagnosticForNode(assertClause, Diagnostics.resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next));
}
return assertClause;
}
return void 0;
}
function transformAndReplaceLatePaintedStatements(statements) {
while (length(lateMarkedStatements)) {
const i = lateMarkedStatements.shift();
if (!isLateVisibilityPaintedStatement(i)) {
return Debug.fail(`Late replaced statement was found which is not handled by the declaration transformer!: ${Debug.formatSyntaxKind(i.kind)}`);
}
const priorNeedsDeclare = needsDeclare;
needsDeclare = i.parent && isSourceFile(i.parent) && !(isExternalModule(i.parent) && isBundledEmit);
const result = transformTopLevelDeclaration(i);
needsDeclare = priorNeedsDeclare;
lateStatementReplacementMap.set(getOriginalNodeId(i), result);
}
return visitNodes2(statements, visitLateVisibilityMarkedStatements, isStatement);
function visitLateVisibilityMarkedStatements(statement) {
if (isLateVisibilityPaintedStatement(statement)) {
const key = getOriginalNodeId(statement);
if (lateStatementReplacementMap.has(key)) {
const result = lateStatementReplacementMap.get(key);
lateStatementReplacementMap.delete(key);
if (result) {
if (isArray(result) ? some(result, needsScopeMarker) : needsScopeMarker(result)) {
needsScopeFixMarker = true;
}
if (isSourceFile(statement.parent) && (isArray(result) ? some(result, isExternalModuleIndicator) : isExternalModuleIndicator(result))) {
resultHasExternalModuleIndicator = true;
}
}
return result;
}
}
return statement;
}
}
function visitDeclarationSubtree(input) {
if (shouldStripInternal(input))
return;
if (isDeclaration(input)) {
if (isDeclarationAndNotVisible(input))
return;
if (hasDynamicName(input) && !resolver.isLateBound(getParseTreeNode(input))) {
return;
}
}
if (isFunctionLike(input) && resolver.isImplementationOfOverload(input))
return;
if (isSemicolonClassElement(input))
return;
let previousEnclosingDeclaration;
if (isEnclosingDeclaration(input)) {
previousEnclosingDeclaration = enclosingDeclaration;
enclosingDeclaration = input;
}
const oldDiag = getSymbolAccessibilityDiagnostic;
const canProduceDiagnostic = canProduceDiagnostics(input);
const oldWithinObjectLiteralType = suppressNewDiagnosticContexts;
let shouldEnterSuppressNewDiagnosticsContextContext = (input.kind === 186 /* TypeLiteral */ || input.kind === 199 /* MappedType */) && input.parent.kind !== 264 /* TypeAliasDeclaration */;
if (isMethodDeclaration(input) || isMethodSignature(input)) {
if (hasEffectiveModifier(input, 8 /* Private */)) {
if (input.symbol && input.symbol.declarations && input.symbol.declarations[0] !== input)
return;
return cleanup(factory2.createPropertyDeclaration(
ensureModifiers(input),
input.name,
/*questionOrExclamationToken*/
void 0,
/*type*/
void 0,
/*initializer*/
void 0
));
}
}
if (canProduceDiagnostic && !suppressNewDiagnosticContexts) {
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(input);
}
if (isTypeQueryNode(input)) {
checkEntityNameVisibility(input.exprName, enclosingDeclaration);
}
if (shouldEnterSuppressNewDiagnosticsContextContext) {
suppressNewDiagnosticContexts = true;
}
if (isProcessedComponent(input)) {
switch (input.kind) {
case 232 /* ExpressionWithTypeArguments */: {
if (isEntityName(input.expression) || isEntityNameExpression(input.expression)) {
checkEntityNameVisibility(input.expression, enclosingDeclaration);
}
const node = visitEachChild(input, visitDeclarationSubtree, context);
return cleanup(factory2.updateExpressionWithTypeArguments(node, node.expression, node.typeArguments));
}
case 182 /* TypeReference */: {
checkEntityNameVisibility(input.typeName, enclosingDeclaration);
const node = visitEachChild(input, visitDeclarationSubtree, context);
return cleanup(factory2.updateTypeReferenceNode(node, node.typeName, node.typeArguments));
}
case 179 /* ConstructSignature */:
return cleanup(factory2.updateConstructSignature(
input,
ensureTypeParams(input, input.typeParameters),
updateParamsList(input, input.parameters),
ensureType(input, input.type)
));
case 175 /* Constructor */: {
const ctor = factory2.createConstructorDeclaration(
/*modifiers*/
ensureModifiers(input),
updateParamsList(input, input.parameters, 0 /* None */),
/*body*/
void 0
);
return cleanup(ctor);
}
case 173 /* MethodDeclaration */: {
if (isPrivateIdentifier(input.name)) {
return cleanup(
/*returnValue*/
void 0
);
}
const sig = factory2.createMethodDeclaration(
ensureModifiers(input),
/*asteriskToken*/
void 0,
input.name,
input.questionToken,
ensureTypeParams(input, input.typeParameters),
updateParamsList(input, input.parameters),
ensureType(input, input.type),
/*body*/
void 0
);
return cleanup(sig);
}
case 176 /* GetAccessor */: {
if (isPrivateIdentifier(input.name)) {
return cleanup(
/*returnValue*/
void 0
);
}
const accessorType = getTypeAnnotationFromAllAccessorDeclarations(input, resolver.getAllAccessorDeclarations(input));
return cleanup(factory2.updateGetAccessorDeclaration(
input,
ensureModifiers(input),
input.name,
updateAccessorParamsList(input, hasEffectiveModifier(input, 8 /* Private */)),
ensureType(input, accessorType),
/*body*/
void 0
));
}
case 177 /* SetAccessor */: {
if (isPrivateIdentifier(input.name)) {
return cleanup(
/*returnValue*/
void 0
);
}
return cleanup(factory2.updateSetAccessorDeclaration(
input,
ensureModifiers(input),
input.name,
updateAccessorParamsList(input, hasEffectiveModifier(input, 8 /* Private */)),
/*body*/
void 0
));
}
case 171 /* PropertyDeclaration */:
if (isPrivateIdentifier(input.name)) {
return cleanup(
/*returnValue*/
void 0
);
}
return cleanup(factory2.updatePropertyDeclaration(
input,
ensureModifiers(input),
input.name,
input.questionToken,
ensureType(input, input.type),
ensureNoInitializer(input)
));
case 170 /* PropertySignature */:
if (isPrivateIdentifier(input.name)) {
return cleanup(
/*returnValue*/
void 0
);
}
return cleanup(factory2.updatePropertySignature(
input,
ensureModifiers(input),
input.name,
input.questionToken,
ensureType(input, input.type)
));
case 172 /* MethodSignature */: {
if (isPrivateIdentifier(input.name)) {
return cleanup(
/*returnValue*/
void 0
);
}
return cleanup(factory2.updateMethodSignature(
input,
ensureModifiers(input),
input.name,
input.questionToken,
ensureTypeParams(input, input.typeParameters),
updateParamsList(input, input.parameters),
ensureType(input, input.type)
));
}
case 178 /* CallSignature */: {
return cleanup(factory2.updateCallSignature(
input,
ensureTypeParams(input, input.typeParameters),
updateParamsList(input, input.parameters),
ensureType(input, input.type)
));
}
case 180 /* IndexSignature */: {
return cleanup(factory2.updateIndexSignature(
input,
ensureModifiers(input),
updateParamsList(input, input.parameters),
visitNode(input.type, visitDeclarationSubtree, isTypeNode) || factory2.createKeywordTypeNode(133 /* AnyKeyword */)
));
}
case 259 /* VariableDeclaration */: {
if (isBindingPattern(input.name)) {
return recreateBindingPattern(input.name);
}
shouldEnterSuppressNewDiagnosticsContextContext = true;
suppressNewDiagnosticContexts = true;
return cleanup(factory2.updateVariableDeclaration(
input,
input.name,
/*exclamationToken*/
void 0,
ensureType(input, input.type),
ensureNoInitializer(input)
));
}
case 167 /* TypeParameter */: {
if (isPrivateMethodTypeParameter(input) && (input.default || input.constraint)) {
return cleanup(factory2.updateTypeParameterDeclaration(
input,
input.modifiers,
input.name,
/*constraint*/
void 0,
/*defaultType*/
void 0
));
}
return cleanup(visitEachChild(input, visitDeclarationSubtree, context));
}
case 193 /* ConditionalType */: {
const checkType = visitNode(input.checkType, visitDeclarationSubtree, isTypeNode);
const extendsType = visitNode(input.extendsType, visitDeclarationSubtree, isTypeNode);
const oldEnclosingDecl = enclosingDeclaration;
enclosingDeclaration = input.trueType;
const trueType = visitNode(input.trueType, visitDeclarationSubtree, isTypeNode);
enclosingDeclaration = oldEnclosingDecl;
const falseType = visitNode(input.falseType, visitDeclarationSubtree, isTypeNode);
Debug.assert(checkType);
Debug.assert(extendsType);
Debug.assert(trueType);
Debug.assert(falseType);
return cleanup(factory2.updateConditionalTypeNode(input, checkType, extendsType, trueType, falseType));
}
case 183 /* FunctionType */: {
return cleanup(factory2.updateFunctionTypeNode(input, visitNodes2(input.typeParameters, visitDeclarationSubtree, isTypeParameterDeclaration), updateParamsList(input, input.parameters), Debug.checkDefined(visitNode(input.type, visitDeclarationSubtree, isTypeNode))));
}
case 184 /* ConstructorType */: {
return cleanup(factory2.updateConstructorTypeNode(input, ensureModifiers(input), visitNodes2(input.typeParameters, visitDeclarationSubtree, isTypeParameterDeclaration), updateParamsList(input, input.parameters), Debug.checkDefined(visitNode(input.type, visitDeclarationSubtree, isTypeNode))));
}
case 204 /* ImportType */: {
if (!isLiteralImportTypeNode(input))
return cleanup(input);
return cleanup(factory2.updateImportTypeNode(
input,
factory2.updateLiteralTypeNode(input.argument, rewriteModuleSpecifier(input, input.argument.literal)),
input.assertions,
input.qualifier,
visitNodes2(input.typeArguments, visitDeclarationSubtree, isTypeNode),
input.isTypeOf
));
}
default:
Debug.assertNever(input, `Attempted to process unhandled node kind: ${Debug.formatSyntaxKind(input.kind)}`);
}
}
if (isTupleTypeNode(input) && getLineAndCharacterOfPosition(currentSourceFile, input.pos).line === getLineAndCharacterOfPosition(currentSourceFile, input.end).line) {
setEmitFlags(input, 1 /* SingleLine */);
}
return cleanup(visitEachChild(input, visitDeclarationSubtree, context));
function cleanup(returnValue) {
if (returnValue && canProduceDiagnostic && hasDynamicName(input)) {
checkName(input);
}
if (isEnclosingDeclaration(input)) {
enclosingDeclaration = previousEnclosingDeclaration;
}
if (canProduceDiagnostic && !suppressNewDiagnosticContexts) {
getSymbolAccessibilityDiagnostic = oldDiag;
}
if (shouldEnterSuppressNewDiagnosticsContextContext) {
suppressNewDiagnosticContexts = oldWithinObjectLiteralType;
}
if (returnValue === input) {
return returnValue;
}
return returnValue && setOriginalNode(preserveJsDoc(returnValue, input), input);
}
}
function isPrivateMethodTypeParameter(node) {
return node.parent.kind === 173 /* MethodDeclaration */ && hasEffectiveModifier(node.parent, 8 /* Private */);
}
function visitDeclarationStatements(input) {
if (!isPreservedDeclarationStatement(input)) {
return;
}
if (shouldStripInternal(input))
return;
switch (input.kind) {
case 277 /* ExportDeclaration */: {
if (isSourceFile(input.parent)) {
resultHasExternalModuleIndicator = true;
}
resultHasScopeMarker = true;
return factory2.updateExportDeclaration(
input,
input.modifiers,
input.isTypeOnly,
input.exportClause,
rewriteModuleSpecifier(input, input.moduleSpecifier),
getResolutionModeOverrideForClause(input.assertClause) ? input.assertClause : void 0
);
}
case 276 /* ExportAssignment */: {
if (isSourceFile(input.parent)) {
resultHasExternalModuleIndicator = true;
}
resultHasScopeMarker = true;
if (input.expression.kind === 80 /* Identifier */) {
return input;
} else {
const newId = factory2.createUniqueName("_default", 16 /* Optimistic */);
getSymbolAccessibilityDiagnostic = () => ({
diagnosticMessage: Diagnostics.Default_export_of_the_module_has_or_is_using_private_name_0,
errorNode: input
});
errorFallbackNode = input;
const varDecl = factory2.createVariableDeclaration(
newId,
/*exclamationToken*/
void 0,
resolver.createTypeOfExpression(input.expression, input, declarationEmitNodeBuilderFlags, symbolTracker),
/*initializer*/
void 0
);
errorFallbackNode = void 0;
const statement = factory2.createVariableStatement(needsDeclare ? [factory2.createModifier(138 /* DeclareKeyword */)] : [], factory2.createVariableDeclarationList([varDecl], 2 /* Const */));
preserveJsDoc(statement, input);
removeAllComments(input);
return [statement, factory2.updateExportAssignment(input, input.modifiers, newId)];
}
}
}
const result = transformTopLevelDeclaration(input);
lateStatementReplacementMap.set(getOriginalNodeId(input), result);
return input;
}
function stripExportModifiers(statement) {
if (isImportEqualsDeclaration(statement) || hasEffectiveModifier(statement, 1024 /* Default */) || !canHaveModifiers(statement)) {
return statement;
}
const modifiers = factory2.createModifiersFromModifierFlags(getEffectiveModifierFlags(statement) & (258047 /* All */ ^ 1 /* Export */));
return factory2.updateModifiers(statement, modifiers);
}
function transformTopLevelDeclaration(input) {
if (lateMarkedStatements) {
while (orderedRemoveItem(lateMarkedStatements, input))
;
}
if (shouldStripInternal(input))
return;
switch (input.kind) {
case 270 /* ImportEqualsDeclaration */: {
return transformImportEqualsDeclaration(input);
}
case 271 /* ImportDeclaration */: {
return transformImportDeclaration(input);
}
}
if (isDeclaration(input) && isDeclarationAndNotVisible(input))
return;
if (isFunctionLike(input) && resolver.isImplementationOfOverload(input))
return;
let previousEnclosingDeclaration;
if (isEnclosingDeclaration(input)) {
previousEnclosingDeclaration = enclosingDeclaration;
enclosingDeclaration = input;
}
const canProdiceDiagnostic = canProduceDiagnostics(input);
const oldDiag = getSymbolAccessibilityDiagnostic;
if (canProdiceDiagnostic) {
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(input);
}
const previousNeedsDeclare = needsDeclare;
switch (input.kind) {
case 264 /* TypeAliasDeclaration */: {
needsDeclare = false;
const clean2 = cleanup(factory2.updateTypeAliasDeclaration(
input,
ensureModifiers(input),
input.name,
visitNodes2(input.typeParameters, visitDeclarationSubtree, isTypeParameterDeclaration),
Debug.checkDefined(visitNode(input.type, visitDeclarationSubtree, isTypeNode))
));
needsDeclare = previousNeedsDeclare;
return clean2;
}
case 263 /* InterfaceDeclaration */: {
return cleanup(factory2.updateInterfaceDeclaration(
input,
ensureModifiers(input),
input.name,
ensureTypeParams(input, input.typeParameters),
transformHeritageClauses(input.heritageClauses),
visitNodes2(input.members, visitDeclarationSubtree, isTypeElement)
));
}
case 261 /* FunctionDeclaration */: {
const clean2 = cleanup(factory2.updateFunctionDeclaration(
input,
ensureModifiers(input),
/*asteriskToken*/
void 0,
input.name,
ensureTypeParams(input, input.typeParameters),
updateParamsList(input, input.parameters),
ensureType(input, input.type),
/*body*/
void 0
));
if (clean2 && resolver.isExpandoFunctionDeclaration(input) && shouldEmitFunctionProperties(input)) {
const props = resolver.getPropertiesOfContainerFunction(input);
const fakespace = parseNodeFactory.createModuleDeclaration(
/*modifiers*/
void 0,
clean2.name || factory2.createIdentifier("_default"),
factory2.createModuleBlock([]),
16 /* Namespace */
);
setParent(fakespace, enclosingDeclaration);
fakespace.locals = createSymbolTable(props);
fakespace.symbol = props[0].parent;
const exportMappings = [];
let declarations = mapDefined(props, (p) => {
if (!p.valueDeclaration || !(isPropertyAccessExpression(p.valueDeclaration) || isElementAccessExpression(p.valueDeclaration) || isBinaryExpression(p.valueDeclaration))) {
return void 0;
}
const nameStr = unescapeLeadingUnderscores(p.escapedName);
if (!isIdentifierText(nameStr, 99 /* ESNext */)) {
return void 0;
}
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(p.valueDeclaration);
const type = resolver.createTypeOfDeclaration(p.valueDeclaration, fakespace, declarationEmitNodeBuilderFlags, symbolTracker);
getSymbolAccessibilityDiagnostic = oldDiag;
const isNonContextualKeywordName = isStringANonContextualKeyword(nameStr);
const name = isNonContextualKeywordName ? factory2.getGeneratedNameForNode(p.valueDeclaration) : factory2.createIdentifier(nameStr);
if (isNonContextualKeywordName) {
exportMappings.push([name, nameStr]);
}
const varDecl = factory2.createVariableDeclaration(
name,
/*exclamationToken*/
void 0,
type,
/*initializer*/
void 0
);
return factory2.createVariableStatement(isNonContextualKeywordName ? void 0 : [factory2.createToken(95 /* ExportKeyword */)], factory2.createVariableDeclarationList([varDecl]));
});
if (!exportMappings.length) {
declarations = mapDefined(declarations, (declaration) => factory2.updateModifiers(declaration, 0 /* None */));
} else {
declarations.push(factory2.createExportDeclaration(
/*modifiers*/
void 0,
/*isTypeOnly*/
false,
factory2.createNamedExports(map(exportMappings, ([gen, exp]) => {
return factory2.createExportSpecifier(
/*isTypeOnly*/
false,
gen,
exp
);
}))
));
}
const namespaceDecl = factory2.createModuleDeclaration(ensureModifiers(input), input.name, factory2.createModuleBlock(declarations), 16 /* Namespace */);
if (!hasEffectiveModifier(clean2, 1024 /* Default */)) {
return [clean2, namespaceDecl];
}
const modifiers = factory2.createModifiersFromModifierFlags(getEffectiveModifierFlags(clean2) & ~1025 /* ExportDefault */ | 2 /* Ambient */);
const cleanDeclaration = factory2.updateFunctionDeclaration(
clean2,
modifiers,
/*asteriskToken*/
void 0,
clean2.name,
clean2.typeParameters,
clean2.parameters,
clean2.type,
/*body*/
void 0
);
const namespaceDeclaration = factory2.updateModuleDeclaration(
namespaceDecl,
modifiers,
namespaceDecl.name,
namespaceDecl.body
);
const exportDefaultDeclaration = factory2.createExportAssignment(
/*modifiers*/
void 0,
/*isExportEquals*/
false,
namespaceDecl.name
);
if (isSourceFile(input.parent)) {
resultHasExternalModuleIndicator = true;
}
resultHasScopeMarker = true;
return [cleanDeclaration, namespaceDeclaration, exportDefaultDeclaration];
} else {
return clean2;
}
}
case 266 /* ModuleDeclaration */: {
needsDeclare = false;
const inner = input.body;
if (inner && inner.kind === 267 /* ModuleBlock */) {
const oldNeedsScopeFix = needsScopeFixMarker;
const oldHasScopeFix = resultHasScopeMarker;
resultHasScopeMarker = false;
needsScopeFixMarker = false;
const statements = visitNodes2(inner.statements, visitDeclarationStatements, isStatement);
let lateStatements = transformAndReplaceLatePaintedStatements(statements);
if (input.flags & 16777216 /* Ambient */) {
needsScopeFixMarker = false;
}
if (!isGlobalScopeAugmentation(input) && !hasScopeMarker2(lateStatements) && !resultHasScopeMarker) {
if (needsScopeFixMarker) {
lateStatements = factory2.createNodeArray([...lateStatements, createEmptyExports(factory2)]);
} else {
lateStatements = visitNodes2(lateStatements, stripExportModifiers, isStatement);
}
}
const body = factory2.updateModuleBlock(inner, lateStatements);
needsDeclare = previousNeedsDeclare;
needsScopeFixMarker = oldNeedsScopeFix;
resultHasScopeMarker = oldHasScopeFix;
const mods = ensureModifiers(input);
return cleanup(factory2.updateModuleDeclaration(
input,
mods,
isExternalModuleAugmentation(input) ? rewriteModuleSpecifier(input, input.name) : input.name,
body
));
} else {
needsDeclare = previousNeedsDeclare;
const mods = ensureModifiers(input);
needsDeclare = false;
visitNode(inner, visitDeclarationStatements);
const id = getOriginalNodeId(inner);
const body = lateStatementReplacementMap.get(id);
lateStatementReplacementMap.delete(id);
return cleanup(factory2.updateModuleDeclaration(
input,
mods,
input.name,
body
));
}
}
case 262 /* ClassDeclaration */: {
errorNameNode = input.name;
errorFallbackNode = input;
const modifiers = factory2.createNodeArray(ensureModifiers(input));
const typeParameters = ensureTypeParams(input, input.typeParameters);
const ctor = getFirstConstructorWithBody(input);
let parameterProperties;
if (ctor) {
const oldDiag2 = getSymbolAccessibilityDiagnostic;
parameterProperties = compact(flatMap(ctor.parameters, (param) => {
if (!hasSyntacticModifier(param, 16476 /* ParameterPropertyModifier */) || shouldStripInternal(param))
return;
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(param);
if (param.name.kind === 80 /* Identifier */) {
return preserveJsDoc(factory2.createPropertyDeclaration(
ensureModifiers(param),
param.name,
param.questionToken,
ensureType(param, param.type),
ensureNoInitializer(param)
), param);
} else {
return walkBindingPattern(param.name);
}
function walkBindingPattern(pattern) {
let elems;
for (const elem of pattern.elements) {
if (isOmittedExpression(elem))
continue;
if (isBindingPattern(elem.name)) {
elems = concatenate(elems, walkBindingPattern(elem.name));
}
elems = elems || [];
elems.push(factory2.createPropertyDeclaration(
ensureModifiers(param),
elem.name,
/*questionOrExclamationToken*/
void 0,
ensureType(
elem,
/*type*/
void 0
),
/*initializer*/
void 0
));
}
return elems;
}
}));
getSymbolAccessibilityDiagnostic = oldDiag2;
}
const hasPrivateIdentifier = some(input.members, (member) => !!member.name && isPrivateIdentifier(member.name));
const privateIdentifier = hasPrivateIdentifier ? [
factory2.createPropertyDeclaration(
/*modifiers*/
void 0,
factory2.createPrivateIdentifier("#private"),
/*questionOrExclamationToken*/
void 0,
/*type*/
void 0,
/*initializer*/
void 0
)
] : void 0;
const memberNodes = concatenate(concatenate(privateIdentifier, parameterProperties), visitNodes2(input.members, visitDeclarationSubtree, isClassElement));
const members = factory2.createNodeArray(memberNodes);
const extendsClause = getEffectiveBaseTypeNode(input);
if (extendsClause && !isEntityNameExpression(extendsClause.expression) && extendsClause.expression.kind !== 106 /* NullKeyword */) {
const oldId = input.name ? unescapeLeadingUnderscores(input.name.escapedText) : "default";
const newId = factory2.createUniqueName(`${oldId}_base`, 16 /* Optimistic */);
getSymbolAccessibilityDiagnostic = () => ({
diagnosticMessage: Diagnostics.extends_clause_of_exported_class_0_has_or_is_using_private_name_1,
errorNode: extendsClause,
typeName: input.name
});
const varDecl = factory2.createVariableDeclaration(
newId,
/*exclamationToken*/
void 0,
resolver.createTypeOfExpression(extendsClause.expression, input, declarationEmitNodeBuilderFlags, symbolTracker),
/*initializer*/
void 0
);
const statement = factory2.createVariableStatement(needsDeclare ? [factory2.createModifier(138 /* DeclareKeyword */)] : [], factory2.createVariableDeclarationList([varDecl], 2 /* Const */));
const heritageClauses = factory2.createNodeArray(map(input.heritageClauses, (clause) => {
if (clause.token === 96 /* ExtendsKeyword */) {
const oldDiag2 = getSymbolAccessibilityDiagnostic;
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(clause.types[0]);
const newClause = factory2.updateHeritageClause(clause, map(clause.types, (t) => factory2.updateExpressionWithTypeArguments(t, newId, visitNodes2(t.typeArguments, visitDeclarationSubtree, isTypeNode))));
getSymbolAccessibilityDiagnostic = oldDiag2;
return newClause;
}
return factory2.updateHeritageClause(clause, visitNodes2(factory2.createNodeArray(filter(clause.types, (t) => isEntityNameExpression(t.expression) || t.expression.kind === 106 /* NullKeyword */)), visitDeclarationSubtree, isExpressionWithTypeArguments));
}));
return [statement, cleanup(factory2.updateClassDeclaration(
input,
modifiers,
input.name,
typeParameters,
heritageClauses,
members
))];
} else {
const heritageClauses = transformHeritageClauses(input.heritageClauses);
return cleanup(factory2.updateClassDeclaration(
input,
modifiers,
input.name,
typeParameters,
heritageClauses,
members
));
}
}
case 242 /* VariableStatement */: {
return cleanup(transformVariableStatement(input));
}
case 265 /* EnumDeclaration */: {
return cleanup(factory2.updateEnumDeclaration(input, factory2.createNodeArray(ensureModifiers(input)), input.name, factory2.createNodeArray(mapDefined(input.members, (m) => {
if (shouldStripInternal(m))
return;
const constValue = resolver.getConstantValue(m);
return preserveJsDoc(factory2.updateEnumMember(m, m.name, constValue !== void 0 ? typeof constValue === "string" ? factory2.createStringLiteral(constValue) : factory2.createNumericLiteral(constValue) : void 0), m);
}))));
}
}
return Debug.assertNever(input, `Unhandled top-level node in declaration emit: ${Debug.formatSyntaxKind(input.kind)}`);
function cleanup(node) {
if (isEnclosingDeclaration(input)) {
enclosingDeclaration = previousEnclosingDeclaration;
}
if (canProdiceDiagnostic) {
getSymbolAccessibilityDiagnostic = oldDiag;
}
if (input.kind === 266 /* ModuleDeclaration */) {
needsDeclare = previousNeedsDeclare;
}
if (node === input) {
return node;
}
errorFallbackNode = void 0;
errorNameNode = void 0;
return node && setOriginalNode(preserveJsDoc(node, input), input);
}
}
function transformVariableStatement(input) {
if (!forEach(input.declarationList.declarations, getBindingNameVisible))
return;
const nodes = visitNodes2(input.declarationList.declarations, visitDeclarationSubtree, isVariableDeclaration);
if (!length(nodes))
return;
return factory2.updateVariableStatement(input, factory2.createNodeArray(ensureModifiers(input)), factory2.updateVariableDeclarationList(input.declarationList, nodes));
}
function recreateBindingPattern(d) {
return flatten(mapDefined(d.elements, (e) => recreateBindingElement(e)));
}
function recreateBindingElement(e) {
if (e.kind === 231 /* OmittedExpression */) {
return;
}
if (e.name) {
if (!getBindingNameVisible(e))
return;
if (isBindingPattern(e.name)) {
return recreateBindingPattern(e.name);
} else {
return factory2.createVariableDeclaration(
e.name,
/*exclamationToken*/
void 0,
ensureType(
e,
/*type*/
void 0
),
/*initializer*/
void 0
);
}
}
}
function checkName(node) {
let oldDiag;
if (!suppressNewDiagnosticContexts) {
oldDiag = getSymbolAccessibilityDiagnostic;
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNodeName(node);
}
errorNameNode = node.name;
Debug.assert(resolver.isLateBound(getParseTreeNode(node)));
const decl = node;
const entityName = decl.name.expression;
checkEntityNameVisibility(entityName, enclosingDeclaration);
if (!suppressNewDiagnosticContexts) {
getSymbolAccessibilityDiagnostic = oldDiag;
}
errorNameNode = void 0;
}
function shouldStripInternal(node) {
return !!stripInternal && !!node && isInternalDeclaration(node, currentSourceFile);
}
function isScopeMarker2(node) {
return isExportAssignment(node) || isExportDeclaration(node);
}
function hasScopeMarker2(statements) {
return some(statements, isScopeMarker2);
}
function ensureModifiers(node) {
const currentFlags = getEffectiveModifierFlags(node);
const newFlags = ensureModifierFlags(node);
if (currentFlags === newFlags) {
return visitArray(node.modifiers, (n) => tryCast(n, isModifier), isModifier);
}
return factory2.createModifiersFromModifierFlags(newFlags);
}
function ensureModifierFlags(node) {
let mask = 258047 /* All */ ^ (4 /* Public */ | 512 /* Async */ | 16384 /* Override */);
let additions = needsDeclare && !isAlwaysType(node) ? 2 /* Ambient */ : 0 /* None */;
const parentIsFile = node.parent.kind === 311 /* SourceFile */;
if (!parentIsFile || isBundledEmit && parentIsFile && isExternalModule(node.parent)) {
mask ^= 2 /* Ambient */;
additions = 0 /* None */;
}
return maskModifierFlags(node, mask, additions);
}
function getTypeAnnotationFromAllAccessorDeclarations(node, accessors) {
let accessorType = getTypeAnnotationFromAccessor(node);
if (!accessorType && node !== accessors.firstAccessor) {
accessorType = getTypeAnnotationFromAccessor(accessors.firstAccessor);
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(accessors.firstAccessor);
}
if (!accessorType && accessors.secondAccessor && node !== accessors.secondAccessor) {
accessorType = getTypeAnnotationFromAccessor(accessors.secondAccessor);
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(accessors.secondAccessor);
}
return accessorType;
}
function transformHeritageClauses(nodes) {
return factory2.createNodeArray(filter(map(nodes, (clause) => factory2.updateHeritageClause(clause, visitNodes2(factory2.createNodeArray(filter(clause.types, (t) => {
return isEntityNameExpression(t.expression) || clause.token === 96 /* ExtendsKeyword */ && t.expression.kind === 106 /* NullKeyword */;
})), visitDeclarationSubtree, isExpressionWithTypeArguments))), (clause) => clause.types && !!clause.types.length));
}
}
function isAlwaysType(node) {
if (node.kind === 263 /* InterfaceDeclaration */) {
return true;
}
return false;
}
function maskModifiers(factory2, node, modifierMask, modifierAdditions) {
return factory2.createModifiersFromModifierFlags(maskModifierFlags(node, modifierMask, modifierAdditions));
}
function maskModifierFlags(node, modifierMask = 258047 /* All */ ^ 4 /* Public */, modifierAdditions = 0 /* None */) {
let flags = getEffectiveModifierFlags(node) & modifierMask | modifierAdditions;
if (flags & 1024 /* Default */ && !(flags & 1 /* Export */)) {
flags ^= 1 /* Export */;
}
if (flags & 1024 /* Default */ && flags & 2 /* Ambient */) {
flags ^= 2 /* Ambient */;
}
return flags;
}
function getTypeAnnotationFromAccessor(accessor) {
if (accessor) {
return accessor.kind === 176 /* GetAccessor */ ? accessor.type : accessor.parameters.length > 0 ? accessor.parameters[0].type : void 0;
}
}
function canHaveLiteralInitializer(node) {
switch (node.kind) {
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
return !hasEffectiveModifier(node, 8 /* Private */);
case 168 /* Parameter */:
case 259 /* VariableDeclaration */:
return true;
}
return false;
}
function isPreservedDeclarationStatement(node) {
switch (node.kind) {
case 261 /* FunctionDeclaration */:
case 266 /* ModuleDeclaration */:
case 270 /* ImportEqualsDeclaration */:
case 263 /* InterfaceDeclaration */:
case 262 /* ClassDeclaration */:
case 264 /* TypeAliasDeclaration */:
case 265 /* EnumDeclaration */:
case 242 /* VariableStatement */:
case 271 /* ImportDeclaration */:
case 277 /* ExportDeclaration */:
case 276 /* ExportAssignment */:
return true;
}
return false;
}
function isProcessedComponent(node) {
switch (node.kind) {
case 179 /* ConstructSignature */:
case 175 /* Constructor */:
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 171 /* PropertyDeclaration */:
case 170 /* PropertySignature */:
case 172 /* MethodSignature */:
case 178 /* CallSignature */:
case 180 /* IndexSignature */:
case 259 /* VariableDeclaration */:
case 167 /* TypeParameter */:
case 232 /* ExpressionWithTypeArguments */:
case 182 /* TypeReference */:
case 193 /* ConditionalType */:
case 183 /* FunctionType */:
case 184 /* ConstructorType */:
case 204 /* ImportType */:
return true;
}
return false;
}
// src/compiler/transformer.ts
function getModuleTransformer(moduleKind) {
switch (moduleKind) {
case 99 /* ESNext */:
case 7 /* ES2022 */:
case 6 /* ES2020 */:
case 5 /* ES2015 */:
return transformECMAScriptModule;
case 4 /* System */:
return transformSystemModule;
case 100 /* Node16 */:
case 199 /* NodeNext */:
return transformNodeModule;
default:
return transformModule;
}
}
var noTransformers = { scriptTransformers: emptyArray, declarationTransformers: emptyArray };
function getTransformers(compilerOptions, customTransformers, emitOnly) {
return {
scriptTransformers: getScriptTransformers(compilerOptions, customTransformers, emitOnly),
declarationTransformers: getDeclarationTransformers(customTransformers)
};
}
function getScriptTransformers(compilerOptions, customTransformers, emitOnly) {
if (emitOnly)
return emptyArray;
const languageVersion = getEmitScriptTarget(compilerOptions);
const moduleKind = getEmitModuleKind(compilerOptions);
const useDefineForClassFields = getUseDefineForClassFields(compilerOptions);
const transformers = [];
addRange(transformers, customTransformers && map(customTransformers.before, wrapScriptTransformerFactory));
transformers.push(transformTypeScript);
if (compilerOptions.experimentalDecorators) {
transformers.push(transformLegacyDecorators);
} else if (languageVersion < 99 /* ESNext */ || !useDefineForClassFields) {
transformers.push(transformESDecorators);
}
transformers.push(transformClassFields);
if (getJSXTransformEnabled(compilerOptions)) {
transformers.push(transformJsx);
}
if (languageVersion < 99 /* ESNext */) {
transformers.push(transformESNext);
}
if (languageVersion < 8 /* ES2021 */) {
transformers.push(transformES2021);
}
if (languageVersion < 7 /* ES2020 */) {
transformers.push(transformES2020);
}
if (languageVersion < 6 /* ES2019 */) {
transformers.push(transformES2019);
}
if (languageVersion < 5 /* ES2018 */) {
transformers.push(transformES2018);
}
if (languageVersion < 4 /* ES2017 */) {
transformers.push(transformES2017);
}
if (languageVersion < 3 /* ES2016 */) {
transformers.push(transformES2016);
}
if (languageVersion < 2 /* ES2015 */) {
transformers.push(transformES2015);
transformers.push(transformGenerators);
}
transformers.push(getModuleTransformer(moduleKind));
if (languageVersion < 1 /* ES5 */) {
transformers.push(transformES5);
}
addRange(transformers, customTransformers && map(customTransformers.after, wrapScriptTransformerFactory));
return transformers;
}
function getDeclarationTransformers(customTransformers) {
const transformers = [];
transformers.push(transformDeclarations);
addRange(transformers, customTransformers && map(customTransformers.afterDeclarations, wrapDeclarationTransformerFactory));
return transformers;
}
function wrapCustomTransformer(transformer) {
return (node) => isBundle(node) ? transformer.transformBundle(node) : transformer.transformSourceFile(node);
}
function wrapCustomTransformerFactory(transformer, handleDefault) {
return (context) => {
const customTransformer = transformer(context);
return typeof customTransformer === "function" ? handleDefault(context, customTransformer) : wrapCustomTransformer(customTransformer);
};
}
function wrapScriptTransformerFactory(transformer) {
return wrapCustomTransformerFactory(transformer, chainBundle);
}
function wrapDeclarationTransformerFactory(transformer) {
return wrapCustomTransformerFactory(transformer, (_, node) => node);
}
function noEmitSubstitution(_hint, node) {
return node;
}
function noEmitNotification(hint, node, callback) {
callback(hint, node);
}
function transformNodes(resolver, host, factory2, options, nodes, transformers, allowDtsFiles) {
var _a, _b;
const enabledSyntaxKindFeatures = new Array(362 /* Count */);
let lexicalEnvironmentVariableDeclarations;
let lexicalEnvironmentFunctionDeclarations;
let lexicalEnvironmentStatements;
let lexicalEnvironmentFlags = 0 /* None */;
let lexicalEnvironmentVariableDeclarationsStack = [];
let lexicalEnvironmentFunctionDeclarationsStack = [];
let lexicalEnvironmentStatementsStack = [];
let lexicalEnvironmentFlagsStack = [];
let lexicalEnvironmentStackOffset = 0;
let lexicalEnvironmentSuspended = false;
let blockScopedVariableDeclarationsStack = [];
let blockScopeStackOffset = 0;
let blockScopedVariableDeclarations;
let emitHelpers;
let onSubstituteNode = noEmitSubstitution;
let onEmitNode = noEmitNotification;
let state = 0 /* Uninitialized */;
const diagnostics = [];
const context = {
factory: factory2,
getCompilerOptions: () => options,
getEmitResolver: () => resolver,
// TODO: GH#18217
getEmitHost: () => host,
// TODO: GH#18217
getEmitHelperFactory: memoize(() => createEmitHelperFactory(context)),
startLexicalEnvironment,
suspendLexicalEnvironment,
resumeLexicalEnvironment,
endLexicalEnvironment,
setLexicalEnvironmentFlags,
getLexicalEnvironmentFlags,
hoistVariableDeclaration,
hoistFunctionDeclaration,
addInitializationStatement,
startBlockScope,
endBlockScope,
addBlockScopedVariable,
requestEmitHelper,
readEmitHelpers,
enableSubstitution,
enableEmitNotification,
isSubstitutionEnabled,
isEmitNotificationEnabled,
get onSubstituteNode() {
return onSubstituteNode;
},
set onSubstituteNode(value) {
Debug.assert(state < 1 /* Initialized */, "Cannot modify transformation hooks after initialization has completed.");
Debug.assert(value !== void 0, "Value must not be 'undefined'");
onSubstituteNode = value;
},
get onEmitNode() {
return onEmitNode;
},
set onEmitNode(value) {
Debug.assert(state < 1 /* Initialized */, "Cannot modify transformation hooks after initialization has completed.");
Debug.assert(value !== void 0, "Value must not be 'undefined'");
onEmitNode = value;
},
addDiagnostic(diag2) {
diagnostics.push(diag2);
}
};
for (const node of nodes) {
disposeEmitNodes(getSourceFileOfNode(getParseTreeNode(node)));
}
mark("beforeTransform");
const transformersWithContext = transformers.map((t) => t(context));
const transformation = (node) => {
for (const transform of transformersWithContext) {
node = transform(node);
}
return node;
};
state = 1 /* Initialized */;
const transformed = [];
for (const node of nodes) {
(_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Emit, "transformNodes", node.kind === 311 /* SourceFile */ ? { path: node.path } : { kind: node.kind, pos: node.pos, end: node.end });
transformed.push((allowDtsFiles ? transformation : transformRoot)(node));
(_b = tracing) == null ? void 0 : _b.pop();
}
state = 2 /* Completed */;
mark("afterTransform");
measure("transformTime", "beforeTransform", "afterTransform");
return {
transformed,
substituteNode,
emitNodeWithNotification,
isEmitNotificationEnabled,
dispose,
diagnostics
};
function transformRoot(node) {
return node && (!isSourceFile(node) || !node.isDeclarationFile) ? transformation(node) : node;
}
function enableSubstitution(kind) {
Debug.assert(state < 2 /* Completed */, "Cannot modify the transformation context after transformation has completed.");
enabledSyntaxKindFeatures[kind] |= 1 /* Substitution */;
}
function isSubstitutionEnabled(node) {
return (enabledSyntaxKindFeatures[node.kind] & 1 /* Substitution */) !== 0 && (getEmitFlags(node) & 8 /* NoSubstitution */) === 0;
}
function substituteNode(hint, node) {
Debug.assert(state < 3 /* Disposed */, "Cannot substitute a node after the result is disposed.");
return node && isSubstitutionEnabled(node) && onSubstituteNode(hint, node) || node;
}
function enableEmitNotification(kind) {
Debug.assert(state < 2 /* Completed */, "Cannot modify the transformation context after transformation has completed.");
enabledSyntaxKindFeatures[kind] |= 2 /* EmitNotifications */;
}
function isEmitNotificationEnabled(node) {
return (enabledSyntaxKindFeatures[node.kind] & 2 /* EmitNotifications */) !== 0 || (getEmitFlags(node) & 4 /* AdviseOnEmitNode */) !== 0;
}
function emitNodeWithNotification(hint, node, emitCallback) {
Debug.assert(state < 3 /* Disposed */, "Cannot invoke TransformationResult callbacks after the result is disposed.");
if (node) {
if (isEmitNotificationEnabled(node)) {
onEmitNode(hint, node, emitCallback);
} else {
emitCallback(hint, node);
}
}
}
function hoistVariableDeclaration(name) {
Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
const decl = setEmitFlags(factory2.createVariableDeclaration(name), 128 /* NoNestedSourceMaps */);
if (!lexicalEnvironmentVariableDeclarations) {
lexicalEnvironmentVariableDeclarations = [decl];
} else {
lexicalEnvironmentVariableDeclarations.push(decl);
}
if (lexicalEnvironmentFlags & 1 /* InParameters */) {
lexicalEnvironmentFlags |= 2 /* VariablesHoistedInParameters */;
}
}
function hoistFunctionDeclaration(func) {
Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
setEmitFlags(func, 2097152 /* CustomPrologue */);
if (!lexicalEnvironmentFunctionDeclarations) {
lexicalEnvironmentFunctionDeclarations = [func];
} else {
lexicalEnvironmentFunctionDeclarations.push(func);
}
}
function addInitializationStatement(node) {
Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
setEmitFlags(node, 2097152 /* CustomPrologue */);
if (!lexicalEnvironmentStatements) {
lexicalEnvironmentStatements = [node];
} else {
lexicalEnvironmentStatements.push(node);
}
}
function startLexicalEnvironment() {
Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
Debug.assert(!lexicalEnvironmentSuspended, "Lexical environment is suspended.");
lexicalEnvironmentVariableDeclarationsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentVariableDeclarations;
lexicalEnvironmentFunctionDeclarationsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentFunctionDeclarations;
lexicalEnvironmentStatementsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentStatements;
lexicalEnvironmentFlagsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentFlags;
lexicalEnvironmentStackOffset++;
lexicalEnvironmentVariableDeclarations = void 0;
lexicalEnvironmentFunctionDeclarations = void 0;
lexicalEnvironmentStatements = void 0;
lexicalEnvironmentFlags = 0 /* None */;
}
function suspendLexicalEnvironment() {
Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
Debug.assert(!lexicalEnvironmentSuspended, "Lexical environment is already suspended.");
lexicalEnvironmentSuspended = true;
}
function resumeLexicalEnvironment() {
Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
Debug.assert(lexicalEnvironmentSuspended, "Lexical environment is not suspended.");
lexicalEnvironmentSuspended = false;
}
function endLexicalEnvironment() {
Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
Debug.assert(!lexicalEnvironmentSuspended, "Lexical environment is suspended.");
let statements;
if (lexicalEnvironmentVariableDeclarations || lexicalEnvironmentFunctionDeclarations || lexicalEnvironmentStatements) {
if (lexicalEnvironmentFunctionDeclarations) {
statements = [...lexicalEnvironmentFunctionDeclarations];
}
if (lexicalEnvironmentVariableDeclarations) {
const statement = factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(lexicalEnvironmentVariableDeclarations)
);
setEmitFlags(statement, 2097152 /* CustomPrologue */);
if (!statements) {
statements = [statement];
} else {
statements.push(statement);
}
}
if (lexicalEnvironmentStatements) {
if (!statements) {
statements = [...lexicalEnvironmentStatements];
} else {
statements = [...statements, ...lexicalEnvironmentStatements];
}
}
}
lexicalEnvironmentStackOffset--;
lexicalEnvironmentVariableDeclarations = lexicalEnvironmentVariableDeclarationsStack[lexicalEnvironmentStackOffset];
lexicalEnvironmentFunctionDeclarations = lexicalEnvironmentFunctionDeclarationsStack[lexicalEnvironmentStackOffset];
lexicalEnvironmentStatements = lexicalEnvironmentStatementsStack[lexicalEnvironmentStackOffset];
lexicalEnvironmentFlags = lexicalEnvironmentFlagsStack[lexicalEnvironmentStackOffset];
if (lexicalEnvironmentStackOffset === 0) {
lexicalEnvironmentVariableDeclarationsStack = [];
lexicalEnvironmentFunctionDeclarationsStack = [];
lexicalEnvironmentStatementsStack = [];
lexicalEnvironmentFlagsStack = [];
}
return statements;
}
function setLexicalEnvironmentFlags(flags, value) {
lexicalEnvironmentFlags = value ? lexicalEnvironmentFlags | flags : lexicalEnvironmentFlags & ~flags;
}
function getLexicalEnvironmentFlags() {
return lexicalEnvironmentFlags;
}
function startBlockScope() {
Debug.assert(state > 0 /* Uninitialized */, "Cannot start a block scope during initialization.");
Debug.assert(state < 2 /* Completed */, "Cannot start a block scope after transformation has completed.");
blockScopedVariableDeclarationsStack[blockScopeStackOffset] = blockScopedVariableDeclarations;
blockScopeStackOffset++;
blockScopedVariableDeclarations = void 0;
}
function endBlockScope() {
Debug.assert(state > 0 /* Uninitialized */, "Cannot end a block scope during initialization.");
Debug.assert(state < 2 /* Completed */, "Cannot end a block scope after transformation has completed.");
const statements = some(blockScopedVariableDeclarations) ? [
factory2.createVariableStatement(
/*modifiers*/
void 0,
factory2.createVariableDeclarationList(
blockScopedVariableDeclarations.map((identifier) => factory2.createVariableDeclaration(identifier)),
1 /* Let */
)
)
] : void 0;
blockScopeStackOffset--;
blockScopedVariableDeclarations = blockScopedVariableDeclarationsStack[blockScopeStackOffset];
if (blockScopeStackOffset === 0) {
blockScopedVariableDeclarationsStack = [];
}
return statements;
}
function addBlockScopedVariable(name) {
Debug.assert(blockScopeStackOffset > 0, "Cannot add a block scoped variable outside of an iteration body.");
(blockScopedVariableDeclarations || (blockScopedVariableDeclarations = [])).push(name);
}
function requestEmitHelper(helper) {
Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the transformation context during initialization.");
Debug.assert(state < 2 /* Completed */, "Cannot modify the transformation context after transformation has completed.");
Debug.assert(!helper.scoped, "Cannot request a scoped emit helper.");
if (helper.dependencies) {
for (const h of helper.dependencies) {
requestEmitHelper(h);
}
}
emitHelpers = append(emitHelpers, helper);
}
function readEmitHelpers() {
Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the transformation context during initialization.");
Debug.assert(state < 2 /* Completed */, "Cannot modify the transformation context after transformation has completed.");
const helpers = emitHelpers;
emitHelpers = void 0;
return helpers;
}
function dispose() {
if (state < 3 /* Disposed */) {
for (const node of nodes) {
disposeEmitNodes(getSourceFileOfNode(getParseTreeNode(node)));
}
lexicalEnvironmentVariableDeclarations = void 0;
lexicalEnvironmentVariableDeclarationsStack = void 0;
lexicalEnvironmentFunctionDeclarations = void 0;
lexicalEnvironmentFunctionDeclarationsStack = void 0;
onSubstituteNode = void 0;
onEmitNode = void 0;
emitHelpers = void 0;
state = 3 /* Disposed */;
}
}
}
var nullTransformationContext = {
factory,
// eslint-disable-line object-shorthand
getCompilerOptions: () => ({}),
getEmitResolver: notImplemented,
getEmitHost: notImplemented,
getEmitHelperFactory: notImplemented,
startLexicalEnvironment: noop,
resumeLexicalEnvironment: noop,
suspendLexicalEnvironment: noop,
endLexicalEnvironment: returnUndefined,
setLexicalEnvironmentFlags: noop,
getLexicalEnvironmentFlags: () => 0,
hoistVariableDeclaration: noop,
hoistFunctionDeclaration: noop,
addInitializationStatement: noop,
startBlockScope: noop,
endBlockScope: returnUndefined,
addBlockScopedVariable: noop,
requestEmitHelper: noop,
readEmitHelpers: notImplemented,
enableSubstitution: noop,
enableEmitNotification: noop,
isSubstitutionEnabled: notImplemented,
isEmitNotificationEnabled: notImplemented,
onSubstituteNode: noEmitSubstitution,
onEmitNode: noEmitNotification,
addDiagnostic: noop
};
// src/compiler/emitter.ts
var brackets = createBracketsMap();
function isBuildInfoFile(file) {
return fileExtensionIs(file, ".tsbuildinfo" /* TsBuildInfo */);
}
function forEachEmittedFile(host, action, sourceFilesOrTargetSourceFile, forceDtsEmit = false, onlyBuildInfo, includeBuildInfo) {
const sourceFiles = isArray(sourceFilesOrTargetSourceFile) ? sourceFilesOrTargetSourceFile : getSourceFilesToEmit(host, sourceFilesOrTargetSourceFile, forceDtsEmit);
const options = host.getCompilerOptions();
if (outFile(options)) {
const prepends = host.getPrependNodes();
if (sourceFiles.length || prepends.length) {
const bundle = factory.createBundle(sourceFiles, prepends);
const result = action(getOutputPathsFor(bundle, host, forceDtsEmit), bundle);
if (result) {
return result;
}
}
} else {
if (!onlyBuildInfo) {
for (const sourceFile of sourceFiles) {
const result = action(getOutputPathsFor(sourceFile, host, forceDtsEmit), sourceFile);
if (result) {
return result;
}
}
}
if (includeBuildInfo) {
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(options);
if (buildInfoPath)
return action(
{ buildInfoPath },
/*sourceFileOrBundle*/
void 0
);
}
}
}
function getTsBuildInfoEmitOutputFilePath(options) {
const configFile = options.configFilePath;
if (!isIncrementalCompilation(options))
return void 0;
if (options.tsBuildInfoFile)
return options.tsBuildInfoFile;
const outPath = outFile(options);
let buildInfoExtensionLess;
if (outPath) {
buildInfoExtensionLess = removeFileExtension(outPath);
} else {
if (!configFile)
return void 0;
const configFileExtensionLess = removeFileExtension(configFile);
buildInfoExtensionLess = options.outDir ? options.rootDir ? resolvePath(options.outDir, getRelativePathFromDirectory(
options.rootDir,
configFileExtensionLess,
/*ignoreCase*/
true
)) : combinePaths(options.outDir, getBaseFileName(configFileExtensionLess)) : configFileExtensionLess;
}
return buildInfoExtensionLess + ".tsbuildinfo" /* TsBuildInfo */;
}
function getOutputPathsForBundle(options, forceDtsPaths) {
const outPath = outFile(options);
const jsFilePath = options.emitDeclarationOnly ? void 0 : outPath;
const sourceMapFilePath = jsFilePath && getSourceMapFilePath(jsFilePath, options);
const declarationFilePath = forceDtsPaths || getEmitDeclarations(options) ? removeFileExtension(outPath) + ".d.ts" /* Dts */ : void 0;
const declarationMapPath = declarationFilePath && getAreDeclarationMapsEnabled(options) ? declarationFilePath + ".map" : void 0;
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(options);
return { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath };
}
function getOutputPathsFor(sourceFile, host, forceDtsPaths) {
const options = host.getCompilerOptions();
if (sourceFile.kind === 312 /* Bundle */) {
return getOutputPathsForBundle(options, forceDtsPaths);
} else {
const ownOutputFilePath = getOwnEmitOutputFilePath(sourceFile.fileName, host, getOutputExtension(sourceFile.fileName, options));
const isJsonFile = isJsonSourceFile(sourceFile);
const isJsonEmittedToSameLocation = isJsonFile && comparePaths(sourceFile.fileName, ownOutputFilePath, host.getCurrentDirectory(), !host.useCaseSensitiveFileNames()) === 0 /* EqualTo */;
const jsFilePath = options.emitDeclarationOnly || isJsonEmittedToSameLocation ? void 0 : ownOutputFilePath;
const sourceMapFilePath = !jsFilePath || isJsonSourceFile(sourceFile) ? void 0 : getSourceMapFilePath(jsFilePath, options);
const declarationFilePath = forceDtsPaths || getEmitDeclarations(options) && !isJsonFile ? getDeclarationEmitOutputFilePath(sourceFile.fileName, host) : void 0;
const declarationMapPath = declarationFilePath && getAreDeclarationMapsEnabled(options) ? declarationFilePath + ".map" : void 0;
return { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath: void 0 };
}
}
function getSourceMapFilePath(jsFilePath, options) {
return options.sourceMap && !options.inlineSourceMap ? jsFilePath + ".map" : void 0;
}
function getOutputExtension(fileName, options) {
return fileExtensionIs(fileName, ".json" /* Json */) ? ".json" /* Json */ : options.jsx === 1 /* Preserve */ && fileExtensionIsOneOf(fileName, [".jsx" /* Jsx */, ".tsx" /* Tsx */]) ? ".jsx" /* Jsx */ : fileExtensionIsOneOf(fileName, [".mts" /* Mts */, ".mjs" /* Mjs */]) ? ".mjs" /* Mjs */ : fileExtensionIsOneOf(fileName, [".cts" /* Cts */, ".cjs" /* Cjs */]) ? ".cjs" /* Cjs */ : ".js" /* Js */;
}
function getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, outputDir, getCommonSourceDirectory2) {
return outputDir ? resolvePath(
outputDir,
getRelativePathFromDirectory(getCommonSourceDirectory2 ? getCommonSourceDirectory2() : getCommonSourceDirectoryOfConfig(configFile, ignoreCase), inputFileName, ignoreCase)
) : inputFileName;
}
function getOutputDeclarationFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2) {
return changeExtension(
getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, configFile.options.declarationDir || configFile.options.outDir, getCommonSourceDirectory2),
getDeclarationEmitExtensionForPath(inputFileName)
);
}
function getOutputJSFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2) {
if (configFile.options.emitDeclarationOnly)
return void 0;
const isJsonFile = fileExtensionIs(inputFileName, ".json" /* Json */);
const outputFileName = changeExtension(
getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, configFile.options.outDir, getCommonSourceDirectory2),
getOutputExtension(inputFileName, configFile.options)
);
return !isJsonFile || comparePaths(inputFileName, outputFileName, Debug.checkDefined(configFile.options.configFilePath), ignoreCase) !== 0 /* EqualTo */ ? outputFileName : void 0;
}
function createAddOutput() {
let outputs;
return { addOutput, getOutputs };
function addOutput(path) {
if (path) {
(outputs || (outputs = [])).push(path);
}
}
function getOutputs() {
return outputs || emptyArray;
}
}
function getSingleOutputFileNames(configFile, addOutput) {
const { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath } = getOutputPathsForBundle(
configFile.options,
/*forceDtsPaths*/
false
);
addOutput(jsFilePath);
addOutput(sourceMapFilePath);
addOutput(declarationFilePath);
addOutput(declarationMapPath);
addOutput(buildInfoPath);
}
function getOwnOutputFileNames(configFile, inputFileName, ignoreCase, addOutput, getCommonSourceDirectory2) {
if (isDeclarationFileName(inputFileName))
return;
const js = getOutputJSFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2);
addOutput(js);
if (fileExtensionIs(inputFileName, ".json" /* Json */))
return;
if (js && configFile.options.sourceMap) {
addOutput(`${js}.map`);
}
if (getEmitDeclarations(configFile.options)) {
const dts = getOutputDeclarationFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2);
addOutput(dts);
if (configFile.options.declarationMap) {
addOutput(`${dts}.map`);
}
}
}
function getCommonSourceDirectory(options, emittedFiles, currentDirectory, getCanonicalFileName, checkSourceFilesBelongToPath) {
let commonSourceDirectory;
if (options.rootDir) {
commonSourceDirectory = getNormalizedAbsolutePath(options.rootDir, currentDirectory);
checkSourceFilesBelongToPath == null ? void 0 : checkSourceFilesBelongToPath(options.rootDir);
} else if (options.composite && options.configFilePath) {
commonSourceDirectory = getDirectoryPath(normalizeSlashes(options.configFilePath));
checkSourceFilesBelongToPath == null ? void 0 : checkSourceFilesBelongToPath(commonSourceDirectory);
} else {
commonSourceDirectory = computeCommonSourceDirectoryOfFilenames(emittedFiles(), currentDirectory, getCanonicalFileName);
}
if (commonSourceDirectory && commonSourceDirectory[commonSourceDirectory.length - 1] !== directorySeparator) {
commonSourceDirectory += directorySeparator;
}
return commonSourceDirectory;
}
function getCommonSourceDirectoryOfConfig({ options, fileNames }, ignoreCase) {
return getCommonSourceDirectory(
options,
() => filter(fileNames, (file) => !(options.noEmitForJsFiles && fileExtensionIsOneOf(file, supportedJSExtensionsFlat)) && !isDeclarationFileName(file)),
getDirectoryPath(normalizeSlashes(Debug.checkDefined(options.configFilePath))),
createGetCanonicalFileName(!ignoreCase)
);
}
function getAllProjectOutputs(configFile, ignoreCase) {
const { addOutput, getOutputs } = createAddOutput();
if (outFile(configFile.options)) {
getSingleOutputFileNames(configFile, addOutput);
} else {
const getCommonSourceDirectory2 = memoize(() => getCommonSourceDirectoryOfConfig(configFile, ignoreCase));
for (const inputFileName of configFile.fileNames) {
getOwnOutputFileNames(configFile, inputFileName, ignoreCase, addOutput, getCommonSourceDirectory2);
}
addOutput(getTsBuildInfoEmitOutputFilePath(configFile.options));
}
return getOutputs();
}
function getFirstProjectOutput(configFile, ignoreCase) {
if (outFile(configFile.options)) {
const { jsFilePath, declarationFilePath } = getOutputPathsForBundle(
configFile.options,
/*forceDtsPaths*/
false
);
return Debug.checkDefined(jsFilePath || declarationFilePath, `project ${configFile.options.configFilePath} expected to have at least one output`);
}
const getCommonSourceDirectory2 = memoize(() => getCommonSourceDirectoryOfConfig(configFile, ignoreCase));
for (const inputFileName of configFile.fileNames) {
if (isDeclarationFileName(inputFileName))
continue;
const jsFilePath = getOutputJSFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2);
if (jsFilePath)
return jsFilePath;
if (fileExtensionIs(inputFileName, ".json" /* Json */))
continue;
if (getEmitDeclarations(configFile.options)) {
return getOutputDeclarationFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2);
}
}
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(configFile.options);
if (buildInfoPath)
return buildInfoPath;
return Debug.fail(`project ${configFile.options.configFilePath} expected to have at least one output`);
}
function emitFiles(resolver, host, targetSourceFile, { scriptTransformers, declarationTransformers }, emitOnly, onlyBuildInfo, forceDtsEmit) {
var compilerOptions = host.getCompilerOptions();
var sourceMapDataList = compilerOptions.sourceMap || compilerOptions.inlineSourceMap || getAreDeclarationMapsEnabled(compilerOptions) ? [] : void 0;
var emittedFilesList = compilerOptions.listEmittedFiles ? [] : void 0;
var emitterDiagnostics = createDiagnosticCollection();
var newLine = getNewLineCharacter(compilerOptions);
var writer = createTextWriter(newLine);
var { enter, exit } = createTimer("printTime", "beforePrint", "afterPrint");
var bundleBuildInfo;
var emitSkipped = false;
enter();
forEachEmittedFile(
host,
emitSourceFileOrBundle,
getSourceFilesToEmit(host, targetSourceFile, forceDtsEmit),
forceDtsEmit,
onlyBuildInfo,
!targetSourceFile
);
exit();
return {
emitSkipped,
diagnostics: emitterDiagnostics.getDiagnostics(),
emittedFiles: emittedFilesList,
sourceMaps: sourceMapDataList
};
function emitSourceFileOrBundle({ jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath }, sourceFileOrBundle) {
var _a, _b, _c, _d, _e, _f;
let buildInfoDirectory;
if (buildInfoPath && sourceFileOrBundle && isBundle(sourceFileOrBundle)) {
buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory()));
bundleBuildInfo = {
commonSourceDirectory: relativeToBuildInfo(host.getCommonSourceDirectory()),
sourceFiles: sourceFileOrBundle.sourceFiles.map((file) => relativeToBuildInfo(getNormalizedAbsolutePath(file.fileName, host.getCurrentDirectory())))
};
}
(_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Emit, "emitJsFileOrBundle", { jsFilePath });
emitJsFileOrBundle(sourceFileOrBundle, jsFilePath, sourceMapFilePath, relativeToBuildInfo);
(_b = tracing) == null ? void 0 : _b.pop();
(_c = tracing) == null ? void 0 : _c.push(tracing.Phase.Emit, "emitDeclarationFileOrBundle", { declarationFilePath });
emitDeclarationFileOrBundle(sourceFileOrBundle, declarationFilePath, declarationMapPath, relativeToBuildInfo);
(_d = tracing) == null ? void 0 : _d.pop();
(_e = tracing) == null ? void 0 : _e.push(tracing.Phase.Emit, "emitBuildInfo", { buildInfoPath });
emitBuildInfo(bundleBuildInfo, buildInfoPath);
(_f = tracing) == null ? void 0 : _f.pop();
if (!emitSkipped && emittedFilesList) {
if (!emitOnly) {
if (jsFilePath) {
emittedFilesList.push(jsFilePath);
}
if (sourceMapFilePath) {
emittedFilesList.push(sourceMapFilePath);
}
if (buildInfoPath) {
emittedFilesList.push(buildInfoPath);
}
}
if (emitOnly !== 0 /* Js */) {
if (declarationFilePath) {
emittedFilesList.push(declarationFilePath);
}
if (declarationMapPath) {
emittedFilesList.push(declarationMapPath);
}
}
}
function relativeToBuildInfo(path) {
return ensurePathIsNonModuleName(getRelativePathFromDirectory(buildInfoDirectory, path, host.getCanonicalFileName));
}
}
function emitBuildInfo(bundle, buildInfoPath) {
if (!buildInfoPath || targetSourceFile || emitSkipped)
return;
if (host.isEmitBlocked(buildInfoPath)) {
emitSkipped = true;
return;
}
const buildInfo = host.getBuildInfo(bundle) || createBuildInfo(
/*program*/
void 0,
bundle
);
writeFile(
host,
emitterDiagnostics,
buildInfoPath,
getBuildInfoText(buildInfo),
/*writeByteOrderMark*/
false,
/*sourceFiles*/
void 0,
{ buildInfo }
);
}
function emitJsFileOrBundle(sourceFileOrBundle, jsFilePath, sourceMapFilePath, relativeToBuildInfo) {
if (!sourceFileOrBundle || emitOnly || !jsFilePath) {
return;
}
if (host.isEmitBlocked(jsFilePath) || compilerOptions.noEmit) {
emitSkipped = true;
return;
}
const transform = transformNodes(
resolver,
host,
factory,
compilerOptions,
[sourceFileOrBundle],
scriptTransformers,
/*allowDtsFiles*/
false
);
const printerOptions = {
removeComments: compilerOptions.removeComments,
newLine: compilerOptions.newLine,
noEmitHelpers: compilerOptions.noEmitHelpers,
module: compilerOptions.module,
target: compilerOptions.target,
sourceMap: compilerOptions.sourceMap,
inlineSourceMap: compilerOptions.inlineSourceMap,
inlineSources: compilerOptions.inlineSources,
extendedDiagnostics: compilerOptions.extendedDiagnostics,
writeBundleFileInfo: !!bundleBuildInfo,
relativeToBuildInfo
};
const printer = createPrinter(printerOptions, {
// resolver hooks
hasGlobalName: resolver.hasGlobalName,
// transform hooks
onEmitNode: transform.emitNodeWithNotification,
isEmitNotificationEnabled: transform.isEmitNotificationEnabled,
substituteNode: transform.substituteNode
});
Debug.assert(transform.transformed.length === 1, "Should only see one output from the transform");
printSourceFileOrBundle(jsFilePath, sourceMapFilePath, transform, printer, compilerOptions);
transform.dispose();
if (bundleBuildInfo)
bundleBuildInfo.js = printer.bundleFileInfo;
}
function emitDeclarationFileOrBundle(sourceFileOrBundle, declarationFilePath, declarationMapPath, relativeToBuildInfo) {
if (!sourceFileOrBundle || emitOnly === 0 /* Js */)
return;
if (!declarationFilePath) {
if (emitOnly || compilerOptions.emitDeclarationOnly)
emitSkipped = true;
return;
}
const sourceFiles = isSourceFile(sourceFileOrBundle) ? [sourceFileOrBundle] : sourceFileOrBundle.sourceFiles;
const filesForEmit = forceDtsEmit ? sourceFiles : filter(sourceFiles, isSourceFileNotJson);
const inputListOrBundle = outFile(compilerOptions) ? [factory.createBundle(filesForEmit, !isSourceFile(sourceFileOrBundle) ? sourceFileOrBundle.prepends : void 0)] : filesForEmit;
if (emitOnly && !getEmitDeclarations(compilerOptions)) {
filesForEmit.forEach(collectLinkedAliases);
}
const declarationTransform = transformNodes(
resolver,
host,
factory,
compilerOptions,
inputListOrBundle,
declarationTransformers,
/*allowDtsFiles*/
false
);
if (length(declarationTransform.diagnostics)) {
for (const diagnostic of declarationTransform.diagnostics) {
emitterDiagnostics.add(diagnostic);
}
}
const printerOptions = {
removeComments: compilerOptions.removeComments,
newLine: compilerOptions.newLine,
noEmitHelpers: true,
module: compilerOptions.module,
target: compilerOptions.target,
sourceMap: !forceDtsEmit && compilerOptions.declarationMap,
inlineSourceMap: compilerOptions.inlineSourceMap,
extendedDiagnostics: compilerOptions.extendedDiagnostics,
onlyPrintJsDocStyle: true,
writeBundleFileInfo: !!bundleBuildInfo,
recordInternalSection: !!bundleBuildInfo,
relativeToBuildInfo
};
const declarationPrinter = createPrinter(printerOptions, {
// resolver hooks
hasGlobalName: resolver.hasGlobalName,
// transform hooks
onEmitNode: declarationTransform.emitNodeWithNotification,
isEmitNotificationEnabled: declarationTransform.isEmitNotificationEnabled,
substituteNode: declarationTransform.substituteNode
});
const declBlocked = !!declarationTransform.diagnostics && !!declarationTransform.diagnostics.length || !!host.isEmitBlocked(declarationFilePath) || !!compilerOptions.noEmit;
emitSkipped = emitSkipped || declBlocked;
if (!declBlocked || forceDtsEmit) {
Debug.assert(declarationTransform.transformed.length === 1, "Should only see one output from the decl transform");
printSourceFileOrBundle(
declarationFilePath,
declarationMapPath,
declarationTransform,
declarationPrinter,
{
sourceMap: printerOptions.sourceMap,
sourceRoot: compilerOptions.sourceRoot,
mapRoot: compilerOptions.mapRoot,
extendedDiagnostics: compilerOptions.extendedDiagnostics
// Explicitly do not passthru either `inline` option
}
);
}
declarationTransform.dispose();
if (bundleBuildInfo)
bundleBuildInfo.dts = declarationPrinter.bundleFileInfo;
}
function collectLinkedAliases(node) {
if (isExportAssignment(node)) {
if (node.expression.kind === 80 /* Identifier */) {
resolver.collectLinkedAliases(
node.expression,
/*setVisibility*/
true
);
}
return;
} else if (isExportSpecifier(node)) {
resolver.collectLinkedAliases(
node.propertyName || node.name,
/*setVisibility*/
true
);
return;
}
forEachChild(node, collectLinkedAliases);
}
function printSourceFileOrBundle(jsFilePath, sourceMapFilePath, transform, printer, mapOptions) {
const sourceFileOrBundle = transform.transformed[0];
const bundle = sourceFileOrBundle.kind === 312 /* Bundle */ ? sourceFileOrBundle : void 0;
const sourceFile = sourceFileOrBundle.kind === 311 /* SourceFile */ ? sourceFileOrBundle : void 0;
const sourceFiles = bundle ? bundle.sourceFiles : [sourceFile];
let sourceMapGenerator;
if (shouldEmitSourceMaps(mapOptions, sourceFileOrBundle)) {
sourceMapGenerator = createSourceMapGenerator(
host,
getBaseFileName(normalizeSlashes(jsFilePath)),
getSourceRoot(mapOptions),
getSourceMapDirectory(mapOptions, jsFilePath, sourceFile),
mapOptions
);
}
if (bundle) {
printer.writeBundle(bundle, writer, sourceMapGenerator);
} else {
printer.writeFile(sourceFile, writer, sourceMapGenerator);
}
let sourceMapUrlPos;
if (sourceMapGenerator) {
if (sourceMapDataList) {
sourceMapDataList.push({
inputSourceFileNames: sourceMapGenerator.getSources(),
sourceMap: sourceMapGenerator.toJSON()
});
}
const sourceMappingURL = getSourceMappingURL(
mapOptions,
sourceMapGenerator,
jsFilePath,
sourceMapFilePath,
sourceFile
);
if (sourceMappingURL) {
if (!writer.isAtStartOfLine())
writer.rawWrite(newLine);
sourceMapUrlPos = writer.getTextPos();
writer.writeComment(`//# ${"sourceMappingURL"}=${sourceMappingURL}`);
}
if (sourceMapFilePath) {
const sourceMap = sourceMapGenerator.toString();
writeFile(
host,
emitterDiagnostics,
sourceMapFilePath,
sourceMap,
/*writeByteOrderMark*/
false,
sourceFiles
);
if (printer.bundleFileInfo)
printer.bundleFileInfo.mapHash = computeSignature(sourceMap, host);
}
} else {
writer.writeLine();
}
const text = writer.getText();
writeFile(host, emitterDiagnostics, jsFilePath, text, !!compilerOptions.emitBOM, sourceFiles, { sourceMapUrlPos, diagnostics: transform.diagnostics });
if (printer.bundleFileInfo)
printer.bundleFileInfo.hash = computeSignature(text, host);
writer.clear();
}
function shouldEmitSourceMaps(mapOptions, sourceFileOrBundle) {
return (mapOptions.sourceMap || mapOptions.inlineSourceMap) && (sourceFileOrBundle.kind !== 311 /* SourceFile */ || !fileExtensionIs(sourceFileOrBundle.fileName, ".json" /* Json */));
}
function getSourceRoot(mapOptions) {
const sourceRoot = normalizeSlashes(mapOptions.sourceRoot || "");
return sourceRoot ? ensureTrailingDirectorySeparator(sourceRoot) : sourceRoot;
}
function getSourceMapDirectory(mapOptions, filePath, sourceFile) {
if (mapOptions.sourceRoot)
return host.getCommonSourceDirectory();
if (mapOptions.mapRoot) {
let sourceMapDir = normalizeSlashes(mapOptions.mapRoot);
if (sourceFile) {
sourceMapDir = getDirectoryPath(getSourceFilePathInNewDir(sourceFile.fileName, host, sourceMapDir));
}
if (getRootLength(sourceMapDir) === 0) {
sourceMapDir = combinePaths(host.getCommonSourceDirectory(), sourceMapDir);
}
return sourceMapDir;
}
return getDirectoryPath(normalizePath(filePath));
}
function getSourceMappingURL(mapOptions, sourceMapGenerator, filePath, sourceMapFilePath, sourceFile) {
if (mapOptions.inlineSourceMap) {
const sourceMapText = sourceMapGenerator.toString();
const base64SourceMapText = base64encode(sys, sourceMapText);
return `data:application/json;base64,${base64SourceMapText}`;
}
const sourceMapFile = getBaseFileName(normalizeSlashes(Debug.checkDefined(sourceMapFilePath)));
if (mapOptions.mapRoot) {
let sourceMapDir = normalizeSlashes(mapOptions.mapRoot);
if (sourceFile) {
sourceMapDir = getDirectoryPath(getSourceFilePathInNewDir(sourceFile.fileName, host, sourceMapDir));
}
if (getRootLength(sourceMapDir) === 0) {
sourceMapDir = combinePaths(host.getCommonSourceDirectory(), sourceMapDir);
return encodeURI(
getRelativePathToDirectoryOrUrl(
getDirectoryPath(normalizePath(filePath)),
// get the relative sourceMapDir path based on jsFilePath
combinePaths(sourceMapDir, sourceMapFile),
// this is where user expects to see sourceMap
host.getCurrentDirectory(),
host.getCanonicalFileName,
/*isAbsolutePathAnUrl*/
true
)
);
} else {
return encodeURI(combinePaths(sourceMapDir, sourceMapFile));
}
}
return encodeURI(sourceMapFile);
}
}
function createBuildInfo(program, bundle) {
return { bundle, program, version };
}
function getBuildInfoText(buildInfo) {
return JSON.stringify(buildInfo);
}
function getBuildInfo(buildInfoFile, buildInfoText) {
return readJsonOrUndefined(buildInfoFile, buildInfoText);
}
var notImplementedResolver = {
hasGlobalName: notImplemented,
getReferencedExportContainer: notImplemented,
getReferencedImportDeclaration: notImplemented,
getReferencedDeclarationWithCollidingName: notImplemented,
isDeclarationWithCollidingName: notImplemented,
isValueAliasDeclaration: notImplemented,
isReferencedAliasDeclaration: notImplemented,
isTopLevelValueImportEqualsWithEntityName: notImplemented,
getNodeCheckFlags: notImplemented,
isDeclarationVisible: notImplemented,
isLateBound: (_node) => false,
collectLinkedAliases: notImplemented,
isImplementationOfOverload: notImplemented,
isRequiredInitializedParameter: notImplemented,
isOptionalUninitializedParameterProperty: notImplemented,
isExpandoFunctionDeclaration: notImplemented,
getPropertiesOfContainerFunction: notImplemented,
createTypeOfDeclaration: notImplemented,
createReturnTypeOfSignatureDeclaration: notImplemented,
createTypeOfExpression: notImplemented,
createLiteralConstValue: notImplemented,
isSymbolAccessible: notImplemented,
isEntityNameVisible: notImplemented,
// Returns the constant value this property access resolves to: notImplemented, or 'undefined' for a non-constant
getConstantValue: notImplemented,
getReferencedValueDeclaration: notImplemented,
getReferencedValueDeclarations: notImplemented,
getTypeReferenceSerializationKind: notImplemented,
isOptionalParameter: notImplemented,
moduleExportsSomeValue: notImplemented,
isArgumentsLocalBinding: notImplemented,
getExternalModuleFileFromDeclaration: notImplemented,
getTypeReferenceDirectivesForEntityName: notImplemented,
getTypeReferenceDirectivesForSymbol: notImplemented,
isLiteralConstDeclaration: notImplemented,
getJsxFactoryEntity: notImplemented,
getJsxFragmentFactoryEntity: notImplemented,
getAllAccessorDeclarations: notImplemented,
getSymbolOfExternalModuleSpecifier: notImplemented,
isBindingCapturedByNode: notImplemented,
getDeclarationStatementsForSourceFile: notImplemented,
isImportRequiredByAugmentation: notImplemented
};
function createSourceFilesFromBundleBuildInfo(bundle, buildInfoDirectory, host) {
var _a;
const jsBundle = Debug.checkDefined(bundle.js);
const prologueMap = ((_a = jsBundle.sources) == null ? void 0 : _a.prologues) && arrayToMap(jsBundle.sources.prologues, (prologueInfo) => prologueInfo.file);
return bundle.sourceFiles.map((fileName, index) => {
const prologueInfo = prologueMap == null ? void 0 : prologueMap.get(index);
const statements = prologueInfo == null ? void 0 : prologueInfo.directives.map((directive) => {
const literal = setTextRange(factory.createStringLiteral(directive.expression.text), directive.expression);
const statement = setTextRange(factory.createExpressionStatement(literal), directive);
setParent(literal, statement);
return statement;
});
const eofToken = factory.createToken(1 /* EndOfFileToken */);
const sourceFile = factory.createSourceFile(statements ?? [], eofToken, 0 /* None */);
sourceFile.fileName = getRelativePathFromDirectory(
host.getCurrentDirectory(),
getNormalizedAbsolutePath(fileName, buildInfoDirectory),
!host.useCaseSensitiveFileNames()
);
sourceFile.text = (prologueInfo == null ? void 0 : prologueInfo.text) ?? "";
setTextRangePosWidth(sourceFile, 0, (prologueInfo == null ? void 0 : prologueInfo.text.length) ?? 0);
setEachParent(sourceFile.statements, sourceFile);
setTextRangePosWidth(eofToken, sourceFile.end, 0);
setParent(eofToken, sourceFile);
return sourceFile;
});
}
function emitUsingBuildInfo(config, host, getCommandLine, customTransformers) {
var _a, _b;
(_a = tracing) == null ? void 0 : _a.push(
tracing.Phase.Emit,
"emitUsingBuildInfo",
{},
/*separateBeginAndEnd*/
true
);
mark("beforeEmit");
const result = emitUsingBuildInfoWorker(config, host, getCommandLine, customTransformers);
mark("afterEmit");
measure("Emit", "beforeEmit", "afterEmit");
(_b = tracing) == null ? void 0 : _b.pop();
return result;
}
function emitUsingBuildInfoWorker(config, host, getCommandLine, customTransformers) {
const { buildInfoPath, jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath } = getOutputPathsForBundle(
config.options,
/*forceDtsPaths*/
false
);
const buildInfo = host.getBuildInfo(buildInfoPath, config.options.configFilePath);
if (!buildInfo)
return buildInfoPath;
if (!buildInfo.bundle || !buildInfo.bundle.js || declarationFilePath && !buildInfo.bundle.dts)
return buildInfoPath;
const jsFileText = host.readFile(Debug.checkDefined(jsFilePath));
if (!jsFileText)
return jsFilePath;
if (computeSignature(jsFileText, host) !== buildInfo.bundle.js.hash)
return jsFilePath;
const sourceMapText = sourceMapFilePath && host.readFile(sourceMapFilePath);
if (sourceMapFilePath && !sourceMapText || config.options.inlineSourceMap)
return sourceMapFilePath || "inline sourcemap decoding";
if (sourceMapFilePath && computeSignature(sourceMapText, host) !== buildInfo.bundle.js.mapHash)
return sourceMapFilePath;
const declarationText = declarationFilePath && host.readFile(declarationFilePath);
if (declarationFilePath && !declarationText)
return declarationFilePath;
if (declarationFilePath && computeSignature(declarationText, host) !== buildInfo.bundle.dts.hash)
return declarationFilePath;
const declarationMapText = declarationMapPath && host.readFile(declarationMapPath);
if (declarationMapPath && !declarationMapText || config.options.inlineSourceMap)
return declarationMapPath || "inline sourcemap decoding";
if (declarationMapPath && computeSignature(declarationMapText, host) !== buildInfo.bundle.dts.mapHash)
return declarationMapPath;
const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory()));
const ownPrependInput = createInputFilesWithFileTexts(
jsFilePath,
jsFileText,
sourceMapFilePath,
sourceMapText,
declarationFilePath,
declarationText,
declarationMapPath,
declarationMapText,
buildInfoPath,
buildInfo,
/*oldFileOfCurrentEmit*/
true
);
const outputFiles = [];
const prependNodes = createPrependNodes(config.projectReferences, getCommandLine, (f) => host.readFile(f), host);
const sourceFilesForJsEmit = createSourceFilesFromBundleBuildInfo(buildInfo.bundle, buildInfoDirectory, host);
let changedDtsText;
let changedDtsData;
const emitHost = {
getPrependNodes: memoize(() => [...prependNodes, ownPrependInput]),
getCanonicalFileName: host.getCanonicalFileName,
getCommonSourceDirectory: () => getNormalizedAbsolutePath(buildInfo.bundle.commonSourceDirectory, buildInfoDirectory),
getCompilerOptions: () => config.options,
getCurrentDirectory: () => host.getCurrentDirectory(),
getSourceFile: returnUndefined,
getSourceFileByPath: returnUndefined,
getSourceFiles: () => sourceFilesForJsEmit,
getLibFileFromReference: notImplemented,
isSourceFileFromExternalLibrary: returnFalse,
getResolvedProjectReferenceToRedirect: returnUndefined,
getProjectReferenceRedirect: returnUndefined,
isSourceOfProjectReferenceRedirect: returnFalse,
writeFile: (name, text, writeByteOrderMark, _onError, _sourceFiles, data) => {
switch (name) {
case jsFilePath:
if (jsFileText === text)
return;
break;
case sourceMapFilePath:
if (sourceMapText === text)
return;
break;
case buildInfoPath:
break;
case declarationFilePath:
if (declarationText === text)
return;
changedDtsText = text;
changedDtsData = data;
break;
case declarationMapPath:
if (declarationMapText === text)
return;
break;
default:
Debug.fail(`Unexpected path: ${name}`);
}
outputFiles.push({ name, text, writeByteOrderMark, data });
},
isEmitBlocked: returnFalse,
readFile: (f) => host.readFile(f),
fileExists: (f) => host.fileExists(f),
useCaseSensitiveFileNames: () => host.useCaseSensitiveFileNames(),
getBuildInfo: (bundle) => {
const program = buildInfo.program;
if (program && changedDtsText !== void 0 && config.options.composite) {
program.outSignature = computeSignature(changedDtsText, host, changedDtsData);
}
const { js, dts, sourceFiles } = buildInfo.bundle;
bundle.js.sources = js.sources;
if (dts) {
bundle.dts.sources = dts.sources;
}
bundle.sourceFiles = sourceFiles;
return createBuildInfo(program, bundle);
},
getSourceFileFromReference: returnUndefined,
redirectTargetsMap: createMultiMap(),
getFileIncludeReasons: notImplemented,
createHash: maybeBind(host, host.createHash)
};
emitFiles(
notImplementedResolver,
emitHost,
/*targetSourceFile*/
void 0,
getTransformers(config.options, customTransformers)
);
return outputFiles;
}
var createPrinterWithDefaults = /* @__PURE__ */ memoize(() => createPrinter({}));
var createPrinterWithRemoveComments = /* @__PURE__ */ memoize(() => createPrinter({ removeComments: true }));
var createPrinterWithRemoveCommentsNeverAsciiEscape = /* @__PURE__ */ memoize(() => createPrinter({ removeComments: true, neverAsciiEscape: true }));
var createPrinterWithRemoveCommentsOmitTrailingSemicolon = /* @__PURE__ */ memoize(() => createPrinter({ removeComments: true, omitTrailingSemicolon: true }));
function createPrinter(printerOptions = {}, handlers = {}) {
var {
hasGlobalName,
onEmitNode = noEmitNotification,
isEmitNotificationEnabled,
substituteNode = noEmitSubstitution,
onBeforeEmitNode,
onAfterEmitNode,
onBeforeEmitNodeArray,
onAfterEmitNodeArray,
onBeforeEmitToken,
onAfterEmitToken
} = handlers;
var extendedDiagnostics = !!printerOptions.extendedDiagnostics;
var newLine = getNewLineCharacter(printerOptions);
var moduleKind = getEmitModuleKind(printerOptions);
var bundledHelpers = /* @__PURE__ */ new Map();
var currentSourceFile;
var nodeIdToGeneratedName;
var nodeIdToGeneratedPrivateName;
var autoGeneratedIdToGeneratedName;
var generatedNames;
var formattedNameTempFlagsStack;
var formattedNameTempFlags;
var privateNameTempFlagsStack;
var privateNameTempFlags;
var tempFlagsStack;
var tempFlags;
var reservedNamesStack;
var reservedNames;
var reservedPrivateNamesStack;
var reservedPrivateNames;
var preserveSourceNewlines = printerOptions.preserveSourceNewlines;
var nextListElementPos;
var writer;
var ownWriter;
var write = writeBase;
var isOwnFileEmit;
var bundleFileInfo = printerOptions.writeBundleFileInfo ? { sections: [] } : void 0;
var relativeToBuildInfo = bundleFileInfo ? Debug.checkDefined(printerOptions.relativeToBuildInfo) : void 0;
var recordInternalSection = printerOptions.recordInternalSection;
var sourceFileTextPos = 0;
var sourceFileTextKind = "text" /* Text */;
var sourceMapsDisabled = true;
var sourceMapGenerator;
var sourceMapSource;
var sourceMapSourceIndex = -1;
var mostRecentlyAddedSourceMapSource;
var mostRecentlyAddedSourceMapSourceIndex = -1;
var containerPos = -1;
var containerEnd = -1;
var declarationListContainerEnd = -1;
var currentLineMap;
var detachedCommentsInfo;
var hasWrittenComment = false;
var commentsDisabled = !!printerOptions.removeComments;
var lastSubstitution;
var currentParenthesizerRule;
var { enter: enterComment, exit: exitComment } = createTimerIf(extendedDiagnostics, "commentTime", "beforeComment", "afterComment");
var parenthesizer = factory.parenthesizer;
var typeArgumentParenthesizerRuleSelector = {
select: (index) => index === 0 ? parenthesizer.parenthesizeLeadingTypeArgument : void 0
};
var emitBinaryExpression = createEmitBinaryExpression();
reset();
return {
// public API
printNode,
printList,
printFile,
printBundle,
// internal API
writeNode,
writeList,
writeFile: writeFile2,
writeBundle,
bundleFileInfo
};
function printNode(hint, node, sourceFile) {
switch (hint) {
case 0 /* SourceFile */:
Debug.assert(isSourceFile(node), "Expected a SourceFile node.");
break;
case 2 /* IdentifierName */:
Debug.assert(isIdentifier(node), "Expected an Identifier node.");
break;
case 1 /* Expression */:
Debug.assert(isExpression(node), "Expected an Expression node.");
break;
}
switch (node.kind) {
case 311 /* SourceFile */:
return printFile(node);
case 312 /* Bundle */:
return printBundle(node);
case 313 /* UnparsedSource */:
return printUnparsedSource(node);
}
writeNode(hint, node, sourceFile, beginPrint());
return endPrint();
}
function printList(format, nodes, sourceFile) {
writeList(format, nodes, sourceFile, beginPrint());
return endPrint();
}
function printBundle(bundle) {
writeBundle(
bundle,
beginPrint(),
/*sourceMapGenerator*/
void 0
);
return endPrint();
}
function printFile(sourceFile) {
writeFile2(
sourceFile,
beginPrint(),
/*sourceMapGenerator*/
void 0
);
return endPrint();
}
function printUnparsedSource(unparsed) {
writeUnparsedSource(unparsed, beginPrint());
return endPrint();
}
function writeNode(hint, node, sourceFile, output) {
const previousWriter = writer;
setWriter(
output,
/*_sourceMapGenerator*/
void 0
);
print(hint, node, sourceFile);
reset();
writer = previousWriter;
}
function writeList(format, nodes, sourceFile, output) {
const previousWriter = writer;
setWriter(
output,
/*_sourceMapGenerator*/
void 0
);
if (sourceFile) {
setSourceFile(sourceFile);
}
emitList(
/*parentNode*/
void 0,
nodes,
format
);
reset();
writer = previousWriter;
}
function getTextPosWithWriteLine() {
return writer.getTextPosWithWriteLine ? writer.getTextPosWithWriteLine() : writer.getTextPos();
}
function updateOrPushBundleFileTextLike(pos, end, kind) {
const last2 = lastOrUndefined(bundleFileInfo.sections);
if (last2 && last2.kind === kind) {
last2.end = end;
} else {
bundleFileInfo.sections.push({ pos, end, kind });
}
}
function recordBundleFileInternalSectionStart(node) {
if (recordInternalSection && bundleFileInfo && currentSourceFile && (isDeclaration(node) || isVariableStatement(node)) && isInternalDeclaration(node, currentSourceFile) && sourceFileTextKind !== "internal" /* Internal */) {
const prevSourceFileTextKind = sourceFileTextKind;
recordBundleFileTextLikeSection(writer.getTextPos());
sourceFileTextPos = getTextPosWithWriteLine();
sourceFileTextKind = "internal" /* Internal */;
return prevSourceFileTextKind;
}
return void 0;
}
function recordBundleFileInternalSectionEnd(prevSourceFileTextKind) {
if (prevSourceFileTextKind) {
recordBundleFileTextLikeSection(writer.getTextPos());
sourceFileTextPos = getTextPosWithWriteLine();
sourceFileTextKind = prevSourceFileTextKind;
}
}
function recordBundleFileTextLikeSection(end) {
if (sourceFileTextPos < end) {
updateOrPushBundleFileTextLike(sourceFileTextPos, end, sourceFileTextKind);
return true;
}
return false;
}
function writeBundle(bundle, output, sourceMapGenerator2) {
isOwnFileEmit = false;
const previousWriter = writer;
setWriter(output, sourceMapGenerator2);
emitShebangIfNeeded(bundle);
emitPrologueDirectivesIfNeeded(bundle);
emitHelpers(bundle);
emitSyntheticTripleSlashReferencesIfNeeded(bundle);
for (const prepend of bundle.prepends) {
writeLine();
const pos = writer.getTextPos();
const savedSections = bundleFileInfo && bundleFileInfo.sections;
if (savedSections)
bundleFileInfo.sections = [];
print(
4 /* Unspecified */,
prepend,
/*sourceFile*/
void 0
);
if (bundleFileInfo) {
const newSections = bundleFileInfo.sections;
bundleFileInfo.sections = savedSections;
if (prepend.oldFileOfCurrentEmit)
bundleFileInfo.sections.push(...newSections);
else {
newSections.forEach((section) => Debug.assert(isBundleFileTextLike(section)));
bundleFileInfo.sections.push({
pos,
end: writer.getTextPos(),
kind: "prepend" /* Prepend */,
data: relativeToBuildInfo(prepend.fileName),
texts: newSections
});
}
}
}
sourceFileTextPos = getTextPosWithWriteLine();
for (const sourceFile of bundle.sourceFiles) {
print(0 /* SourceFile */, sourceFile, sourceFile);
}
if (bundleFileInfo && bundle.sourceFiles.length) {
const end = writer.getTextPos();
if (recordBundleFileTextLikeSection(end)) {
const prologues = getPrologueDirectivesFromBundledSourceFiles(bundle);
if (prologues) {
if (!bundleFileInfo.sources)
bundleFileInfo.sources = {};
bundleFileInfo.sources.prologues = prologues;
}
const helpers = getHelpersFromBundledSourceFiles(bundle);
if (helpers) {
if (!bundleFileInfo.sources)
bundleFileInfo.sources = {};
bundleFileInfo.sources.helpers = helpers;
}
}
}
reset();
writer = previousWriter;
}
function writeUnparsedSource(unparsed, output) {
const previousWriter = writer;
setWriter(
output,
/*_sourceMapGenerator*/
void 0
);
print(
4 /* Unspecified */,
unparsed,
/*sourceFile*/
void 0
);
reset();
writer = previousWriter;
}
function writeFile2(sourceFile, output, sourceMapGenerator2) {
isOwnFileEmit = true;
const previousWriter = writer;
setWriter(output, sourceMapGenerator2);
emitShebangIfNeeded(sourceFile);
emitPrologueDirectivesIfNeeded(sourceFile);
print(0 /* SourceFile */, sourceFile, sourceFile);
reset();
writer = previousWriter;
}
function beginPrint() {
return ownWriter || (ownWriter = createTextWriter(newLine));
}
function endPrint() {
const text = ownWriter.getText();
ownWriter.clear();
return text;
}
function print(hint, node, sourceFile) {
if (sourceFile) {
setSourceFile(sourceFile);
}
pipelineEmit(
hint,
node,
/*parenthesizerRule*/
void 0
);
}
function setSourceFile(sourceFile) {
currentSourceFile = sourceFile;
currentLineMap = void 0;
detachedCommentsInfo = void 0;
if (sourceFile) {
setSourceMapSource(sourceFile);
}
}
function setWriter(_writer, _sourceMapGenerator) {
if (_writer && printerOptions.omitTrailingSemicolon) {
_writer = getTrailingSemicolonDeferringWriter(_writer);
}
writer = _writer;
sourceMapGenerator = _sourceMapGenerator;
sourceMapsDisabled = !writer || !sourceMapGenerator;
}
function reset() {
nodeIdToGeneratedName = [];
nodeIdToGeneratedPrivateName = [];
autoGeneratedIdToGeneratedName = [];
generatedNames = /* @__PURE__ */ new Set();
formattedNameTempFlagsStack = [];
formattedNameTempFlags = /* @__PURE__ */ new Map();
privateNameTempFlagsStack = [];
privateNameTempFlags = 0 /* Auto */;
tempFlagsStack = [];
tempFlags = 0 /* Auto */;
reservedNamesStack = [];
reservedNames = void 0;
reservedPrivateNamesStack = [];
reservedPrivateNames = void 0;
currentSourceFile = void 0;
currentLineMap = void 0;
detachedCommentsInfo = void 0;
setWriter(
/*output*/
void 0,
/*_sourceMapGenerator*/
void 0
);
}
function getCurrentLineMap() {
return currentLineMap || (currentLineMap = getLineStarts(Debug.checkDefined(currentSourceFile)));
}
function emit(node, parenthesizerRule) {
if (node === void 0)
return;
const prevSourceFileTextKind = recordBundleFileInternalSectionStart(node);
pipelineEmit(4 /* Unspecified */, node, parenthesizerRule);
recordBundleFileInternalSectionEnd(prevSourceFileTextKind);
}
function emitIdentifierName(node) {
if (node === void 0)
return;
pipelineEmit(
2 /* IdentifierName */,
node,
/*parenthesizerRule*/
void 0
);
}
function emitExpression(node, parenthesizerRule) {
if (node === void 0)
return;
pipelineEmit(1 /* Expression */, node, parenthesizerRule);
}
function emitJsxAttributeValue(node) {
pipelineEmit(isStringLiteral(node) ? 6 /* JsxAttributeValue */ : 4 /* Unspecified */, node);
}
function beforeEmitNode(node) {
if (preserveSourceNewlines && getInternalEmitFlags(node) & 4 /* IgnoreSourceNewlines */) {
preserveSourceNewlines = false;
}
}
function afterEmitNode(savedPreserveSourceNewlines) {
preserveSourceNewlines = savedPreserveSourceNewlines;
}
function pipelineEmit(emitHint, node, parenthesizerRule) {
currentParenthesizerRule = parenthesizerRule;
const pipelinePhase = getPipelinePhase(0 /* Notification */, emitHint, node);
pipelinePhase(emitHint, node);
currentParenthesizerRule = void 0;
}
function shouldEmitComments(node) {
return !commentsDisabled && !isSourceFile(node);
}
function shouldEmitSourceMaps(node) {
return !sourceMapsDisabled && !isSourceFile(node) && !isInJsonFile(node) && !isUnparsedSource(node) && !isUnparsedPrepend(node);
}
function getPipelinePhase(phase, emitHint, node) {
switch (phase) {
case 0 /* Notification */:
if (onEmitNode !== noEmitNotification && (!isEmitNotificationEnabled || isEmitNotificationEnabled(node))) {
return pipelineEmitWithNotification;
}
case 1 /* Substitution */:
if (substituteNode !== noEmitSubstitution && (lastSubstitution = substituteNode(emitHint, node) || node) !== node) {
if (currentParenthesizerRule) {
lastSubstitution = currentParenthesizerRule(lastSubstitution);
}
return pipelineEmitWithSubstitution;
}
case 2 /* Comments */:
if (shouldEmitComments(node)) {
return pipelineEmitWithComments;
}
case 3 /* SourceMaps */:
if (shouldEmitSourceMaps(node)) {
return pipelineEmitWithSourceMaps;
}
case 4 /* Emit */:
return pipelineEmitWithHint;
default:
return Debug.assertNever(phase);
}
}
function getNextPipelinePhase(currentPhase, emitHint, node) {
return getPipelinePhase(currentPhase + 1, emitHint, node);
}
function pipelineEmitWithNotification(hint, node) {
const pipelinePhase = getNextPipelinePhase(0 /* Notification */, hint, node);
onEmitNode(hint, node, pipelinePhase);
}
function pipelineEmitWithHint(hint, node) {
onBeforeEmitNode == null ? void 0 : onBeforeEmitNode(node);
if (preserveSourceNewlines) {
const savedPreserveSourceNewlines = preserveSourceNewlines;
beforeEmitNode(node);
pipelineEmitWithHintWorker(hint, node);
afterEmitNode(savedPreserveSourceNewlines);
} else {
pipelineEmitWithHintWorker(hint, node);
}
onAfterEmitNode == null ? void 0 : onAfterEmitNode(node);
currentParenthesizerRule = void 0;
}
function pipelineEmitWithHintWorker(hint, node, allowSnippets = true) {
if (allowSnippets) {
const snippet = getSnippetElement(node);
if (snippet) {
return emitSnippetNode(hint, node, snippet);
}
}
if (hint === 0 /* SourceFile */)
return emitSourceFile(cast(node, isSourceFile));
if (hint === 2 /* IdentifierName */)
return emitIdentifier(cast(node, isIdentifier));
if (hint === 6 /* JsxAttributeValue */)
return emitLiteral(
cast(node, isStringLiteral),
/*jsxAttributeEscape*/
true
);
if (hint === 3 /* MappedTypeParameter */)
return emitMappedTypeParameter(cast(node, isTypeParameterDeclaration));
if (hint === 5 /* EmbeddedStatement */) {
Debug.assertNode(node, isEmptyStatement);
return emitEmptyStatement(
/*isEmbeddedStatement*/
true
);
}
if (hint === 4 /* Unspecified */) {
switch (node.kind) {
case 16 /* TemplateHead */:
case 17 /* TemplateMiddle */:
case 18 /* TemplateTail */:
return emitLiteral(
node,
/*jsxAttributeEscape*/
false
);
case 80 /* Identifier */:
return emitIdentifier(node);
case 81 /* PrivateIdentifier */:
return emitPrivateIdentifier(node);
case 165 /* QualifiedName */:
return emitQualifiedName(node);
case 166 /* ComputedPropertyName */:
return emitComputedPropertyName(node);
case 167 /* TypeParameter */:
return emitTypeParameter(node);
case 168 /* Parameter */:
return emitParameter(node);
case 169 /* Decorator */:
return emitDecorator(node);
case 170 /* PropertySignature */:
return emitPropertySignature(node);
case 171 /* PropertyDeclaration */:
return emitPropertyDeclaration(node);
case 172 /* MethodSignature */:
return emitMethodSignature(node);
case 173 /* MethodDeclaration */:
return emitMethodDeclaration(node);
case 174 /* ClassStaticBlockDeclaration */:
return emitClassStaticBlockDeclaration(node);
case 175 /* Constructor */:
return emitConstructor(node);
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return emitAccessorDeclaration(node);
case 178 /* CallSignature */:
return emitCallSignature(node);
case 179 /* ConstructSignature */:
return emitConstructSignature(node);
case 180 /* IndexSignature */:
return emitIndexSignature(node);
case 181 /* TypePredicate */:
return emitTypePredicate(node);
case 182 /* TypeReference */:
return emitTypeReference(node);
case 183 /* FunctionType */:
return emitFunctionType(node);
case 184 /* ConstructorType */:
return emitConstructorType(node);
case 185 /* TypeQuery */:
return emitTypeQuery(node);
case 186 /* TypeLiteral */:
return emitTypeLiteral(node);
case 187 /* ArrayType */:
return emitArrayType(node);
case 188 /* TupleType */:
return emitTupleType(node);
case 189 /* OptionalType */:
return emitOptionalType(node);
case 191 /* UnionType */:
return emitUnionType(node);
case 192 /* IntersectionType */:
return emitIntersectionType(node);
case 193 /* ConditionalType */:
return emitConditionalType(node);
case 194 /* InferType */:
return emitInferType(node);
case 195 /* ParenthesizedType */:
return emitParenthesizedType(node);
case 232 /* ExpressionWithTypeArguments */:
return emitExpressionWithTypeArguments(node);
case 196 /* ThisType */:
return emitThisType();
case 197 /* TypeOperator */:
return emitTypeOperator(node);
case 198 /* IndexedAccessType */:
return emitIndexedAccessType(node);
case 199 /* MappedType */:
return emitMappedType(node);
case 200 /* LiteralType */:
return emitLiteralType(node);
case 201 /* NamedTupleMember */:
return emitNamedTupleMember(node);
case 202 /* TemplateLiteralType */:
return emitTemplateType(node);
case 203 /* TemplateLiteralTypeSpan */:
return emitTemplateTypeSpan(node);
case 204 /* ImportType */:
return emitImportTypeNode(node);
case 205 /* ObjectBindingPattern */:
return emitObjectBindingPattern(node);
case 206 /* ArrayBindingPattern */:
return emitArrayBindingPattern(node);
case 207 /* BindingElement */:
return emitBindingElement(node);
case 238 /* TemplateSpan */:
return emitTemplateSpan(node);
case 239 /* SemicolonClassElement */:
return emitSemicolonClassElement();
case 240 /* Block */:
return emitBlock(node);
case 242 /* VariableStatement */:
return emitVariableStatement(node);
case 241 /* EmptyStatement */:
return emitEmptyStatement(
/*isEmbeddedStatement*/
false
);
case 243 /* ExpressionStatement */:
return emitExpressionStatement(node);
case 244 /* IfStatement */:
return emitIfStatement(node);
case 245 /* DoStatement */:
return emitDoStatement(node);
case 246 /* WhileStatement */:
return emitWhileStatement(node);
case 247 /* ForStatement */:
return emitForStatement(node);
case 248 /* ForInStatement */:
return emitForInStatement(node);
case 249 /* ForOfStatement */:
return emitForOfStatement(node);
case 250 /* ContinueStatement */:
return emitContinueStatement(node);
case 251 /* BreakStatement */:
return emitBreakStatement(node);
case 252 /* ReturnStatement */:
return emitReturnStatement(node);
case 253 /* WithStatement */:
return emitWithStatement(node);
case 254 /* SwitchStatement */:
return emitSwitchStatement(node);
case 255 /* LabeledStatement */:
return emitLabeledStatement(node);
case 256 /* ThrowStatement */:
return emitThrowStatement(node);
case 257 /* TryStatement */:
return emitTryStatement(node);
case 258 /* DebuggerStatement */:
return emitDebuggerStatement(node);
case 259 /* VariableDeclaration */:
return emitVariableDeclaration(node);
case 260 /* VariableDeclarationList */:
return emitVariableDeclarationList(node);
case 261 /* FunctionDeclaration */:
return emitFunctionDeclaration(node);
case 262 /* ClassDeclaration */:
return emitClassDeclaration(node);
case 263 /* InterfaceDeclaration */:
return emitInterfaceDeclaration(node);
case 264 /* TypeAliasDeclaration */:
return emitTypeAliasDeclaration(node);
case 265 /* EnumDeclaration */:
return emitEnumDeclaration(node);
case 266 /* ModuleDeclaration */:
return emitModuleDeclaration(node);
case 267 /* ModuleBlock */:
return emitModuleBlock(node);
case 268 /* CaseBlock */:
return emitCaseBlock(node);
case 269 /* NamespaceExportDeclaration */:
return emitNamespaceExportDeclaration(node);
case 270 /* ImportEqualsDeclaration */:
return emitImportEqualsDeclaration(node);
case 271 /* ImportDeclaration */:
return emitImportDeclaration(node);
case 272 /* ImportClause */:
return emitImportClause(node);
case 273 /* NamespaceImport */:
return emitNamespaceImport(node);
case 279 /* NamespaceExport */:
return emitNamespaceExport(node);
case 274 /* NamedImports */:
return emitNamedImports(node);
case 275 /* ImportSpecifier */:
return emitImportSpecifier(node);
case 276 /* ExportAssignment */:
return emitExportAssignment(node);
case 277 /* ExportDeclaration */:
return emitExportDeclaration(node);
case 278 /* NamedExports */:
return emitNamedExports(node);
case 280 /* ExportSpecifier */:
return emitExportSpecifier(node);
case 299 /* AssertClause */:
return emitAssertClause(node);
case 300 /* AssertEntry */:
return emitAssertEntry(node);
case 281 /* MissingDeclaration */:
return;
case 282 /* ExternalModuleReference */:
return emitExternalModuleReference(node);
case 12 /* JsxText */:
return emitJsxText(node);
case 285 /* JsxOpeningElement */:
case 288 /* JsxOpeningFragment */:
return emitJsxOpeningElementOrFragment(node);
case 286 /* JsxClosingElement */:
case 289 /* JsxClosingFragment */:
return emitJsxClosingElementOrFragment(node);
case 290 /* JsxAttribute */:
return emitJsxAttribute(node);
case 291 /* JsxAttributes */:
return emitJsxAttributes(node);
case 292 /* JsxSpreadAttribute */:
return emitJsxSpreadAttribute(node);
case 293 /* JsxExpression */:
return emitJsxExpression(node);
case 294 /* JsxNamespacedName */:
return emitJsxNamespacedName(node);
case 295 /* CaseClause */:
return emitCaseClause(node);
case 296 /* DefaultClause */:
return emitDefaultClause(node);
case 297 /* HeritageClause */:
return emitHeritageClause(node);
case 298 /* CatchClause */:
return emitCatchClause(node);
case 302 /* PropertyAssignment */:
return emitPropertyAssignment(node);
case 303 /* ShorthandPropertyAssignment */:
return emitShorthandPropertyAssignment(node);
case 304 /* SpreadAssignment */:
return emitSpreadAssignment(node);
case 305 /* EnumMember */:
return emitEnumMember(node);
case 306 /* UnparsedPrologue */:
return writeUnparsedNode(node);
case 313 /* UnparsedSource */:
case 307 /* UnparsedPrepend */:
return emitUnparsedSourceOrPrepend(node);
case 308 /* UnparsedText */:
case 309 /* UnparsedInternalText */:
return emitUnparsedTextLike(node);
case 310 /* UnparsedSyntheticReference */:
return emitUnparsedSyntheticReference(node);
case 311 /* SourceFile */:
return emitSourceFile(node);
case 312 /* Bundle */:
return Debug.fail("Bundles should be printed using printBundle");
case 314 /* InputFiles */:
return Debug.fail("InputFiles should not be printed");
case 315 /* JSDocTypeExpression */:
return emitJSDocTypeExpression(node);
case 316 /* JSDocNameReference */:
return emitJSDocNameReference(node);
case 318 /* JSDocAllType */:
return writePunctuation("*");
case 319 /* JSDocUnknownType */:
return writePunctuation("?");
case 320 /* JSDocNullableType */:
return emitJSDocNullableType(node);
case 321 /* JSDocNonNullableType */:
return emitJSDocNonNullableType(node);
case 322 /* JSDocOptionalType */:
return emitJSDocOptionalType(node);
case 323 /* JSDocFunctionType */:
return emitJSDocFunctionType(node);
case 190 /* RestType */:
case 324 /* JSDocVariadicType */:
return emitRestOrJSDocVariadicType(node);
case 325 /* JSDocNamepathType */:
return;
case 326 /* JSDoc */:
return emitJSDoc(node);
case 328 /* JSDocTypeLiteral */:
return emitJSDocTypeLiteral(node);
case 329 /* JSDocSignature */:
return emitJSDocSignature(node);
case 333 /* JSDocTag */:
case 338 /* JSDocClassTag */:
case 343 /* JSDocOverrideTag */:
return emitJSDocSimpleTag(node);
case 334 /* JSDocAugmentsTag */:
case 335 /* JSDocImplementsTag */:
return emitJSDocHeritageTag(node);
case 336 /* JSDocAuthorTag */:
case 337 /* JSDocDeprecatedTag */:
return;
case 339 /* JSDocPublicTag */:
case 340 /* JSDocPrivateTag */:
case 341 /* JSDocProtectedTag */:
case 342 /* JSDocReadonlyTag */:
return;
case 344 /* JSDocCallbackTag */:
return emitJSDocCallbackTag(node);
case 345 /* JSDocOverloadTag */:
return emitJSDocOverloadTag(node);
case 347 /* JSDocParameterTag */:
case 354 /* JSDocPropertyTag */:
return emitJSDocPropertyLikeTag(node);
case 346 /* JSDocEnumTag */:
case 348 /* JSDocReturnTag */:
case 349 /* JSDocThisTag */:
case 350 /* JSDocTypeTag */:
case 355 /* JSDocThrowsTag */:
case 356 /* JSDocSatisfiesTag */:
return emitJSDocSimpleTypedTag(node);
case 351 /* JSDocTemplateTag */:
return emitJSDocTemplateTag(node);
case 352 /* JSDocTypedefTag */:
return emitJSDocTypedefTag(node);
case 353 /* JSDocSeeTag */:
return emitJSDocSeeTag(node);
case 358 /* NotEmittedStatement */:
return;
}
if (isExpression(node)) {
hint = 1 /* Expression */;
if (substituteNode !== noEmitSubstitution) {
const substitute = substituteNode(hint, node) || node;
if (substitute !== node) {
node = substitute;
if (currentParenthesizerRule) {
node = currentParenthesizerRule(node);
}
}
}
}
}
if (hint === 1 /* Expression */) {
switch (node.kind) {
case 9 /* NumericLiteral */:
case 10 /* BigIntLiteral */:
return emitNumericOrBigIntLiteral(node);
case 11 /* StringLiteral */:
case 14 /* RegularExpressionLiteral */:
case 15 /* NoSubstitutionTemplateLiteral */:
return emitLiteral(
node,
/*jsxAttributeEscape*/
false
);
case 80 /* Identifier */:
return emitIdentifier(node);
case 81 /* PrivateIdentifier */:
return emitPrivateIdentifier(node);
case 208 /* ArrayLiteralExpression */:
return emitArrayLiteralExpression(node);
case 209 /* ObjectLiteralExpression */:
return emitObjectLiteralExpression(node);
case 210 /* PropertyAccessExpression */:
return emitPropertyAccessExpression(node);
case 211 /* ElementAccessExpression */:
return emitElementAccessExpression(node);
case 212 /* CallExpression */:
return emitCallExpression(node);
case 213 /* NewExpression */:
return emitNewExpression(node);
case 214 /* TaggedTemplateExpression */:
return emitTaggedTemplateExpression(node);
case 215 /* TypeAssertionExpression */:
return emitTypeAssertionExpression(node);
case 216 /* ParenthesizedExpression */:
return emitParenthesizedExpression(node);
case 217 /* FunctionExpression */:
return emitFunctionExpression(node);
case 218 /* ArrowFunction */:
return emitArrowFunction(node);
case 219 /* DeleteExpression */:
return emitDeleteExpression(node);
case 220 /* TypeOfExpression */:
return emitTypeOfExpression(node);
case 221 /* VoidExpression */:
return emitVoidExpression(node);
case 222 /* AwaitExpression */:
return emitAwaitExpression(node);
case 223 /* PrefixUnaryExpression */:
return emitPrefixUnaryExpression(node);
case 224 /* PostfixUnaryExpression */:
return emitPostfixUnaryExpression(node);
case 225 /* BinaryExpression */:
return emitBinaryExpression(node);
case 226 /* ConditionalExpression */:
return emitConditionalExpression(node);
case 227 /* TemplateExpression */:
return emitTemplateExpression(node);
case 228 /* YieldExpression */:
return emitYieldExpression(node);
case 229 /* SpreadElement */:
return emitSpreadElement(node);
case 230 /* ClassExpression */:
return emitClassExpression(node);
case 231 /* OmittedExpression */:
return;
case 233 /* AsExpression */:
return emitAsExpression(node);
case 234 /* NonNullExpression */:
return emitNonNullExpression(node);
case 232 /* ExpressionWithTypeArguments */:
return emitExpressionWithTypeArguments(node);
case 237 /* SatisfiesExpression */:
return emitSatisfiesExpression(node);
case 235 /* MetaProperty */:
return emitMetaProperty(node);
case 236 /* SyntheticExpression */:
return Debug.fail("SyntheticExpression should never be printed.");
case 281 /* MissingDeclaration */:
return;
case 283 /* JsxElement */:
return emitJsxElement(node);
case 284 /* JsxSelfClosingElement */:
return emitJsxSelfClosingElement(node);
case 287 /* JsxFragment */:
return emitJsxFragment(node);
case 357 /* SyntaxList */:
return Debug.fail("SyntaxList should not be printed");
case 358 /* NotEmittedStatement */:
return;
case 359 /* PartiallyEmittedExpression */:
return emitPartiallyEmittedExpression(node);
case 360 /* CommaListExpression */:
return emitCommaList(node);
case 361 /* SyntheticReferenceExpression */:
return Debug.fail("SyntheticReferenceExpression should not be printed");
}
}
if (isKeyword(node.kind))
return writeTokenNode(node, writeKeyword);
if (isTokenKind(node.kind))
return writeTokenNode(node, writePunctuation);
Debug.fail(`Unhandled SyntaxKind: ${Debug.formatSyntaxKind(node.kind)}.`);
}
function emitMappedTypeParameter(node) {
emit(node.name);
writeSpace();
writeKeyword("in");
writeSpace();
emit(node.constraint);
}
function pipelineEmitWithSubstitution(hint, node) {
const pipelinePhase = getNextPipelinePhase(1 /* Substitution */, hint, node);
Debug.assertIsDefined(lastSubstitution);
node = lastSubstitution;
lastSubstitution = void 0;
pipelinePhase(hint, node);
}
function getHelpersFromBundledSourceFiles(bundle) {
let result;
if (moduleKind === 0 /* None */ || printerOptions.noEmitHelpers) {
return void 0;
}
const bundledHelpers2 = /* @__PURE__ */ new Map();
for (const sourceFile of bundle.sourceFiles) {
const shouldSkip = getExternalHelpersModuleName(sourceFile) !== void 0;
const helpers = getSortedEmitHelpers(sourceFile);
if (!helpers)
continue;
for (const helper of helpers) {
if (!helper.scoped && !shouldSkip && !bundledHelpers2.get(helper.name)) {
bundledHelpers2.set(helper.name, true);
(result || (result = [])).push(helper.name);
}
}
}
return result;
}
function emitHelpers(node) {
let helpersEmitted = false;
const bundle = node.kind === 312 /* Bundle */ ? node : void 0;
if (bundle && moduleKind === 0 /* None */) {
return;
}
const numPrepends = bundle ? bundle.prepends.length : 0;
const numNodes = bundle ? bundle.sourceFiles.length + numPrepends : 1;
for (let i = 0; i < numNodes; i++) {
const currentNode = bundle ? i < numPrepends ? bundle.prepends[i] : bundle.sourceFiles[i - numPrepends] : node;
const sourceFile = isSourceFile(currentNode) ? currentNode : isUnparsedSource(currentNode) ? void 0 : currentSourceFile;
const shouldSkip = printerOptions.noEmitHelpers || !!sourceFile && hasRecordedExternalHelpers(sourceFile);
const shouldBundle = (isSourceFile(currentNode) || isUnparsedSource(currentNode)) && !isOwnFileEmit;
const helpers = isUnparsedSource(currentNode) ? currentNode.helpers : getSortedEmitHelpers(currentNode);
if (helpers) {
for (const helper of helpers) {
if (!helper.scoped) {
if (shouldSkip)
continue;
if (shouldBundle) {
if (bundledHelpers.get(helper.name)) {
continue;
}
bundledHelpers.set(helper.name, true);
}
} else if (bundle) {
continue;
}
const pos = getTextPosWithWriteLine();
if (typeof helper.text === "string") {
writeLines(helper.text);
} else {
writeLines(helper.text(makeFileLevelOptimisticUniqueName));
}
if (bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "emitHelpers" /* EmitHelpers */, data: helper.name });
helpersEmitted = true;
}
}
}
return helpersEmitted;
}
function getSortedEmitHelpers(node) {
const helpers = getEmitHelpers(node);
return helpers && stableSort(helpers, compareEmitHelpers);
}
function emitNumericOrBigIntLiteral(node) {
emitLiteral(
node,
/*jsxAttributeEscape*/
false
);
}
function emitLiteral(node, jsxAttributeEscape) {
const text = getLiteralTextOfNode(node, printerOptions.neverAsciiEscape, jsxAttributeEscape);
if ((printerOptions.sourceMap || printerOptions.inlineSourceMap) && (node.kind === 11 /* StringLiteral */ || isTemplateLiteralKind(node.kind))) {
writeLiteral(text);
} else {
writeStringLiteral(text);
}
}
function emitUnparsedSourceOrPrepend(unparsed) {
for (const text of unparsed.texts) {
writeLine();
emit(text);
}
}
function writeUnparsedNode(unparsed) {
writer.rawWrite(unparsed.parent.text.substring(unparsed.pos, unparsed.end));
}
function emitUnparsedTextLike(unparsed) {
const pos = getTextPosWithWriteLine();
writeUnparsedNode(unparsed);
if (bundleFileInfo) {
updateOrPushBundleFileTextLike(
pos,
writer.getTextPos(),
unparsed.kind === 308 /* UnparsedText */ ? "text" /* Text */ : "internal" /* Internal */
);
}
}
function emitUnparsedSyntheticReference(unparsed) {
const pos = getTextPosWithWriteLine();
writeUnparsedNode(unparsed);
if (bundleFileInfo) {
const section = clone(unparsed.section);
section.pos = pos;
section.end = writer.getTextPos();
bundleFileInfo.sections.push(section);
}
}
function emitSnippetNode(hint, node, snippet) {
switch (snippet.kind) {
case 1 /* Placeholder */:
emitPlaceholder(hint, node, snippet);
break;
case 0 /* TabStop */:
emitTabStop(hint, node, snippet);
break;
}
}
function emitPlaceholder(hint, node, snippet) {
nonEscapingWrite(`\${${snippet.order}:`);
pipelineEmitWithHintWorker(
hint,
node,
/*allowSnippets*/
false
);
nonEscapingWrite(`}`);
}
function emitTabStop(hint, node, snippet) {
Debug.assert(
node.kind === 241 /* EmptyStatement */,
`A tab stop cannot be attached to a node of kind ${Debug.formatSyntaxKind(node.kind)}.`
);
Debug.assert(
hint !== 5 /* EmbeddedStatement */,
`A tab stop cannot be attached to an embedded statement.`
);
nonEscapingWrite(`$${snippet.order}`);
}
function emitIdentifier(node) {
const writeText = node.symbol ? writeSymbol : write;
writeText(getTextOfNode2(
node,
/*includeTrivia*/
false
), node.symbol);
emitList(node, getIdentifierTypeArguments(node), 53776 /* TypeParameters */);
}
function emitPrivateIdentifier(node) {
write(getTextOfNode2(
node,
/*includeTrivia*/
false
));
}
function emitQualifiedName(node) {
emitEntityName(node.left);
writePunctuation(".");
emit(node.right);
}
function emitEntityName(node) {
if (node.kind === 80 /* Identifier */) {
emitExpression(node);
} else {
emit(node);
}
}
function emitComputedPropertyName(node) {
const savedPrivateNameTempFlags = privateNameTempFlags;
const savedReservedMemberNames = reservedPrivateNames;
popPrivateNameGenerationScope();
writePunctuation("[");
emitExpression(node.expression, parenthesizer.parenthesizeExpressionOfComputedPropertyName);
writePunctuation("]");
pushPrivateNameGenerationScope(savedPrivateNameTempFlags, savedReservedMemberNames);
}
function emitTypeParameter(node) {
emitModifierList(node, node.modifiers);
emit(node.name);
if (node.constraint) {
writeSpace();
writeKeyword("extends");
writeSpace();
emit(node.constraint);
}
if (node.default) {
writeSpace();
writeOperator("=");
writeSpace();
emit(node.default);
}
}
function emitParameter(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
true
);
emit(node.dotDotDotToken);
emitNodeWithWriter(node.name, writeParameter);
emit(node.questionToken);
if (node.parent && node.parent.kind === 323 /* JSDocFunctionType */ && !node.name) {
emit(node.type);
} else {
emitTypeAnnotation(node.type);
}
emitInitializer(node.initializer, node.type ? node.type.end : node.questionToken ? node.questionToken.end : node.name ? node.name.end : node.modifiers ? node.modifiers.end : node.pos, node, parenthesizer.parenthesizeExpressionForDisallowedComma);
}
function emitDecorator(decorator) {
writePunctuation("@");
emitExpression(decorator.expression, parenthesizer.parenthesizeLeftSideOfAccess);
}
function emitPropertySignature(node) {
emitModifierList(node, node.modifiers);
emitNodeWithWriter(node.name, writeProperty);
emit(node.questionToken);
emitTypeAnnotation(node.type);
writeTrailingSemicolon();
}
function emitPropertyDeclaration(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
true
);
emit(node.name);
emit(node.questionToken);
emit(node.exclamationToken);
emitTypeAnnotation(node.type);
emitInitializer(node.initializer, node.type ? node.type.end : node.questionToken ? node.questionToken.end : node.name.end, node);
writeTrailingSemicolon();
}
function emitMethodSignature(node) {
pushNameGenerationScope(node);
emitModifierList(node, node.modifiers);
emit(node.name);
emit(node.questionToken);
emitTypeParameters(node, node.typeParameters);
emitParameters(node, node.parameters);
emitTypeAnnotation(node.type);
writeTrailingSemicolon();
popNameGenerationScope(node);
}
function emitMethodDeclaration(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
true
);
emit(node.asteriskToken);
emit(node.name);
emit(node.questionToken);
emitSignatureAndBody(node, emitSignatureHead);
}
function emitClassStaticBlockDeclaration(node) {
writeKeyword("static");
emitBlockFunctionBody(node.body);
}
function emitConstructor(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
false
);
writeKeyword("constructor");
emitSignatureAndBody(node, emitSignatureHead);
}
function emitAccessorDeclaration(node) {
const pos = emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
true
);
const token = node.kind === 176 /* GetAccessor */ ? 139 /* GetKeyword */ : 153 /* SetKeyword */;
emitTokenWithComment(token, pos, writeKeyword, node);
writeSpace();
emit(node.name);
emitSignatureAndBody(node, emitSignatureHead);
}
function emitCallSignature(node) {
pushNameGenerationScope(node);
emitTypeParameters(node, node.typeParameters);
emitParameters(node, node.parameters);
emitTypeAnnotation(node.type);
writeTrailingSemicolon();
popNameGenerationScope(node);
}
function emitConstructSignature(node) {
pushNameGenerationScope(node);
writeKeyword("new");
writeSpace();
emitTypeParameters(node, node.typeParameters);
emitParameters(node, node.parameters);
emitTypeAnnotation(node.type);
writeTrailingSemicolon();
popNameGenerationScope(node);
}
function emitIndexSignature(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
false
);
emitParametersForIndexSignature(node, node.parameters);
emitTypeAnnotation(node.type);
writeTrailingSemicolon();
}
function emitTemplateTypeSpan(node) {
emit(node.type);
emit(node.literal);
}
function emitSemicolonClassElement() {
writeTrailingSemicolon();
}
function emitTypePredicate(node) {
if (node.assertsModifier) {
emit(node.assertsModifier);
writeSpace();
}
emit(node.parameterName);
if (node.type) {
writeSpace();
writeKeyword("is");
writeSpace();
emit(node.type);
}
}
function emitTypeReference(node) {
emit(node.typeName);
emitTypeArguments(node, node.typeArguments);
}
function emitFunctionType(node) {
pushNameGenerationScope(node);
emitTypeParameters(node, node.typeParameters);
emitParametersForArrow(node, node.parameters);
writeSpace();
writePunctuation("=>");
writeSpace();
emit(node.type);
popNameGenerationScope(node);
}
function emitJSDocFunctionType(node) {
writeKeyword("function");
emitParameters(node, node.parameters);
writePunctuation(":");
emit(node.type);
}
function emitJSDocNullableType(node) {
writePunctuation("?");
emit(node.type);
}
function emitJSDocNonNullableType(node) {
writePunctuation("!");
emit(node.type);
}
function emitJSDocOptionalType(node) {
emit(node.type);
writePunctuation("=");
}
function emitConstructorType(node) {
pushNameGenerationScope(node);
emitModifierList(node, node.modifiers);
writeKeyword("new");
writeSpace();
emitTypeParameters(node, node.typeParameters);
emitParameters(node, node.parameters);
writeSpace();
writePunctuation("=>");
writeSpace();
emit(node.type);
popNameGenerationScope(node);
}
function emitTypeQuery(node) {
writeKeyword("typeof");
writeSpace();
emit(node.exprName);
emitTypeArguments(node, node.typeArguments);
}
function emitTypeLiteral(node) {
pushPrivateNameGenerationScope(
0 /* Auto */,
/*newReservedMemberNames*/
void 0
);
writePunctuation("{");
const flags = getEmitFlags(node) & 1 /* SingleLine */ ? 768 /* SingleLineTypeLiteralMembers */ : 32897 /* MultiLineTypeLiteralMembers */;
emitList(node, node.members, flags | 524288 /* NoSpaceIfEmpty */);
writePunctuation("}");
popPrivateNameGenerationScope();
}
function emitArrayType(node) {
emit(node.elementType, parenthesizer.parenthesizeNonArrayTypeOfPostfixType);
writePunctuation("[");
writePunctuation("]");
}
function emitRestOrJSDocVariadicType(node) {
writePunctuation("...");
emit(node.type);
}
function emitTupleType(node) {
emitTokenWithComment(23 /* OpenBracketToken */, node.pos, writePunctuation, node);
const flags = getEmitFlags(node) & 1 /* SingleLine */ ? 528 /* SingleLineTupleTypeElements */ : 657 /* MultiLineTupleTypeElements */;
emitList(node, node.elements, flags | 524288 /* NoSpaceIfEmpty */, parenthesizer.parenthesizeElementTypeOfTupleType);
emitTokenWithComment(24 /* CloseBracketToken */, node.elements.end, writePunctuation, node);
}
function emitNamedTupleMember(node) {
emit(node.dotDotDotToken);
emit(node.name);
emit(node.questionToken);
emitTokenWithComment(59 /* ColonToken */, node.name.end, writePunctuation, node);
writeSpace();
emit(node.type);
}
function emitOptionalType(node) {
emit(node.type, parenthesizer.parenthesizeTypeOfOptionalType);
writePunctuation("?");
}
function emitUnionType(node) {
emitList(node, node.types, 516 /* UnionTypeConstituents */, parenthesizer.parenthesizeConstituentTypeOfUnionType);
}
function emitIntersectionType(node) {
emitList(node, node.types, 520 /* IntersectionTypeConstituents */, parenthesizer.parenthesizeConstituentTypeOfIntersectionType);
}
function emitConditionalType(node) {
emit(node.checkType, parenthesizer.parenthesizeCheckTypeOfConditionalType);
writeSpace();
writeKeyword("extends");
writeSpace();
emit(node.extendsType, parenthesizer.parenthesizeExtendsTypeOfConditionalType);
writeSpace();
writePunctuation("?");
writeSpace();
emit(node.trueType);
writeSpace();
writePunctuation(":");
writeSpace();
emit(node.falseType);
}
function emitInferType(node) {
writeKeyword("infer");
writeSpace();
emit(node.typeParameter);
}
function emitParenthesizedType(node) {
writePunctuation("(");
emit(node.type);
writePunctuation(")");
}
function emitThisType() {
writeKeyword("this");
}
function emitTypeOperator(node) {
writeTokenText(node.operator, writeKeyword);
writeSpace();
const parenthesizerRule = node.operator === 148 /* ReadonlyKeyword */ ? parenthesizer.parenthesizeOperandOfReadonlyTypeOperator : parenthesizer.parenthesizeOperandOfTypeOperator;
emit(node.type, parenthesizerRule);
}
function emitIndexedAccessType(node) {
emit(node.objectType, parenthesizer.parenthesizeNonArrayTypeOfPostfixType);
writePunctuation("[");
emit(node.indexType);
writePunctuation("]");
}
function emitMappedType(node) {
const emitFlags = getEmitFlags(node);
writePunctuation("{");
if (emitFlags & 1 /* SingleLine */) {
writeSpace();
} else {
writeLine();
increaseIndent();
}
if (node.readonlyToken) {
emit(node.readonlyToken);
if (node.readonlyToken.kind !== 148 /* ReadonlyKeyword */) {
writeKeyword("readonly");
}
writeSpace();
}
writePunctuation("[");
pipelineEmit(3 /* MappedTypeParameter */, node.typeParameter);
if (node.nameType) {
writeSpace();
writeKeyword("as");
writeSpace();
emit(node.nameType);
}
writePunctuation("]");
if (node.questionToken) {
emit(node.questionToken);
if (node.questionToken.kind !== 58 /* QuestionToken */) {
writePunctuation("?");
}
}
writePunctuation(":");
writeSpace();
emit(node.type);
writeTrailingSemicolon();
if (emitFlags & 1 /* SingleLine */) {
writeSpace();
} else {
writeLine();
decreaseIndent();
}
emitList(node, node.members, 2 /* PreserveLines */);
writePunctuation("}");
}
function emitLiteralType(node) {
emitExpression(node.literal);
}
function emitTemplateType(node) {
emit(node.head);
emitList(node, node.templateSpans, 262144 /* TemplateExpressionSpans */);
}
function emitImportTypeNode(node) {
if (node.isTypeOf) {
writeKeyword("typeof");
writeSpace();
}
writeKeyword("import");
writePunctuation("(");
emit(node.argument);
if (node.assertions) {
writePunctuation(",");
writeSpace();
writePunctuation("{");
writeSpace();
writeKeyword("assert");
writePunctuation(":");
writeSpace();
const elements = node.assertions.assertClause.elements;
emitList(node.assertions.assertClause, elements, 526226 /* ImportClauseEntries */);
writeSpace();
writePunctuation("}");
}
writePunctuation(")");
if (node.qualifier) {
writePunctuation(".");
emit(node.qualifier);
}
emitTypeArguments(node, node.typeArguments);
}
function emitObjectBindingPattern(node) {
writePunctuation("{");
emitList(node, node.elements, 525136 /* ObjectBindingPatternElements */);
writePunctuation("}");
}
function emitArrayBindingPattern(node) {
writePunctuation("[");
emitList(node, node.elements, 524880 /* ArrayBindingPatternElements */);
writePunctuation("]");
}
function emitBindingElement(node) {
emit(node.dotDotDotToken);
if (node.propertyName) {
emit(node.propertyName);
writePunctuation(":");
writeSpace();
}
emit(node.name);
emitInitializer(node.initializer, node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma);
}
function emitArrayLiteralExpression(node) {
const elements = node.elements;
const preferNewLine = node.multiLine ? 65536 /* PreferNewLine */ : 0 /* None */;
emitExpressionList(node, elements, 8914 /* ArrayLiteralExpressionElements */ | preferNewLine, parenthesizer.parenthesizeExpressionForDisallowedComma);
}
function emitObjectLiteralExpression(node) {
pushPrivateNameGenerationScope(
0 /* Auto */,
/*newReservedMemberNames*/
void 0
);
forEach(node.properties, generateMemberNames);
const indentedFlag = getEmitFlags(node) & 131072 /* Indented */;
if (indentedFlag) {
increaseIndent();
}
const preferNewLine = node.multiLine ? 65536 /* PreferNewLine */ : 0 /* None */;
const allowTrailingComma = currentSourceFile && currentSourceFile.languageVersion >= 1 /* ES5 */ && !isJsonSourceFile(currentSourceFile) ? 64 /* AllowTrailingComma */ : 0 /* None */;
emitList(node, node.properties, 526226 /* ObjectLiteralExpressionProperties */ | allowTrailingComma | preferNewLine);
if (indentedFlag) {
decreaseIndent();
}
popPrivateNameGenerationScope();
}
function emitPropertyAccessExpression(node) {
emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
const token = node.questionDotToken || setTextRangePosEnd(factory.createToken(25 /* DotToken */), node.expression.end, node.name.pos);
const linesBeforeDot = getLinesBetweenNodes(node, node.expression, token);
const linesAfterDot = getLinesBetweenNodes(node, token, node.name);
writeLinesAndIndent(
linesBeforeDot,
/*writeSpaceIfNotIndenting*/
false
);
const shouldEmitDotDot = token.kind !== 29 /* QuestionDotToken */ && mayNeedDotDotForPropertyAccess(node.expression) && !writer.hasTrailingComment() && !writer.hasTrailingWhitespace();
if (shouldEmitDotDot) {
writePunctuation(".");
}
if (node.questionDotToken) {
emit(token);
} else {
emitTokenWithComment(token.kind, node.expression.end, writePunctuation, node);
}
writeLinesAndIndent(
linesAfterDot,
/*writeSpaceIfNotIndenting*/
false
);
emit(node.name);
decreaseIndentIf(linesBeforeDot, linesAfterDot);
}
function mayNeedDotDotForPropertyAccess(expression) {
expression = skipPartiallyEmittedExpressions(expression);
if (isNumericLiteral(expression)) {
const text = getLiteralTextOfNode(
expression,
/*neverAsciiEscape*/
true,
/*jsxAttributeEscape*/
false
);
return !(expression.numericLiteralFlags & 448 /* WithSpecifier */) && !stringContains(text, tokenToString(25 /* DotToken */)) && !stringContains(text, String.fromCharCode(69 /* E */)) && !stringContains(text, String.fromCharCode(101 /* e */));
} else if (isAccessExpression(expression)) {
const constantValue = getConstantValue(expression);
return typeof constantValue === "number" && isFinite(constantValue) && Math.floor(constantValue) === constantValue;
}
}
function emitElementAccessExpression(node) {
emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
emit(node.questionDotToken);
emitTokenWithComment(23 /* OpenBracketToken */, node.expression.end, writePunctuation, node);
emitExpression(node.argumentExpression);
emitTokenWithComment(24 /* CloseBracketToken */, node.argumentExpression.end, writePunctuation, node);
}
function emitCallExpression(node) {
const indirectCall = getInternalEmitFlags(node) & 16 /* IndirectCall */;
if (indirectCall) {
writePunctuation("(");
writeLiteral("0");
writePunctuation(",");
writeSpace();
}
emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
if (indirectCall) {
writePunctuation(")");
}
emit(node.questionDotToken);
emitTypeArguments(node, node.typeArguments);
emitExpressionList(node, node.arguments, 2576 /* CallExpressionArguments */, parenthesizer.parenthesizeExpressionForDisallowedComma);
}
function emitNewExpression(node) {
emitTokenWithComment(105 /* NewKeyword */, node.pos, writeKeyword, node);
writeSpace();
emitExpression(node.expression, parenthesizer.parenthesizeExpressionOfNew);
emitTypeArguments(node, node.typeArguments);
emitExpressionList(node, node.arguments, 18960 /* NewExpressionArguments */, parenthesizer.parenthesizeExpressionForDisallowedComma);
}
function emitTaggedTemplateExpression(node) {
const indirectCall = getInternalEmitFlags(node) & 16 /* IndirectCall */;
if (indirectCall) {
writePunctuation("(");
writeLiteral("0");
writePunctuation(",");
writeSpace();
}
emitExpression(node.tag, parenthesizer.parenthesizeLeftSideOfAccess);
if (indirectCall) {
writePunctuation(")");
}
emitTypeArguments(node, node.typeArguments);
writeSpace();
emitExpression(node.template);
}
function emitTypeAssertionExpression(node) {
writePunctuation("<");
emit(node.type);
writePunctuation(">");
emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
}
function emitParenthesizedExpression(node) {
const openParenPos = emitTokenWithComment(21 /* OpenParenToken */, node.pos, writePunctuation, node);
const indented = writeLineSeparatorsAndIndentBefore(node.expression, node);
emitExpression(
node.expression,
/*parenthesizerRule*/
void 0
);
writeLineSeparatorsAfter(node.expression, node);
decreaseIndentIf(indented);
emitTokenWithComment(22 /* CloseParenToken */, node.expression ? node.expression.end : openParenPos, writePunctuation, node);
}
function emitFunctionExpression(node) {
generateNameIfNeeded(node.name);
emitFunctionDeclarationOrExpression(node);
}
function emitArrowFunction(node) {
emitModifierList(node, node.modifiers);
emitSignatureAndBody(node, emitArrowFunctionHead);
}
function emitArrowFunctionHead(node) {
emitTypeParameters(node, node.typeParameters);
emitParametersForArrow(node, node.parameters);
emitTypeAnnotation(node.type);
writeSpace();
emit(node.equalsGreaterThanToken);
}
function emitDeleteExpression(node) {
emitTokenWithComment(91 /* DeleteKeyword */, node.pos, writeKeyword, node);
writeSpace();
emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
}
function emitTypeOfExpression(node) {
emitTokenWithComment(114 /* TypeOfKeyword */, node.pos, writeKeyword, node);
writeSpace();
emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
}
function emitVoidExpression(node) {
emitTokenWithComment(116 /* VoidKeyword */, node.pos, writeKeyword, node);
writeSpace();
emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
}
function emitAwaitExpression(node) {
emitTokenWithComment(135 /* AwaitKeyword */, node.pos, writeKeyword, node);
writeSpace();
emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
}
function emitPrefixUnaryExpression(node) {
writeTokenText(node.operator, writeOperator);
if (shouldEmitWhitespaceBeforeOperand(node)) {
writeSpace();
}
emitExpression(node.operand, parenthesizer.parenthesizeOperandOfPrefixUnary);
}
function shouldEmitWhitespaceBeforeOperand(node) {
const operand = node.operand;
return operand.kind === 223 /* PrefixUnaryExpression */ && (node.operator === 40 /* PlusToken */ && (operand.operator === 40 /* PlusToken */ || operand.operator === 46 /* PlusPlusToken */) || node.operator === 41 /* MinusToken */ && (operand.operator === 41 /* MinusToken */ || operand.operator === 47 /* MinusMinusToken */));
}
function emitPostfixUnaryExpression(node) {
emitExpression(node.operand, parenthesizer.parenthesizeOperandOfPostfixUnary);
writeTokenText(node.operator, writeOperator);
}
function createEmitBinaryExpression() {
return createBinaryExpressionTrampoline(
onEnter,
onLeft,
onOperator,
onRight,
onExit,
/*foldState*/
void 0
);
function onEnter(node, state) {
if (state) {
state.stackIndex++;
state.preserveSourceNewlinesStack[state.stackIndex] = preserveSourceNewlines;
state.containerPosStack[state.stackIndex] = containerPos;
state.containerEndStack[state.stackIndex] = containerEnd;
state.declarationListContainerEndStack[state.stackIndex] = declarationListContainerEnd;
const emitComments2 = state.shouldEmitCommentsStack[state.stackIndex] = shouldEmitComments(node);
const emitSourceMaps = state.shouldEmitSourceMapsStack[state.stackIndex] = shouldEmitSourceMaps(node);
onBeforeEmitNode == null ? void 0 : onBeforeEmitNode(node);
if (emitComments2)
emitCommentsBeforeNode(node);
if (emitSourceMaps)
emitSourceMapsBeforeNode(node);
beforeEmitNode(node);
} else {
state = {
stackIndex: 0,
preserveSourceNewlinesStack: [void 0],
containerPosStack: [-1],
containerEndStack: [-1],
declarationListContainerEndStack: [-1],
shouldEmitCommentsStack: [false],
shouldEmitSourceMapsStack: [false]
};
}
return state;
}
function onLeft(next, _workArea, parent) {
return maybeEmitExpression(next, parent, "left");
}
function onOperator(operatorToken, _state, node) {
const isCommaOperator = operatorToken.kind !== 28 /* CommaToken */;
const linesBeforeOperator = getLinesBetweenNodes(node, node.left, operatorToken);
const linesAfterOperator = getLinesBetweenNodes(node, operatorToken, node.right);
writeLinesAndIndent(linesBeforeOperator, isCommaOperator);
emitLeadingCommentsOfPosition(operatorToken.pos);
writeTokenNode(operatorToken, operatorToken.kind === 103 /* InKeyword */ ? writeKeyword : writeOperator);
emitTrailingCommentsOfPosition(
operatorToken.end,
/*prefixSpace*/
true
);
writeLinesAndIndent(
linesAfterOperator,
/*writeSpaceIfNotIndenting*/
true
);
}
function onRight(next, _workArea, parent) {
return maybeEmitExpression(next, parent, "right");
}
function onExit(node, state) {
const linesBeforeOperator = getLinesBetweenNodes(node, node.left, node.operatorToken);
const linesAfterOperator = getLinesBetweenNodes(node, node.operatorToken, node.right);
decreaseIndentIf(linesBeforeOperator, linesAfterOperator);
if (state.stackIndex > 0) {
const savedPreserveSourceNewlines = state.preserveSourceNewlinesStack[state.stackIndex];
const savedContainerPos = state.containerPosStack[state.stackIndex];
const savedContainerEnd = state.containerEndStack[state.stackIndex];
const savedDeclarationListContainerEnd = state.declarationListContainerEndStack[state.stackIndex];
const shouldEmitComments2 = state.shouldEmitCommentsStack[state.stackIndex];
const shouldEmitSourceMaps2 = state.shouldEmitSourceMapsStack[state.stackIndex];
afterEmitNode(savedPreserveSourceNewlines);
if (shouldEmitSourceMaps2)
emitSourceMapsAfterNode(node);
if (shouldEmitComments2)
emitCommentsAfterNode(node, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd);
onAfterEmitNode == null ? void 0 : onAfterEmitNode(node);
state.stackIndex--;
}
}
function maybeEmitExpression(next, parent, side) {
const parenthesizerRule = side === "left" ? parenthesizer.getParenthesizeLeftSideOfBinaryForOperator(parent.operatorToken.kind) : parenthesizer.getParenthesizeRightSideOfBinaryForOperator(parent.operatorToken.kind);
let pipelinePhase = getPipelinePhase(0 /* Notification */, 1 /* Expression */, next);
if (pipelinePhase === pipelineEmitWithSubstitution) {
Debug.assertIsDefined(lastSubstitution);
next = parenthesizerRule(cast(lastSubstitution, isExpression));
pipelinePhase = getNextPipelinePhase(1 /* Substitution */, 1 /* Expression */, next);
lastSubstitution = void 0;
}
if (pipelinePhase === pipelineEmitWithComments || pipelinePhase === pipelineEmitWithSourceMaps || pipelinePhase === pipelineEmitWithHint) {
if (isBinaryExpression(next)) {
return next;
}
}
currentParenthesizerRule = parenthesizerRule;
pipelinePhase(1 /* Expression */, next);
}
}
function emitConditionalExpression(node) {
const linesBeforeQuestion = getLinesBetweenNodes(node, node.condition, node.questionToken);
const linesAfterQuestion = getLinesBetweenNodes(node, node.questionToken, node.whenTrue);
const linesBeforeColon = getLinesBetweenNodes(node, node.whenTrue, node.colonToken);
const linesAfterColon = getLinesBetweenNodes(node, node.colonToken, node.whenFalse);
emitExpression(node.condition, parenthesizer.parenthesizeConditionOfConditionalExpression);
writeLinesAndIndent(
linesBeforeQuestion,
/*writeSpaceIfNotIndenting*/
true
);
emit(node.questionToken);
writeLinesAndIndent(
linesAfterQuestion,
/*writeSpaceIfNotIndenting*/
true
);
emitExpression(node.whenTrue, parenthesizer.parenthesizeBranchOfConditionalExpression);
decreaseIndentIf(linesBeforeQuestion, linesAfterQuestion);
writeLinesAndIndent(
linesBeforeColon,
/*writeSpaceIfNotIndenting*/
true
);
emit(node.colonToken);
writeLinesAndIndent(
linesAfterColon,
/*writeSpaceIfNotIndenting*/
true
);
emitExpression(node.whenFalse, parenthesizer.parenthesizeBranchOfConditionalExpression);
decreaseIndentIf(linesBeforeColon, linesAfterColon);
}
function emitTemplateExpression(node) {
emit(node.head);
emitList(node, node.templateSpans, 262144 /* TemplateExpressionSpans */);
}
function emitYieldExpression(node) {
emitTokenWithComment(127 /* YieldKeyword */, node.pos, writeKeyword, node);
emit(node.asteriskToken);
emitExpressionWithLeadingSpace(node.expression && parenthesizeExpressionForNoAsi(node.expression), parenthesizeExpressionForNoAsiAndDisallowedComma);
}
function emitSpreadElement(node) {
emitTokenWithComment(26 /* DotDotDotToken */, node.pos, writePunctuation, node);
emitExpression(node.expression, parenthesizer.parenthesizeExpressionForDisallowedComma);
}
function emitClassExpression(node) {
generateNameIfNeeded(node.name);
emitClassDeclarationOrExpression(node);
}
function emitExpressionWithTypeArguments(node) {
emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
emitTypeArguments(node, node.typeArguments);
}
function emitAsExpression(node) {
emitExpression(
node.expression,
/*parenthesizerRule*/
void 0
);
if (node.type) {
writeSpace();
writeKeyword("as");
writeSpace();
emit(node.type);
}
}
function emitNonNullExpression(node) {
emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
writeOperator("!");
}
function emitSatisfiesExpression(node) {
emitExpression(
node.expression,
/*parenthesizerRule*/
void 0
);
if (node.type) {
writeSpace();
writeKeyword("satisfies");
writeSpace();
emit(node.type);
}
}
function emitMetaProperty(node) {
writeToken(node.keywordToken, node.pos, writePunctuation);
writePunctuation(".");
emit(node.name);
}
function emitTemplateSpan(node) {
emitExpression(node.expression);
emit(node.literal);
}
function emitBlock(node) {
emitBlockStatements(
node,
/*forceSingleLine*/
!node.multiLine && isEmptyBlock(node)
);
}
function emitBlockStatements(node, forceSingleLine) {
emitTokenWithComment(
19 /* OpenBraceToken */,
node.pos,
writePunctuation,
/*contextNode*/
node
);
const format = forceSingleLine || getEmitFlags(node) & 1 /* SingleLine */ ? 768 /* SingleLineBlockStatements */ : 129 /* MultiLineBlockStatements */;
emitList(node, node.statements, format);
emitTokenWithComment(
20 /* CloseBraceToken */,
node.statements.end,
writePunctuation,
/*contextNode*/
node,
/*indentLeading*/
!!(format & 1 /* MultiLine */)
);
}
function emitVariableStatement(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
false
);
emit(node.declarationList);
writeTrailingSemicolon();
}
function emitEmptyStatement(isEmbeddedStatement) {
if (isEmbeddedStatement) {
writePunctuation(";");
} else {
writeTrailingSemicolon();
}
}
function emitExpressionStatement(node) {
emitExpression(node.expression, parenthesizer.parenthesizeExpressionOfExpressionStatement);
if (!currentSourceFile || !isJsonSourceFile(currentSourceFile) || nodeIsSynthesized(node.expression)) {
writeTrailingSemicolon();
}
}
function emitIfStatement(node) {
const openParenPos = emitTokenWithComment(101 /* IfKeyword */, node.pos, writeKeyword, node);
writeSpace();
emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
emitExpression(node.expression);
emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node);
emitEmbeddedStatement(node, node.thenStatement);
if (node.elseStatement) {
writeLineOrSpace(node, node.thenStatement, node.elseStatement);
emitTokenWithComment(93 /* ElseKeyword */, node.thenStatement.end, writeKeyword, node);
if (node.elseStatement.kind === 244 /* IfStatement */) {
writeSpace();
emit(node.elseStatement);
} else {
emitEmbeddedStatement(node, node.elseStatement);
}
}
}
function emitWhileClause(node, startPos) {
const openParenPos = emitTokenWithComment(117 /* WhileKeyword */, startPos, writeKeyword, node);
writeSpace();
emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
emitExpression(node.expression);
emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node);
}
function emitDoStatement(node) {
emitTokenWithComment(92 /* DoKeyword */, node.pos, writeKeyword, node);
emitEmbeddedStatement(node, node.statement);
if (isBlock(node.statement) && !preserveSourceNewlines) {
writeSpace();
} else {
writeLineOrSpace(node, node.statement, node.expression);
}
emitWhileClause(node, node.statement.end);
writeTrailingSemicolon();
}
function emitWhileStatement(node) {
emitWhileClause(node, node.pos);
emitEmbeddedStatement(node, node.statement);
}
function emitForStatement(node) {
const openParenPos = emitTokenWithComment(99 /* ForKeyword */, node.pos, writeKeyword, node);
writeSpace();
let pos = emitTokenWithComment(
21 /* OpenParenToken */,
openParenPos,
writePunctuation,
/*contextNode*/
node
);
emitForBinding(node.initializer);
pos = emitTokenWithComment(27 /* SemicolonToken */, node.initializer ? node.initializer.end : pos, writePunctuation, node);
emitExpressionWithLeadingSpace(node.condition);
pos = emitTokenWithComment(27 /* SemicolonToken */, node.condition ? node.condition.end : pos, writePunctuation, node);
emitExpressionWithLeadingSpace(node.incrementor);
emitTokenWithComment(22 /* CloseParenToken */, node.incrementor ? node.incrementor.end : pos, writePunctuation, node);
emitEmbeddedStatement(node, node.statement);
}
function emitForInStatement(node) {
const openParenPos = emitTokenWithComment(99 /* ForKeyword */, node.pos, writeKeyword, node);
writeSpace();
emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
emitForBinding(node.initializer);
writeSpace();
emitTokenWithComment(103 /* InKeyword */, node.initializer.end, writeKeyword, node);
writeSpace();
emitExpression(node.expression);
emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node);
emitEmbeddedStatement(node, node.statement);
}
function emitForOfStatement(node) {
const openParenPos = emitTokenWithComment(99 /* ForKeyword */, node.pos, writeKeyword, node);
writeSpace();
emitWithTrailingSpace(node.awaitModifier);
emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
emitForBinding(node.initializer);
writeSpace();
emitTokenWithComment(164 /* OfKeyword */, node.initializer.end, writeKeyword, node);
writeSpace();
emitExpression(node.expression);
emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node);
emitEmbeddedStatement(node, node.statement);
}
function emitForBinding(node) {
if (node !== void 0) {
if (node.kind === 260 /* VariableDeclarationList */) {
emit(node);
} else {
emitExpression(node);
}
}
}
function emitContinueStatement(node) {
emitTokenWithComment(88 /* ContinueKeyword */, node.pos, writeKeyword, node);
emitWithLeadingSpace(node.label);
writeTrailingSemicolon();
}
function emitBreakStatement(node) {
emitTokenWithComment(83 /* BreakKeyword */, node.pos, writeKeyword, node);
emitWithLeadingSpace(node.label);
writeTrailingSemicolon();
}
function emitTokenWithComment(token, pos, writer2, contextNode, indentLeading) {
const node = getParseTreeNode(contextNode);
const isSimilarNode = node && node.kind === contextNode.kind;
const startPos = pos;
if (isSimilarNode && currentSourceFile) {
pos = skipTrivia(currentSourceFile.text, pos);
}
if (isSimilarNode && contextNode.pos !== startPos) {
const needsIndent = indentLeading && currentSourceFile && !positionsAreOnSameLine(startPos, pos, currentSourceFile);
if (needsIndent) {
increaseIndent();
}
emitLeadingCommentsOfPosition(startPos);
if (needsIndent) {
decreaseIndent();
}
}
pos = writeTokenText(token, writer2, pos);
if (isSimilarNode && contextNode.end !== pos) {
const isJsxExprContext = contextNode.kind === 293 /* JsxExpression */;
emitTrailingCommentsOfPosition(
pos,
/*prefixSpace*/
!isJsxExprContext,
/*forceNoNewline*/
isJsxExprContext
);
}
return pos;
}
function commentWillEmitNewLine(node) {
return node.kind === 2 /* SingleLineCommentTrivia */ || !!node.hasTrailingNewLine;
}
function willEmitLeadingNewLine(node) {
if (!currentSourceFile)
return false;
if (some(getLeadingCommentRanges(currentSourceFile.text, node.pos), commentWillEmitNewLine))
return true;
if (some(getSyntheticLeadingComments(node), commentWillEmitNewLine))
return true;
if (isPartiallyEmittedExpression(node)) {
if (node.pos !== node.expression.pos) {
if (some(getTrailingCommentRanges(currentSourceFile.text, node.expression.pos), commentWillEmitNewLine))
return true;
}
return willEmitLeadingNewLine(node.expression);
}
return false;
}
function parenthesizeExpressionForNoAsi(node) {
if (!commentsDisabled && isPartiallyEmittedExpression(node) && willEmitLeadingNewLine(node)) {
const parseNode = getParseTreeNode(node);
if (parseNode && isParenthesizedExpression(parseNode)) {
const parens = factory.createParenthesizedExpression(node.expression);
setOriginalNode(parens, node);
setTextRange(parens, parseNode);
return parens;
}
return factory.createParenthesizedExpression(node);
}
return node;
}
function parenthesizeExpressionForNoAsiAndDisallowedComma(node) {
return parenthesizeExpressionForNoAsi(parenthesizer.parenthesizeExpressionForDisallowedComma(node));
}
function emitReturnStatement(node) {
emitTokenWithComment(
107 /* ReturnKeyword */,
node.pos,
writeKeyword,
/*contextNode*/
node
);
emitExpressionWithLeadingSpace(node.expression && parenthesizeExpressionForNoAsi(node.expression), parenthesizeExpressionForNoAsi);
writeTrailingSemicolon();
}
function emitWithStatement(node) {
const openParenPos = emitTokenWithComment(118 /* WithKeyword */, node.pos, writeKeyword, node);
writeSpace();
emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
emitExpression(node.expression);
emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node);
emitEmbeddedStatement(node, node.statement);
}
function emitSwitchStatement(node) {
const openParenPos = emitTokenWithComment(109 /* SwitchKeyword */, node.pos, writeKeyword, node);
writeSpace();
emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
emitExpression(node.expression);
emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node);
writeSpace();
emit(node.caseBlock);
}
function emitLabeledStatement(node) {
emit(node.label);
emitTokenWithComment(59 /* ColonToken */, node.label.end, writePunctuation, node);
writeSpace();
emit(node.statement);
}
function emitThrowStatement(node) {
emitTokenWithComment(111 /* ThrowKeyword */, node.pos, writeKeyword, node);
emitExpressionWithLeadingSpace(parenthesizeExpressionForNoAsi(node.expression), parenthesizeExpressionForNoAsi);
writeTrailingSemicolon();
}
function emitTryStatement(node) {
emitTokenWithComment(113 /* TryKeyword */, node.pos, writeKeyword, node);
writeSpace();
emit(node.tryBlock);
if (node.catchClause) {
writeLineOrSpace(node, node.tryBlock, node.catchClause);
emit(node.catchClause);
}
if (node.finallyBlock) {
writeLineOrSpace(node, node.catchClause || node.tryBlock, node.finallyBlock);
emitTokenWithComment(98 /* FinallyKeyword */, (node.catchClause || node.tryBlock).end, writeKeyword, node);
writeSpace();
emit(node.finallyBlock);
}
}
function emitDebuggerStatement(node) {
writeToken(89 /* DebuggerKeyword */, node.pos, writeKeyword);
writeTrailingSemicolon();
}
function emitVariableDeclaration(node) {
var _a, _b, _c;
emit(node.name);
emit(node.exclamationToken);
emitTypeAnnotation(node.type);
emitInitializer(node.initializer, ((_a = node.type) == null ? void 0 : _a.end) ?? ((_c = (_b = node.name.emitNode) == null ? void 0 : _b.typeNode) == null ? void 0 : _c.end) ?? node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma);
}
function emitVariableDeclarationList(node) {
writeKeyword(isLet(node) ? "let" : isVarConst(node) ? "const" : "var");
writeSpace();
emitList(node, node.declarations, 528 /* VariableDeclarationList */);
}
function emitFunctionDeclaration(node) {
emitFunctionDeclarationOrExpression(node);
}
function emitFunctionDeclarationOrExpression(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
false
);
writeKeyword("function");
emit(node.asteriskToken);
writeSpace();
emitIdentifierName(node.name);
emitSignatureAndBody(node, emitSignatureHead);
}
function emitSignatureAndBody(node, emitSignatureHead2) {
const body = node.body;
if (body) {
if (isBlock(body)) {
const indentedFlag = getEmitFlags(node) & 131072 /* Indented */;
if (indentedFlag) {
increaseIndent();
}
pushNameGenerationScope(node);
forEach(node.parameters, generateNames);
generateNames(node.body);
emitSignatureHead2(node);
emitBlockFunctionBody(body);
popNameGenerationScope(node);
if (indentedFlag) {
decreaseIndent();
}
} else {
emitSignatureHead2(node);
writeSpace();
emitExpression(body, parenthesizer.parenthesizeConciseBodyOfArrowFunction);
}
} else {
emitSignatureHead2(node);
writeTrailingSemicolon();
}
}
function emitSignatureHead(node) {
emitTypeParameters(node, node.typeParameters);
emitParameters(node, node.parameters);
emitTypeAnnotation(node.type);
}
function shouldEmitBlockFunctionBodyOnSingleLine(body) {
if (getEmitFlags(body) & 1 /* SingleLine */) {
return true;
}
if (body.multiLine) {
return false;
}
if (!nodeIsSynthesized(body) && currentSourceFile && !rangeIsOnSingleLine(body, currentSourceFile)) {
return false;
}
if (getLeadingLineTerminatorCount(body, firstOrUndefined(body.statements), 2 /* PreserveLines */) || getClosingLineTerminatorCount(body, lastOrUndefined(body.statements), 2 /* PreserveLines */, body.statements)) {
return false;
}
let previousStatement;
for (const statement of body.statements) {
if (getSeparatingLineTerminatorCount(previousStatement, statement, 2 /* PreserveLines */) > 0) {
return false;
}
previousStatement = statement;
}
return true;
}
function emitBlockFunctionBody(body) {
onBeforeEmitNode == null ? void 0 : onBeforeEmitNode(body);
writeSpace();
writePunctuation("{");
increaseIndent();
const emitBlockFunctionBody2 = shouldEmitBlockFunctionBodyOnSingleLine(body) ? emitBlockFunctionBodyOnSingleLine : emitBlockFunctionBodyWorker;
emitBodyWithDetachedComments(body, body.statements, emitBlockFunctionBody2);
decreaseIndent();
writeToken(20 /* CloseBraceToken */, body.statements.end, writePunctuation, body);
onAfterEmitNode == null ? void 0 : onAfterEmitNode(body);
}
function emitBlockFunctionBodyOnSingleLine(body) {
emitBlockFunctionBodyWorker(
body,
/*emitBlockFunctionBodyOnSingleLine*/
true
);
}
function emitBlockFunctionBodyWorker(body, emitBlockFunctionBodyOnSingleLine2) {
const statementOffset = emitPrologueDirectives(body.statements);
const pos = writer.getTextPos();
emitHelpers(body);
if (statementOffset === 0 && pos === writer.getTextPos() && emitBlockFunctionBodyOnSingleLine2) {
decreaseIndent();
emitList(body, body.statements, 768 /* SingleLineFunctionBodyStatements */);
increaseIndent();
} else {
emitList(
body,
body.statements,
1 /* MultiLineFunctionBodyStatements */,
/*parenthesizerRule*/
void 0,
statementOffset
);
}
}
function emitClassDeclaration(node) {
emitClassDeclarationOrExpression(node);
}
function emitClassDeclarationOrExpression(node) {
pushPrivateNameGenerationScope(
0 /* Auto */,
/*newReservedMemberNames*/
void 0
);
forEach(node.members, generateMemberNames);
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
true
);
emitTokenWithComment(86 /* ClassKeyword */, moveRangePastModifiers(node).pos, writeKeyword, node);
if (node.name) {
writeSpace();
emitIdentifierName(node.name);
}
const indentedFlag = getEmitFlags(node) & 131072 /* Indented */;
if (indentedFlag) {
increaseIndent();
}
emitTypeParameters(node, node.typeParameters);
emitList(node, node.heritageClauses, 0 /* ClassHeritageClauses */);
writeSpace();
writePunctuation("{");
emitList(node, node.members, 129 /* ClassMembers */);
writePunctuation("}");
if (indentedFlag) {
decreaseIndent();
}
popPrivateNameGenerationScope();
}
function emitInterfaceDeclaration(node) {
pushPrivateNameGenerationScope(
0 /* Auto */,
/*newReservedMemberNames*/
void 0
);
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
false
);
writeKeyword("interface");
writeSpace();
emit(node.name);
emitTypeParameters(node, node.typeParameters);
emitList(node, node.heritageClauses, 512 /* HeritageClauses */);
writeSpace();
writePunctuation("{");
emitList(node, node.members, 129 /* InterfaceMembers */);
writePunctuation("}");
popPrivateNameGenerationScope();
}
function emitTypeAliasDeclaration(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
false
);
writeKeyword("type");
writeSpace();
emit(node.name);
emitTypeParameters(node, node.typeParameters);
writeSpace();
writePunctuation("=");
writeSpace();
emit(node.type);
writeTrailingSemicolon();
}
function emitEnumDeclaration(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
false
);
writeKeyword("enum");
writeSpace();
emit(node.name);
writeSpace();
writePunctuation("{");
emitList(node, node.members, 145 /* EnumMembers */);
writePunctuation("}");
}
function emitModuleDeclaration(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
false
);
if (~node.flags & 1024 /* GlobalAugmentation */) {
writeKeyword(node.flags & 16 /* Namespace */ ? "namespace" : "module");
writeSpace();
}
emit(node.name);
let body = node.body;
if (!body)
return writeTrailingSemicolon();
while (body && isModuleDeclaration(body)) {
writePunctuation(".");
emit(body.name);
body = body.body;
}
writeSpace();
emit(body);
}
function emitModuleBlock(node) {
pushNameGenerationScope(node);
forEach(node.statements, generateNames);
emitBlockStatements(
node,
/*forceSingleLine*/
isEmptyBlock(node)
);
popNameGenerationScope(node);
}
function emitCaseBlock(node) {
emitTokenWithComment(19 /* OpenBraceToken */, node.pos, writePunctuation, node);
emitList(node, node.clauses, 129 /* CaseBlockClauses */);
emitTokenWithComment(
20 /* CloseBraceToken */,
node.clauses.end,
writePunctuation,
node,
/*indentLeading*/
true
);
}
function emitImportEqualsDeclaration(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
false
);
emitTokenWithComment(102 /* ImportKeyword */, node.modifiers ? node.modifiers.end : node.pos, writeKeyword, node);
writeSpace();
if (node.isTypeOnly) {
emitTokenWithComment(156 /* TypeKeyword */, node.pos, writeKeyword, node);
writeSpace();
}
emit(node.name);
writeSpace();
emitTokenWithComment(64 /* EqualsToken */, node.name.end, writePunctuation, node);
writeSpace();
emitModuleReference(node.moduleReference);
writeTrailingSemicolon();
}
function emitModuleReference(node) {
if (node.kind === 80 /* Identifier */) {
emitExpression(node);
} else {
emit(node);
}
}
function emitImportDeclaration(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
false
);
emitTokenWithComment(102 /* ImportKeyword */, node.modifiers ? node.modifiers.end : node.pos, writeKeyword, node);
writeSpace();
if (node.importClause) {
emit(node.importClause);
writeSpace();
emitTokenWithComment(160 /* FromKeyword */, node.importClause.end, writeKeyword, node);
writeSpace();
}
emitExpression(node.moduleSpecifier);
if (node.assertClause) {
emitWithLeadingSpace(node.assertClause);
}
writeTrailingSemicolon();
}
function emitImportClause(node) {
if (node.isTypeOnly) {
emitTokenWithComment(156 /* TypeKeyword */, node.pos, writeKeyword, node);
writeSpace();
}
emit(node.name);
if (node.name && node.namedBindings) {
emitTokenWithComment(28 /* CommaToken */, node.name.end, writePunctuation, node);
writeSpace();
}
emit(node.namedBindings);
}
function emitNamespaceImport(node) {
const asPos = emitTokenWithComment(42 /* AsteriskToken */, node.pos, writePunctuation, node);
writeSpace();
emitTokenWithComment(130 /* AsKeyword */, asPos, writeKeyword, node);
writeSpace();
emit(node.name);
}
function emitNamedImports(node) {
emitNamedImportsOrExports(node);
}
function emitImportSpecifier(node) {
emitImportOrExportSpecifier(node);
}
function emitExportAssignment(node) {
const nextPos = emitTokenWithComment(95 /* ExportKeyword */, node.pos, writeKeyword, node);
writeSpace();
if (node.isExportEquals) {
emitTokenWithComment(64 /* EqualsToken */, nextPos, writeOperator, node);
} else {
emitTokenWithComment(90 /* DefaultKeyword */, nextPos, writeKeyword, node);
}
writeSpace();
emitExpression(node.expression, node.isExportEquals ? parenthesizer.getParenthesizeRightSideOfBinaryForOperator(64 /* EqualsToken */) : parenthesizer.parenthesizeExpressionOfExportDefault);
writeTrailingSemicolon();
}
function emitExportDeclaration(node) {
emitDecoratorsAndModifiers(
node,
node.modifiers,
/*allowDecorators*/
false
);
let nextPos = emitTokenWithComment(95 /* ExportKeyword */, node.pos, writeKeyword, node);
writeSpace();
if (node.isTypeOnly) {
nextPos = emitTokenWithComment(156 /* TypeKeyword */, nextPos, writeKeyword, node);
writeSpace();
}
if (node.exportClause) {
emit(node.exportClause);
} else {
nextPos = emitTokenWithComment(42 /* AsteriskToken */, nextPos, writePunctuation, node);
}
if (node.moduleSpecifier) {
writeSpace();
const fromPos = node.exportClause ? node.exportClause.end : nextPos;
emitTokenWithComment(160 /* FromKeyword */, fromPos, writeKeyword, node);
writeSpace();
emitExpression(node.moduleSpecifier);
}
if (node.assertClause) {
emitWithLeadingSpace(node.assertClause);
}
writeTrailingSemicolon();
}
function emitAssertClause(node) {
emitTokenWithComment(132 /* AssertKeyword */, node.pos, writeKeyword, node);
writeSpace();
const elements = node.elements;
emitList(node, elements, 526226 /* ImportClauseEntries */);
}
function emitAssertEntry(node) {
emit(node.name);
writePunctuation(":");
writeSpace();
const value = node.value;
if ((getEmitFlags(value) & 1024 /* NoLeadingComments */) === 0) {
const commentRange = getCommentRange(value);
emitTrailingCommentsOfPosition(commentRange.pos);
}
emit(value);
}
function emitNamespaceExportDeclaration(node) {
let nextPos = emitTokenWithComment(95 /* ExportKeyword */, node.pos, writeKeyword, node);
writeSpace();
nextPos = emitTokenWithComment(130 /* AsKeyword */, nextPos, writeKeyword, node);
writeSpace();
nextPos = emitTokenWithComment(145 /* NamespaceKeyword */, nextPos, writeKeyword, node);
writeSpace();
emit(node.name);
writeTrailingSemicolon();
}
function emitNamespaceExport(node) {
const asPos = emitTokenWithComment(42 /* AsteriskToken */, node.pos, writePunctuation, node);
writeSpace();
emitTokenWithComment(130 /* AsKeyword */, asPos, writeKeyword, node);
writeSpace();
emit(node.name);
}
function emitNamedExports(node) {
emitNamedImportsOrExports(node);
}
function emitExportSpecifier(node) {
emitImportOrExportSpecifier(node);
}
function emitNamedImportsOrExports(node) {
writePunctuation("{");
emitList(node, node.elements, 525136 /* NamedImportsOrExportsElements */);
writePunctuation("}");
}
function emitImportOrExportSpecifier(node) {
if (node.isTypeOnly) {
writeKeyword("type");
writeSpace();
}
if (node.propertyName) {
emit(node.propertyName);
writeSpace();
emitTokenWithComment(130 /* AsKeyword */, node.propertyName.end, writeKeyword, node);
writeSpace();
}
emit(node.name);
}
function emitExternalModuleReference(node) {
writeKeyword("require");
writePunctuation("(");
emitExpression(node.expression);
writePunctuation(")");
}
function emitJsxElement(node) {
emit(node.openingElement);
emitList(node, node.children, 262144 /* JsxElementOrFragmentChildren */);
emit(node.closingElement);
}
function emitJsxSelfClosingElement(node) {
writePunctuation("<");
emitJsxTagName(node.tagName);
emitTypeArguments(node, node.typeArguments);
writeSpace();
emit(node.attributes);
writePunctuation("/>");
}
function emitJsxFragment(node) {
emit(node.openingFragment);
emitList(node, node.children, 262144 /* JsxElementOrFragmentChildren */);
emit(node.closingFragment);
}
function emitJsxOpeningElementOrFragment(node) {
writePunctuation("<");
if (isJsxOpeningElement(node)) {
const indented = writeLineSeparatorsAndIndentBefore(node.tagName, node);
emitJsxTagName(node.tagName);
emitTypeArguments(node, node.typeArguments);
if (node.attributes.properties && node.attributes.properties.length > 0) {
writeSpace();
}
emit(node.attributes);
writeLineSeparatorsAfter(node.attributes, node);
decreaseIndentIf(indented);
}
writePunctuation(">");
}
function emitJsxText(node) {
writer.writeLiteral(node.text);
}
function emitJsxClosingElementOrFragment(node) {
writePunctuation("");
if (isJsxClosingElement(node)) {
emitJsxTagName(node.tagName);
}
writePunctuation(">");
}
function emitJsxAttributes(node) {
emitList(node, node.properties, 262656 /* JsxElementAttributes */);
}
function emitJsxAttribute(node) {
emit(node.name);
emitNodeWithPrefix("=", writePunctuation, node.initializer, emitJsxAttributeValue);
}
function emitJsxSpreadAttribute(node) {
writePunctuation("{...");
emitExpression(node.expression);
writePunctuation("}");
}
function hasTrailingCommentsAtPosition(pos) {
let result = false;
forEachTrailingCommentRange((currentSourceFile == null ? void 0 : currentSourceFile.text) || "", pos + 1, () => result = true);
return result;
}
function hasLeadingCommentsAtPosition(pos) {
let result = false;
forEachLeadingCommentRange((currentSourceFile == null ? void 0 : currentSourceFile.text) || "", pos + 1, () => result = true);
return result;
}
function hasCommentsAtPosition(pos) {
return hasTrailingCommentsAtPosition(pos) || hasLeadingCommentsAtPosition(pos);
}
function emitJsxExpression(node) {
var _a;
if (node.expression || !commentsDisabled && !nodeIsSynthesized(node) && hasCommentsAtPosition(node.pos)) {
const isMultiline = currentSourceFile && !nodeIsSynthesized(node) && getLineAndCharacterOfPosition(currentSourceFile, node.pos).line !== getLineAndCharacterOfPosition(currentSourceFile, node.end).line;
if (isMultiline) {
writer.increaseIndent();
}
const end = emitTokenWithComment(19 /* OpenBraceToken */, node.pos, writePunctuation, node);
emit(node.dotDotDotToken);
emitExpression(node.expression);
emitTokenWithComment(20 /* CloseBraceToken */, ((_a = node.expression) == null ? void 0 : _a.end) || end, writePunctuation, node);
if (isMultiline) {
writer.decreaseIndent();
}
}
}
function emitJsxNamespacedName(node) {
emitIdentifierName(node.namespace);
writePunctuation(":");
emitIdentifierName(node.name);
}
function emitJsxTagName(node) {
if (node.kind === 80 /* Identifier */) {
emitExpression(node);
} else {
emit(node);
}
}
function emitCaseClause(node) {
emitTokenWithComment(84 /* CaseKeyword */, node.pos, writeKeyword, node);
writeSpace();
emitExpression(node.expression, parenthesizer.parenthesizeExpressionForDisallowedComma);
emitCaseOrDefaultClauseRest(node, node.statements, node.expression.end);
}
function emitDefaultClause(node) {
const pos = emitTokenWithComment(90 /* DefaultKeyword */, node.pos, writeKeyword, node);
emitCaseOrDefaultClauseRest(node, node.statements, pos);
}
function emitCaseOrDefaultClauseRest(parentNode, statements, colonPos) {
const emitAsSingleStatement = statements.length === 1 && // treat synthesized nodes as located on the same line for emit purposes
(!currentSourceFile || nodeIsSynthesized(parentNode) || nodeIsSynthesized(statements[0]) || rangeStartPositionsAreOnSameLine(parentNode, statements[0], currentSourceFile));
let format = 163969 /* CaseOrDefaultClauseStatements */;
if (emitAsSingleStatement) {
writeToken(59 /* ColonToken */, colonPos, writePunctuation, parentNode);
writeSpace();
format &= ~(1 /* MultiLine */ | 128 /* Indented */);
} else {
emitTokenWithComment(59 /* ColonToken */, colonPos, writePunctuation, parentNode);
}
emitList(parentNode, statements, format);
}
function emitHeritageClause(node) {
writeSpace();
writeTokenText(node.token, writeKeyword);
writeSpace();
emitList(node, node.types, 528 /* HeritageClauseTypes */);
}
function emitCatchClause(node) {
const openParenPos = emitTokenWithComment(85 /* CatchKeyword */, node.pos, writeKeyword, node);
writeSpace();
if (node.variableDeclaration) {
emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
emit(node.variableDeclaration);
emitTokenWithComment(22 /* CloseParenToken */, node.variableDeclaration.end, writePunctuation, node);
writeSpace();
}
emit(node.block);
}
function emitPropertyAssignment(node) {
emit(node.name);
writePunctuation(":");
writeSpace();
const initializer = node.initializer;
if ((getEmitFlags(initializer) & 1024 /* NoLeadingComments */) === 0) {
const commentRange = getCommentRange(initializer);
emitTrailingCommentsOfPosition(commentRange.pos);
}
emitExpression(initializer, parenthesizer.parenthesizeExpressionForDisallowedComma);
}
function emitShorthandPropertyAssignment(node) {
emit(node.name);
if (node.objectAssignmentInitializer) {
writeSpace();
writePunctuation("=");
writeSpace();
emitExpression(node.objectAssignmentInitializer, parenthesizer.parenthesizeExpressionForDisallowedComma);
}
}
function emitSpreadAssignment(node) {
if (node.expression) {
emitTokenWithComment(26 /* DotDotDotToken */, node.pos, writePunctuation, node);
emitExpression(node.expression, parenthesizer.parenthesizeExpressionForDisallowedComma);
}
}
function emitEnumMember(node) {
emit(node.name);
emitInitializer(node.initializer, node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma);
}
function emitJSDoc(node) {
write("/**");
if (node.comment) {
const text = getTextOfJSDocComment(node.comment);
if (text) {
const lines = text.split(/\r\n?|\n/g);
for (const line of lines) {
writeLine();
writeSpace();
writePunctuation("*");
writeSpace();
write(line);
}
}
}
if (node.tags) {
if (node.tags.length === 1 && node.tags[0].kind === 350 /* JSDocTypeTag */ && !node.comment) {
writeSpace();
emit(node.tags[0]);
} else {
emitList(node, node.tags, 33 /* JSDocComment */);
}
}
writeSpace();
write("*/");
}
function emitJSDocSimpleTypedTag(tag) {
emitJSDocTagName(tag.tagName);
emitJSDocTypeExpression(tag.typeExpression);
emitJSDocComment(tag.comment);
}
function emitJSDocSeeTag(tag) {
emitJSDocTagName(tag.tagName);
emit(tag.name);
emitJSDocComment(tag.comment);
}
function emitJSDocNameReference(node) {
writeSpace();
writePunctuation("{");
emit(node.name);
writePunctuation("}");
}
function emitJSDocHeritageTag(tag) {
emitJSDocTagName(tag.tagName);
writeSpace();
writePunctuation("{");
emit(tag.class);
writePunctuation("}");
emitJSDocComment(tag.comment);
}
function emitJSDocTemplateTag(tag) {
emitJSDocTagName(tag.tagName);
emitJSDocTypeExpression(tag.constraint);
writeSpace();
emitList(tag, tag.typeParameters, 528 /* CommaListElements */);
emitJSDocComment(tag.comment);
}
function emitJSDocTypedefTag(tag) {
emitJSDocTagName(tag.tagName);
if (tag.typeExpression) {
if (tag.typeExpression.kind === 315 /* JSDocTypeExpression */) {
emitJSDocTypeExpression(tag.typeExpression);
} else {
writeSpace();
writePunctuation("{");
write("Object");
if (tag.typeExpression.isArrayType) {
writePunctuation("[");
writePunctuation("]");
}
writePunctuation("}");
}
}
if (tag.fullName) {
writeSpace();
emit(tag.fullName);
}
emitJSDocComment(tag.comment);
if (tag.typeExpression && tag.typeExpression.kind === 328 /* JSDocTypeLiteral */) {
emitJSDocTypeLiteral(tag.typeExpression);
}
}
function emitJSDocCallbackTag(tag) {
emitJSDocTagName(tag.tagName);
if (tag.name) {
writeSpace();
emit(tag.name);
}
emitJSDocComment(tag.comment);
emitJSDocSignature(tag.typeExpression);
}
function emitJSDocOverloadTag(tag) {
emitJSDocComment(tag.comment);
emitJSDocSignature(tag.typeExpression);
}
function emitJSDocSimpleTag(tag) {
emitJSDocTagName(tag.tagName);
emitJSDocComment(tag.comment);
}
function emitJSDocTypeLiteral(lit) {
emitList(lit, factory.createNodeArray(lit.jsDocPropertyTags), 33 /* JSDocComment */);
}
function emitJSDocSignature(sig) {
if (sig.typeParameters) {
emitList(sig, factory.createNodeArray(sig.typeParameters), 33 /* JSDocComment */);
}
if (sig.parameters) {
emitList(sig, factory.createNodeArray(sig.parameters), 33 /* JSDocComment */);
}
if (sig.type) {
writeLine();
writeSpace();
writePunctuation("*");
writeSpace();
emit(sig.type);
}
}
function emitJSDocPropertyLikeTag(param) {
emitJSDocTagName(param.tagName);
emitJSDocTypeExpression(param.typeExpression);
writeSpace();
if (param.isBracketed) {
writePunctuation("[");
}
emit(param.name);
if (param.isBracketed) {
writePunctuation("]");
}
emitJSDocComment(param.comment);
}
function emitJSDocTagName(tagName) {
writePunctuation("@");
emit(tagName);
}
function emitJSDocComment(comment) {
const text = getTextOfJSDocComment(comment);
if (text) {
writeSpace();
write(text);
}
}
function emitJSDocTypeExpression(typeExpression) {
if (typeExpression) {
writeSpace();
writePunctuation("{");
emit(typeExpression.type);
writePunctuation("}");
}
}
function emitSourceFile(node) {
writeLine();
const statements = node.statements;
const shouldEmitDetachedComment = statements.length === 0 || !isPrologueDirective(statements[0]) || nodeIsSynthesized(statements[0]);
if (shouldEmitDetachedComment) {
emitBodyWithDetachedComments(node, statements, emitSourceFileWorker);
return;
}
emitSourceFileWorker(node);
}
function emitSyntheticTripleSlashReferencesIfNeeded(node) {
emitTripleSlashDirectives(!!node.hasNoDefaultLib, node.syntheticFileReferences || [], node.syntheticTypeReferences || [], node.syntheticLibReferences || []);
for (const prepend of node.prepends) {
if (isUnparsedSource(prepend) && prepend.syntheticReferences) {
for (const ref of prepend.syntheticReferences) {
emit(ref);
writeLine();
}
}
}
}
function emitTripleSlashDirectivesIfNeeded(node) {
if (node.isDeclarationFile)
emitTripleSlashDirectives(node.hasNoDefaultLib, node.referencedFiles, node.typeReferenceDirectives, node.libReferenceDirectives);
}
function emitTripleSlashDirectives(hasNoDefaultLib, files, types, libs2) {
if (hasNoDefaultLib) {
const pos = writer.getTextPos();
writeComment(`/// `);
if (bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "no-default-lib" /* NoDefaultLib */ });
writeLine();
}
if (currentSourceFile && currentSourceFile.moduleName) {
writeComment(`/// `);
writeLine();
}
if (currentSourceFile && currentSourceFile.amdDependencies) {
for (const dep of currentSourceFile.amdDependencies) {
if (dep.name) {
writeComment(`/// `);
} else {
writeComment(`/// `);
}
writeLine();
}
}
for (const directive of files) {
const pos = writer.getTextPos();
writeComment(`/// `);
if (bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "reference" /* Reference */, data: directive.fileName });
writeLine();
}
for (const directive of types) {
const pos = writer.getTextPos();
const resolutionMode = directive.resolutionMode && directive.resolutionMode !== (currentSourceFile == null ? void 0 : currentSourceFile.impliedNodeFormat) ? `resolution-mode="${directive.resolutionMode === 99 /* ESNext */ ? "import" : "require"}"` : "";
writeComment(`/// `);
if (bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: !directive.resolutionMode ? "type" /* Type */ : directive.resolutionMode === 99 /* ESNext */ ? "type-import" /* TypeResolutionModeImport */ : "type-require" /* TypeResolutionModeRequire */, data: directive.fileName });
writeLine();
}
for (const directive of libs2) {
const pos = writer.getTextPos();
writeComment(`/// `);
if (bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "lib" /* Lib */, data: directive.fileName });
writeLine();
}
}
function emitSourceFileWorker(node) {
const statements = node.statements;
pushNameGenerationScope(node);
forEach(node.statements, generateNames);
emitHelpers(node);
const index = findIndex(statements, (statement) => !isPrologueDirective(statement));
emitTripleSlashDirectivesIfNeeded(node);
emitList(
node,
statements,
1 /* MultiLine */,
/*parenthesizerRule*/
void 0,
index === -1 ? statements.length : index
);
popNameGenerationScope(node);
}
function emitPartiallyEmittedExpression(node) {
const emitFlags = getEmitFlags(node);
if (!(emitFlags & 1024 /* NoLeadingComments */) && node.pos !== node.expression.pos) {
emitTrailingCommentsOfPosition(node.expression.pos);
}
emitExpression(node.expression);
if (!(emitFlags & 2048 /* NoTrailingComments */) && node.end !== node.expression.end) {
emitLeadingCommentsOfPosition(node.expression.end);
}
}
function emitCommaList(node) {
emitExpressionList(
node,
node.elements,
528 /* CommaListElements */,
/*parenthesizerRule*/
void 0
);
}
function emitPrologueDirectives(statements, sourceFile, seenPrologueDirectives, recordBundleFileSection) {
let needsToSetSourceFile = !!sourceFile;
for (let i = 0; i < statements.length; i++) {
const statement = statements[i];
if (isPrologueDirective(statement)) {
const shouldEmitPrologueDirective = seenPrologueDirectives ? !seenPrologueDirectives.has(statement.expression.text) : true;
if (shouldEmitPrologueDirective) {
if (needsToSetSourceFile) {
needsToSetSourceFile = false;
setSourceFile(sourceFile);
}
writeLine();
const pos = writer.getTextPos();
emit(statement);
if (recordBundleFileSection && bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "prologue" /* Prologue */, data: statement.expression.text });
if (seenPrologueDirectives) {
seenPrologueDirectives.add(statement.expression.text);
}
}
} else {
return i;
}
}
return statements.length;
}
function emitUnparsedPrologues(prologues, seenPrologueDirectives) {
for (const prologue of prologues) {
if (!seenPrologueDirectives.has(prologue.data)) {
writeLine();
const pos = writer.getTextPos();
emit(prologue);
if (bundleFileInfo)
bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "prologue" /* Prologue */, data: prologue.data });
if (seenPrologueDirectives) {
seenPrologueDirectives.add(prologue.data);
}
}
}
}
function emitPrologueDirectivesIfNeeded(sourceFileOrBundle) {
if (isSourceFile(sourceFileOrBundle)) {
emitPrologueDirectives(sourceFileOrBundle.statements, sourceFileOrBundle);
} else {
const seenPrologueDirectives = /* @__PURE__ */ new Set();
for (const prepend of sourceFileOrBundle.prepends) {
emitUnparsedPrologues(prepend.prologues, seenPrologueDirectives);
}
for (const sourceFile of sourceFileOrBundle.sourceFiles) {
emitPrologueDirectives(
sourceFile.statements,
sourceFile,
seenPrologueDirectives,
/*recordBundleFileSection*/
true
);
}
setSourceFile(void 0);
}
}
function getPrologueDirectivesFromBundledSourceFiles(bundle) {
const seenPrologueDirectives = /* @__PURE__ */ new Set();
let prologues;
for (let index = 0; index < bundle.sourceFiles.length; index++) {
const sourceFile = bundle.sourceFiles[index];
let directives;
let end = 0;
for (const statement of sourceFile.statements) {
if (!isPrologueDirective(statement))
break;
if (seenPrologueDirectives.has(statement.expression.text))
continue;
seenPrologueDirectives.add(statement.expression.text);
(directives || (directives = [])).push({
pos: statement.pos,
end: statement.end,
expression: {
pos: statement.expression.pos,
end: statement.expression.end,
text: statement.expression.text
}
});
end = end < statement.end ? statement.end : end;
}
if (directives)
(prologues || (prologues = [])).push({ file: index, text: sourceFile.text.substring(0, end), directives });
}
return prologues;
}
function emitShebangIfNeeded(sourceFileOrBundle) {
if (isSourceFile(sourceFileOrBundle) || isUnparsedSource(sourceFileOrBundle)) {
const shebang = getShebang(sourceFileOrBundle.text);
if (shebang) {
writeComment(shebang);
writeLine();
return true;
}
} else {
for (const prepend of sourceFileOrBundle.prepends) {
Debug.assertNode(prepend, isUnparsedSource);
if (emitShebangIfNeeded(prepend)) {
return true;
}
}
for (const sourceFile of sourceFileOrBundle.sourceFiles) {
if (emitShebangIfNeeded(sourceFile)) {
return true;
}
}
}
}
function emitNodeWithWriter(node, writer2) {
if (!node)
return;
const savedWrite = write;
write = writer2;
emit(node);
write = savedWrite;
}
function emitDecoratorsAndModifiers(node, modifiers, allowDecorators) {
if (modifiers == null ? void 0 : modifiers.length) {
if (every(modifiers, isModifier)) {
return emitModifierList(node, modifiers);
}
if (every(modifiers, isDecorator)) {
if (allowDecorators) {
return emitDecoratorList(node, modifiers);
}
return node.pos;
}
onBeforeEmitNodeArray == null ? void 0 : onBeforeEmitNodeArray(modifiers);
let lastMode;
let mode;
let start = 0;
let pos = 0;
let lastModifier;
while (start < modifiers.length) {
while (pos < modifiers.length) {
lastModifier = modifiers[pos];
mode = isDecorator(lastModifier) ? "decorators" : "modifiers";
if (lastMode === void 0) {
lastMode = mode;
} else if (mode !== lastMode) {
break;
}
pos++;
}
const textRange = { pos: -1, end: -1 };
if (start === 0)
textRange.pos = modifiers.pos;
if (pos === modifiers.length - 1)
textRange.end = modifiers.end;
if (lastMode === "modifiers" || allowDecorators) {
emitNodeListItems(
emit,
node,
modifiers,
lastMode === "modifiers" ? 2359808 /* Modifiers */ : 2146305 /* Decorators */,
/*parenthesizerRule*/
void 0,
start,
pos - start,
/*hasTrailingComma*/
false,
textRange
);
}
start = pos;
lastMode = mode;
pos++;
}
onAfterEmitNodeArray == null ? void 0 : onAfterEmitNodeArray(modifiers);
if (lastModifier && !positionIsSynthesized(lastModifier.end)) {
return lastModifier.end;
}
}
return node.pos;
}
function emitModifierList(node, modifiers) {
emitList(node, modifiers, 2359808 /* Modifiers */);
const lastModifier = lastOrUndefined(modifiers);
return lastModifier && !positionIsSynthesized(lastModifier.end) ? lastModifier.end : node.pos;
}
function emitTypeAnnotation(node) {
if (node) {
writePunctuation(":");
writeSpace();
emit(node);
}
}
function emitInitializer(node, equalCommentStartPos, container, parenthesizerRule) {
if (node) {
writeSpace();
emitTokenWithComment(64 /* EqualsToken */, equalCommentStartPos, writeOperator, container);
writeSpace();
emitExpression(node, parenthesizerRule);
}
}
function emitNodeWithPrefix(prefix, prefixWriter, node, emit2) {
if (node) {
prefixWriter(prefix);
emit2(node);
}
}
function emitWithLeadingSpace(node) {
if (node) {
writeSpace();
emit(node);
}
}
function emitExpressionWithLeadingSpace(node, parenthesizerRule) {
if (node) {
writeSpace();
emitExpression(node, parenthesizerRule);
}
}
function emitWithTrailingSpace(node) {
if (node) {
emit(node);
writeSpace();
}
}
function emitEmbeddedStatement(parent, node) {
if (isBlock(node) || getEmitFlags(parent) & 1 /* SingleLine */ || preserveSourceNewlines && !getLeadingLineTerminatorCount(parent, node, 0 /* None */)) {
writeSpace();
emit(node);
} else {
writeLine();
increaseIndent();
if (isEmptyStatement(node)) {
pipelineEmit(5 /* EmbeddedStatement */, node);
} else {
emit(node);
}
decreaseIndent();
}
}
function emitDecoratorList(parentNode, decorators) {
emitList(parentNode, decorators, 2146305 /* Decorators */);
const lastDecorator = lastOrUndefined(decorators);
return lastDecorator && !positionIsSynthesized(lastDecorator.end) ? lastDecorator.end : parentNode.pos;
}
function emitTypeArguments(parentNode, typeArguments) {
emitList(parentNode, typeArguments, 53776 /* TypeArguments */, typeArgumentParenthesizerRuleSelector);
}
function emitTypeParameters(parentNode, typeParameters) {
if (isFunctionLike(parentNode) && parentNode.typeArguments) {
return emitTypeArguments(parentNode, parentNode.typeArguments);
}
emitList(parentNode, typeParameters, 53776 /* TypeParameters */);
}
function emitParameters(parentNode, parameters) {
emitList(parentNode, parameters, 2576 /* Parameters */);
}
function canEmitSimpleArrowHead(parentNode, parameters) {
const parameter = singleOrUndefined(parameters);
return parameter && parameter.pos === parentNode.pos && isArrowFunction(parentNode) && !parentNode.type && !some(parentNode.modifiers) && !some(parentNode.typeParameters) && !some(parameter.modifiers) && !parameter.dotDotDotToken && !parameter.questionToken && !parameter.type && !parameter.initializer && isIdentifier(parameter.name);
}
function emitParametersForArrow(parentNode, parameters) {
if (canEmitSimpleArrowHead(parentNode, parameters)) {
emitList(parentNode, parameters, 2576 /* Parameters */ & ~2048 /* Parenthesis */);
} else {
emitParameters(parentNode, parameters);
}
}
function emitParametersForIndexSignature(parentNode, parameters) {
emitList(parentNode, parameters, 8848 /* IndexSignatureParameters */);
}
function writeDelimiter(format) {
switch (format & 60 /* DelimitersMask */) {
case 0 /* None */:
break;
case 16 /* CommaDelimited */:
writePunctuation(",");
break;
case 4 /* BarDelimited */:
writeSpace();
writePunctuation("|");
break;
case 32 /* AsteriskDelimited */:
writeSpace();
writePunctuation("*");
writeSpace();
break;
case 8 /* AmpersandDelimited */:
writeSpace();
writePunctuation("&");
break;
}
}
function emitList(parentNode, children, format, parenthesizerRule, start, count) {
emitNodeList(
emit,
parentNode,
children,
format | (parentNode && getEmitFlags(parentNode) & 2 /* MultiLine */ ? 65536 /* PreferNewLine */ : 0),
parenthesizerRule,
start,
count
);
}
function emitExpressionList(parentNode, children, format, parenthesizerRule, start, count) {
emitNodeList(emitExpression, parentNode, children, format, parenthesizerRule, start, count);
}
function emitNodeList(emit2, parentNode, children, format, parenthesizerRule, start = 0, count = children ? children.length - start : 0) {
const isUndefined = children === void 0;
if (isUndefined && format & 16384 /* OptionalIfUndefined */) {
return;
}
const isEmpty = children === void 0 || start >= children.length || count === 0;
if (isEmpty && format & 32768 /* OptionalIfEmpty */) {
onBeforeEmitNodeArray == null ? void 0 : onBeforeEmitNodeArray(children);
onAfterEmitNodeArray == null ? void 0 : onAfterEmitNodeArray(children);
return;
}
if (format & 15360 /* BracketsMask */) {
writePunctuation(getOpeningBracket(format));
if (isEmpty && children) {
emitTrailingCommentsOfPosition(
children.pos,
/*prefixSpace*/
true
);
}
}
onBeforeEmitNodeArray == null ? void 0 : onBeforeEmitNodeArray(children);
if (isEmpty) {
if (format & 1 /* MultiLine */ && !(preserveSourceNewlines && (!parentNode || currentSourceFile && rangeIsOnSingleLine(parentNode, currentSourceFile)))) {
writeLine();
} else if (format & 256 /* SpaceBetweenBraces */ && !(format & 524288 /* NoSpaceIfEmpty */)) {
writeSpace();
}
} else {
emitNodeListItems(emit2, parentNode, children, format, parenthesizerRule, start, count, children.hasTrailingComma, children);
}
onAfterEmitNodeArray == null ? void 0 : onAfterEmitNodeArray(children);
if (format & 15360 /* BracketsMask */) {
if (isEmpty && children) {
emitLeadingCommentsOfPosition(children.end);
}
writePunctuation(getClosingBracket(format));
}
}
function emitNodeListItems(emit2, parentNode, children, format, parenthesizerRule, start, count, hasTrailingComma, childrenTextRange) {
const mayEmitInterveningComments = (format & 262144 /* NoInterveningComments */) === 0;
let shouldEmitInterveningComments = mayEmitInterveningComments;
const leadingLineTerminatorCount = getLeadingLineTerminatorCount(parentNode, children[start], format);
if (leadingLineTerminatorCount) {
writeLine(leadingLineTerminatorCount);
shouldEmitInterveningComments = false;
} else if (format & 256 /* SpaceBetweenBraces */) {
writeSpace();
}
if (format & 128 /* Indented */) {
increaseIndent();
}
const emitListItem = getEmitListItem(emit2, parenthesizerRule);
let previousSibling;
let previousSourceFileTextKind;
let shouldDecreaseIndentAfterEmit = false;
for (let i = 0; i < count; i++) {
const child = children[start + i];
if (format & 32 /* AsteriskDelimited */) {
writeLine();
writeDelimiter(format);
} else if (previousSibling) {
if (format & 60 /* DelimitersMask */ && previousSibling.end !== (parentNode ? parentNode.end : -1)) {
const previousSiblingEmitFlags = getEmitFlags(previousSibling);
if (!(previousSiblingEmitFlags & 2048 /* NoTrailingComments */)) {
emitLeadingCommentsOfPosition(previousSibling.end);
}
}
writeDelimiter(format);
recordBundleFileInternalSectionEnd(previousSourceFileTextKind);
const separatingLineTerminatorCount = getSeparatingLineTerminatorCount(previousSibling, child, format);
if (separatingLineTerminatorCount > 0) {
if ((format & (3 /* LinesMask */ | 128 /* Indented */)) === 0 /* SingleLine */) {
increaseIndent();
shouldDecreaseIndentAfterEmit = true;
}
writeLine(separatingLineTerminatorCount);
shouldEmitInterveningComments = false;
} else if (previousSibling && format & 512 /* SpaceBetweenSiblings */) {
writeSpace();
}
}
previousSourceFileTextKind = recordBundleFileInternalSectionStart(child);
if (shouldEmitInterveningComments) {
const commentRange = getCommentRange(child);
emitTrailingCommentsOfPosition(commentRange.pos);
} else {
shouldEmitInterveningComments = mayEmitInterveningComments;
}
nextListElementPos = child.pos;
emitListItem(child, emit2, parenthesizerRule, i);
if (shouldDecreaseIndentAfterEmit) {
decreaseIndent();
shouldDecreaseIndentAfterEmit = false;
}
previousSibling = child;
}
const emitFlags = previousSibling ? getEmitFlags(previousSibling) : 0;
const skipTrailingComments = commentsDisabled || !!(emitFlags & 2048 /* NoTrailingComments */);
const emitTrailingComma = hasTrailingComma && format & 64 /* AllowTrailingComma */ && format & 16 /* CommaDelimited */;
if (emitTrailingComma) {
if (previousSibling && !skipTrailingComments) {
emitTokenWithComment(28 /* CommaToken */, previousSibling.end, writePunctuation, previousSibling);
} else {
writePunctuation(",");
}
}
if (previousSibling && (parentNode ? parentNode.end : -1) !== previousSibling.end && format & 60 /* DelimitersMask */ && !skipTrailingComments) {
emitLeadingCommentsOfPosition(emitTrailingComma && (childrenTextRange == null ? void 0 : childrenTextRange.end) ? childrenTextRange.end : previousSibling.end);
}
if (format & 128 /* Indented */) {
decreaseIndent();
}
recordBundleFileInternalSectionEnd(previousSourceFileTextKind);
const closingLineTerminatorCount = getClosingLineTerminatorCount(parentNode, children[start + count - 1], format, childrenTextRange);
if (closingLineTerminatorCount) {
writeLine(closingLineTerminatorCount);
} else if (format & (2097152 /* SpaceAfterList */ | 256 /* SpaceBetweenBraces */)) {
writeSpace();
}
}
function writeLiteral(s) {
writer.writeLiteral(s);
}
function writeStringLiteral(s) {
writer.writeStringLiteral(s);
}
function writeBase(s) {
writer.write(s);
}
function writeSymbol(s, sym) {
writer.writeSymbol(s, sym);
}
function writePunctuation(s) {
writer.writePunctuation(s);
}
function writeTrailingSemicolon() {
writer.writeTrailingSemicolon(";");
}
function writeKeyword(s) {
writer.writeKeyword(s);
}
function writeOperator(s) {
writer.writeOperator(s);
}
function writeParameter(s) {
writer.writeParameter(s);
}
function writeComment(s) {
writer.writeComment(s);
}
function writeSpace() {
writer.writeSpace(" ");
}
function writeProperty(s) {
writer.writeProperty(s);
}
function nonEscapingWrite(s) {
if (writer.nonEscapingWrite) {
writer.nonEscapingWrite(s);
} else {
writer.write(s);
}
}
function writeLine(count = 1) {
for (let i = 0; i < count; i++) {
writer.writeLine(i > 0);
}
}
function increaseIndent() {
writer.increaseIndent();
}
function decreaseIndent() {
writer.decreaseIndent();
}
function writeToken(token, pos, writer2, contextNode) {
return !sourceMapsDisabled ? emitTokenWithSourceMap(contextNode, token, writer2, pos, writeTokenText) : writeTokenText(token, writer2, pos);
}
function writeTokenNode(node, writer2) {
if (onBeforeEmitToken) {
onBeforeEmitToken(node);
}
writer2(tokenToString(node.kind));
if (onAfterEmitToken) {
onAfterEmitToken(node);
}
}
function writeTokenText(token, writer2, pos) {
const tokenString = tokenToString(token);
writer2(tokenString);
return pos < 0 ? pos : pos + tokenString.length;
}
function writeLineOrSpace(parentNode, prevChildNode, nextChildNode) {
if (getEmitFlags(parentNode) & 1 /* SingleLine */) {
writeSpace();
} else if (preserveSourceNewlines) {
const lines = getLinesBetweenNodes(parentNode, prevChildNode, nextChildNode);
if (lines) {
writeLine(lines);
} else {
writeSpace();
}
} else {
writeLine();
}
}
function writeLines(text) {
const lines = text.split(/\r\n?|\n/g);
const indentation = guessIndentation(lines);
for (const lineText of lines) {
const line = indentation ? lineText.slice(indentation) : lineText;
if (line.length) {
writeLine();
write(line);
}
}
}
function writeLinesAndIndent(lineCount, writeSpaceIfNotIndenting) {
if (lineCount) {
increaseIndent();
writeLine(lineCount);
} else if (writeSpaceIfNotIndenting) {
writeSpace();
}
}
function decreaseIndentIf(value1, value2) {
if (value1) {
decreaseIndent();
}
if (value2) {
decreaseIndent();
}
}
function getLeadingLineTerminatorCount(parentNode, firstChild, format) {
if (format & 2 /* PreserveLines */ || preserveSourceNewlines) {
if (format & 65536 /* PreferNewLine */) {
return 1;
}
if (firstChild === void 0) {
return !parentNode || currentSourceFile && rangeIsOnSingleLine(parentNode, currentSourceFile) ? 0 : 1;
}
if (firstChild.pos === nextListElementPos) {
return 0;
}
if (firstChild.kind === 12 /* JsxText */) {
return 0;
}
if (currentSourceFile && parentNode && !positionIsSynthesized(parentNode.pos) && !nodeIsSynthesized(firstChild) && (!firstChild.parent || getOriginalNode(firstChild.parent) === getOriginalNode(parentNode))) {
if (preserveSourceNewlines) {
return getEffectiveLines(
(includeComments) => getLinesBetweenPositionAndPrecedingNonWhitespaceCharacter(
firstChild.pos,
parentNode.pos,
currentSourceFile,
includeComments
)
);
}
return rangeStartPositionsAreOnSameLine(parentNode, firstChild, currentSourceFile) ? 0 : 1;
}
if (synthesizedNodeStartsOnNewLine(firstChild, format)) {
return 1;
}
}
return format & 1 /* MultiLine */ ? 1 : 0;
}
function getSeparatingLineTerminatorCount(previousNode, nextNode, format) {
if (format & 2 /* PreserveLines */ || preserveSourceNewlines) {
if (previousNode === void 0 || nextNode === void 0) {
return 0;
}
if (nextNode.kind === 12 /* JsxText */) {
return 0;
} else if (currentSourceFile && !nodeIsSynthesized(previousNode) && !nodeIsSynthesized(nextNode)) {
if (preserveSourceNewlines && siblingNodePositionsAreComparable(previousNode, nextNode)) {
return getEffectiveLines(
(includeComments) => getLinesBetweenRangeEndAndRangeStart(
previousNode,
nextNode,
currentSourceFile,
includeComments
)
);
} else if (!preserveSourceNewlines && originalNodesHaveSameParent(previousNode, nextNode)) {
return rangeEndIsOnSameLineAsRangeStart(previousNode, nextNode, currentSourceFile) ? 0 : 1;
}
return format & 65536 /* PreferNewLine */ ? 1 : 0;
} else if (synthesizedNodeStartsOnNewLine(previousNode, format) || synthesizedNodeStartsOnNewLine(nextNode, format)) {
return 1;
}
} else if (getStartsOnNewLine(nextNode)) {
return 1;
}
return format & 1 /* MultiLine */ ? 1 : 0;
}
function getClosingLineTerminatorCount(parentNode, lastChild, format, childrenTextRange) {
if (format & 2 /* PreserveLines */ || preserveSourceNewlines) {
if (format & 65536 /* PreferNewLine */) {
return 1;
}
if (lastChild === void 0) {
return !parentNode || currentSourceFile && rangeIsOnSingleLine(parentNode, currentSourceFile) ? 0 : 1;
}
if (currentSourceFile && parentNode && !positionIsSynthesized(parentNode.pos) && !nodeIsSynthesized(lastChild) && (!lastChild.parent || lastChild.parent === parentNode)) {
if (preserveSourceNewlines) {
const end = childrenTextRange && !positionIsSynthesized(childrenTextRange.end) ? childrenTextRange.end : lastChild.end;
return getEffectiveLines(
(includeComments) => getLinesBetweenPositionAndNextNonWhitespaceCharacter(
end,
parentNode.end,
currentSourceFile,
includeComments
)
);
}
return rangeEndPositionsAreOnSameLine(parentNode, lastChild, currentSourceFile) ? 0 : 1;
}
if (synthesizedNodeStartsOnNewLine(lastChild, format)) {
return 1;
}
}
if (format & 1 /* MultiLine */ && !(format & 131072 /* NoTrailingNewLine */)) {
return 1;
}
return 0;
}
function getEffectiveLines(getLineDifference) {
Debug.assert(!!preserveSourceNewlines);
const lines = getLineDifference(
/*includeComments*/
true
);
if (lines === 0) {
return getLineDifference(
/*includeComments*/
false
);
}
return lines;
}
function writeLineSeparatorsAndIndentBefore(node, parent) {
const leadingNewlines = preserveSourceNewlines && getLeadingLineTerminatorCount(parent, node, 0 /* None */);
if (leadingNewlines) {
writeLinesAndIndent(
leadingNewlines,
/*writeSpaceIfNotIndenting*/
false
);
}
return !!leadingNewlines;
}
function writeLineSeparatorsAfter(node, parent) {
const trailingNewlines = preserveSourceNewlines && getClosingLineTerminatorCount(
parent,
node,
0 /* None */,
/*childrenTextRange*/
void 0
);
if (trailingNewlines) {
writeLine(trailingNewlines);
}
}
function synthesizedNodeStartsOnNewLine(node, format) {
if (nodeIsSynthesized(node)) {
const startsOnNewLine = getStartsOnNewLine(node);
if (startsOnNewLine === void 0) {
return (format & 65536 /* PreferNewLine */) !== 0;
}
return startsOnNewLine;
}
return (format & 65536 /* PreferNewLine */) !== 0;
}
function getLinesBetweenNodes(parent, node1, node2) {
if (getEmitFlags(parent) & 262144 /* NoIndentation */) {
return 0;
}
parent = skipSynthesizedParentheses(parent);
node1 = skipSynthesizedParentheses(node1);
node2 = skipSynthesizedParentheses(node2);
if (getStartsOnNewLine(node2)) {
return 1;
}
if (currentSourceFile && !nodeIsSynthesized(parent) && !nodeIsSynthesized(node1) && !nodeIsSynthesized(node2)) {
if (preserveSourceNewlines) {
return getEffectiveLines(
(includeComments) => getLinesBetweenRangeEndAndRangeStart(
node1,
node2,
currentSourceFile,
includeComments
)
);
}
return rangeEndIsOnSameLineAsRangeStart(node1, node2, currentSourceFile) ? 0 : 1;
}
return 0;
}
function isEmptyBlock(block) {
return block.statements.length === 0 && (!currentSourceFile || rangeEndIsOnSameLineAsRangeStart(block, block, currentSourceFile));
}
function skipSynthesizedParentheses(node) {
while (node.kind === 216 /* ParenthesizedExpression */ && nodeIsSynthesized(node)) {
node = node.expression;
}
return node;
}
function getTextOfNode2(node, includeTrivia) {
if (isGeneratedIdentifier(node) || isGeneratedPrivateIdentifier(node)) {
return generateName(node);
}
if (isStringLiteral(node) && node.textSourceNode) {
return getTextOfNode2(node.textSourceNode, includeTrivia);
}
const sourceFile = currentSourceFile;
const canUseSourceFile = !!sourceFile && !!node.parent && !nodeIsSynthesized(node);
if (isMemberName(node)) {
if (!canUseSourceFile || getSourceFileOfNode(node) !== getOriginalNode(sourceFile)) {
return idText(node);
}
} else if (isJsxNamespacedName(node)) {
if (!canUseSourceFile || getSourceFileOfNode(node) !== getOriginalNode(sourceFile)) {
return getTextOfJsxNamespacedName(node);
}
} else {
Debug.assertNode(node, isLiteralExpression);
if (!canUseSourceFile) {
return node.text;
}
}
return getSourceTextOfNodeFromSourceFile(sourceFile, node, includeTrivia);
}
function getLiteralTextOfNode(node, neverAsciiEscape, jsxAttributeEscape) {
if (node.kind === 11 /* StringLiteral */ && node.textSourceNode) {
const textSourceNode = node.textSourceNode;
if (isIdentifier(textSourceNode) || isPrivateIdentifier(textSourceNode) || isNumericLiteral(textSourceNode) || isJsxNamespacedName(textSourceNode)) {
const text = isNumericLiteral(textSourceNode) ? textSourceNode.text : getTextOfNode2(textSourceNode);
return jsxAttributeEscape ? `"${escapeJsxAttributeString(text)}"` : neverAsciiEscape || getEmitFlags(node) & 16777216 /* NoAsciiEscaping */ ? `"${escapeString(text)}"` : `"${escapeNonAsciiString(text)}"`;
} else {
return getLiteralTextOfNode(textSourceNode, neverAsciiEscape, jsxAttributeEscape);
}
}
const flags = (neverAsciiEscape ? 1 /* NeverAsciiEscape */ : 0) | (jsxAttributeEscape ? 2 /* JsxAttributeEscape */ : 0) | (printerOptions.terminateUnterminatedLiterals ? 4 /* TerminateUnterminatedLiterals */ : 0) | (printerOptions.target && printerOptions.target === 99 /* ESNext */ ? 8 /* AllowNumericSeparator */ : 0);
return getLiteralText(node, currentSourceFile, flags);
}
function pushNameGenerationScope(node) {
if (node && getEmitFlags(node) & 1048576 /* ReuseTempVariableScope */) {
return;
}
tempFlagsStack.push(tempFlags);
tempFlags = 0 /* Auto */;
formattedNameTempFlagsStack.push(formattedNameTempFlags);
formattedNameTempFlags = void 0;
reservedNamesStack.push(reservedNames);
}
function popNameGenerationScope(node) {
if (node && getEmitFlags(node) & 1048576 /* ReuseTempVariableScope */) {
return;
}
tempFlags = tempFlagsStack.pop();
formattedNameTempFlags = formattedNameTempFlagsStack.pop();
reservedNames = reservedNamesStack.pop();
}
function reserveNameInNestedScopes(name) {
if (!reservedNames || reservedNames === lastOrUndefined(reservedNamesStack)) {
reservedNames = /* @__PURE__ */ new Set();
}
reservedNames.add(name);
}
function pushPrivateNameGenerationScope(newPrivateNameTempFlags, newReservedMemberNames) {
privateNameTempFlagsStack.push(privateNameTempFlags);
privateNameTempFlags = newPrivateNameTempFlags;
reservedPrivateNamesStack.push(reservedNames);
reservedPrivateNames = newReservedMemberNames;
}
function popPrivateNameGenerationScope() {
privateNameTempFlags = privateNameTempFlagsStack.pop();
reservedPrivateNames = reservedPrivateNamesStack.pop();
}
function reservePrivateNameInNestedScopes(name) {
if (!reservedPrivateNames || reservedPrivateNames === lastOrUndefined(reservedPrivateNamesStack)) {
reservedPrivateNames = /* @__PURE__ */ new Set();
}
reservedPrivateNames.add(name);
}
function generateNames(node) {
if (!node)
return;
switch (node.kind) {
case 240 /* Block */:
forEach(node.statements, generateNames);
break;
case 255 /* LabeledStatement */:
case 253 /* WithStatement */:
case 245 /* DoStatement */:
case 246 /* WhileStatement */:
generateNames(node.statement);
break;
case 244 /* IfStatement */:
generateNames(node.thenStatement);
generateNames(node.elseStatement);
break;
case 247 /* ForStatement */:
case 249 /* ForOfStatement */:
case 248 /* ForInStatement */:
generateNames(node.initializer);
generateNames(node.statement);
break;
case 254 /* SwitchStatement */:
generateNames(node.caseBlock);
break;
case 268 /* CaseBlock */:
forEach(node.clauses, generateNames);
break;
case 295 /* CaseClause */:
case 296 /* DefaultClause */:
forEach(node.statements, generateNames);
break;
case 257 /* TryStatement */:
generateNames(node.tryBlock);
generateNames(node.catchClause);
generateNames(node.finallyBlock);
break;
case 298 /* CatchClause */:
generateNames(node.variableDeclaration);
generateNames(node.block);
break;
case 242 /* VariableStatement */:
generateNames(node.declarationList);
break;
case 260 /* VariableDeclarationList */:
forEach(node.declarations, generateNames);
break;
case 259 /* VariableDeclaration */:
case 168 /* Parameter */:
case 207 /* BindingElement */:
case 262 /* ClassDeclaration */:
generateNameIfNeeded(node.name);
break;
case 261 /* FunctionDeclaration */:
generateNameIfNeeded(node.name);
if (getEmitFlags(node) & 1048576 /* ReuseTempVariableScope */) {
forEach(node.parameters, generateNames);
generateNames(node.body);
}
break;
case 205 /* ObjectBindingPattern */:
case 206 /* ArrayBindingPattern */:
forEach(node.elements, generateNames);
break;
case 271 /* ImportDeclaration */:
generateNames(node.importClause);
break;
case 272 /* ImportClause */:
generateNameIfNeeded(node.name);
generateNames(node.namedBindings);
break;
case 273 /* NamespaceImport */:
generateNameIfNeeded(node.name);
break;
case 279 /* NamespaceExport */:
generateNameIfNeeded(node.name);
break;
case 274 /* NamedImports */:
forEach(node.elements, generateNames);
break;
case 275 /* ImportSpecifier */:
generateNameIfNeeded(node.propertyName || node.name);
break;
}
}
function generateMemberNames(node) {
if (!node)
return;
switch (node.kind) {
case 302 /* PropertyAssignment */:
case 303 /* ShorthandPropertyAssignment */:
case 171 /* PropertyDeclaration */:
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
generateNameIfNeeded(node.name);
break;
}
}
function generateNameIfNeeded(name) {
if (name) {
if (isGeneratedIdentifier(name) || isGeneratedPrivateIdentifier(name)) {
generateName(name);
} else if (isBindingPattern(name)) {
generateNames(name);
}
}
}
function generateName(name) {
const autoGenerate = name.emitNode.autoGenerate;
if ((autoGenerate.flags & 7 /* KindMask */) === 4 /* Node */) {
return generateNameCached(getNodeForGeneratedName(name), isPrivateIdentifier(name), autoGenerate.flags, autoGenerate.prefix, autoGenerate.suffix);
} else {
const autoGenerateId = autoGenerate.id;
return autoGeneratedIdToGeneratedName[autoGenerateId] || (autoGeneratedIdToGeneratedName[autoGenerateId] = makeName(name));
}
}
function generateNameCached(node, privateName, flags, prefix, suffix) {
const nodeId = getNodeId(node);
const cache = privateName ? nodeIdToGeneratedPrivateName : nodeIdToGeneratedName;
return cache[nodeId] || (cache[nodeId] = generateNameForNode(node, privateName, flags ?? 0 /* None */, formatGeneratedNamePart(prefix, generateName), formatGeneratedNamePart(suffix)));
}
function isUniqueName(name, privateName) {
return isFileLevelUniqueNameInCurrentFile(name, privateName) && !isReservedName(name, privateName) && !generatedNames.has(name);
}
function isReservedName(name, privateName) {
return privateName ? !!(reservedPrivateNames == null ? void 0 : reservedPrivateNames.has(name)) : !!(reservedNames == null ? void 0 : reservedNames.has(name));
}
function isFileLevelUniqueNameInCurrentFile(name, _isPrivate) {
return currentSourceFile ? isFileLevelUniqueName(currentSourceFile, name, hasGlobalName) : true;
}
function isUniqueLocalName(name, container) {
for (let node = container; node && isNodeDescendantOf(node, container); node = node.nextContainer) {
if (canHaveLocals(node) && node.locals) {
const local = node.locals.get(escapeLeadingUnderscores(name));
if (local && local.flags & (111551 /* Value */ | 1048576 /* ExportValue */ | 2097152 /* Alias */)) {
return false;
}
}
}
return true;
}
function getTempFlags(formattedNameKey) {
switch (formattedNameKey) {
case "":
return tempFlags;
case "#":
return privateNameTempFlags;
default:
return (formattedNameTempFlags == null ? void 0 : formattedNameTempFlags.get(formattedNameKey)) ?? 0 /* Auto */;
}
}
function setTempFlags(formattedNameKey, flags) {
switch (formattedNameKey) {
case "":
tempFlags = flags;
break;
case "#":
privateNameTempFlags = flags;
break;
default:
formattedNameTempFlags ?? (formattedNameTempFlags = /* @__PURE__ */ new Map());
formattedNameTempFlags.set(formattedNameKey, flags);
break;
}
}
function makeTempVariableName(flags, reservedInNestedScopes, privateName, prefix, suffix) {
if (prefix.length > 0 && prefix.charCodeAt(0) === 35 /* hash */) {
prefix = prefix.slice(1);
}
const key = formatGeneratedName(privateName, prefix, "", suffix);
let tempFlags2 = getTempFlags(key);
if (flags && !(tempFlags2 & flags)) {
const name = flags === 268435456 /* _i */ ? "_i" : "_n";
const fullName = formatGeneratedName(privateName, prefix, name, suffix);
if (isUniqueName(fullName, privateName)) {
tempFlags2 |= flags;
if (privateName) {
reservePrivateNameInNestedScopes(fullName);
} else if (reservedInNestedScopes) {
reserveNameInNestedScopes(fullName);
}
setTempFlags(key, tempFlags2);
return fullName;
}
}
while (true) {
const count = tempFlags2 & 268435455 /* CountMask */;
tempFlags2++;
if (count !== 8 && count !== 13) {
const name = count < 26 ? "_" + String.fromCharCode(97 /* a */ + count) : "_" + (count - 26);
const fullName = formatGeneratedName(privateName, prefix, name, suffix);
if (isUniqueName(fullName, privateName)) {
if (privateName) {
reservePrivateNameInNestedScopes(fullName);
} else if (reservedInNestedScopes) {
reserveNameInNestedScopes(fullName);
}
setTempFlags(key, tempFlags2);
return fullName;
}
}
}
}
function makeUniqueName(baseName, checkFn = isUniqueName, optimistic, scoped, privateName, prefix, suffix) {
if (baseName.length > 0 && baseName.charCodeAt(0) === 35 /* hash */) {
baseName = baseName.slice(1);
}
if (prefix.length > 0 && prefix.charCodeAt(0) === 35 /* hash */) {
prefix = prefix.slice(1);
}
if (optimistic) {
const fullName = formatGeneratedName(privateName, prefix, baseName, suffix);
if (checkFn(fullName, privateName)) {
if (privateName) {
reservePrivateNameInNestedScopes(fullName);
} else if (scoped) {
reserveNameInNestedScopes(fullName);
} else {
generatedNames.add(fullName);
}
return fullName;
}
}
if (baseName.charCodeAt(baseName.length - 1) !== 95 /* _ */) {
baseName += "_";
}
let i = 1;
while (true) {
const fullName = formatGeneratedName(privateName, prefix, baseName + i, suffix);
if (checkFn(fullName, privateName)) {
if (privateName) {
reservePrivateNameInNestedScopes(fullName);
} else if (scoped) {
reserveNameInNestedScopes(fullName);
} else {
generatedNames.add(fullName);
}
return fullName;
}
i++;
}
}
function makeFileLevelOptimisticUniqueName(name) {
return makeUniqueName(
name,
isFileLevelUniqueNameInCurrentFile,
/*optimistic*/
true,
/*scoped*/
false,
/*privateName*/
false,
/*prefix*/
"",
/*suffix*/
""
);
}
function generateNameForModuleOrEnum(node) {
const name = getTextOfNode2(node.name);
return isUniqueLocalName(name, tryCast(node, canHaveLocals)) ? name : makeUniqueName(
name,
isUniqueName,
/*optimistic*/
false,
/*scoped*/
false,
/*privateName*/
false,
/*prefix*/
"",
/*suffix*/
""
);
}
function generateNameForImportOrExportDeclaration(node) {
const expr = getExternalModuleName(node);
const baseName = isStringLiteral(expr) ? makeIdentifierFromModuleName(expr.text) : "module";
return makeUniqueName(
baseName,
isUniqueName,
/*optimistic*/
false,
/*scoped*/
false,
/*privateName*/
false,
/*prefix*/
"",
/*suffix*/
""
);
}
function generateNameForExportDefault() {
return makeUniqueName(
"default",
isUniqueName,
/*optimistic*/
false,
/*scoped*/
false,
/*privateName*/
false,
/*prefix*/
"",
/*suffix*/
""
);
}
function generateNameForClassExpression() {
return makeUniqueName(
"class",
isUniqueName,
/*optimistic*/
false,
/*scoped*/
false,
/*privateName*/
false,
/*prefix*/
"",
/*suffix*/
""
);
}
function generateNameForMethodOrAccessor(node, privateName, prefix, suffix) {
if (isIdentifier(node.name)) {
return generateNameCached(node.name, privateName);
}
return makeTempVariableName(
0 /* Auto */,
/*reservedInNestedScopes*/
false,
privateName,
prefix,
suffix
);
}
function generateNameForNode(node, privateName, flags, prefix, suffix) {
switch (node.kind) {
case 80 /* Identifier */:
case 81 /* PrivateIdentifier */:
return makeUniqueName(
getTextOfNode2(node),
isUniqueName,
!!(flags & 16 /* Optimistic */),
!!(flags & 8 /* ReservedInNestedScopes */),
privateName,
prefix,
suffix
);
case 266 /* ModuleDeclaration */:
case 265 /* EnumDeclaration */:
Debug.assert(!prefix && !suffix && !privateName);
return generateNameForModuleOrEnum(node);
case 271 /* ImportDeclaration */:
case 277 /* ExportDeclaration */:
Debug.assert(!prefix && !suffix && !privateName);
return generateNameForImportOrExportDeclaration(node);
case 261 /* FunctionDeclaration */:
case 262 /* ClassDeclaration */: {
Debug.assert(!prefix && !suffix && !privateName);
const name = node.name;
if (name && !isGeneratedIdentifier(name)) {
return generateNameForNode(
name,
/*privateName*/
false,
flags,
prefix,
suffix
);
}
return generateNameForExportDefault();
}
case 276 /* ExportAssignment */:
Debug.assert(!prefix && !suffix && !privateName);
return generateNameForExportDefault();
case 230 /* ClassExpression */:
Debug.assert(!prefix && !suffix && !privateName);
return generateNameForClassExpression();
case 173 /* MethodDeclaration */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
return generateNameForMethodOrAccessor(node, privateName, prefix, suffix);
case 166 /* ComputedPropertyName */:
return makeTempVariableName(
0 /* Auto */,
/*reservedInNestedScopes*/
true,
privateName,
prefix,
suffix
);
default:
return makeTempVariableName(
0 /* Auto */,
/*reservedInNestedScopes*/
false,
privateName,
prefix,
suffix
);
}
}
function makeName(name) {
const autoGenerate = name.emitNode.autoGenerate;
const prefix = formatGeneratedNamePart(autoGenerate.prefix, generateName);
const suffix = formatGeneratedNamePart(autoGenerate.suffix);
switch (autoGenerate.flags & 7 /* KindMask */) {
case 1 /* Auto */:
return makeTempVariableName(0 /* Auto */, !!(autoGenerate.flags & 8 /* ReservedInNestedScopes */), isPrivateIdentifier(name), prefix, suffix);
case 2 /* Loop */:
Debug.assertNode(name, isIdentifier);
return makeTempVariableName(
268435456 /* _i */,
!!(autoGenerate.flags & 8 /* ReservedInNestedScopes */),
/*privateName*/
false,
prefix,
suffix
);
case 3 /* Unique */:
return makeUniqueName(
idText(name),
autoGenerate.flags & 32 /* FileLevel */ ? isFileLevelUniqueNameInCurrentFile : isUniqueName,
!!(autoGenerate.flags & 16 /* Optimistic */),
!!(autoGenerate.flags & 8 /* ReservedInNestedScopes */),
isPrivateIdentifier(name),
prefix,
suffix
);
}
return Debug.fail(`Unsupported GeneratedIdentifierKind: ${Debug.formatEnum(
autoGenerate.flags & 7 /* KindMask */,
GeneratedIdentifierFlags,
/*isFlags*/
true
)}.`);
}
function pipelineEmitWithComments(hint, node) {
const pipelinePhase = getNextPipelinePhase(2 /* Comments */, hint, node);
const savedContainerPos = containerPos;
const savedContainerEnd = containerEnd;
const savedDeclarationListContainerEnd = declarationListContainerEnd;
emitCommentsBeforeNode(node);
pipelinePhase(hint, node);
emitCommentsAfterNode(node, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd);
}
function emitCommentsBeforeNode(node) {
const emitFlags = getEmitFlags(node);
const commentRange = getCommentRange(node);
emitLeadingCommentsOfNode(node, emitFlags, commentRange.pos, commentRange.end);
if (emitFlags & 4096 /* NoNestedComments */) {
commentsDisabled = true;
}
}
function emitCommentsAfterNode(node, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd) {
const emitFlags = getEmitFlags(node);
const commentRange = getCommentRange(node);
if (emitFlags & 4096 /* NoNestedComments */) {
commentsDisabled = false;
}
emitTrailingCommentsOfNode(node, emitFlags, commentRange.pos, commentRange.end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd);
const typeNode = getTypeNode(node);
if (typeNode) {
emitTrailingCommentsOfNode(node, emitFlags, typeNode.pos, typeNode.end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd);
}
}
function emitLeadingCommentsOfNode(node, emitFlags, pos, end) {
enterComment();
hasWrittenComment = false;
const skipLeadingComments = pos < 0 || (emitFlags & 1024 /* NoLeadingComments */) !== 0 || node.kind === 12 /* JsxText */;
const skipTrailingComments = end < 0 || (emitFlags & 2048 /* NoTrailingComments */) !== 0 || node.kind === 12 /* JsxText */;
if ((pos > 0 || end > 0) && pos !== end) {
if (!skipLeadingComments) {
emitLeadingComments(
pos,
/*isEmittedNode*/
node.kind !== 358 /* NotEmittedStatement */
);
}
if (!skipLeadingComments || pos >= 0 && (emitFlags & 1024 /* NoLeadingComments */) !== 0) {
containerPos = pos;
}
if (!skipTrailingComments || end >= 0 && (emitFlags & 2048 /* NoTrailingComments */) !== 0) {
containerEnd = end;
if (node.kind === 260 /* VariableDeclarationList */) {
declarationListContainerEnd = end;
}
}
}
forEach(getSyntheticLeadingComments(node), emitLeadingSynthesizedComment);
exitComment();
}
function emitTrailingCommentsOfNode(node, emitFlags, pos, end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd) {
enterComment();
const skipTrailingComments = end < 0 || (emitFlags & 2048 /* NoTrailingComments */) !== 0 || node.kind === 12 /* JsxText */;
forEach(getSyntheticTrailingComments(node), emitTrailingSynthesizedComment);
if ((pos > 0 || end > 0) && pos !== end) {
containerPos = savedContainerPos;
containerEnd = savedContainerEnd;
declarationListContainerEnd = savedDeclarationListContainerEnd;
if (!skipTrailingComments && node.kind !== 358 /* NotEmittedStatement */) {
emitTrailingComments(end);
}
}
exitComment();
}
function emitLeadingSynthesizedComment(comment) {
if (comment.hasLeadingNewline || comment.kind === 2 /* SingleLineCommentTrivia */) {
writer.writeLine();
}
writeSynthesizedComment(comment);
if (comment.hasTrailingNewLine || comment.kind === 2 /* SingleLineCommentTrivia */) {
writer.writeLine();
} else {
writer.writeSpace(" ");
}
}
function emitTrailingSynthesizedComment(comment) {
if (!writer.isAtStartOfLine()) {
writer.writeSpace(" ");
}
writeSynthesizedComment(comment);
if (comment.hasTrailingNewLine) {
writer.writeLine();
}
}
function writeSynthesizedComment(comment) {
const text = formatSynthesizedComment(comment);
const lineMap = comment.kind === 3 /* MultiLineCommentTrivia */ ? computeLineStarts(text) : void 0;
writeCommentRange(text, lineMap, writer, 0, text.length, newLine);
}
function formatSynthesizedComment(comment) {
return comment.kind === 3 /* MultiLineCommentTrivia */ ? `/*${comment.text}*/` : `//${comment.text}`;
}
function emitBodyWithDetachedComments(node, detachedRange, emitCallback) {
enterComment();
const { pos, end } = detachedRange;
const emitFlags = getEmitFlags(node);
const skipLeadingComments = pos < 0 || (emitFlags & 1024 /* NoLeadingComments */) !== 0;
const skipTrailingComments = commentsDisabled || end < 0 || (emitFlags & 2048 /* NoTrailingComments */) !== 0;
if (!skipLeadingComments) {
emitDetachedCommentsAndUpdateCommentsInfo(detachedRange);
}
exitComment();
if (emitFlags & 4096 /* NoNestedComments */ && !commentsDisabled) {
commentsDisabled = true;
emitCallback(node);
commentsDisabled = false;
} else {
emitCallback(node);
}
enterComment();
if (!skipTrailingComments) {
emitLeadingComments(
detachedRange.end,
/*isEmittedNode*/
true
);
if (hasWrittenComment && !writer.isAtStartOfLine()) {
writer.writeLine();
}
}
exitComment();
}
function originalNodesHaveSameParent(nodeA, nodeB) {
nodeA = getOriginalNode(nodeA);
return nodeA.parent && nodeA.parent === getOriginalNode(nodeB).parent;
}
function siblingNodePositionsAreComparable(previousNode, nextNode) {
if (nextNode.pos < previousNode.end) {
return false;
}
previousNode = getOriginalNode(previousNode);
nextNode = getOriginalNode(nextNode);
const parent = previousNode.parent;
if (!parent || parent !== nextNode.parent) {
return false;
}
const parentNodeArray = getContainingNodeArray(previousNode);
const prevNodeIndex = parentNodeArray == null ? void 0 : parentNodeArray.indexOf(previousNode);
return prevNodeIndex !== void 0 && prevNodeIndex > -1 && parentNodeArray.indexOf(nextNode) === prevNodeIndex + 1;
}
function emitLeadingComments(pos, isEmittedNode) {
hasWrittenComment = false;
if (isEmittedNode) {
if (pos === 0 && (currentSourceFile == null ? void 0 : currentSourceFile.isDeclarationFile)) {
forEachLeadingCommentToEmit(pos, emitNonTripleSlashLeadingComment);
} else {
forEachLeadingCommentToEmit(pos, emitLeadingComment);
}
} else if (pos === 0) {
forEachLeadingCommentToEmit(pos, emitTripleSlashLeadingComment);
}
}
function emitTripleSlashLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos) {
if (isTripleSlashComment(commentPos, commentEnd)) {
emitLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos);
}
}
function emitNonTripleSlashLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos) {
if (!isTripleSlashComment(commentPos, commentEnd)) {
emitLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos);
}
}
function shouldWriteComment(text, pos) {
if (printerOptions.onlyPrintJsDocStyle) {
return isJSDocLikeText(text, pos) || isPinnedComment(text, pos);
}
return true;
}
function emitLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos) {
if (!currentSourceFile || !shouldWriteComment(currentSourceFile.text, commentPos))
return;
if (!hasWrittenComment) {
emitNewLineBeforeLeadingCommentOfPosition(getCurrentLineMap(), writer, rangePos, commentPos);
hasWrittenComment = true;
}
emitPos(commentPos);
writeCommentRange(currentSourceFile.text, getCurrentLineMap(), writer, commentPos, commentEnd, newLine);
emitPos(commentEnd);
if (hasTrailingNewLine) {
writer.writeLine();
} else if (kind === 3 /* MultiLineCommentTrivia */) {
writer.writeSpace(" ");
}
}
function emitLeadingCommentsOfPosition(pos) {
if (commentsDisabled || pos === -1) {
return;
}
emitLeadingComments(
pos,
/*isEmittedNode*/
true
);
}
function emitTrailingComments(pos) {
forEachTrailingCommentToEmit(pos, emitTrailingComment);
}
function emitTrailingComment(commentPos, commentEnd, _kind, hasTrailingNewLine) {
if (!currentSourceFile || !shouldWriteComment(currentSourceFile.text, commentPos))
return;
if (!writer.isAtStartOfLine()) {
writer.writeSpace(" ");
}
emitPos(commentPos);
writeCommentRange(currentSourceFile.text, getCurrentLineMap(), writer, commentPos, commentEnd, newLine);
emitPos(commentEnd);
if (hasTrailingNewLine) {
writer.writeLine();
}
}
function emitTrailingCommentsOfPosition(pos, prefixSpace, forceNoNewline) {
if (commentsDisabled) {
return;
}
enterComment();
forEachTrailingCommentToEmit(pos, prefixSpace ? emitTrailingComment : forceNoNewline ? emitTrailingCommentOfPositionNoNewline : emitTrailingCommentOfPosition);
exitComment();
}
function emitTrailingCommentOfPositionNoNewline(commentPos, commentEnd, kind) {
if (!currentSourceFile)
return;
emitPos(commentPos);
writeCommentRange(currentSourceFile.text, getCurrentLineMap(), writer, commentPos, commentEnd, newLine);
emitPos(commentEnd);
if (kind === 2 /* SingleLineCommentTrivia */) {
writer.writeLine();
}
}
function emitTrailingCommentOfPosition(commentPos, commentEnd, _kind, hasTrailingNewLine) {
if (!currentSourceFile)
return;
emitPos(commentPos);
writeCommentRange(currentSourceFile.text, getCurrentLineMap(), writer, commentPos, commentEnd, newLine);
emitPos(commentEnd);
if (hasTrailingNewLine) {
writer.writeLine();
} else {
writer.writeSpace(" ");
}
}
function forEachLeadingCommentToEmit(pos, cb) {
if (currentSourceFile && (containerPos === -1 || pos !== containerPos)) {
if (hasDetachedComments(pos)) {
forEachLeadingCommentWithoutDetachedComments(cb);
} else {
forEachLeadingCommentRange(
currentSourceFile.text,
pos,
cb,
/*state*/
pos
);
}
}
}
function forEachTrailingCommentToEmit(end, cb) {
if (currentSourceFile && (containerEnd === -1 || end !== containerEnd && end !== declarationListContainerEnd)) {
forEachTrailingCommentRange(currentSourceFile.text, end, cb);
}
}
function hasDetachedComments(pos) {
return detachedCommentsInfo !== void 0 && last(detachedCommentsInfo).nodePos === pos;
}
function forEachLeadingCommentWithoutDetachedComments(cb) {
if (!currentSourceFile)
return;
const pos = last(detachedCommentsInfo).detachedCommentEndPos;
if (detachedCommentsInfo.length - 1) {
detachedCommentsInfo.pop();
} else {
detachedCommentsInfo = void 0;
}
forEachLeadingCommentRange(
currentSourceFile.text,
pos,
cb,
/*state*/
pos
);
}
function emitDetachedCommentsAndUpdateCommentsInfo(range) {
const currentDetachedCommentInfo = currentSourceFile && emitDetachedComments(currentSourceFile.text, getCurrentLineMap(), writer, emitComment, range, newLine, commentsDisabled);
if (currentDetachedCommentInfo) {
if (detachedCommentsInfo) {
detachedCommentsInfo.push(currentDetachedCommentInfo);
} else {
detachedCommentsInfo = [currentDetachedCommentInfo];
}
}
}
function emitComment(text, lineMap, writer2, commentPos, commentEnd, newLine2) {
if (!currentSourceFile || !shouldWriteComment(currentSourceFile.text, commentPos))
return;
emitPos(commentPos);
writeCommentRange(text, lineMap, writer2, commentPos, commentEnd, newLine2);
emitPos(commentEnd);
}
function isTripleSlashComment(commentPos, commentEnd) {
return !!currentSourceFile && isRecognizedTripleSlashComment(currentSourceFile.text, commentPos, commentEnd);
}
function getParsedSourceMap(node) {
if (node.parsedSourceMap === void 0 && node.sourceMapText !== void 0) {
node.parsedSourceMap = tryParseRawSourceMap(node.sourceMapText) || false;
}
return node.parsedSourceMap || void 0;
}
function pipelineEmitWithSourceMaps(hint, node) {
const pipelinePhase = getNextPipelinePhase(3 /* SourceMaps */, hint, node);
emitSourceMapsBeforeNode(node);
pipelinePhase(hint, node);
emitSourceMapsAfterNode(node);
}
function emitSourceMapsBeforeNode(node) {
const emitFlags = getEmitFlags(node);
const sourceMapRange = getSourceMapRange(node);
if (isUnparsedNode(node)) {
Debug.assertIsDefined(node.parent, "UnparsedNodes must have parent pointers");
const parsed = getParsedSourceMap(node.parent);
if (parsed && sourceMapGenerator) {
sourceMapGenerator.appendSourceMap(
writer.getLine(),
writer.getColumn(),
parsed,
node.parent.sourceMapPath,
node.parent.getLineAndCharacterOfPosition(node.pos),
node.parent.getLineAndCharacterOfPosition(node.end)
);
}
} else {
const source = sourceMapRange.source || sourceMapSource;
if (node.kind !== 358 /* NotEmittedStatement */ && (emitFlags & 32 /* NoLeadingSourceMap */) === 0 && sourceMapRange.pos >= 0) {
emitSourcePos(sourceMapRange.source || sourceMapSource, skipSourceTrivia(source, sourceMapRange.pos));
}
if (emitFlags & 128 /* NoNestedSourceMaps */) {
sourceMapsDisabled = true;
}
}
}
function emitSourceMapsAfterNode(node) {
const emitFlags = getEmitFlags(node);
const sourceMapRange = getSourceMapRange(node);
if (!isUnparsedNode(node)) {
if (emitFlags & 128 /* NoNestedSourceMaps */) {
sourceMapsDisabled = false;
}
if (node.kind !== 358 /* NotEmittedStatement */ && (emitFlags & 64 /* NoTrailingSourceMap */) === 0 && sourceMapRange.end >= 0) {
emitSourcePos(sourceMapRange.source || sourceMapSource, sourceMapRange.end);
}
}
}
function skipSourceTrivia(source, pos) {
return source.skipTrivia ? source.skipTrivia(pos) : skipTrivia(source.text, pos);
}
function emitPos(pos) {
if (sourceMapsDisabled || positionIsSynthesized(pos) || isJsonSourceMapSource(sourceMapSource)) {
return;
}
const { line: sourceLine, character: sourceCharacter } = getLineAndCharacterOfPosition(sourceMapSource, pos);
sourceMapGenerator.addMapping(
writer.getLine(),
writer.getColumn(),
sourceMapSourceIndex,
sourceLine,
sourceCharacter,
/*nameIndex*/
void 0
);
}
function emitSourcePos(source, pos) {
if (source !== sourceMapSource) {
const savedSourceMapSource = sourceMapSource;
const savedSourceMapSourceIndex = sourceMapSourceIndex;
setSourceMapSource(source);
emitPos(pos);
resetSourceMapSource(savedSourceMapSource, savedSourceMapSourceIndex);
} else {
emitPos(pos);
}
}
function emitTokenWithSourceMap(node, token, writer2, tokenPos, emitCallback) {
if (sourceMapsDisabled || node && isInJsonFile(node)) {
return emitCallback(token, writer2, tokenPos);
}
const emitNode = node && node.emitNode;
const emitFlags = emitNode && emitNode.flags || 0 /* None */;
const range = emitNode && emitNode.tokenSourceMapRanges && emitNode.tokenSourceMapRanges[token];
const source = range && range.source || sourceMapSource;
tokenPos = skipSourceTrivia(source, range ? range.pos : tokenPos);
if ((emitFlags & 256 /* NoTokenLeadingSourceMaps */) === 0 && tokenPos >= 0) {
emitSourcePos(source, tokenPos);
}
tokenPos = emitCallback(token, writer2, tokenPos);
if (range)
tokenPos = range.end;
if ((emitFlags & 512 /* NoTokenTrailingSourceMaps */) === 0 && tokenPos >= 0) {
emitSourcePos(source, tokenPos);
}
return tokenPos;
}
function setSourceMapSource(source) {
if (sourceMapsDisabled) {
return;
}
sourceMapSource = source;
if (source === mostRecentlyAddedSourceMapSource) {
sourceMapSourceIndex = mostRecentlyAddedSourceMapSourceIndex;
return;
}
if (isJsonSourceMapSource(source)) {
return;
}
sourceMapSourceIndex = sourceMapGenerator.addSource(source.fileName);
if (printerOptions.inlineSources) {
sourceMapGenerator.setSourceContent(sourceMapSourceIndex, source.text);
}
mostRecentlyAddedSourceMapSource = source;
mostRecentlyAddedSourceMapSourceIndex = sourceMapSourceIndex;
}
function resetSourceMapSource(source, sourceIndex) {
sourceMapSource = source;
sourceMapSourceIndex = sourceIndex;
}
function isJsonSourceMapSource(sourceFile) {
return fileExtensionIs(sourceFile.fileName, ".json" /* Json */);
}
}
function createBracketsMap() {
const brackets2 = [];
brackets2[1024 /* Braces */] = ["{", "}"];
brackets2[2048 /* Parenthesis */] = ["(", ")"];
brackets2[4096 /* AngleBrackets */] = ["<", ">"];
brackets2[8192 /* SquareBrackets */] = ["[", "]"];
return brackets2;
}
function getOpeningBracket(format) {
return brackets[format & 15360 /* BracketsMask */][0];
}
function getClosingBracket(format) {
return brackets[format & 15360 /* BracketsMask */][1];
}
function emitListItemNoParenthesizer(node, emit, _parenthesizerRule, _index) {
emit(node);
}
function emitListItemWithParenthesizerRuleSelector(node, emit, parenthesizerRuleSelector, index) {
emit(node, parenthesizerRuleSelector.select(index));
}
function emitListItemWithParenthesizerRule(node, emit, parenthesizerRule, _index) {
emit(node, parenthesizerRule);
}
function getEmitListItem(emit, parenthesizerRule) {
return emit.length === 1 ? emitListItemNoParenthesizer : typeof parenthesizerRule === "object" ? emitListItemWithParenthesizerRuleSelector : emitListItemWithParenthesizerRule;
}
// src/compiler/watchUtilities.ts
function createCachedDirectoryStructureHost(host, currentDirectory, useCaseSensitiveFileNames) {
if (!host.getDirectories || !host.readDirectory) {
return void 0;
}
const cachedReadDirectoryResult = /* @__PURE__ */ new Map();
const getCanonicalFileName = createGetCanonicalFileName(useCaseSensitiveFileNames);
return {
useCaseSensitiveFileNames,
fileExists,
readFile: (path, encoding) => host.readFile(path, encoding),
directoryExists: host.directoryExists && directoryExists,
getDirectories,
readDirectory,
createDirectory: host.createDirectory && createDirectory,
writeFile: host.writeFile && writeFile2,
addOrDeleteFileOrDirectory,
addOrDeleteFile,
clearCache,
realpath: host.realpath && realpath
};
function toPath3(fileName) {
return toPath(fileName, currentDirectory, getCanonicalFileName);
}
function getCachedFileSystemEntries(rootDirPath) {
return cachedReadDirectoryResult.get(ensureTrailingDirectorySeparator(rootDirPath));
}
function getCachedFileSystemEntriesForBaseDir(path) {
const entries = getCachedFileSystemEntries(getDirectoryPath(path));
if (!entries) {
return entries;
}
if (!entries.sortedAndCanonicalizedFiles) {
entries.sortedAndCanonicalizedFiles = entries.files.map(getCanonicalFileName).sort();
entries.sortedAndCanonicalizedDirectories = entries.directories.map(getCanonicalFileName).sort();
}
return entries;
}
function getBaseNameOfFileName(fileName) {
return getBaseFileName(normalizePath(fileName));
}
function createCachedFileSystemEntries(rootDir, rootDirPath) {
var _a;
if (!host.realpath || ensureTrailingDirectorySeparator(toPath3(host.realpath(rootDir))) === rootDirPath) {
const resultFromHost = {
files: map(host.readDirectory(
rootDir,
/*extensions*/
void 0,
/*exclude*/
void 0,
/*include*/
["*.*"]
), getBaseNameOfFileName) || [],
directories: host.getDirectories(rootDir) || []
};
cachedReadDirectoryResult.set(ensureTrailingDirectorySeparator(rootDirPath), resultFromHost);
return resultFromHost;
}
if ((_a = host.directoryExists) == null ? void 0 : _a.call(host, rootDir)) {
cachedReadDirectoryResult.set(rootDirPath, false);
return false;
}
return void 0;
}
function tryReadDirectory(rootDir, rootDirPath) {
rootDirPath = ensureTrailingDirectorySeparator(rootDirPath);
const cachedResult = getCachedFileSystemEntries(rootDirPath);
if (cachedResult) {
return cachedResult;
}
try {
return createCachedFileSystemEntries(rootDir, rootDirPath);
} catch (_e) {
Debug.assert(!cachedReadDirectoryResult.has(ensureTrailingDirectorySeparator(rootDirPath)));
return void 0;
}
}
function hasEntry(entries, name) {
const index = binarySearch(entries, name, identity, compareStringsCaseSensitive);
return index >= 0;
}
function writeFile2(fileName, data, writeByteOrderMark) {
const path = toPath3(fileName);
const result = getCachedFileSystemEntriesForBaseDir(path);
if (result) {
updateFilesOfFileSystemEntry(
result,
getBaseNameOfFileName(fileName),
/*fileExists*/
true
);
}
return host.writeFile(fileName, data, writeByteOrderMark);
}
function fileExists(fileName) {
const path = toPath3(fileName);
const result = getCachedFileSystemEntriesForBaseDir(path);
return result && hasEntry(result.sortedAndCanonicalizedFiles, getCanonicalFileName(getBaseNameOfFileName(fileName))) || host.fileExists(fileName);
}
function directoryExists(dirPath) {
const path = toPath3(dirPath);
return cachedReadDirectoryResult.has(ensureTrailingDirectorySeparator(path)) || host.directoryExists(dirPath);
}
function createDirectory(dirPath) {
const path = toPath3(dirPath);
const result = getCachedFileSystemEntriesForBaseDir(path);
if (result) {
const baseName = getBaseNameOfFileName(dirPath);
const canonicalizedBaseName = getCanonicalFileName(baseName);
const canonicalizedDirectories = result.sortedAndCanonicalizedDirectories;
if (insertSorted(canonicalizedDirectories, canonicalizedBaseName, compareStringsCaseSensitive)) {
result.directories.push(baseName);
}
}
host.createDirectory(dirPath);
}
function getDirectories(rootDir) {
const rootDirPath = toPath3(rootDir);
const result = tryReadDirectory(rootDir, rootDirPath);
if (result) {
return result.directories.slice();
}
return host.getDirectories(rootDir);
}
function readDirectory(rootDir, extensions, excludes, includes, depth) {
const rootDirPath = toPath3(rootDir);
const rootResult = tryReadDirectory(rootDir, rootDirPath);
let rootSymLinkResult;
if (rootResult !== void 0) {
return matchFiles(rootDir, extensions, excludes, includes, useCaseSensitiveFileNames, currentDirectory, depth, getFileSystemEntries, realpath);
}
return host.readDirectory(rootDir, extensions, excludes, includes, depth);
function getFileSystemEntries(dir) {
const path = toPath3(dir);
if (path === rootDirPath) {
return rootResult || getFileSystemEntriesFromHost(dir, path);
}
const result = tryReadDirectory(dir, path);
return result !== void 0 ? result || getFileSystemEntriesFromHost(dir, path) : emptyFileSystemEntries;
}
function getFileSystemEntriesFromHost(dir, path) {
if (rootSymLinkResult && path === rootDirPath)
return rootSymLinkResult;
const result = {
files: map(host.readDirectory(
dir,
/*extensions*/
void 0,
/*exclude*/
void 0,
/*include*/
["*.*"]
), getBaseNameOfFileName) || emptyArray,
directories: host.getDirectories(dir) || emptyArray
};
if (path === rootDirPath)
rootSymLinkResult = result;
return result;
}
}
function realpath(s) {
return host.realpath ? host.realpath(s) : s;
}
function addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath) {
const existingResult = getCachedFileSystemEntries(fileOrDirectoryPath);
if (existingResult !== void 0) {
clearCache();
return void 0;
}
const parentResult = getCachedFileSystemEntriesForBaseDir(fileOrDirectoryPath);
if (!parentResult) {
return void 0;
}
if (!host.directoryExists) {
clearCache();
return void 0;
}
const baseName = getBaseNameOfFileName(fileOrDirectory);
const fsQueryResult = {
fileExists: host.fileExists(fileOrDirectoryPath),
directoryExists: host.directoryExists(fileOrDirectoryPath)
};
if (fsQueryResult.directoryExists || hasEntry(parentResult.sortedAndCanonicalizedDirectories, getCanonicalFileName(baseName))) {
clearCache();
} else {
updateFilesOfFileSystemEntry(parentResult, baseName, fsQueryResult.fileExists);
}
return fsQueryResult;
}
function addOrDeleteFile(fileName, filePath, eventKind) {
if (eventKind === 1 /* Changed */) {
return;
}
const parentResult = getCachedFileSystemEntriesForBaseDir(filePath);
if (parentResult) {
updateFilesOfFileSystemEntry(parentResult, getBaseNameOfFileName(fileName), eventKind === 0 /* Created */);
}
}
function updateFilesOfFileSystemEntry(parentResult, baseName, fileExists2) {
const canonicalizedFiles = parentResult.sortedAndCanonicalizedFiles;
const canonicalizedBaseName = getCanonicalFileName(baseName);
if (fileExists2) {
if (insertSorted(canonicalizedFiles, canonicalizedBaseName, compareStringsCaseSensitive)) {
parentResult.files.push(baseName);
}
} else {
const sortedIndex = binarySearch(canonicalizedFiles, canonicalizedBaseName, identity, compareStringsCaseSensitive);
if (sortedIndex >= 0) {
canonicalizedFiles.splice(sortedIndex, 1);
const unsortedIndex = parentResult.files.findIndex((entry) => getCanonicalFileName(entry) === canonicalizedBaseName);
parentResult.files.splice(unsortedIndex, 1);
}
}
}
function clearCache() {
cachedReadDirectoryResult.clear();
}
}
function updateSharedExtendedConfigFileWatcher(projectPath, options, extendedConfigFilesMap, createExtendedConfigFileWatch, toPath3) {
var _a;
const extendedConfigs = arrayToMap(((_a = options == null ? void 0 : options.configFile) == null ? void 0 : _a.extendedSourceFiles) || emptyArray, toPath3);
extendedConfigFilesMap.forEach((watcher, extendedConfigFilePath) => {
if (!extendedConfigs.has(extendedConfigFilePath)) {
watcher.projects.delete(projectPath);
watcher.close();
}
});
extendedConfigs.forEach((extendedConfigFileName, extendedConfigFilePath) => {
const existing = extendedConfigFilesMap.get(extendedConfigFilePath);
if (existing) {
existing.projects.add(projectPath);
} else {
extendedConfigFilesMap.set(extendedConfigFilePath, {
projects: /* @__PURE__ */ new Set([projectPath]),
watcher: createExtendedConfigFileWatch(extendedConfigFileName, extendedConfigFilePath),
close: () => {
const existing2 = extendedConfigFilesMap.get(extendedConfigFilePath);
if (!existing2 || existing2.projects.size !== 0)
return;
existing2.watcher.close();
extendedConfigFilesMap.delete(extendedConfigFilePath);
}
});
}
});
}
function clearSharedExtendedConfigFileWatcher(projectPath, extendedConfigFilesMap) {
extendedConfigFilesMap.forEach((watcher) => {
if (watcher.projects.delete(projectPath))
watcher.close();
});
}
function cleanExtendedConfigCache(extendedConfigCache, extendedConfigFilePath, toPath3) {
if (!extendedConfigCache.delete(extendedConfigFilePath))
return;
extendedConfigCache.forEach(({ extendedResult }, key) => {
var _a;
if ((_a = extendedResult.extendedSourceFiles) == null ? void 0 : _a.some((extendedFile) => toPath3(extendedFile) === extendedConfigFilePath)) {
cleanExtendedConfigCache(extendedConfigCache, key, toPath3);
}
});
}
function updateMissingFilePathsWatch(program, missingFileWatches, createMissingFileWatch) {
const missingFilePaths = program.getMissingFilePaths();
const newMissingFilePathMap = arrayToMap(missingFilePaths, identity, returnTrue);
mutateMap(
missingFileWatches,
newMissingFilePathMap,
{
// Watch the missing files
createNewValue: createMissingFileWatch,
// Files that are no longer missing (e.g. because they are no longer required)
// should no longer be watched.
onDeleteValue: closeFileWatcher
}
);
}
function updateWatchingWildcardDirectories(existingWatchedForWildcards, wildcardDirectories, watchDirectory) {
mutateMap(
existingWatchedForWildcards,
wildcardDirectories,
{
// Create new watch and recursive info
createNewValue: createWildcardDirectoryWatcher,
// Close existing watch thats not needed any more
onDeleteValue: closeFileWatcherOf,
// Close existing watch that doesnt match in the flags
onExistingValue: updateWildcardDirectoryWatcher
}
);
function createWildcardDirectoryWatcher(directory, flags) {
return {
watcher: watchDirectory(directory, flags),
flags
};
}
function updateWildcardDirectoryWatcher(existingWatcher, flags, directory) {
if (existingWatcher.flags === flags) {
return;
}
existingWatcher.watcher.close();
existingWatchedForWildcards.set(directory, createWildcardDirectoryWatcher(directory, flags));
}
}
function isIgnoredFileFromWildCardWatching({
watchedDirPath,
fileOrDirectory,
fileOrDirectoryPath,
configFileName,
options,
program,
extraFileExtensions,
currentDirectory,
useCaseSensitiveFileNames,
writeLog,
toPath: toPath3
}) {
const newPath = removeIgnoredPath(fileOrDirectoryPath);
if (!newPath) {
writeLog(`Project: ${configFileName} Detected ignored path: ${fileOrDirectory}`);
return true;
}
fileOrDirectoryPath = newPath;
if (fileOrDirectoryPath === watchedDirPath)
return false;
if (hasExtension(fileOrDirectoryPath) && !isSupportedSourceFileName(fileOrDirectory, options, extraFileExtensions)) {
writeLog(`Project: ${configFileName} Detected file add/remove of non supported extension: ${fileOrDirectory}`);
return true;
}
if (isExcludedFile(fileOrDirectory, options.configFile.configFileSpecs, getNormalizedAbsolutePath(getDirectoryPath(configFileName), currentDirectory), useCaseSensitiveFileNames, currentDirectory)) {
writeLog(`Project: ${configFileName} Detected excluded file: ${fileOrDirectory}`);
return true;
}
if (!program)
return false;
if (outFile(options) || options.outDir)
return false;
if (isDeclarationFileName(fileOrDirectoryPath)) {
if (options.declarationDir)
return false;
} else if (!fileExtensionIsOneOf(fileOrDirectoryPath, supportedJSExtensionsFlat)) {
return false;
}
const filePathWithoutExtension = removeFileExtension(fileOrDirectoryPath);
const realProgram = isArray(program) ? void 0 : isBuilderProgram(program) ? program.getProgramOrUndefined() : program;
const builderProgram = !realProgram && !isArray(program) ? program : void 0;
if (hasSourceFile(filePathWithoutExtension + ".ts" /* Ts */) || hasSourceFile(filePathWithoutExtension + ".tsx" /* Tsx */)) {
writeLog(`Project: ${configFileName} Detected output file: ${fileOrDirectory}`);
return true;
}
return false;
function hasSourceFile(file) {
return realProgram ? !!realProgram.getSourceFileByPath(file) : builderProgram ? builderProgram.getState().fileInfos.has(file) : !!find(program, (rootFile) => toPath3(rootFile) === file);
}
}
function isBuilderProgram(program) {
return !!program.getState;
}
function isEmittedFileOfProgram(program, file) {
if (!program) {
return false;
}
return program.isEmittedFile(file);
}
function getWatchFactory(host, watchLogLevel, log, getDetailWatchInfo) {
setSysLog(watchLogLevel === 2 /* Verbose */ ? log : noop);
const plainInvokeFactory = {
watchFile: (file, callback, pollingInterval, options) => host.watchFile(file, callback, pollingInterval, options),
watchDirectory: (directory, callback, flags, options) => host.watchDirectory(directory, callback, (flags & 1 /* Recursive */) !== 0, options)
};
const triggerInvokingFactory = watchLogLevel !== 0 /* None */ ? {
watchFile: createTriggerLoggingAddWatch("watchFile"),
watchDirectory: createTriggerLoggingAddWatch("watchDirectory")
} : void 0;
const factory2 = watchLogLevel === 2 /* Verbose */ ? {
watchFile: createFileWatcherWithLogging,
watchDirectory: createDirectoryWatcherWithLogging
} : triggerInvokingFactory || plainInvokeFactory;
const excludeWatcherFactory = watchLogLevel === 2 /* Verbose */ ? createExcludeWatcherWithLogging : returnNoopFileWatcher;
return {
watchFile: createExcludeHandlingAddWatch("watchFile"),
watchDirectory: createExcludeHandlingAddWatch("watchDirectory")
};
function createExcludeHandlingAddWatch(key) {
return (file, cb, flags, options, detailInfo1, detailInfo2) => {
var _a;
return !matchesExclude(file, key === "watchFile" ? options == null ? void 0 : options.excludeFiles : options == null ? void 0 : options.excludeDirectories, useCaseSensitiveFileNames(), ((_a = host.getCurrentDirectory) == null ? void 0 : _a.call(host)) || "") ? factory2[key].call(
/*thisArgs*/
void 0,
file,
cb,
flags,
options,
detailInfo1,
detailInfo2
) : excludeWatcherFactory(file, flags, options, detailInfo1, detailInfo2);
};
}
function useCaseSensitiveFileNames() {
return typeof host.useCaseSensitiveFileNames === "boolean" ? host.useCaseSensitiveFileNames : host.useCaseSensitiveFileNames();
}
function createExcludeWatcherWithLogging(file, flags, options, detailInfo1, detailInfo2) {
log(`ExcludeWatcher:: Added:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`);
return {
close: () => log(`ExcludeWatcher:: Close:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`)
};
}
function createFileWatcherWithLogging(file, cb, flags, options, detailInfo1, detailInfo2) {
log(`FileWatcher:: Added:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`);
const watcher = triggerInvokingFactory.watchFile(file, cb, flags, options, detailInfo1, detailInfo2);
return {
close: () => {
log(`FileWatcher:: Close:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`);
watcher.close();
}
};
}
function createDirectoryWatcherWithLogging(file, cb, flags, options, detailInfo1, detailInfo2) {
const watchInfo = `DirectoryWatcher:: Added:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`;
log(watchInfo);
const start = timestamp();
const watcher = triggerInvokingFactory.watchDirectory(file, cb, flags, options, detailInfo1, detailInfo2);
const elapsed = timestamp() - start;
log(`Elapsed:: ${elapsed}ms ${watchInfo}`);
return {
close: () => {
const watchInfo2 = `DirectoryWatcher:: Close:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`;
log(watchInfo2);
const start2 = timestamp();
watcher.close();
const elapsed2 = timestamp() - start2;
log(`Elapsed:: ${elapsed2}ms ${watchInfo2}`);
}
};
}
function createTriggerLoggingAddWatch(key) {
return (file, cb, flags, options, detailInfo1, detailInfo2) => plainInvokeFactory[key].call(
/*thisArgs*/
void 0,
file,
(...args) => {
const triggerredInfo = `${key === "watchFile" ? "FileWatcher" : "DirectoryWatcher"}:: Triggered with ${args[0]} ${args[1] !== void 0 ? args[1] : ""}:: ${getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)}`;
log(triggerredInfo);
const start = timestamp();
cb.call(
/*thisArg*/
void 0,
...args
);
const elapsed = timestamp() - start;
log(`Elapsed:: ${elapsed}ms ${triggerredInfo}`);
},
flags,
options,
detailInfo1,
detailInfo2
);
}
function getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo2) {
return `WatchInfo: ${file} ${flags} ${JSON.stringify(options)} ${getDetailWatchInfo2 ? getDetailWatchInfo2(detailInfo1, detailInfo2) : detailInfo2 === void 0 ? detailInfo1 : `${detailInfo1} ${detailInfo2}`}`;
}
}
function getFallbackOptions(options) {
const fallbackPolling = options == null ? void 0 : options.fallbackPolling;
return {
watchFile: fallbackPolling !== void 0 ? fallbackPolling : 1 /* PriorityPollingInterval */
};
}
function closeFileWatcherOf(objWithWatcher) {
objWithWatcher.watcher.close();
}
// src/compiler/program.ts
function findConfigFile(searchPath, fileExists, configName = "tsconfig.json") {
return forEachAncestorDirectory(searchPath, (ancestor) => {
const fileName = combinePaths(ancestor, configName);
return fileExists(fileName) ? fileName : void 0;
});
}
function resolveTripleslashReference(moduleName, containingFile) {
const basePath = getDirectoryPath(containingFile);
const referencedFileName = isRootedDiskPath(moduleName) ? moduleName : combinePaths(basePath, moduleName);
return normalizePath(referencedFileName);
}
function computeCommonSourceDirectoryOfFilenames(fileNames, currentDirectory, getCanonicalFileName) {
let commonPathComponents;
const failed = forEach(fileNames, (sourceFile) => {
const sourcePathComponents = getNormalizedPathComponents(sourceFile, currentDirectory);
sourcePathComponents.pop();
if (!commonPathComponents) {
commonPathComponents = sourcePathComponents;
return;
}
const n = Math.min(commonPathComponents.length, sourcePathComponents.length);
for (let i = 0; i < n; i++) {
if (getCanonicalFileName(commonPathComponents[i]) !== getCanonicalFileName(sourcePathComponents[i])) {
if (i === 0) {
return true;
}
commonPathComponents.length = i;
break;
}
}
if (sourcePathComponents.length < commonPathComponents.length) {
commonPathComponents.length = sourcePathComponents.length;
}
});
if (failed) {
return "";
}
if (!commonPathComponents) {
return currentDirectory;
}
return getPathFromPathComponents(commonPathComponents);
}
function createCompilerHost(options, setParentNodes) {
return createCompilerHostWorker(options, setParentNodes);
}
function createGetSourceFile(readFile, getCompilerOptions, setParentNodes) {
return (fileName, languageVersionOrOptions, onError) => {
let text;
try {
mark("beforeIORead");
text = readFile(fileName, getCompilerOptions().charset);
mark("afterIORead");
measure("I/O Read", "beforeIORead", "afterIORead");
} catch (e) {
if (onError) {
onError(e.message);
}
text = "";
}
return text !== void 0 ? createSourceFile(fileName, text, languageVersionOrOptions, setParentNodes) : void 0;
};
}
function createWriteFileMeasuringIO(actualWriteFile, createDirectory, directoryExists) {
return (fileName, data, writeByteOrderMark, onError) => {
try {
mark("beforeIOWrite");
writeFileEnsuringDirectories(
fileName,
data,
writeByteOrderMark,
actualWriteFile,
createDirectory,
directoryExists
);
mark("afterIOWrite");
measure("I/O Write", "beforeIOWrite", "afterIOWrite");
} catch (e) {
if (onError) {
onError(e.message);
}
}
};
}
function createCompilerHostWorker(options, setParentNodes, system = sys) {
const existingDirectories = /* @__PURE__ */ new Map();
const getCanonicalFileName = createGetCanonicalFileName(system.useCaseSensitiveFileNames);
function directoryExists(directoryPath) {
if (existingDirectories.has(directoryPath)) {
return true;
}
if ((compilerHost.directoryExists || system.directoryExists)(directoryPath)) {
existingDirectories.set(directoryPath, true);
return true;
}
return false;
}
function getDefaultLibLocation() {
return getDirectoryPath(normalizePath(system.getExecutingFilePath()));
}
const newLine = getNewLineCharacter(options);
const realpath = system.realpath && ((path) => system.realpath(path));
const compilerHost = {
getSourceFile: createGetSourceFile((fileName) => compilerHost.readFile(fileName), () => options, setParentNodes),
getDefaultLibLocation,
getDefaultLibFileName: (options2) => combinePaths(getDefaultLibLocation(), getDefaultLibFileName(options2)),
writeFile: createWriteFileMeasuringIO(
(path, data, writeByteOrderMark) => system.writeFile(path, data, writeByteOrderMark),
(path) => (compilerHost.createDirectory || system.createDirectory)(path),
(path) => directoryExists(path)
),
getCurrentDirectory: memoize(() => system.getCurrentDirectory()),
useCaseSensitiveFileNames: () => system.useCaseSensitiveFileNames,
getCanonicalFileName,
getNewLine: () => newLine,
fileExists: (fileName) => system.fileExists(fileName),
readFile: (fileName) => system.readFile(fileName),
trace: (s) => system.write(s + newLine),
directoryExists: (directoryName) => system.directoryExists(directoryName),
getEnvironmentVariable: (name) => system.getEnvironmentVariable ? system.getEnvironmentVariable(name) : "",
getDirectories: (path) => system.getDirectories(path),
realpath,
readDirectory: (path, extensions, include, exclude, depth) => system.readDirectory(path, extensions, include, exclude, depth),
createDirectory: (d) => system.createDirectory(d),
createHash: maybeBind(system, system.createHash)
};
return compilerHost;
}
function changeCompilerHostLikeToUseCache(host, toPath3, getSourceFile) {
const originalReadFile = host.readFile;
const originalFileExists = host.fileExists;
const originalDirectoryExists = host.directoryExists;
const originalCreateDirectory = host.createDirectory;
const originalWriteFile = host.writeFile;
const readFileCache = /* @__PURE__ */ new Map();
const fileExistsCache = /* @__PURE__ */ new Map();
const directoryExistsCache = /* @__PURE__ */ new Map();
const sourceFileCache = /* @__PURE__ */ new Map();
const readFileWithCache = (fileName) => {
const key = toPath3(fileName);
const value = readFileCache.get(key);
if (value !== void 0)
return value !== false ? value : void 0;
return setReadFileCache(key, fileName);
};
const setReadFileCache = (key, fileName) => {
const newValue = originalReadFile.call(host, fileName);
readFileCache.set(key, newValue !== void 0 ? newValue : false);
return newValue;
};
host.readFile = (fileName) => {
const key = toPath3(fileName);
const value = readFileCache.get(key);
if (value !== void 0)
return value !== false ? value : void 0;
if (!fileExtensionIs(fileName, ".json" /* Json */) && !isBuildInfoFile(fileName)) {
return originalReadFile.call(host, fileName);
}
return setReadFileCache(key, fileName);
};
const getSourceFileWithCache = getSourceFile ? (fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile) => {
const key = toPath3(fileName);
const impliedNodeFormat = typeof languageVersionOrOptions === "object" ? languageVersionOrOptions.impliedNodeFormat : void 0;
const forImpliedNodeFormat = sourceFileCache.get(impliedNodeFormat);
const value = forImpliedNodeFormat == null ? void 0 : forImpliedNodeFormat.get(key);
if (value)
return value;
const sourceFile = getSourceFile(fileName, languageVersionOrOptions, onError, shouldCreateNewSourceFile);
if (sourceFile && (isDeclarationFileName(fileName) || fileExtensionIs(fileName, ".json" /* Json */))) {
sourceFileCache.set(impliedNodeFormat, (forImpliedNodeFormat || /* @__PURE__ */ new Map()).set(key, sourceFile));
}
return sourceFile;
} : void 0;
host.fileExists = (fileName) => {
const key = toPath3(fileName);
const value = fileExistsCache.get(key);
if (value !== void 0)
return value;
const newValue = originalFileExists.call(host, fileName);
fileExistsCache.set(key, !!newValue);
return newValue;
};
if (originalWriteFile) {
host.writeFile = (fileName, data, ...rest) => {
const key = toPath3(fileName);
fileExistsCache.delete(key);
const value = readFileCache.get(key);
if (value !== void 0 && value !== data) {
readFileCache.delete(key);
sourceFileCache.forEach((map2) => map2.delete(key));
} else if (getSourceFileWithCache) {
sourceFileCache.forEach((map2) => {
const sourceFile = map2.get(key);
if (sourceFile && sourceFile.text !== data) {
map2.delete(key);
}
});
}
originalWriteFile.call(host, fileName, data, ...rest);
};
}
if (originalDirectoryExists) {
host.directoryExists = (directory) => {
const key = toPath3(directory);
const value = directoryExistsCache.get(key);
if (value !== void 0)
return value;
const newValue = originalDirectoryExists.call(host, directory);
directoryExistsCache.set(key, !!newValue);
return newValue;
};
if (originalCreateDirectory) {
host.createDirectory = (directory) => {
const key = toPath3(directory);
directoryExistsCache.delete(key);
originalCreateDirectory.call(host, directory);
};
}
}
return {
originalReadFile,
originalFileExists,
originalDirectoryExists,
originalCreateDirectory,
originalWriteFile,
getSourceFileWithCache,
readFileWithCache
};
}
function formatDiagnostic(diagnostic, host) {
const errorMessage = `${diagnosticCategoryName(diagnostic)} TS${diagnostic.code}: ${flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine())}${host.getNewLine()}`;
if (diagnostic.file) {
const { line, character } = getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
const fileName = diagnostic.file.fileName;
const relativeFileName = convertToRelativePath(fileName, host.getCurrentDirectory(), (fileName2) => host.getCanonicalFileName(fileName2));
return `${relativeFileName}(${line + 1},${character + 1}): ` + errorMessage;
}
return errorMessage;
}
var gutterStyleSequence = "\x1B[7m";
var gutterSeparator = " ";
var resetEscapeSequence = "\x1B[0m";
var ellipsis = "...";
var halfIndent = " ";
var indent = " ";
function getCategoryFormat(category) {
switch (category) {
case 1 /* Error */:
return "\x1B[91m" /* Red */;
case 0 /* Warning */:
return "\x1B[93m" /* Yellow */;
case 2 /* Suggestion */:
return Debug.fail("Should never get an Info diagnostic on the command line.");
case 3 /* Message */:
return "\x1B[94m" /* Blue */;
}
}
function formatColorAndReset(text, formatStyle) {
return formatStyle + text + resetEscapeSequence;
}
function formatCodeSpan(file, start, length2, indent2, squiggleColor, host) {
const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start);
const { line: lastLine, character: lastLineChar } = getLineAndCharacterOfPosition(file, start + length2);
const lastLineInFile = getLineAndCharacterOfPosition(file, file.text.length).line;
const hasMoreThanFiveLines = lastLine - firstLine >= 4;
let gutterWidth = (lastLine + 1 + "").length;
if (hasMoreThanFiveLines) {
gutterWidth = Math.max(ellipsis.length, gutterWidth);
}
let context = "";
for (let i = firstLine; i <= lastLine; i++) {
context += host.getNewLine();
if (hasMoreThanFiveLines && firstLine + 1 < i && i < lastLine - 1) {
context += indent2 + formatColorAndReset(padLeft(ellipsis, gutterWidth), gutterStyleSequence) + gutterSeparator + host.getNewLine();
i = lastLine - 1;
}
const lineStart = getPositionOfLineAndCharacter(file, i, 0);
const lineEnd = i < lastLineInFile ? getPositionOfLineAndCharacter(file, i + 1, 0) : file.text.length;
let lineContent = file.text.slice(lineStart, lineEnd);
lineContent = trimStringEnd(lineContent);
lineContent = lineContent.replace(/\t/g, " ");
context += indent2 + formatColorAndReset(padLeft(i + 1 + "", gutterWidth), gutterStyleSequence) + gutterSeparator;
context += lineContent + host.getNewLine();
context += indent2 + formatColorAndReset(padLeft("", gutterWidth), gutterStyleSequence) + gutterSeparator;
context += squiggleColor;
if (i === firstLine) {
const lastCharForLine = i === lastLine ? lastLineChar : void 0;
context += lineContent.slice(0, firstLineChar).replace(/\S/g, " ");
context += lineContent.slice(firstLineChar, lastCharForLine).replace(/./g, "~");
} else if (i === lastLine) {
context += lineContent.slice(0, lastLineChar).replace(/./g, "~");
} else {
context += lineContent.replace(/./g, "~");
}
context += resetEscapeSequence;
}
return context;
}
function formatLocation(file, start, host, color = formatColorAndReset) {
const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start);
const relativeFileName = host ? convertToRelativePath(file.fileName, host.getCurrentDirectory(), (fileName) => host.getCanonicalFileName(fileName)) : file.fileName;
let output = "";
output += color(relativeFileName, "\x1B[96m" /* Cyan */);
output += ":";
output += color(`${firstLine + 1}`, "\x1B[93m" /* Yellow */);
output += ":";
output += color(`${firstLineChar + 1}`, "\x1B[93m" /* Yellow */);
return output;
}
function formatDiagnosticsWithColorAndContext(diagnostics, host) {
let output = "";
for (const diagnostic of diagnostics) {
if (diagnostic.file) {
const { file, start } = diagnostic;
output += formatLocation(file, start, host);
output += " - ";
}
output += formatColorAndReset(diagnosticCategoryName(diagnostic), getCategoryFormat(diagnostic.category));
output += formatColorAndReset(` TS${diagnostic.code}: `, "\x1B[90m" /* Grey */);
output += flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine());
if (diagnostic.file && diagnostic.code !== Diagnostics.File_appears_to_be_binary.code) {
output += host.getNewLine();
output += formatCodeSpan(diagnostic.file, diagnostic.start, diagnostic.length, "", getCategoryFormat(diagnostic.category), host);
}
if (diagnostic.relatedInformation) {
output += host.getNewLine();
for (const { file, start, length: length2, messageText } of diagnostic.relatedInformation) {
if (file) {
output += host.getNewLine();
output += halfIndent + formatLocation(file, start, host);
output += formatCodeSpan(file, start, length2, indent, "\x1B[96m" /* Cyan */, host);
}
output += host.getNewLine();
output += indent + flattenDiagnosticMessageText(messageText, host.getNewLine());
}
}
output += host.getNewLine();
}
return output;
}
function flattenDiagnosticMessageText(diag2, newLine, indent2 = 0) {
if (isString(diag2)) {
return diag2;
} else if (diag2 === void 0) {
return "";
}
let result = "";
if (indent2) {
result += newLine;
for (let i = 0; i < indent2; i++) {
result += " ";
}
}
result += diag2.messageText;
indent2++;
if (diag2.next) {
for (const kid of diag2.next) {
result += flattenDiagnosticMessageText(kid, newLine, indent2);
}
}
return result;
}
function getModeForFileReference(ref, containingFileMode) {
return (isString(ref) ? containingFileMode : ref.resolutionMode) || containingFileMode;
}
function getModeForResolutionAtIndex(file, index) {
if (file.impliedNodeFormat === void 0)
return void 0;
return getModeForUsageLocation(file, getModuleNameStringLiteralAt(file, index));
}
function isExclusivelyTypeOnlyImportOrExport(decl) {
var _a;
if (isExportDeclaration(decl)) {
return decl.isTypeOnly;
}
if ((_a = decl.importClause) == null ? void 0 : _a.isTypeOnly) {
return true;
}
return false;
}
function getModeForUsageLocation(file, usage) {
var _a, _b;
if (file.impliedNodeFormat === void 0)
return void 0;
if (isImportDeclaration(usage.parent) || isExportDeclaration(usage.parent)) {
const isTypeOnly = isExclusivelyTypeOnlyImportOrExport(usage.parent);
if (isTypeOnly) {
const override = getResolutionModeOverrideForClause(usage.parent.assertClause);
if (override) {
return override;
}
}
}
if (usage.parent.parent && isImportTypeNode(usage.parent.parent)) {
const override = getResolutionModeOverrideForClause((_a = usage.parent.parent.assertions) == null ? void 0 : _a.assertClause);
if (override) {
return override;
}
}
if (file.impliedNodeFormat !== 99 /* ESNext */) {
return isImportCall(walkUpParenthesizedExpressions(usage.parent)) ? 99 /* ESNext */ : 1 /* CommonJS */;
}
const exprParentParent = (_b = walkUpParenthesizedExpressions(usage.parent)) == null ? void 0 : _b.parent;
return exprParentParent && isImportEqualsDeclaration(exprParentParent) ? 1 /* CommonJS */ : 99 /* ESNext */;
}
function getResolutionModeOverrideForClause(clause, grammarErrorOnNode) {
if (!clause)
return void 0;
if (length(clause.elements) !== 1) {
grammarErrorOnNode == null ? void 0 : grammarErrorOnNode(clause, Diagnostics.Type_import_assertions_should_have_exactly_one_key_resolution_mode_with_value_import_or_require);
return void 0;
}
const elem = clause.elements[0];
if (!isStringLiteralLike(elem.name))
return void 0;
if (elem.name.text !== "resolution-mode") {
grammarErrorOnNode == null ? void 0 : grammarErrorOnNode(elem.name, Diagnostics.resolution_mode_is_the_only_valid_key_for_type_import_assertions);
return void 0;
}
if (!isStringLiteralLike(elem.value))
return void 0;
if (elem.value.text !== "import" && elem.value.text !== "require") {
grammarErrorOnNode == null ? void 0 : grammarErrorOnNode(elem.value, Diagnostics.resolution_mode_should_be_either_require_or_import);
return void 0;
}
return elem.value.text === "import" ? 99 /* ESNext */ : 1 /* CommonJS */;
}
var emptyResolution = {
resolvedModule: void 0,
resolvedTypeReferenceDirective: void 0
};
function getModuleResolutionName(literal) {
return literal.text;
}
var moduleResolutionNameAndModeGetter = {
getName: getModuleResolutionName,
getMode: (entry, file) => getModeForUsageLocation(file, entry)
};
function createModuleResolutionLoader(containingFile, redirectedReference, options, host, cache) {
return {
nameAndMode: moduleResolutionNameAndModeGetter,
resolve: (moduleName, resolutionMode) => resolveModuleName(
moduleName,
containingFile,
options,
host,
cache,
redirectedReference,
resolutionMode
)
};
}
function getTypeReferenceResolutionName(entry) {
return !isString(entry) ? toFileNameLowerCase(entry.fileName) : entry;
}
var typeReferenceResolutionNameAndModeGetter = {
getName: getTypeReferenceResolutionName,
getMode: (entry, file) => getModeForFileReference(entry, file == null ? void 0 : file.impliedNodeFormat)
};
function createTypeReferenceResolutionLoader(containingFile, redirectedReference, options, host, cache) {
return {
nameAndMode: typeReferenceResolutionNameAndModeGetter,
resolve: (typeRef, resoluionMode) => resolveTypeReferenceDirective(
typeRef,
containingFile,
options,
host,
redirectedReference,
cache,
resoluionMode
)
};
}
function loadWithModeAwareCache(entries, containingFile, redirectedReference, options, containingSourceFile, host, resolutionCache, createLoader) {
if (entries.length === 0)
return emptyArray;
const resolutions = [];
const cache = /* @__PURE__ */ new Map();
const loader = createLoader(containingFile, redirectedReference, options, host, resolutionCache);
for (const entry of entries) {
const name = loader.nameAndMode.getName(entry);
const mode = loader.nameAndMode.getMode(entry, containingSourceFile);
const key = createModeAwareCacheKey(name, mode);
let result = cache.get(key);
if (!result) {
cache.set(key, result = loader.resolve(name, mode));
}
resolutions.push(result);
}
return resolutions;
}
function forEachResolvedProjectReference(resolvedProjectReferences, cb) {
return forEachProjectReference(
/*projectReferences*/
void 0,
resolvedProjectReferences,
(resolvedRef, parent) => resolvedRef && cb(resolvedRef, parent)
);
}
function forEachProjectReference(projectReferences, resolvedProjectReferences, cbResolvedRef, cbRef) {
let seenResolvedRefs;
return worker(
projectReferences,
resolvedProjectReferences,
/*parent*/
void 0
);
function worker(projectReferences2, resolvedProjectReferences2, parent) {
if (cbRef) {
const result = cbRef(projectReferences2, parent);
if (result)
return result;
}
return forEach(resolvedProjectReferences2, (resolvedRef, index) => {
if (resolvedRef && (seenResolvedRefs == null ? void 0 : seenResolvedRefs.has(resolvedRef.sourceFile.path))) {
return void 0;
}
const result = cbResolvedRef(resolvedRef, parent, index);
if (result || !resolvedRef)
return result;
(seenResolvedRefs || (seenResolvedRefs = /* @__PURE__ */ new Set())).add(resolvedRef.sourceFile.path);
return worker(resolvedRef.commandLine.projectReferences, resolvedRef.references, resolvedRef);
});
}
}
var inferredTypesContainingFile = "__inferred type names__.ts";
function getInferredLibraryNameResolveFrom(options, currentDirectory, libFileName) {
const containingDirectory = options.configFilePath ? getDirectoryPath(options.configFilePath) : currentDirectory;
return combinePaths(containingDirectory, `__lib_node_modules_lookup_${libFileName}__.ts`);
}
function getLibraryNameFromLibFileName(libFileName) {
const components = libFileName.split(".");
let path = components[1];
let i = 2;
while (components[i] && components[i] !== "d") {
path += (i === 2 ? "/" : "-") + components[i];
i++;
}
return "@typescript/lib-" + path;
}
function getLibFileNameFromLibReference(libReference) {
const libName = toFileNameLowerCase(libReference.fileName);
const libFileName = libMap.get(libName);
return { libName, libFileName };
}
function isReferencedFile(reason) {
switch (reason == null ? void 0 : reason.kind) {
case 3 /* Import */:
case 4 /* ReferenceFile */:
case 5 /* TypeReferenceDirective */:
case 7 /* LibReferenceDirective */:
return true;
default:
return false;
}
}
function isReferenceFileLocation(location) {
return location.pos !== void 0;
}
function getReferencedFileLocation(getSourceFileByPath, ref) {
var _a, _b, _c, _d, _e, _f;
const file = Debug.checkDefined(getSourceFileByPath(ref.file));
const { kind, index } = ref;
let pos, end, packageId, resolutionMode;
switch (kind) {
case 3 /* Import */:
const importLiteral = getModuleNameStringLiteralAt(file, index);
packageId = (_c = (_b = (_a = file.resolvedModules) == null ? void 0 : _a.get(importLiteral.text, getModeForResolutionAtIndex(file, index))) == null ? void 0 : _b.resolvedModule) == null ? void 0 : _c.packageId;
if (importLiteral.pos === -1)
return { file, packageId, text: importLiteral.text };
pos = skipTrivia(file.text, importLiteral.pos);
end = importLiteral.end;
break;
case 4 /* ReferenceFile */:
({ pos, end } = file.referencedFiles[index]);
break;
case 5 /* TypeReferenceDirective */:
({ pos, end, resolutionMode } = file.typeReferenceDirectives[index]);
packageId = (_f = (_e = (_d = file.resolvedTypeReferenceDirectiveNames) == null ? void 0 : _d.get(toFileNameLowerCase(file.typeReferenceDirectives[index].fileName), resolutionMode || file.impliedNodeFormat)) == null ? void 0 : _e.resolvedTypeReferenceDirective) == null ? void 0 : _f.packageId;
break;
case 7 /* LibReferenceDirective */:
({ pos, end } = file.libReferenceDirectives[index]);
break;
default:
return Debug.assertNever(kind);
}
return { file, pos, end, packageId };
}
function isProgramUptoDate(program, rootFileNames, newOptions, getSourceVersion, fileExists, hasInvalidatedResolutions, hasInvalidatedLibResolutions, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences) {
if (!program || (hasChangedAutomaticTypeDirectiveNames == null ? void 0 : hasChangedAutomaticTypeDirectiveNames()))
return false;
if (!arrayIsEqualTo(program.getRootFileNames(), rootFileNames))
return false;
let seenResolvedRefs;
if (!arrayIsEqualTo(program.getProjectReferences(), projectReferences, projectReferenceUptoDate))
return false;
if (program.getSourceFiles().some(sourceFileNotUptoDate))
return false;
if (program.getMissingFilePaths().some(fileExists))
return false;
const currentOptions = program.getCompilerOptions();
if (!compareDataObjects(currentOptions, newOptions))
return false;
if (program.resolvedLibReferences && forEachEntry(program.resolvedLibReferences, (_value, libFileName) => hasInvalidatedLibResolutions(libFileName)))
return false;
if (currentOptions.configFile && newOptions.configFile)
return currentOptions.configFile.text === newOptions.configFile.text;
return true;
function sourceFileNotUptoDate(sourceFile) {
return !sourceFileVersionUptoDate(sourceFile) || hasInvalidatedResolutions(sourceFile.path);
}
function sourceFileVersionUptoDate(sourceFile) {
return sourceFile.version === getSourceVersion(sourceFile.resolvedPath, sourceFile.fileName);
}
function projectReferenceUptoDate(oldRef, newRef, index) {
return projectReferenceIsEqualTo(oldRef, newRef) && resolvedProjectReferenceUptoDate(program.getResolvedProjectReferences()[index], oldRef);
}
function resolvedProjectReferenceUptoDate(oldResolvedRef, oldRef) {
if (oldResolvedRef) {
if (contains(seenResolvedRefs, oldResolvedRef))
return true;
const refPath2 = resolveProjectReferencePath(oldRef);
const newParsedCommandLine = getParsedCommandLine(refPath2);
if (!newParsedCommandLine)
return false;
if (oldResolvedRef.commandLine.options.configFile !== newParsedCommandLine.options.configFile)
return false;
if (!arrayIsEqualTo(oldResolvedRef.commandLine.fileNames, newParsedCommandLine.fileNames))
return false;
(seenResolvedRefs || (seenResolvedRefs = [])).push(oldResolvedRef);
return !forEach(oldResolvedRef.references, (childResolvedRef, index) => !resolvedProjectReferenceUptoDate(childResolvedRef, oldResolvedRef.commandLine.projectReferences[index]));
}
const refPath = resolveProjectReferencePath(oldRef);
return !getParsedCommandLine(refPath);
}
}
function getConfigFileParsingDiagnostics(configFileParseResult) {
return configFileParseResult.options.configFile ? [...configFileParseResult.options.configFile.parseDiagnostics, ...configFileParseResult.errors] : configFileParseResult.errors;
}
function getImpliedNodeFormatForFileWorker(fileName, packageJsonInfoCache, host, options) {
switch (getEmitModuleResolutionKind(options)) {
case 3 /* Node16 */:
case 99 /* NodeNext */:
return fileExtensionIsOneOf(fileName, [".d.mts" /* Dmts */, ".mts" /* Mts */, ".mjs" /* Mjs */]) ? 99 /* ESNext */ : fileExtensionIsOneOf(fileName, [".d.cts" /* Dcts */, ".cts" /* Cts */, ".cjs" /* Cjs */]) ? 1 /* CommonJS */ : fileExtensionIsOneOf(fileName, [".d.ts" /* Dts */, ".ts" /* Ts */, ".tsx" /* Tsx */, ".js" /* Js */, ".jsx" /* Jsx */]) ? lookupFromPackageJson() : void 0;
default:
return void 0;
}
function lookupFromPackageJson() {
const state = getTemporaryModuleResolutionState(packageJsonInfoCache, host, options);
const packageJsonLocations = [];
state.failedLookupLocations = packageJsonLocations;
state.affectingLocations = packageJsonLocations;
const packageJsonScope = getPackageScopeForPath(fileName, state);
const impliedNodeFormat = (packageJsonScope == null ? void 0 : packageJsonScope.contents.packageJsonContent.type) === "module" ? 99 /* ESNext */ : 1 /* CommonJS */;
return { impliedNodeFormat, packageJsonLocations, packageJsonScope };
}
}
var plainJSErrors = /* @__PURE__ */ new Set([
// binder errors
Diagnostics.Cannot_redeclare_block_scoped_variable_0.code,
Diagnostics.A_module_cannot_have_multiple_default_exports.code,
Diagnostics.Another_export_default_is_here.code,
Diagnostics.The_first_export_default_is_here.code,
Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module.code,
Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode.code,
Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here.code,
Diagnostics.constructor_is_a_reserved_word.code,
Diagnostics.delete_cannot_be_called_on_an_identifier_in_strict_mode.code,
Diagnostics.Code_contained_in_a_class_is_evaluated_in_JavaScript_s_strict_mode_which_does_not_allow_this_use_of_0_For_more_information_see_https_Colon_Slash_Slashdeveloper_mozilla_org_Slashen_US_Slashdocs_SlashWeb_SlashJavaScript_SlashReference_SlashStrict_mode.code,
Diagnostics.Invalid_use_of_0_Modules_are_automatically_in_strict_mode.code,
Diagnostics.Invalid_use_of_0_in_strict_mode.code,
Diagnostics.A_label_is_not_allowed_here.code,
Diagnostics.with_statements_are_not_allowed_in_strict_mode.code,
// grammar errors
Diagnostics.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement.code,
Diagnostics.A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement.code,
Diagnostics.A_class_declaration_without_the_default_modifier_must_have_a_name.code,
Diagnostics.A_class_member_cannot_have_the_0_keyword.code,
Diagnostics.A_comma_expression_is_not_allowed_in_a_computed_property_name.code,
Diagnostics.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement.code,
Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement.code,
Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement.code,
Diagnostics.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement.code,
Diagnostics.A_default_export_must_be_at_the_top_level_of_a_file_or_module_declaration.code,
Diagnostics.A_definite_assignment_assertion_is_not_permitted_in_this_context.code,
Diagnostics.A_destructuring_declaration_must_have_an_initializer.code,
Diagnostics.A_get_accessor_cannot_have_parameters.code,
Diagnostics.A_rest_element_cannot_contain_a_binding_pattern.code,
Diagnostics.A_rest_element_cannot_have_a_property_name.code,
Diagnostics.A_rest_element_cannot_have_an_initializer.code,
Diagnostics.A_rest_element_must_be_last_in_a_destructuring_pattern.code,
Diagnostics.A_rest_parameter_cannot_have_an_initializer.code,
Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list.code,
Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma.code,
Diagnostics.A_return_statement_cannot_be_used_inside_a_class_static_block.code,
Diagnostics.A_set_accessor_cannot_have_rest_parameter.code,
Diagnostics.A_set_accessor_must_have_exactly_one_parameter.code,
Diagnostics.An_export_declaration_can_only_be_used_at_the_top_level_of_a_module.code,
Diagnostics.An_export_declaration_cannot_have_modifiers.code,
Diagnostics.An_import_declaration_can_only_be_used_at_the_top_level_of_a_module.code,
Diagnostics.An_import_declaration_cannot_have_modifiers.code,
Diagnostics.An_object_member_cannot_be_declared_optional.code,
Diagnostics.Argument_of_dynamic_import_cannot_be_spread_element.code,
Diagnostics.Cannot_assign_to_private_method_0_Private_methods_are_not_writable.code,
Diagnostics.Cannot_redeclare_identifier_0_in_catch_clause.code,
Diagnostics.Catch_clause_variable_cannot_have_an_initializer.code,
Diagnostics.Class_decorators_can_t_be_used_with_static_private_identifier_Consider_removing_the_experimental_decorator.code,
Diagnostics.Classes_can_only_extend_a_single_class.code,
Diagnostics.Classes_may_not_have_a_field_named_constructor.code,
Diagnostics.Did_you_mean_to_use_a_Colon_An_can_only_follow_a_property_name_when_the_containing_object_literal_is_part_of_a_destructuring_pattern.code,
Diagnostics.Duplicate_label_0.code,
Diagnostics.Dynamic_imports_can_only_accept_a_module_specifier_and_an_optional_assertion_as_arguments.code,
Diagnostics.For_await_loops_cannot_be_used_inside_a_class_static_block.code,
Diagnostics.JSX_attributes_must_only_be_assigned_a_non_empty_expression.code,
Diagnostics.JSX_elements_cannot_have_multiple_attributes_with_the_same_name.code,
Diagnostics.JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array.code,
Diagnostics.JSX_property_access_expressions_cannot_include_JSX_namespace_names.code,
Diagnostics.Jump_target_cannot_cross_function_boundary.code,
Diagnostics.Line_terminator_not_permitted_before_arrow.code,
Diagnostics.Modifiers_cannot_appear_here.code,
Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement.code,
Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement.code,
Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies.code,
Diagnostics.Private_identifiers_are_only_allowed_in_class_bodies_and_may_only_be_used_as_part_of_a_class_member_declaration_property_access_or_on_the_left_hand_side_of_an_in_expression.code,
Diagnostics.Property_0_is_not_accessible_outside_class_1_because_it_has_a_private_identifier.code,
Diagnostics.Tagged_template_expressions_are_not_permitted_in_an_optional_chain.code,
Diagnostics.The_left_hand_side_of_a_for_of_statement_may_not_be_async.code,
Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer.code,
Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer.code,
Diagnostics.Trailing_comma_not_allowed.code,
Diagnostics.Variable_declaration_list_cannot_be_empty.code,
Diagnostics._0_and_1_operations_cannot_be_mixed_without_parentheses.code,
Diagnostics._0_expected.code,
Diagnostics._0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2.code,
Diagnostics._0_list_cannot_be_empty.code,
Diagnostics._0_modifier_already_seen.code,
Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration.code,
Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element.code,
Diagnostics._0_modifier_cannot_appear_on_a_parameter.code,
Diagnostics._0_modifier_cannot_appear_on_class_elements_of_this_kind.code,
Diagnostics._0_modifier_cannot_be_used_here.code,
Diagnostics._0_modifier_must_precede_1_modifier.code,
Diagnostics.const_declarations_can_only_be_declared_inside_a_block.code,
Diagnostics.const_declarations_must_be_initialized.code,
Diagnostics.extends_clause_already_seen.code,
Diagnostics.let_declarations_can_only_be_declared_inside_a_block.code,
Diagnostics.let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations.code,
Diagnostics.Class_constructor_may_not_be_a_generator.code,
Diagnostics.Class_constructor_may_not_be_an_accessor.code,
Diagnostics.await_expressions_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules.code
]);
function shouldProgramCreateNewSourceFiles(program, newOptions) {
if (!program)
return false;
return optionsHaveChanges(program.getCompilerOptions(), newOptions, sourceFileAffectingCompilerOptions);
}
function createCreateProgramOptions(rootNames, options, host, oldProgram, configFileParsingDiagnostics, typeScriptVersion2) {
return {
rootNames,
options,
host,
oldProgram,
configFileParsingDiagnostics,
typeScriptVersion: typeScriptVersion2
};
}
function createProgram(rootNamesOrOptions, _options, _host, _oldProgram, _configFileParsingDiagnostics) {
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
const createProgramOptions = isArray(rootNamesOrOptions) ? createCreateProgramOptions(rootNamesOrOptions, _options, _host, _oldProgram, _configFileParsingDiagnostics) : rootNamesOrOptions;
const { rootNames, options, configFileParsingDiagnostics, projectReferences, typeScriptVersion: typeScriptVersion2 } = createProgramOptions;
let { oldProgram } = createProgramOptions;
const reportInvalidIgnoreDeprecations = memoize(() => createOptionValueDiagnostic("ignoreDeprecations", Diagnostics.Invalid_value_for_ignoreDeprecations));
let processingDefaultLibFiles;
let processingOtherFiles;
let files;
let symlinks;
let commonSourceDirectory;
let typeChecker;
let classifiableNames;
const ambientModuleNameToUnmodifiedFileName = /* @__PURE__ */ new Map();
let fileReasons = createMultiMap();
const cachedBindAndCheckDiagnosticsForFile = {};
const cachedDeclarationDiagnosticsForFile = {};
let resolvedTypeReferenceDirectives = createModeAwareCache();
let fileProcessingDiagnostics;
let automaticTypeDirectiveNames;
let automaticTypeDirectiveResolutions;
let resolvedLibReferences;
let resolvedLibProcessing;
let packageMap;
const maxNodeModuleJsDepth = typeof options.maxNodeModuleJsDepth === "number" ? options.maxNodeModuleJsDepth : 0;
let currentNodeModulesDepth = 0;
const modulesWithElidedImports = /* @__PURE__ */ new Map();
const sourceFilesFoundSearchingNodeModules = /* @__PURE__ */ new Map();
(_a = tracing) == null ? void 0 : _a.push(
tracing.Phase.Program,
"createProgram",
{ configFilePath: options.configFilePath, rootDir: options.rootDir },
/*separateBeginAndEnd*/
true
);
mark("beforeProgram");
const host = createProgramOptions.host || createCompilerHost(options);
const configParsingHost = parseConfigHostFromCompilerHostLike(host);
let skipDefaultLib = options.noLib;
const getDefaultLibraryFileName = memoize(() => host.getDefaultLibFileName(options));
const defaultLibraryPath = host.getDefaultLibLocation ? host.getDefaultLibLocation() : getDirectoryPath(getDefaultLibraryFileName());
const programDiagnostics = createDiagnosticCollection();
const currentDirectory = host.getCurrentDirectory();
const supportedExtensions = getSupportedExtensions(options);
const supportedExtensionsWithJsonIfResolveJsonModule = getSupportedExtensionsWithJsonIfResolveJsonModule(options, supportedExtensions);
const hasEmitBlockingDiagnostics = /* @__PURE__ */ new Map();
let _compilerOptionsObjectLiteralSyntax;
let moduleResolutionCache;
let actualResolveModuleNamesWorker;
const hasInvalidatedResolutions = host.hasInvalidatedResolutions || returnFalse;
if (host.resolveModuleNameLiterals) {
actualResolveModuleNamesWorker = host.resolveModuleNameLiterals.bind(host);
moduleResolutionCache = (_b = host.getModuleResolutionCache) == null ? void 0 : _b.call(host);
} else if (host.resolveModuleNames) {
actualResolveModuleNamesWorker = (moduleNames, containingFile, redirectedReference, options2, containingSourceFile, reusedNames) => host.resolveModuleNames(
moduleNames.map(getModuleResolutionName),
containingFile,
reusedNames == null ? void 0 : reusedNames.map(getModuleResolutionName),
redirectedReference,
options2,
containingSourceFile
).map(
(resolved) => resolved ? resolved.extension !== void 0 ? { resolvedModule: resolved } : (
// An older host may have omitted extension, in which case we should infer it from the file extension of resolvedFileName.
{ resolvedModule: { ...resolved, extension: extensionFromPath(resolved.resolvedFileName) } }
) : emptyResolution
);
moduleResolutionCache = (_c = host.getModuleResolutionCache) == null ? void 0 : _c.call(host);
} else {
moduleResolutionCache = createModuleResolutionCache(currentDirectory, getCanonicalFileName, options);
actualResolveModuleNamesWorker = (moduleNames, containingFile, redirectedReference, options2, containingSourceFile) => loadWithModeAwareCache(
moduleNames,
containingFile,
redirectedReference,
options2,
containingSourceFile,
host,
moduleResolutionCache,
createModuleResolutionLoader
);
}
let actualResolveTypeReferenceDirectiveNamesWorker;
if (host.resolveTypeReferenceDirectiveReferences) {
actualResolveTypeReferenceDirectiveNamesWorker = host.resolveTypeReferenceDirectiveReferences.bind(host);
} else if (host.resolveTypeReferenceDirectives) {
actualResolveTypeReferenceDirectiveNamesWorker = (typeDirectiveNames, containingFile, redirectedReference, options2, containingSourceFile) => host.resolveTypeReferenceDirectives(
typeDirectiveNames.map(getTypeReferenceResolutionName),
containingFile,
redirectedReference,
options2,
containingSourceFile == null ? void 0 : containingSourceFile.impliedNodeFormat
).map((resolvedTypeReferenceDirective) => ({ resolvedTypeReferenceDirective }));
} else {
const typeReferenceDirectiveResolutionCache = createTypeReferenceDirectiveResolutionCache(
currentDirectory,
getCanonicalFileName,
/*options*/
void 0,
moduleResolutionCache == null ? void 0 : moduleResolutionCache.getPackageJsonInfoCache()
);
actualResolveTypeReferenceDirectiveNamesWorker = (typeDirectiveNames, containingFile, redirectedReference, options2, containingSourceFile) => loadWithModeAwareCache(
typeDirectiveNames,
containingFile,
redirectedReference,
options2,
containingSourceFile,
host,
typeReferenceDirectiveResolutionCache,
createTypeReferenceResolutionLoader
);
}
const hasInvalidatedLibResolutions = host.hasInvalidatedLibResolutions || returnFalse;
let actualResolveLibrary;
if (host.resolveLibrary) {
actualResolveLibrary = host.resolveLibrary.bind(host);
} else {
const libraryResolutionCache = createModuleResolutionCache(currentDirectory, getCanonicalFileName, options, moduleResolutionCache == null ? void 0 : moduleResolutionCache.getPackageJsonInfoCache());
actualResolveLibrary = (libraryName, resolveFrom, options2) => resolveLibrary(libraryName, resolveFrom, options2, host, libraryResolutionCache);
}
const packageIdToSourceFile = /* @__PURE__ */ new Map();
let sourceFileToPackageName = /* @__PURE__ */ new Map();
let redirectTargetsMap = createMultiMap();
let usesUriStyleNodeCoreModules = false;
const filesByName = /* @__PURE__ */ new Map();
let missingFilePaths;
const filesByNameIgnoreCase = host.useCaseSensitiveFileNames() ? /* @__PURE__ */ new Map() : void 0;
let resolvedProjectReferences;
let projectReferenceRedirects;
let mapFromFileToProjectReferenceRedirects;
let mapFromToProjectReferenceRedirectSource;
const useSourceOfProjectReferenceRedirect = !!((_d = host.useSourceOfProjectReferenceRedirect) == null ? void 0 : _d.call(host)) && !options.disableSourceOfProjectReferenceRedirect;
const { onProgramCreateComplete, fileExists, directoryExists } = updateHostForUseSourceOfProjectReferenceRedirect({
compilerHost: host,
getSymlinkCache,
useSourceOfProjectReferenceRedirect,
toPath: toPath3,
getResolvedProjectReferences,
getSourceOfProjectReferenceRedirect,
forEachResolvedProjectReference: forEachResolvedProjectReference2
});
const readFile = host.readFile.bind(host);
(_e = tracing) == null ? void 0 : _e.push(tracing.Phase.Program, "shouldProgramCreateNewSourceFiles", { hasOldProgram: !!oldProgram });
const shouldCreateNewSourceFile = shouldProgramCreateNewSourceFiles(oldProgram, options);
(_f = tracing) == null ? void 0 : _f.pop();
let structureIsReused;
(_g = tracing) == null ? void 0 : _g.push(tracing.Phase.Program, "tryReuseStructureFromOldProgram", {});
structureIsReused = tryReuseStructureFromOldProgram();
(_h = tracing) == null ? void 0 : _h.pop();
if (structureIsReused !== 2 /* Completely */) {
processingDefaultLibFiles = [];
processingOtherFiles = [];
if (projectReferences) {
if (!resolvedProjectReferences) {
resolvedProjectReferences = projectReferences.map(parseProjectReferenceConfigFile);
}
if (rootNames.length) {
resolvedProjectReferences == null ? void 0 : resolvedProjectReferences.forEach((parsedRef, index) => {
if (!parsedRef)
return;
const out = outFile(parsedRef.commandLine.options);
if (useSourceOfProjectReferenceRedirect) {
if (out || getEmitModuleKind(parsedRef.commandLine.options) === 0 /* None */) {
for (const fileName of parsedRef.commandLine.fileNames) {
processProjectReferenceFile(fileName, { kind: 1 /* SourceFromProjectReference */, index });
}
}
} else {
if (out) {
processProjectReferenceFile(changeExtension(out, ".d.ts"), { kind: 2 /* OutputFromProjectReference */, index });
} else if (getEmitModuleKind(parsedRef.commandLine.options) === 0 /* None */) {
const getCommonSourceDirectory3 = memoize(() => getCommonSourceDirectoryOfConfig(parsedRef.commandLine, !host.useCaseSensitiveFileNames()));
for (const fileName of parsedRef.commandLine.fileNames) {
if (!isDeclarationFileName(fileName) && !fileExtensionIs(fileName, ".json" /* Json */)) {
processProjectReferenceFile(getOutputDeclarationFileName(fileName, parsedRef.commandLine, !host.useCaseSensitiveFileNames(), getCommonSourceDirectory3), { kind: 2 /* OutputFromProjectReference */, index });
}
}
}
}
});
}
}
(_i = tracing) == null ? void 0 : _i.push(tracing.Phase.Program, "processRootFiles", { count: rootNames.length });
forEach(rootNames, (name, index) => processRootFile(
name,
/*isDefaultLib*/
false,
/*ignoreNoDefaultLib*/
false,
{ kind: 0 /* RootFile */, index }
));
(_j = tracing) == null ? void 0 : _j.pop();
automaticTypeDirectiveNames ?? (automaticTypeDirectiveNames = rootNames.length ? getAutomaticTypeDirectiveNames(options, host) : emptyArray);
automaticTypeDirectiveResolutions = createModeAwareCache();
if (automaticTypeDirectiveNames.length) {
(_k = tracing) == null ? void 0 : _k.push(tracing.Phase.Program, "processTypeReferences", { count: automaticTypeDirectiveNames.length });
const containingDirectory = options.configFilePath ? getDirectoryPath(options.configFilePath) : currentDirectory;
const containingFilename = combinePaths(containingDirectory, inferredTypesContainingFile);
const resolutions = resolveTypeReferenceDirectiveNamesReusingOldState(automaticTypeDirectiveNames, containingFilename);
for (let i = 0; i < automaticTypeDirectiveNames.length; i++) {
automaticTypeDirectiveResolutions.set(
automaticTypeDirectiveNames[i],
/*mode*/
void 0,
resolutions[i]
);
processTypeReferenceDirective(
automaticTypeDirectiveNames[i],
/*mode*/
void 0,
resolutions[i],
{
kind: 8 /* AutomaticTypeDirectiveFile */,
typeReference: automaticTypeDirectiveNames[i],
packageId: (_m = (_l = resolutions[i]) == null ? void 0 : _l.resolvedTypeReferenceDirective) == null ? void 0 : _m.packageId
}
);
}
(_n = tracing) == null ? void 0 : _n.pop();
}
if (rootNames.length && !skipDefaultLib) {
const defaultLibraryFileName = getDefaultLibraryFileName();
if (!options.lib && defaultLibraryFileName) {
processRootFile(
defaultLibraryFileName,
/*isDefaultLib*/
true,
/*ignoreNoDefaultLib*/
false,
{ kind: 6 /* LibFile */ }
);
} else {
forEach(options.lib, (libFileName, index) => {
processRootFile(
pathForLibFile(libFileName),
/*isDefaultLib*/
true,
/*ignoreNoDefaultLib*/
false,
{ kind: 6 /* LibFile */, index }
);
});
}
}
missingFilePaths = arrayFrom(mapDefinedIterator(filesByName.entries(), ([path, file]) => file === void 0 ? path : void 0));
files = stableSort(processingDefaultLibFiles, compareDefaultLibFiles).concat(processingOtherFiles);
processingDefaultLibFiles = void 0;
processingOtherFiles = void 0;
}
Debug.assert(!!missingFilePaths);
if (oldProgram && host.onReleaseOldSourceFile) {
const oldSourceFiles = oldProgram.getSourceFiles();
for (const oldSourceFile of oldSourceFiles) {
const newFile = getSourceFileByPath(oldSourceFile.resolvedPath);
if (shouldCreateNewSourceFile || !newFile || newFile.impliedNodeFormat !== oldSourceFile.impliedNodeFormat || // old file wasn't redirect but new file is
oldSourceFile.resolvedPath === oldSourceFile.path && newFile.resolvedPath !== oldSourceFile.path) {
host.onReleaseOldSourceFile(oldSourceFile, oldProgram.getCompilerOptions(), !!getSourceFileByPath(oldSourceFile.path));
}
}
if (!host.getParsedCommandLine) {
oldProgram.forEachResolvedProjectReference((resolvedProjectReference) => {
if (!getResolvedProjectReferenceByPath(resolvedProjectReference.sourceFile.path)) {
host.onReleaseOldSourceFile(
resolvedProjectReference.sourceFile,
oldProgram.getCompilerOptions(),
/*hasSourceFileByPath*/
false
);
}
});
}
}
if (oldProgram && host.onReleaseParsedCommandLine) {
forEachProjectReference(
oldProgram.getProjectReferences(),
oldProgram.getResolvedProjectReferences(),
(oldResolvedRef, parent, index) => {
const oldReference = (parent == null ? void 0 : parent.commandLine.projectReferences[index]) || oldProgram.getProjectReferences()[index];
const oldRefPath = resolveProjectReferencePath(oldReference);
if (!(projectReferenceRedirects == null ? void 0 : projectReferenceRedirects.has(toPath3(oldRefPath)))) {
host.onReleaseParsedCommandLine(oldRefPath, oldResolvedRef, oldProgram.getCompilerOptions());
}
}
);
}
oldProgram = void 0;
resolvedLibProcessing = void 0;
const program = {
getRootFileNames: () => rootNames,
getSourceFile,
getSourceFileByPath,
getSourceFiles: () => files,
getMissingFilePaths: () => missingFilePaths,
// TODO: GH#18217
getModuleResolutionCache: () => moduleResolutionCache,
getFilesByNameMap: () => filesByName,
getCompilerOptions: () => options,
getSyntacticDiagnostics,
getOptionsDiagnostics,
getGlobalDiagnostics,
getSemanticDiagnostics,
getCachedSemanticDiagnostics,
getSuggestionDiagnostics,
getDeclarationDiagnostics: getDeclarationDiagnostics2,
getBindAndCheckDiagnostics,
getProgramDiagnostics,
getTypeChecker,
getClassifiableNames,
getCommonSourceDirectory: getCommonSourceDirectory2,
emit,
getCurrentDirectory: () => currentDirectory,
getNodeCount: () => getTypeChecker().getNodeCount(),
getIdentifierCount: () => getTypeChecker().getIdentifierCount(),
getSymbolCount: () => getTypeChecker().getSymbolCount(),
getTypeCount: () => getTypeChecker().getTypeCount(),
getInstantiationCount: () => getTypeChecker().getInstantiationCount(),
getRelationCacheSizes: () => getTypeChecker().getRelationCacheSizes(),
getFileProcessingDiagnostics: () => fileProcessingDiagnostics,
getResolvedTypeReferenceDirectives: () => resolvedTypeReferenceDirectives,
getAutomaticTypeDirectiveNames: () => automaticTypeDirectiveNames,
getAutomaticTypeDirectiveResolutions: () => automaticTypeDirectiveResolutions,
isSourceFileFromExternalLibrary,
isSourceFileDefaultLibrary,
getSourceFileFromReference,
getLibFileFromReference,
sourceFileToPackageName,
redirectTargetsMap,
usesUriStyleNodeCoreModules,
resolvedLibReferences,
getCurrentPackagesMap: () => packageMap,
typesPackageExists,
packageBundlesTypes,
isEmittedFile,
getConfigFileParsingDiagnostics: getConfigFileParsingDiagnostics2,
getProjectReferences,
getResolvedProjectReferences,
getProjectReferenceRedirect,
getResolvedProjectReferenceToRedirect,
getResolvedProjectReferenceByPath,
forEachResolvedProjectReference: forEachResolvedProjectReference2,
isSourceOfProjectReferenceRedirect,
emitBuildInfo,
fileExists,
readFile,
directoryExists,
getSymlinkCache,
realpath: (_o = host.realpath) == null ? void 0 : _o.bind(host),
useCaseSensitiveFileNames: () => host.useCaseSensitiveFileNames(),
getCanonicalFileName,
getFileIncludeReasons: () => fileReasons,
structureIsReused,
writeFile: writeFile2
};
onProgramCreateComplete();
fileProcessingDiagnostics == null ? void 0 : fileProcessingDiagnostics.forEach((diagnostic) => {
switch (diagnostic.kind) {
case 1 /* FilePreprocessingFileExplainingDiagnostic */:
return programDiagnostics.add(createDiagnosticExplainingFile(diagnostic.file && getSourceFileByPath(diagnostic.file), diagnostic.fileProcessingReason, diagnostic.diagnostic, diagnostic.args || emptyArray));
case 0 /* FilePreprocessingReferencedDiagnostic */:
const { file, pos, end } = getReferencedFileLocation(getSourceFileByPath, diagnostic.reason);
return programDiagnostics.add(createFileDiagnostic(file, Debug.checkDefined(pos), Debug.checkDefined(end) - pos, diagnostic.diagnostic, ...diagnostic.args || emptyArray));
case 2 /* ResolutionDiagnostics */:
return diagnostic.diagnostics.forEach((d) => programDiagnostics.add(d));
default:
Debug.assertNever(diagnostic);
}
});
verifyCompilerOptions();
mark("afterProgram");
measure("Program", "beforeProgram", "afterProgram");
(_p = tracing) == null ? void 0 : _p.pop();
return program;
function getPackagesMap() {
if (packageMap)
return packageMap;
packageMap = /* @__PURE__ */ new Map();
files.forEach((sf) => {
if (!sf.resolvedModules)
return;
sf.resolvedModules.forEach(({ resolvedModule }) => {
if (resolvedModule == null ? void 0 : resolvedModule.packageId)
packageMap.set(resolvedModule.packageId.name, resolvedModule.extension === ".d.ts" /* Dts */ || !!packageMap.get(resolvedModule.packageId.name));
});
});
return packageMap;
}
function typesPackageExists(packageName) {
return getPackagesMap().has(getTypesPackageName(packageName));
}
function packageBundlesTypes(packageName) {
return !!getPackagesMap().get(packageName);
}
function addResolutionDiagnostics(resolution) {
var _a2;
if (!((_a2 = resolution.resolutionDiagnostics) == null ? void 0 : _a2.length))
return;
(fileProcessingDiagnostics ?? (fileProcessingDiagnostics = [])).push({
kind: 2 /* ResolutionDiagnostics */,
diagnostics: resolution.resolutionDiagnostics
});
}
function addResolutionDiagnosticsFromResolutionOrCache(containingFile, name, resolution, mode) {
if (host.resolveModuleNameLiterals || !host.resolveModuleNames)
return addResolutionDiagnostics(resolution);
if (!moduleResolutionCache || isExternalModuleNameRelative(name))
return;
const containingFileName = getNormalizedAbsolutePath(containingFile.originalFileName, currentDirectory);
const containingDir = getDirectoryPath(containingFileName);
const redirectedReference = getRedirectReferenceForResolution(containingFile);
const fromCache = moduleResolutionCache.getFromNonRelativeNameCache(name, mode, containingDir, redirectedReference);
if (fromCache)
addResolutionDiagnostics(fromCache);
}
function resolveModuleNamesWorker(moduleNames, containingFile, reusedNames) {
var _a2, _b2;
if (!moduleNames.length)
return emptyArray;
const containingFileName = getNormalizedAbsolutePath(containingFile.originalFileName, currentDirectory);
const redirectedReference = getRedirectReferenceForResolution(containingFile);
(_a2 = tracing) == null ? void 0 : _a2.push(tracing.Phase.Program, "resolveModuleNamesWorker", { containingFileName });
mark("beforeResolveModule");
const result = actualResolveModuleNamesWorker(moduleNames, containingFileName, redirectedReference, options, containingFile, reusedNames);
mark("afterResolveModule");
measure("ResolveModule", "beforeResolveModule", "afterResolveModule");
(_b2 = tracing) == null ? void 0 : _b2.pop();
return result;
}
function resolveTypeReferenceDirectiveNamesWorker(typeDirectiveNames, containingFile, reusedNames) {
var _a2, _b2;
if (!typeDirectiveNames.length)
return [];
const containingSourceFile = !isString(containingFile) ? containingFile : void 0;
const containingFileName = !isString(containingFile) ? getNormalizedAbsolutePath(containingFile.originalFileName, currentDirectory) : containingFile;
const redirectedReference = containingSourceFile && getRedirectReferenceForResolution(containingSourceFile);
(_a2 = tracing) == null ? void 0 : _a2.push(tracing.Phase.Program, "resolveTypeReferenceDirectiveNamesWorker", { containingFileName });
mark("beforeResolveTypeReference");
const result = actualResolveTypeReferenceDirectiveNamesWorker(typeDirectiveNames, containingFileName, redirectedReference, options, containingSourceFile, reusedNames);
mark("afterResolveTypeReference");
measure("ResolveTypeReference", "beforeResolveTypeReference", "afterResolveTypeReference");
(_b2 = tracing) == null ? void 0 : _b2.pop();
return result;
}
function getRedirectReferenceForResolution(file) {
const redirect = getResolvedProjectReferenceToRedirect(file.originalFileName);
if (redirect || !isDeclarationFileName(file.originalFileName))
return redirect;
const resultFromDts = getRedirectReferenceForResolutionFromSourceOfProject(file.path);
if (resultFromDts)
return resultFromDts;
if (!host.realpath || !options.preserveSymlinks || !stringContains(file.originalFileName, nodeModulesPathPart))
return void 0;
const realDeclarationPath = toPath3(host.realpath(file.originalFileName));
return realDeclarationPath === file.path ? void 0 : getRedirectReferenceForResolutionFromSourceOfProject(realDeclarationPath);
}
function getRedirectReferenceForResolutionFromSourceOfProject(filePath) {
const source = getSourceOfProjectReferenceRedirect(filePath);
if (isString(source))
return getResolvedProjectReferenceToRedirect(source);
if (!source)
return void 0;
return forEachResolvedProjectReference2((resolvedRef) => {
const out = outFile(resolvedRef.commandLine.options);
if (!out)
return void 0;
return toPath3(out) === filePath ? resolvedRef : void 0;
});
}
function compareDefaultLibFiles(a, b) {
return compareValues(getDefaultLibFilePriority(a), getDefaultLibFilePriority(b));
}
function getDefaultLibFilePriority(a) {
if (containsPath(
defaultLibraryPath,
a.fileName,
/*ignoreCase*/
false
)) {
const basename = getBaseFileName(a.fileName);
if (basename === "lib.d.ts" || basename === "lib.es6.d.ts")
return 0;
const name = removeSuffix(removePrefix(basename, "lib."), ".d.ts");
const index = libs.indexOf(name);
if (index !== -1)
return index + 1;
}
return libs.length + 2;
}
function toPath3(fileName) {
return toPath(fileName, currentDirectory, getCanonicalFileName);
}
function getCommonSourceDirectory2() {
if (commonSourceDirectory === void 0) {
const emittedFiles = filter(files, (file) => sourceFileMayBeEmitted(file, program));
commonSourceDirectory = getCommonSourceDirectory(
options,
() => mapDefined(emittedFiles, (file) => file.isDeclarationFile ? void 0 : file.fileName),
currentDirectory,
getCanonicalFileName,
(commonSourceDirectory2) => checkSourceFilesBelongToPath(emittedFiles, commonSourceDirectory2)
);
}
return commonSourceDirectory;
}
function getClassifiableNames() {
var _a2;
if (!classifiableNames) {
getTypeChecker();
classifiableNames = /* @__PURE__ */ new Set();
for (const sourceFile of files) {
(_a2 = sourceFile.classifiableNames) == null ? void 0 : _a2.forEach((value) => classifiableNames.add(value));
}
}
return classifiableNames;
}
function resolveModuleNamesReusingOldState(moduleNames, file) {
var _a2;
if (structureIsReused === 0 /* Not */ && !file.ambientModuleNames.length) {
return resolveModuleNamesWorker(
moduleNames,
file,
/*reusedNames*/
void 0
);
}
const oldSourceFile = oldProgram && oldProgram.getSourceFile(file.fileName);
if (oldSourceFile !== file && file.resolvedModules) {
const result2 = [];
for (const moduleName of moduleNames) {
const resolvedModule = file.resolvedModules.get(moduleName.text, getModeForUsageLocation(file, moduleName));
result2.push(resolvedModule);
}
return result2;
}
let unknownModuleNames;
let result;
let reusedNames;
const predictedToResolveToAmbientModuleMarker = emptyResolution;
for (let i = 0; i < moduleNames.length; i++) {
const moduleName = moduleNames[i];
if (file === oldSourceFile && !hasInvalidatedResolutions(oldSourceFile.path)) {
const mode = getModeForUsageLocation(file, moduleName);
const oldResolution = (_a2 = oldSourceFile.resolvedModules) == null ? void 0 : _a2.get(moduleName.text, mode);
if (oldResolution == null ? void 0 : oldResolution.resolvedModule) {
if (isTraceEnabled(options, host)) {
trace(
host,
oldResolution.resolvedModule.packageId ? Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2,
moduleName.text,
getNormalizedAbsolutePath(file.originalFileName, currentDirectory),
oldResolution.resolvedModule.resolvedFileName,
oldResolution.resolvedModule.packageId && packageIdToString(oldResolution.resolvedModule.packageId)
);
}
(result ?? (result = new Array(moduleNames.length)))[i] = oldResolution;
(reusedNames ?? (reusedNames = [])).push(moduleName);
continue;
}
}
let resolvesToAmbientModuleInNonModifiedFile = false;
if (contains(file.ambientModuleNames, moduleName.text)) {
resolvesToAmbientModuleInNonModifiedFile = true;
if (isTraceEnabled(options, host)) {
trace(host, Diagnostics.Module_0_was_resolved_as_locally_declared_ambient_module_in_file_1, moduleName.text, getNormalizedAbsolutePath(file.originalFileName, currentDirectory));
}
} else {
resolvesToAmbientModuleInNonModifiedFile = moduleNameResolvesToAmbientModuleInNonModifiedFile(moduleName);
}
if (resolvesToAmbientModuleInNonModifiedFile) {
(result || (result = new Array(moduleNames.length)))[i] = predictedToResolveToAmbientModuleMarker;
} else {
(unknownModuleNames ?? (unknownModuleNames = [])).push(moduleName);
}
}
const resolutions = unknownModuleNames && unknownModuleNames.length ? resolveModuleNamesWorker(unknownModuleNames, file, reusedNames) : emptyArray;
if (!result) {
Debug.assert(resolutions.length === moduleNames.length);
return resolutions;
}
let j = 0;
for (let i = 0; i < result.length; i++) {
if (!result[i]) {
result[i] = resolutions[j];
j++;
}
}
Debug.assert(j === resolutions.length);
return result;
function moduleNameResolvesToAmbientModuleInNonModifiedFile(moduleName) {
const resolutionToFile = getResolvedModule(oldSourceFile, moduleName.text, getModeForUsageLocation(file, moduleName));
const resolvedFile = resolutionToFile && oldProgram.getSourceFile(resolutionToFile.resolvedFileName);
if (resolutionToFile && resolvedFile) {
return false;
}
const unmodifiedFile = ambientModuleNameToUnmodifiedFileName.get(moduleName.text);
if (!unmodifiedFile) {
return false;
}
if (isTraceEnabled(options, host)) {
trace(host, Diagnostics.Module_0_was_resolved_as_ambient_module_declared_in_1_since_this_file_was_not_modified, moduleName.text, unmodifiedFile);
}
return true;
}
}
function resolveTypeReferenceDirectiveNamesReusingOldState(typeDirectiveNames, containingFile) {
var _a2;
if (structureIsReused === 0 /* Not */) {
return resolveTypeReferenceDirectiveNamesWorker(
typeDirectiveNames,
containingFile,
/*reusedNames*/
void 0
);
}
const oldSourceFile = !isString(containingFile) ? oldProgram && oldProgram.getSourceFile(containingFile.fileName) : void 0;
if (!isString(containingFile)) {
if (oldSourceFile !== containingFile && containingFile.resolvedTypeReferenceDirectiveNames) {
const result2 = [];
for (const typeDirectiveName of typeDirectiveNames) {
const resolvedTypeReferenceDirective = containingFile.resolvedTypeReferenceDirectiveNames.get(getTypeReferenceResolutionName(typeDirectiveName), getModeForFileReference(typeDirectiveName, containingFile.impliedNodeFormat));
result2.push(resolvedTypeReferenceDirective);
}
return result2;
}
}
let unknownTypeReferenceDirectiveNames;
let result;
let reusedNames;
const containingSourceFile = !isString(containingFile) ? containingFile : void 0;
const canReuseResolutions = !isString(containingFile) ? containingFile === oldSourceFile && !hasInvalidatedResolutions(oldSourceFile.path) : !hasInvalidatedResolutions(toPath3(containingFile));
for (let i = 0; i < typeDirectiveNames.length; i++) {
const entry = typeDirectiveNames[i];
if (canReuseResolutions) {
const typeDirectiveName = getTypeReferenceResolutionName(entry);
const mode = getModeForFileReference(entry, containingSourceFile == null ? void 0 : containingSourceFile.impliedNodeFormat);
const oldResolution = (_a2 = !isString(containingFile) ? oldSourceFile == null ? void 0 : oldSourceFile.resolvedTypeReferenceDirectiveNames : oldProgram == null ? void 0 : oldProgram.getAutomaticTypeDirectiveResolutions()) == null ? void 0 : _a2.get(typeDirectiveName, mode);
if (oldResolution == null ? void 0 : oldResolution.resolvedTypeReferenceDirective) {
if (isTraceEnabled(options, host)) {
trace(
host,
oldResolution.resolvedTypeReferenceDirective.packageId ? Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2,
typeDirectiveName,
!isString(containingFile) ? getNormalizedAbsolutePath(containingFile.originalFileName, currentDirectory) : containingFile,
oldResolution.resolvedTypeReferenceDirective.resolvedFileName,
oldResolution.resolvedTypeReferenceDirective.packageId && packageIdToString(oldResolution.resolvedTypeReferenceDirective.packageId)
);
}
(result ?? (result = new Array(typeDirectiveNames.length)))[i] = oldResolution;
(reusedNames ?? (reusedNames = [])).push(entry);
continue;
}
}
(unknownTypeReferenceDirectiveNames ?? (unknownTypeReferenceDirectiveNames = [])).push(entry);
}
if (!unknownTypeReferenceDirectiveNames)
return result || emptyArray;
const resolutions = resolveTypeReferenceDirectiveNamesWorker(
unknownTypeReferenceDirectiveNames,
containingFile,
reusedNames
);
if (!result) {
Debug.assert(resolutions.length === typeDirectiveNames.length);
return resolutions;
}
let j = 0;
for (let i = 0; i < result.length; i++) {
if (!result[i]) {
result[i] = resolutions[j];
j++;
}
}
Debug.assert(j === resolutions.length);
return result;
}
function canReuseProjectReferences() {
return !forEachProjectReference(
oldProgram.getProjectReferences(),
oldProgram.getResolvedProjectReferences(),
(oldResolvedRef, parent, index) => {
const newRef = (parent ? parent.commandLine.projectReferences : projectReferences)[index];
const newResolvedRef = parseProjectReferenceConfigFile(newRef);
if (oldResolvedRef) {
return !newResolvedRef || newResolvedRef.sourceFile !== oldResolvedRef.sourceFile || !arrayIsEqualTo(oldResolvedRef.commandLine.fileNames, newResolvedRef.commandLine.fileNames);
} else {
return newResolvedRef !== void 0;
}
},
(oldProjectReferences, parent) => {
const newReferences = parent ? getResolvedProjectReferenceByPath(parent.sourceFile.path).commandLine.projectReferences : projectReferences;
return !arrayIsEqualTo(oldProjectReferences, newReferences, projectReferenceIsEqualTo);
}
);
}
function tryReuseStructureFromOldProgram() {
var _a2;
if (!oldProgram) {
return 0 /* Not */;
}
const oldOptions = oldProgram.getCompilerOptions();
if (changesAffectModuleResolution(oldOptions, options)) {
return 0 /* Not */;
}
const oldRootNames = oldProgram.getRootFileNames();
if (!arrayIsEqualTo(oldRootNames, rootNames)) {
return 0 /* Not */;
}
if (!canReuseProjectReferences()) {
return 0 /* Not */;
}
if (projectReferences) {
resolvedProjectReferences = projectReferences.map(parseProjectReferenceConfigFile);
}
const newSourceFiles = [];
const modifiedSourceFiles = [];
structureIsReused = 2 /* Completely */;
if (oldProgram.getMissingFilePaths().some((missingFilePath) => host.fileExists(missingFilePath))) {
return 0 /* Not */;
}
const oldSourceFiles = oldProgram.getSourceFiles();
let SeenPackageName;
((SeenPackageName2) => {
SeenPackageName2[SeenPackageName2["Exists"] = 0] = "Exists";
SeenPackageName2[SeenPackageName2["Modified"] = 1] = "Modified";
})(SeenPackageName || (SeenPackageName = {}));
const seenPackageNames = /* @__PURE__ */ new Map();
for (const oldSourceFile of oldSourceFiles) {
const sourceFileOptions = getCreateSourceFileOptions(oldSourceFile.fileName, moduleResolutionCache, host, options);
let newSourceFile = host.getSourceFileByPath ? host.getSourceFileByPath(
oldSourceFile.fileName,
oldSourceFile.resolvedPath,
sourceFileOptions,
/*onError*/
void 0,
shouldCreateNewSourceFile || sourceFileOptions.impliedNodeFormat !== oldSourceFile.impliedNodeFormat
) : host.getSourceFile(
oldSourceFile.fileName,
sourceFileOptions,
/*onError*/
void 0,
shouldCreateNewSourceFile || sourceFileOptions.impliedNodeFormat !== oldSourceFile.impliedNodeFormat
);
if (!newSourceFile) {
return 0 /* Not */;
}
newSourceFile.packageJsonLocations = ((_a2 = sourceFileOptions.packageJsonLocations) == null ? void 0 : _a2.length) ? sourceFileOptions.packageJsonLocations : void 0;
newSourceFile.packageJsonScope = sourceFileOptions.packageJsonScope;
Debug.assert(!newSourceFile.redirectInfo, "Host should not return a redirect source file from `getSourceFile`");
let fileChanged;
if (oldSourceFile.redirectInfo) {
if (newSourceFile !== oldSourceFile.redirectInfo.unredirected) {
return 0 /* Not */;
}
fileChanged = false;
newSourceFile = oldSourceFile;
} else if (oldProgram.redirectTargetsMap.has(oldSourceFile.path)) {
if (newSourceFile !== oldSourceFile) {
return 0 /* Not */;
}
fileChanged = false;
} else {
fileChanged = newSourceFile !== oldSourceFile;
}
newSourceFile.path = oldSourceFile.path;
newSourceFile.originalFileName = oldSourceFile.originalFileName;
newSourceFile.resolvedPath = oldSourceFile.resolvedPath;
newSourceFile.fileName = oldSourceFile.fileName;
const packageName = oldProgram.sourceFileToPackageName.get(oldSourceFile.path);
if (packageName !== void 0) {
const prevKind = seenPackageNames.get(packageName);
const newKind = fileChanged ? 1 /* Modified */ : 0 /* Exists */;
if (prevKind !== void 0 && newKind === 1 /* Modified */ || prevKind === 1 /* Modified */) {
return 0 /* Not */;
}
seenPackageNames.set(packageName, newKind);
}
if (fileChanged) {
if (oldSourceFile.impliedNodeFormat !== newSourceFile.impliedNodeFormat) {
structureIsReused = 1 /* SafeModules */;
} else if (!arrayIsEqualTo(oldSourceFile.libReferenceDirectives, newSourceFile.libReferenceDirectives, fileReferenceIsEqualTo)) {
structureIsReused = 1 /* SafeModules */;
} else if (oldSourceFile.hasNoDefaultLib !== newSourceFile.hasNoDefaultLib) {
structureIsReused = 1 /* SafeModules */;
} else if (!arrayIsEqualTo(oldSourceFile.referencedFiles, newSourceFile.referencedFiles, fileReferenceIsEqualTo)) {
structureIsReused = 1 /* SafeModules */;
} else {
collectExternalModuleReferences(newSourceFile);
if (!arrayIsEqualTo(oldSourceFile.imports, newSourceFile.imports, moduleNameIsEqualTo)) {
structureIsReused = 1 /* SafeModules */;
} else if (!arrayIsEqualTo(oldSourceFile.moduleAugmentations, newSourceFile.moduleAugmentations, moduleNameIsEqualTo)) {
structureIsReused = 1 /* SafeModules */;
} else if ((oldSourceFile.flags & 6291456 /* PermanentlySetIncrementalFlags */) !== (newSourceFile.flags & 6291456 /* PermanentlySetIncrementalFlags */)) {
structureIsReused = 1 /* SafeModules */;
} else if (!arrayIsEqualTo(oldSourceFile.typeReferenceDirectives, newSourceFile.typeReferenceDirectives, fileReferenceIsEqualTo)) {
structureIsReused = 1 /* SafeModules */;
}
}
modifiedSourceFiles.push({ oldFile: oldSourceFile, newFile: newSourceFile });
} else if (hasInvalidatedResolutions(oldSourceFile.path)) {
structureIsReused = 1 /* SafeModules */;
modifiedSourceFiles.push({ oldFile: oldSourceFile, newFile: newSourceFile });
}
newSourceFiles.push(newSourceFile);
}
if (structureIsReused !== 2 /* Completely */) {
return structureIsReused;
}
const modifiedFiles = modifiedSourceFiles.map((f) => f.oldFile);
for (const oldFile of oldSourceFiles) {
if (!contains(modifiedFiles, oldFile)) {
for (const moduleName of oldFile.ambientModuleNames) {
ambientModuleNameToUnmodifiedFileName.set(moduleName, oldFile.fileName);
}
}
}
for (const { oldFile: oldSourceFile, newFile: newSourceFile } of modifiedSourceFiles) {
const moduleNames = getModuleNames(newSourceFile);
const resolutions = resolveModuleNamesReusingOldState(moduleNames, newSourceFile);
const resolutionsChanged = hasChangesInResolutions(moduleNames, newSourceFile, resolutions, oldSourceFile.resolvedModules, moduleResolutionIsEqualTo, moduleResolutionNameAndModeGetter);
if (resolutionsChanged) {
structureIsReused = 1 /* SafeModules */;
newSourceFile.resolvedModules = zipToModeAwareCache(newSourceFile, moduleNames, resolutions, moduleResolutionNameAndModeGetter);
} else {
newSourceFile.resolvedModules = oldSourceFile.resolvedModules;
}
const typesReferenceDirectives = newSourceFile.typeReferenceDirectives;
const typeReferenceResolutions = resolveTypeReferenceDirectiveNamesReusingOldState(typesReferenceDirectives, newSourceFile);
const typeReferenceResolutionsChanged = hasChangesInResolutions(typesReferenceDirectives, newSourceFile, typeReferenceResolutions, oldSourceFile.resolvedTypeReferenceDirectiveNames, typeDirectiveIsEqualTo, typeReferenceResolutionNameAndModeGetter);
if (typeReferenceResolutionsChanged) {
structureIsReused = 1 /* SafeModules */;
newSourceFile.resolvedTypeReferenceDirectiveNames = zipToModeAwareCache(newSourceFile, typesReferenceDirectives, typeReferenceResolutions, typeReferenceResolutionNameAndModeGetter);
} else {
newSourceFile.resolvedTypeReferenceDirectiveNames = oldSourceFile.resolvedTypeReferenceDirectiveNames;
}
}
if (structureIsReused !== 2 /* Completely */) {
return structureIsReused;
}
if (changesAffectingProgramStructure(oldOptions, options)) {
return 1 /* SafeModules */;
}
if (oldProgram.resolvedLibReferences && forEachEntry(oldProgram.resolvedLibReferences, (resolution, libFileName) => pathForLibFileWorker(libFileName).actual !== resolution.actual)) {
return 1 /* SafeModules */;
}
if (host.hasChangedAutomaticTypeDirectiveNames) {
if (host.hasChangedAutomaticTypeDirectiveNames())
return 1 /* SafeModules */;
} else {
automaticTypeDirectiveNames = getAutomaticTypeDirectiveNames(options, host);
if (!arrayIsEqualTo(oldProgram.getAutomaticTypeDirectiveNames(), automaticTypeDirectiveNames))
return 1 /* SafeModules */;
}
missingFilePaths = oldProgram.getMissingFilePaths();
Debug.assert(newSourceFiles.length === oldProgram.getSourceFiles().length);
for (const newSourceFile of newSourceFiles) {
filesByName.set(newSourceFile.path, newSourceFile);
}
const oldFilesByNameMap = oldProgram.getFilesByNameMap();
oldFilesByNameMap.forEach((oldFile, path) => {
if (!oldFile) {
filesByName.set(path, oldFile);
return;
}
if (oldFile.path === path) {
if (oldProgram.isSourceFileFromExternalLibrary(oldFile)) {
sourceFilesFoundSearchingNodeModules.set(oldFile.path, true);
}
return;
}
filesByName.set(path, filesByName.get(oldFile.path));
});
files = newSourceFiles;
fileReasons = oldProgram.getFileIncludeReasons();
fileProcessingDiagnostics = oldProgram.getFileProcessingDiagnostics();
resolvedTypeReferenceDirectives = oldProgram.getResolvedTypeReferenceDirectives();
automaticTypeDirectiveNames = oldProgram.getAutomaticTypeDirectiveNames();
automaticTypeDirectiveResolutions = oldProgram.getAutomaticTypeDirectiveResolutions();
sourceFileToPackageName = oldProgram.sourceFileToPackageName;
redirectTargetsMap = oldProgram.redirectTargetsMap;
usesUriStyleNodeCoreModules = oldProgram.usesUriStyleNodeCoreModules;
resolvedLibReferences = oldProgram.resolvedLibReferences;
packageMap = oldProgram.getCurrentPackagesMap();
return 2 /* Completely */;
}
function getEmitHost(writeFileCallback) {
return {
getPrependNodes,
getCanonicalFileName,
getCommonSourceDirectory: program.getCommonSourceDirectory,
getCompilerOptions: program.getCompilerOptions,
getCurrentDirectory: () => currentDirectory,
getSourceFile: program.getSourceFile,
getSourceFileByPath: program.getSourceFileByPath,
getSourceFiles: program.getSourceFiles,
getLibFileFromReference: program.getLibFileFromReference,
isSourceFileFromExternalLibrary,
getResolvedProjectReferenceToRedirect,
getProjectReferenceRedirect,
isSourceOfProjectReferenceRedirect,
getSymlinkCache,
writeFile: writeFileCallback || writeFile2,
isEmitBlocked,
readFile: (f) => host.readFile(f),
fileExists: (f) => {
const path = toPath3(f);
if (getSourceFileByPath(path))
return true;
if (contains(missingFilePaths, path))
return false;
return host.fileExists(f);
},
useCaseSensitiveFileNames: () => host.useCaseSensitiveFileNames(),
getBuildInfo: (bundle) => {
var _a2;
return (_a2 = program.getBuildInfo) == null ? void 0 : _a2.call(program, bundle);
},
getSourceFileFromReference: (file, ref) => program.getSourceFileFromReference(file, ref),
redirectTargetsMap,
getFileIncludeReasons: program.getFileIncludeReasons,
createHash: maybeBind(host, host.createHash)
};
}
function writeFile2(fileName, text, writeByteOrderMark, onError, sourceFiles, data) {
host.writeFile(fileName, text, writeByteOrderMark, onError, sourceFiles, data);
}
function emitBuildInfo(writeFileCallback) {
var _a2, _b2;
Debug.assert(!outFile(options));
(_a2 = tracing) == null ? void 0 : _a2.push(
tracing.Phase.Emit,
"emitBuildInfo",
{},
/*separateBeginAndEnd*/
true
);
mark("beforeEmit");
const emitResult = emitFiles(
notImplementedResolver,
getEmitHost(writeFileCallback),
/*targetSourceFile*/
void 0,
/*transformers*/
noTransformers,
/*emitOnly*/
false,
/*onlyBuildInfo*/
true
);
mark("afterEmit");
measure("Emit", "beforeEmit", "afterEmit");
(_b2 = tracing) == null ? void 0 : _b2.pop();
return emitResult;
}
function getResolvedProjectReferences() {
return resolvedProjectReferences;
}
function getProjectReferences() {
return projectReferences;
}
function getPrependNodes() {
return createPrependNodes(
projectReferences,
(_ref, index) => {
var _a2;
return (_a2 = resolvedProjectReferences[index]) == null ? void 0 : _a2.commandLine;
},
(fileName) => {
const path = toPath3(fileName);
const sourceFile = getSourceFileByPath(path);
return sourceFile ? sourceFile.text : filesByName.has(path) ? void 0 : host.readFile(path);
},
host
);
}
function isSourceFileFromExternalLibrary(file) {
return !!sourceFilesFoundSearchingNodeModules.get(file.path);
}
function isSourceFileDefaultLibrary(file) {
if (!file.isDeclarationFile) {
return false;
}
if (file.hasNoDefaultLib) {
return true;
}
if (!options.noLib) {
return false;
}
const equalityComparer = host.useCaseSensitiveFileNames() ? equateStringsCaseSensitive : equateStringsCaseInsensitive;
if (!options.lib) {
return equalityComparer(file.fileName, getDefaultLibraryFileName());
} else {
return some(options.lib, (libFileName) => equalityComparer(file.fileName, resolvedLibReferences.get(libFileName).actual));
}
}
function getTypeChecker() {
return typeChecker || (typeChecker = createTypeChecker(program));
}
function emit(sourceFile, writeFileCallback, cancellationToken, emitOnly, transformers, forceDtsEmit) {
var _a2, _b2;
(_a2 = tracing) == null ? void 0 : _a2.push(
tracing.Phase.Emit,
"emit",
{ path: sourceFile == null ? void 0 : sourceFile.path },
/*separateBeginAndEnd*/
true
);
const result = runWithCancellationToken(() => emitWorker(program, sourceFile, writeFileCallback, cancellationToken, emitOnly, transformers, forceDtsEmit));
(_b2 = tracing) == null ? void 0 : _b2.pop();
return result;
}
function isEmitBlocked(emitFileName) {
return hasEmitBlockingDiagnostics.has(toPath3(emitFileName));
}
function emitWorker(program2, sourceFile, writeFileCallback, cancellationToken, emitOnly, customTransformers, forceDtsEmit) {
if (!forceDtsEmit) {
const result = handleNoEmitOptions(program2, sourceFile, writeFileCallback, cancellationToken);
if (result)
return result;
}
const emitResolver = getTypeChecker().getEmitResolver(outFile(options) ? void 0 : sourceFile, cancellationToken);
mark("beforeEmit");
const emitResult = emitFiles(
emitResolver,
getEmitHost(writeFileCallback),
sourceFile,
getTransformers(options, customTransformers, emitOnly),
emitOnly,
/*onlyBuildInfo*/
false,
forceDtsEmit
);
mark("afterEmit");
measure("Emit", "beforeEmit", "afterEmit");
return emitResult;
}
function getSourceFile(fileName) {
return getSourceFileByPath(toPath3(fileName));
}
function getSourceFileByPath(path) {
return filesByName.get(path) || void 0;
}
function getDiagnosticsHelper(sourceFile, getDiagnostics, cancellationToken) {
if (sourceFile) {
return sortAndDeduplicateDiagnostics(getDiagnostics(sourceFile, cancellationToken));
}
return sortAndDeduplicateDiagnostics(flatMap(program.getSourceFiles(), (sourceFile2) => {
if (cancellationToken) {
cancellationToken.throwIfCancellationRequested();
}
return getDiagnostics(sourceFile2, cancellationToken);
}));
}
function getSyntacticDiagnostics(sourceFile, cancellationToken) {
return getDiagnosticsHelper(sourceFile, getSyntacticDiagnosticsForFile, cancellationToken);
}
function getSemanticDiagnostics(sourceFile, cancellationToken) {
return getDiagnosticsHelper(sourceFile, getSemanticDiagnosticsForFile, cancellationToken);
}
function getCachedSemanticDiagnostics(sourceFile) {
var _a2;
return sourceFile ? (_a2 = cachedBindAndCheckDiagnosticsForFile.perFile) == null ? void 0 : _a2.get(sourceFile.path) : cachedBindAndCheckDiagnosticsForFile.allDiagnostics;
}
function getBindAndCheckDiagnostics(sourceFile, cancellationToken) {
return getBindAndCheckDiagnosticsForFile(sourceFile, cancellationToken);
}
function getProgramDiagnostics(sourceFile) {
var _a2;
if (skipTypeChecking(sourceFile, options, program)) {
return emptyArray;
}
const programDiagnosticsInFile = programDiagnostics.getDiagnostics(sourceFile.fileName);
if (!((_a2 = sourceFile.commentDirectives) == null ? void 0 : _a2.length)) {
return programDiagnosticsInFile;
}
return getDiagnosticsWithPrecedingDirectives(sourceFile, sourceFile.commentDirectives, programDiagnosticsInFile).diagnostics;
}
function getDeclarationDiagnostics2(sourceFile, cancellationToken) {
const options2 = program.getCompilerOptions();
if (!sourceFile || outFile(options2)) {
return getDeclarationDiagnosticsWorker(sourceFile, cancellationToken);
} else {
return getDiagnosticsHelper(sourceFile, getDeclarationDiagnosticsForFile, cancellationToken);
}
}
function getSyntacticDiagnosticsForFile(sourceFile) {
if (isSourceFileJS(sourceFile)) {
if (!sourceFile.additionalSyntacticDiagnostics) {
sourceFile.additionalSyntacticDiagnostics = getJSSyntacticDiagnosticsForFile(sourceFile);
}
return concatenate(sourceFile.additionalSyntacticDiagnostics, sourceFile.parseDiagnostics);
}
return sourceFile.parseDiagnostics;
}
function runWithCancellationToken(func) {
try {
return func();
} catch (e) {
if (e instanceof OperationCanceledException) {
typeChecker = void 0;
}
throw e;
}
}
function getSemanticDiagnosticsForFile(sourceFile, cancellationToken) {
return concatenate(
filterSemanticDiagnostics(getBindAndCheckDiagnosticsForFile(sourceFile, cancellationToken), options),
getProgramDiagnostics(sourceFile)
);
}
function getBindAndCheckDiagnosticsForFile(sourceFile, cancellationToken) {
return getAndCacheDiagnostics(sourceFile, cancellationToken, cachedBindAndCheckDiagnosticsForFile, getBindAndCheckDiagnosticsForFileNoCache);
}
function getBindAndCheckDiagnosticsForFileNoCache(sourceFile, cancellationToken) {
return runWithCancellationToken(() => {
if (skipTypeChecking(sourceFile, options, program)) {
return emptyArray;
}
const typeChecker2 = getTypeChecker();
Debug.assert(!!sourceFile.bindDiagnostics);
const isJs = sourceFile.scriptKind === 1 /* JS */ || sourceFile.scriptKind === 2 /* JSX */;
const isCheckJs = isJs && isCheckJsEnabledForFile(sourceFile, options);
const isPlainJs = isPlainJsFile(sourceFile, options.checkJs);
const isTsNoCheck = !!sourceFile.checkJsDirective && sourceFile.checkJsDirective.enabled === false;
const includeBindAndCheckDiagnostics = !isTsNoCheck && (sourceFile.scriptKind === 3 /* TS */ || sourceFile.scriptKind === 4 /* TSX */ || sourceFile.scriptKind === 5 /* External */ || isPlainJs || isCheckJs || sourceFile.scriptKind === 7 /* Deferred */);
let bindDiagnostics = includeBindAndCheckDiagnostics ? sourceFile.bindDiagnostics : emptyArray;
let checkDiagnostics = includeBindAndCheckDiagnostics ? typeChecker2.getDiagnostics(sourceFile, cancellationToken) : emptyArray;
if (isPlainJs) {
bindDiagnostics = filter(bindDiagnostics, (d) => plainJSErrors.has(d.code));
checkDiagnostics = filter(checkDiagnostics, (d) => plainJSErrors.has(d.code));
}
return getMergedBindAndCheckDiagnostics(sourceFile, includeBindAndCheckDiagnostics && !isPlainJs, bindDiagnostics, checkDiagnostics, isCheckJs ? sourceFile.jsDocDiagnostics : void 0);
});
}
function getMergedBindAndCheckDiagnostics(sourceFile, includeBindAndCheckDiagnostics, ...allDiagnostics) {
var _a2;
const flatDiagnostics = flatten(allDiagnostics);
if (!includeBindAndCheckDiagnostics || !((_a2 = sourceFile.commentDirectives) == null ? void 0 : _a2.length)) {
return flatDiagnostics;
}
const { diagnostics, directives } = getDiagnosticsWithPrecedingDirectives(sourceFile, sourceFile.commentDirectives, flatDiagnostics);
for (const errorExpectation of directives.getUnusedExpectations()) {
diagnostics.push(createDiagnosticForRange(sourceFile, errorExpectation.range, Diagnostics.Unused_ts_expect_error_directive));
}
return diagnostics;
}
function getDiagnosticsWithPrecedingDirectives(sourceFile, commentDirectives, flatDiagnostics) {
const directives = createCommentDirectivesMap(sourceFile, commentDirectives);
const diagnostics = flatDiagnostics.filter((diagnostic) => markPrecedingCommentDirectiveLine(diagnostic, directives) === -1);
return { diagnostics, directives };
}
function getSuggestionDiagnostics(sourceFile, cancellationToken) {
return runWithCancellationToken(() => {
return getTypeChecker().getSuggestionDiagnostics(sourceFile, cancellationToken);
});
}
function markPrecedingCommentDirectiveLine(diagnostic, directives) {
const { file, start } = diagnostic;
if (!file) {
return -1;
}
const lineStarts = getLineStarts(file);
let line = computeLineAndCharacterOfPosition(lineStarts, start).line - 1;
while (line >= 0) {
if (directives.markUsed(line)) {
return line;
}
const lineText = file.text.slice(lineStarts[line], lineStarts[line + 1]).trim();
if (lineText !== "" && !/^(\s*)\/\/(.*)$/.test(lineText)) {
return -1;
}
line--;
}
return -1;
}
function getJSSyntacticDiagnosticsForFile(sourceFile) {
return runWithCancellationToken(() => {
const diagnostics = [];
walk(sourceFile, sourceFile);
forEachChildRecursively(sourceFile, walk, walkArray);
return diagnostics;
function walk(node, parent) {
switch (parent.kind) {
case 168 /* Parameter */:
case 171 /* PropertyDeclaration */:
case 173 /* MethodDeclaration */:
if (parent.questionToken === node) {
diagnostics.push(createDiagnosticForNode2(node, Diagnostics.The_0_modifier_can_only_be_used_in_TypeScript_files, "?"));
return "skip";
}
case 172 /* MethodSignature */:
case 175 /* Constructor */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 217 /* FunctionExpression */:
case 261 /* FunctionDeclaration */:
case 218 /* ArrowFunction */:
case 259 /* VariableDeclaration */:
if (parent.type === node) {
diagnostics.push(createDiagnosticForNode2(node, Diagnostics.Type_annotations_can_only_be_used_in_TypeScript_files));
return "skip";
}
}
switch (node.kind) {
case 272 /* ImportClause */:
if (node.isTypeOnly) {
diagnostics.push(createDiagnosticForNode2(parent, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, "import type"));
return "skip";
}
break;
case 277 /* ExportDeclaration */:
if (node.isTypeOnly) {
diagnostics.push(createDiagnosticForNode2(node, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, "export type"));
return "skip";
}
break;
case 275 /* ImportSpecifier */:
case 280 /* ExportSpecifier */:
if (node.isTypeOnly) {
diagnostics.push(createDiagnosticForNode2(node, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, isImportSpecifier(node) ? "import...type" : "export...type"));
return "skip";
}
break;
case 270 /* ImportEqualsDeclaration */:
diagnostics.push(createDiagnosticForNode2(node, Diagnostics.import_can_only_be_used_in_TypeScript_files));
return "skip";
case 276 /* ExportAssignment */:
if (node.isExportEquals) {
diagnostics.push(createDiagnosticForNode2(node, Diagnostics.export_can_only_be_used_in_TypeScript_files));
return "skip";
}
break;
case 297 /* HeritageClause */:
const heritageClause = node;
if (heritageClause.token === 119 /* ImplementsKeyword */) {
diagnostics.push(createDiagnosticForNode2(node, Diagnostics.implements_clauses_can_only_be_used_in_TypeScript_files));
return "skip";
}
break;
case 263 /* InterfaceDeclaration */:
const interfaceKeyword = tokenToString(120 /* InterfaceKeyword */);
Debug.assertIsDefined(interfaceKeyword);
diagnostics.push(createDiagnosticForNode2(node, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, interfaceKeyword));
return "skip";
case 266 /* ModuleDeclaration */:
const moduleKeyword = node.flags & 16 /* Namespace */ ? tokenToString(145 /* NamespaceKeyword */) : tokenToString(144 /* ModuleKeyword */);
Debug.assertIsDefined(moduleKeyword);
diagnostics.push(createDiagnosticForNode2(node, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, moduleKeyword));
return "skip";
case 264 /* TypeAliasDeclaration */:
diagnostics.push(createDiagnosticForNode2(node, Diagnostics.Type_aliases_can_only_be_used_in_TypeScript_files));
return "skip";
case 265 /* EnumDeclaration */:
const enumKeyword = Debug.checkDefined(tokenToString(94 /* EnumKeyword */));
diagnostics.push(createDiagnosticForNode2(node, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, enumKeyword));
return "skip";
case 234 /* NonNullExpression */:
diagnostics.push(createDiagnosticForNode2(node, Diagnostics.Non_null_assertions_can_only_be_used_in_TypeScript_files));
return "skip";
case 233 /* AsExpression */:
diagnostics.push(createDiagnosticForNode2(node.type, Diagnostics.Type_assertion_expressions_can_only_be_used_in_TypeScript_files));
return "skip";
case 237 /* SatisfiesExpression */:
diagnostics.push(createDiagnosticForNode2(node.type, Diagnostics.Type_satisfaction_expressions_can_only_be_used_in_TypeScript_files));
return "skip";
case 215 /* TypeAssertionExpression */:
Debug.fail();
}
}
function walkArray(nodes, parent) {
if (canHaveIllegalDecorators(parent)) {
const decorator = find(parent.modifiers, isDecorator);
if (decorator) {
diagnostics.push(createDiagnosticForNode2(decorator, Diagnostics.Decorators_are_not_valid_here));
}
} else if (canHaveDecorators(parent) && parent.modifiers) {
const decoratorIndex = findIndex(parent.modifiers, isDecorator);
if (decoratorIndex >= 0) {
if (isParameter(parent) && !options.experimentalDecorators) {
diagnostics.push(createDiagnosticForNode2(parent.modifiers[decoratorIndex], Diagnostics.Decorators_are_not_valid_here));
} else if (isClassDeclaration(parent)) {
const exportIndex = findIndex(parent.modifiers, isExportModifier);
if (exportIndex >= 0) {
const defaultIndex = findIndex(parent.modifiers, isDefaultModifier);
if (decoratorIndex > exportIndex && defaultIndex >= 0 && decoratorIndex < defaultIndex) {
diagnostics.push(createDiagnosticForNode2(parent.modifiers[decoratorIndex], Diagnostics.Decorators_are_not_valid_here));
} else if (exportIndex >= 0 && decoratorIndex < exportIndex) {
const trailingDecoratorIndex = findIndex(parent.modifiers, isDecorator, exportIndex);
if (trailingDecoratorIndex >= 0) {
diagnostics.push(addRelatedInfo(
createDiagnosticForNode2(parent.modifiers[trailingDecoratorIndex], Diagnostics.Decorators_may_not_appear_after_export_or_export_default_if_they_also_appear_before_export),
createDiagnosticForNode2(parent.modifiers[decoratorIndex], Diagnostics.Decorator_used_before_export_here)
));
}
}
}
}
}
}
switch (parent.kind) {
case 262 /* ClassDeclaration */:
case 230 /* ClassExpression */:
case 173 /* MethodDeclaration */:
case 175 /* Constructor */:
case 176 /* GetAccessor */:
case 177 /* SetAccessor */:
case 217 /* FunctionExpression */:
case 261 /* FunctionDeclaration */:
case 218 /* ArrowFunction */:
if (nodes === parent.typeParameters) {
diagnostics.push(createDiagnosticForNodeArray2(nodes, Diagnostics.Type_parameter_declarations_can_only_be_used_in_TypeScript_files));
return "skip";
}
case 242 /* VariableStatement */:
if (nodes === parent.modifiers) {
checkModifiers(parent.modifiers, parent.kind === 242 /* VariableStatement */);
return "skip";
}
break;
case 171 /* PropertyDeclaration */:
if (nodes === parent.modifiers) {
for (const modifier of nodes) {
if (isModifier(modifier) && modifier.kind !== 126 /* StaticKeyword */ && modifier.kind !== 129 /* AccessorKeyword */) {
diagnostics.push(createDiagnosticForNode2(modifier, Diagnostics.The_0_modifier_can_only_be_used_in_TypeScript_files, tokenToString(modifier.kind)));
}
}
return "skip";
}
break;
case 168 /* Parameter */:
if (nodes === parent.modifiers && some(nodes, isModifier)) {
diagnostics.push(createDiagnosticForNodeArray2(nodes, Diagnostics.Parameter_modifiers_can_only_be_used_in_TypeScript_files));
return "skip";
}
break;
case 212 /* CallExpression */:
case 213 /* NewExpression */:
case 232 /* ExpressionWithTypeArguments */:
case 284 /* JsxSelfClosingElement */:
case 285 /* JsxOpeningElement */:
case 214 /* TaggedTemplateExpression */:
if (nodes === parent.typeArguments) {
diagnostics.push(createDiagnosticForNodeArray2(nodes, Diagnostics.Type_arguments_can_only_be_used_in_TypeScript_files));
return "skip";
}
break;
}
}
function checkModifiers(modifiers, isConstValid) {
for (const modifier of modifiers) {
switch (modifier.kind) {
case 87 /* ConstKeyword */:
if (isConstValid) {
continue;
}
case 125 /* PublicKeyword */:
case 123 /* PrivateKeyword */:
case 124 /* ProtectedKeyword */:
case 148 /* ReadonlyKeyword */:
case 138 /* DeclareKeyword */:
case 128 /* AbstractKeyword */:
case 163 /* OverrideKeyword */:
case 103 /* InKeyword */:
case 147 /* OutKeyword */:
diagnostics.push(createDiagnosticForNode2(modifier, Diagnostics.The_0_modifier_can_only_be_used_in_TypeScript_files, tokenToString(modifier.kind)));
break;
case 126 /* StaticKeyword */:
case 95 /* ExportKeyword */:
case 90 /* DefaultKeyword */:
case 129 /* AccessorKeyword */:
}
}
}
function createDiagnosticForNodeArray2(nodes, message, ...args) {
const start = nodes.pos;
return createFileDiagnostic(sourceFile, start, nodes.end - start, message, ...args);
}
function createDiagnosticForNode2(node, message, ...args) {
return createDiagnosticForNodeInSourceFile(sourceFile, node, message, ...args);
}
});
}
function getDeclarationDiagnosticsWorker(sourceFile, cancellationToken) {
return getAndCacheDiagnostics(sourceFile, cancellationToken, cachedDeclarationDiagnosticsForFile, getDeclarationDiagnosticsForFileNoCache);
}
function getDeclarationDiagnosticsForFileNoCache(sourceFile, cancellationToken) {
return runWithCancellationToken(() => {
const resolver = getTypeChecker().getEmitResolver(sourceFile, cancellationToken);
return getDeclarationDiagnostics(getEmitHost(noop), resolver, sourceFile) || emptyArray;
});
}
function getAndCacheDiagnostics(sourceFile, cancellationToken, cache, getDiagnostics) {
var _a2;
const cachedResult = sourceFile ? (_a2 = cache.perFile) == null ? void 0 : _a2.get(sourceFile.path) : cache.allDiagnostics;
if (cachedResult) {
return cachedResult;
}
const result = getDiagnostics(sourceFile, cancellationToken);
if (sourceFile) {
(cache.perFile || (cache.perFile = /* @__PURE__ */ new Map())).set(sourceFile.path, result);
} else {
cache.allDiagnostics = result;
}
return result;
}
function getDeclarationDiagnosticsForFile(sourceFile, cancellationToken) {
return sourceFile.isDeclarationFile ? [] : getDeclarationDiagnosticsWorker(sourceFile, cancellationToken);
}
function getOptionsDiagnostics() {
return sortAndDeduplicateDiagnostics(concatenate(
programDiagnostics.getGlobalDiagnostics(),
getOptionsDiagnosticsOfConfigFile()
));
}
function getOptionsDiagnosticsOfConfigFile() {
if (!options.configFile)
return emptyArray;
let diagnostics = programDiagnostics.getDiagnostics(options.configFile.fileName);
forEachResolvedProjectReference2((resolvedRef) => {
diagnostics = concatenate(diagnostics, programDiagnostics.getDiagnostics(resolvedRef.sourceFile.fileName));
});
return diagnostics;
}
function getGlobalDiagnostics() {
return rootNames.length ? sortAndDeduplicateDiagnostics(getTypeChecker().getGlobalDiagnostics().slice()) : emptyArray;
}
function getConfigFileParsingDiagnostics2() {
return configFileParsingDiagnostics || emptyArray;
}
function processRootFile(fileName, isDefaultLib, ignoreNoDefaultLib, reason) {
processSourceFile(
normalizePath(fileName),
isDefaultLib,
ignoreNoDefaultLib,
/*packageId*/
void 0,
reason
);
}
function fileReferenceIsEqualTo(a, b) {
return a.fileName === b.fileName;
}
function moduleNameIsEqualTo(a, b) {
return a.kind === 80 /* Identifier */ ? b.kind === 80 /* Identifier */ && a.escapedText === b.escapedText : b.kind === 11 /* StringLiteral */ && a.text === b.text;
}
function createSyntheticImport(text, file) {
const externalHelpersModuleReference = factory.createStringLiteral(text);
const importDecl = factory.createImportDeclaration(
/*modifiers*/
void 0,
/*importClause*/
void 0,
externalHelpersModuleReference,
/*assertClause*/
void 0
);
addInternalEmitFlags(importDecl, 2 /* NeverApplyImportHelper */);
setParent(externalHelpersModuleReference, importDecl);
setParent(importDecl, file);
externalHelpersModuleReference.flags &= ~8 /* Synthesized */;
importDecl.flags &= ~8 /* Synthesized */;
return externalHelpersModuleReference;
}
function collectExternalModuleReferences(file) {
if (file.imports) {
return;
}
const isJavaScriptFile = isSourceFileJS(file);
const isExternalModuleFile = isExternalModule(file);
let imports;
let moduleAugmentations;
let ambientModules;
if ((getIsolatedModules(options) || isExternalModuleFile) && !file.isDeclarationFile) {
if (options.importHelpers) {
imports = [createSyntheticImport(externalHelpersModuleNameText, file)];
}
const jsxImport = getJSXRuntimeImport(getJSXImplicitImportBase(options, file), options);
if (jsxImport) {
(imports || (imports = [])).push(createSyntheticImport(jsxImport, file));
}
}
for (const node of file.statements) {
collectModuleReferences(
node,
/*inAmbientModule*/
false
);
}
const shouldProcessRequires = isJavaScriptFile && shouldResolveJsRequire(options);
if (file.flags & 2097152 /* PossiblyContainsDynamicImport */ || shouldProcessRequires) {
collectDynamicImportOrRequireCalls(file);
}
file.imports = imports || emptyArray;
file.moduleAugmentations = moduleAugmentations || emptyArray;
file.ambientModuleNames = ambientModules || emptyArray;
return;
function collectModuleReferences(node, inAmbientModule) {
if (isAnyImportOrReExport(node)) {
const moduleNameExpr = getExternalModuleName(node);
if (moduleNameExpr && isStringLiteral(moduleNameExpr) && moduleNameExpr.text && (!inAmbientModule || !isExternalModuleNameRelative(moduleNameExpr.text))) {
setParentRecursive(
node,
/*incremental*/
false
);
imports = append(imports, moduleNameExpr);
if (!usesUriStyleNodeCoreModules && currentNodeModulesDepth === 0 && !file.isDeclarationFile) {
usesUriStyleNodeCoreModules = startsWith(moduleNameExpr.text, "node:");
}
}
} else if (isModuleDeclaration(node)) {
if (isAmbientModule(node) && (inAmbientModule || hasSyntacticModifier(node, 2 /* Ambient */) || file.isDeclarationFile)) {
node.name.parent = node;
const nameText = getTextOfIdentifierOrLiteral(node.name);
if (isExternalModuleFile || inAmbientModule && !isExternalModuleNameRelative(nameText)) {
(moduleAugmentations || (moduleAugmentations = [])).push(node.name);
} else if (!inAmbientModule) {
if (file.isDeclarationFile) {
(ambientModules || (ambientModules = [])).push(nameText);
}
const body = node.body;
if (body) {
for (const statement of body.statements) {
collectModuleReferences(
statement,
/*inAmbientModule*/
true
);
}
}
}
}
}
}
function collectDynamicImportOrRequireCalls(file2) {
const r = /import|require/g;
while (r.exec(file2.text) !== null) {
const node = getNodeAtPosition(file2, r.lastIndex);
if (shouldProcessRequires && isRequireCall(
node,
/*requireStringLiteralLikeArgument*/
true
)) {
setParentRecursive(
node,
/*incremental*/
false
);
imports = append(imports, node.arguments[0]);
} else if (isImportCall(node) && node.arguments.length >= 1 && isStringLiteralLike(node.arguments[0])) {
setParentRecursive(
node,
/*incremental*/
false
);
imports = append(imports, node.arguments[0]);
} else if (isLiteralImportTypeNode(node)) {
setParentRecursive(
node,
/*incremental*/
false
);
imports = append(imports, node.argument.literal);
}
}
}
function getNodeAtPosition(sourceFile, position) {
let current = sourceFile;
const getContainingChild = (child) => {
if (child.pos <= position && (position < child.end || position === child.end && child.kind === 1 /* EndOfFileToken */)) {
return child;
}
};
while (true) {
const child = isJavaScriptFile && hasJSDocNodes(current) && forEach(current.jsDoc, getContainingChild) || forEachChild(current, getContainingChild);
if (!child) {
return current;
}
current = child;
}
}
}
function getLibFileFromReference(ref) {
var _a2;
const { libFileName } = getLibFileNameFromLibReference(ref);
const actualFileName = libFileName && ((_a2 = resolvedLibReferences == null ? void 0 : resolvedLibReferences.get(libFileName)) == null ? void 0 : _a2.actual);
return actualFileName !== void 0 ? getSourceFile(actualFileName) : void 0;
}
function getSourceFileFromReference(referencingFile, ref) {
return getSourceFileFromReferenceWorker(resolveTripleslashReference(ref.fileName, referencingFile.fileName), getSourceFile);
}
function getSourceFileFromReferenceWorker(fileName, getSourceFile2, fail, reason) {
if (hasExtension(fileName)) {
const canonicalFileName = host.getCanonicalFileName(fileName);
if (!options.allowNonTsExtensions && !forEach(flatten(supportedExtensionsWithJsonIfResolveJsonModule), (extension) => fileExtensionIs(canonicalFileName, extension))) {
if (fail) {
if (hasJSFileExtension(canonicalFileName)) {
fail(Diagnostics.File_0_is_a_JavaScript_file_Did_you_mean_to_enable_the_allowJs_option, fileName);
} else {
fail(Diagnostics.File_0_has_an_unsupported_extension_The_only_supported_extensions_are_1, fileName, "'" + flatten(supportedExtensions).join("', '") + "'");
}
}
return void 0;
}
const sourceFile = getSourceFile2(fileName);
if (fail) {
if (!sourceFile) {
const redirect = getProjectReferenceRedirect(fileName);
if (redirect) {
fail(Diagnostics.Output_file_0_has_not_been_built_from_source_file_1, redirect, fileName);
} else {
fail(Diagnostics.File_0_not_found, fileName);
}
} else if (isReferencedFile(reason) && canonicalFileName === host.getCanonicalFileName(getSourceFileByPath(reason.file).fileName)) {
fail(Diagnostics.A_file_cannot_have_a_reference_to_itself);
}
}
return sourceFile;
} else {
const sourceFileNoExtension = options.allowNonTsExtensions && getSourceFile2(fileName);
if (sourceFileNoExtension)
return sourceFileNoExtension;
if (fail && options.allowNonTsExtensions) {
fail(Diagnostics.File_0_not_found, fileName);
return void 0;
}
const sourceFileWithAddedExtension = forEach(supportedExtensions[0], (extension) => getSourceFile2(fileName + extension));
if (fail && !sourceFileWithAddedExtension)
fail(Diagnostics.Could_not_resolve_the_path_0_with_the_extensions_Colon_1, fileName, "'" + flatten(supportedExtensions).join("', '") + "'");
return sourceFileWithAddedExtension;
}
}
function processSourceFile(fileName, isDefaultLib, ignoreNoDefaultLib, packageId, reason) {
getSourceFileFromReferenceWorker(
fileName,
(fileName2) => findSourceFile(fileName2, isDefaultLib, ignoreNoDefaultLib, reason, packageId),
// TODO: GH#18217
(diagnostic, ...args) => addFilePreprocessingFileExplainingDiagnostic(
/*file*/
void 0,
reason,
diagnostic,
args
),
reason
);
}
function processProjectReferenceFile(fileName, reason) {
return processSourceFile(
fileName,
/*isDefaultLib*/
false,
/*ignoreNoDefaultLib*/
false,
/*packageId*/
void 0,
reason
);
}
function reportFileNamesDifferOnlyInCasingError(fileName, existingFile, reason) {
const hasExistingReasonToReportErrorOn = !isReferencedFile(reason) && some(fileReasons.get(existingFile.path), isReferencedFile);
if (hasExistingReasonToReportErrorOn) {
addFilePreprocessingFileExplainingDiagnostic(existingFile, reason, Diagnostics.Already_included_file_name_0_differs_from_file_name_1_only_in_casing, [existingFile.fileName, fileName]);
} else {
addFilePreprocessingFileExplainingDiagnostic(existingFile, reason, Diagnostics.File_name_0_differs_from_already_included_file_name_1_only_in_casing, [fileName, existingFile.fileName]);
}
}
function createRedirectedSourceFile(redirectTarget, unredirected, fileName, path, resolvedPath, originalFileName, sourceFileOptions) {
var _a2;
const redirect = parseNodeFactory.createRedirectedSourceFile({ redirectTarget, unredirected });
redirect.fileName = fileName;
redirect.path = path;
redirect.resolvedPath = resolvedPath;
redirect.originalFileName = originalFileName;
redirect.packageJsonLocations = ((_a2 = sourceFileOptions.packageJsonLocations) == null ? void 0 : _a2.length) ? sourceFileOptions.packageJsonLocations : void 0;
redirect.packageJsonScope = sourceFileOptions.packageJsonScope;
sourceFilesFoundSearchingNodeModules.set(path, currentNodeModulesDepth > 0);
return redirect;
}
function findSourceFile(fileName, isDefaultLib, ignoreNoDefaultLib, reason, packageId) {
var _a2, _b2;
(_a2 = tracing) == null ? void 0 : _a2.push(tracing.Phase.Program, "findSourceFile", {
fileName,
isDefaultLib: isDefaultLib || void 0,
fileIncludeKind: FileIncludeKind[reason.kind]
});
const result = findSourceFileWorker(fileName, isDefaultLib, ignoreNoDefaultLib, reason, packageId);
(_b2 = tracing) == null ? void 0 : _b2.pop();
return result;
}
function getCreateSourceFileOptions(fileName, moduleResolutionCache2, host2, options2) {
const result = getImpliedNodeFormatForFileWorker(getNormalizedAbsolutePath(fileName, currentDirectory), moduleResolutionCache2 == null ? void 0 : moduleResolutionCache2.getPackageJsonInfoCache(), host2, options2);
const languageVersion = getEmitScriptTarget(options2);
const setExternalModuleIndicator2 = getSetExternalModuleIndicator(options2);
return typeof result === "object" ? { ...result, languageVersion, setExternalModuleIndicator: setExternalModuleIndicator2 } : { languageVersion, impliedNodeFormat: result, setExternalModuleIndicator: setExternalModuleIndicator2 };
}
function findSourceFileWorker(fileName, isDefaultLib, ignoreNoDefaultLib, reason, packageId) {
var _a2, _b2;
const path = toPath3(fileName);
if (useSourceOfProjectReferenceRedirect) {
let source = getSourceOfProjectReferenceRedirect(path);
if (!source && host.realpath && options.preserveSymlinks && isDeclarationFileName(fileName) && stringContains(fileName, nodeModulesPathPart)) {
const realPath2 = toPath3(host.realpath(fileName));
if (realPath2 !== path)
source = getSourceOfProjectReferenceRedirect(realPath2);
}
if (source) {
const file2 = isString(source) ? findSourceFile(source, isDefaultLib, ignoreNoDefaultLib, reason, packageId) : void 0;
if (file2)
addFileToFilesByName(
file2,
path,
/*redirectedPath*/
void 0
);
return file2;
}
}
const originalFileName = fileName;
if (filesByName.has(path)) {
const file2 = filesByName.get(path);
addFileIncludeReason(file2 || void 0, reason);
if (file2 && !(options.forceConsistentCasingInFileNames === false)) {
const checkedName = file2.fileName;
const isRedirect = toPath3(checkedName) !== toPath3(fileName);
if (isRedirect) {
fileName = getProjectReferenceRedirect(fileName) || fileName;
}
const checkedAbsolutePath = getNormalizedAbsolutePathWithoutRoot(checkedName, currentDirectory);
const inputAbsolutePath = getNormalizedAbsolutePathWithoutRoot(fileName, currentDirectory);
if (checkedAbsolutePath !== inputAbsolutePath) {
reportFileNamesDifferOnlyInCasingError(fileName, file2, reason);
}
}
if (file2 && sourceFilesFoundSearchingNodeModules.get(file2.path) && currentNodeModulesDepth === 0) {
sourceFilesFoundSearchingNodeModules.set(file2.path, false);
if (!options.noResolve) {
processReferencedFiles(file2, isDefaultLib);
processTypeReferenceDirectives(file2);
}
if (!options.noLib) {
processLibReferenceDirectives(file2);
}
modulesWithElidedImports.set(file2.path, false);
processImportedModules(file2);
} else if (file2 && modulesWithElidedImports.get(file2.path)) {
if (currentNodeModulesDepth < maxNodeModuleJsDepth) {
modulesWithElidedImports.set(file2.path, false);
processImportedModules(file2);
}
}
return file2 || void 0;
}
let redirectedPath;
if (isReferencedFile(reason) && !useSourceOfProjectReferenceRedirect) {
const redirectProject = getProjectReferenceRedirectProject(fileName);
if (redirectProject) {
if (outFile(redirectProject.commandLine.options)) {
return void 0;
}
const redirect = getProjectReferenceOutputName(redirectProject, fileName);
fileName = redirect;
redirectedPath = toPath3(redirect);
}
}
const sourceFileOptions = getCreateSourceFileOptions(fileName, moduleResolutionCache, host, options);
const file = host.getSourceFile(
fileName,
sourceFileOptions,
(hostErrorMessage) => addFilePreprocessingFileExplainingDiagnostic(
/*file*/
void 0,
reason,
Diagnostics.Cannot_read_file_0_Colon_1,
[fileName, hostErrorMessage]
),
shouldCreateNewSourceFile || ((_a2 = oldProgram == null ? void 0 : oldProgram.getSourceFileByPath(toPath3(fileName))) == null ? void 0 : _a2.impliedNodeFormat) !== sourceFileOptions.impliedNodeFormat
);
if (packageId) {
const packageIdKey = packageIdToString(packageId);
const fileFromPackageId = packageIdToSourceFile.get(packageIdKey);
if (fileFromPackageId) {
const dupFile = createRedirectedSourceFile(fileFromPackageId, file, fileName, path, toPath3(fileName), originalFileName, sourceFileOptions);
redirectTargetsMap.add(fileFromPackageId.path, fileName);
addFileToFilesByName(dupFile, path, redirectedPath);
addFileIncludeReason(dupFile, reason);
sourceFileToPackageName.set(path, packageIdToPackageName(packageId));
processingOtherFiles.push(dupFile);
return dupFile;
} else if (file) {
packageIdToSourceFile.set(packageIdKey, file);
sourceFileToPackageName.set(path, packageIdToPackageName(packageId));
}
}
addFileToFilesByName(file, path, redirectedPath);
if (file) {
sourceFilesFoundSearchingNodeModules.set(path, currentNodeModulesDepth > 0);
file.fileName = fileName;
file.path = path;
file.resolvedPath = toPath3(fileName);
file.originalFileName = originalFileName;
file.packageJsonLocations = ((_b2 = sourceFileOptions.packageJsonLocations) == null ? void 0 : _b2.length) ? sourceFileOptions.packageJsonLocations : void 0;
file.packageJsonScope = sourceFileOptions.packageJsonScope;
addFileIncludeReason(file, reason);
if (host.useCaseSensitiveFileNames()) {
const pathLowerCase = toFileNameLowerCase(path);
const existingFile = filesByNameIgnoreCase.get(pathLowerCase);
if (existingFile) {
reportFileNamesDifferOnlyInCasingError(fileName, existingFile, reason);
} else {
filesByNameIgnoreCase.set(pathLowerCase, file);
}
}
skipDefaultLib = skipDefaultLib || file.hasNoDefaultLib && !ignoreNoDefaultLib;
if (!options.noResolve) {
processReferencedFiles(file, isDefaultLib);
processTypeReferenceDirectives(file);
}
if (!options.noLib) {
processLibReferenceDirectives(file);
}
processImportedModules(file);
if (isDefaultLib) {
processingDefaultLibFiles.push(file);
} else {
processingOtherFiles.push(file);
}
}
return file;
}
function addFileIncludeReason(file, reason) {
if (file)
fileReasons.add(file.path, reason);
}
function addFileToFilesByName(file, path, redirectedPath) {
if (redirectedPath) {
filesByName.set(redirectedPath, file);
filesByName.set(path, file || false);
} else {
filesByName.set(path, file);
}
}
function getProjectReferenceRedirect(fileName) {
const referencedProject = getProjectReferenceRedirectProject(fileName);
return referencedProject && getProjectReferenceOutputName(referencedProject, fileName);
}
function getProjectReferenceRedirectProject(fileName) {
if (!resolvedProjectReferences || !resolvedProjectReferences.length || isDeclarationFileName(fileName) || fileExtensionIs(fileName, ".json" /* Json */)) {
return void 0;
}
return getResolvedProjectReferenceToRedirect(fileName);
}
function getProjectReferenceOutputName(referencedProject, fileName) {
const out = outFile(referencedProject.commandLine.options);
return out ? changeExtension(out, ".d.ts" /* Dts */) : getOutputDeclarationFileName(fileName, referencedProject.commandLine, !host.useCaseSensitiveFileNames());
}
function getResolvedProjectReferenceToRedirect(fileName) {
if (mapFromFileToProjectReferenceRedirects === void 0) {
mapFromFileToProjectReferenceRedirects = /* @__PURE__ */ new Map();
forEachResolvedProjectReference2((referencedProject) => {
if (toPath3(options.configFilePath) !== referencedProject.sourceFile.path) {
referencedProject.commandLine.fileNames.forEach((f) => mapFromFileToProjectReferenceRedirects.set(toPath3(f), referencedProject.sourceFile.path));
}
});
}
const referencedProjectPath = mapFromFileToProjectReferenceRedirects.get(toPath3(fileName));
return referencedProjectPath && getResolvedProjectReferenceByPath(referencedProjectPath);
}
function forEachResolvedProjectReference2(cb) {
return forEachResolvedProjectReference(resolvedProjectReferences, cb);
}
function getSourceOfProjectReferenceRedirect(path) {
if (!isDeclarationFileName(path))
return void 0;
if (mapFromToProjectReferenceRedirectSource === void 0) {
mapFromToProjectReferenceRedirectSource = /* @__PURE__ */ new Map();
forEachResolvedProjectReference2((resolvedRef) => {
const out = outFile(resolvedRef.commandLine.options);
if (out) {
const outputDts = changeExtension(out, ".d.ts" /* Dts */);
mapFromToProjectReferenceRedirectSource.set(toPath3(outputDts), true);
} else {
const getCommonSourceDirectory3 = memoize(() => getCommonSourceDirectoryOfConfig(resolvedRef.commandLine, !host.useCaseSensitiveFileNames()));
forEach(resolvedRef.commandLine.fileNames, (fileName) => {
if (!isDeclarationFileName(fileName) && !fileExtensionIs(fileName, ".json" /* Json */)) {
const outputDts = getOutputDeclarationFileName(fileName, resolvedRef.commandLine, !host.useCaseSensitiveFileNames(), getCommonSourceDirectory3);
mapFromToProjectReferenceRedirectSource.set(toPath3(outputDts), fileName);
}
});
}
});
}
return mapFromToProjectReferenceRedirectSource.get(path);
}
function isSourceOfProjectReferenceRedirect(fileName) {
return useSourceOfProjectReferenceRedirect && !!getResolvedProjectReferenceToRedirect(fileName);
}
function getResolvedProjectReferenceByPath(projectReferencePath) {
if (!projectReferenceRedirects) {
return void 0;
}
return projectReferenceRedirects.get(projectReferencePath) || void 0;
}
function processReferencedFiles(file, isDefaultLib) {
forEach(file.referencedFiles, (ref, index) => {
processSourceFile(
resolveTripleslashReference(ref.fileName, file.fileName),
isDefaultLib,
/*ignoreNoDefaultLib*/
false,
/*packageId*/
void 0,
{ kind: 4 /* ReferenceFile */, file: file.path, index }
);
});
}
function processTypeReferenceDirectives(file) {
const typeDirectives = file.typeReferenceDirectives;
if (!typeDirectives.length) {
file.resolvedTypeReferenceDirectiveNames = void 0;
return;
}
const resolutions = resolveTypeReferenceDirectiveNamesReusingOldState(typeDirectives, file);
for (let index = 0; index < typeDirectives.length; index++) {
const ref = file.typeReferenceDirectives[index];
const resolvedTypeReferenceDirective = resolutions[index];
const fileName = toFileNameLowerCase(ref.fileName);
setResolvedTypeReferenceDirective(file, fileName, resolvedTypeReferenceDirective, getModeForFileReference(ref, file.impliedNodeFormat));
const mode = ref.resolutionMode || file.impliedNodeFormat;
if (mode && getEmitModuleResolutionKind(options) !== 3 /* Node16 */ && getEmitModuleResolutionKind(options) !== 99 /* NodeNext */) {
(fileProcessingDiagnostics ?? (fileProcessingDiagnostics = [])).push({
kind: 2 /* ResolutionDiagnostics */,
diagnostics: [
createDiagnosticForRange(file, ref, Diagnostics.resolution_mode_assertions_are_only_supported_when_moduleResolution_is_node16_or_nodenext)
]
});
}
processTypeReferenceDirective(fileName, mode, resolvedTypeReferenceDirective, { kind: 5 /* TypeReferenceDirective */, file: file.path, index });
}
}
function processTypeReferenceDirective(typeReferenceDirective, mode, resolution, reason) {
var _a2, _b2;
(_a2 = tracing) == null ? void 0 : _a2.push(tracing.Phase.Program, "processTypeReferenceDirective", { directive: typeReferenceDirective, hasResolved: !!resolution.resolvedTypeReferenceDirective, refKind: reason.kind, refPath: isReferencedFile(reason) ? reason.file : void 0 });
processTypeReferenceDirectiveWorker(typeReferenceDirective, mode, resolution, reason);
(_b2 = tracing) == null ? void 0 : _b2.pop();
}
function processTypeReferenceDirectiveWorker(typeReferenceDirective, mode, resolution, reason) {
var _a2;
addResolutionDiagnostics(resolution);
const previousResolution = (_a2 = resolvedTypeReferenceDirectives.get(typeReferenceDirective, mode)) == null ? void 0 : _a2.resolvedTypeReferenceDirective;
if (previousResolution && previousResolution.primary) {
return;
}
let saveResolution = true;
const { resolvedTypeReferenceDirective } = resolution;
if (resolvedTypeReferenceDirective) {
if (resolvedTypeReferenceDirective.isExternalLibraryImport)
currentNodeModulesDepth++;
if (resolvedTypeReferenceDirective.primary) {
processSourceFile(
resolvedTypeReferenceDirective.resolvedFileName,
/*isDefaultLib*/
false,
/*ignoreNoDefaultLib*/
false,
resolvedTypeReferenceDirective.packageId,
reason
);
} else {
if (previousResolution) {
if (resolvedTypeReferenceDirective.resolvedFileName !== previousResolution.resolvedFileName) {
const otherFileText = host.readFile(resolvedTypeReferenceDirective.resolvedFileName);
const existingFile = getSourceFile(previousResolution.resolvedFileName);
if (otherFileText !== existingFile.text) {
addFilePreprocessingFileExplainingDiagnostic(
existingFile,
reason,
Diagnostics.Conflicting_definitions_for_0_found_at_1_and_2_Consider_installing_a_specific_version_of_this_library_to_resolve_the_conflict,
[typeReferenceDirective, resolvedTypeReferenceDirective.resolvedFileName, previousResolution.resolvedFileName]
);
}
}
saveResolution = false;
} else {
processSourceFile(
resolvedTypeReferenceDirective.resolvedFileName,
/*isDefaultLib*/
false,
/*ignoreNoDefaultLib*/
false,
resolvedTypeReferenceDirective.packageId,
reason
);
}
}
if (resolvedTypeReferenceDirective.isExternalLibraryImport)
currentNodeModulesDepth--;
} else {
addFilePreprocessingFileExplainingDiagnostic(
/*file*/
void 0,
reason,
Diagnostics.Cannot_find_type_definition_file_for_0,
[typeReferenceDirective]
);
}
if (saveResolution) {
resolvedTypeReferenceDirectives.set(typeReferenceDirective, mode, resolution);
}
}
function pathForLibFile(libFileName) {
const existing = resolvedLibReferences == null ? void 0 : resolvedLibReferences.get(libFileName);
if (existing)
return existing.actual;
const result = pathForLibFileWorker(libFileName);
(resolvedLibReferences ?? (resolvedLibReferences = /* @__PURE__ */ new Map())).set(libFileName, result);
return result.actual;
}
function pathForLibFileWorker(libFileName) {
var _a2, _b2, _c2, _d2, _e2;
const existing = resolvedLibProcessing == null ? void 0 : resolvedLibProcessing.get(libFileName);
if (existing)
return existing;
if (structureIsReused !== 0 /* Not */ && oldProgram && !hasInvalidatedLibResolutions(libFileName)) {
const oldResolution = (_a2 = oldProgram.resolvedLibReferences) == null ? void 0 : _a2.get(libFileName);
if (oldResolution) {
if (oldResolution.resolution && isTraceEnabled(options, host)) {
const libraryName2 = getLibraryNameFromLibFileName(libFileName);
const resolveFrom2 = getInferredLibraryNameResolveFrom(options, currentDirectory, libFileName);
trace(
host,
oldResolution.resolution.resolvedModule ? oldResolution.resolution.resolvedModule.packageId ? Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_not_resolved,
libraryName2,
getNormalizedAbsolutePath(resolveFrom2, currentDirectory),
(_b2 = oldResolution.resolution.resolvedModule) == null ? void 0 : _b2.resolvedFileName,
((_c2 = oldResolution.resolution.resolvedModule) == null ? void 0 : _c2.packageId) && packageIdToString(oldResolution.resolution.resolvedModule.packageId)
);
}
(resolvedLibProcessing ?? (resolvedLibProcessing = /* @__PURE__ */ new Map())).set(libFileName, oldResolution);
return oldResolution;
}
}
const libraryName = getLibraryNameFromLibFileName(libFileName);
const resolveFrom = getInferredLibraryNameResolveFrom(options, currentDirectory, libFileName);
(_d2 = tracing) == null ? void 0 : _d2.push(tracing.Phase.Program, "resolveLibrary", { resolveFrom });
mark("beforeResolveLibrary");
const resolution = actualResolveLibrary(libraryName, resolveFrom, options, libFileName);
mark("afterResolveLibrary");
measure("ResolveLibrary", "beforeResolveLibrary", "afterResolveLibrary");
(_e2 = tracing) == null ? void 0 : _e2.pop();
const result = {
resolution,
actual: resolution.resolvedModule ? resolution.resolvedModule.resolvedFileName : combinePaths(defaultLibraryPath, libFileName)
};
(resolvedLibProcessing ?? (resolvedLibProcessing = /* @__PURE__ */ new Map())).set(libFileName, result);
return result;
}
function processLibReferenceDirectives(file) {
forEach(file.libReferenceDirectives, (libReference, index) => {
const { libName, libFileName } = getLibFileNameFromLibReference(libReference);
if (libFileName) {
processRootFile(
pathForLibFile(libFileName),
/*isDefaultLib*/
true,
/*ignoreNoDefaultLib*/
true,
{ kind: 7 /* LibReferenceDirective */, file: file.path, index }
);
} else {
const unqualifiedLibName = removeSuffix(removePrefix(libName, "lib."), ".d.ts");
const suggestion = getSpellingSuggestion(unqualifiedLibName, libs, identity);
const diagnostic = suggestion ? Diagnostics.Cannot_find_lib_definition_for_0_Did_you_mean_1 : Diagnostics.Cannot_find_lib_definition_for_0;
const args = suggestion ? [libName, suggestion] : [libName];
(fileProcessingDiagnostics || (fileProcessingDiagnostics = [])).push({
kind: 0 /* FilePreprocessingReferencedDiagnostic */,
reason: { kind: 7 /* LibReferenceDirective */, file: file.path, index },
diagnostic,
args
});
}
});
}
function getCanonicalFileName(fileName) {
return host.getCanonicalFileName(fileName);
}
function processImportedModules(file) {
var _a2;
collectExternalModuleReferences(file);
if (file.imports.length || file.moduleAugmentations.length) {
const moduleNames = getModuleNames(file);
const resolutions = resolveModuleNamesReusingOldState(moduleNames, file);
Debug.assert(resolutions.length === moduleNames.length);
const optionsForFile = (useSourceOfProjectReferenceRedirect ? (_a2 = getRedirectReferenceForResolution(file)) == null ? void 0 : _a2.commandLine.options : void 0) || options;
for (let index = 0; index < moduleNames.length; index++) {
const resolution = resolutions[index].resolvedModule;
const moduleName = moduleNames[index].text;
const mode = getModeForUsageLocation(file, moduleNames[index]);
setResolvedModule(file, moduleName, resolutions[index], mode);
addResolutionDiagnosticsFromResolutionOrCache(file, moduleName, resolutions[index], mode);
if (!resolution) {
continue;
}
const isFromNodeModulesSearch = resolution.isExternalLibraryImport;
const isJsFile = !resolutionExtensionIsTSOrJson(resolution.extension);
const isJsFileFromNodeModules = isFromNodeModulesSearch && isJsFile;
const resolvedFileName = resolution.resolvedFileName;
if (isFromNodeModulesSearch) {
currentNodeModulesDepth++;
}
const elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModuleJsDepth;
const shouldAddFile = resolvedFileName && !getResolutionDiagnostic(optionsForFile, resolution, file) && !optionsForFile.noResolve && index < file.imports.length && !elideImport && !(isJsFile && !getAllowJSCompilerOption(optionsForFile)) && (isInJSFile(file.imports[index]) || !(file.imports[index].flags & 8388608 /* JSDoc */));
if (elideImport) {
modulesWithElidedImports.set(file.path, true);
} else if (shouldAddFile) {
findSourceFile(
resolvedFileName,
/*isDefaultLib*/
false,
/*ignoreNoDefaultLib*/
false,
{ kind: 3 /* Import */, file: file.path, index },
resolution.packageId
);
}
if (isFromNodeModulesSearch) {
currentNodeModulesDepth--;
}
}
} else {
file.resolvedModules = void 0;
}
}
function checkSourceFilesBelongToPath(sourceFiles, rootDirectory) {
let allFilesBelongToPath = true;
const absoluteRootDirectoryPath = host.getCanonicalFileName(getNormalizedAbsolutePath(rootDirectory, currentDirectory));
for (const sourceFile of sourceFiles) {
if (!sourceFile.isDeclarationFile) {
const absoluteSourceFilePath = host.getCanonicalFileName(getNormalizedAbsolutePath(sourceFile.fileName, currentDirectory));
if (absoluteSourceFilePath.indexOf(absoluteRootDirectoryPath) !== 0) {
addProgramDiagnosticExplainingFile(
sourceFile,
Diagnostics.File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files,
[sourceFile.fileName, rootDirectory]
);
allFilesBelongToPath = false;
}
}
}
return allFilesBelongToPath;
}
function parseProjectReferenceConfigFile(ref) {
if (!projectReferenceRedirects) {
projectReferenceRedirects = /* @__PURE__ */ new Map();
}
const refPath = resolveProjectReferencePath(ref);
const sourceFilePath = toPath3(refPath);
const fromCache = projectReferenceRedirects.get(sourceFilePath);
if (fromCache !== void 0) {
return fromCache || void 0;
}
let commandLine;
let sourceFile;
if (host.getParsedCommandLine) {
commandLine = host.getParsedCommandLine(refPath);
if (!commandLine) {
addFileToFilesByName(
/*file*/
void 0,
sourceFilePath,
/*redirectedPath*/
void 0
);
projectReferenceRedirects.set(sourceFilePath, false);
return void 0;
}
sourceFile = Debug.checkDefined(commandLine.options.configFile);
Debug.assert(!sourceFile.path || sourceFile.path === sourceFilePath);
addFileToFilesByName(
sourceFile,
sourceFilePath,
/*redirectedPath*/
void 0
);
} else {
const basePath = getNormalizedAbsolutePath(getDirectoryPath(refPath), currentDirectory);
sourceFile = host.getSourceFile(refPath, 100 /* JSON */);
addFileToFilesByName(
sourceFile,
sourceFilePath,
/*redirectedPath*/
void 0
);
if (sourceFile === void 0) {
projectReferenceRedirects.set(sourceFilePath, false);
return void 0;
}
commandLine = parseJsonSourceFileConfigFileContent(
sourceFile,
configParsingHost,
basePath,
/*existingOptions*/
void 0,
refPath
);
}
sourceFile.fileName = refPath;
sourceFile.path = sourceFilePath;
sourceFile.resolvedPath = sourceFilePath;
sourceFile.originalFileName = refPath;
const resolvedRef = { commandLine, sourceFile };
projectReferenceRedirects.set(sourceFilePath, resolvedRef);
if (commandLine.projectReferences) {
resolvedRef.references = commandLine.projectReferences.map(parseProjectReferenceConfigFile);
}
return resolvedRef;
}
function verifyCompilerOptions() {
if (options.strictPropertyInitialization && !getStrictOptionValue(options, "strictNullChecks")) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "strictPropertyInitialization", "strictNullChecks");
}
if (options.exactOptionalPropertyTypes && !getStrictOptionValue(options, "strictNullChecks")) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "exactOptionalPropertyTypes", "strictNullChecks");
}
if (options.isolatedModules || options.verbatimModuleSyntax) {
if (options.out) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "out", options.verbatimModuleSyntax ? "verbatimModuleSyntax" : "isolatedModules");
}
if (options.outFile) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "outFile", options.verbatimModuleSyntax ? "verbatimModuleSyntax" : "isolatedModules");
}
}
if (options.inlineSourceMap) {
if (options.sourceMap) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "sourceMap", "inlineSourceMap");
}
if (options.mapRoot) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "mapRoot", "inlineSourceMap");
}
}
if (options.composite) {
if (options.declaration === false) {
createDiagnosticForOptionName(Diagnostics.Composite_projects_may_not_disable_declaration_emit, "declaration");
}
if (options.incremental === false) {
createDiagnosticForOptionName(Diagnostics.Composite_projects_may_not_disable_incremental_compilation, "declaration");
}
}
const outputFile = outFile(options);
if (options.tsBuildInfoFile) {
if (!isIncrementalCompilation(options)) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "tsBuildInfoFile", "incremental", "composite");
}
} else if (options.incremental && !outputFile && !options.configFilePath) {
programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Option_incremental_can_only_be_specified_using_tsconfig_emitting_to_single_file_or_when_option_tsBuildInfoFile_is_specified));
}
verifyDeprecatedCompilerOptions();
verifyProjectReferences();
if (options.composite) {
const rootPaths = new Set(rootNames.map(toPath3));
for (const file of files) {
if (sourceFileMayBeEmitted(file, program) && !rootPaths.has(file.path)) {
addProgramDiagnosticExplainingFile(
file,
Diagnostics.File_0_is_not_listed_within_the_file_list_of_project_1_Projects_must_list_all_files_or_use_an_include_pattern,
[file.fileName, options.configFilePath || ""]
);
}
}
}
if (options.paths) {
for (const key in options.paths) {
if (!hasProperty(options.paths, key)) {
continue;
}
if (!hasZeroOrOneAsteriskCharacter(key)) {
createDiagnosticForOptionPaths(
/*onKey*/
true,
key,
Diagnostics.Pattern_0_can_have_at_most_one_Asterisk_character,
key
);
}
if (isArray(options.paths[key])) {
const len = options.paths[key].length;
if (len === 0) {
createDiagnosticForOptionPaths(
/*onKey*/
false,
key,
Diagnostics.Substitutions_for_pattern_0_shouldn_t_be_an_empty_array,
key
);
}
for (let i = 0; i < len; i++) {
const subst = options.paths[key][i];
const typeOfSubst = typeof subst;
if (typeOfSubst === "string") {
if (!hasZeroOrOneAsteriskCharacter(subst)) {
createDiagnosticForOptionPathKeyValue(key, i, Diagnostics.Substitution_0_in_pattern_1_can_have_at_most_one_Asterisk_character, subst, key);
}
if (!options.baseUrl && !pathIsRelative(subst) && !pathIsAbsolute(subst)) {
createDiagnosticForOptionPathKeyValue(key, i, Diagnostics.Non_relative_paths_are_not_allowed_when_baseUrl_is_not_set_Did_you_forget_a_leading_Slash);
}
} else {
createDiagnosticForOptionPathKeyValue(key, i, Diagnostics.Substitution_0_for_pattern_1_has_incorrect_type_expected_string_got_2, subst, key, typeOfSubst);
}
}
} else {
createDiagnosticForOptionPaths(
/*onKey*/
false,
key,
Diagnostics.Substitutions_for_pattern_0_should_be_an_array,
key
);
}
}
}
if (!options.sourceMap && !options.inlineSourceMap) {
if (options.inlineSources) {
createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided, "inlineSources");
}
if (options.sourceRoot) {
createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided, "sourceRoot");
}
}
if (options.out && options.outFile) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "out", "outFile");
}
if (options.mapRoot && !(options.sourceMap || options.declarationMap)) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "mapRoot", "sourceMap", "declarationMap");
}
if (options.declarationDir) {
if (!getEmitDeclarations(options)) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "declarationDir", "declaration", "composite");
}
if (outputFile) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "declarationDir", options.out ? "out" : "outFile");
}
}
if (options.declarationMap && !getEmitDeclarations(options)) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "declarationMap", "declaration", "composite");
}
if (options.lib && options.noLib) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "lib", "noLib");
}
if (options.noImplicitUseStrict && getStrictOptionValue(options, "alwaysStrict")) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "noImplicitUseStrict", "alwaysStrict");
}
const languageVersion = getEmitScriptTarget(options);
const firstNonAmbientExternalModuleSourceFile = find(files, (f) => isExternalModule(f) && !f.isDeclarationFile);
if (options.isolatedModules || options.verbatimModuleSyntax) {
if (options.module === 0 /* None */ && languageVersion < 2 /* ES2015 */ && options.isolatedModules) {
createDiagnosticForOptionName(Diagnostics.Option_isolatedModules_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES2015_or_higher, "isolatedModules", "target");
}
if (options.preserveConstEnums === false) {
createDiagnosticForOptionName(Diagnostics.Option_preserveConstEnums_cannot_be_disabled_when_0_is_enabled, options.verbatimModuleSyntax ? "verbatimModuleSyntax" : "isolatedModules", "preserveConstEnums");
}
} else if (firstNonAmbientExternalModuleSourceFile && languageVersion < 2 /* ES2015 */ && options.module === 0 /* None */) {
const span = getErrorSpanForNode(firstNonAmbientExternalModuleSourceFile, typeof firstNonAmbientExternalModuleSourceFile.externalModuleIndicator === "boolean" ? firstNonAmbientExternalModuleSourceFile : firstNonAmbientExternalModuleSourceFile.externalModuleIndicator);
programDiagnostics.add(createFileDiagnostic(firstNonAmbientExternalModuleSourceFile, span.start, span.length, Diagnostics.Cannot_use_imports_exports_or_module_augmentations_when_module_is_none));
}
if (outputFile && !options.emitDeclarationOnly) {
if (options.module && !(options.module === 2 /* AMD */ || options.module === 4 /* System */)) {
createDiagnosticForOptionName(Diagnostics.Only_amd_and_system_modules_are_supported_alongside_0, options.out ? "out" : "outFile", "module");
} else if (options.module === void 0 && firstNonAmbientExternalModuleSourceFile) {
const span = getErrorSpanForNode(firstNonAmbientExternalModuleSourceFile, typeof firstNonAmbientExternalModuleSourceFile.externalModuleIndicator === "boolean" ? firstNonAmbientExternalModuleSourceFile : firstNonAmbientExternalModuleSourceFile.externalModuleIndicator);
programDiagnostics.add(createFileDiagnostic(firstNonAmbientExternalModuleSourceFile, span.start, span.length, Diagnostics.Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system, options.out ? "out" : "outFile"));
}
}
if (getResolveJsonModule(options)) {
if (getEmitModuleResolutionKind(options) === 1 /* Classic */) {
createDiagnosticForOptionName(Diagnostics.Option_resolveJsonModule_cannot_be_specified_when_moduleResolution_is_set_to_classic, "resolveJsonModule");
} else if (!hasJsonModuleEmitEnabled(options)) {
createDiagnosticForOptionName(Diagnostics.Option_resolveJsonModule_can_only_be_specified_when_module_code_generation_is_commonjs_amd_es2015_or_esNext, "resolveJsonModule", "module");
}
}
if (options.outDir || // there is --outDir specified
options.rootDir || // there is --rootDir specified
options.sourceRoot || // there is --sourceRoot specified
options.mapRoot) {
const dir = getCommonSourceDirectory2();
if (options.outDir && dir === "" && files.some((file) => getRootLength(file.fileName) > 1)) {
createDiagnosticForOptionName(Diagnostics.Cannot_find_the_common_subdirectory_path_for_the_input_files, "outDir");
}
}
if (options.useDefineForClassFields && languageVersion === 0 /* ES3 */) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_when_option_target_is_ES3, "useDefineForClassFields");
}
if (options.checkJs && !getAllowJSCompilerOption(options)) {
programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "checkJs", "allowJs"));
}
if (options.emitDeclarationOnly) {
if (!getEmitDeclarations(options)) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "emitDeclarationOnly", "declaration", "composite");
}
if (options.noEmit) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "emitDeclarationOnly", "noEmit");
}
}
if (options.emitDecoratorMetadata && !options.experimentalDecorators) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "emitDecoratorMetadata", "experimentalDecorators");
}
if (options.jsxFactory) {
if (options.reactNamespace) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "reactNamespace", "jsxFactory");
}
if (options.jsx === 4 /* ReactJSX */ || options.jsx === 5 /* ReactJSXDev */) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_when_option_jsx_is_1, "jsxFactory", inverseJsxOptionMap.get("" + options.jsx));
}
if (!parseIsolatedEntityName(options.jsxFactory, languageVersion)) {
createOptionValueDiagnostic("jsxFactory", Diagnostics.Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name, options.jsxFactory);
}
} else if (options.reactNamespace && !isIdentifierText(options.reactNamespace, languageVersion)) {
createOptionValueDiagnostic("reactNamespace", Diagnostics.Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier, options.reactNamespace);
}
if (options.jsxFragmentFactory) {
if (!options.jsxFactory) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "jsxFragmentFactory", "jsxFactory");
}
if (options.jsx === 4 /* ReactJSX */ || options.jsx === 5 /* ReactJSXDev */) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_when_option_jsx_is_1, "jsxFragmentFactory", inverseJsxOptionMap.get("" + options.jsx));
}
if (!parseIsolatedEntityName(options.jsxFragmentFactory, languageVersion)) {
createOptionValueDiagnostic("jsxFragmentFactory", Diagnostics.Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name, options.jsxFragmentFactory);
}
}
if (options.reactNamespace) {
if (options.jsx === 4 /* ReactJSX */ || options.jsx === 5 /* ReactJSXDev */) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_when_option_jsx_is_1, "reactNamespace", inverseJsxOptionMap.get("" + options.jsx));
}
}
if (options.jsxImportSource) {
if (options.jsx === 2 /* React */) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_when_option_jsx_is_1, "jsxImportSource", inverseJsxOptionMap.get("" + options.jsx));
}
}
if (options.preserveValueImports && getEmitModuleKind(options) < 5 /* ES2015 */) {
createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_module_is_set_to_es2015_or_later, "preserveValueImports");
}
const moduleKind = getEmitModuleKind(options);
if (options.verbatimModuleSyntax) {
if (moduleKind === 2 /* AMD */ || moduleKind === 3 /* UMD */ || moduleKind === 4 /* System */) {
createDiagnosticForOptionName(Diagnostics.Option_verbatimModuleSyntax_cannot_be_used_when_module_is_set_to_UMD_AMD_or_System, "verbatimModuleSyntax");
}
if (options.preserveValueImports) {
createRedundantOptionDiagnostic("preserveValueImports", "verbatimModuleSyntax");
}
if (options.importsNotUsedAsValues) {
createRedundantOptionDiagnostic("importsNotUsedAsValues", "verbatimModuleSyntax");
}
}
if (options.allowImportingTsExtensions && !(options.noEmit || options.emitDeclarationOnly)) {
createOptionValueDiagnostic("allowImportingTsExtensions", Diagnostics.Option_allowImportingTsExtensions_can_only_be_used_when_either_noEmit_or_emitDeclarationOnly_is_set);
}
const moduleResolution = getEmitModuleResolutionKind(options);
if (options.resolvePackageJsonExports && !moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution)) {
createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler, "resolvePackageJsonExports");
}
if (options.resolvePackageJsonImports && !moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution)) {
createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler, "resolvePackageJsonImports");
}
if (options.customConditions && !moduleResolutionSupportsPackageJsonExportsAndImports(moduleResolution)) {
createDiagnosticForOptionName(Diagnostics.Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler, "customConditions");
}
if (moduleResolution === 100 /* Bundler */ && !emitModuleKindIsNonNodeESM(moduleKind)) {
createOptionValueDiagnostic("moduleResolution", Diagnostics.Option_0_can_only_be_used_when_module_is_set_to_es2015_or_later, "bundler");
}
if (!options.noEmit && !options.suppressOutputPathCheck) {
const emitHost = getEmitHost();
const emitFilesSeen = /* @__PURE__ */ new Set();
forEachEmittedFile(emitHost, (emitFileNames) => {
if (!options.emitDeclarationOnly) {
verifyEmitFilePath(emitFileNames.jsFilePath, emitFilesSeen);
}
verifyEmitFilePath(emitFileNames.declarationFilePath, emitFilesSeen);
});
}
function verifyEmitFilePath(emitFileName, emitFilesSeen) {
if (emitFileName) {
const emitFilePath = toPath3(emitFileName);
if (filesByName.has(emitFilePath)) {
let chain;
if (!options.configFilePath) {
chain = chainDiagnosticMessages(
/*details*/
void 0,
Diagnostics.Adding_a_tsconfig_json_file_will_help_organize_projects_that_contain_both_TypeScript_and_JavaScript_files_Learn_more_at_https_Colon_Slash_Slashaka_ms_Slashtsconfig
);
}
chain = chainDiagnosticMessages(chain, Diagnostics.Cannot_write_file_0_because_it_would_overwrite_input_file, emitFileName);
blockEmittingOfFile(emitFileName, createCompilerDiagnosticFromMessageChain(chain));
}
const emitFileKey = !host.useCaseSensitiveFileNames() ? toFileNameLowerCase(emitFilePath) : emitFilePath;
if (emitFilesSeen.has(emitFileKey)) {
blockEmittingOfFile(emitFileName, createCompilerDiagnostic(Diagnostics.Cannot_write_file_0_because_it_would_be_overwritten_by_multiple_input_files, emitFileName));
} else {
emitFilesSeen.add(emitFileKey);
}
}
}
}
function getIgnoreDeprecationsVersion() {
const ignoreDeprecations = options.ignoreDeprecations;
if (ignoreDeprecations) {
if (ignoreDeprecations === "5.0") {
return new Version(ignoreDeprecations);
}
reportInvalidIgnoreDeprecations();
}
return Version.zero;
}
function checkDeprecations(deprecatedIn, removedIn, createDiagnostic, fn) {
const deprecatedInVersion = new Version(deprecatedIn);
const removedInVersion = new Version(removedIn);
const typescriptVersion = new Version(typeScriptVersion2 || versionMajorMinor);
const ignoreDeprecationsVersion = getIgnoreDeprecationsVersion();
const mustBeRemoved = !(removedInVersion.compareTo(typescriptVersion) === 1 /* GreaterThan */);
const canBeSilenced = !mustBeRemoved && ignoreDeprecationsVersion.compareTo(deprecatedInVersion) === -1 /* LessThan */;
if (mustBeRemoved || canBeSilenced) {
fn((name, value, useInstead) => {
if (mustBeRemoved) {
if (value === void 0) {
createDiagnostic(name, value, useInstead, Diagnostics.Option_0_has_been_removed_Please_remove_it_from_your_configuration, name);
} else {
createDiagnostic(name, value, useInstead, Diagnostics.Option_0_1_has_been_removed_Please_remove_it_from_your_configuration, name, value);
}
} else {
if (value === void 0) {
createDiagnostic(name, value, useInstead, Diagnostics.Option_0_is_deprecated_and_will_stop_functioning_in_TypeScript_1_Specify_compilerOption_ignoreDeprecations_Colon_2_to_silence_this_error, name, removedIn, deprecatedIn);
} else {
createDiagnostic(name, value, useInstead, Diagnostics.Option_0_1_is_deprecated_and_will_stop_functioning_in_TypeScript_2_Specify_compilerOption_ignoreDeprecations_Colon_3_to_silence_this_error, name, value, removedIn, deprecatedIn);
}
}
});
}
}
function verifyDeprecatedCompilerOptions() {
function createDiagnostic(name, value, useInstead, message, ...args) {
if (useInstead) {
const details = chainDiagnosticMessages(
/*details*/
void 0,
Diagnostics.Use_0_instead,
useInstead
);
const chain = chainDiagnosticMessages(details, message, ...args);
createDiagnosticForOption(
/*onKey*/
!value,
name,
/*option2*/
void 0,
chain
);
} else {
createDiagnosticForOption(
/*onKey*/
!value,
name,
/*option2*/
void 0,
message,
...args
);
}
}
checkDeprecations("5.0", "5.5", createDiagnostic, (createDeprecatedDiagnostic) => {
if (options.target === 0 /* ES3 */) {
createDeprecatedDiagnostic("target", "ES3");
}
if (options.noImplicitUseStrict) {
createDeprecatedDiagnostic("noImplicitUseStrict");
}
if (options.keyofStringsOnly) {
createDeprecatedDiagnostic("keyofStringsOnly");
}
if (options.suppressExcessPropertyErrors) {
createDeprecatedDiagnostic("suppressExcessPropertyErrors");
}
if (options.suppressImplicitAnyIndexErrors) {
createDeprecatedDiagnostic("suppressImplicitAnyIndexErrors");
}
if (options.noStrictGenericChecks) {
createDeprecatedDiagnostic("noStrictGenericChecks");
}
if (options.charset) {
createDeprecatedDiagnostic("charset");
}
if (options.out) {
createDeprecatedDiagnostic(
"out",
/*value*/
void 0,
"outFile"
);
}
if (options.importsNotUsedAsValues) {
createDeprecatedDiagnostic(
"importsNotUsedAsValues",
/*value*/
void 0,
"verbatimModuleSyntax"
);
}
if (options.preserveValueImports) {
createDeprecatedDiagnostic(
"preserveValueImports",
/*value*/
void 0,
"verbatimModuleSyntax"
);
}
});
}
function verifyDeprecatedProjectReference(ref, parentFile, index) {
function createDiagnostic(_name, _value, _useInstead, message, ...args) {
createDiagnosticForReference(parentFile, index, message, ...args);
}
checkDeprecations("5.0", "5.5", createDiagnostic, (createDeprecatedDiagnostic) => {
if (ref.prepend) {
createDeprecatedDiagnostic("prepend");
}
});
}
function createDiagnosticExplainingFile(file, fileProcessingReason, diagnostic, args) {
var _a2;
let fileIncludeReasons;
let relatedInfo;
let locationReason = isReferencedFile(fileProcessingReason) ? fileProcessingReason : void 0;
if (file)
(_a2 = fileReasons.get(file.path)) == null ? void 0 : _a2.forEach(processReason);
if (fileProcessingReason)
processReason(fileProcessingReason);
if (locationReason && (fileIncludeReasons == null ? void 0 : fileIncludeReasons.length) === 1)
fileIncludeReasons = void 0;
const location = locationReason && getReferencedFileLocation(getSourceFileByPath, locationReason);
const fileIncludeReasonDetails = fileIncludeReasons && chainDiagnosticMessages(fileIncludeReasons, Diagnostics.The_file_is_in_the_program_because_Colon);
const redirectInfo = file && explainIfFileIsRedirectAndImpliedFormat(file);
const chain = chainDiagnosticMessages(redirectInfo ? fileIncludeReasonDetails ? [fileIncludeReasonDetails, ...redirectInfo] : redirectInfo : fileIncludeReasonDetails, diagnostic, ...args || emptyArray);
return location && isReferenceFileLocation(location) ? createFileDiagnosticFromMessageChain(location.file, location.pos, location.end - location.pos, chain, relatedInfo) : createCompilerDiagnosticFromMessageChain(chain, relatedInfo);
function processReason(reason) {
(fileIncludeReasons || (fileIncludeReasons = [])).push(fileIncludeReasonToDiagnostics(program, reason));
if (!locationReason && isReferencedFile(reason)) {
locationReason = reason;
} else if (locationReason !== reason) {
relatedInfo = append(relatedInfo, fileIncludeReasonToRelatedInformation(reason));
}
if (reason === fileProcessingReason)
fileProcessingReason = void 0;
}
}
function addFilePreprocessingFileExplainingDiagnostic(file, fileProcessingReason, diagnostic, args) {
(fileProcessingDiagnostics || (fileProcessingDiagnostics = [])).push({
kind: 1 /* FilePreprocessingFileExplainingDiagnostic */,
file: file && file.path,
fileProcessingReason,
diagnostic,
args
});
}
function addProgramDiagnosticExplainingFile(file, diagnostic, args) {
programDiagnostics.add(createDiagnosticExplainingFile(
file,
/*fileProcessingReason*/
void 0,
diagnostic,
args
));
}
function fileIncludeReasonToRelatedInformation(reason) {
if (isReferencedFile(reason)) {
const referenceLocation = getReferencedFileLocation(getSourceFileByPath, reason);
let message2;
switch (reason.kind) {
case 3 /* Import */:
message2 = Diagnostics.File_is_included_via_import_here;
break;
case 4 /* ReferenceFile */:
message2 = Diagnostics.File_is_included_via_reference_here;
break;
case 5 /* TypeReferenceDirective */:
message2 = Diagnostics.File_is_included_via_type_library_reference_here;
break;
case 7 /* LibReferenceDirective */:
message2 = Diagnostics.File_is_included_via_library_reference_here;
break;
default:
Debug.assertNever(reason);
}
return isReferenceFileLocation(referenceLocation) ? createFileDiagnostic(
referenceLocation.file,
referenceLocation.pos,
referenceLocation.end - referenceLocation.pos,
message2
) : void 0;
}
if (!options.configFile)
return void 0;
let configFileNode;
let message;
switch (reason.kind) {
case 0 /* RootFile */:
if (!options.configFile.configFileSpecs)
return void 0;
const fileName = getNormalizedAbsolutePath(rootNames[reason.index], currentDirectory);
const matchedByFiles = getMatchedFileSpec(program, fileName);
if (matchedByFiles) {
configFileNode = getTsConfigPropArrayElementValue(options.configFile, "files", matchedByFiles);
message = Diagnostics.File_is_matched_by_files_list_specified_here;
break;
}
const matchedByInclude = getMatchedIncludeSpec(program, fileName);
if (!matchedByInclude || !isString(matchedByInclude))
return void 0;
configFileNode = getTsConfigPropArrayElementValue(options.configFile, "include", matchedByInclude);
message = Diagnostics.File_is_matched_by_include_pattern_specified_here;
break;
case 1 /* SourceFromProjectReference */:
case 2 /* OutputFromProjectReference */:
const referencedResolvedRef = Debug.checkDefined(resolvedProjectReferences == null ? void 0 : resolvedProjectReferences[reason.index]);
const referenceInfo = forEachProjectReference(
projectReferences,
resolvedProjectReferences,
(resolvedRef, parent, index2) => resolvedRef === referencedResolvedRef ? { sourceFile: (parent == null ? void 0 : parent.sourceFile) || options.configFile, index: index2 } : void 0
);
if (!referenceInfo)
return void 0;
const { sourceFile, index } = referenceInfo;
const referencesSyntax = forEachTsConfigPropArray(
sourceFile,
"references",
(property) => isArrayLiteralExpression(property.initializer) ? property.initializer : void 0
);
return referencesSyntax && referencesSyntax.elements.length > index ? createDiagnosticForNodeInSourceFile(
sourceFile,
referencesSyntax.elements[index],
reason.kind === 2 /* OutputFromProjectReference */ ? Diagnostics.File_is_output_from_referenced_project_specified_here : Diagnostics.File_is_source_from_referenced_project_specified_here
) : void 0;
case 8 /* AutomaticTypeDirectiveFile */:
if (!options.types)
return void 0;
configFileNode = getOptionsSyntaxByArrayElementValue("types", reason.typeReference);
message = Diagnostics.File_is_entry_point_of_type_library_specified_here;
break;
case 6 /* LibFile */:
if (reason.index !== void 0) {
configFileNode = getOptionsSyntaxByArrayElementValue("lib", options.lib[reason.index]);
message = Diagnostics.File_is_library_specified_here;
break;
}
const target = forEachEntry(targetOptionDeclaration.type, (value, key) => value === getEmitScriptTarget(options) ? key : void 0);
configFileNode = target ? getOptionsSyntaxByValue("target", target) : void 0;
message = Diagnostics.File_is_default_library_for_target_specified_here;
break;
default:
Debug.assertNever(reason);
}
return configFileNode && createDiagnosticForNodeInSourceFile(
options.configFile,
configFileNode,
message
);
}
function verifyProjectReferences() {
const buildInfoPath = !options.suppressOutputPathCheck ? getTsBuildInfoEmitOutputFilePath(options) : void 0;
forEachProjectReference(projectReferences, resolvedProjectReferences, (resolvedRef, parent, index) => {
const ref = (parent ? parent.commandLine.projectReferences : projectReferences)[index];
const parentFile = parent && parent.sourceFile;
verifyDeprecatedProjectReference(ref, parentFile, index);
if (!resolvedRef) {
createDiagnosticForReference(parentFile, index, Diagnostics.File_0_not_found, ref.path);
return;
}
const options2 = resolvedRef.commandLine.options;
if (!options2.composite || options2.noEmit) {
const inputs = parent ? parent.commandLine.fileNames : rootNames;
if (inputs.length) {
if (!options2.composite)
createDiagnosticForReference(parentFile, index, Diagnostics.Referenced_project_0_must_have_setting_composite_Colon_true, ref.path);
if (options2.noEmit)
createDiagnosticForReference(parentFile, index, Diagnostics.Referenced_project_0_may_not_disable_emit, ref.path);
}
}
if (ref.prepend) {
const out = outFile(options2);
if (out) {
if (!host.fileExists(out)) {
createDiagnosticForReference(parentFile, index, Diagnostics.Output_file_0_from_project_1_does_not_exist, out, ref.path);
}
} else {
createDiagnosticForReference(parentFile, index, Diagnostics.Cannot_prepend_project_0_because_it_does_not_have_outFile_set, ref.path);
}
}
if (!parent && buildInfoPath && buildInfoPath === getTsBuildInfoEmitOutputFilePath(options2)) {
createDiagnosticForReference(parentFile, index, Diagnostics.Cannot_write_file_0_because_it_will_overwrite_tsbuildinfo_file_generated_by_referenced_project_1, buildInfoPath, ref.path);
hasEmitBlockingDiagnostics.set(toPath3(buildInfoPath), true);
}
});
}
function createDiagnosticForOptionPathKeyValue(key, valueIndex, message, ...args) {
let needCompilerDiagnostic = true;
forEachOptionPathsSyntax((pathProp) => {
if (isObjectLiteralExpression(pathProp.initializer)) {
forEachPropertyAssignment(pathProp.initializer, key, (keyProps) => {
const initializer = keyProps.initializer;
if (isArrayLiteralExpression(initializer) && initializer.elements.length > valueIndex) {
programDiagnostics.add(createDiagnosticForNodeInSourceFile(options.configFile, initializer.elements[valueIndex], message, ...args));
needCompilerDiagnostic = false;
}
});
}
});
if (needCompilerDiagnostic) {
programDiagnostics.add(createCompilerDiagnostic(message, ...args));
}
}
function createDiagnosticForOptionPaths(onKey, key, message, ...args) {
let needCompilerDiagnostic = true;
forEachOptionPathsSyntax((pathProp) => {
if (isObjectLiteralExpression(pathProp.initializer) && createOptionDiagnosticInObjectLiteralSyntax(
pathProp.initializer,
onKey,
key,
/*key2*/
void 0,
message,
...args
)) {
needCompilerDiagnostic = false;
}
});
if (needCompilerDiagnostic) {
programDiagnostics.add(createCompilerDiagnostic(message, ...args));
}
}
function forEachOptionsSyntaxByName(name, callback) {
return forEachPropertyAssignment(getCompilerOptionsObjectLiteralSyntax(), name, callback);
}
function forEachOptionPathsSyntax(callback) {
return forEachOptionsSyntaxByName("paths", callback);
}
function getOptionsSyntaxByValue(name, value) {
return forEachOptionsSyntaxByName(name, (property) => isStringLiteral(property.initializer) && property.initializer.text === value ? property.initializer : void 0);
}
function getOptionsSyntaxByArrayElementValue(name, value) {
const compilerOptionsObjectLiteralSyntax = getCompilerOptionsObjectLiteralSyntax();
return compilerOptionsObjectLiteralSyntax && getPropertyArrayElementValue(compilerOptionsObjectLiteralSyntax, name, value);
}
function createDiagnosticForOptionName(message, option1, option2, option3) {
createDiagnosticForOption(
/*onKey*/
true,
option1,
option2,
message,
option1,
option2,
option3
);
}
function createOptionValueDiagnostic(option1, message, ...args) {
createDiagnosticForOption(
/*onKey*/
false,
option1,
/*option2*/
void 0,
message,
...args
);
}
function createDiagnosticForReference(sourceFile, index, message, ...args) {
const referencesSyntax = forEachTsConfigPropArray(
sourceFile || options.configFile,
"references",
(property) => isArrayLiteralExpression(property.initializer) ? property.initializer : void 0
);
if (referencesSyntax && referencesSyntax.elements.length > index) {
programDiagnostics.add(createDiagnosticForNodeInSourceFile(sourceFile || options.configFile, referencesSyntax.elements[index], message, ...args));
} else {
programDiagnostics.add(createCompilerDiagnostic(message, ...args));
}
}
function createDiagnosticForOption(onKey, option1, option2, message, ...args) {
const compilerOptionsObjectLiteralSyntax = getCompilerOptionsObjectLiteralSyntax();
const needCompilerDiagnostic = !compilerOptionsObjectLiteralSyntax || !createOptionDiagnosticInObjectLiteralSyntax(compilerOptionsObjectLiteralSyntax, onKey, option1, option2, message, ...args);
if (needCompilerDiagnostic) {
if ("messageText" in message) {
programDiagnostics.add(createCompilerDiagnosticFromMessageChain(message));
} else {
programDiagnostics.add(createCompilerDiagnostic(message, ...args));
}
}
}
function getCompilerOptionsObjectLiteralSyntax() {
if (_compilerOptionsObjectLiteralSyntax === void 0) {
_compilerOptionsObjectLiteralSyntax = forEachPropertyAssignment(
getTsConfigObjectLiteralExpression(options.configFile),
"compilerOptions",
(prop) => isObjectLiteralExpression(prop.initializer) ? prop.initializer : void 0
) || false;
}
return _compilerOptionsObjectLiteralSyntax || void 0;
}
function createOptionDiagnosticInObjectLiteralSyntax(objectLiteral, onKey, key1, key2, message, ...args) {
let needsCompilerDiagnostic = false;
forEachPropertyAssignment(objectLiteral, key1, (prop) => {
if ("messageText" in message) {
programDiagnostics.add(createDiagnosticForNodeFromMessageChain(options.configFile, onKey ? prop.name : prop.initializer, message));
} else {
programDiagnostics.add(createDiagnosticForNodeInSourceFile(options.configFile, onKey ? prop.name : prop.initializer, message, ...args));
}
needsCompilerDiagnostic = true;
}, key2);
return needsCompilerDiagnostic;
}
function createRedundantOptionDiagnostic(errorOnOption, redundantWithOption) {
const compilerOptionsObjectLiteralSyntax = getCompilerOptionsObjectLiteralSyntax();
if (compilerOptionsObjectLiteralSyntax) {
createOptionDiagnosticInObjectLiteralSyntax(
compilerOptionsObjectLiteralSyntax,
/*onKey*/
true,
errorOnOption,
/*key2*/
void 0,
Diagnostics.Option_0_is_redundant_and_cannot_be_specified_with_option_1,
errorOnOption,
redundantWithOption
);
} else {
createDiagnosticForOptionName(Diagnostics.Option_0_is_redundant_and_cannot_be_specified_with_option_1, errorOnOption, redundantWithOption);
}
}
function blockEmittingOfFile(emitFileName, diag2) {
hasEmitBlockingDiagnostics.set(toPath3(emitFileName), true);
programDiagnostics.add(diag2);
}
function isEmittedFile(file) {
if (options.noEmit) {
return false;
}
const filePath = toPath3(file);
if (getSourceFileByPath(filePath)) {
return false;
}
const out = outFile(options);
if (out) {
return isSameFile(filePath, out) || isSameFile(filePath, removeFileExtension(out) + ".d.ts" /* Dts */);
}
if (options.declarationDir && containsPath(options.declarationDir, filePath, currentDirectory, !host.useCaseSensitiveFileNames())) {
return true;
}
if (options.outDir) {
return containsPath(options.outDir, filePath, currentDirectory, !host.useCaseSensitiveFileNames());
}
if (fileExtensionIsOneOf(filePath, supportedJSExtensionsFlat) || isDeclarationFileName(filePath)) {
const filePathWithoutExtension = removeFileExtension(filePath);
return !!getSourceFileByPath(filePathWithoutExtension + ".ts" /* Ts */) || !!getSourceFileByPath(filePathWithoutExtension + ".tsx" /* Tsx */);
}
return false;
}
function isSameFile(file1, file2) {
return comparePaths(file1, file2, currentDirectory, !host.useCaseSensitiveFileNames()) === 0 /* EqualTo */;
}
function getSymlinkCache() {
if (host.getSymlinkCache) {
return host.getSymlinkCache();
}
if (!symlinks) {
symlinks = createSymlinkCache(currentDirectory, getCanonicalFileName);
}
if (files && automaticTypeDirectiveResolutions && !symlinks.hasProcessedResolutions()) {
symlinks.setSymlinksFromResolutions(files, automaticTypeDirectiveResolutions);
}
return symlinks;
}
}
function updateHostForUseSourceOfProjectReferenceRedirect(host) {
let setOfDeclarationDirectories;
const originalFileExists = host.compilerHost.fileExists;
const originalDirectoryExists = host.compilerHost.directoryExists;
const originalGetDirectories = host.compilerHost.getDirectories;
const originalRealpath = host.compilerHost.realpath;
if (!host.useSourceOfProjectReferenceRedirect)
return { onProgramCreateComplete: noop, fileExists };
host.compilerHost.fileExists = fileExists;
let directoryExists;
if (originalDirectoryExists) {
directoryExists = host.compilerHost.directoryExists = (path) => {
if (originalDirectoryExists.call(host.compilerHost, path)) {
handleDirectoryCouldBeSymlink(path);
return true;
}
if (!host.getResolvedProjectReferences())
return false;
if (!setOfDeclarationDirectories) {
setOfDeclarationDirectories = /* @__PURE__ */ new Set();
host.forEachResolvedProjectReference((ref) => {
const out = outFile(ref.commandLine.options);
if (out) {
setOfDeclarationDirectories.add(getDirectoryPath(host.toPath(out)));
} else {
const declarationDir = ref.commandLine.options.declarationDir || ref.commandLine.options.outDir;
if (declarationDir) {
setOfDeclarationDirectories.add(host.toPath(declarationDir));
}
}
});
}
return fileOrDirectoryExistsUsingSource(
path,
/*isFile*/
false
);
};
}
if (originalGetDirectories) {
host.compilerHost.getDirectories = (path) => !host.getResolvedProjectReferences() || originalDirectoryExists && originalDirectoryExists.call(host.compilerHost, path) ? originalGetDirectories.call(host.compilerHost, path) : [];
}
if (originalRealpath) {
host.compilerHost.realpath = (s) => {
var _a;
return ((_a = host.getSymlinkCache().getSymlinkedFiles()) == null ? void 0 : _a.get(host.toPath(s))) || originalRealpath.call(host.compilerHost, s);
};
}
return { onProgramCreateComplete, fileExists, directoryExists };
function onProgramCreateComplete() {
host.compilerHost.fileExists = originalFileExists;
host.compilerHost.directoryExists = originalDirectoryExists;
host.compilerHost.getDirectories = originalGetDirectories;
}
function fileExists(file) {
if (originalFileExists.call(host.compilerHost, file))
return true;
if (!host.getResolvedProjectReferences())
return false;
if (!isDeclarationFileName(file))
return false;
return fileOrDirectoryExistsUsingSource(
file,
/*isFile*/
true
);
}
function fileExistsIfProjectReferenceDts(file) {
const source = host.getSourceOfProjectReferenceRedirect(host.toPath(file));
return source !== void 0 ? isString(source) ? originalFileExists.call(host.compilerHost, source) : true : void 0;
}
function directoryExistsIfProjectReferenceDeclDir(dir) {
const dirPath = host.toPath(dir);
const dirPathWithTrailingDirectorySeparator = `${dirPath}${directorySeparator}`;
return forEachKey(
setOfDeclarationDirectories,
(declDirPath) => dirPath === declDirPath || // Any parent directory of declaration dir
startsWith(declDirPath, dirPathWithTrailingDirectorySeparator) || // Any directory inside declaration dir
startsWith(dirPath, `${declDirPath}/`)
);
}
function handleDirectoryCouldBeSymlink(directory) {
var _a;
if (!host.getResolvedProjectReferences() || containsIgnoredPath(directory))
return;
if (!originalRealpath || !stringContains(directory, nodeModulesPathPart))
return;
const symlinkCache = host.getSymlinkCache();
const directoryPath = ensureTrailingDirectorySeparator(host.toPath(directory));
if ((_a = symlinkCache.getSymlinkedDirectories()) == null ? void 0 : _a.has(directoryPath))
return;
const real = normalizePath(originalRealpath.call(host.compilerHost, directory));
let realPath2;
if (real === directory || (realPath2 = ensureTrailingDirectorySeparator(host.toPath(real))) === directoryPath) {
symlinkCache.setSymlinkedDirectory(directoryPath, false);
return;
}
symlinkCache.setSymlinkedDirectory(directory, {
real: ensureTrailingDirectorySeparator(real),
realPath: realPath2
});
}
function fileOrDirectoryExistsUsingSource(fileOrDirectory, isFile) {
var _a;
const fileOrDirectoryExistsUsingSource2 = isFile ? (file) => fileExistsIfProjectReferenceDts(file) : (dir) => directoryExistsIfProjectReferenceDeclDir(dir);
const result = fileOrDirectoryExistsUsingSource2(fileOrDirectory);
if (result !== void 0)
return result;
const symlinkCache = host.getSymlinkCache();
const symlinkedDirectories = symlinkCache.getSymlinkedDirectories();
if (!symlinkedDirectories)
return false;
const fileOrDirectoryPath = host.toPath(fileOrDirectory);
if (!stringContains(fileOrDirectoryPath, nodeModulesPathPart))
return false;
if (isFile && ((_a = symlinkCache.getSymlinkedFiles()) == null ? void 0 : _a.has(fileOrDirectoryPath)))
return true;
return firstDefinedIterator(
symlinkedDirectories.entries(),
([directoryPath, symlinkedDirectory]) => {
if (!symlinkedDirectory || !startsWith(fileOrDirectoryPath, directoryPath))
return void 0;
const result2 = fileOrDirectoryExistsUsingSource2(fileOrDirectoryPath.replace(directoryPath, symlinkedDirectory.realPath));
if (isFile && result2) {
const absolutePath = getNormalizedAbsolutePath(fileOrDirectory, host.compilerHost.getCurrentDirectory());
symlinkCache.setSymlinkedFile(
fileOrDirectoryPath,
`${symlinkedDirectory.real}${absolutePath.replace(new RegExp(directoryPath, "i"), "")}`
);
}
return result2;
}
) || false;
}
}
var emitSkippedWithNoDiagnostics = { diagnostics: emptyArray, sourceMaps: void 0, emittedFiles: void 0, emitSkipped: true };
function handleNoEmitOptions(program, sourceFile, writeFile2, cancellationToken) {
const options = program.getCompilerOptions();
if (options.noEmit) {
program.getSemanticDiagnostics(sourceFile, cancellationToken);
return sourceFile || outFile(options) ? emitSkippedWithNoDiagnostics : program.emitBuildInfo(writeFile2, cancellationToken);
}
if (!options.noEmitOnError)
return void 0;
let diagnostics = [
...program.getOptionsDiagnostics(cancellationToken),
...program.getSyntacticDiagnostics(sourceFile, cancellationToken),
...program.getGlobalDiagnostics(cancellationToken),
...program.getSemanticDiagnostics(sourceFile, cancellationToken)
];
if (diagnostics.length === 0 && getEmitDeclarations(program.getCompilerOptions())) {
diagnostics = program.getDeclarationDiagnostics(
/*sourceFile*/
void 0,
cancellationToken
);
}
if (!diagnostics.length)
return void 0;
let emittedFiles;
if (!sourceFile && !outFile(options)) {
const emitResult = program.emitBuildInfo(writeFile2, cancellationToken);
if (emitResult.diagnostics)
diagnostics = [...diagnostics, ...emitResult.diagnostics];
emittedFiles = emitResult.emittedFiles;
}
return { diagnostics, sourceMaps: void 0, emittedFiles, emitSkipped: true };
}
function filterSemanticDiagnostics(diagnostic, option) {
return filter(diagnostic, (d) => !d.skippedOn || !option[d.skippedOn]);
}
function parseConfigHostFromCompilerHostLike(host, directoryStructureHost = host) {
return {
fileExists: (f) => directoryStructureHost.fileExists(f),
readDirectory(root, extensions, excludes, includes, depth) {
Debug.assertIsDefined(directoryStructureHost.readDirectory, "'CompilerHost.readDirectory' must be implemented to correctly process 'projectReferences'");
return directoryStructureHost.readDirectory(root, extensions, excludes, includes, depth);
},
readFile: (f) => directoryStructureHost.readFile(f),
useCaseSensitiveFileNames: host.useCaseSensitiveFileNames(),
getCurrentDirectory: () => host.getCurrentDirectory(),
onUnRecoverableConfigFileDiagnostic: host.onUnRecoverableConfigFileDiagnostic || returnUndefined,
trace: host.trace ? (s) => host.trace(s) : void 0
};
}
function createPrependNodes(projectReferences, getCommandLine, readFile, host) {
if (!projectReferences)
return emptyArray;
let nodes;
for (let i = 0; i < projectReferences.length; i++) {
const ref = projectReferences[i];
const resolvedRefOpts = getCommandLine(ref, i);
if (ref.prepend && resolvedRefOpts && resolvedRefOpts.options) {
const out = outFile(resolvedRefOpts.options);
if (!out)
continue;
const { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath } = getOutputPathsForBundle(
resolvedRefOpts.options,
/*forceDtsPaths*/
true
);
const node = createInputFilesWithFilePaths(readFile, jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath, host, resolvedRefOpts.options);
(nodes || (nodes = [])).push(node);
}
}
return nodes || emptyArray;
}
function resolveProjectReferencePath(ref) {
return resolveConfigFileProjectName(ref.path);
}
function getResolutionDiagnostic(options, { extension }, { isDeclarationFile }) {
switch (extension) {
case ".ts" /* Ts */:
case ".d.ts" /* Dts */:
case ".mts" /* Mts */:
case ".d.mts" /* Dmts */:
case ".cts" /* Cts */:
case ".d.cts" /* Dcts */:
return void 0;
case ".tsx" /* Tsx */:
return needJsx();
case ".jsx" /* Jsx */:
return needJsx() || needAllowJs();
case ".js" /* Js */:
case ".mjs" /* Mjs */:
case ".cjs" /* Cjs */:
return needAllowJs();
case ".json" /* Json */:
return needResolveJsonModule();
default:
return needAllowArbitraryExtensions();
}
function needJsx() {
return options.jsx ? void 0 : Diagnostics.Module_0_was_resolved_to_1_but_jsx_is_not_set;
}
function needAllowJs() {
return getAllowJSCompilerOption(options) || !getStrictOptionValue(options, "noImplicitAny") ? void 0 : Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type;
}
function needResolveJsonModule() {
return getResolveJsonModule(options) ? void 0 : Diagnostics.Module_0_was_resolved_to_1_but_resolveJsonModule_is_not_used;
}
function needAllowArbitraryExtensions() {
return isDeclarationFile || options.allowArbitraryExtensions ? void 0 : Diagnostics.Module_0_was_resolved_to_1_but_allowArbitraryExtensions_is_not_set;
}
}
function getModuleNames({ imports, moduleAugmentations }) {
const res = imports.map((i) => i);
for (const aug of moduleAugmentations) {
if (aug.kind === 11 /* StringLiteral */) {
res.push(aug);
}
}
return res;
}
function getModuleNameStringLiteralAt({ imports, moduleAugmentations }, index) {
if (index < imports.length)
return imports[index];
let augIndex = imports.length;
for (const aug of moduleAugmentations) {
if (aug.kind === 11 /* StringLiteral */) {
if (index === augIndex)
return aug;
augIndex++;
}
}
Debug.fail("should never ask for module name at index higher than possible module name");
}
// src/compiler/builderState.ts
var BuilderState;
((BuilderState2) => {
function createManyToManyPathMap() {
function create2(forward, reverse, deleted) {
const map2 = {
getKeys: (v) => reverse.get(v),
getValues: (k) => forward.get(k),
keys: () => forward.keys(),
deleteKey: (k) => {
(deleted || (deleted = /* @__PURE__ */ new Set())).add(k);
const set = forward.get(k);
if (!set) {
return false;
}
set.forEach((v) => deleteFromMultimap(reverse, v, k));
forward.delete(k);
return true;
},
set: (k, vSet) => {
deleted == null ? void 0 : deleted.delete(k);
const existingVSet = forward.get(k);
forward.set(k, vSet);
existingVSet == null ? void 0 : existingVSet.forEach((v) => {
if (!vSet.has(v)) {
deleteFromMultimap(reverse, v, k);
}
});
vSet.forEach((v) => {
if (!(existingVSet == null ? void 0 : existingVSet.has(v))) {
addToMultimap(reverse, v, k);
}
});
return map2;
}
};
return map2;
}
return create2(
/* @__PURE__ */ new Map(),
/* @__PURE__ */ new Map(),
/*deleted*/
void 0
);
}
BuilderState2.createManyToManyPathMap = createManyToManyPathMap;
function addToMultimap(map2, k, v) {
let set = map2.get(k);
if (!set) {
set = /* @__PURE__ */ new Set();
map2.set(k, set);
}
set.add(v);
}
function deleteFromMultimap(map2, k, v) {
const set = map2.get(k);
if (set == null ? void 0 : set.delete(v)) {
if (!set.size) {
map2.delete(k);
}
return true;
}
return false;
}
function getReferencedFilesFromImportedModuleSymbol(symbol) {
return mapDefined(symbol.declarations, (declaration) => {
var _a;
return (_a = getSourceFileOfNode(declaration)) == null ? void 0 : _a.resolvedPath;
});
}
function getReferencedFilesFromImportLiteral(checker, importName) {
const symbol = checker.getSymbolAtLocation(importName);
return symbol && getReferencedFilesFromImportedModuleSymbol(symbol);
}
function getReferencedFileFromFileName(program, fileName, sourceFileDirectory, getCanonicalFileName) {
return toPath(program.getProjectReferenceRedirect(fileName) || fileName, sourceFileDirectory, getCanonicalFileName);
}
function getReferencedFiles(program, sourceFile, getCanonicalFileName) {
let referencedFiles;
if (sourceFile.imports && sourceFile.imports.length > 0) {
const checker = program.getTypeChecker();
for (const importName of sourceFile.imports) {
const declarationSourceFilePaths = getReferencedFilesFromImportLiteral(checker, importName);
declarationSourceFilePaths == null ? void 0 : declarationSourceFilePaths.forEach(addReferencedFile);
}
}
const sourceFileDirectory = getDirectoryPath(sourceFile.resolvedPath);
if (sourceFile.referencedFiles && sourceFile.referencedFiles.length > 0) {
for (const referencedFile of sourceFile.referencedFiles) {
const referencedPath = getReferencedFileFromFileName(program, referencedFile.fileName, sourceFileDirectory, getCanonicalFileName);
addReferencedFile(referencedPath);
}
}
if (sourceFile.resolvedTypeReferenceDirectiveNames) {
sourceFile.resolvedTypeReferenceDirectiveNames.forEach(({ resolvedTypeReferenceDirective }) => {
if (!resolvedTypeReferenceDirective) {
return;
}
const fileName = resolvedTypeReferenceDirective.resolvedFileName;
const typeFilePath = getReferencedFileFromFileName(program, fileName, sourceFileDirectory, getCanonicalFileName);
addReferencedFile(typeFilePath);
});
}
if (sourceFile.moduleAugmentations.length) {
const checker = program.getTypeChecker();
for (const moduleName of sourceFile.moduleAugmentations) {
if (!isStringLiteral(moduleName))
continue;
const symbol = checker.getSymbolAtLocation(moduleName);
if (!symbol)
continue;
addReferenceFromAmbientModule(symbol);
}
}
for (const ambientModule of program.getTypeChecker().getAmbientModules()) {
if (ambientModule.declarations && ambientModule.declarations.length > 1) {
addReferenceFromAmbientModule(ambientModule);
}
}
return referencedFiles;
function addReferenceFromAmbientModule(symbol) {
if (!symbol.declarations) {
return;
}
for (const declaration of symbol.declarations) {
const declarationSourceFile = getSourceFileOfNode(declaration);
if (declarationSourceFile && declarationSourceFile !== sourceFile) {
addReferencedFile(declarationSourceFile.resolvedPath);
}
}
}
function addReferencedFile(referencedPath) {
(referencedFiles || (referencedFiles = /* @__PURE__ */ new Set())).add(referencedPath);
}
}
function canReuseOldState(newReferencedMap, oldState) {
return oldState && !oldState.referencedMap === !newReferencedMap;
}
BuilderState2.canReuseOldState = canReuseOldState;
function create(newProgram, oldState, disableUseFileVersionAsSignature) {
var _a, _b, _c;
const fileInfos = /* @__PURE__ */ new Map();
const options = newProgram.getCompilerOptions();
const isOutFile = outFile(options);
const referencedMap = options.module !== 0 /* None */ && !isOutFile ? createManyToManyPathMap() : void 0;
const exportedModulesMap = referencedMap ? createManyToManyPathMap() : void 0;
const useOldState = canReuseOldState(referencedMap, oldState);
newProgram.getTypeChecker();
for (const sourceFile of newProgram.getSourceFiles()) {
const version2 = Debug.checkDefined(sourceFile.version, "Program intended to be used with Builder should have source files with versions set");
const oldUncommittedSignature = useOldState ? (_a = oldState.oldSignatures) == null ? void 0 : _a.get(sourceFile.resolvedPath) : void 0;
const signature = oldUncommittedSignature === void 0 ? useOldState ? (_b = oldState.fileInfos.get(sourceFile.resolvedPath)) == null ? void 0 : _b.signature : void 0 : oldUncommittedSignature || void 0;
if (referencedMap) {
const newReferences = getReferencedFiles(newProgram, sourceFile, newProgram.getCanonicalFileName);
if (newReferences) {
referencedMap.set(sourceFile.resolvedPath, newReferences);
}
if (useOldState) {
const oldUncommittedExportedModules = (_c = oldState.oldExportedModulesMap) == null ? void 0 : _c.get(sourceFile.resolvedPath);
const exportedModules = oldUncommittedExportedModules === void 0 ? oldState.exportedModulesMap.getValues(sourceFile.resolvedPath) : oldUncommittedExportedModules || void 0;
if (exportedModules) {
exportedModulesMap.set(sourceFile.resolvedPath, exportedModules);
}
}
}
fileInfos.set(sourceFile.resolvedPath, {
version: version2,
signature,
// No need to calculate affectsGlobalScope with --out since its not used at all
affectsGlobalScope: !isOutFile ? isFileAffectingGlobalScope(sourceFile) || void 0 : void 0,
impliedFormat: sourceFile.impliedNodeFormat
});
}
return {
fileInfos,
referencedMap,
exportedModulesMap,
useFileVersionAsSignature: !disableUseFileVersionAsSignature && !useOldState
};
}
BuilderState2.create = create;
function releaseCache2(state) {
state.allFilesExcludingDefaultLibraryFile = void 0;
state.allFileNames = void 0;
}
BuilderState2.releaseCache = releaseCache2;
function getFilesAffectedBy(state, programOfThisState, path, cancellationToken, host) {
var _a, _b;
const result = getFilesAffectedByWithOldState(
state,
programOfThisState,
path,
cancellationToken,
host
);
(_a = state.oldSignatures) == null ? void 0 : _a.clear();
(_b = state.oldExportedModulesMap) == null ? void 0 : _b.clear();
return result;
}
BuilderState2.getFilesAffectedBy = getFilesAffectedBy;
function getFilesAffectedByWithOldState(state, programOfThisState, path, cancellationToken, host) {
const sourceFile = programOfThisState.getSourceFileByPath(path);
if (!sourceFile) {
return emptyArray;
}
if (!updateShapeSignature(state, programOfThisState, sourceFile, cancellationToken, host)) {
return [sourceFile];
}
return (state.referencedMap ? getFilesAffectedByUpdatedShapeWhenModuleEmit : getFilesAffectedByUpdatedShapeWhenNonModuleEmit)(state, programOfThisState, sourceFile, cancellationToken, host);
}
BuilderState2.getFilesAffectedByWithOldState = getFilesAffectedByWithOldState;
function updateSignatureOfFile(state, signature, path) {
state.fileInfos.get(path).signature = signature;
(state.hasCalledUpdateShapeSignature || (state.hasCalledUpdateShapeSignature = /* @__PURE__ */ new Set())).add(path);
}
BuilderState2.updateSignatureOfFile = updateSignatureOfFile;
function computeDtsSignature(programOfThisState, sourceFile, cancellationToken, host, onNewSignature) {
programOfThisState.emit(
sourceFile,
(fileName, text, _writeByteOrderMark, _onError, sourceFiles, data) => {
Debug.assert(isDeclarationFileName(fileName), `File extension for signature expected to be dts: Got:: ${fileName}`);
onNewSignature(computeSignatureWithDiagnostics(
programOfThisState,
sourceFile,
text,
host,
data
), sourceFiles);
},
cancellationToken,
/*emitOnly*/
true,
/*customTransformers*/
void 0,
/*forceDtsEmit*/
true
);
}
BuilderState2.computeDtsSignature = computeDtsSignature;
function updateShapeSignature(state, programOfThisState, sourceFile, cancellationToken, host, useFileVersionAsSignature = state.useFileVersionAsSignature) {
var _a;
if ((_a = state.hasCalledUpdateShapeSignature) == null ? void 0 : _a.has(sourceFile.resolvedPath))
return false;
const info = state.fileInfos.get(sourceFile.resolvedPath);
const prevSignature = info.signature;
let latestSignature;
if (!sourceFile.isDeclarationFile && !useFileVersionAsSignature) {
computeDtsSignature(programOfThisState, sourceFile, cancellationToken, host, (signature, sourceFiles) => {
latestSignature = signature;
if (latestSignature !== prevSignature) {
updateExportedModules(state, sourceFile, sourceFiles[0].exportedModulesFromDeclarationEmit);
}
});
}
if (latestSignature === void 0) {
latestSignature = sourceFile.version;
if (state.exportedModulesMap && latestSignature !== prevSignature) {
(state.oldExportedModulesMap || (state.oldExportedModulesMap = /* @__PURE__ */ new Map())).set(sourceFile.resolvedPath, state.exportedModulesMap.getValues(sourceFile.resolvedPath) || false);
const references = state.referencedMap ? state.referencedMap.getValues(sourceFile.resolvedPath) : void 0;
if (references) {
state.exportedModulesMap.set(sourceFile.resolvedPath, references);
} else {
state.exportedModulesMap.deleteKey(sourceFile.resolvedPath);
}
}
}
(state.oldSignatures || (state.oldSignatures = /* @__PURE__ */ new Map())).set(sourceFile.resolvedPath, prevSignature || false);
(state.hasCalledUpdateShapeSignature || (state.hasCalledUpdateShapeSignature = /* @__PURE__ */ new Set())).add(sourceFile.resolvedPath);
info.signature = latestSignature;
return latestSignature !== prevSignature;
}
BuilderState2.updateShapeSignature = updateShapeSignature;
function updateExportedModules(state, sourceFile, exportedModulesFromDeclarationEmit) {
if (!state.exportedModulesMap)
return;
(state.oldExportedModulesMap || (state.oldExportedModulesMap = /* @__PURE__ */ new Map())).set(sourceFile.resolvedPath, state.exportedModulesMap.getValues(sourceFile.resolvedPath) || false);
const exportedModules = getExportedModules(exportedModulesFromDeclarationEmit);
if (exportedModules) {
state.exportedModulesMap.set(sourceFile.resolvedPath, exportedModules);
} else {
state.exportedModulesMap.deleteKey(sourceFile.resolvedPath);
}
}
BuilderState2.updateExportedModules = updateExportedModules;
function getExportedModules(exportedModulesFromDeclarationEmit) {
let exportedModules;
exportedModulesFromDeclarationEmit == null ? void 0 : exportedModulesFromDeclarationEmit.forEach(
(symbol) => getReferencedFilesFromImportedModuleSymbol(symbol).forEach(
(path) => (exportedModules ?? (exportedModules = /* @__PURE__ */ new Set())).add(path)
)
);
return exportedModules;
}
BuilderState2.getExportedModules = getExportedModules;
function getAllDependencies(state, programOfThisState, sourceFile) {
const compilerOptions = programOfThisState.getCompilerOptions();
if (outFile(compilerOptions)) {
return getAllFileNames(state, programOfThisState);
}
if (!state.referencedMap || isFileAffectingGlobalScope(sourceFile)) {
return getAllFileNames(state, programOfThisState);
}
const seenMap = /* @__PURE__ */ new Set();
const queue = [sourceFile.resolvedPath];
while (queue.length) {
const path = queue.pop();
if (!seenMap.has(path)) {
seenMap.add(path);
const references = state.referencedMap.getValues(path);
if (references) {
for (const key of references.keys()) {
queue.push(key);
}
}
}
}
return arrayFrom(mapDefinedIterator(seenMap.keys(), (path) => {
var _a;
return ((_a = programOfThisState.getSourceFileByPath(path)) == null ? void 0 : _a.fileName) ?? path;
}));
}
BuilderState2.getAllDependencies = getAllDependencies;
function getAllFileNames(state, programOfThisState) {
if (!state.allFileNames) {
const sourceFiles = programOfThisState.getSourceFiles();
state.allFileNames = sourceFiles === emptyArray ? emptyArray : sourceFiles.map((file) => file.fileName);
}
return state.allFileNames;
}
function getReferencedByPaths(state, referencedFilePath) {
const keys = state.referencedMap.getKeys(referencedFilePath);
return keys ? arrayFrom(keys.keys()) : [];
}
BuilderState2.getReferencedByPaths = getReferencedByPaths;
function containsOnlyAmbientModules(sourceFile) {
for (const statement of sourceFile.statements) {
if (!isModuleWithStringLiteralName(statement)) {
return false;
}
}
return true;
}
function containsGlobalScopeAugmentation(sourceFile) {
return some(sourceFile.moduleAugmentations, (augmentation) => isGlobalScopeAugmentation(augmentation.parent));
}
function isFileAffectingGlobalScope(sourceFile) {
return containsGlobalScopeAugmentation(sourceFile) || !isExternalOrCommonJsModule(sourceFile) && !isJsonSourceFile(sourceFile) && !containsOnlyAmbientModules(sourceFile);
}
function getAllFilesExcludingDefaultLibraryFile(state, programOfThisState, firstSourceFile) {
if (state.allFilesExcludingDefaultLibraryFile) {
return state.allFilesExcludingDefaultLibraryFile;
}
let result;
if (firstSourceFile)
addSourceFile(firstSourceFile);
for (const sourceFile of programOfThisState.getSourceFiles()) {
if (sourceFile !== firstSourceFile) {
addSourceFile(sourceFile);
}
}
state.allFilesExcludingDefaultLibraryFile = result || emptyArray;
return state.allFilesExcludingDefaultLibraryFile;
function addSourceFile(sourceFile) {
if (!programOfThisState.isSourceFileDefaultLibrary(sourceFile)) {
(result || (result = [])).push(sourceFile);
}
}
}
BuilderState2.getAllFilesExcludingDefaultLibraryFile = getAllFilesExcludingDefaultLibraryFile;
function getFilesAffectedByUpdatedShapeWhenNonModuleEmit(state, programOfThisState, sourceFileWithUpdatedShape) {
const compilerOptions = programOfThisState.getCompilerOptions();
if (compilerOptions && outFile(compilerOptions)) {
return [sourceFileWithUpdatedShape];
}
return getAllFilesExcludingDefaultLibraryFile(state, programOfThisState, sourceFileWithUpdatedShape);
}
function getFilesAffectedByUpdatedShapeWhenModuleEmit(state, programOfThisState, sourceFileWithUpdatedShape, cancellationToken, host) {
if (isFileAffectingGlobalScope(sourceFileWithUpdatedShape)) {
return getAllFilesExcludingDefaultLibraryFile(state, programOfThisState, sourceFileWithUpdatedShape);
}
const compilerOptions = programOfThisState.getCompilerOptions();
if (compilerOptions && (getIsolatedModules(compilerOptions) || outFile(compilerOptions))) {
return [sourceFileWithUpdatedShape];
}
const seenFileNamesMap = /* @__PURE__ */ new Map();
seenFileNamesMap.set(sourceFileWithUpdatedShape.resolvedPath, sourceFileWithUpdatedShape);
const queue = getReferencedByPaths(state, sourceFileWithUpdatedShape.resolvedPath);
while (queue.length > 0) {
const currentPath = queue.pop();
if (!seenFileNamesMap.has(currentPath)) {
const currentSourceFile = programOfThisState.getSourceFileByPath(currentPath);
seenFileNamesMap.set(currentPath, currentSourceFile);
if (currentSourceFile && updateShapeSignature(state, programOfThisState, currentSourceFile, cancellationToken, host)) {
queue.push(...getReferencedByPaths(state, currentSourceFile.resolvedPath));
}
}
}
return arrayFrom(mapDefinedIterator(seenFileNamesMap.values(), (value) => value));
}
})(BuilderState || (BuilderState = {}));
// src/compiler/builder.ts
function getBuilderFileEmit(options) {
let result = 1 /* Js */;
if (options.sourceMap)
result = result | 2 /* JsMap */;
if (options.inlineSourceMap)
result = result | 4 /* JsInlineMap */;
if (getEmitDeclarations(options))
result = result | 8 /* Dts */;
if (options.declarationMap)
result = result | 16 /* DtsMap */;
if (options.emitDeclarationOnly)
result = result & 24 /* AllDts */;
return result;
}
function getPendingEmitKind(optionsOrEmitKind, oldOptionsOrEmitKind) {
const oldEmitKind = oldOptionsOrEmitKind && (isNumber(oldOptionsOrEmitKind) ? oldOptionsOrEmitKind : getBuilderFileEmit(oldOptionsOrEmitKind));
const emitKind = isNumber(optionsOrEmitKind) ? optionsOrEmitKind : getBuilderFileEmit(optionsOrEmitKind);
if (oldEmitKind === emitKind)
return 0 /* None */;
if (!oldEmitKind || !emitKind)
return emitKind;
const diff = oldEmitKind ^ emitKind;
let result = 0 /* None */;
if (diff & 7 /* AllJs */)
result = emitKind & 7 /* AllJs */;
if (diff & 24 /* AllDts */)
result = result | emitKind & 24 /* AllDts */;
return result;
}
function hasSameKeys(map1, map2) {
return map1 === map2 || map1 !== void 0 && map2 !== void 0 && map1.size === map2.size && !forEachKey(map1, (key) => !map2.has(key));
}
function createBuilderProgramState(newProgram, oldState) {
var _a, _b;
const state = BuilderState.create(
newProgram,
oldState,
/*disableUseFileVersionAsSignature*/
false
);
state.program = newProgram;
const compilerOptions = newProgram.getCompilerOptions();
state.compilerOptions = compilerOptions;
const outFilePath = outFile(compilerOptions);
if (!outFilePath) {
state.semanticDiagnosticsPerFile = /* @__PURE__ */ new Map();
} else if (compilerOptions.composite && (oldState == null ? void 0 : oldState.outSignature) && outFilePath === outFile(oldState == null ? void 0 : oldState.compilerOptions)) {
state.outSignature = oldState.outSignature && getEmitSignatureFromOldSignature(compilerOptions, oldState.compilerOptions, oldState.outSignature);
}
state.changedFilesSet = /* @__PURE__ */ new Set();
state.latestChangedDtsFile = compilerOptions.composite ? oldState == null ? void 0 : oldState.latestChangedDtsFile : void 0;
const useOldState = BuilderState.canReuseOldState(state.referencedMap, oldState);
const oldCompilerOptions = useOldState ? oldState.compilerOptions : void 0;
const canCopySemanticDiagnostics = useOldState && oldState.semanticDiagnosticsPerFile && !!state.semanticDiagnosticsPerFile && !compilerOptionsAffectSemanticDiagnostics(compilerOptions, oldCompilerOptions);
const canCopyEmitSignatures = compilerOptions.composite && (oldState == null ? void 0 : oldState.emitSignatures) && !outFilePath && !compilerOptionsAffectDeclarationPath(compilerOptions, oldState.compilerOptions);
if (useOldState) {
(_a = oldState.changedFilesSet) == null ? void 0 : _a.forEach((value) => state.changedFilesSet.add(value));
if (!outFilePath && ((_b = oldState.affectedFilesPendingEmit) == null ? void 0 : _b.size)) {
state.affectedFilesPendingEmit = new Map(oldState.affectedFilesPendingEmit);
state.seenAffectedFiles = /* @__PURE__ */ new Set();
}
state.programEmitPending = oldState.programEmitPending;
} else {
state.buildInfoEmitPending = true;
}
const referencedMap = state.referencedMap;
const oldReferencedMap = useOldState ? oldState.referencedMap : void 0;
const copyDeclarationFileDiagnostics = canCopySemanticDiagnostics && !compilerOptions.skipLibCheck === !oldCompilerOptions.skipLibCheck;
const copyLibFileDiagnostics = copyDeclarationFileDiagnostics && !compilerOptions.skipDefaultLibCheck === !oldCompilerOptions.skipDefaultLibCheck;
state.fileInfos.forEach((info, sourceFilePath) => {
let oldInfo;
let newReferences;
if (!useOldState || // File wasn't present in old state
!(oldInfo = oldState.fileInfos.get(sourceFilePath)) || // versions dont match
oldInfo.version !== info.version || // Implied formats dont match
oldInfo.impliedFormat !== info.impliedFormat || // Referenced files changed
!hasSameKeys(newReferences = referencedMap && referencedMap.getValues(sourceFilePath), oldReferencedMap && oldReferencedMap.getValues(sourceFilePath)) || // Referenced file was deleted in the new program
newReferences && forEachKey(newReferences, (path) => !state.fileInfos.has(path) && oldState.fileInfos.has(path))) {
addFileToChangeSet(state, sourceFilePath);
} else if (canCopySemanticDiagnostics) {
const sourceFile = newProgram.getSourceFileByPath(sourceFilePath);
if (sourceFile.isDeclarationFile && !copyDeclarationFileDiagnostics)
return;
if (sourceFile.hasNoDefaultLib && !copyLibFileDiagnostics)
return;
const diagnostics = oldState.semanticDiagnosticsPerFile.get(sourceFilePath);
if (diagnostics) {
state.semanticDiagnosticsPerFile.set(
sourceFilePath,
oldState.hasReusableDiagnostic ? convertToDiagnostics(diagnostics, newProgram) : repopulateDiagnostics(diagnostics, newProgram)
);
if (!state.semanticDiagnosticsFromOldState) {
state.semanticDiagnosticsFromOldState = /* @__PURE__ */ new Set();
}
state.semanticDiagnosticsFromOldState.add(sourceFilePath);
}
}
if (canCopyEmitSignatures) {
const oldEmitSignature = oldState.emitSignatures.get(sourceFilePath);
if (oldEmitSignature) {
(state.emitSignatures ?? (state.emitSignatures = /* @__PURE__ */ new Map())).set(sourceFilePath, getEmitSignatureFromOldSignature(compilerOptions, oldState.compilerOptions, oldEmitSignature));
}
}
});
if (useOldState && forEachEntry(oldState.fileInfos, (info, sourceFilePath) => {
if (state.fileInfos.has(sourceFilePath))
return false;
if (outFilePath || info.affectsGlobalScope)
return true;
state.buildInfoEmitPending = true;
return false;
})) {
BuilderState.getAllFilesExcludingDefaultLibraryFile(
state,
newProgram,
/*firstSourceFile*/
void 0
).forEach((file) => addFileToChangeSet(state, file.resolvedPath));
} else if (oldCompilerOptions) {
const pendingEmitKind = compilerOptionsAffectEmit(compilerOptions, oldCompilerOptions) ? getBuilderFileEmit(compilerOptions) : getPendingEmitKind(compilerOptions, oldCompilerOptions);
if (pendingEmitKind !== 0 /* None */) {
if (!outFilePath) {
newProgram.getSourceFiles().forEach((f) => {
if (!state.changedFilesSet.has(f.resolvedPath)) {
addToAffectedFilesPendingEmit(
state,
f.resolvedPath,
pendingEmitKind
);
}
});
Debug.assert(!state.seenAffectedFiles || !state.seenAffectedFiles.size);
state.seenAffectedFiles = state.seenAffectedFiles || /* @__PURE__ */ new Set();
state.buildInfoEmitPending = true;
} else {
state.programEmitPending = state.programEmitPending ? state.programEmitPending | pendingEmitKind : pendingEmitKind;
}
}
}
if (outFilePath && !state.changedFilesSet.size) {
if (useOldState)
state.bundle = oldState.bundle;
if (some(newProgram.getProjectReferences(), (ref) => !!ref.prepend))
state.programEmitPending = getBuilderFileEmit(compilerOptions);
}
return state;
}
function addFileToChangeSet(state, path) {
state.changedFilesSet.add(path);
state.buildInfoEmitPending = true;
state.programEmitPending = void 0;
}
function getEmitSignatureFromOldSignature(options, oldOptions, oldEmitSignature) {
return !!options.declarationMap === !!oldOptions.declarationMap ? (
// Use same format of signature
oldEmitSignature
) : (
// Convert to different format
isString(oldEmitSignature) ? [oldEmitSignature] : oldEmitSignature[0]
);
}
function repopulateDiagnostics(diagnostics, newProgram) {
if (!diagnostics.length)
return diagnostics;
return sameMap(diagnostics, (diag2) => {
if (isString(diag2.messageText))
return diag2;
const repopulatedChain = convertOrRepopulateDiagnosticMessageChain(diag2.messageText, diag2.file, newProgram, (chain) => {
var _a;
return (_a = chain.repopulateInfo) == null ? void 0 : _a.call(chain);
});
return repopulatedChain === diag2.messageText ? diag2 : { ...diag2, messageText: repopulatedChain };
});
}
function convertOrRepopulateDiagnosticMessageChain(chain, sourceFile, newProgram, repopulateInfo) {
const info = repopulateInfo(chain);
if (info) {
return {
...createModuleNotFoundChain(sourceFile, newProgram, info.moduleReference, info.mode, info.packageName || info.moduleReference),
next: convertOrRepopulateDiagnosticMessageChainArray(chain.next, sourceFile, newProgram, repopulateInfo)
};
}
const next = convertOrRepopulateDiagnosticMessageChainArray(chain.next, sourceFile, newProgram, repopulateInfo);
return next === chain.next ? chain : { ...chain, next };
}
function convertOrRepopulateDiagnosticMessageChainArray(array, sourceFile, newProgram, repopulateInfo) {
return sameMap(array, (chain) => convertOrRepopulateDiagnosticMessageChain(chain, sourceFile, newProgram, repopulateInfo));
}
function convertToDiagnostics(diagnostics, newProgram) {
if (!diagnostics.length)
return emptyArray;
let buildInfoDirectory;
return diagnostics.map((diagnostic) => {
const result = convertToDiagnosticRelatedInformation(diagnostic, newProgram, toPathInBuildInfoDirectory);
result.reportsUnnecessary = diagnostic.reportsUnnecessary;
result.reportsDeprecated = diagnostic.reportDeprecated;
result.source = diagnostic.source;
result.skippedOn = diagnostic.skippedOn;
const { relatedInformation } = diagnostic;
result.relatedInformation = relatedInformation ? relatedInformation.length ? relatedInformation.map((r) => convertToDiagnosticRelatedInformation(r, newProgram, toPathInBuildInfoDirectory)) : [] : void 0;
return result;
});
function toPathInBuildInfoDirectory(path) {
buildInfoDirectory ?? (buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(getTsBuildInfoEmitOutputFilePath(newProgram.getCompilerOptions()), newProgram.getCurrentDirectory())));
return toPath(path, buildInfoDirectory, newProgram.getCanonicalFileName);
}
}
function convertToDiagnosticRelatedInformation(diagnostic, newProgram, toPath3) {
const { file } = diagnostic;
const sourceFile = file ? newProgram.getSourceFileByPath(toPath3(file)) : void 0;
return {
...diagnostic,
file: sourceFile,
messageText: isString(diagnostic.messageText) ? diagnostic.messageText : convertOrRepopulateDiagnosticMessageChain(diagnostic.messageText, sourceFile, newProgram, (chain) => chain.info)
};
}
function releaseCache(state) {
BuilderState.releaseCache(state);
state.program = void 0;
}
function backupBuilderProgramEmitState(state) {
const outFilePath = outFile(state.compilerOptions);
Debug.assert(!state.changedFilesSet.size || outFilePath);
return {
affectedFilesPendingEmit: state.affectedFilesPendingEmit && new Map(state.affectedFilesPendingEmit),
seenEmittedFiles: state.seenEmittedFiles && new Map(state.seenEmittedFiles),
programEmitPending: state.programEmitPending,
emitSignatures: state.emitSignatures && new Map(state.emitSignatures),
outSignature: state.outSignature,
latestChangedDtsFile: state.latestChangedDtsFile,
hasChangedEmitSignature: state.hasChangedEmitSignature,
changedFilesSet: outFilePath ? new Set(state.changedFilesSet) : void 0
};
}
function restoreBuilderProgramEmitState(state, savedEmitState) {
state.affectedFilesPendingEmit = savedEmitState.affectedFilesPendingEmit;
state.seenEmittedFiles = savedEmitState.seenEmittedFiles;
state.programEmitPending = savedEmitState.programEmitPending;
state.emitSignatures = savedEmitState.emitSignatures;
state.outSignature = savedEmitState.outSignature;
state.latestChangedDtsFile = savedEmitState.latestChangedDtsFile;
state.hasChangedEmitSignature = savedEmitState.hasChangedEmitSignature;
if (savedEmitState.changedFilesSet)
state.changedFilesSet = savedEmitState.changedFilesSet;
}
function assertSourceFileOkWithoutNextAffectedCall(state, sourceFile) {
Debug.assert(!sourceFile || !state.affectedFiles || state.affectedFiles[state.affectedFilesIndex - 1] !== sourceFile || !state.semanticDiagnosticsPerFile.has(sourceFile.resolvedPath));
}
function getNextAffectedFile(state, cancellationToken, host) {
var _a, _b;
while (true) {
const { affectedFiles } = state;
if (affectedFiles) {
const seenAffectedFiles = state.seenAffectedFiles;
let affectedFilesIndex = state.affectedFilesIndex;
while (affectedFilesIndex < affectedFiles.length) {
const affectedFile = affectedFiles[affectedFilesIndex];
if (!seenAffectedFiles.has(affectedFile.resolvedPath)) {
state.affectedFilesIndex = affectedFilesIndex;
addToAffectedFilesPendingEmit(state, affectedFile.resolvedPath, getBuilderFileEmit(state.compilerOptions));
handleDtsMayChangeOfAffectedFile(
state,
affectedFile,
cancellationToken,
host
);
return affectedFile;
}
affectedFilesIndex++;
}
state.changedFilesSet.delete(state.currentChangedFilePath);
state.currentChangedFilePath = void 0;
(_a = state.oldSignatures) == null ? void 0 : _a.clear();
(_b = state.oldExportedModulesMap) == null ? void 0 : _b.clear();
state.affectedFiles = void 0;
}
const nextKey = state.changedFilesSet.keys().next();
if (nextKey.done) {
return void 0;
}
const program = Debug.checkDefined(state.program);
const compilerOptions = program.getCompilerOptions();
if (outFile(compilerOptions)) {
Debug.assert(!state.semanticDiagnosticsPerFile);
return program;
}
state.affectedFiles = BuilderState.getFilesAffectedByWithOldState(
state,
program,
nextKey.value,
cancellationToken,
host
);
state.currentChangedFilePath = nextKey.value;
state.affectedFilesIndex = 0;
if (!state.seenAffectedFiles)
state.seenAffectedFiles = /* @__PURE__ */ new Set();
}
}
function clearAffectedFilesPendingEmit(state, emitOnlyDtsFiles) {
var _a;
if (!((_a = state.affectedFilesPendingEmit) == null ? void 0 : _a.size))
return;
if (!emitOnlyDtsFiles)
return state.affectedFilesPendingEmit = void 0;
state.affectedFilesPendingEmit.forEach((emitKind, path) => {
const pending = emitKind & 7 /* AllJs */;
if (!pending)
state.affectedFilesPendingEmit.delete(path);
else
state.affectedFilesPendingEmit.set(path, pending);
});
}
function getNextAffectedFilePendingEmit(state, emitOnlyDtsFiles) {
var _a;
if (!((_a = state.affectedFilesPendingEmit) == null ? void 0 : _a.size))
return void 0;
return forEachEntry(state.affectedFilesPendingEmit, (emitKind, path) => {
var _a2;
const affectedFile = state.program.getSourceFileByPath(path);
if (!affectedFile || !sourceFileMayBeEmitted(affectedFile, state.program)) {
state.affectedFilesPendingEmit.delete(path);
return void 0;
}
const seenKind = (_a2 = state.seenEmittedFiles) == null ? void 0 : _a2.get(affectedFile.resolvedPath);
let pendingKind = getPendingEmitKind(emitKind, seenKind);
if (emitOnlyDtsFiles)
pendingKind = pendingKind & 24 /* AllDts */;
if (pendingKind)
return { affectedFile, emitKind: pendingKind };
});
}
function removeDiagnosticsOfLibraryFiles(state) {
if (!state.cleanedDiagnosticsOfLibFiles) {
state.cleanedDiagnosticsOfLibFiles = true;
const program = Debug.checkDefined(state.program);
const options = program.getCompilerOptions();
forEach(
program.getSourceFiles(),
(f) => program.isSourceFileDefaultLibrary(f) && !skipTypeChecking(f, options, program) && removeSemanticDiagnosticsOf(state, f.resolvedPath)
);
}
}
function handleDtsMayChangeOfAffectedFile(state, affectedFile, cancellationToken, host) {
removeSemanticDiagnosticsOf(state, affectedFile.resolvedPath);
if (state.allFilesExcludingDefaultLibraryFile === state.affectedFiles) {
removeDiagnosticsOfLibraryFiles(state);
BuilderState.updateShapeSignature(
state,
Debug.checkDefined(state.program),
affectedFile,
cancellationToken,
host
);
return;
}
if (state.compilerOptions.assumeChangesOnlyAffectDirectDependencies)
return;
handleDtsMayChangeOfReferencingExportOfAffectedFile(
state,
affectedFile,
cancellationToken,
host
);
}
function handleDtsMayChangeOf(state, path, cancellationToken, host) {
removeSemanticDiagnosticsOf(state, path);
if (!state.changedFilesSet.has(path)) {
const program = Debug.checkDefined(state.program);
const sourceFile = program.getSourceFileByPath(path);
if (sourceFile) {
BuilderState.updateShapeSignature(
state,
program,
sourceFile,
cancellationToken,
host,
/*useFileVersionAsSignature*/
true
);
if (getEmitDeclarations(state.compilerOptions)) {
addToAffectedFilesPendingEmit(state, path, state.compilerOptions.declarationMap ? 24 /* AllDts */ : 8 /* Dts */);
}
}
}
}
function removeSemanticDiagnosticsOf(state, path) {
if (!state.semanticDiagnosticsFromOldState) {
return true;
}
state.semanticDiagnosticsFromOldState.delete(path);
state.semanticDiagnosticsPerFile.delete(path);
return !state.semanticDiagnosticsFromOldState.size;
}
function isChangedSignature(state, path) {
const oldSignature = Debug.checkDefined(state.oldSignatures).get(path) || void 0;
const newSignature = Debug.checkDefined(state.fileInfos.get(path)).signature;
return newSignature !== oldSignature;
}
function handleDtsMayChangeOfGlobalScope(state, filePath, cancellationToken, host) {
var _a;
if (!((_a = state.fileInfos.get(filePath)) == null ? void 0 : _a.affectsGlobalScope))
return false;
BuilderState.getAllFilesExcludingDefaultLibraryFile(
state,
state.program,
/*firstSourceFile*/
void 0
).forEach((file) => handleDtsMayChangeOf(
state,
file.resolvedPath,
cancellationToken,
host
));
removeDiagnosticsOfLibraryFiles(state);
return true;
}
function handleDtsMayChangeOfReferencingExportOfAffectedFile(state, affectedFile, cancellationToken, host) {
var _a;
if (!state.exportedModulesMap || !state.changedFilesSet.has(affectedFile.resolvedPath))
return;
if (!isChangedSignature(state, affectedFile.resolvedPath))
return;
if (getIsolatedModules(state.compilerOptions)) {
const seenFileNamesMap = /* @__PURE__ */ new Map();
seenFileNamesMap.set(affectedFile.resolvedPath, true);
const queue = BuilderState.getReferencedByPaths(state, affectedFile.resolvedPath);
while (queue.length > 0) {
const currentPath = queue.pop();
if (!seenFileNamesMap.has(currentPath)) {
seenFileNamesMap.set(currentPath, true);
if (handleDtsMayChangeOfGlobalScope(state, currentPath, cancellationToken, host))
return;
handleDtsMayChangeOf(state, currentPath, cancellationToken, host);
if (isChangedSignature(state, currentPath)) {
const currentSourceFile = Debug.checkDefined(state.program).getSourceFileByPath(currentPath);
queue.push(...BuilderState.getReferencedByPaths(state, currentSourceFile.resolvedPath));
}
}
}
}
const seenFileAndExportsOfFile = /* @__PURE__ */ new Set();
(_a = state.exportedModulesMap.getKeys(affectedFile.resolvedPath)) == null ? void 0 : _a.forEach((exportedFromPath) => {
if (handleDtsMayChangeOfGlobalScope(state, exportedFromPath, cancellationToken, host))
return true;
const references = state.referencedMap.getKeys(exportedFromPath);
return references && forEachKey(
references,
(filePath) => handleDtsMayChangeOfFileAndExportsOfFile(
state,
filePath,
seenFileAndExportsOfFile,
cancellationToken,
host
)
);
});
}
function handleDtsMayChangeOfFileAndExportsOfFile(state, filePath, seenFileAndExportsOfFile, cancellationToken, host) {
var _a, _b;
if (!tryAddToSet(seenFileAndExportsOfFile, filePath))
return void 0;
if (handleDtsMayChangeOfGlobalScope(state, filePath, cancellationToken, host))
return true;
handleDtsMayChangeOf(state, filePath, cancellationToken, host);
(_a = state.exportedModulesMap.getKeys(filePath)) == null ? void 0 : _a.forEach(
(exportedFromPath) => handleDtsMayChangeOfFileAndExportsOfFile(
state,
exportedFromPath,
seenFileAndExportsOfFile,
cancellationToken,
host
)
);
(_b = state.referencedMap.getKeys(filePath)) == null ? void 0 : _b.forEach(
(referencingFilePath) => !seenFileAndExportsOfFile.has(referencingFilePath) && // Not already removed diagnostic file
handleDtsMayChangeOf(
// Dont add to seen since this is not yet done with the export removal
state,
referencingFilePath,
cancellationToken,
host
)
);
return void 0;
}
function getSemanticDiagnosticsOfFile(state, sourceFile, cancellationToken) {
return concatenate(
getBinderAndCheckerDiagnosticsOfFile(state, sourceFile, cancellationToken),
Debug.checkDefined(state.program).getProgramDiagnostics(sourceFile)
);
}
function getBinderAndCheckerDiagnosticsOfFile(state, sourceFile, cancellationToken) {
const path = sourceFile.resolvedPath;
if (state.semanticDiagnosticsPerFile) {
const cachedDiagnostics = state.semanticDiagnosticsPerFile.get(path);
if (cachedDiagnostics) {
return filterSemanticDiagnostics(cachedDiagnostics, state.compilerOptions);
}
}
const diagnostics = Debug.checkDefined(state.program).getBindAndCheckDiagnostics(sourceFile, cancellationToken);
if (state.semanticDiagnosticsPerFile) {
state.semanticDiagnosticsPerFile.set(path, diagnostics);
}
return filterSemanticDiagnostics(diagnostics, state.compilerOptions);
}
function isProgramBundleEmitBuildInfo(info) {
return !!outFile(info.options || {});
}
function getBuildInfo2(state, bundle) {
var _a, _b, _c;
const currentDirectory = Debug.checkDefined(state.program).getCurrentDirectory();
const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(getTsBuildInfoEmitOutputFilePath(state.compilerOptions), currentDirectory));
const latestChangedDtsFile = state.latestChangedDtsFile ? relativeToBuildInfoEnsuringAbsolutePath(state.latestChangedDtsFile) : void 0;
const fileNames = [];
const fileNameToFileId = /* @__PURE__ */ new Map();
const root = [];
if (outFile(state.compilerOptions)) {
const fileInfos2 = arrayFrom(state.fileInfos.entries(), ([key, value]) => {
const fileId = toFileId(key);
tryAddRoot(key, fileId);
return value.impliedFormat ? { version: value.version, impliedFormat: value.impliedFormat, signature: void 0, affectsGlobalScope: void 0 } : value.version;
});
const program2 = {
fileNames,
fileInfos: fileInfos2,
root,
options: convertToProgramBuildInfoCompilerOptions(state.compilerOptions),
outSignature: state.outSignature,
latestChangedDtsFile,
pendingEmit: !state.programEmitPending ? void 0 : (
// Pending is undefined or None is encoded as undefined
state.programEmitPending === getBuilderFileEmit(state.compilerOptions) ? false : (
// Pending emit is same as deteremined by compilerOptions
state.programEmitPending
)
)
// Actual value
};
const { js, dts, commonSourceDirectory, sourceFiles } = bundle;
state.bundle = bundle = {
commonSourceDirectory,
sourceFiles,
js: js || (!state.compilerOptions.emitDeclarationOnly ? (_a = state.bundle) == null ? void 0 : _a.js : void 0),
dts: dts || (getEmitDeclarations(state.compilerOptions) ? (_b = state.bundle) == null ? void 0 : _b.dts : void 0)
};
return createBuildInfo(program2, bundle);
}
let fileIdsList;
let fileNamesToFileIdListId;
let emitSignatures;
const fileInfos = arrayFrom(state.fileInfos.entries(), ([key, value]) => {
var _a2, _b2;
const fileId = toFileId(key);
tryAddRoot(key, fileId);
Debug.assert(fileNames[fileId - 1] === relativeToBuildInfo(key));
const oldSignature = (_a2 = state.oldSignatures) == null ? void 0 : _a2.get(key);
const actualSignature = oldSignature !== void 0 ? oldSignature || void 0 : value.signature;
if (state.compilerOptions.composite) {
const file = state.program.getSourceFileByPath(key);
if (!isJsonSourceFile(file) && sourceFileMayBeEmitted(file, state.program)) {
const emitSignature = (_b2 = state.emitSignatures) == null ? void 0 : _b2.get(key);
if (emitSignature !== actualSignature) {
(emitSignatures || (emitSignatures = [])).push(emitSignature === void 0 ? fileId : (
// There is no emit, encode as false
// fileId, signature: emptyArray if signature only differs in dtsMap option than our own compilerOptions otherwise EmitSignature
[fileId, !isString(emitSignature) && emitSignature[0] === actualSignature ? emptyArray : emitSignature]
));
}
}
}
return value.version === actualSignature ? value.affectsGlobalScope || value.impliedFormat ? (
// If file version is same as signature, dont serialize signature
{ version: value.version, signature: void 0, affectsGlobalScope: value.affectsGlobalScope, impliedFormat: value.impliedFormat }
) : (
// If file info only contains version and signature and both are same we can just write string
value.version
) : actualSignature !== void 0 ? (
// If signature is not same as version, encode signature in the fileInfo
oldSignature === void 0 ? (
// If we havent computed signature, use fileInfo as is
value
) : (
// Serialize fileInfo with new updated signature
{ version: value.version, signature: actualSignature, affectsGlobalScope: value.affectsGlobalScope, impliedFormat: value.impliedFormat }
)
) : (
// Signature of the FileInfo is undefined, serialize it as false
{ version: value.version, signature: false, affectsGlobalScope: value.affectsGlobalScope, impliedFormat: value.impliedFormat }
);
});
let referencedMap;
if (state.referencedMap) {
referencedMap = arrayFrom(state.referencedMap.keys()).sort(compareStringsCaseSensitive).map((key) => [
toFileId(key),
toFileIdListId(state.referencedMap.getValues(key))
]);
}
let exportedModulesMap;
if (state.exportedModulesMap) {
exportedModulesMap = mapDefined(arrayFrom(state.exportedModulesMap.keys()).sort(compareStringsCaseSensitive), (key) => {
var _a2;
const oldValue = (_a2 = state.oldExportedModulesMap) == null ? void 0 : _a2.get(key);
if (oldValue === void 0)
return [toFileId(key), toFileIdListId(state.exportedModulesMap.getValues(key))];
if (oldValue)
return [toFileId(key), toFileIdListId(oldValue)];
return void 0;
});
}
let semanticDiagnosticsPerFile;
if (state.semanticDiagnosticsPerFile) {
for (const key of arrayFrom(state.semanticDiagnosticsPerFile.keys()).sort(compareStringsCaseSensitive)) {
const value = state.semanticDiagnosticsPerFile.get(key);
(semanticDiagnosticsPerFile || (semanticDiagnosticsPerFile = [])).push(
value.length ? [
toFileId(key),
convertToReusableDiagnostics(value, relativeToBuildInfo)
] : toFileId(key)
);
}
}
let affectedFilesPendingEmit;
if ((_c = state.affectedFilesPendingEmit) == null ? void 0 : _c.size) {
const fullEmitForOptions = getBuilderFileEmit(state.compilerOptions);
const seenFiles = /* @__PURE__ */ new Set();
for (const path of arrayFrom(state.affectedFilesPendingEmit.keys()).sort(compareStringsCaseSensitive)) {
if (tryAddToSet(seenFiles, path)) {
const file = state.program.getSourceFileByPath(path);
if (!file || !sourceFileMayBeEmitted(file, state.program))
continue;
const fileId = toFileId(path), pendingEmit = state.affectedFilesPendingEmit.get(path);
(affectedFilesPendingEmit || (affectedFilesPendingEmit = [])).push(
pendingEmit === fullEmitForOptions ? fileId : (
// Pending full emit per options
pendingEmit === 8 /* Dts */ ? [fileId] : (
// Pending on Dts only
[fileId, pendingEmit]
)
)
// Anything else
);
}
}
}
let changeFileSet;
if (state.changedFilesSet.size) {
for (const path of arrayFrom(state.changedFilesSet.keys()).sort(compareStringsCaseSensitive)) {
(changeFileSet || (changeFileSet = [])).push(toFileId(path));
}
}
const program = {
fileNames,
fileInfos,
root,
options: convertToProgramBuildInfoCompilerOptions(state.compilerOptions),
fileIdsList,
referencedMap,
exportedModulesMap,
semanticDiagnosticsPerFile,
affectedFilesPendingEmit,
changeFileSet,
emitSignatures,
latestChangedDtsFile
};
return createBuildInfo(program, bundle);
function relativeToBuildInfoEnsuringAbsolutePath(path) {
return relativeToBuildInfo(getNormalizedAbsolutePath(path, currentDirectory));
}
function relativeToBuildInfo(path) {
return ensurePathIsNonModuleName(getRelativePathFromDirectory(buildInfoDirectory, path, state.program.getCanonicalFileName));
}
function toFileId(path) {
let fileId = fileNameToFileId.get(path);
if (fileId === void 0) {
fileNames.push(relativeToBuildInfo(path));
fileNameToFileId.set(path, fileId = fileNames.length);
}
return fileId;
}
function toFileIdListId(set) {
const fileIds = arrayFrom(set.keys(), toFileId).sort(compareValues);
const key = fileIds.join();
let fileIdListId = fileNamesToFileIdListId == null ? void 0 : fileNamesToFileIdListId.get(key);
if (fileIdListId === void 0) {
(fileIdsList || (fileIdsList = [])).push(fileIds);
(fileNamesToFileIdListId || (fileNamesToFileIdListId = /* @__PURE__ */ new Map())).set(key, fileIdListId = fileIdsList.length);
}
return fileIdListId;
}
function tryAddRoot(path, fileId) {
const file = state.program.getSourceFile(path);
if (!state.program.getFileIncludeReasons().get(file.path).some((r) => r.kind === 0 /* RootFile */))
return;
if (!root.length)
return root.push(fileId);
const last2 = root[root.length - 1];
const isLastStartEnd = isArray(last2);
if (isLastStartEnd && last2[1] === fileId - 1)
return last2[1] = fileId;
if (isLastStartEnd || root.length === 1 || last2 !== fileId - 1)
return root.push(fileId);
const lastButOne = root[root.length - 2];
if (!isNumber(lastButOne) || lastButOne !== last2 - 1)
return root.push(fileId);
root[root.length - 2] = [lastButOne, fileId];
return root.length = root.length - 1;
}
function convertToProgramBuildInfoCompilerOptions(options) {
let result;
const { optionsNameMap } = getOptionsNameMap();
for (const name of getOwnKeys(options).sort(compareStringsCaseSensitive)) {
const optionInfo = optionsNameMap.get(name.toLowerCase());
if (optionInfo == null ? void 0 : optionInfo.affectsBuildInfo) {
(result || (result = {}))[name] = convertToReusableCompilerOptionValue(
optionInfo,
options[name],
relativeToBuildInfoEnsuringAbsolutePath
);
}
}
return result;
}
}
function convertToReusableCompilerOptionValue(option, value, relativeToBuildInfo) {
if (option) {
Debug.assert(option.type !== "listOrElement");
if (option.type === "list") {
const values = value;
if (option.element.isFilePath && values.length) {
return values.map(relativeToBuildInfo);
}
} else if (option.isFilePath) {
return relativeToBuildInfo(value);
}
}
return value;
}
function convertToReusableDiagnostics(diagnostics, relativeToBuildInfo) {
Debug.assert(!!diagnostics.length);
return diagnostics.map((diagnostic) => {
const result = convertToReusableDiagnosticRelatedInformation(diagnostic, relativeToBuildInfo);
result.reportsUnnecessary = diagnostic.reportsUnnecessary;
result.reportDeprecated = diagnostic.reportsDeprecated;
result.source = diagnostic.source;
result.skippedOn = diagnostic.skippedOn;
const { relatedInformation } = diagnostic;
result.relatedInformation = relatedInformation ? relatedInformation.length ? relatedInformation.map((r) => convertToReusableDiagnosticRelatedInformation(r, relativeToBuildInfo)) : [] : void 0;
return result;
});
}
function convertToReusableDiagnosticRelatedInformation(diagnostic, relativeToBuildInfo) {
const { file } = diagnostic;
return {
...diagnostic,
file: file ? relativeToBuildInfo(file.resolvedPath) : void 0,
messageText: isString(diagnostic.messageText) ? diagnostic.messageText : convertToReusableDiagnosticMessageChain(diagnostic.messageText)
};
}
function convertToReusableDiagnosticMessageChain(chain) {
if (chain.repopulateInfo) {
return {
info: chain.repopulateInfo(),
next: convertToReusableDiagnosticMessageChainArray(chain.next)
};
}
const next = convertToReusableDiagnosticMessageChainArray(chain.next);
return next === chain.next ? chain : { ...chain, next };
}
function convertToReusableDiagnosticMessageChainArray(array) {
if (!array)
return array;
return forEach(array, (chain, index) => {
const reusable = convertToReusableDiagnosticMessageChain(chain);
if (chain === reusable)
return void 0;
const result = index > 0 ? array.slice(0, index - 1) : [];
result.push(reusable);
for (let i = index + 1; i < array.length; i++) {
result.push(convertToReusableDiagnosticMessageChain(array[i]));
}
return result;
}) || array;
}
function getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences) {
let host;
let newProgram;
let oldProgram;
if (newProgramOrRootNames === void 0) {
Debug.assert(hostOrOptions === void 0);
host = oldProgramOrHost;
oldProgram = configFileParsingDiagnosticsOrOldProgram;
Debug.assert(!!oldProgram);
newProgram = oldProgram.getProgram();
} else if (isArray(newProgramOrRootNames)) {
oldProgram = configFileParsingDiagnosticsOrOldProgram;
newProgram = createProgram({
rootNames: newProgramOrRootNames,
options: hostOrOptions,
host: oldProgramOrHost,
oldProgram: oldProgram && oldProgram.getProgramOrUndefined(),
configFileParsingDiagnostics,
projectReferences
});
host = oldProgramOrHost;
} else {
newProgram = newProgramOrRootNames;
host = hostOrOptions;
oldProgram = oldProgramOrHost;
configFileParsingDiagnostics = configFileParsingDiagnosticsOrOldProgram;
}
return { host, newProgram, oldProgram, configFileParsingDiagnostics: configFileParsingDiagnostics || emptyArray };
}
function getTextHandlingSourceMapForSignature(text, data) {
return (data == null ? void 0 : data.sourceMapUrlPos) !== void 0 ? text.substring(0, data.sourceMapUrlPos) : text;
}
function computeSignatureWithDiagnostics(program, sourceFile, text, host, data) {
var _a;
text = getTextHandlingSourceMapForSignature(text, data);
let sourceFileDirectory;
if ((_a = data == null ? void 0 : data.diagnostics) == null ? void 0 : _a.length) {
text += data.diagnostics.map(
(diagnostic) => `${locationInfo(diagnostic)}${DiagnosticCategory[diagnostic.category]}${diagnostic.code}: ${flattenDiagnosticMessageText2(diagnostic.messageText)}`
).join("\n");
}
return (host.createHash ?? generateDjb2Hash)(text);
function flattenDiagnosticMessageText2(diagnostic) {
return isString(diagnostic) ? diagnostic : diagnostic === void 0 ? "" : !diagnostic.next ? diagnostic.messageText : diagnostic.messageText + diagnostic.next.map(flattenDiagnosticMessageText2).join("\n");
}
function locationInfo(diagnostic) {
if (diagnostic.file.resolvedPath === sourceFile.resolvedPath)
return `(${diagnostic.start},${diagnostic.length})`;
if (sourceFileDirectory === void 0)
sourceFileDirectory = getDirectoryPath(sourceFile.resolvedPath);
return `${ensurePathIsNonModuleName(getRelativePathFromDirectory(
sourceFileDirectory,
diagnostic.file.resolvedPath,
program.getCanonicalFileName
))}(${diagnostic.start},${diagnostic.length})`;
}
}
function computeSignature(text, host, data) {
return (host.createHash ?? generateDjb2Hash)(getTextHandlingSourceMapForSignature(text, data));
}
function createBuilderProgram(kind, { newProgram, host, oldProgram, configFileParsingDiagnostics }) {
let oldState = oldProgram && oldProgram.getState();
if (oldState && newProgram === oldState.program && configFileParsingDiagnostics === newProgram.getConfigFileParsingDiagnostics()) {
newProgram = void 0;
oldState = void 0;
return oldProgram;
}
const state = createBuilderProgramState(newProgram, oldState);
newProgram.getBuildInfo = (bundle) => getBuildInfo2(state, bundle);
newProgram = void 0;
oldProgram = void 0;
oldState = void 0;
const getState = () => state;
const builderProgram = createRedirectedBuilderProgram(getState, configFileParsingDiagnostics);
builderProgram.getState = getState;
builderProgram.saveEmitState = () => backupBuilderProgramEmitState(state);
builderProgram.restoreEmitState = (saved) => restoreBuilderProgramEmitState(state, saved);
builderProgram.hasChangedEmitSignature = () => !!state.hasChangedEmitSignature;
builderProgram.getAllDependencies = (sourceFile) => BuilderState.getAllDependencies(state, Debug.checkDefined(state.program), sourceFile);
builderProgram.getSemanticDiagnostics = getSemanticDiagnostics;
builderProgram.emit = emit;
builderProgram.releaseProgram = () => releaseCache(state);
if (kind === 0 /* SemanticDiagnosticsBuilderProgram */) {
builderProgram.getSemanticDiagnosticsOfNextAffectedFile = getSemanticDiagnosticsOfNextAffectedFile;
} else if (kind === 1 /* EmitAndSemanticDiagnosticsBuilderProgram */) {
builderProgram.getSemanticDiagnosticsOfNextAffectedFile = getSemanticDiagnosticsOfNextAffectedFile;
builderProgram.emitNextAffectedFile = emitNextAffectedFile;
builderProgram.emitBuildInfo = emitBuildInfo;
} else {
notImplemented();
}
return builderProgram;
function emitBuildInfo(writeFile2, cancellationToken) {
if (state.buildInfoEmitPending) {
const result = Debug.checkDefined(state.program).emitBuildInfo(writeFile2 || maybeBind(host, host.writeFile), cancellationToken);
state.buildInfoEmitPending = false;
return result;
}
return emitSkippedWithNoDiagnostics;
}
function emitNextAffectedFile(writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers) {
var _a, _b, _c;
let affected = getNextAffectedFile(state, cancellationToken, host);
const programEmitKind = getBuilderFileEmit(state.compilerOptions);
let emitKind = emitOnlyDtsFiles ? programEmitKind & 24 /* AllDts */ : programEmitKind;
if (!affected) {
if (!outFile(state.compilerOptions)) {
const pendingAffectedFile = getNextAffectedFilePendingEmit(state, emitOnlyDtsFiles);
if (!pendingAffectedFile) {
if (!state.buildInfoEmitPending)
return void 0;
const affected2 = state.program;
const result2 = affected2.emitBuildInfo(writeFile2 || maybeBind(host, host.writeFile), cancellationToken);
state.buildInfoEmitPending = false;
return { result: result2, affected: affected2 };
}
({ affectedFile: affected, emitKind } = pendingAffectedFile);
} else {
if (!state.programEmitPending)
return void 0;
emitKind = state.programEmitPending;
if (emitOnlyDtsFiles)
emitKind = emitKind & 24 /* AllDts */;
if (!emitKind)
return void 0;
affected = state.program;
}
}
let emitOnly;
if (emitKind & 7 /* AllJs */)
emitOnly = 0 /* Js */;
if (emitKind & 24 /* AllDts */)
emitOnly = emitOnly === void 0 ? 1 /* Dts */ : void 0;
if (affected === state.program) {
state.programEmitPending = state.changedFilesSet.size ? getPendingEmitKind(programEmitKind, emitKind) : state.programEmitPending ? getPendingEmitKind(state.programEmitPending, emitKind) : void 0;
}
const result = state.program.emit(
affected === state.program ? void 0 : affected,
getWriteFileCallback(writeFile2, customTransformers),
cancellationToken,
emitOnly,
customTransformers
);
if (affected !== state.program) {
const affectedSourceFile = affected;
state.seenAffectedFiles.add(affectedSourceFile.resolvedPath);
if (state.affectedFilesIndex !== void 0)
state.affectedFilesIndex++;
state.buildInfoEmitPending = true;
const existing = ((_a = state.seenEmittedFiles) == null ? void 0 : _a.get(affectedSourceFile.resolvedPath)) || 0 /* None */;
(state.seenEmittedFiles ?? (state.seenEmittedFiles = /* @__PURE__ */ new Map())).set(affectedSourceFile.resolvedPath, emitKind | existing);
const existingPending = ((_b = state.affectedFilesPendingEmit) == null ? void 0 : _b.get(affectedSourceFile.resolvedPath)) || programEmitKind;
const pendingKind = getPendingEmitKind(existingPending, emitKind | existing);
if (pendingKind)
(state.affectedFilesPendingEmit ?? (state.affectedFilesPendingEmit = /* @__PURE__ */ new Map())).set(affectedSourceFile.resolvedPath, pendingKind);
else
(_c = state.affectedFilesPendingEmit) == null ? void 0 : _c.delete(affectedSourceFile.resolvedPath);
} else {
state.changedFilesSet.clear();
}
return { result, affected };
}
function getWriteFileCallback(writeFile2, customTransformers) {
if (!getEmitDeclarations(state.compilerOptions))
return writeFile2 || maybeBind(host, host.writeFile);
return (fileName, text, writeByteOrderMark, onError, sourceFiles, data) => {
var _a, _b, _c, _d;
if (isDeclarationFileName(fileName)) {
if (!outFile(state.compilerOptions)) {
Debug.assert((sourceFiles == null ? void 0 : sourceFiles.length) === 1);
let emitSignature;
if (!customTransformers) {
const file = sourceFiles[0];
const info = state.fileInfos.get(file.resolvedPath);
if (info.signature === file.version) {
const signature = computeSignatureWithDiagnostics(
state.program,
file,
text,
host,
data
);
if (!((_a = data == null ? void 0 : data.diagnostics) == null ? void 0 : _a.length))
emitSignature = signature;
if (signature !== file.version) {
if (host.storeFilesChangingSignatureDuringEmit)
(state.filesChangingSignature ?? (state.filesChangingSignature = /* @__PURE__ */ new Set())).add(file.resolvedPath);
if (state.exportedModulesMap)
BuilderState.updateExportedModules(state, file, file.exportedModulesFromDeclarationEmit);
if (state.affectedFiles) {
const existing = (_b = state.oldSignatures) == null ? void 0 : _b.get(file.resolvedPath);
if (existing === void 0)
(state.oldSignatures ?? (state.oldSignatures = /* @__PURE__ */ new Map())).set(file.resolvedPath, info.signature || false);
info.signature = signature;
} else {
info.signature = signature;
(_c = state.oldExportedModulesMap) == null ? void 0 : _c.clear();
}
}
}
}
if (state.compilerOptions.composite) {
const filePath = sourceFiles[0].resolvedPath;
emitSignature = handleNewSignature((_d = state.emitSignatures) == null ? void 0 : _d.get(filePath), emitSignature);
if (!emitSignature)
return;
(state.emitSignatures ?? (state.emitSignatures = /* @__PURE__ */ new Map())).set(filePath, emitSignature);
}
} else if (state.compilerOptions.composite) {
const newSignature = handleNewSignature(
state.outSignature,
/*newSignature*/
void 0
);
if (!newSignature)
return;
state.outSignature = newSignature;
}
}
if (writeFile2)
writeFile2(fileName, text, writeByteOrderMark, onError, sourceFiles, data);
else if (host.writeFile)
host.writeFile(fileName, text, writeByteOrderMark, onError, sourceFiles, data);
else
state.program.writeFile(fileName, text, writeByteOrderMark, onError, sourceFiles, data);
function handleNewSignature(oldSignatureFormat, newSignature) {
const oldSignature = !oldSignatureFormat || isString(oldSignatureFormat) ? oldSignatureFormat : oldSignatureFormat[0];
newSignature ?? (newSignature = computeSignature(text, host, data));
if (newSignature === oldSignature) {
if (oldSignatureFormat === oldSignature)
return void 0;
else if (data)
data.differsOnlyInMap = true;
else
data = { differsOnlyInMap: true };
} else {
state.hasChangedEmitSignature = true;
state.latestChangedDtsFile = fileName;
}
return newSignature;
}
};
}
function emit(targetSourceFile, writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers) {
if (kind === 1 /* EmitAndSemanticDiagnosticsBuilderProgram */) {
assertSourceFileOkWithoutNextAffectedCall(state, targetSourceFile);
}
const result = handleNoEmitOptions(builderProgram, targetSourceFile, writeFile2, cancellationToken);
if (result)
return result;
if (!targetSourceFile) {
if (kind === 1 /* EmitAndSemanticDiagnosticsBuilderProgram */) {
let sourceMaps = [];
let emitSkipped = false;
let diagnostics;
let emittedFiles = [];
let affectedEmitResult;
while (affectedEmitResult = emitNextAffectedFile(writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers)) {
emitSkipped = emitSkipped || affectedEmitResult.result.emitSkipped;
diagnostics = addRange(diagnostics, affectedEmitResult.result.diagnostics);
emittedFiles = addRange(emittedFiles, affectedEmitResult.result.emittedFiles);
sourceMaps = addRange(sourceMaps, affectedEmitResult.result.sourceMaps);
}
return {
emitSkipped,
diagnostics: diagnostics || emptyArray,
emittedFiles,
sourceMaps
};
} else {
clearAffectedFilesPendingEmit(state, emitOnlyDtsFiles);
}
}
return Debug.checkDefined(state.program).emit(
targetSourceFile,
getWriteFileCallback(writeFile2, customTransformers),
cancellationToken,
emitOnlyDtsFiles,
customTransformers
);
}
function getSemanticDiagnosticsOfNextAffectedFile(cancellationToken, ignoreSourceFile) {
while (true) {
const affected = getNextAffectedFile(state, cancellationToken, host);
let result;
if (!affected)
return void 0;
else if (affected !== state.program) {
const affectedSourceFile = affected;
if (!ignoreSourceFile || !ignoreSourceFile(affectedSourceFile)) {
result = getSemanticDiagnosticsOfFile(state, affectedSourceFile, cancellationToken);
}
state.seenAffectedFiles.add(affectedSourceFile.resolvedPath);
state.affectedFilesIndex++;
state.buildInfoEmitPending = true;
if (!result)
continue;
} else {
result = state.program.getSemanticDiagnostics(
/*sourceFile*/
void 0,
cancellationToken
);
state.changedFilesSet.clear();
state.programEmitPending = getBuilderFileEmit(state.compilerOptions);
}
return { result, affected };
}
}
function getSemanticDiagnostics(sourceFile, cancellationToken) {
assertSourceFileOkWithoutNextAffectedCall(state, sourceFile);
const compilerOptions = Debug.checkDefined(state.program).getCompilerOptions();
if (outFile(compilerOptions)) {
Debug.assert(!state.semanticDiagnosticsPerFile);
return Debug.checkDefined(state.program).getSemanticDiagnostics(sourceFile, cancellationToken);
}
if (sourceFile) {
return getSemanticDiagnosticsOfFile(state, sourceFile, cancellationToken);
}
while (getSemanticDiagnosticsOfNextAffectedFile(cancellationToken)) {
}
let diagnostics;
for (const sourceFile2 of Debug.checkDefined(state.program).getSourceFiles()) {
diagnostics = addRange(diagnostics, getSemanticDiagnosticsOfFile(state, sourceFile2, cancellationToken));
}
return diagnostics || emptyArray;
}
}
function addToAffectedFilesPendingEmit(state, affectedFilePendingEmit, kind) {
var _a;
const existingKind = ((_a = state.affectedFilesPendingEmit) == null ? void 0 : _a.get(affectedFilePendingEmit)) || 0 /* None */;
(state.affectedFilesPendingEmit ?? (state.affectedFilesPendingEmit = /* @__PURE__ */ new Map())).set(affectedFilePendingEmit, existingKind | kind);
}
function toBuilderStateFileInfoForMultiEmit(fileInfo) {
return isString(fileInfo) ? { version: fileInfo, signature: fileInfo, affectsGlobalScope: void 0, impliedFormat: void 0 } : isString(fileInfo.signature) ? fileInfo : { version: fileInfo.version, signature: fileInfo.signature === false ? void 0 : fileInfo.version, affectsGlobalScope: fileInfo.affectsGlobalScope, impliedFormat: fileInfo.impliedFormat };
}
function toBuilderFileEmit(value, fullEmitForOptions) {
return isNumber(value) ? fullEmitForOptions : value[1] || 8 /* Dts */;
}
function toProgramEmitPending(value, options) {
return !value ? getBuilderFileEmit(options || {}) : value;
}
function createBuilderProgramUsingProgramBuildInfo(buildInfo, buildInfoPath, host) {
var _a, _b, _c, _d;
const program = buildInfo.program;
const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory()));
const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames());
let state;
const filePaths = (_a = program.fileNames) == null ? void 0 : _a.map(toPathInBuildInfoDirectory);
let filePathsSetList;
const latestChangedDtsFile = program.latestChangedDtsFile ? toAbsolutePath(program.latestChangedDtsFile) : void 0;
if (isProgramBundleEmitBuildInfo(program)) {
const fileInfos = /* @__PURE__ */ new Map();
program.fileInfos.forEach((fileInfo, index) => {
const path = toFilePath(index + 1);
fileInfos.set(path, isString(fileInfo) ? { version: fileInfo, signature: void 0, affectsGlobalScope: void 0, impliedFormat: void 0 } : fileInfo);
});
state = {
fileInfos,
compilerOptions: program.options ? convertToOptionsWithAbsolutePaths(program.options, toAbsolutePath) : {},
latestChangedDtsFile,
outSignature: program.outSignature,
programEmitPending: program.pendingEmit === void 0 ? void 0 : toProgramEmitPending(program.pendingEmit, program.options),
bundle: buildInfo.bundle
};
} else {
filePathsSetList = (_b = program.fileIdsList) == null ? void 0 : _b.map((fileIds) => new Set(fileIds.map(toFilePath)));
const fileInfos = /* @__PURE__ */ new Map();
const emitSignatures = ((_c = program.options) == null ? void 0 : _c.composite) && !outFile(program.options) ? /* @__PURE__ */ new Map() : void 0;
program.fileInfos.forEach((fileInfo, index) => {
const path = toFilePath(index + 1);
const stateFileInfo = toBuilderStateFileInfoForMultiEmit(fileInfo);
fileInfos.set(path, stateFileInfo);
if (emitSignatures && stateFileInfo.signature)
emitSignatures.set(path, stateFileInfo.signature);
});
(_d = program.emitSignatures) == null ? void 0 : _d.forEach((value) => {
if (isNumber(value))
emitSignatures.delete(toFilePath(value));
else {
const key = toFilePath(value[0]);
emitSignatures.set(
key,
!isString(value[1]) && !value[1].length ? (
// File signature is emit signature but differs in map
[emitSignatures.get(key)]
) : value[1]
);
}
});
const fullEmitForOptions = program.affectedFilesPendingEmit ? getBuilderFileEmit(program.options || {}) : void 0;
state = {
fileInfos,
compilerOptions: program.options ? convertToOptionsWithAbsolutePaths(program.options, toAbsolutePath) : {},
referencedMap: toManyToManyPathMap(program.referencedMap),
exportedModulesMap: toManyToManyPathMap(program.exportedModulesMap),
semanticDiagnosticsPerFile: program.semanticDiagnosticsPerFile && arrayToMap(program.semanticDiagnosticsPerFile, (value) => toFilePath(isNumber(value) ? value : value[0]), (value) => isNumber(value) ? emptyArray : value[1]),
hasReusableDiagnostic: true,
affectedFilesPendingEmit: program.affectedFilesPendingEmit && arrayToMap(program.affectedFilesPendingEmit, (value) => toFilePath(isNumber(value) ? value : value[0]), (value) => toBuilderFileEmit(value, fullEmitForOptions)),
changedFilesSet: new Set(map(program.changeFileSet, toFilePath)),
latestChangedDtsFile,
emitSignatures: (emitSignatures == null ? void 0 : emitSignatures.size) ? emitSignatures : void 0
};
}
return {
getState: () => state,
saveEmitState: noop,
restoreEmitState: noop,
getProgram: notImplemented,
getProgramOrUndefined: returnUndefined,
releaseProgram: noop,
getCompilerOptions: () => state.compilerOptions,
getSourceFile: notImplemented,
getSourceFiles: notImplemented,
getOptionsDiagnostics: notImplemented,
getGlobalDiagnostics: notImplemented,
getConfigFileParsingDiagnostics: notImplemented,
getSyntacticDiagnostics: notImplemented,
getDeclarationDiagnostics: notImplemented,
getSemanticDiagnostics: notImplemented,
emit: notImplemented,
getAllDependencies: notImplemented,
getCurrentDirectory: notImplemented,
emitNextAffectedFile: notImplemented,
getSemanticDiagnosticsOfNextAffectedFile: notImplemented,
emitBuildInfo: notImplemented,
close: noop,
hasChangedEmitSignature: returnFalse
};
function toPathInBuildInfoDirectory(path) {
return toPath(path, buildInfoDirectory, getCanonicalFileName);
}
function toAbsolutePath(path) {
return getNormalizedAbsolutePath(path, buildInfoDirectory);
}
function toFilePath(fileId) {
return filePaths[fileId - 1];
}
function toFilePathsSet(fileIdsListId) {
return filePathsSetList[fileIdsListId - 1];
}
function toManyToManyPathMap(referenceMap) {
if (!referenceMap) {
return void 0;
}
const map2 = BuilderState.createManyToManyPathMap();
referenceMap.forEach(
([fileId, fileIdListId]) => map2.set(toFilePath(fileId), toFilePathsSet(fileIdListId))
);
return map2;
}
}
function getBuildInfoFileVersionMap(program, buildInfoPath, host) {
const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory()));
const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames());
const fileInfos = /* @__PURE__ */ new Map();
let rootIndex = 0;
const roots = [];
program.fileInfos.forEach((fileInfo, index) => {
const path = toPath(program.fileNames[index], buildInfoDirectory, getCanonicalFileName);
const version2 = isString(fileInfo) ? fileInfo : fileInfo.version;
fileInfos.set(path, version2);
if (rootIndex < program.root.length) {
const current = program.root[rootIndex];
const fileId = index + 1;
if (isArray(current)) {
if (current[0] <= fileId && fileId <= current[1]) {
roots.push(path);
if (current[1] === fileId)
rootIndex++;
}
} else if (current === fileId) {
roots.push(path);
rootIndex++;
}
}
});
return { fileInfos, roots };
}
function createRedirectedBuilderProgram(getState, configFileParsingDiagnostics) {
return {
getState: notImplemented,
saveEmitState: noop,
restoreEmitState: noop,
getProgram,
getProgramOrUndefined: () => getState().program,
releaseProgram: () => getState().program = void 0,
getCompilerOptions: () => getState().compilerOptions,
getSourceFile: (fileName) => getProgram().getSourceFile(fileName),
getSourceFiles: () => getProgram().getSourceFiles(),
getOptionsDiagnostics: (cancellationToken) => getProgram().getOptionsDiagnostics(cancellationToken),
getGlobalDiagnostics: (cancellationToken) => getProgram().getGlobalDiagnostics(cancellationToken),
getConfigFileParsingDiagnostics: () => configFileParsingDiagnostics,
getSyntacticDiagnostics: (sourceFile, cancellationToken) => getProgram().getSyntacticDiagnostics(sourceFile, cancellationToken),
getDeclarationDiagnostics: (sourceFile, cancellationToken) => getProgram().getDeclarationDiagnostics(sourceFile, cancellationToken),
getSemanticDiagnostics: (sourceFile, cancellationToken) => getProgram().getSemanticDiagnostics(sourceFile, cancellationToken),
emit: (sourceFile, writeFile2, cancellationToken, emitOnlyDts, customTransformers) => getProgram().emit(sourceFile, writeFile2, cancellationToken, emitOnlyDts, customTransformers),
emitBuildInfo: (writeFile2, cancellationToken) => getProgram().emitBuildInfo(writeFile2, cancellationToken),
getAllDependencies: notImplemented,
getCurrentDirectory: () => getProgram().getCurrentDirectory(),
close: noop
};
function getProgram() {
return Debug.checkDefined(getState().program);
}
}
// src/compiler/builderPublic.ts
function createEmitAndSemanticDiagnosticsBuilderProgram(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences) {
return createBuilderProgram(1 /* EmitAndSemanticDiagnosticsBuilderProgram */, getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences));
}
// src/compiler/resolutionCache.ts
function removeIgnoredPath(path) {
if (endsWith(path, "/node_modules/.staging")) {
return removeSuffix(path, "/.staging");
}
return some(ignoredPaths, (searchPath) => stringContains(path, searchPath)) ? void 0 : path;
}
function perceivedOsRootLengthForWatching(pathComponents2, length2) {
if (length2 <= 1)
return 1;
let userCheckIndex = 1;
let isDosStyle = pathComponents2[0].search(/[a-zA-Z]:/) === 0;
if (pathComponents2[0] !== directorySeparator && !isDosStyle && // Non dos style paths
pathComponents2[1].search(/[a-zA-Z]\$$/) === 0) {
if (length2 === 2)
return 2;
userCheckIndex = 2;
isDosStyle = true;
}
if (isDosStyle && !pathComponents2[userCheckIndex].match(/^users$/i)) {
return userCheckIndex;
}
return userCheckIndex + 2;
}
function canWatchDirectoryOrFile(pathComponents2, length2) {
if (length2 === void 0)
length2 = pathComponents2.length;
if (length2 <= 2)
return false;
const perceivedOsRootLength = perceivedOsRootLengthForWatching(pathComponents2, length2);
return length2 > perceivedOsRootLength + 1;
}
function canWatchAtTypes(atTypes) {
return canWatchAffectedPackageJsonOrNodeModulesOfAtTypes(getDirectoryPath(atTypes));
}
function isInDirectoryPath(dirComponents, fileOrDirComponents) {
if (fileOrDirComponents.length < fileOrDirComponents.length)
return false;
for (let i = 0; i < dirComponents.length; i++) {
if (fileOrDirComponents[i] !== dirComponents[i])
return false;
}
return true;
}
function canWatchAffectedPackageJsonOrNodeModulesOfAtTypes(fileOrDirPath) {
return canWatchDirectoryOrFile(getPathComponents(fileOrDirPath));
}
function canWatchAffectingLocation(filePath) {
return canWatchAffectedPackageJsonOrNodeModulesOfAtTypes(filePath);
}
function getDirectoryToWatchFailedLookupLocation(failedLookupLocation, failedLookupLocationPath, rootDir, rootPath, rootPathComponents, getCurrentDirectory) {
const failedLookupPathComponents = getPathComponents(failedLookupLocationPath);
failedLookupLocation = isRootedDiskPath(failedLookupLocation) ? normalizePath(failedLookupLocation) : getNormalizedAbsolutePath(failedLookupLocation, getCurrentDirectory());
const failedLookupComponents = getPathComponents(failedLookupLocation);
const perceivedOsRootLength = perceivedOsRootLengthForWatching(failedLookupPathComponents, failedLookupPathComponents.length);
if (failedLookupPathComponents.length <= perceivedOsRootLength + 1)
return void 0;
const nodeModulesIndex = failedLookupPathComponents.indexOf("node_modules");
if (nodeModulesIndex !== -1 && nodeModulesIndex + 1 <= perceivedOsRootLength + 1)
return void 0;
if (isInDirectoryPath(rootPathComponents, failedLookupPathComponents)) {
if (failedLookupPathComponents.length > rootPathComponents.length + 1) {
return getDirectoryOfFailedLookupWatch(failedLookupComponents, failedLookupPathComponents, Math.max(rootPathComponents.length + 1, perceivedOsRootLength + 1));
} else {
return {
dir: rootDir,
dirPath: rootPath,
nonRecursive: true
};
}
}
return getDirectoryToWatchFromFailedLookupLocationDirectory(
failedLookupComponents,
failedLookupPathComponents,
failedLookupPathComponents.length - 1,
perceivedOsRootLength,
nodeModulesIndex,
rootPathComponents
);
}
function getDirectoryToWatchFromFailedLookupLocationDirectory(dirComponents, dirPathComponents, dirPathComponentsLength, perceivedOsRootLength, nodeModulesIndex, rootPathComponents) {
if (nodeModulesIndex !== -1) {
return getDirectoryOfFailedLookupWatch(dirComponents, dirPathComponents, nodeModulesIndex + 1);
}
let nonRecursive = true;
let length2 = dirPathComponentsLength;
for (let i = 0; i < dirPathComponentsLength; i++) {
if (dirPathComponents[i] !== rootPathComponents[i]) {
nonRecursive = false;
length2 = Math.max(i + 1, perceivedOsRootLength + 1);
break;
}
}
return getDirectoryOfFailedLookupWatch(dirComponents, dirPathComponents, length2, nonRecursive);
}
function getDirectoryOfFailedLookupWatch(dirComponents, dirPathComponents, length2, nonRecursive) {
return {
dir: getPathFromPathComponents(dirComponents, length2),
dirPath: getPathFromPathComponents(dirPathComponents, length2),
nonRecursive
};
}
function getDirectoryToWatchFailedLookupLocationFromTypeRoot(typeRoot, typeRootPath, rootPath, rootPathComponents, getCurrentDirectory, filterCustomPath) {
const typeRootPathComponents = getPathComponents(typeRootPath);
if (isInDirectoryPath(rootPathComponents, typeRootPathComponents)) {
return rootPath;
}
typeRoot = isRootedDiskPath(typeRoot) ? normalizePath(typeRoot) : getNormalizedAbsolutePath(typeRoot, getCurrentDirectory());
const toWatch = getDirectoryToWatchFromFailedLookupLocationDirectory(
getPathComponents(typeRoot),
typeRootPathComponents,
typeRootPathComponents.length,
perceivedOsRootLengthForWatching(typeRootPathComponents, typeRootPathComponents.length),
typeRootPathComponents.indexOf("node_modules"),
rootPathComponents
);
return toWatch && filterCustomPath(toWatch.dirPath) ? toWatch.dirPath : void 0;
}
function getRootDirectoryOfResolutionCache(rootDirForResolution, getCurrentDirectory) {
const normalized = getNormalizedAbsolutePath(rootDirForResolution, getCurrentDirectory());
return !isDiskPathRoot(normalized) ? removeTrailingDirectorySeparator(normalized) : normalized;
}
function createResolutionCache(resolutionHost, rootDirForResolution, logChangesWhenResolvingModule) {
let filesWithChangedSetOfUnresolvedImports;
let filesWithInvalidatedResolutions;
let filesWithInvalidatedNonRelativeUnresolvedImports;
const nonRelativeExternalModuleResolutions = createMultiMap();
const resolutionsWithFailedLookups = /* @__PURE__ */ new Set();
const resolutionsWithOnlyAffectingLocations = /* @__PURE__ */ new Set();
const resolvedFileToResolution = /* @__PURE__ */ new Map();
const impliedFormatPackageJsons = /* @__PURE__ */ new Map();
let hasChangedAutomaticTypeDirectiveNames = false;
let affectingPathChecksForFile;
let affectingPathChecks;
let failedLookupChecks;
let startsWithPathChecks;
let isInDirectoryChecks;
let allModuleAndTypeResolutionsAreInvalidated = false;
const getCurrentDirectory = memoize(() => resolutionHost.getCurrentDirectory());
const cachedDirectoryStructureHost = resolutionHost.getCachedDirectoryStructureHost();
const resolvedModuleNames = /* @__PURE__ */ new Map();
const moduleResolutionCache = createModuleResolutionCache(
getCurrentDirectory(),
resolutionHost.getCanonicalFileName,
resolutionHost.getCompilationSettings()
);
const resolvedTypeReferenceDirectives = /* @__PURE__ */ new Map();
const typeReferenceDirectiveResolutionCache = createTypeReferenceDirectiveResolutionCache(
getCurrentDirectory(),
resolutionHost.getCanonicalFileName,
resolutionHost.getCompilationSettings(),
moduleResolutionCache.getPackageJsonInfoCache()
);
const resolvedLibraries = /* @__PURE__ */ new Map();
const libraryResolutionCache = createModuleResolutionCache(
getCurrentDirectory(),
resolutionHost.getCanonicalFileName,
getOptionsForLibraryResolution(resolutionHost.getCompilationSettings()),
moduleResolutionCache.getPackageJsonInfoCache()
);
const directoryWatchesOfFailedLookups = /* @__PURE__ */ new Map();
const fileWatchesOfAffectingLocations = /* @__PURE__ */ new Map();
const rootDir = getRootDirectoryOfResolutionCache(rootDirForResolution, getCurrentDirectory);
const rootPath = resolutionHost.toPath(rootDir);
const rootPathComponents = getPathComponents(rootPath);
const typeRootsWatches = /* @__PURE__ */ new Map();
return {
getModuleResolutionCache: () => moduleResolutionCache,
startRecordingFilesWithChangedResolutions,
finishRecordingFilesWithChangedResolutions,
// perDirectoryResolvedModuleNames and perDirectoryResolvedTypeReferenceDirectives could be non empty if there was exception during program update
// (between startCachingPerDirectoryResolution and finishCachingPerDirectoryResolution)
startCachingPerDirectoryResolution,
finishCachingPerDirectoryResolution,
resolveModuleNameLiterals,
resolveTypeReferenceDirectiveReferences,
resolveLibrary: resolveLibrary2,
resolveSingleModuleNameWithoutWatching,
removeResolutionsFromProjectReferenceRedirects,
removeResolutionsOfFile,
hasChangedAutomaticTypeDirectiveNames: () => hasChangedAutomaticTypeDirectiveNames,
invalidateResolutionOfFile,
invalidateResolutionsOfFailedLookupLocations,
setFilesWithInvalidatedNonRelativeUnresolvedImports,
createHasInvalidatedResolutions,
isFileWithInvalidatedNonRelativeUnresolvedImports,
updateTypeRootsWatch,
closeTypeRootsWatch,
clear: clear2,
onChangesAffectModuleResolution
};
function getResolvedModule2(resolution) {
return resolution.resolvedModule;
}
function getResolvedTypeReferenceDirective(resolution) {
return resolution.resolvedTypeReferenceDirective;
}
function clear2() {
clearMap(directoryWatchesOfFailedLookups, closeFileWatcherOf);
clearMap(fileWatchesOfAffectingLocations, closeFileWatcherOf);
nonRelativeExternalModuleResolutions.clear();
closeTypeRootsWatch();
resolvedModuleNames.clear();
resolvedTypeReferenceDirectives.clear();
resolvedFileToResolution.clear();
resolutionsWithFailedLookups.clear();
resolutionsWithOnlyAffectingLocations.clear();
failedLookupChecks = void 0;
startsWithPathChecks = void 0;
isInDirectoryChecks = void 0;
affectingPathChecks = void 0;
affectingPathChecksForFile = void 0;
allModuleAndTypeResolutionsAreInvalidated = false;
moduleResolutionCache.clear();
typeReferenceDirectiveResolutionCache.clear();
moduleResolutionCache.update(resolutionHost.getCompilationSettings());
typeReferenceDirectiveResolutionCache.update(resolutionHost.getCompilationSettings());
libraryResolutionCache.clear();
impliedFormatPackageJsons.clear();
resolvedLibraries.clear();
hasChangedAutomaticTypeDirectiveNames = false;
}
function onChangesAffectModuleResolution() {
allModuleAndTypeResolutionsAreInvalidated = true;
moduleResolutionCache.clearAllExceptPackageJsonInfoCache();
typeReferenceDirectiveResolutionCache.clearAllExceptPackageJsonInfoCache();
moduleResolutionCache.update(resolutionHost.getCompilationSettings());
typeReferenceDirectiveResolutionCache.update(resolutionHost.getCompilationSettings());
}
function startRecordingFilesWithChangedResolutions() {
filesWithChangedSetOfUnresolvedImports = [];
}
function finishRecordingFilesWithChangedResolutions() {
const collected = filesWithChangedSetOfUnresolvedImports;
filesWithChangedSetOfUnresolvedImports = void 0;
return collected;
}
function isFileWithInvalidatedNonRelativeUnresolvedImports(path) {
if (!filesWithInvalidatedNonRelativeUnresolvedImports) {
return false;
}
const value = filesWithInvalidatedNonRelativeUnresolvedImports.get(path);
return !!value && !!value.length;
}
function createHasInvalidatedResolutions(customHasInvalidatedResolutions, customHasInvalidatedLibResolutions) {
invalidateResolutionsOfFailedLookupLocations();
const collected = filesWithInvalidatedResolutions;
filesWithInvalidatedResolutions = void 0;
return {
hasInvalidatedResolutions: (path) => customHasInvalidatedResolutions(path) || allModuleAndTypeResolutionsAreInvalidated || !!(collected == null ? void 0 : collected.has(path)) || isFileWithInvalidatedNonRelativeUnresolvedImports(path),
hasInvalidatedLibResolutions: (libFileName) => {
var _a;
return customHasInvalidatedLibResolutions(libFileName) || !!((_a = resolvedLibraries == null ? void 0 : resolvedLibraries.get(libFileName)) == null ? void 0 : _a.isInvalidated);
}
};
}
function startCachingPerDirectoryResolution() {
moduleResolutionCache.clearAllExceptPackageJsonInfoCache();
typeReferenceDirectiveResolutionCache.clearAllExceptPackageJsonInfoCache();
libraryResolutionCache.clearAllExceptPackageJsonInfoCache();
nonRelativeExternalModuleResolutions.forEach(watchFailedLookupLocationOfNonRelativeModuleResolutions);
nonRelativeExternalModuleResolutions.clear();
}
function cleanupLibResolutionWatching(newProgram) {
resolvedLibraries.forEach((resolution, libFileName) => {
var _a;
if (!((_a = newProgram == null ? void 0 : newProgram.resolvedLibReferences) == null ? void 0 : _a.has(libFileName))) {
stopWatchFailedLookupLocationOfResolution(
resolution,
resolutionHost.toPath(getInferredLibraryNameResolveFrom(newProgram.getCompilerOptions(), getCurrentDirectory(), libFileName)),
getResolvedModule2
);
resolvedLibraries.delete(libFileName);
}
});
}
function finishCachingPerDirectoryResolution(newProgram, oldProgram) {
filesWithInvalidatedNonRelativeUnresolvedImports = void 0;
allModuleAndTypeResolutionsAreInvalidated = false;
nonRelativeExternalModuleResolutions.forEach(watchFailedLookupLocationOfNonRelativeModuleResolutions);
nonRelativeExternalModuleResolutions.clear();
if (newProgram !== oldProgram) {
cleanupLibResolutionWatching(newProgram);
newProgram == null ? void 0 : newProgram.getSourceFiles().forEach((newFile) => {
var _a;
const expected = isExternalOrCommonJsModule(newFile) ? ((_a = newFile.packageJsonLocations) == null ? void 0 : _a.length) ?? 0 : 0;
const existing = impliedFormatPackageJsons.get(newFile.path) ?? emptyArray;
for (let i = existing.length; i < expected; i++) {
createFileWatcherOfAffectingLocation(
newFile.packageJsonLocations[i],
/*forResolution*/
false
);
}
if (existing.length > expected) {
for (let i = expected; i < existing.length; i++) {
fileWatchesOfAffectingLocations.get(existing[i]).files--;
}
}
if (expected)
impliedFormatPackageJsons.set(newFile.path, newFile.packageJsonLocations);
else
impliedFormatPackageJsons.delete(newFile.path);
});
impliedFormatPackageJsons.forEach((existing, path) => {
if (!(newProgram == null ? void 0 : newProgram.getSourceFileByPath(path))) {
existing.forEach((location) => fileWatchesOfAffectingLocations.get(location).files--);
impliedFormatPackageJsons.delete(path);
}
});
}
directoryWatchesOfFailedLookups.forEach((watcher, path) => {
if (watcher.refCount === 0) {
directoryWatchesOfFailedLookups.delete(path);
watcher.watcher.close();
}
});
fileWatchesOfAffectingLocations.forEach((watcher, path) => {
if (watcher.files === 0 && watcher.resolutions === 0) {
fileWatchesOfAffectingLocations.delete(path);
watcher.watcher.close();
}
});
hasChangedAutomaticTypeDirectiveNames = false;
}
function resolveModuleName2(moduleName, containingFile, compilerOptions, redirectedReference, mode) {
var _a;
const host = ((_a = resolutionHost.getCompilerHost) == null ? void 0 : _a.call(resolutionHost)) || resolutionHost;
const primaryResult = resolveModuleName(moduleName, containingFile, compilerOptions, host, moduleResolutionCache, redirectedReference, mode);
if (!resolutionHost.getGlobalCache) {
return primaryResult;
}
const globalCache = resolutionHost.getGlobalCache();
if (globalCache !== void 0 && !isExternalModuleNameRelative(moduleName) && !(primaryResult.resolvedModule && extensionIsTS(primaryResult.resolvedModule.extension))) {
const { resolvedModule, failedLookupLocations, affectingLocations, resolutionDiagnostics } = loadModuleFromGlobalCache(
Debug.checkDefined(resolutionHost.globalCacheResolutionModuleName)(moduleName),
resolutionHost.projectName,
compilerOptions,
host,
globalCache,
moduleResolutionCache
);
if (resolvedModule) {
primaryResult.resolvedModule = resolvedModule;
primaryResult.failedLookupLocations = updateResolutionField(primaryResult.failedLookupLocations, failedLookupLocations);
primaryResult.affectingLocations = updateResolutionField(primaryResult.affectingLocations, affectingLocations);
primaryResult.resolutionDiagnostics = updateResolutionField(primaryResult.resolutionDiagnostics, resolutionDiagnostics);
return primaryResult;
}
}
return primaryResult;
}
function createModuleResolutionLoader2(containingFile, redirectedReference, options) {
return {
nameAndMode: moduleResolutionNameAndModeGetter,
resolve: (moduleName, resoluionMode) => resolveModuleName2(
moduleName,
containingFile,
options,
redirectedReference,
resoluionMode
)
};
}
function resolveNamesWithLocalCache({
entries,
containingFile,
containingSourceFile,
redirectedReference,
options,
perFileCache,
reusedNames,
loader,
getResolutionWithResolvedFileName,
deferWatchingNonRelativeResolution,
shouldRetryResolution,
logChanges
}) {
var _a;
const path = resolutionHost.toPath(containingFile);
const resolutionsInFile = perFileCache.get(path) || perFileCache.set(path, createModeAwareCache()).get(path);
const resolvedModules = [];
const hasInvalidatedNonRelativeUnresolvedImport = logChanges && isFileWithInvalidatedNonRelativeUnresolvedImports(path);
const program = resolutionHost.getCurrentProgram();
const oldRedirect = program && program.getResolvedProjectReferenceToRedirect(containingFile);
const unmatchedRedirects = oldRedirect ? !redirectedReference || redirectedReference.sourceFile.path !== oldRedirect.sourceFile.path : !!redirectedReference;
const seenNamesInFile = createModeAwareCache();
for (const entry of entries) {
const name = loader.nameAndMode.getName(entry);
const mode = loader.nameAndMode.getMode(entry, containingSourceFile);
let resolution = resolutionsInFile.get(name, mode);
if (!seenNamesInFile.has(name, mode) && (allModuleAndTypeResolutionsAreInvalidated || unmatchedRedirects || !resolution || resolution.isInvalidated || // If the name is unresolved import that was invalidated, recalculate
hasInvalidatedNonRelativeUnresolvedImport && !isExternalModuleNameRelative(name) && shouldRetryResolution(resolution))) {
const existingResolution = resolution;
resolution = loader.resolve(name, mode);
if (resolutionHost.onDiscoveredSymlink && resolutionIsSymlink(resolution)) {
resolutionHost.onDiscoveredSymlink();
}
resolutionsInFile.set(name, mode, resolution);
watchFailedLookupLocationsOfExternalModuleResolutions(name, resolution, path, getResolutionWithResolvedFileName, deferWatchingNonRelativeResolution);
if (existingResolution) {
stopWatchFailedLookupLocationOfResolution(existingResolution, path, getResolutionWithResolvedFileName);
}
if (logChanges && filesWithChangedSetOfUnresolvedImports && !resolutionIsEqualTo(existingResolution, resolution)) {
filesWithChangedSetOfUnresolvedImports.push(path);
logChanges = false;
}
} else {
const host = ((_a = resolutionHost.getCompilerHost) == null ? void 0 : _a.call(resolutionHost)) || resolutionHost;
if (isTraceEnabled(options, host) && !seenNamesInFile.has(name, mode)) {
const resolved = getResolutionWithResolvedFileName(resolution);
trace(
host,
perFileCache === resolvedModuleNames ? (resolved == null ? void 0 : resolved.resolvedFileName) ? resolved.packageId ? Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_not_resolved : (resolved == null ? void 0 : resolved.resolvedFileName) ? resolved.packageId ? Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2 : Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_not_resolved,
name,
containingFile,
resolved == null ? void 0 : resolved.resolvedFileName,
(resolved == null ? void 0 : resolved.packageId) && packageIdToString(resolved.packageId)
);
}
}
Debug.assert(resolution !== void 0 && !resolution.isInvalidated);
seenNamesInFile.set(name, mode, true);
resolvedModules.push(resolution);
}
reusedNames == null ? void 0 : reusedNames.forEach((entry) => seenNamesInFile.set(
loader.nameAndMode.getName(entry),
loader.nameAndMode.getMode(entry, containingSourceFile),
true
));
if (resolutionsInFile.size() !== seenNamesInFile.size()) {
resolutionsInFile.forEach((resolution, name, mode) => {
if (!seenNamesInFile.has(name, mode)) {
stopWatchFailedLookupLocationOfResolution(resolution, path, getResolutionWithResolvedFileName);
resolutionsInFile.delete(name, mode);
}
});
}
return resolvedModules;
function resolutionIsEqualTo(oldResolution, newResolution) {
if (oldResolution === newResolution) {
return true;
}
if (!oldResolution || !newResolution) {
return false;
}
const oldResult = getResolutionWithResolvedFileName(oldResolution);
const newResult = getResolutionWithResolvedFileName(newResolution);
if (oldResult === newResult) {
return true;
}
if (!oldResult || !newResult) {
return false;
}
return oldResult.resolvedFileName === newResult.resolvedFileName;
}
}
function resolveTypeReferenceDirectiveReferences(typeDirectiveReferences, containingFile, redirectedReference, options, containingSourceFile, reusedNames) {
var _a;
return resolveNamesWithLocalCache({
entries: typeDirectiveReferences,
containingFile,
containingSourceFile,
redirectedReference,
options,
reusedNames,
perFileCache: resolvedTypeReferenceDirectives,
loader: createTypeReferenceResolutionLoader(
containingFile,
redirectedReference,
options,
((_a = resolutionHost.getCompilerHost) == null ? void 0 : _a.call(resolutionHost)) || resolutionHost,
typeReferenceDirectiveResolutionCache
),
getResolutionWithResolvedFileName: getResolvedTypeReferenceDirective,
shouldRetryResolution: (resolution) => resolution.resolvedTypeReferenceDirective === void 0,
deferWatchingNonRelativeResolution: false
});
}
function resolveModuleNameLiterals(moduleLiterals, containingFile, redirectedReference, options, containingSourceFile, reusedNames) {
return resolveNamesWithLocalCache({
entries: moduleLiterals,
containingFile,
containingSourceFile,
redirectedReference,
options,
reusedNames,
perFileCache: resolvedModuleNames,
loader: createModuleResolutionLoader2(
containingFile,
redirectedReference,
options
),
getResolutionWithResolvedFileName: getResolvedModule2,
shouldRetryResolution: (resolution) => !resolution.resolvedModule || !resolutionExtensionIsTSOrJson(resolution.resolvedModule.extension),
logChanges: logChangesWhenResolvingModule,
deferWatchingNonRelativeResolution: true
// Defer non relative resolution watch because we could be using ambient modules
});
}
function resolveLibrary2(libraryName, resolveFrom, options, libFileName) {
var _a;
const host = ((_a = resolutionHost.getCompilerHost) == null ? void 0 : _a.call(resolutionHost)) || resolutionHost;
let resolution = resolvedLibraries == null ? void 0 : resolvedLibraries.get(libFileName);
if (!resolution || resolution.isInvalidated) {
const existingResolution = resolution;
resolution = resolveLibrary(libraryName, resolveFrom, options, host, libraryResolutionCache);
const path = resolutionHost.toPath(resolveFrom);
watchFailedLookupLocationsOfExternalModuleResolutions(
libraryName,
resolution,
path,
getResolvedModule2,
/*deferWatchingNonRelativeResolution*/
false
);
resolvedLibraries.set(libFileName, resolution);
if (existingResolution) {
stopWatchFailedLookupLocationOfResolution(existingResolution, path, getResolvedModule2);
}
} else {
if (isTraceEnabled(options, host)) {
const resolved = getResolvedModule2(resolution);
trace(
host,
(resolved == null ? void 0 : resolved.resolvedFileName) ? resolved.packageId ? Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2 : Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_not_resolved,
libraryName,
resolveFrom,
resolved == null ? void 0 : resolved.resolvedFileName,
(resolved == null ? void 0 : resolved.packageId) && packageIdToString(resolved.packageId)
);
}
}
return resolution;
}
function resolveSingleModuleNameWithoutWatching(moduleName, containingFile) {
const path = resolutionHost.toPath(containingFile);
const resolutionsInFile = resolvedModuleNames.get(path);
const resolution = resolutionsInFile == null ? void 0 : resolutionsInFile.get(
moduleName,
/*mode*/
void 0
);
if (resolution && !resolution.isInvalidated)
return resolution;
return resolveModuleName2(moduleName, containingFile, resolutionHost.getCompilationSettings());
}
function isNodeModulesAtTypesDirectory(dirPath) {
return endsWith(dirPath, "/node_modules/@types");
}
function watchFailedLookupLocationsOfExternalModuleResolutions(name, resolution, filePath, getResolutionWithResolvedFileName, deferWatchingNonRelativeResolution) {
var _a;
if (resolution.refCount) {
resolution.refCount++;
Debug.assertIsDefined(resolution.files);
} else {
resolution.refCount = 1;
Debug.assert(!((_a = resolution.files) == null ? void 0 : _a.size));
if (!deferWatchingNonRelativeResolution || isExternalModuleNameRelative(name)) {
watchFailedLookupLocationOfResolution(resolution);
} else {
nonRelativeExternalModuleResolutions.add(name, resolution);
}
const resolved = getResolutionWithResolvedFileName(resolution);
if (resolved && resolved.resolvedFileName) {
const key = resolutionHost.toPath(resolved.resolvedFileName);
let resolutions = resolvedFileToResolution.get(key);
if (!resolutions)
resolvedFileToResolution.set(key, resolutions = /* @__PURE__ */ new Set());
resolutions.add(resolution);
}
}
(resolution.files ?? (resolution.files = /* @__PURE__ */ new Set())).add(filePath);
}
function watchFailedLookupLocation(failedLookupLocation, setAtRoot) {
const failedLookupLocationPath = resolutionHost.toPath(failedLookupLocation);
const toWatch = getDirectoryToWatchFailedLookupLocation(
failedLookupLocation,
failedLookupLocationPath,
rootDir,
rootPath,
rootPathComponents,
getCurrentDirectory
);
if (toWatch) {
const { dir, dirPath, nonRecursive } = toWatch;
if (dirPath === rootPath) {
Debug.assert(nonRecursive);
setAtRoot = true;
} else {
setDirectoryWatcher(dir, dirPath, nonRecursive);
}
}
return setAtRoot;
}
function watchFailedLookupLocationOfResolution(resolution) {
Debug.assert(!!resolution.refCount);
const { failedLookupLocations, affectingLocations, node10Result } = resolution;
if (!(failedLookupLocations == null ? void 0 : failedLookupLocations.length) && !(affectingLocations == null ? void 0 : affectingLocations.length) && !node10Result)
return;
if ((failedLookupLocations == null ? void 0 : failedLookupLocations.length) || node10Result)
resolutionsWithFailedLookups.add(resolution);
let setAtRoot = false;
if (failedLookupLocations) {
for (const failedLookupLocation of failedLookupLocations) {
setAtRoot = watchFailedLookupLocation(failedLookupLocation, setAtRoot);
}
}
if (node10Result)
setAtRoot = watchFailedLookupLocation(node10Result, setAtRoot);
if (setAtRoot) {
setDirectoryWatcher(
rootDir,
rootPath,
/*nonRecursive*/
true
);
}
watchAffectingLocationsOfResolution(resolution, !(failedLookupLocations == null ? void 0 : failedLookupLocations.length) && !node10Result);
}
function watchAffectingLocationsOfResolution(resolution, addToResolutionsWithOnlyAffectingLocations) {
Debug.assert(!!resolution.refCount);
const { affectingLocations } = resolution;
if (!(affectingLocations == null ? void 0 : affectingLocations.length))
return;
if (addToResolutionsWithOnlyAffectingLocations)
resolutionsWithOnlyAffectingLocations.add(resolution);
for (const affectingLocation of affectingLocations) {
createFileWatcherOfAffectingLocation(
affectingLocation,
/*forResolution*/
true
);
}
}
function createFileWatcherOfAffectingLocation(affectingLocation, forResolution) {
const fileWatcher = fileWatchesOfAffectingLocations.get(affectingLocation);
if (fileWatcher) {
if (forResolution)
fileWatcher.resolutions++;
else
fileWatcher.files++;
return;
}
let locationToWatch = affectingLocation;
if (resolutionHost.realpath) {
locationToWatch = resolutionHost.realpath(affectingLocation);
if (affectingLocation !== locationToWatch) {
const fileWatcher2 = fileWatchesOfAffectingLocations.get(locationToWatch);
if (fileWatcher2) {
if (forResolution)
fileWatcher2.resolutions++;
else
fileWatcher2.files++;
fileWatcher2.paths.add(affectingLocation);
fileWatchesOfAffectingLocations.set(affectingLocation, fileWatcher2);
return;
}
}
}
const paths = /* @__PURE__ */ new Set();
paths.add(locationToWatch);
let actualWatcher = canWatchAffectingLocation(resolutionHost.toPath(locationToWatch)) ? resolutionHost.watchAffectingFileLocation(locationToWatch, (fileName, eventKind) => {
cachedDirectoryStructureHost == null ? void 0 : cachedDirectoryStructureHost.addOrDeleteFile(fileName, resolutionHost.toPath(locationToWatch), eventKind);
const packageJsonMap = moduleResolutionCache.getPackageJsonInfoCache().getInternalMap();
paths.forEach((path) => {
if (watcher.resolutions)
(affectingPathChecks ?? (affectingPathChecks = /* @__PURE__ */ new Set())).add(path);
if (watcher.files)
(affectingPathChecksForFile ?? (affectingPathChecksForFile = /* @__PURE__ */ new Set())).add(path);
packageJsonMap == null ? void 0 : packageJsonMap.delete(resolutionHost.toPath(path));
});
resolutionHost.scheduleInvalidateResolutionsOfFailedLookupLocations();
}) : noopFileWatcher;
const watcher = {
watcher: actualWatcher !== noopFileWatcher ? {
close: () => {
actualWatcher.close();
actualWatcher = noopFileWatcher;
}
} : actualWatcher,
resolutions: forResolution ? 1 : 0,
files: forResolution ? 0 : 1,
paths
};
fileWatchesOfAffectingLocations.set(locationToWatch, watcher);
if (affectingLocation !== locationToWatch) {
fileWatchesOfAffectingLocations.set(affectingLocation, watcher);
paths.add(affectingLocation);
}
}
function watchFailedLookupLocationOfNonRelativeModuleResolutions(resolutions, name) {
const program = resolutionHost.getCurrentProgram();
if (!program || !program.getTypeChecker().tryFindAmbientModuleWithoutAugmentations(name)) {
resolutions.forEach(watchFailedLookupLocationOfResolution);
} else {
resolutions.forEach((resolution) => watchAffectingLocationsOfResolution(
resolution,
/*addToResolutionsWithOnlyAffectingLocations*/
true
));
}
}
function setDirectoryWatcher(dir, dirPath, nonRecursive) {
const dirWatcher = directoryWatchesOfFailedLookups.get(dirPath);
if (dirWatcher) {
Debug.assert(!!nonRecursive === !!dirWatcher.nonRecursive);
dirWatcher.refCount++;
} else {
directoryWatchesOfFailedLookups.set(dirPath, { watcher: createDirectoryWatcher(dir, dirPath, nonRecursive), refCount: 1, nonRecursive });
}
}
function stopWatchFailedLookupLocation(failedLookupLocation, removeAtRoot) {
const failedLookupLocationPath = resolutionHost.toPath(failedLookupLocation);
const toWatch = getDirectoryToWatchFailedLookupLocation(
failedLookupLocation,
failedLookupLocationPath,
rootDir,
rootPath,
rootPathComponents,
getCurrentDirectory
);
if (toWatch) {
const { dirPath } = toWatch;
if (dirPath === rootPath) {
removeAtRoot = true;
} else {
removeDirectoryWatcher(dirPath);
}
}
return removeAtRoot;
}
function stopWatchFailedLookupLocationOfResolution(resolution, filePath, getResolutionWithResolvedFileName) {
Debug.checkDefined(resolution.files).delete(filePath);
resolution.refCount--;
if (resolution.refCount) {
return;
}
const resolved = getResolutionWithResolvedFileName(resolution);
if (resolved && resolved.resolvedFileName) {
const key = resolutionHost.toPath(resolved.resolvedFileName);
const resolutions = resolvedFileToResolution.get(key);
if ((resolutions == null ? void 0 : resolutions.delete(resolution)) && !resolutions.size)
resolvedFileToResolution.delete(key);
}
const { failedLookupLocations, affectingLocations, node10Result } = resolution;
if (resolutionsWithFailedLookups.delete(resolution)) {
let removeAtRoot = false;
if (failedLookupLocations) {
for (const failedLookupLocation of failedLookupLocations) {
removeAtRoot = stopWatchFailedLookupLocation(failedLookupLocation, removeAtRoot);
}
}
if (node10Result)
removeAtRoot = stopWatchFailedLookupLocation(node10Result, removeAtRoot);
if (removeAtRoot)
removeDirectoryWatcher(rootPath);
} else if (affectingLocations == null ? void 0 : affectingLocations.length) {
resolutionsWithOnlyAffectingLocations.delete(resolution);
}
if (affectingLocations) {
for (const affectingLocation of affectingLocations) {
const watcher = fileWatchesOfAffectingLocations.get(affectingLocation);
watcher.resolutions--;
}
}
}
function removeDirectoryWatcher(dirPath) {
const dirWatcher = directoryWatchesOfFailedLookups.get(dirPath);
dirWatcher.refCount--;
}
function createDirectoryWatcher(directory, dirPath, nonRecursive) {
return resolutionHost.watchDirectoryOfFailedLookupLocation(directory, (fileOrDirectory) => {
const fileOrDirectoryPath = resolutionHost.toPath(fileOrDirectory);
if (cachedDirectoryStructureHost) {
cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath);
}
scheduleInvalidateResolutionOfFailedLookupLocation(fileOrDirectoryPath, dirPath === fileOrDirectoryPath);
}, nonRecursive ? 0 /* None */ : 1 /* Recursive */);
}
function removeResolutionsOfFileFromCache(cache, filePath, getResolutionWithResolvedFileName) {
const resolutions = cache.get(filePath);
if (resolutions) {
resolutions.forEach((resolution) => stopWatchFailedLookupLocationOfResolution(resolution, filePath, getResolutionWithResolvedFileName));
cache.delete(filePath);
}
}
function removeResolutionsFromProjectReferenceRedirects(filePath) {
if (!fileExtensionIs(filePath, ".json" /* Json */))
return;
const program = resolutionHost.getCurrentProgram();
if (!program)
return;
const resolvedProjectReference = program.getResolvedProjectReferenceByPath(filePath);
if (!resolvedProjectReference)
return;
resolvedProjectReference.commandLine.fileNames.forEach((f) => removeResolutionsOfFile(resolutionHost.toPath(f)));
}
function removeResolutionsOfFile(filePath) {
removeResolutionsOfFileFromCache(resolvedModuleNames, filePath, getResolvedModule2);
removeResolutionsOfFileFromCache(resolvedTypeReferenceDirectives, filePath, getResolvedTypeReferenceDirective);
}
function invalidateResolutions(resolutions, canInvalidate) {
if (!resolutions)
return false;
let invalidated = false;
resolutions.forEach((resolution) => {
if (resolution.isInvalidated || !canInvalidate(resolution))
return;
resolution.isInvalidated = invalidated = true;
for (const containingFilePath of Debug.checkDefined(resolution.files)) {
(filesWithInvalidatedResolutions ?? (filesWithInvalidatedResolutions = /* @__PURE__ */ new Set())).add(containingFilePath);
hasChangedAutomaticTypeDirectiveNames = hasChangedAutomaticTypeDirectiveNames || endsWith(containingFilePath, inferredTypesContainingFile);
}
});
return invalidated;
}
function invalidateResolutionOfFile(filePath) {
removeResolutionsOfFile(filePath);
const prevHasChangedAutomaticTypeDirectiveNames = hasChangedAutomaticTypeDirectiveNames;
if (invalidateResolutions(resolvedFileToResolution.get(filePath), returnTrue) && hasChangedAutomaticTypeDirectiveNames && !prevHasChangedAutomaticTypeDirectiveNames) {
resolutionHost.onChangedAutomaticTypeDirectiveNames();
}
}
function setFilesWithInvalidatedNonRelativeUnresolvedImports(filesMap) {
Debug.assert(filesWithInvalidatedNonRelativeUnresolvedImports === filesMap || filesWithInvalidatedNonRelativeUnresolvedImports === void 0);
filesWithInvalidatedNonRelativeUnresolvedImports = filesMap;
}
function scheduleInvalidateResolutionOfFailedLookupLocation(fileOrDirectoryPath, isCreatingWatchedDirectory) {
if (isCreatingWatchedDirectory) {
(isInDirectoryChecks || (isInDirectoryChecks = /* @__PURE__ */ new Set())).add(fileOrDirectoryPath);
} else {
const updatedPath = removeIgnoredPath(fileOrDirectoryPath);
if (!updatedPath)
return false;
fileOrDirectoryPath = updatedPath;
if (resolutionHost.fileIsOpen(fileOrDirectoryPath)) {
return false;
}
const dirOfFileOrDirectory = getDirectoryPath(fileOrDirectoryPath);
if (isNodeModulesAtTypesDirectory(fileOrDirectoryPath) || isNodeModulesDirectory(fileOrDirectoryPath) || isNodeModulesAtTypesDirectory(dirOfFileOrDirectory) || isNodeModulesDirectory(dirOfFileOrDirectory)) {
(failedLookupChecks || (failedLookupChecks = /* @__PURE__ */ new Set())).add(fileOrDirectoryPath);
(startsWithPathChecks || (startsWithPathChecks = /* @__PURE__ */ new Set())).add(fileOrDirectoryPath);
} else {
if (isEmittedFileOfProgram(resolutionHost.getCurrentProgram(), fileOrDirectoryPath)) {
return false;
}
if (fileExtensionIs(fileOrDirectoryPath, ".map")) {
return false;
}
(failedLookupChecks || (failedLookupChecks = /* @__PURE__ */ new Set())).add(fileOrDirectoryPath);
const packagePath = parseNodeModuleFromPath(
fileOrDirectoryPath,
/*isFolder*/
true
);
if (packagePath)
(startsWithPathChecks || (startsWithPathChecks = /* @__PURE__ */ new Set())).add(packagePath);
}
}
resolutionHost.scheduleInvalidateResolutionsOfFailedLookupLocations();
}
function invalidatePackageJsonMap() {
const packageJsonMap = moduleResolutionCache.getPackageJsonInfoCache().getInternalMap();
if (packageJsonMap && (failedLookupChecks || startsWithPathChecks || isInDirectoryChecks)) {
packageJsonMap.forEach((_value, path) => isInvalidatedFailedLookup(path) ? packageJsonMap.delete(path) : void 0);
}
}
function invalidateResolutionsOfFailedLookupLocations() {
var _a;
if (allModuleAndTypeResolutionsAreInvalidated) {
affectingPathChecksForFile = void 0;
invalidatePackageJsonMap();
if (failedLookupChecks || startsWithPathChecks || isInDirectoryChecks || affectingPathChecks) {
invalidateResolutions(resolvedLibraries, canInvalidateFailedLookupResolution);
}
failedLookupChecks = void 0;
startsWithPathChecks = void 0;
isInDirectoryChecks = void 0;
affectingPathChecks = void 0;
return true;
}
let invalidated = false;
if (affectingPathChecksForFile) {
(_a = resolutionHost.getCurrentProgram()) == null ? void 0 : _a.getSourceFiles().forEach((f) => {
if (some(f.packageJsonLocations, (location) => affectingPathChecksForFile.has(location))) {
(filesWithInvalidatedResolutions ?? (filesWithInvalidatedResolutions = /* @__PURE__ */ new Set())).add(f.path);
invalidated = true;
}
});
affectingPathChecksForFile = void 0;
}
if (!failedLookupChecks && !startsWithPathChecks && !isInDirectoryChecks && !affectingPathChecks) {
return invalidated;
}
invalidated = invalidateResolutions(resolutionsWithFailedLookups, canInvalidateFailedLookupResolution) || invalidated;
invalidatePackageJsonMap();
failedLookupChecks = void 0;
startsWithPathChecks = void 0;
isInDirectoryChecks = void 0;
invalidated = invalidateResolutions(resolutionsWithOnlyAffectingLocations, canInvalidatedFailedLookupResolutionWithAffectingLocation) || invalidated;
affectingPathChecks = void 0;
return invalidated;
}
function canInvalidateFailedLookupResolution(resolution) {
var _a;
if (canInvalidatedFailedLookupResolutionWithAffectingLocation(resolution))
return true;
if (!failedLookupChecks && !startsWithPathChecks && !isInDirectoryChecks)
return false;
return ((_a = resolution.failedLookupLocations) == null ? void 0 : _a.some((location) => isInvalidatedFailedLookup(resolutionHost.toPath(location)))) || !!resolution.node10Result && isInvalidatedFailedLookup(resolutionHost.toPath(resolution.node10Result));
}
function isInvalidatedFailedLookup(locationPath) {
return (failedLookupChecks == null ? void 0 : failedLookupChecks.has(locationPath)) || firstDefinedIterator((startsWithPathChecks == null ? void 0 : startsWithPathChecks.keys()) || [], (fileOrDirectoryPath) => startsWith(locationPath, fileOrDirectoryPath) ? true : void 0) || firstDefinedIterator((isInDirectoryChecks == null ? void 0 : isInDirectoryChecks.keys()) || [], (dirPath) => locationPath.length > dirPath.length && startsWith(locationPath, dirPath) && (isDiskPathRoot(dirPath) || locationPath[dirPath.length] === directorySeparator) ? true : void 0);
}
function canInvalidatedFailedLookupResolutionWithAffectingLocation(resolution) {
var _a;
return !!affectingPathChecks && ((_a = resolution.affectingLocations) == null ? void 0 : _a.some((location) => affectingPathChecks.has(location)));
}
function closeTypeRootsWatch() {
clearMap(typeRootsWatches, closeFileWatcher);
}
function createTypeRootsWatch(typeRootPath, typeRoot) {
return canWatchTypeRootPath(typeRootPath) ? resolutionHost.watchTypeRootsDirectory(typeRoot, (fileOrDirectory) => {
const fileOrDirectoryPath = resolutionHost.toPath(fileOrDirectory);
if (cachedDirectoryStructureHost) {
cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath);
}
hasChangedAutomaticTypeDirectiveNames = true;
resolutionHost.onChangedAutomaticTypeDirectiveNames();
const dirPath = getDirectoryToWatchFailedLookupLocationFromTypeRoot(
typeRoot,
typeRootPath,
rootPath,
rootPathComponents,
getCurrentDirectory,
(dirPath2) => directoryWatchesOfFailedLookups.has(dirPath2)
);
if (dirPath) {
scheduleInvalidateResolutionOfFailedLookupLocation(fileOrDirectoryPath, dirPath === fileOrDirectoryPath);
}
}, 1 /* Recursive */) : noopFileWatcher;
}
function updateTypeRootsWatch() {
const options = resolutionHost.getCompilationSettings();
if (options.types) {
closeTypeRootsWatch();
return;
}
const typeRoots = getEffectiveTypeRoots(options, { getCurrentDirectory });
if (typeRoots) {
mutateMap(
typeRootsWatches,
arrayToMap(typeRoots, (tr) => resolutionHost.toPath(tr)),
{
createNewValue: createTypeRootsWatch,
onDeleteValue: closeFileWatcher
}
);
} else {
closeTypeRootsWatch();
}
}
function canWatchTypeRootPath(typeRoot) {
if (resolutionHost.getCompilationSettings().typeRoots)
return true;
return canWatchAtTypes(resolutionHost.toPath(typeRoot));
}
}
function resolutionIsSymlink(resolution) {
var _a, _b;
return !!(((_a = resolution.resolvedModule) == null ? void 0 : _a.originalPath) || ((_b = resolution.resolvedTypeReferenceDirective) == null ? void 0 : _b.originalPath));
}
// src/compiler/watch.ts
var sysFormatDiagnosticsHost = sys ? {
getCurrentDirectory: () => sys.getCurrentDirectory(),
getNewLine: () => sys.newLine,
getCanonicalFileName: createGetCanonicalFileName(sys.useCaseSensitiveFileNames)
} : void 0;
function createDiagnosticReporter(system, pretty) {
const host = system === sys && sysFormatDiagnosticsHost ? sysFormatDiagnosticsHost : {
getCurrentDirectory: () => system.getCurrentDirectory(),
getNewLine: () => system.newLine,
getCanonicalFileName: createGetCanonicalFileName(system.useCaseSensitiveFileNames)
};
if (!pretty) {
return (diagnostic) => system.write(formatDiagnostic(diagnostic, host));
}
const diagnostics = new Array(1);
return (diagnostic) => {
diagnostics[0] = diagnostic;
system.write(formatDiagnosticsWithColorAndContext(diagnostics, host) + host.getNewLine());
diagnostics[0] = void 0;
};
}
function clearScreenIfNotWatchingForFileChanges(system, diagnostic, options) {
if (system.clearScreen && !options.preserveWatchOutput && !options.extendedDiagnostics && !options.diagnostics && contains(screenStartingMessageCodes, diagnostic.code)) {
system.clearScreen();
return true;
}
return false;
}
var screenStartingMessageCodes = [
Diagnostics.Starting_compilation_in_watch_mode.code,
Diagnostics.File_change_detected_Starting_incremental_compilation.code
];
function getPlainDiagnosticFollowingNewLines(diagnostic, newLine) {
return contains(screenStartingMessageCodes, diagnostic.code) ? newLine + newLine : newLine;
}
function getLocaleTimeString(system) {
return !system.now ? (/* @__PURE__ */ new Date()).toLocaleTimeString() : (
// On some systems / builds of Node, there's a non-breaking space between the time and AM/PM.
// This branch is solely for testing, so just switch it to a normal space for baseline stability.
// See:
// - https://github.com/nodejs/node/issues/45171
// - https://github.com/nodejs/node/issues/45753
system.now().toLocaleTimeString("en-US", { timeZone: "UTC" }).replace("\u202F", " ")
);
}
function createWatchStatusReporter(system, pretty) {
return pretty ? (diagnostic, newLine, options) => {
clearScreenIfNotWatchingForFileChanges(system, diagnostic, options);
let output = `[${formatColorAndReset(getLocaleTimeString(system), "\x1B[90m" /* Grey */)}] `;
output += `${flattenDiagnosticMessageText(diagnostic.messageText, system.newLine)}${newLine + newLine}`;
system.write(output);
} : (diagnostic, newLine, options) => {
let output = "";
if (!clearScreenIfNotWatchingForFileChanges(system, diagnostic, options)) {
output += newLine;
}
output += `${getLocaleTimeString(system)} - `;
output += `${flattenDiagnosticMessageText(diagnostic.messageText, system.newLine)}${getPlainDiagnosticFollowingNewLines(diagnostic, newLine)}`;
system.write(output);
};
}
function parseConfigFileWithSystem(configFileName, optionsToExtend, extendedConfigCache, watchOptionsToExtend, system, reportDiagnostic) {
const host = system;
host.onUnRecoverableConfigFileDiagnostic = (diagnostic) => reportUnrecoverableDiagnostic(system, reportDiagnostic, diagnostic);
const result = getParsedCommandLineOfConfigFile(configFileName, optionsToExtend, host, extendedConfigCache, watchOptionsToExtend);
host.onUnRecoverableConfigFileDiagnostic = void 0;
return result;
}
function getErrorCountForSummary(diagnostics) {
return countWhere(diagnostics, (diagnostic) => diagnostic.category === 1 /* Error */);
}
function getFilesInErrorForSummary(diagnostics) {
const filesInError = filter(diagnostics, (diagnostic) => diagnostic.category === 1 /* Error */).map(
(errorDiagnostic) => {
if (errorDiagnostic.file === void 0)
return;
return `${errorDiagnostic.file.fileName}`;
}
);
return filesInError.map((fileName) => {
if (fileName === void 0) {
return void 0;
}
const diagnosticForFileName = find(
diagnostics,
(diagnostic) => diagnostic.file !== void 0 && diagnostic.file.fileName === fileName
);
if (diagnosticForFileName !== void 0) {
const { line } = getLineAndCharacterOfPosition(diagnosticForFileName.file, diagnosticForFileName.start);
return {
fileName,
line: line + 1
};
}
});
}
function getWatchErrorSummaryDiagnosticMessage(errorCount) {
return errorCount === 1 ? Diagnostics.Found_1_error_Watching_for_file_changes : Diagnostics.Found_0_errors_Watching_for_file_changes;
}
function prettyPathForFileError(error, cwd) {
const line = formatColorAndReset(":" + error.line, "\x1B[90m" /* Grey */);
if (pathIsAbsolute(error.fileName) && pathIsAbsolute(cwd)) {
return getRelativePathFromDirectory(
cwd,
error.fileName,
/*ignoreCase*/
false
) + line;
}
return error.fileName + line;
}
function getErrorSummaryText(errorCount, filesInError, newLine, host) {
if (errorCount === 0)
return "";
const nonNilFiles = filesInError.filter((fileInError) => fileInError !== void 0);
const distinctFileNamesWithLines = nonNilFiles.map((fileInError) => `${fileInError.fileName}:${fileInError.line}`).filter((value, index, self) => self.indexOf(value) === index);
const firstFileReference = nonNilFiles[0] && prettyPathForFileError(nonNilFiles[0], host.getCurrentDirectory());
let messageAndArgs;
if (errorCount === 1) {
messageAndArgs = filesInError[0] !== void 0 ? [Diagnostics.Found_1_error_in_0, firstFileReference] : [Diagnostics.Found_1_error];
} else {
messageAndArgs = distinctFileNamesWithLines.length === 0 ? [Diagnostics.Found_0_errors, errorCount] : distinctFileNamesWithLines.length === 1 ? [Diagnostics.Found_0_errors_in_the_same_file_starting_at_Colon_1, errorCount, firstFileReference] : [Diagnostics.Found_0_errors_in_1_files, errorCount, distinctFileNamesWithLines.length];
}
const d = createCompilerDiagnostic(...messageAndArgs);
const suffix = distinctFileNamesWithLines.length > 1 ? createTabularErrorsDisplay(nonNilFiles, host) : "";
return `${newLine}${flattenDiagnosticMessageText(d.messageText, newLine)}${newLine}${newLine}${suffix}`;
}
function createTabularErrorsDisplay(filesInError, host) {
const distinctFiles = filesInError.filter((value, index, self) => index === self.findIndex((file) => (file == null ? void 0 : file.fileName) === (value == null ? void 0 : value.fileName)));
if (distinctFiles.length === 0)
return "";
const numberLength = (num) => Math.log(num) * Math.LOG10E + 1;
const fileToErrorCount = distinctFiles.map((file) => [file, countWhere(filesInError, (fileInError) => fileInError.fileName === file.fileName)]);
const maxErrors = fileToErrorCount.reduce((acc, value) => Math.max(acc, value[1] || 0), 0);
const headerRow = Diagnostics.Errors_Files.message;
const leftColumnHeadingLength = headerRow.split(" ")[0].length;
const leftPaddingGoal = Math.max(leftColumnHeadingLength, numberLength(maxErrors));
const headerPadding = Math.max(numberLength(maxErrors) - leftColumnHeadingLength, 0);
let tabularData = "";
tabularData += " ".repeat(headerPadding) + headerRow + "\n";
fileToErrorCount.forEach((row) => {
const [file, errorCount] = row;
const errorCountDigitsLength = Math.log(errorCount) * Math.LOG10E + 1 | 0;
const leftPadding = errorCountDigitsLength < leftPaddingGoal ? " ".repeat(leftPaddingGoal - errorCountDigitsLength) : "";
const fileRef = prettyPathForFileError(file, host.getCurrentDirectory());
tabularData += `${leftPadding}${errorCount} ${fileRef}
`;
});
return tabularData;
}
function isBuilderProgram2(program) {
return !!program.getState;
}
function listFiles(program, write) {
const options = program.getCompilerOptions();
if (options.explainFiles) {
explainFiles(isBuilderProgram2(program) ? program.getProgram() : program, write);
} else if (options.listFiles || options.listFilesOnly) {
forEach(program.getSourceFiles(), (file) => {
write(file.fileName);
});
}
}
function explainFiles(program, write) {
var _a, _b;
const reasons = program.getFileIncludeReasons();
const relativeFileName = (fileName) => convertToRelativePath(fileName, program.getCurrentDirectory(), program.getCanonicalFileName);
for (const file of program.getSourceFiles()) {
write(`${toFileName(file, relativeFileName)}`);
(_a = reasons.get(file.path)) == null ? void 0 : _a.forEach((reason) => write(` ${fileIncludeReasonToDiagnostics(program, reason, relativeFileName).messageText}`));
(_b = explainIfFileIsRedirectAndImpliedFormat(file, relativeFileName)) == null ? void 0 : _b.forEach((d) => write(` ${d.messageText}`));
}
}
function explainIfFileIsRedirectAndImpliedFormat(file, fileNameConvertor) {
var _a;
let result;
if (file.path !== file.resolvedPath) {
(result ?? (result = [])).push(chainDiagnosticMessages(
/*details*/
void 0,
Diagnostics.File_is_output_of_project_reference_source_0,
toFileName(file.originalFileName, fileNameConvertor)
));
}
if (file.redirectInfo) {
(result ?? (result = [])).push(chainDiagnosticMessages(
/*details*/
void 0,
Diagnostics.File_redirects_to_file_0,
toFileName(file.redirectInfo.redirectTarget, fileNameConvertor)
));
}
if (isExternalOrCommonJsModule(file)) {
switch (file.impliedNodeFormat) {
case 99 /* ESNext */:
if (file.packageJsonScope) {
(result ?? (result = [])).push(chainDiagnosticMessages(
/*details*/
void 0,
Diagnostics.File_is_ECMAScript_module_because_0_has_field_type_with_value_module,
toFileName(last(file.packageJsonLocations), fileNameConvertor)
));
}
break;
case 1 /* CommonJS */:
if (file.packageJsonScope) {
(result ?? (result = [])).push(chainDiagnosticMessages(
/*details*/
void 0,
file.packageJsonScope.contents.packageJsonContent.type ? Diagnostics.File_is_CommonJS_module_because_0_has_field_type_whose_value_is_not_module : Diagnostics.File_is_CommonJS_module_because_0_does_not_have_field_type,
toFileName(last(file.packageJsonLocations), fileNameConvertor)
));
} else if ((_a = file.packageJsonLocations) == null ? void 0 : _a.length) {
(result ?? (result = [])).push(chainDiagnosticMessages(
/*details*/
void 0,
Diagnostics.File_is_CommonJS_module_because_package_json_was_not_found
));
}
break;
}
}
return result;
}
function getMatchedFileSpec(program, fileName) {
var _a;
const configFile = program.getCompilerOptions().configFile;
if (!((_a = configFile == null ? void 0 : configFile.configFileSpecs) == null ? void 0 : _a.validatedFilesSpec))
return void 0;
const filePath = program.getCanonicalFileName(fileName);
const basePath = getDirectoryPath(getNormalizedAbsolutePath(configFile.fileName, program.getCurrentDirectory()));
return find(configFile.configFileSpecs.validatedFilesSpec, (fileSpec) => program.getCanonicalFileName(getNormalizedAbsolutePath(fileSpec, basePath)) === filePath);
}
function getMatchedIncludeSpec(program, fileName) {
var _a, _b;
const configFile = program.getCompilerOptions().configFile;
if (!((_a = configFile == null ? void 0 : configFile.configFileSpecs) == null ? void 0 : _a.validatedIncludeSpecs))
return void 0;
if (configFile.configFileSpecs.isDefaultIncludeSpec)
return true;
const isJsonFile = fileExtensionIs(fileName, ".json" /* Json */);
const basePath = getDirectoryPath(getNormalizedAbsolutePath(configFile.fileName, program.getCurrentDirectory()));
const useCaseSensitiveFileNames = program.useCaseSensitiveFileNames();
return find((_b = configFile == null ? void 0 : configFile.configFileSpecs) == null ? void 0 : _b.validatedIncludeSpecs, (includeSpec) => {
if (isJsonFile && !endsWith(includeSpec, ".json" /* Json */))
return false;
const pattern = getPatternFromSpec(includeSpec, basePath, "files");
return !!pattern && getRegexFromPattern(`(${pattern})$`, useCaseSensitiveFileNames).test(fileName);
});
}
function fileIncludeReasonToDiagnostics(program, reason, fileNameConvertor) {
var _a, _b;
const options = program.getCompilerOptions();
if (isReferencedFile(reason)) {
const referenceLocation = getReferencedFileLocation((path) => program.getSourceFileByPath(path), reason);
const referenceText = isReferenceFileLocation(referenceLocation) ? referenceLocation.file.text.substring(referenceLocation.pos, referenceLocation.end) : `"${referenceLocation.text}"`;
let message;
Debug.assert(isReferenceFileLocation(referenceLocation) || reason.kind === 3 /* Import */, "Only synthetic references are imports");
switch (reason.kind) {
case 3 /* Import */:
if (isReferenceFileLocation(referenceLocation)) {
message = referenceLocation.packageId ? Diagnostics.Imported_via_0_from_file_1_with_packageId_2 : Diagnostics.Imported_via_0_from_file_1;
} else if (referenceLocation.text === externalHelpersModuleNameText) {
message = referenceLocation.packageId ? Diagnostics.Imported_via_0_from_file_1_with_packageId_2_to_import_importHelpers_as_specified_in_compilerOptions : Diagnostics.Imported_via_0_from_file_1_to_import_importHelpers_as_specified_in_compilerOptions;
} else {
message = referenceLocation.packageId ? Diagnostics.Imported_via_0_from_file_1_with_packageId_2_to_import_jsx_and_jsxs_factory_functions : Diagnostics.Imported_via_0_from_file_1_to_import_jsx_and_jsxs_factory_functions;
}
break;
case 4 /* ReferenceFile */:
Debug.assert(!referenceLocation.packageId);
message = Diagnostics.Referenced_via_0_from_file_1;
break;
case 5 /* TypeReferenceDirective */:
message = referenceLocation.packageId ? Diagnostics.Type_library_referenced_via_0_from_file_1_with_packageId_2 : Diagnostics.Type_library_referenced_via_0_from_file_1;
break;
case 7 /* LibReferenceDirective */:
Debug.assert(!referenceLocation.packageId);
message = Diagnostics.Library_referenced_via_0_from_file_1;
break;
default:
Debug.assertNever(reason);
}
return chainDiagnosticMessages(
/*details*/
void 0,
message,
referenceText,
toFileName(referenceLocation.file, fileNameConvertor),
referenceLocation.packageId && packageIdToString(referenceLocation.packageId)
);
}
switch (reason.kind) {
case 0 /* RootFile */:
if (!((_a = options.configFile) == null ? void 0 : _a.configFileSpecs))
return chainDiagnosticMessages(
/*details*/
void 0,
Diagnostics.Root_file_specified_for_compilation
);
const fileName = getNormalizedAbsolutePath(program.getRootFileNames()[reason.index], program.getCurrentDirectory());
const matchedByFiles = getMatchedFileSpec(program, fileName);
if (matchedByFiles)
return chainDiagnosticMessages(
/*details*/
void 0,
Diagnostics.Part_of_files_list_in_tsconfig_json
);
const matchedByInclude = getMatchedIncludeSpec(program, fileName);
return isString(matchedByInclude) ? chainDiagnosticMessages(
/*details*/
void 0,
Diagnostics.Matched_by_include_pattern_0_in_1,
matchedByInclude,
toFileName(options.configFile, fileNameConvertor)
) : (
// Could be additional files specified as roots or matched by default include
chainDiagnosticMessages(
/*details*/
void 0,
matchedByInclude ? Diagnostics.Matched_by_default_include_pattern_Asterisk_Asterisk_Slash_Asterisk : Diagnostics.Root_file_specified_for_compilation
)
);
case 1 /* SourceFromProjectReference */:
case 2 /* OutputFromProjectReference */:
const isOutput = reason.kind === 2 /* OutputFromProjectReference */;
const referencedResolvedRef = Debug.checkDefined((_b = program.getResolvedProjectReferences()) == null ? void 0 : _b[reason.index]);
return chainDiagnosticMessages(
/*details*/
void 0,
outFile(options) ? isOutput ? Diagnostics.Output_from_referenced_project_0_included_because_1_specified : Diagnostics.Source_from_referenced_project_0_included_because_1_specified : isOutput ? Diagnostics.Output_from_referenced_project_0_included_because_module_is_specified_as_none : Diagnostics.Source_from_referenced_project_0_included_because_module_is_specified_as_none,
toFileName(referencedResolvedRef.sourceFile.fileName, fileNameConvertor),
options.outFile ? "--outFile" : "--out"
);
case 8 /* AutomaticTypeDirectiveFile */: {
const messageAndArgs = options.types ? reason.packageId ? [Diagnostics.Entry_point_of_type_library_0_specified_in_compilerOptions_with_packageId_1, reason.typeReference, packageIdToString(reason.packageId)] : [Diagnostics.Entry_point_of_type_library_0_specified_in_compilerOptions, reason.typeReference] : reason.packageId ? [Diagnostics.Entry_point_for_implicit_type_library_0_with_packageId_1, reason.typeReference, packageIdToString(reason.packageId)] : [Diagnostics.Entry_point_for_implicit_type_library_0, reason.typeReference];
return chainDiagnosticMessages(
/*details*/
void 0,
...messageAndArgs
);
}
case 6 /* LibFile */: {
if (reason.index !== void 0)
return chainDiagnosticMessages(
/*details*/
void 0,
Diagnostics.Library_0_specified_in_compilerOptions,
options.lib[reason.index]
);
const target = forEachEntry(targetOptionDeclaration.type, (value, key) => value === getEmitScriptTarget(options) ? key : void 0);
const messageAndArgs = target ? [Diagnostics.Default_library_for_target_0, target] : [Diagnostics.Default_library];
return chainDiagnosticMessages(
/*details*/
void 0,
...messageAndArgs
);
}
default:
Debug.assertNever(reason);
}
}
function toFileName(file, fileNameConvertor) {
const fileName = isString(file) ? file : file.fileName;
return fileNameConvertor ? fileNameConvertor(fileName) : fileName;
}
function emitFilesAndReportErrors(program, reportDiagnostic, write, reportSummary, writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers) {
const isListFilesOnly = !!program.getCompilerOptions().listFilesOnly;
const allDiagnostics = program.getConfigFileParsingDiagnostics().slice();
const configFileParsingDiagnosticsLength = allDiagnostics.length;
addRange(allDiagnostics, program.getSyntacticDiagnostics(
/*sourceFile*/
void 0,
cancellationToken
));
if (allDiagnostics.length === configFileParsingDiagnosticsLength) {
addRange(allDiagnostics, program.getOptionsDiagnostics(cancellationToken));
if (!isListFilesOnly) {
addRange(allDiagnostics, program.getGlobalDiagnostics(cancellationToken));
if (allDiagnostics.length === configFileParsingDiagnosticsLength) {
addRange(allDiagnostics, program.getSemanticDiagnostics(
/*sourceFile*/
void 0,
cancellationToken
));
}
}
}
const emitResult = isListFilesOnly ? { emitSkipped: true, diagnostics: emptyArray } : program.emit(
/*targetSourceFile*/
void 0,
writeFile2,
cancellationToken,
emitOnlyDtsFiles,
customTransformers
);
const { emittedFiles, diagnostics: emitDiagnostics } = emitResult;
addRange(allDiagnostics, emitDiagnostics);
const diagnostics = sortAndDeduplicateDiagnostics(allDiagnostics);
diagnostics.forEach(reportDiagnostic);
if (write) {
const currentDir = program.getCurrentDirectory();
forEach(emittedFiles, (file) => {
const filepath = getNormalizedAbsolutePath(file, currentDir);
write(`TSFILE: ${filepath}`);
});
listFiles(program, write);
}
if (reportSummary) {
reportSummary(getErrorCountForSummary(diagnostics), getFilesInErrorForSummary(diagnostics));
}
return {
emitResult,
diagnostics
};
}
function emitFilesAndReportErrorsAndGetExitStatus(program, reportDiagnostic, write, reportSummary, writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers) {
const { emitResult, diagnostics } = emitFilesAndReportErrors(
program,
reportDiagnostic,
write,
reportSummary,
writeFile2,
cancellationToken,
emitOnlyDtsFiles,
customTransformers
);
if (emitResult.emitSkipped && diagnostics.length > 0) {
return 1 /* DiagnosticsPresent_OutputsSkipped */;
} else if (diagnostics.length > 0) {
return 2 /* DiagnosticsPresent_OutputsGenerated */;
}
return 0 /* Success */;
}
var noopFileWatcher = { close: noop };
var returnNoopFileWatcher = () => noopFileWatcher;
function createWatchHost(system = sys, reportWatchStatus2) {
const onWatchStatusChange = reportWatchStatus2 || createWatchStatusReporter(system);
return {
onWatchStatusChange,
watchFile: maybeBind(system, system.watchFile) || returnNoopFileWatcher,
watchDirectory: maybeBind(system, system.watchDirectory) || returnNoopFileWatcher,
setTimeout: maybeBind(system, system.setTimeout) || noop,
clearTimeout: maybeBind(system, system.clearTimeout) || noop
};
}
var WatchType = {
ConfigFile: "Config file",
ExtendedConfigFile: "Extended config file",
SourceFile: "Source file",
MissingFile: "Missing file",
WildcardDirectory: "Wild card directory",
FailedLookupLocations: "Failed Lookup Locations",
AffectingFileLocation: "File location affecting resolution",
TypeRoots: "Type roots",
ConfigFileOfReferencedProject: "Config file of referened project",
ExtendedConfigOfReferencedProject: "Extended config file of referenced project",
WildcardDirectoryOfReferencedProject: "Wild card directory of referenced project",
PackageJson: "package.json file",
ClosedScriptInfo: "Closed Script info",
ConfigFileForInferredRoot: "Config file for the inferred project root",
NodeModules: "node_modules for closed script infos and package.jsons affecting module specifier cache",
MissingSourceMapFile: "Missing source map file",
NoopConfigFileForInferredRoot: "Noop Config file for the inferred project root",
MissingGeneratedFile: "Missing generated file",
NodeModulesForModuleSpecifierCache: "node_modules for module specifier cache invalidation",
TypingInstallerLocationFile: "File location for typing installer",
TypingInstallerLocationDirectory: "Directory location for typing installer"
};
function createWatchFactory(host, options) {
const watchLogLevel = host.trace ? options.extendedDiagnostics ? 2 /* Verbose */ : options.diagnostics ? 1 /* TriggerOnly */ : 0 /* None */ : 0 /* None */;
const writeLog = watchLogLevel !== 0 /* None */ ? (s) => host.trace(s) : noop;
const result = getWatchFactory(host, watchLogLevel, writeLog);
result.writeLog = writeLog;
return result;
}
function createCompilerHostFromProgramHost(host, getCompilerOptions, directoryStructureHost = host) {
const useCaseSensitiveFileNames = host.useCaseSensitiveFileNames();
const compilerHost = {
getSourceFile: createGetSourceFile(
(fileName, encoding) => !encoding ? compilerHost.readFile(fileName) : host.readFile(fileName, encoding),
getCompilerOptions,
/*setParentNodes*/
void 0
),
getDefaultLibLocation: maybeBind(host, host.getDefaultLibLocation),
getDefaultLibFileName: (options) => host.getDefaultLibFileName(options),
writeFile: createWriteFileMeasuringIO(
(path, data, writeByteOrderMark) => host.writeFile(path, data, writeByteOrderMark),
(path) => host.createDirectory(path),
(path) => host.directoryExists(path)
),
getCurrentDirectory: memoize(() => host.getCurrentDirectory()),
useCaseSensitiveFileNames: () => useCaseSensitiveFileNames,
getCanonicalFileName: createGetCanonicalFileName(useCaseSensitiveFileNames),
getNewLine: () => getNewLineCharacter(getCompilerOptions()),
fileExists: (f) => host.fileExists(f),
readFile: (f) => host.readFile(f),
trace: maybeBind(host, host.trace),
directoryExists: maybeBind(directoryStructureHost, directoryStructureHost.directoryExists),
getDirectories: maybeBind(directoryStructureHost, directoryStructureHost.getDirectories),
realpath: maybeBind(host, host.realpath),
getEnvironmentVariable: maybeBind(host, host.getEnvironmentVariable) || (() => ""),
createHash: maybeBind(host, host.createHash),
readDirectory: maybeBind(host, host.readDirectory),
storeFilesChangingSignatureDuringEmit: host.storeFilesChangingSignatureDuringEmit
};
return compilerHost;
}
function getSourceFileVersionAsHashFromText(host, text) {
if (text.match(sourceMapCommentRegExpDontCareLineStart)) {
let lineEnd = text.length;
let lineStart = lineEnd;
for (let pos = lineEnd - 1; pos >= 0; pos--) {
const ch = text.charCodeAt(pos);
switch (ch) {
case 10 /* lineFeed */:
if (pos && text.charCodeAt(pos - 1) === 13 /* carriageReturn */) {
pos--;
}
case 13 /* carriageReturn */:
break;
default:
if (ch < 127 /* maxAsciiCharacter */ || !isLineBreak(ch)) {
lineStart = pos;
continue;
}
break;
}
const line = text.substring(lineStart, lineEnd);
if (line.match(sourceMapCommentRegExp)) {
text = text.substring(0, lineStart);
break;
} else if (!line.match(whitespaceOrMapCommentRegExp)) {
break;
}
lineEnd = lineStart;
}
}
return (host.createHash || generateDjb2Hash)(text);
}
function setGetSourceFileAsHashVersioned(compilerHost) {
const originalGetSourceFile = compilerHost.getSourceFile;
compilerHost.getSourceFile = (...args) => {
const result = originalGetSourceFile.call(compilerHost, ...args);
if (result) {
result.version = getSourceFileVersionAsHashFromText(compilerHost, result.text);
}
return result;
};
}
function createProgramHost(system, createProgram2) {
const getDefaultLibLocation = memoize(() => getDirectoryPath(normalizePath(system.getExecutingFilePath())));
return {
useCaseSensitiveFileNames: () => system.useCaseSensitiveFileNames,
getNewLine: () => system.newLine,
getCurrentDirectory: memoize(() => system.getCurrentDirectory()),
getDefaultLibLocation,
getDefaultLibFileName: (options) => combinePaths(getDefaultLibLocation(), getDefaultLibFileName(options)),
fileExists: (path) => system.fileExists(path),
readFile: (path, encoding) => system.readFile(path, encoding),
directoryExists: (path) => system.directoryExists(path),
getDirectories: (path) => system.getDirectories(path),
readDirectory: (path, extensions, exclude, include, depth) => system.readDirectory(path, extensions, exclude, include, depth),
realpath: maybeBind(system, system.realpath),
getEnvironmentVariable: maybeBind(system, system.getEnvironmentVariable),
trace: (s) => system.write(s + system.newLine),
createDirectory: (path) => system.createDirectory(path),
writeFile: (path, data, writeByteOrderMark) => system.writeFile(path, data, writeByteOrderMark),
createHash: maybeBind(system, system.createHash),
createProgram: createProgram2 || createEmitAndSemanticDiagnosticsBuilderProgram,
storeFilesChangingSignatureDuringEmit: system.storeFilesChangingSignatureDuringEmit,
now: maybeBind(system, system.now)
};
}
function createWatchCompilerHost(system = sys, createProgram2, reportDiagnostic, reportWatchStatus2) {
const write = (s) => system.write(s + system.newLine);
const result = createProgramHost(system, createProgram2);
copyProperties(result, createWatchHost(system, reportWatchStatus2));
result.afterProgramCreate = (builderProgram) => {
const compilerOptions = builderProgram.getCompilerOptions();
const newLine = getNewLineCharacter(compilerOptions);
emitFilesAndReportErrors(
builderProgram,
reportDiagnostic,
write,
(errorCount) => result.onWatchStatusChange(
createCompilerDiagnostic(getWatchErrorSummaryDiagnosticMessage(errorCount), errorCount),
newLine,
compilerOptions,
errorCount
)
);
};
return result;
}
function reportUnrecoverableDiagnostic(system, reportDiagnostic, diagnostic) {
reportDiagnostic(diagnostic);
system.exit(1 /* DiagnosticsPresent_OutputsSkipped */);
}
function createWatchCompilerHostOfConfigFile({
configFileName,
optionsToExtend,
watchOptionsToExtend,
extraFileExtensions,
system,
createProgram: createProgram2,
reportDiagnostic,
reportWatchStatus: reportWatchStatus2
}) {
const diagnosticReporter = reportDiagnostic || createDiagnosticReporter(system);
const host = createWatchCompilerHost(system, createProgram2, diagnosticReporter, reportWatchStatus2);
host.onUnRecoverableConfigFileDiagnostic = (diagnostic) => reportUnrecoverableDiagnostic(system, diagnosticReporter, diagnostic);
host.configFileName = configFileName;
host.optionsToExtend = optionsToExtend;
host.watchOptionsToExtend = watchOptionsToExtend;
host.extraFileExtensions = extraFileExtensions;
return host;
}
function createWatchCompilerHostOfFilesAndCompilerOptions({
rootFiles,
options,
watchOptions,
projectReferences,
system,
createProgram: createProgram2,
reportDiagnostic,
reportWatchStatus: reportWatchStatus2
}) {
const host = createWatchCompilerHost(system, createProgram2, reportDiagnostic || createDiagnosticReporter(system), reportWatchStatus2);
host.rootFiles = rootFiles;
host.options = options;
host.watchOptions = watchOptions;
host.projectReferences = projectReferences;
return host;
}
function performIncrementalCompilation(input) {
const system = input.system || sys;
const host = input.host || (input.host = createIncrementalCompilerHost(input.options, system));
const builderProgram = createIncrementalProgram(input);
const exitStatus = emitFilesAndReportErrorsAndGetExitStatus(
builderProgram,
input.reportDiagnostic || createDiagnosticReporter(system),
(s) => host.trace && host.trace(s),
input.reportErrorSummary || input.options.pretty ? (errorCount, filesInError) => system.write(getErrorSummaryText(errorCount, filesInError, system.newLine, host)) : void 0
);
if (input.afterProgramEmitAndDiagnostics)
input.afterProgramEmitAndDiagnostics(builderProgram);
return exitStatus;
}
// src/compiler/watchPublic.ts
function readBuilderProgram(compilerOptions, host) {
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(compilerOptions);
if (!buildInfoPath)
return void 0;
let buildInfo;
if (host.getBuildInfo) {
buildInfo = host.getBuildInfo(buildInfoPath, compilerOptions.configFilePath);
} else {
const content = host.readFile(buildInfoPath);
if (!content)
return void 0;
buildInfo = getBuildInfo(buildInfoPath, content);
}
if (!buildInfo || buildInfo.version !== version || !buildInfo.program)
return void 0;
return createBuilderProgramUsingProgramBuildInfo(buildInfo, buildInfoPath, host);
}
function createIncrementalCompilerHost(options, system = sys) {
const host = createCompilerHostWorker(
options,
/*setParentNodes*/
void 0,
system
);
host.createHash = maybeBind(system, system.createHash);
host.storeFilesChangingSignatureDuringEmit = system.storeFilesChangingSignatureDuringEmit;
setGetSourceFileAsHashVersioned(host);
changeCompilerHostLikeToUseCache(host, (fileName) => toPath(fileName, host.getCurrentDirectory(), host.getCanonicalFileName));
return host;
}
function createIncrementalProgram({
rootNames,
options,
configFileParsingDiagnostics,
projectReferences,
host,
createProgram: createProgram2
}) {
host = host || createIncrementalCompilerHost(options);
createProgram2 = createProgram2 || createEmitAndSemanticDiagnosticsBuilderProgram;
const oldProgram = readBuilderProgram(options, host);
return createProgram2(rootNames, options, host, oldProgram, configFileParsingDiagnostics, projectReferences);
}
function createWatchProgram(host) {
let builderProgram;
let reloadLevel;
let missingFilesMap;
let watchedWildcardDirectories;
let timerToUpdateProgram;
let timerToInvalidateFailedLookupResolutions;
let parsedConfigs;
let sharedExtendedConfigFileWatchers;
let extendedConfigCache = host.extendedConfigCache;
let reportFileChangeDetectedOnCreateProgram = false;
const sourceFilesCache = /* @__PURE__ */ new Map();
let missingFilePathsRequestedForRelease;
let hasChangedCompilerOptions = false;
const useCaseSensitiveFileNames = host.useCaseSensitiveFileNames();
const currentDirectory = host.getCurrentDirectory();
const { configFileName, optionsToExtend: optionsToExtendForConfigFile = {}, watchOptionsToExtend, extraFileExtensions, createProgram: createProgram2 } = host;
let { rootFiles: rootFileNames, options: compilerOptions, watchOptions, projectReferences } = host;
let wildcardDirectories;
let configFileParsingDiagnostics;
let canConfigFileJsonReportNoInputFiles = false;
let hasChangedConfigFileParsingErrors = false;
const cachedDirectoryStructureHost = configFileName === void 0 ? void 0 : createCachedDirectoryStructureHost(host, currentDirectory, useCaseSensitiveFileNames);
const directoryStructureHost = cachedDirectoryStructureHost || host;
const parseConfigFileHost = parseConfigHostFromCompilerHostLike(host, directoryStructureHost);
let newLine = updateNewLine();
if (configFileName && host.configFileParsingResult) {
setConfigFileParsingResult(host.configFileParsingResult);
newLine = updateNewLine();
}
reportWatchDiagnostic(Diagnostics.Starting_compilation_in_watch_mode);
if (configFileName && !host.configFileParsingResult) {
newLine = getNewLineCharacter(optionsToExtendForConfigFile);
Debug.assert(!rootFileNames);
parseConfigFile2();
newLine = updateNewLine();
}
Debug.assert(compilerOptions);
Debug.assert(rootFileNames);
const { watchFile: watchFile2, watchDirectory, writeLog } = createWatchFactory(host, compilerOptions);
const getCanonicalFileName = createGetCanonicalFileName(useCaseSensitiveFileNames);
writeLog(`Current directory: ${currentDirectory} CaseSensitiveFileNames: ${useCaseSensitiveFileNames}`);
let configFileWatcher;
if (configFileName) {
configFileWatcher = watchFile2(configFileName, scheduleProgramReload, 2e3 /* High */, watchOptions, WatchType.ConfigFile);
}
const compilerHost = createCompilerHostFromProgramHost(host, () => compilerOptions, directoryStructureHost);
setGetSourceFileAsHashVersioned(compilerHost);
const getNewSourceFile = compilerHost.getSourceFile;
compilerHost.getSourceFile = (fileName, ...args) => getVersionedSourceFileByPath(fileName, toPath3(fileName), ...args);
compilerHost.getSourceFileByPath = getVersionedSourceFileByPath;
compilerHost.getNewLine = () => newLine;
compilerHost.fileExists = fileExists;
compilerHost.onReleaseOldSourceFile = onReleaseOldSourceFile;
compilerHost.onReleaseParsedCommandLine = onReleaseParsedCommandLine;
compilerHost.toPath = toPath3;
compilerHost.getCompilationSettings = () => compilerOptions;
compilerHost.useSourceOfProjectReferenceRedirect = maybeBind(host, host.useSourceOfProjectReferenceRedirect);
compilerHost.watchDirectoryOfFailedLookupLocation = (dir, cb, flags) => watchDirectory(dir, cb, flags, watchOptions, WatchType.FailedLookupLocations);
compilerHost.watchAffectingFileLocation = (file, cb) => watchFile2(file, cb, 2e3 /* High */, watchOptions, WatchType.AffectingFileLocation);
compilerHost.watchTypeRootsDirectory = (dir, cb, flags) => watchDirectory(dir, cb, flags, watchOptions, WatchType.TypeRoots);
compilerHost.getCachedDirectoryStructureHost = () => cachedDirectoryStructureHost;
compilerHost.scheduleInvalidateResolutionsOfFailedLookupLocations = scheduleInvalidateResolutionsOfFailedLookupLocations;
compilerHost.onInvalidatedResolution = scheduleProgramUpdate;
compilerHost.onChangedAutomaticTypeDirectiveNames = scheduleProgramUpdate;
compilerHost.fileIsOpen = returnFalse;
compilerHost.getCurrentProgram = getCurrentProgram;
compilerHost.writeLog = writeLog;
compilerHost.getParsedCommandLine = getParsedCommandLine;
const resolutionCache = createResolutionCache(
compilerHost,
configFileName ? getDirectoryPath(getNormalizedAbsolutePath(configFileName, currentDirectory)) : currentDirectory,
/*logChangesWhenResolvingModule*/
false
);
compilerHost.resolveModuleNameLiterals = maybeBind(host, host.resolveModuleNameLiterals);
compilerHost.resolveModuleNames = maybeBind(host, host.resolveModuleNames);
if (!compilerHost.resolveModuleNameLiterals && !compilerHost.resolveModuleNames) {
compilerHost.resolveModuleNameLiterals = resolutionCache.resolveModuleNameLiterals.bind(resolutionCache);
}
compilerHost.resolveTypeReferenceDirectiveReferences = maybeBind(host, host.resolveTypeReferenceDirectiveReferences);
compilerHost.resolveTypeReferenceDirectives = maybeBind(host, host.resolveTypeReferenceDirectives);
if (!compilerHost.resolveTypeReferenceDirectiveReferences && !compilerHost.resolveTypeReferenceDirectives) {
compilerHost.resolveTypeReferenceDirectiveReferences = resolutionCache.resolveTypeReferenceDirectiveReferences.bind(resolutionCache);
}
compilerHost.resolveLibrary = !host.resolveLibrary ? resolutionCache.resolveLibrary.bind(resolutionCache) : host.resolveLibrary.bind(host);
compilerHost.getModuleResolutionCache = host.resolveModuleNameLiterals || host.resolveModuleNames ? maybeBind(host, host.getModuleResolutionCache) : () => resolutionCache.getModuleResolutionCache();
const userProvidedResolution = !!host.resolveModuleNameLiterals || !!host.resolveTypeReferenceDirectiveReferences || !!host.resolveModuleNames || !!host.resolveTypeReferenceDirectives;
const customHasInvalidatedResolutions = userProvidedResolution ? maybeBind(host, host.hasInvalidatedResolutions) || returnTrue : returnFalse;
const customHasInvalidLibResolutions = host.resolveLibrary ? maybeBind(host, host.hasInvalidatedLibResolutions) || returnTrue : returnFalse;
builderProgram = readBuilderProgram(compilerOptions, compilerHost);
synchronizeProgram();
watchConfigFileWildCardDirectories();
if (configFileName)
updateExtendedConfigFilesWatches(toPath3(configFileName), compilerOptions, watchOptions, WatchType.ExtendedConfigFile);
return configFileName ? { getCurrentProgram: getCurrentBuilderProgram, getProgram: updateProgram, close } : { getCurrentProgram: getCurrentBuilderProgram, getProgram: updateProgram, updateRootFileNames, close };
function close() {
clearInvalidateResolutionsOfFailedLookupLocations();
resolutionCache.clear();
clearMap(sourceFilesCache, (value) => {
if (value && value.fileWatcher) {
value.fileWatcher.close();
value.fileWatcher = void 0;
}
});
if (configFileWatcher) {
configFileWatcher.close();
configFileWatcher = void 0;
}
extendedConfigCache == null ? void 0 : extendedConfigCache.clear();
extendedConfigCache = void 0;
if (sharedExtendedConfigFileWatchers) {
clearMap(sharedExtendedConfigFileWatchers, closeFileWatcherOf);
sharedExtendedConfigFileWatchers = void 0;
}
if (watchedWildcardDirectories) {
clearMap(watchedWildcardDirectories, closeFileWatcherOf);
watchedWildcardDirectories = void 0;
}
if (missingFilesMap) {
clearMap(missingFilesMap, closeFileWatcher);
missingFilesMap = void 0;
}
if (parsedConfigs) {
clearMap(parsedConfigs, (config) => {
var _a;
(_a = config.watcher) == null ? void 0 : _a.close();
config.watcher = void 0;
if (config.watchedDirectories)
clearMap(config.watchedDirectories, closeFileWatcherOf);
config.watchedDirectories = void 0;
});
parsedConfigs = void 0;
}
}
function getCurrentBuilderProgram() {
return builderProgram;
}
function getCurrentProgram() {
return builderProgram && builderProgram.getProgramOrUndefined();
}
function synchronizeProgram() {
writeLog(`Synchronizing program`);
Debug.assert(compilerOptions);
Debug.assert(rootFileNames);
clearInvalidateResolutionsOfFailedLookupLocations();
const program = getCurrentBuilderProgram();
if (hasChangedCompilerOptions) {
newLine = updateNewLine();
if (program && changesAffectModuleResolution(program.getCompilerOptions(), compilerOptions)) {
debugger;
resolutionCache.onChangesAffectModuleResolution();
}
}
const { hasInvalidatedResolutions, hasInvalidatedLibResolutions } = resolutionCache.createHasInvalidatedResolutions(customHasInvalidatedResolutions, customHasInvalidLibResolutions);
const {
originalReadFile,
originalFileExists,
originalDirectoryExists,
originalCreateDirectory,
originalWriteFile,
readFileWithCache
} = changeCompilerHostLikeToUseCache(compilerHost, toPath3);
if (isProgramUptoDate(getCurrentProgram(), rootFileNames, compilerOptions, (path) => getSourceVersion(path, readFileWithCache), (fileName) => compilerHost.fileExists(fileName), hasInvalidatedResolutions, hasInvalidatedLibResolutions, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences)) {
if (hasChangedConfigFileParsingErrors) {
if (reportFileChangeDetectedOnCreateProgram) {
reportWatchDiagnostic(Diagnostics.File_change_detected_Starting_incremental_compilation);
}
builderProgram = createProgram2(
/*rootNames*/
void 0,
/*options*/
void 0,
compilerHost,
builderProgram,
configFileParsingDiagnostics,
projectReferences
);
hasChangedConfigFileParsingErrors = false;
}
} else {
if (reportFileChangeDetectedOnCreateProgram) {
reportWatchDiagnostic(Diagnostics.File_change_detected_Starting_incremental_compilation);
}
createNewProgram(hasInvalidatedResolutions, hasInvalidatedLibResolutions);
}
reportFileChangeDetectedOnCreateProgram = false;
if (host.afterProgramCreate && program !== builderProgram) {
host.afterProgramCreate(builderProgram);
}
compilerHost.readFile = originalReadFile;
compilerHost.fileExists = originalFileExists;
compilerHost.directoryExists = originalDirectoryExists;
compilerHost.createDirectory = originalCreateDirectory;
compilerHost.writeFile = originalWriteFile;
return builderProgram;
}
function createNewProgram(hasInvalidatedResolutions, hasInvalidatedLibResolutions) {
writeLog("CreatingProgramWith::");
writeLog(` roots: ${JSON.stringify(rootFileNames)}`);
writeLog(` options: ${JSON.stringify(compilerOptions)}`);
if (projectReferences)
writeLog(` projectReferences: ${JSON.stringify(projectReferences)}`);
const needsUpdateInTypeRootWatch = hasChangedCompilerOptions || !getCurrentProgram();
hasChangedCompilerOptions = false;
hasChangedConfigFileParsingErrors = false;
resolutionCache.startCachingPerDirectoryResolution();
compilerHost.hasInvalidatedResolutions = hasInvalidatedResolutions;
compilerHost.hasInvalidatedLibResolutions = hasInvalidatedLibResolutions;
compilerHost.hasChangedAutomaticTypeDirectiveNames = hasChangedAutomaticTypeDirectiveNames;
const oldProgram = getCurrentProgram();
builderProgram = createProgram2(rootFileNames, compilerOptions, compilerHost, builderProgram, configFileParsingDiagnostics, projectReferences);
resolutionCache.finishCachingPerDirectoryResolution(builderProgram.getProgram(), oldProgram);
updateMissingFilePathsWatch(builderProgram.getProgram(), missingFilesMap || (missingFilesMap = /* @__PURE__ */ new Map()), watchMissingFilePath);
if (needsUpdateInTypeRootWatch) {
resolutionCache.updateTypeRootsWatch();
}
if (missingFilePathsRequestedForRelease) {
for (const missingFilePath of missingFilePathsRequestedForRelease) {
if (!missingFilesMap.has(missingFilePath)) {
sourceFilesCache.delete(missingFilePath);
}
}
missingFilePathsRequestedForRelease = void 0;
}
}
function updateRootFileNames(files) {
Debug.assert(!configFileName, "Cannot update root file names with config file watch mode");
rootFileNames = files;
scheduleProgramUpdate();
}
function updateNewLine() {
return getNewLineCharacter(compilerOptions || optionsToExtendForConfigFile);
}
function toPath3(fileName) {
return toPath(fileName, currentDirectory, getCanonicalFileName);
}
function isFileMissingOnHost(hostSourceFile) {
return typeof hostSourceFile === "boolean";
}
function isFilePresenceUnknownOnHost(hostSourceFile) {
return typeof hostSourceFile.version === "boolean";
}
function fileExists(fileName) {
const path = toPath3(fileName);
if (isFileMissingOnHost(sourceFilesCache.get(path))) {
return false;
}
return directoryStructureHost.fileExists(fileName);
}
function getVersionedSourceFileByPath(fileName, path, languageVersionOrOptions, onError, shouldCreateNewSourceFile) {
const hostSourceFile = sourceFilesCache.get(path);
if (isFileMissingOnHost(hostSourceFile)) {
return void 0;
}
if (hostSourceFile === void 0 || shouldCreateNewSourceFile || isFilePresenceUnknownOnHost(hostSourceFile)) {
const sourceFile = getNewSourceFile(fileName, languageVersionOrOptions, onError);
if (hostSourceFile) {
if (sourceFile) {
hostSourceFile.sourceFile = sourceFile;
hostSourceFile.version = sourceFile.version;
if (!hostSourceFile.fileWatcher) {
hostSourceFile.fileWatcher = watchFilePath(path, fileName, onSourceFileChange, 250 /* Low */, watchOptions, WatchType.SourceFile);
}
} else {
if (hostSourceFile.fileWatcher) {
hostSourceFile.fileWatcher.close();
}
sourceFilesCache.set(path, false);
}
} else {
if (sourceFile) {
const fileWatcher = watchFilePath(path, fileName, onSourceFileChange, 250 /* Low */, watchOptions, WatchType.SourceFile);
sourceFilesCache.set(path, { sourceFile, version: sourceFile.version, fileWatcher });
} else {
sourceFilesCache.set(path, false);
}
}
return sourceFile;
}
return hostSourceFile.sourceFile;
}
function nextSourceFileVersion(path) {
const hostSourceFile = sourceFilesCache.get(path);
if (hostSourceFile !== void 0) {
if (isFileMissingOnHost(hostSourceFile)) {
sourceFilesCache.set(path, { version: false });
} else {
hostSourceFile.version = false;
}
}
}
function getSourceVersion(path, readFileWithCache) {
const hostSourceFile = sourceFilesCache.get(path);
if (!hostSourceFile)
return void 0;
if (hostSourceFile.version)
return hostSourceFile.version;
const text = readFileWithCache(path);
return text !== void 0 ? getSourceFileVersionAsHashFromText(compilerHost, text) : void 0;
}
function onReleaseOldSourceFile(oldSourceFile, _oldOptions, hasSourceFileByPath) {
const hostSourceFileInfo = sourceFilesCache.get(oldSourceFile.resolvedPath);
if (hostSourceFileInfo !== void 0) {
if (isFileMissingOnHost(hostSourceFileInfo)) {
(missingFilePathsRequestedForRelease || (missingFilePathsRequestedForRelease = [])).push(oldSourceFile.path);
} else if (hostSourceFileInfo.sourceFile === oldSourceFile) {
if (hostSourceFileInfo.fileWatcher) {
hostSourceFileInfo.fileWatcher.close();
}
sourceFilesCache.delete(oldSourceFile.resolvedPath);
if (!hasSourceFileByPath) {
resolutionCache.removeResolutionsOfFile(oldSourceFile.path);
}
}
}
}
function reportWatchDiagnostic(message) {
if (host.onWatchStatusChange) {
host.onWatchStatusChange(createCompilerDiagnostic(message), newLine, compilerOptions || optionsToExtendForConfigFile);
}
}
function hasChangedAutomaticTypeDirectiveNames() {
return resolutionCache.hasChangedAutomaticTypeDirectiveNames();
}
function clearInvalidateResolutionsOfFailedLookupLocations() {
if (!timerToInvalidateFailedLookupResolutions)
return false;
host.clearTimeout(timerToInvalidateFailedLookupResolutions);
timerToInvalidateFailedLookupResolutions = void 0;
return true;
}
function scheduleInvalidateResolutionsOfFailedLookupLocations() {
if (!host.setTimeout || !host.clearTimeout) {
return resolutionCache.invalidateResolutionsOfFailedLookupLocations();
}
const pending = clearInvalidateResolutionsOfFailedLookupLocations();
writeLog(`Scheduling invalidateFailedLookup${pending ? ", Cancelled earlier one" : ""}`);
timerToInvalidateFailedLookupResolutions = host.setTimeout(invalidateResolutionsOfFailedLookup, 250, "timerToInvalidateFailedLookupResolutions");
}
function invalidateResolutionsOfFailedLookup() {
timerToInvalidateFailedLookupResolutions = void 0;
if (resolutionCache.invalidateResolutionsOfFailedLookupLocations()) {
scheduleProgramUpdate();
}
}
function scheduleProgramUpdate() {
if (!host.setTimeout || !host.clearTimeout) {
return;
}
if (timerToUpdateProgram) {
host.clearTimeout(timerToUpdateProgram);
}
writeLog("Scheduling update");
timerToUpdateProgram = host.setTimeout(updateProgramWithWatchStatus, 250, "timerToUpdateProgram");
}
function scheduleProgramReload() {
Debug.assert(!!configFileName);
reloadLevel = 2 /* Full */;
scheduleProgramUpdate();
}
function updateProgramWithWatchStatus() {
timerToUpdateProgram = void 0;
reportFileChangeDetectedOnCreateProgram = true;
updateProgram();
}
function updateProgram() {
var _a, _b, _c, _d;
switch (reloadLevel) {
case 1 /* Partial */:
(_a = perfLogger) == null ? void 0 : _a.logStartUpdateProgram("PartialConfigReload");
reloadFileNamesFromConfigFile();
break;
case 2 /* Full */:
(_b = perfLogger) == null ? void 0 : _b.logStartUpdateProgram("FullConfigReload");
reloadConfigFile();
break;
default:
(_c = perfLogger) == null ? void 0 : _c.logStartUpdateProgram("SynchronizeProgram");
synchronizeProgram();
break;
}
(_d = perfLogger) == null ? void 0 : _d.logStopUpdateProgram("Done");
return getCurrentBuilderProgram();
}
function reloadFileNamesFromConfigFile() {
writeLog("Reloading new file names and options");
Debug.assert(compilerOptions);
Debug.assert(configFileName);
reloadLevel = 0 /* None */;
rootFileNames = getFileNamesFromConfigSpecs(compilerOptions.configFile.configFileSpecs, getNormalizedAbsolutePath(getDirectoryPath(configFileName), currentDirectory), compilerOptions, parseConfigFileHost, extraFileExtensions);
if (updateErrorForNoInputFiles(rootFileNames, getNormalizedAbsolutePath(configFileName, currentDirectory), compilerOptions.configFile.configFileSpecs, configFileParsingDiagnostics, canConfigFileJsonReportNoInputFiles)) {
hasChangedConfigFileParsingErrors = true;
}
synchronizeProgram();
}
function reloadConfigFile() {
Debug.assert(configFileName);
writeLog(`Reloading config file: ${configFileName}`);
reloadLevel = 0 /* None */;
if (cachedDirectoryStructureHost) {
cachedDirectoryStructureHost.clearCache();
}
parseConfigFile2();
hasChangedCompilerOptions = true;
synchronizeProgram();
watchConfigFileWildCardDirectories();
updateExtendedConfigFilesWatches(toPath3(configFileName), compilerOptions, watchOptions, WatchType.ExtendedConfigFile);
}
function parseConfigFile2() {
Debug.assert(configFileName);
setConfigFileParsingResult(getParsedCommandLineOfConfigFile(
configFileName,
optionsToExtendForConfigFile,
parseConfigFileHost,
extendedConfigCache || (extendedConfigCache = /* @__PURE__ */ new Map()),
watchOptionsToExtend,
extraFileExtensions
));
}
function setConfigFileParsingResult(configFileParseResult) {
rootFileNames = configFileParseResult.fileNames;
compilerOptions = configFileParseResult.options;
watchOptions = configFileParseResult.watchOptions;
projectReferences = configFileParseResult.projectReferences;
wildcardDirectories = configFileParseResult.wildcardDirectories;
configFileParsingDiagnostics = getConfigFileParsingDiagnostics(configFileParseResult).slice();
canConfigFileJsonReportNoInputFiles = canJsonReportNoInputFiles(configFileParseResult.raw);
hasChangedConfigFileParsingErrors = true;
}
function getParsedCommandLine(configFileName2) {
const configPath = toPath3(configFileName2);
let config = parsedConfigs == null ? void 0 : parsedConfigs.get(configPath);
if (config) {
if (!config.reloadLevel)
return config.parsedCommandLine;
if (config.parsedCommandLine && config.reloadLevel === 1 /* Partial */ && !host.getParsedCommandLine) {
writeLog("Reloading new file names and options");
Debug.assert(compilerOptions);
const fileNames = getFileNamesFromConfigSpecs(
config.parsedCommandLine.options.configFile.configFileSpecs,
getNormalizedAbsolutePath(getDirectoryPath(configFileName2), currentDirectory),
compilerOptions,
parseConfigFileHost
);
config.parsedCommandLine = { ...config.parsedCommandLine, fileNames };
config.reloadLevel = void 0;
return config.parsedCommandLine;
}
}
writeLog(`Loading config file: ${configFileName2}`);
const parsedCommandLine = host.getParsedCommandLine ? host.getParsedCommandLine(configFileName2) : getParsedCommandLineFromConfigFileHost(configFileName2);
if (config) {
config.parsedCommandLine = parsedCommandLine;
config.reloadLevel = void 0;
} else {
(parsedConfigs || (parsedConfigs = /* @__PURE__ */ new Map())).set(configPath, config = { parsedCommandLine });
}
watchReferencedProject(configFileName2, configPath, config);
return parsedCommandLine;
}
function getParsedCommandLineFromConfigFileHost(configFileName2) {
const onUnRecoverableConfigFileDiagnostic = parseConfigFileHost.onUnRecoverableConfigFileDiagnostic;
parseConfigFileHost.onUnRecoverableConfigFileDiagnostic = noop;
const parsedCommandLine = getParsedCommandLineOfConfigFile(
configFileName2,
/*optionsToExtend*/
void 0,
parseConfigFileHost,
extendedConfigCache || (extendedConfigCache = /* @__PURE__ */ new Map()),
watchOptionsToExtend
);
parseConfigFileHost.onUnRecoverableConfigFileDiagnostic = onUnRecoverableConfigFileDiagnostic;
return parsedCommandLine;
}
function onReleaseParsedCommandLine(fileName) {
var _a;
const path = toPath3(fileName);
const config = parsedConfigs == null ? void 0 : parsedConfigs.get(path);
if (!config)
return;
parsedConfigs.delete(path);
if (config.watchedDirectories)
clearMap(config.watchedDirectories, closeFileWatcherOf);
(_a = config.watcher) == null ? void 0 : _a.close();
clearSharedExtendedConfigFileWatcher(path, sharedExtendedConfigFileWatchers);
}
function watchFilePath(path, file, callback, pollingInterval, options, watchType) {
return watchFile2(file, (fileName, eventKind) => callback(fileName, eventKind, path), pollingInterval, options, watchType);
}
function onSourceFileChange(fileName, eventKind, path) {
updateCachedSystemWithFile(fileName, path, eventKind);
if (eventKind === 2 /* Deleted */ && sourceFilesCache.has(path)) {
resolutionCache.invalidateResolutionOfFile(path);
}
nextSourceFileVersion(path);
scheduleProgramUpdate();
}
function updateCachedSystemWithFile(fileName, path, eventKind) {
if (cachedDirectoryStructureHost) {
cachedDirectoryStructureHost.addOrDeleteFile(fileName, path, eventKind);
}
}
function watchMissingFilePath(missingFilePath) {
return (parsedConfigs == null ? void 0 : parsedConfigs.has(missingFilePath)) ? noopFileWatcher : watchFilePath(missingFilePath, missingFilePath, onMissingFileChange, 500 /* Medium */, watchOptions, WatchType.MissingFile);
}
function onMissingFileChange(fileName, eventKind, missingFilePath) {
updateCachedSystemWithFile(fileName, missingFilePath, eventKind);
if (eventKind === 0 /* Created */ && missingFilesMap.has(missingFilePath)) {
missingFilesMap.get(missingFilePath).close();
missingFilesMap.delete(missingFilePath);
nextSourceFileVersion(missingFilePath);
scheduleProgramUpdate();
}
}
function watchConfigFileWildCardDirectories() {
if (wildcardDirectories) {
updateWatchingWildcardDirectories(
watchedWildcardDirectories || (watchedWildcardDirectories = /* @__PURE__ */ new Map()),
new Map(Object.entries(wildcardDirectories)),
watchWildcardDirectory
);
} else if (watchedWildcardDirectories) {
clearMap(watchedWildcardDirectories, closeFileWatcherOf);
}
}
function watchWildcardDirectory(directory, flags) {
return watchDirectory(
directory,
(fileOrDirectory) => {
Debug.assert(configFileName);
Debug.assert(compilerOptions);
const fileOrDirectoryPath = toPath3(fileOrDirectory);
if (cachedDirectoryStructureHost) {
cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath);
}
nextSourceFileVersion(fileOrDirectoryPath);
if (isIgnoredFileFromWildCardWatching({
watchedDirPath: toPath3(directory),
fileOrDirectory,
fileOrDirectoryPath,
configFileName,
extraFileExtensions,
options: compilerOptions,
program: getCurrentBuilderProgram() || rootFileNames,
currentDirectory,
useCaseSensitiveFileNames,
writeLog,
toPath: toPath3
}))
return;
if (reloadLevel !== 2 /* Full */) {
reloadLevel = 1 /* Partial */;
scheduleProgramUpdate();
}
},
flags,
watchOptions,
WatchType.WildcardDirectory
);
}
function updateExtendedConfigFilesWatches(forProjectPath, options, watchOptions2, watchType) {
updateSharedExtendedConfigFileWatcher(
forProjectPath,
options,
sharedExtendedConfigFileWatchers || (sharedExtendedConfigFileWatchers = /* @__PURE__ */ new Map()),
(extendedConfigFileName, extendedConfigFilePath) => watchFile2(
extendedConfigFileName,
(_fileName, eventKind) => {
var _a;
updateCachedSystemWithFile(extendedConfigFileName, extendedConfigFilePath, eventKind);
if (extendedConfigCache)
cleanExtendedConfigCache(extendedConfigCache, extendedConfigFilePath, toPath3);
const projects = (_a = sharedExtendedConfigFileWatchers.get(extendedConfigFilePath)) == null ? void 0 : _a.projects;
if (!(projects == null ? void 0 : projects.size))
return;
projects.forEach((projectPath) => {
if (configFileName && toPath3(configFileName) === projectPath) {
reloadLevel = 2 /* Full */;
} else {
const config = parsedConfigs == null ? void 0 : parsedConfigs.get(projectPath);
if (config)
config.reloadLevel = 2 /* Full */;
resolutionCache.removeResolutionsFromProjectReferenceRedirects(projectPath);
}
scheduleProgramUpdate();
});
},
2e3 /* High */,
watchOptions2,
watchType
),
toPath3
);
}
function watchReferencedProject(configFileName2, configPath, commandLine) {
var _a, _b, _c, _d, _e;
commandLine.watcher || (commandLine.watcher = watchFile2(
configFileName2,
(_fileName, eventKind) => {
updateCachedSystemWithFile(configFileName2, configPath, eventKind);
const config = parsedConfigs == null ? void 0 : parsedConfigs.get(configPath);
if (config)
config.reloadLevel = 2 /* Full */;
resolutionCache.removeResolutionsFromProjectReferenceRedirects(configPath);
scheduleProgramUpdate();
},
2e3 /* High */,
((_a = commandLine.parsedCommandLine) == null ? void 0 : _a.watchOptions) || watchOptions,
WatchType.ConfigFileOfReferencedProject
));
if ((_b = commandLine.parsedCommandLine) == null ? void 0 : _b.wildcardDirectories) {
updateWatchingWildcardDirectories(
commandLine.watchedDirectories || (commandLine.watchedDirectories = /* @__PURE__ */ new Map()),
new Map(Object.entries((_c = commandLine.parsedCommandLine) == null ? void 0 : _c.wildcardDirectories)),
(directory, flags) => {
var _a2;
return watchDirectory(
directory,
(fileOrDirectory) => {
const fileOrDirectoryPath = toPath3(fileOrDirectory);
if (cachedDirectoryStructureHost) {
cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath);
}
nextSourceFileVersion(fileOrDirectoryPath);
const config = parsedConfigs == null ? void 0 : parsedConfigs.get(configPath);
if (!(config == null ? void 0 : config.parsedCommandLine))
return;
if (isIgnoredFileFromWildCardWatching({
watchedDirPath: toPath3(directory),
fileOrDirectory,
fileOrDirectoryPath,
configFileName: configFileName2,
options: config.parsedCommandLine.options,
program: config.parsedCommandLine.fileNames,
currentDirectory,
useCaseSensitiveFileNames,
writeLog,
toPath: toPath3
}))
return;
if (config.reloadLevel !== 2 /* Full */) {
config.reloadLevel = 1 /* Partial */;
scheduleProgramUpdate();
}
},
flags,
((_a2 = commandLine.parsedCommandLine) == null ? void 0 : _a2.watchOptions) || watchOptions,
WatchType.WildcardDirectoryOfReferencedProject
);
}
);
} else if (commandLine.watchedDirectories) {
clearMap(commandLine.watchedDirectories, closeFileWatcherOf);
commandLine.watchedDirectories = void 0;
}
updateExtendedConfigFilesWatches(
configPath,
(_d = commandLine.parsedCommandLine) == null ? void 0 : _d.options,
((_e = commandLine.parsedCommandLine) == null ? void 0 : _e.watchOptions) || watchOptions,
WatchType.ExtendedConfigOfReferencedProject
);
}
}
// src/compiler/tsbuild.ts
function resolveConfigFileProjectName(project) {
if (fileExtensionIs(project, ".json" /* Json */)) {
return project;
}
return combinePaths(project, "tsconfig.json");
}
// src/compiler/tsbuildPublic.ts
var minimumDate = /* @__PURE__ */ new Date(-864e13);
var maximumDate = /* @__PURE__ */ new Date(864e13);
function getOrCreateValueFromConfigFileMap(configFileMap, resolved, createT) {
const existingValue = configFileMap.get(resolved);
let newValue;
if (!existingValue) {
newValue = createT();
configFileMap.set(resolved, newValue);
}
return existingValue || newValue;
}
function getOrCreateValueMapFromConfigFileMap(configFileMap, resolved) {
return getOrCreateValueFromConfigFileMap(configFileMap, resolved, () => /* @__PURE__ */ new Map());
}
function getCurrentTime(host) {
return host.now ? host.now() : /* @__PURE__ */ new Date();
}
function isCircularBuildOrder(buildOrder) {
return !!buildOrder && !!buildOrder.buildOrder;
}
function getBuildOrderFromAnyBuildOrder(anyBuildOrder) {
return isCircularBuildOrder(anyBuildOrder) ? anyBuildOrder.buildOrder : anyBuildOrder;
}
function createBuilderStatusReporter(system, pretty) {
return (diagnostic) => {
let output = pretty ? `[${formatColorAndReset(getLocaleTimeString(system), "\x1B[90m" /* Grey */)}] ` : `${getLocaleTimeString(system)} - `;
output += `${flattenDiagnosticMessageText(diagnostic.messageText, system.newLine)}${system.newLine + system.newLine}`;
system.write(output);
};
}
function createSolutionBuilderHostBase(system, createProgram2, reportDiagnostic, reportSolutionBuilderStatus) {
const host = createProgramHost(system, createProgram2);
host.getModifiedTime = system.getModifiedTime ? (path) => system.getModifiedTime(path) : returnUndefined;
host.setModifiedTime = system.setModifiedTime ? (path, date) => system.setModifiedTime(path, date) : noop;
host.deleteFile = system.deleteFile ? (path) => system.deleteFile(path) : noop;
host.reportDiagnostic = reportDiagnostic || createDiagnosticReporter(system);
host.reportSolutionBuilderStatus = reportSolutionBuilderStatus || createBuilderStatusReporter(system);
host.now = maybeBind(system, system.now);
return host;
}
function createSolutionBuilderHost(system = sys, createProgram2, reportDiagnostic, reportSolutionBuilderStatus, reportErrorSummary2) {
const host = createSolutionBuilderHostBase(system, createProgram2, reportDiagnostic, reportSolutionBuilderStatus);
host.reportErrorSummary = reportErrorSummary2;
return host;
}
function createSolutionBuilderWithWatchHost(system = sys, createProgram2, reportDiagnostic, reportSolutionBuilderStatus, reportWatchStatus2) {
const host = createSolutionBuilderHostBase(system, createProgram2, reportDiagnostic, reportSolutionBuilderStatus);
const watchHost = createWatchHost(system, reportWatchStatus2);
copyProperties(host, watchHost);
return host;
}
function getCompilerOptionsOfBuildOptions(buildOptions) {
const result = {};
commonOptionsWithBuild.forEach((option) => {
if (hasProperty(buildOptions, option.name))
result[option.name] = buildOptions[option.name];
});
return result;
}
function createSolutionBuilder(host, rootNames, defaultOptions) {
return createSolutionBuilderWorker(
/*watch*/
false,
host,
rootNames,
defaultOptions
);
}
function createSolutionBuilderWithWatch(host, rootNames, defaultOptions, baseWatchOptions) {
return createSolutionBuilderWorker(
/*watch*/
true,
host,
rootNames,
defaultOptions,
baseWatchOptions
);
}
function createSolutionBuilderState(watch, hostOrHostWithWatch, rootNames, options, baseWatchOptions) {
const host = hostOrHostWithWatch;
const hostWithWatch = hostOrHostWithWatch;
const baseCompilerOptions = getCompilerOptionsOfBuildOptions(options);
const compilerHost = createCompilerHostFromProgramHost(host, () => state.projectCompilerOptions);
setGetSourceFileAsHashVersioned(compilerHost);
compilerHost.getParsedCommandLine = (fileName) => parseConfigFile(state, fileName, toResolvedConfigFilePath(state, fileName));
compilerHost.resolveModuleNameLiterals = maybeBind(host, host.resolveModuleNameLiterals);
compilerHost.resolveTypeReferenceDirectiveReferences = maybeBind(host, host.resolveTypeReferenceDirectiveReferences);
compilerHost.resolveLibrary = maybeBind(host, host.resolveLibrary);
compilerHost.resolveModuleNames = maybeBind(host, host.resolveModuleNames);
compilerHost.resolveTypeReferenceDirectives = maybeBind(host, host.resolveTypeReferenceDirectives);
compilerHost.getModuleResolutionCache = maybeBind(host, host.getModuleResolutionCache);
let moduleResolutionCache, typeReferenceDirectiveResolutionCache;
if (!compilerHost.resolveModuleNameLiterals && !compilerHost.resolveModuleNames) {
moduleResolutionCache = createModuleResolutionCache(compilerHost.getCurrentDirectory(), compilerHost.getCanonicalFileName);
compilerHost.resolveModuleNameLiterals = (moduleNames, containingFile, redirectedReference, options2, containingSourceFile) => loadWithModeAwareCache(
moduleNames,
containingFile,
redirectedReference,
options2,
containingSourceFile,
host,
moduleResolutionCache,
createModuleResolutionLoader
);
compilerHost.getModuleResolutionCache = () => moduleResolutionCache;
}
if (!compilerHost.resolveTypeReferenceDirectiveReferences && !compilerHost.resolveTypeReferenceDirectives) {
typeReferenceDirectiveResolutionCache = createTypeReferenceDirectiveResolutionCache(
compilerHost.getCurrentDirectory(),
compilerHost.getCanonicalFileName,
/*options*/
void 0,
moduleResolutionCache == null ? void 0 : moduleResolutionCache.getPackageJsonInfoCache()
);
compilerHost.resolveTypeReferenceDirectiveReferences = (typeDirectiveNames, containingFile, redirectedReference, options2, containingSourceFile) => loadWithModeAwareCache(
typeDirectiveNames,
containingFile,
redirectedReference,
options2,
containingSourceFile,
host,
typeReferenceDirectiveResolutionCache,
createTypeReferenceResolutionLoader
);
}
let libraryResolutionCache;
if (!compilerHost.resolveLibrary) {
libraryResolutionCache = createModuleResolutionCache(
compilerHost.getCurrentDirectory(),
compilerHost.getCanonicalFileName,
/*options*/
void 0,
moduleResolutionCache == null ? void 0 : moduleResolutionCache.getPackageJsonInfoCache()
);
compilerHost.resolveLibrary = (libraryName, resolveFrom, options2) => resolveLibrary(
libraryName,
resolveFrom,
options2,
host,
libraryResolutionCache
);
}
compilerHost.getBuildInfo = (fileName, configFilePath) => getBuildInfo3(
state,
fileName,
toResolvedConfigFilePath(state, configFilePath),
/*modifiedTime*/
void 0
);
const { watchFile: watchFile2, watchDirectory, writeLog } = createWatchFactory(hostWithWatch, options);
const state = {
host,
hostWithWatch,
parseConfigFileHost: parseConfigHostFromCompilerHostLike(host),
write: maybeBind(host, host.trace),
// State of solution
options,
baseCompilerOptions,
rootNames,
baseWatchOptions,
resolvedConfigFilePaths: /* @__PURE__ */ new Map(),
configFileCache: /* @__PURE__ */ new Map(),
projectStatus: /* @__PURE__ */ new Map(),
extendedConfigCache: /* @__PURE__ */ new Map(),
buildInfoCache: /* @__PURE__ */ new Map(),
outputTimeStamps: /* @__PURE__ */ new Map(),
builderPrograms: /* @__PURE__ */ new Map(),
diagnostics: /* @__PURE__ */ new Map(),
projectPendingBuild: /* @__PURE__ */ new Map(),
projectErrorsReported: /* @__PURE__ */ new Map(),
compilerHost,
moduleResolutionCache,
typeReferenceDirectiveResolutionCache,
libraryResolutionCache,
// Mutable state
buildOrder: void 0,
readFileWithCache: (f) => host.readFile(f),
projectCompilerOptions: baseCompilerOptions,
cache: void 0,
allProjectBuildPending: true,
needsSummary: true,
watchAllProjectsPending: watch,
// Watch state
watch,
allWatchedWildcardDirectories: /* @__PURE__ */ new Map(),
allWatchedInputFiles: /* @__PURE__ */ new Map(),
allWatchedConfigFiles: /* @__PURE__ */ new Map(),
allWatchedExtendedConfigFiles: /* @__PURE__ */ new Map(),
allWatchedPackageJsonFiles: /* @__PURE__ */ new Map(),
filesWatched: /* @__PURE__ */ new Map(),
lastCachedPackageJsonLookups: /* @__PURE__ */ new Map(),
timerToBuildInvalidatedProject: void 0,
reportFileChangeDetected: false,
watchFile: watchFile2,
watchDirectory,
writeLog
};
return state;
}
function toPath2(state, fileName) {
return toPath(fileName, state.compilerHost.getCurrentDirectory(), state.compilerHost.getCanonicalFileName);
}
function toResolvedConfigFilePath(state, fileName) {
const { resolvedConfigFilePaths } = state;
const path = resolvedConfigFilePaths.get(fileName);
if (path !== void 0)
return path;
const resolvedPath = toPath2(state, fileName);
resolvedConfigFilePaths.set(fileName, resolvedPath);
return resolvedPath;
}
function isParsedCommandLine(entry) {
return !!entry.options;
}
function getCachedParsedConfigFile(state, configFilePath) {
const value = state.configFileCache.get(configFilePath);
return value && isParsedCommandLine(value) ? value : void 0;
}
function parseConfigFile(state, configFileName, configFilePath) {
const { configFileCache } = state;
const value = configFileCache.get(configFilePath);
if (value) {
return isParsedCommandLine(value) ? value : void 0;
}
mark("SolutionBuilder::beforeConfigFileParsing");
let diagnostic;
const { parseConfigFileHost, baseCompilerOptions, baseWatchOptions, extendedConfigCache, host } = state;
let parsed;
if (host.getParsedCommandLine) {
parsed = host.getParsedCommandLine(configFileName);
if (!parsed)
diagnostic = createCompilerDiagnostic(Diagnostics.File_0_not_found, configFileName);
} else {
parseConfigFileHost.onUnRecoverableConfigFileDiagnostic = (d) => diagnostic = d;
parsed = getParsedCommandLineOfConfigFile(configFileName, baseCompilerOptions, parseConfigFileHost, extendedConfigCache, baseWatchOptions);
parseConfigFileHost.onUnRecoverableConfigFileDiagnostic = noop;
}
configFileCache.set(configFilePath, parsed || diagnostic);
mark("SolutionBuilder::afterConfigFileParsing");
measure("SolutionBuilder::Config file parsing", "SolutionBuilder::beforeConfigFileParsing", "SolutionBuilder::afterConfigFileParsing");
return parsed;
}
function resolveProjectName(state, name) {
return resolveConfigFileProjectName(resolvePath(state.compilerHost.getCurrentDirectory(), name));
}
function createBuildOrder(state, roots) {
const temporaryMarks = /* @__PURE__ */ new Map();
const permanentMarks = /* @__PURE__ */ new Map();
const circularityReportStack = [];
let buildOrder;
let circularDiagnostics;
for (const root of roots) {
visit(root);
}
return circularDiagnostics ? { buildOrder: buildOrder || emptyArray, circularDiagnostics } : buildOrder || emptyArray;
function visit(configFileName, inCircularContext) {
const projPath = toResolvedConfigFilePath(state, configFileName);
if (permanentMarks.has(projPath))
return;
if (temporaryMarks.has(projPath)) {
if (!inCircularContext) {
(circularDiagnostics || (circularDiagnostics = [])).push(
createCompilerDiagnostic(
Diagnostics.Project_references_may_not_form_a_circular_graph_Cycle_detected_Colon_0,
circularityReportStack.join("\r\n")
)
);
}
return;
}
temporaryMarks.set(projPath, true);
circularityReportStack.push(configFileName);
const parsed = parseConfigFile(state, configFileName, projPath);
if (parsed && parsed.projectReferences) {
for (const ref of parsed.projectReferences) {
const resolvedRefPath = resolveProjectName(state, ref.path);
visit(resolvedRefPath, inCircularContext || ref.circular);
}
}
circularityReportStack.pop();
permanentMarks.set(projPath, true);
(buildOrder || (buildOrder = [])).push(configFileName);
}
}
function getBuildOrder(state) {
return state.buildOrder || createStateBuildOrder(state);
}
function createStateBuildOrder(state) {
const buildOrder = createBuildOrder(state, state.rootNames.map((f) => resolveProjectName(state, f)));
state.resolvedConfigFilePaths.clear();
const currentProjects = new Map(
getBuildOrderFromAnyBuildOrder(buildOrder).map(
(resolved) => [toResolvedConfigFilePath(state, resolved), true]
)
);
const noopOnDelete = { onDeleteValue: noop };
mutateMapSkippingNewValues(state.configFileCache, currentProjects, noopOnDelete);
mutateMapSkippingNewValues(state.projectStatus, currentProjects, noopOnDelete);
mutateMapSkippingNewValues(state.builderPrograms, currentProjects, noopOnDelete);
mutateMapSkippingNewValues(state.diagnostics, currentProjects, noopOnDelete);
mutateMapSkippingNewValues(state.projectPendingBuild, currentProjects, noopOnDelete);
mutateMapSkippingNewValues(state.projectErrorsReported, currentProjects, noopOnDelete);
mutateMapSkippingNewValues(state.buildInfoCache, currentProjects, noopOnDelete);
mutateMapSkippingNewValues(state.outputTimeStamps, currentProjects, noopOnDelete);
if (state.watch) {
mutateMapSkippingNewValues(
state.allWatchedConfigFiles,
currentProjects,
{ onDeleteValue: closeFileWatcher }
);
state.allWatchedExtendedConfigFiles.forEach((watcher) => {
watcher.projects.forEach((project) => {
if (!currentProjects.has(project)) {
watcher.projects.delete(project);
}
});
watcher.close();
});
mutateMapSkippingNewValues(
state.allWatchedWildcardDirectories,
currentProjects,
{ onDeleteValue: (existingMap) => existingMap.forEach(closeFileWatcherOf) }
);
mutateMapSkippingNewValues(
state.allWatchedInputFiles,
currentProjects,
{ onDeleteValue: (existingMap) => existingMap.forEach(closeFileWatcher) }
);
mutateMapSkippingNewValues(
state.allWatchedPackageJsonFiles,
currentProjects,
{ onDeleteValue: (existingMap) => existingMap.forEach(closeFileWatcher) }
);
}
return state.buildOrder = buildOrder;
}
function getBuildOrderFor(state, project, onlyReferences) {
const resolvedProject = project && resolveProjectName(state, project);
const buildOrderFromState = getBuildOrder(state);
if (isCircularBuildOrder(buildOrderFromState))
return buildOrderFromState;
if (resolvedProject) {
const projectPath = toResolvedConfigFilePath(state, resolvedProject);
const projectIndex = findIndex(
buildOrderFromState,
(configFileName) => toResolvedConfigFilePath(state, configFileName) === projectPath
);
if (projectIndex === -1)
return void 0;
}
const buildOrder = resolvedProject ? createBuildOrder(state, [resolvedProject]) : buildOrderFromState;
Debug.assert(!isCircularBuildOrder(buildOrder));
Debug.assert(!onlyReferences || resolvedProject !== void 0);
Debug.assert(!onlyReferences || buildOrder[buildOrder.length - 1] === resolvedProject);
return onlyReferences ? buildOrder.slice(0, buildOrder.length - 1) : buildOrder;
}
function enableCache(state) {
if (state.cache) {
disableCache(state);
}
const { compilerHost, host } = state;
const originalReadFileWithCache = state.readFileWithCache;
const originalGetSourceFile = compilerHost.getSourceFile;
const {
originalReadFile,
originalFileExists,
originalDirectoryExists,
originalCreateDirectory,
originalWriteFile,
getSourceFileWithCache,
readFileWithCache
} = changeCompilerHostLikeToUseCache(
host,
(fileName) => toPath2(state, fileName),
(...args) => originalGetSourceFile.call(compilerHost, ...args)
);
state.readFileWithCache = readFileWithCache;
compilerHost.getSourceFile = getSourceFileWithCache;
state.cache = {
originalReadFile,
originalFileExists,
originalDirectoryExists,
originalCreateDirectory,
originalWriteFile,
originalReadFileWithCache,
originalGetSourceFile
};
}
function disableCache(state) {
if (!state.cache)
return;
const { cache, host, compilerHost, extendedConfigCache, moduleResolutionCache, typeReferenceDirectiveResolutionCache, libraryResolutionCache } = state;
host.readFile = cache.originalReadFile;
host.fileExists = cache.originalFileExists;
host.directoryExists = cache.originalDirectoryExists;
host.createDirectory = cache.originalCreateDirectory;
host.writeFile = cache.originalWriteFile;
compilerHost.getSourceFile = cache.originalGetSourceFile;
state.readFileWithCache = cache.originalReadFileWithCache;
extendedConfigCache.clear();
moduleResolutionCache == null ? void 0 : moduleResolutionCache.clear();
typeReferenceDirectiveResolutionCache == null ? void 0 : typeReferenceDirectiveResolutionCache.clear();
libraryResolutionCache == null ? void 0 : libraryResolutionCache.clear();
state.cache = void 0;
}
function clearProjectStatus(state, resolved) {
state.projectStatus.delete(resolved);
state.diagnostics.delete(resolved);
}
function addProjToQueue({ projectPendingBuild }, proj, reloadLevel) {
const value = projectPendingBuild.get(proj);
if (value === void 0) {
projectPendingBuild.set(proj, reloadLevel);
} else if (value < reloadLevel) {
projectPendingBuild.set(proj, reloadLevel);
}
}
function setupInitialBuild(state, cancellationToken) {
if (!state.allProjectBuildPending)
return;
state.allProjectBuildPending = false;
if (state.options.watch)
reportWatchStatus(state, Diagnostics.Starting_compilation_in_watch_mode);
enableCache(state);
const buildOrder = getBuildOrderFromAnyBuildOrder(getBuildOrder(state));
buildOrder.forEach(
(configFileName) => state.projectPendingBuild.set(
toResolvedConfigFilePath(state, configFileName),
0 /* None */
)
);
if (cancellationToken) {
cancellationToken.throwIfCancellationRequested();
}
}
function doneInvalidatedProject(state, projectPath) {
state.projectPendingBuild.delete(projectPath);
return state.diagnostics.has(projectPath) ? 1 /* DiagnosticsPresent_OutputsSkipped */ : 0 /* Success */;
}
function createUpdateOutputFileStampsProject(state, project, projectPath, config, buildOrder) {
let updateOutputFileStampsPending = true;
return {
kind: 2 /* UpdateOutputFileStamps */,
project,
projectPath,
buildOrder,
getCompilerOptions: () => config.options,
getCurrentDirectory: () => state.compilerHost.getCurrentDirectory(),
updateOutputFileStatmps: () => {
updateOutputTimestamps(state, config, projectPath);
updateOutputFileStampsPending = false;
},
done: () => {
if (updateOutputFileStampsPending) {
updateOutputTimestamps(state, config, projectPath);
}
mark("SolutionBuilder::Timestamps only updates");
return doneInvalidatedProject(state, projectPath);
}
};
}
function createBuildOrUpdateInvalidedProject(kind, state, project, projectPath, projectIndex, config, buildOrder) {
let step = kind === 0 /* Build */ ? 0 /* CreateProgram */ : 4 /* EmitBundle */;
let program;
let buildResult;
let invalidatedProjectOfBundle;
return kind === 0 /* Build */ ? {
kind,
project,
projectPath,
buildOrder,
getCompilerOptions: () => config.options,
getCurrentDirectory: () => state.compilerHost.getCurrentDirectory(),
getBuilderProgram: () => withProgramOrUndefined(identity),
getProgram: () => withProgramOrUndefined(
(program2) => program2.getProgramOrUndefined()
),
getSourceFile: (fileName) => withProgramOrUndefined(
(program2) => program2.getSourceFile(fileName)
),
getSourceFiles: () => withProgramOrEmptyArray(
(program2) => program2.getSourceFiles()
),
getOptionsDiagnostics: (cancellationToken) => withProgramOrEmptyArray(
(program2) => program2.getOptionsDiagnostics(cancellationToken)
),
getGlobalDiagnostics: (cancellationToken) => withProgramOrEmptyArray(
(program2) => program2.getGlobalDiagnostics(cancellationToken)
),
getConfigFileParsingDiagnostics: () => withProgramOrEmptyArray(
(program2) => program2.getConfigFileParsingDiagnostics()
),
getSyntacticDiagnostics: (sourceFile, cancellationToken) => withProgramOrEmptyArray(
(program2) => program2.getSyntacticDiagnostics(sourceFile, cancellationToken)
),
getAllDependencies: (sourceFile) => withProgramOrEmptyArray(
(program2) => program2.getAllDependencies(sourceFile)
),
getSemanticDiagnostics: (sourceFile, cancellationToken) => withProgramOrEmptyArray(
(program2) => program2.getSemanticDiagnostics(sourceFile, cancellationToken)
),
getSemanticDiagnosticsOfNextAffectedFile: (cancellationToken, ignoreSourceFile) => withProgramOrUndefined(
(program2) => program2.getSemanticDiagnosticsOfNextAffectedFile && program2.getSemanticDiagnosticsOfNextAffectedFile(cancellationToken, ignoreSourceFile)
),
emit: (targetSourceFile, writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers) => {
if (targetSourceFile || emitOnlyDtsFiles) {
return withProgramOrUndefined(
(program2) => {
var _a, _b;
return program2.emit(targetSourceFile, writeFile2, cancellationToken, emitOnlyDtsFiles, customTransformers || ((_b = (_a = state.host).getCustomTransformers) == null ? void 0 : _b.call(_a, project)));
}
);
}
executeSteps(2 /* SemanticDiagnostics */, cancellationToken);
if (step === 5 /* EmitBuildInfo */) {
return emitBuildInfo(writeFile2, cancellationToken);
}
if (step !== 3 /* Emit */)
return void 0;
return emit(writeFile2, cancellationToken, customTransformers);
},
done
} : {
kind,
project,
projectPath,
buildOrder,
getCompilerOptions: () => config.options,
getCurrentDirectory: () => state.compilerHost.getCurrentDirectory(),
emit: (writeFile2, customTransformers) => {
if (step !== 4 /* EmitBundle */)
return invalidatedProjectOfBundle;
return emitBundle(writeFile2, customTransformers);
},
done
};
function done(cancellationToken, writeFile2, customTransformers) {
executeSteps(8 /* Done */, cancellationToken, writeFile2, customTransformers);
if (kind === 0 /* Build */)
mark("SolutionBuilder::Projects built");
else
mark("SolutionBuilder::Bundles updated");
return doneInvalidatedProject(state, projectPath);
}
function withProgramOrUndefined(action) {
executeSteps(0 /* CreateProgram */);
return program && action(program);
}
function withProgramOrEmptyArray(action) {
return withProgramOrUndefined(action) || emptyArray;
}
function createProgram2() {
var _a, _b;
Debug.assert(program === void 0);
if (state.options.dry) {
reportStatus(state, Diagnostics.A_non_dry_build_would_build_project_0, project);
buildResult = 1 /* Success */;
step = 7 /* QueueReferencingProjects */;
return;
}
if (state.options.verbose)
reportStatus(state, Diagnostics.Building_project_0, project);
if (config.fileNames.length === 0) {
reportAndStoreErrors(state, projectPath, getConfigFileParsingDiagnostics(config));
buildResult = 0 /* None */;
step = 7 /* QueueReferencingProjects */;
return;
}
const { host, compilerHost } = state;
state.projectCompilerOptions = config.options;
(_a = state.moduleResolutionCache) == null ? void 0 : _a.update(config.options);
(_b = state.typeReferenceDirectiveResolutionCache) == null ? void 0 : _b.update(config.options);
program = host.createProgram(
config.fileNames,
config.options,
compilerHost,
getOldProgram(state, projectPath, config),
getConfigFileParsingDiagnostics(config),
config.projectReferences
);
if (state.watch) {
state.lastCachedPackageJsonLookups.set(projectPath, state.moduleResolutionCache && map(
state.moduleResolutionCache.getPackageJsonInfoCache().entries(),
([path, data]) => [state.host.realpath && data ? toPath2(state, state.host.realpath(path)) : path, data]
));
state.builderPrograms.set(projectPath, program);
}
step++;
}
function handleDiagnostics(diagnostics, errorFlags, errorType) {
if (diagnostics.length) {
({ buildResult, step } = buildErrors(
state,
projectPath,
program,
config,
diagnostics,
errorFlags,
errorType
));
} else {
step++;
}
}
function getSyntaxDiagnostics(cancellationToken) {
Debug.assertIsDefined(program);
handleDiagnostics(
[
...program.getConfigFileParsingDiagnostics(),
...program.getOptionsDiagnostics(cancellationToken),
...program.getGlobalDiagnostics(cancellationToken),
...program.getSyntacticDiagnostics(
/*sourceFile*/
void 0,
cancellationToken
)
],
8 /* SyntaxErrors */,
"Syntactic"
);
}
function getSemanticDiagnostics(cancellationToken) {
handleDiagnostics(
Debug.checkDefined(program).getSemanticDiagnostics(
/*sourceFile*/
void 0,
cancellationToken
),
16 /* TypeErrors */,
"Semantic"
);
}
function emit(writeFileCallback, cancellationToken, customTransformers) {
var _a, _b, _c;
Debug.assertIsDefined(program);
Debug.assert(step === 3 /* Emit */);
const saved = program.saveEmitState();
let declDiagnostics;
const reportDeclarationDiagnostics = (d) => (declDiagnostics || (declDiagnostics = [])).push(d);
const outputFiles = [];
const { emitResult } = emitFilesAndReportErrors(
program,
reportDeclarationDiagnostics,
/*write*/
void 0,
/*reportSummary*/
void 0,
(name, text, writeByteOrderMark, _onError, _sourceFiles, data) => outputFiles.push({ name, text, writeByteOrderMark, data }),
cancellationToken,
/*emitOnlyDtsFiles*/
false,
customTransformers || ((_b = (_a = state.host).getCustomTransformers) == null ? void 0 : _b.call(_a, project))
);
if (declDiagnostics) {
program.restoreEmitState(saved);
({ buildResult, step } = buildErrors(
state,
projectPath,
program,
config,
declDiagnostics,
32 /* DeclarationEmitErrors */,
"Declaration file"
));
return {
emitSkipped: true,
diagnostics: emitResult.diagnostics
};
}
const { host, compilerHost } = state;
const resultFlags = ((_c = program.hasChangedEmitSignature) == null ? void 0 : _c.call(program)) ? 0 /* None */ : 2 /* DeclarationOutputUnchanged */;
const emitterDiagnostics = createDiagnosticCollection();
const emittedOutputs = /* @__PURE__ */ new Map();
const options = program.getCompilerOptions();
const isIncremental = isIncrementalCompilation(options);
let outputTimeStampMap;
let now;
outputFiles.forEach(({ name, text, writeByteOrderMark, data }) => {
const path = toPath2(state, name);
emittedOutputs.set(toPath2(state, name), name);
if (data == null ? void 0 : data.buildInfo)
setBuildInfo(state, data.buildInfo, projectPath, options, resultFlags);
const modifiedTime = (data == null ? void 0 : data.differsOnlyInMap) ? getModifiedTime(state.host, name) : void 0;
writeFile(writeFileCallback ? { writeFile: writeFileCallback } : compilerHost, emitterDiagnostics, name, text, writeByteOrderMark);
if (data == null ? void 0 : data.differsOnlyInMap)
state.host.setModifiedTime(name, modifiedTime);
else if (!isIncremental && state.watch) {
(outputTimeStampMap || (outputTimeStampMap = getOutputTimeStampMap(state, projectPath))).set(path, now || (now = getCurrentTime(state.host)));
}
});
finishEmit(
emitterDiagnostics,
emittedOutputs,
outputFiles.length ? outputFiles[0].name : getFirstProjectOutput(config, !host.useCaseSensitiveFileNames()),
resultFlags
);
return emitResult;
}
function emitBuildInfo(writeFileCallback, cancellationToken) {
Debug.assertIsDefined(program);
Debug.assert(step === 5 /* EmitBuildInfo */);
const emitResult = program.emitBuildInfo((name, text, writeByteOrderMark, onError, sourceFiles, data) => {
if (data == null ? void 0 : data.buildInfo)
setBuildInfo(state, data.buildInfo, projectPath, program.getCompilerOptions(), 2 /* DeclarationOutputUnchanged */);
if (writeFileCallback)
writeFileCallback(name, text, writeByteOrderMark, onError, sourceFiles, data);
else
state.compilerHost.writeFile(name, text, writeByteOrderMark, onError, sourceFiles, data);
}, cancellationToken);
if (emitResult.diagnostics.length) {
reportErrors(state, emitResult.diagnostics);
state.diagnostics.set(projectPath, [...state.diagnostics.get(projectPath), ...emitResult.diagnostics]);
buildResult = 64 /* EmitErrors */ & buildResult;
}
if (emitResult.emittedFiles && state.write) {
emitResult.emittedFiles.forEach((name) => listEmittedFile(state, config, name));
}
afterProgramDone(state, program, config);
step = 7 /* QueueReferencingProjects */;
return emitResult;
}
function finishEmit(emitterDiagnostics, emittedOutputs, oldestOutputFileName, resultFlags) {
const emitDiagnostics = emitterDiagnostics.getDiagnostics();
if (emitDiagnostics.length) {
({ buildResult, step } = buildErrors(
state,
projectPath,
program,
config,
emitDiagnostics,
64 /* EmitErrors */,
"Emit"
));
return emitDiagnostics;
}
if (state.write) {
emittedOutputs.forEach((name) => listEmittedFile(state, config, name));
}
updateOutputTimestampsWorker(state, config, projectPath, Diagnostics.Updating_unchanged_output_timestamps_of_project_0, emittedOutputs);
state.diagnostics.delete(projectPath);
state.projectStatus.set(projectPath, {
type: 1 /* UpToDate */,
oldestOutputFileName
});
afterProgramDone(state, program, config);
step = 7 /* QueueReferencingProjects */;
buildResult = resultFlags;
return emitDiagnostics;
}
function emitBundle(writeFileCallback, customTransformers) {
var _a, _b, _c, _d;
Debug.assert(kind === 1 /* UpdateBundle */);
if (state.options.dry) {
reportStatus(state, Diagnostics.A_non_dry_build_would_update_output_of_project_0, project);
buildResult = 1 /* Success */;
step = 7 /* QueueReferencingProjects */;
return void 0;
}
if (state.options.verbose)
reportStatus(state, Diagnostics.Updating_output_of_project_0, project);
const { compilerHost } = state;
state.projectCompilerOptions = config.options;
(_b = (_a = state.host).beforeEmitBundle) == null ? void 0 : _b.call(_a, config);
const outputFiles = emitUsingBuildInfo(
config,
compilerHost,
(ref) => {
const refName = resolveProjectName(state, ref.path);
return parseConfigFile(state, refName, toResolvedConfigFilePath(state, refName));
},
customTransformers || ((_d = (_c = state.host).getCustomTransformers) == null ? void 0 : _d.call(_c, project))
);
if (isString(outputFiles)) {
reportStatus(state, Diagnostics.Cannot_update_output_of_project_0_because_there_was_error_reading_file_1, project, relName(state, outputFiles));
step = 6 /* BuildInvalidatedProjectOfBundle */;
return invalidatedProjectOfBundle = createBuildOrUpdateInvalidedProject(
0 /* Build */,
state,
project,
projectPath,
projectIndex,
config,
buildOrder
);
}
Debug.assert(!!outputFiles.length);
const emitterDiagnostics = createDiagnosticCollection();
const emittedOutputs = /* @__PURE__ */ new Map();
let resultFlags = 2 /* DeclarationOutputUnchanged */;
const existingBuildInfo = state.buildInfoCache.get(projectPath).buildInfo || void 0;
outputFiles.forEach(({ name, text, writeByteOrderMark, data }) => {
var _a2, _b2;
emittedOutputs.set(toPath2(state, name), name);
if (data == null ? void 0 : data.buildInfo) {
if (((_a2 = data.buildInfo.program) == null ? void 0 : _a2.outSignature) !== ((_b2 = existingBuildInfo == null ? void 0 : existingBuildInfo.program) == null ? void 0 : _b2.outSignature)) {
resultFlags &= ~2 /* DeclarationOutputUnchanged */;
}
setBuildInfo(state, data.buildInfo, projectPath, config.options, resultFlags);
}
writeFile(writeFileCallback ? { writeFile: writeFileCallback } : compilerHost, emitterDiagnostics, name, text, writeByteOrderMark);
});
const emitDiagnostics = finishEmit(
emitterDiagnostics,
emittedOutputs,
outputFiles[0].name,
resultFlags
);
return { emitSkipped: false, diagnostics: emitDiagnostics };
}
function executeSteps(till, cancellationToken, writeFile2, customTransformers) {
while (step <= till && step < 8 /* Done */) {
const currentStep = step;
switch (step) {
case 0 /* CreateProgram */:
createProgram2();
break;
case 1 /* SyntaxDiagnostics */:
getSyntaxDiagnostics(cancellationToken);
break;
case 2 /* SemanticDiagnostics */:
getSemanticDiagnostics(cancellationToken);
break;
case 3 /* Emit */:
emit(writeFile2, cancellationToken, customTransformers);
break;
case 5 /* EmitBuildInfo */:
emitBuildInfo(writeFile2, cancellationToken);
break;
case 4 /* EmitBundle */:
emitBundle(writeFile2, customTransformers);
break;
case 6 /* BuildInvalidatedProjectOfBundle */:
Debug.checkDefined(invalidatedProjectOfBundle).done(cancellationToken, writeFile2, customTransformers);
step = 8 /* Done */;
break;
case 7 /* QueueReferencingProjects */:
queueReferencingProjects(state, project, projectPath, projectIndex, config, buildOrder, Debug.checkDefined(buildResult));
step++;
break;
case 8 /* Done */:
default:
assertType(step);
}
Debug.assert(step > currentStep);
}
}
}
function needsBuild({ options }, status, config) {
if (status.type !== 3 /* OutOfDateWithPrepend */ || options.force)
return true;
return config.fileNames.length === 0 || !!getConfigFileParsingDiagnostics(config).length || !isIncrementalCompilation(config.options);
}
function getNextInvalidatedProjectCreateInfo(state, buildOrder, reportQueue) {
if (!state.projectPendingBuild.size)
return void 0;
if (isCircularBuildOrder(buildOrder))
return void 0;
const { options, projectPendingBuild } = state;
for (let projectIndex = 0; projectIndex < buildOrder.length; projectIndex++) {
const project = buildOrder[projectIndex];
const projectPath = toResolvedConfigFilePath(state, project);
const reloadLevel = state.projectPendingBuild.get(projectPath);
if (reloadLevel === void 0)
continue;
if (reportQueue) {
reportQueue = false;
reportBuildQueue(state, buildOrder);
}
const config = parseConfigFile(state, project, projectPath);
if (!config) {
reportParseConfigFileDiagnostic(state, projectPath);
projectPendingBuild.delete(projectPath);
continue;
}
if (reloadLevel === 2 /* Full */) {
watchConfigFile(state, project, projectPath, config);
watchExtendedConfigFiles(state, projectPath, config);
watchWildCardDirectories(state, project, projectPath, config);
watchInputFiles(state, project, projectPath, config);
watchPackageJsonFiles(state, project, projectPath, config);
} else if (reloadLevel === 1 /* Partial */) {
config.fileNames = getFileNamesFromConfigSpecs(config.options.configFile.configFileSpecs, getDirectoryPath(project), config.options, state.parseConfigFileHost);
updateErrorForNoInputFiles(config.fileNames, project, config.options.configFile.configFileSpecs, config.errors, canJsonReportNoInputFiles(config.raw));
watchInputFiles(state, project, projectPath, config);
watchPackageJsonFiles(state, project, projectPath, config);
}
const status = getUpToDateStatus(state, config, projectPath);
if (!options.force) {
if (status.type === 1 /* UpToDate */) {
verboseReportProjectStatus(state, project, status);
reportAndStoreErrors(state, projectPath, getConfigFileParsingDiagnostics(config));
projectPendingBuild.delete(projectPath);
if (options.dry) {
reportStatus(state, Diagnostics.Project_0_is_up_to_date, project);
}
continue;
}
if (status.type === 2 /* UpToDateWithUpstreamTypes */ || status.type === 15 /* UpToDateWithInputFileText */) {
reportAndStoreErrors(state, projectPath, getConfigFileParsingDiagnostics(config));
return {
kind: 2 /* UpdateOutputFileStamps */,
status,
project,
projectPath,
projectIndex,
config
};
}
}
if (status.type === 12 /* UpstreamBlocked */) {
verboseReportProjectStatus(state, project, status);
reportAndStoreErrors(state, projectPath, getConfigFileParsingDiagnostics(config));
projectPendingBuild.delete(projectPath);
if (options.verbose) {
reportStatus(
state,
status.upstreamProjectBlocked ? Diagnostics.Skipping_build_of_project_0_because_its_dependency_1_was_not_built : Diagnostics.Skipping_build_of_project_0_because_its_dependency_1_has_errors,
project,
status.upstreamProjectName
);
}
continue;
}
if (status.type === 16 /* ContainerOnly */) {
verboseReportProjectStatus(state, project, status);
reportAndStoreErrors(state, projectPath, getConfigFileParsingDiagnostics(config));
projectPendingBuild.delete(projectPath);
continue;
}
return {
kind: needsBuild(state, status, config) ? 0 /* Build */ : 1 /* UpdateBundle */,
status,
project,
projectPath,
projectIndex,
config
};
}
return void 0;
}
function createInvalidatedProjectWithInfo(state, info, buildOrder) {
verboseReportProjectStatus(state, info.project, info.status);
return info.kind !== 2 /* UpdateOutputFileStamps */ ? createBuildOrUpdateInvalidedProject(
info.kind,
state,
info.project,
info.projectPath,
info.projectIndex,
info.config,
buildOrder
) : createUpdateOutputFileStampsProject(
state,
info.project,
info.projectPath,
info.config,
buildOrder
);
}
function getNextInvalidatedProject(state, buildOrder, reportQueue) {
const info = getNextInvalidatedProjectCreateInfo(state, buildOrder, reportQueue);
if (!info)
return info;
return createInvalidatedProjectWithInfo(state, info, buildOrder);
}
function listEmittedFile({ write }, proj, file) {
if (write && proj.options.listEmittedFiles) {
write(`TSFILE: ${file}`);
}
}
function getOldProgram({ options, builderPrograms, compilerHost }, proj, parsed) {
if (options.force)
return void 0;
const value = builderPrograms.get(proj);
if (value)
return value;
return readBuilderProgram(parsed.options, compilerHost);
}
function afterProgramDone(state, program, config) {
if (program) {
if (state.write)
listFiles(program, state.write);
if (state.host.afterProgramEmitAndDiagnostics) {
state.host.afterProgramEmitAndDiagnostics(program);
}
program.releaseProgram();
} else if (state.host.afterEmitBundle) {
state.host.afterEmitBundle(config);
}
state.projectCompilerOptions = state.baseCompilerOptions;
}
function buildErrors(state, resolvedPath, program, config, diagnostics, buildResult, errorType) {
const canEmitBuildInfo = program && !outFile(program.getCompilerOptions());
reportAndStoreErrors(state, resolvedPath, diagnostics);
state.projectStatus.set(resolvedPath, { type: 0 /* Unbuildable */, reason: `${errorType} errors` });
if (canEmitBuildInfo)
return { buildResult, step: 5 /* EmitBuildInfo */ };
afterProgramDone(state, program, config);
return { buildResult, step: 7 /* QueueReferencingProjects */ };
}
function isFileWatcherWithModifiedTime(value) {
return !!value.watcher;
}
function getModifiedTime2(state, fileName) {
const path = toPath2(state, fileName);
const existing = state.filesWatched.get(path);
if (state.watch && !!existing) {
if (!isFileWatcherWithModifiedTime(existing))
return existing;
if (existing.modifiedTime)
return existing.modifiedTime;
}
const result = getModifiedTime(state.host, fileName);
if (state.watch) {
if (existing)
existing.modifiedTime = result;
else
state.filesWatched.set(path, result);
}
return result;
}
function watchFile(state, file, callback, pollingInterval, options, watchType, project) {
const path = toPath2(state, file);
const existing = state.filesWatched.get(path);
if (existing && isFileWatcherWithModifiedTime(existing)) {
existing.callbacks.push(callback);
} else {
const watcher = state.watchFile(
file,
(fileName, eventKind, modifiedTime) => {
const existing2 = Debug.checkDefined(state.filesWatched.get(path));
Debug.assert(isFileWatcherWithModifiedTime(existing2));
existing2.modifiedTime = modifiedTime;
existing2.callbacks.forEach((cb) => cb(fileName, eventKind, modifiedTime));
},
pollingInterval,
options,
watchType,
project
);
state.filesWatched.set(path, { callbacks: [callback], watcher, modifiedTime: existing });
}
return {
close: () => {
const existing2 = Debug.checkDefined(state.filesWatched.get(path));
Debug.assert(isFileWatcherWithModifiedTime(existing2));
if (existing2.callbacks.length === 1) {
state.filesWatched.delete(path);
closeFileWatcherOf(existing2);
} else {
unorderedRemoveItem(existing2.callbacks, callback);
}
}
};
}
function getOutputTimeStampMap(state, resolvedConfigFilePath) {
if (!state.watch)
return void 0;
let result = state.outputTimeStamps.get(resolvedConfigFilePath);
if (!result)
state.outputTimeStamps.set(resolvedConfigFilePath, result = /* @__PURE__ */ new Map());
return result;
}
function setBuildInfo(state, buildInfo, resolvedConfigPath, options, resultFlags) {
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(options);
const existing = getBuildInfoCacheEntry(state, buildInfoPath, resolvedConfigPath);
const modifiedTime = getCurrentTime(state.host);
if (existing) {
existing.buildInfo = buildInfo;
existing.modifiedTime = modifiedTime;
if (!(resultFlags & 2 /* DeclarationOutputUnchanged */))
existing.latestChangedDtsTime = modifiedTime;
} else {
state.buildInfoCache.set(resolvedConfigPath, {
path: toPath2(state, buildInfoPath),
buildInfo,
modifiedTime,
latestChangedDtsTime: resultFlags & 2 /* DeclarationOutputUnchanged */ ? void 0 : modifiedTime
});
}
}
function getBuildInfoCacheEntry(state, buildInfoPath, resolvedConfigPath) {
const path = toPath2(state, buildInfoPath);
const existing = state.buildInfoCache.get(resolvedConfigPath);
return (existing == null ? void 0 : existing.path) === path ? existing : void 0;
}
function getBuildInfo3(state, buildInfoPath, resolvedConfigPath, modifiedTime) {
const path = toPath2(state, buildInfoPath);
const existing = state.buildInfoCache.get(resolvedConfigPath);
if (existing !== void 0 && existing.path === path) {
return existing.buildInfo || void 0;
}
const value = state.readFileWithCache(buildInfoPath);
const buildInfo = value ? getBuildInfo(buildInfoPath, value) : void 0;
state.buildInfoCache.set(resolvedConfigPath, { path, buildInfo: buildInfo || false, modifiedTime: modifiedTime || missingFileModifiedTime });
return buildInfo;
}
function checkConfigFileUpToDateStatus(state, configFile, oldestOutputFileTime, oldestOutputFileName) {
const tsconfigTime = getModifiedTime2(state, configFile);
if (oldestOutputFileTime < tsconfigTime) {
return {
type: 6 /* OutOfDateWithSelf */,
outOfDateOutputFileName: oldestOutputFileName,
newerInputFileName: configFile
};
}
}
function getUpToDateStatusWorker(state, project, resolvedPath) {
var _a, _b;
if (!project.fileNames.length && !canJsonReportNoInputFiles(project.raw)) {
return {
type: 16 /* ContainerOnly */
};
}
let referenceStatuses;
const force = !!state.options.force;
if (project.projectReferences) {
state.projectStatus.set(resolvedPath, { type: 13 /* ComputingUpstream */ });
for (const ref of project.projectReferences) {
const resolvedRef = resolveProjectReferencePath(ref);
const resolvedRefPath = toResolvedConfigFilePath(state, resolvedRef);
const resolvedConfig = parseConfigFile(state, resolvedRef, resolvedRefPath);
const refStatus = getUpToDateStatus(state, resolvedConfig, resolvedRefPath);
if (refStatus.type === 13 /* ComputingUpstream */ || refStatus.type === 16 /* ContainerOnly */) {
continue;
}
if (refStatus.type === 0 /* Unbuildable */ || refStatus.type === 12 /* UpstreamBlocked */) {
return {
type: 12 /* UpstreamBlocked */,
upstreamProjectName: ref.path,
upstreamProjectBlocked: refStatus.type === 12 /* UpstreamBlocked */
};
}
if (refStatus.type !== 1 /* UpToDate */) {
return {
type: 11 /* UpstreamOutOfDate */,
upstreamProjectName: ref.path
};
}
if (!force)
(referenceStatuses || (referenceStatuses = [])).push({ ref, refStatus, resolvedRefPath, resolvedConfig });
}
}
if (force)
return { type: 17 /* ForceBuild */ };
const { host } = state;
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(project.options);
let oldestOutputFileName;
let oldestOutputFileTime = maximumDate;
let buildInfoTime;
let buildInfoProgram;
let buildInfoVersionMap;
if (buildInfoPath) {
const buildInfoCacheEntry2 = getBuildInfoCacheEntry(state, buildInfoPath, resolvedPath);
buildInfoTime = (buildInfoCacheEntry2 == null ? void 0 : buildInfoCacheEntry2.modifiedTime) || getModifiedTime(host, buildInfoPath);
if (buildInfoTime === missingFileModifiedTime) {
if (!buildInfoCacheEntry2) {
state.buildInfoCache.set(resolvedPath, {
path: toPath2(state, buildInfoPath),
buildInfo: false,
modifiedTime: buildInfoTime
});
}
return {
type: 4 /* OutputMissing */,
missingOutputFileName: buildInfoPath
};
}
const buildInfo = getBuildInfo3(state, buildInfoPath, resolvedPath, buildInfoTime);
if (!buildInfo) {
return {
type: 5 /* ErrorReadingFile */,
fileName: buildInfoPath
};
}
if ((buildInfo.bundle || buildInfo.program) && buildInfo.version !== version) {
return {
type: 14 /* TsVersionOutputOfDate */,
version: buildInfo.version
};
}
if (buildInfo.program) {
if (((_a = buildInfo.program.changeFileSet) == null ? void 0 : _a.length) || (!project.options.noEmit ? (_b = buildInfo.program.affectedFilesPendingEmit) == null ? void 0 : _b.length : some(buildInfo.program.semanticDiagnosticsPerFile, isArray))) {
return {
type: 8 /* OutOfDateBuildInfo */,
buildInfoFile: buildInfoPath
};
}
if (!project.options.noEmit && getPendingEmitKind(project.options, buildInfo.program.options || {})) {
return {
type: 9 /* OutOfDateOptions */,
buildInfoFile: buildInfoPath
};
}
buildInfoProgram = buildInfo.program;
}
oldestOutputFileTime = buildInfoTime;
oldestOutputFileName = buildInfoPath;
}
let newestInputFileName = void 0;
let newestInputFileTime = minimumDate;
let pseudoInputUpToDate = false;
const seenRoots = /* @__PURE__ */ new Set();
for (const inputFile of project.fileNames) {
const inputTime = getModifiedTime2(state, inputFile);
if (inputTime === missingFileModifiedTime) {
return {
type: 0 /* Unbuildable */,
reason: `${inputFile} does not exist`
};
}
if (buildInfoTime && buildInfoTime < inputTime) {
let version2;
let currentVersion;
if (buildInfoProgram) {
if (!buildInfoVersionMap)
buildInfoVersionMap = getBuildInfoFileVersionMap(buildInfoProgram, buildInfoPath, host);
version2 = buildInfoVersionMap.fileInfos.get(toPath2(state, inputFile));
const text = version2 ? state.readFileWithCache(inputFile) : void 0;
currentVersion = text !== void 0 ? getSourceFileVersionAsHashFromText(host, text) : void 0;
if (version2 && version2 === currentVersion)
pseudoInputUpToDate = true;
}
if (!version2 || version2 !== currentVersion) {
return {
type: 6 /* OutOfDateWithSelf */,
outOfDateOutputFileName: buildInfoPath,
newerInputFileName: inputFile
};
}
}
if (inputTime > newestInputFileTime) {
newestInputFileName = inputFile;
newestInputFileTime = inputTime;
}
if (buildInfoProgram)
seenRoots.add(toPath2(state, inputFile));
}
if (buildInfoProgram) {
if (!buildInfoVersionMap)
buildInfoVersionMap = getBuildInfoFileVersionMap(buildInfoProgram, buildInfoPath, host);
for (const existingRoot of buildInfoVersionMap.roots) {
if (!seenRoots.has(existingRoot)) {
return {
type: 10 /* OutOfDateRoots */,
buildInfoFile: buildInfoPath,
inputFile: existingRoot
};
}
}
}
if (!buildInfoPath) {
const outputs = getAllProjectOutputs(project, !host.useCaseSensitiveFileNames());
const outputTimeStampMap = getOutputTimeStampMap(state, resolvedPath);
for (const output of outputs) {
const path = toPath2(state, output);
let outputTime = outputTimeStampMap == null ? void 0 : outputTimeStampMap.get(path);
if (!outputTime) {
outputTime = getModifiedTime(state.host, output);
outputTimeStampMap == null ? void 0 : outputTimeStampMap.set(path, outputTime);
}
if (outputTime === missingFileModifiedTime) {
return {
type: 4 /* OutputMissing */,
missingOutputFileName: output
};
}
if (outputTime < newestInputFileTime) {
return {
type: 6 /* OutOfDateWithSelf */,
outOfDateOutputFileName: output,
newerInputFileName: newestInputFileName
};
}
if (outputTime < oldestOutputFileTime) {
oldestOutputFileTime = outputTime;
oldestOutputFileName = output;
}
}
}
const buildInfoCacheEntry = state.buildInfoCache.get(resolvedPath);
let pseudoUpToDate = false;
let usesPrepend = false;
let upstreamChangedProject;
if (referenceStatuses) {
for (const { ref, refStatus, resolvedConfig, resolvedRefPath } of referenceStatuses) {
usesPrepend = usesPrepend || !!ref.prepend;
if (refStatus.newestInputFileTime && refStatus.newestInputFileTime <= oldestOutputFileTime) {
continue;
}
if (buildInfoCacheEntry && hasSameBuildInfo(state, buildInfoCacheEntry, resolvedRefPath)) {
return {
type: 7 /* OutOfDateWithUpstream */,
outOfDateOutputFileName: buildInfoPath,
newerProjectName: ref.path
};
}
const newestDeclarationFileContentChangedTime = getLatestChangedDtsTime(state, resolvedConfig.options, resolvedRefPath);
if (newestDeclarationFileContentChangedTime && newestDeclarationFileContentChangedTime <= oldestOutputFileTime) {
pseudoUpToDate = true;
upstreamChangedProject = ref.path;
continue;
}
Debug.assert(oldestOutputFileName !== void 0, "Should have an oldest output filename here");
return {
type: 7 /* OutOfDateWithUpstream */,
outOfDateOutputFileName: oldestOutputFileName,
newerProjectName: ref.path
};
}
}
const configStatus = checkConfigFileUpToDateStatus(state, project.options.configFilePath, oldestOutputFileTime, oldestOutputFileName);
if (configStatus)
return configStatus;
const extendedConfigStatus = forEach(project.options.configFile.extendedSourceFiles || emptyArray, (configFile) => checkConfigFileUpToDateStatus(state, configFile, oldestOutputFileTime, oldestOutputFileName));
if (extendedConfigStatus)
return extendedConfigStatus;
const dependentPackageFileStatus = forEach(
state.lastCachedPackageJsonLookups.get(resolvedPath) || emptyArray,
([path]) => checkConfigFileUpToDateStatus(state, path, oldestOutputFileTime, oldestOutputFileName)
);
if (dependentPackageFileStatus)
return dependentPackageFileStatus;
if (usesPrepend && pseudoUpToDate) {
return {
type: 3 /* OutOfDateWithPrepend */,
outOfDateOutputFileName: oldestOutputFileName,
newerProjectName: upstreamChangedProject
};
}
return {
type: pseudoUpToDate ? 2 /* UpToDateWithUpstreamTypes */ : pseudoInputUpToDate ? 15 /* UpToDateWithInputFileText */ : 1 /* UpToDate */,
newestInputFileTime,
newestInputFileName,
oldestOutputFileName
};
}
function hasSameBuildInfo(state, buildInfoCacheEntry, resolvedRefPath) {
const refBuildInfo = state.buildInfoCache.get(resolvedRefPath);
return refBuildInfo.path === buildInfoCacheEntry.path;
}
function getUpToDateStatus(state, project, resolvedPath) {
if (project === void 0) {
return { type: 0 /* Unbuildable */, reason: "File deleted mid-build" };
}
const prior = state.projectStatus.get(resolvedPath);
if (prior !== void 0) {
return prior;
}
mark("SolutionBuilder::beforeUpToDateCheck");
const actual = getUpToDateStatusWorker(state, project, resolvedPath);
mark("SolutionBuilder::afterUpToDateCheck");
measure("SolutionBuilder::Up-to-date check", "SolutionBuilder::beforeUpToDateCheck", "SolutionBuilder::afterUpToDateCheck");
state.projectStatus.set(resolvedPath, actual);
return actual;
}
function updateOutputTimestampsWorker(state, proj, projectPath, verboseMessage, skipOutputs) {
if (proj.options.noEmit)
return;
let now;
const buildInfoPath = getTsBuildInfoEmitOutputFilePath(proj.options);
if (buildInfoPath) {
if (!(skipOutputs == null ? void 0 : skipOutputs.has(toPath2(state, buildInfoPath)))) {
if (!!state.options.verbose)
reportStatus(state, verboseMessage, proj.options.configFilePath);
state.host.setModifiedTime(buildInfoPath, now = getCurrentTime(state.host));
getBuildInfoCacheEntry(state, buildInfoPath, projectPath).modifiedTime = now;
}
state.outputTimeStamps.delete(projectPath);
return;
}
const { host } = state;
const outputs = getAllProjectOutputs(proj, !host.useCaseSensitiveFileNames());
const outputTimeStampMap = getOutputTimeStampMap(state, projectPath);
const modifiedOutputs = outputTimeStampMap ? /* @__PURE__ */ new Set() : void 0;
if (!skipOutputs || outputs.length !== skipOutputs.size) {
let reportVerbose = !!state.options.verbose;
for (const file of outputs) {
const path = toPath2(state, file);
if (skipOutputs == null ? void 0 : skipOutputs.has(path))
continue;
if (reportVerbose) {
reportVerbose = false;
reportStatus(state, verboseMessage, proj.options.configFilePath);
}
host.setModifiedTime(file, now || (now = getCurrentTime(state.host)));
if (outputTimeStampMap) {
outputTimeStampMap.set(path, now);
modifiedOutputs.add(path);
}
}
}
outputTimeStampMap == null ? void 0 : outputTimeStampMap.forEach((_value, key) => {
if (!(skipOutputs == null ? void 0 : skipOutputs.has(key)) && !modifiedOutputs.has(key))
outputTimeStampMap.delete(key);
});
}
function getLatestChangedDtsTime(state, options, resolvedConfigPath) {
if (!options.composite)
return void 0;
const entry = Debug.checkDefined(state.buildInfoCache.get(resolvedConfigPath));
if (entry.latestChangedDtsTime !== void 0)
return entry.latestChangedDtsTime || void 0;
const latestChangedDtsTime = entry.buildInfo && entry.buildInfo.program && entry.buildInfo.program.latestChangedDtsFile ? state.host.getModifiedTime(getNormalizedAbsolutePath(entry.buildInfo.program.latestChangedDtsFile, getDirectoryPath(entry.path))) : void 0;
entry.latestChangedDtsTime = latestChangedDtsTime || false;
return latestChangedDtsTime;
}
function updateOutputTimestamps(state, proj, resolvedPath) {
if (state.options.dry) {
return reportStatus(state, Diagnostics.A_non_dry_build_would_update_timestamps_for_output_of_project_0, proj.options.configFilePath);
}
updateOutputTimestampsWorker(state, proj, resolvedPath, Diagnostics.Updating_output_timestamps_of_project_0);
state.projectStatus.set(resolvedPath, {
type: 1 /* UpToDate */,
oldestOutputFileName: getFirstProjectOutput(proj, !state.host.useCaseSensitiveFileNames())
});
}
function queueReferencingProjects(state, project, projectPath, projectIndex, config, buildOrder, buildResult) {
if (buildResult & 124 /* AnyErrors */)
return;
if (!config.options.composite)
return;
for (let index = projectIndex + 1; index < buildOrder.length; index++) {
const nextProject = buildOrder[index];
const nextProjectPath = toResolvedConfigFilePath(state, nextProject);
if (state.projectPendingBuild.has(nextProjectPath))
continue;
const nextProjectConfig = parseConfigFile(state, nextProject, nextProjectPath);
if (!nextProjectConfig || !nextProjectConfig.projectReferences)
continue;
for (const ref of nextProjectConfig.projectReferences) {
const resolvedRefPath = resolveProjectName(state, ref.path);
if (toResolvedConfigFilePath(state, resolvedRefPath) !== projectPath)
continue;
const status = state.projectStatus.get(nextProjectPath);
if (status) {
switch (status.type) {
case 1 /* UpToDate */:
if (buildResult & 2 /* DeclarationOutputUnchanged */) {
if (ref.prepend) {
state.projectStatus.set(nextProjectPath, {
type: 3 /* OutOfDateWithPrepend */,
outOfDateOutputFileName: status.oldestOutputFileName,
newerProjectName: project
});
} else {
status.type = 2 /* UpToDateWithUpstreamTypes */;
}
break;
}
case 15 /* UpToDateWithInputFileText */:
case 2 /* UpToDateWithUpstreamTypes */:
case 3 /* OutOfDateWithPrepend */:
if (!(buildResult & 2 /* DeclarationOutputUnchanged */)) {
state.projectStatus.set(nextProjectPath, {
type: 7 /* OutOfDateWithUpstream */,
outOfDateOutputFileName: status.type === 3 /* OutOfDateWithPrepend */ ? status.outOfDateOutputFileName : status.oldestOutputFileName,
newerProjectName: project
});
}
break;
case 12 /* UpstreamBlocked */:
if (toResolvedConfigFilePath(state, resolveProjectName(state, status.upstreamProjectName)) === projectPath) {
clearProjectStatus(state, nextProjectPath);
}
break;
}
}
addProjToQueue(state, nextProjectPath, 0 /* None */);
break;
}
}
}
function build(state, project, cancellationToken, writeFile2, getCustomTransformers, onlyReferences) {
mark("SolutionBuilder::beforeBuild");
const result = buildWorker(state, project, cancellationToken, writeFile2, getCustomTransformers, onlyReferences);
mark("SolutionBuilder::afterBuild");
measure("SolutionBuilder::Build", "SolutionBuilder::beforeBuild", "SolutionBuilder::afterBuild");
return result;
}
function buildWorker(state, project, cancellationToken, writeFile2, getCustomTransformers, onlyReferences) {
const buildOrder = getBuildOrderFor(state, project, onlyReferences);
if (!buildOrder)
return 3 /* InvalidProject_OutputsSkipped */;
setupInitialBuild(state, cancellationToken);
let reportQueue = true;
let successfulProjects = 0;
while (true) {
const invalidatedProject = getNextInvalidatedProject(state, buildOrder, reportQueue);
if (!invalidatedProject)
break;
reportQueue = false;
invalidatedProject.done(cancellationToken, writeFile2, getCustomTransformers == null ? void 0 : getCustomTransformers(invalidatedProject.project));
if (!state.diagnostics.has(invalidatedProject.projectPath))
successfulProjects++;
}
disableCache(state);
reportErrorSummary(state, buildOrder);
startWatching(state, buildOrder);
return isCircularBuildOrder(buildOrder) ? 4 /* ProjectReferenceCycle_OutputsSkipped */ : !buildOrder.some((p) => state.diagnostics.has(toResolvedConfigFilePath(state, p))) ? 0 /* Success */ : successfulProjects ? 2 /* DiagnosticsPresent_OutputsGenerated */ : 1 /* DiagnosticsPresent_OutputsSkipped */;
}
function clean(state, project, onlyReferences) {
mark("SolutionBuilder::beforeClean");
const result = cleanWorker(state, project, onlyReferences);
mark("SolutionBuilder::afterClean");
measure("SolutionBuilder::Clean", "SolutionBuilder::beforeClean", "SolutionBuilder::afterClean");
return result;
}
function cleanWorker(state, project, onlyReferences) {
const buildOrder = getBuildOrderFor(state, project, onlyReferences);
if (!buildOrder)
return 3 /* InvalidProject_OutputsSkipped */;
if (isCircularBuildOrder(buildOrder)) {
reportErrors(state, buildOrder.circularDiagnostics);
return 4 /* ProjectReferenceCycle_OutputsSkipped */;
}
const { options, host } = state;
const filesToDelete = options.dry ? [] : void 0;
for (const proj of buildOrder) {
const resolvedPath = toResolvedConfigFilePath(state, proj);
const parsed = parseConfigFile(state, proj, resolvedPath);
if (parsed === void 0) {
reportParseConfigFileDiagnostic(state, resolvedPath);
continue;
}
const outputs = getAllProjectOutputs(parsed, !host.useCaseSensitiveFileNames());
if (!outputs.length)
continue;
const inputFileNames = new Set(parsed.fileNames.map((f) => toPath2(state, f)));
for (const output of outputs) {
if (inputFileNames.has(toPath2(state, output)))
continue;
if (host.fileExists(output)) {
if (filesToDelete) {
filesToDelete.push(output);
} else {
host.deleteFile(output);
invalidateProject(state, resolvedPath, 0 /* None */);
}
}
}
}
if (filesToDelete) {
reportStatus(state, Diagnostics.A_non_dry_build_would_delete_the_following_files_Colon_0, filesToDelete.map((f) => `\r
* ${f}`).join(""));
}
return 0 /* Success */;
}
function invalidateProject(state, resolved, reloadLevel) {
if (state.host.getParsedCommandLine && reloadLevel === 1 /* Partial */) {
reloadLevel = 2 /* Full */;
}
if (reloadLevel === 2 /* Full */) {
state.configFileCache.delete(resolved);
state.buildOrder = void 0;
}
state.needsSummary = true;
clearProjectStatus(state, resolved);
addProjToQueue(state, resolved, reloadLevel);
enableCache(state);
}
function invalidateProjectAndScheduleBuilds(state, resolvedPath, reloadLevel) {
state.reportFileChangeDetected = true;
invalidateProject(state, resolvedPath, reloadLevel);
scheduleBuildInvalidatedProject(
state,
250,
/*changeDetected*/
true
);
}
function scheduleBuildInvalidatedProject(state, time, changeDetected) {
const { hostWithWatch } = state;
if (!hostWithWatch.setTimeout || !hostWithWatch.clearTimeout) {
return;
}
if (state.timerToBuildInvalidatedProject) {
hostWithWatch.clearTimeout(state.timerToBuildInvalidatedProject);
}
state.timerToBuildInvalidatedProject = hostWithWatch.setTimeout(buildNextInvalidatedProject, time, "timerToBuildInvalidatedProject", state, changeDetected);
}
function buildNextInvalidatedProject(_timeoutType, state, changeDetected) {
mark("SolutionBuilder::beforeBuild");
const buildOrder = buildNextInvalidatedProjectWorker(state, changeDetected);
mark("SolutionBuilder::afterBuild");
measure("SolutionBuilder::Build", "SolutionBuilder::beforeBuild", "SolutionBuilder::afterBuild");
if (buildOrder)
reportErrorSummary(state, buildOrder);
}
function buildNextInvalidatedProjectWorker(state, changeDetected) {
state.timerToBuildInvalidatedProject = void 0;
if (state.reportFileChangeDetected) {
state.reportFileChangeDetected = false;
state.projectErrorsReported.clear();
reportWatchStatus(state, Diagnostics.File_change_detected_Starting_incremental_compilation);
}
let projectsBuilt = 0;
const buildOrder = getBuildOrder(state);
const invalidatedProject = getNextInvalidatedProject(
state,
buildOrder,
/*reportQueue*/
false
);
if (invalidatedProject) {
invalidatedProject.done();
projectsBuilt++;
while (state.projectPendingBuild.size) {
if (state.timerToBuildInvalidatedProject)
return;
const info = getNextInvalidatedProjectCreateInfo(
state,
buildOrder,
/*reportQueue*/
false
);
if (!info)
break;
if (info.kind !== 2 /* UpdateOutputFileStamps */ && (changeDetected || projectsBuilt === 5)) {
scheduleBuildInvalidatedProject(
state,
100,
/*changeDetected*/
false
);
return;
}
const project = createInvalidatedProjectWithInfo(state, info, buildOrder);
project.done();
if (info.kind !== 2 /* UpdateOutputFileStamps */)
projectsBuilt++;
}
}
disableCache(state);
return buildOrder;
}
function watchConfigFile(state, resolved, resolvedPath, parsed) {
if (!state.watch || state.allWatchedConfigFiles.has(resolvedPath))
return;
state.allWatchedConfigFiles.set(resolvedPath, watchFile(
state,
resolved,
() => invalidateProjectAndScheduleBuilds(state, resolvedPath, 2 /* Full */),
2e3 /* High */,
parsed == null ? void 0 : parsed.watchOptions,
WatchType.ConfigFile,
resolved
));
}
function watchExtendedConfigFiles(state, resolvedPath, parsed) {
updateSharedExtendedConfigFileWatcher(
resolvedPath,
parsed == null ? void 0 : parsed.options,
state.allWatchedExtendedConfigFiles,
(extendedConfigFileName, extendedConfigFilePath) => watchFile(
state,
extendedConfigFileName,
() => {
var _a;
return (_a = state.allWatchedExtendedConfigFiles.get(extendedConfigFilePath)) == null ? void 0 : _a.projects.forEach((projectConfigFilePath) => invalidateProjectAndScheduleBuilds(state, projectConfigFilePath, 2 /* Full */));
},
2e3 /* High */,
parsed == null ? void 0 : parsed.watchOptions,
WatchType.ExtendedConfigFile
),
(fileName) => toPath2(state, fileName)
);
}
function watchWildCardDirectories(state, resolved, resolvedPath, parsed) {
if (!state.watch)
return;
updateWatchingWildcardDirectories(
getOrCreateValueMapFromConfigFileMap(state.allWatchedWildcardDirectories, resolvedPath),
new Map(Object.entries(parsed.wildcardDirectories)),
(dir, flags) => state.watchDirectory(
dir,
(fileOrDirectory) => {
var _a;
if (isIgnoredFileFromWildCardWatching({
watchedDirPath: toPath2(state, dir),
fileOrDirectory,
fileOrDirectoryPath: toPath2(state, fileOrDirectory),
configFileName: resolved,
currentDirectory: state.compilerHost.getCurrentDirectory(),
options: parsed.options,
program: state.builderPrograms.get(resolvedPath) || ((_a = getCachedParsedConfigFile(state, resolvedPath)) == null ? void 0 : _a.fileNames),
useCaseSensitiveFileNames: state.parseConfigFileHost.useCaseSensitiveFileNames,
writeLog: (s) => state.writeLog(s),
toPath: (fileName) => toPath2(state, fileName)
}))
return;
invalidateProjectAndScheduleBuilds(state, resolvedPath, 1 /* Partial */);
},
flags,
parsed == null ? void 0 : parsed.watchOptions,
WatchType.WildcardDirectory,
resolved
)
);
}
function watchInputFiles(state, resolved, resolvedPath, parsed) {
if (!state.watch)
return;
mutateMap(
getOrCreateValueMapFromConfigFileMap(state.allWatchedInputFiles, resolvedPath),
arrayToMap(parsed.fileNames, (fileName) => toPath2(state, fileName)),
{
createNewValue: (_path, input) => watchFile(
state,
input,
() => invalidateProjectAndScheduleBuilds(state, resolvedPath, 0 /* None */),
250 /* Low */,
parsed == null ? void 0 : parsed.watchOptions,
WatchType.SourceFile,
resolved
),
onDeleteValue: closeFileWatcher
}
);
}
function watchPackageJsonFiles(state, resolved, resolvedPath, parsed) {
if (!state.watch || !state.lastCachedPackageJsonLookups)
return;
mutateMap(
getOrCreateValueMapFromConfigFileMap(state.allWatchedPackageJsonFiles, resolvedPath),
new Map(state.lastCachedPackageJsonLookups.get(resolvedPath)),
{
createNewValue: (path, _input) => watchFile(
state,
path,
() => invalidateProjectAndScheduleBuilds(state, resolvedPath, 0 /* None */),
2e3 /* High */,
parsed == null ? void 0 : parsed.watchOptions,
WatchType.PackageJson,
resolved
),
onDeleteValue: closeFileWatcher
}
);
}
function startWatching(state, buildOrder) {
if (!state.watchAllProjectsPending)
return;
mark("SolutionBuilder::beforeWatcherCreation");
state.watchAllProjectsPending = false;
for (const resolved of getBuildOrderFromAnyBuildOrder(buildOrder)) {
const resolvedPath = toResolvedConfigFilePath(state, resolved);
const cfg = parseConfigFile(state, resolved, resolvedPath);
watchConfigFile(state, resolved, resolvedPath, cfg);
watchExtendedConfigFiles(state, resolvedPath, cfg);
if (cfg) {
watchWildCardDirectories(state, resolved, resolvedPath, cfg);
watchInputFiles(state, resolved, resolvedPath, cfg);
watchPackageJsonFiles(state, resolved, resolvedPath, cfg);
}
}
mark("SolutionBuilder::afterWatcherCreation");
measure("SolutionBuilder::Watcher creation", "SolutionBuilder::beforeWatcherCreation", "SolutionBuilder::afterWatcherCreation");
}
function stopWatching(state) {
clearMap(state.allWatchedConfigFiles, closeFileWatcher);
clearMap(state.allWatchedExtendedConfigFiles, closeFileWatcherOf);
clearMap(state.allWatchedWildcardDirectories, (watchedWildcardDirectories) => clearMap(watchedWildcardDirectories, closeFileWatcherOf));
clearMap(state.allWatchedInputFiles, (watchedWildcardDirectories) => clearMap(watchedWildcardDirectories, closeFileWatcher));
clearMap(state.allWatchedPackageJsonFiles, (watchedPacageJsonFiles) => clearMap(watchedPacageJsonFiles, closeFileWatcher));
}
function createSolutionBuilderWorker(watch, hostOrHostWithWatch, rootNames, options, baseWatchOptions) {
const state = createSolutionBuilderState(watch, hostOrHostWithWatch, rootNames, options, baseWatchOptions);
return {
build: (project, cancellationToken, writeFile2, getCustomTransformers) => build(state, project, cancellationToken, writeFile2, getCustomTransformers),
clean: (project) => clean(state, project),
buildReferences: (project, cancellationToken, writeFile2, getCustomTransformers) => build(
state,
project,
cancellationToken,
writeFile2,
getCustomTransformers,
/*onlyReferences*/
true
),
cleanReferences: (project) => clean(
state,
project,
/*onlyReferences*/
true
),
getNextInvalidatedProject: (cancellationToken) => {
setupInitialBuild(state, cancellationToken);
return getNextInvalidatedProject(
state,
getBuildOrder(state),
/*reportQueue*/
false
);
},
getBuildOrder: () => getBuildOrder(state),
getUpToDateStatusOfProject: (project) => {
const configFileName = resolveProjectName(state, project);
const configFilePath = toResolvedConfigFilePath(state, configFileName);
return getUpToDateStatus(state, parseConfigFile(state, configFileName, configFilePath), configFilePath);
},
invalidateProject: (configFilePath, reloadLevel) => invalidateProject(state, configFilePath, reloadLevel || 0 /* None */),
close: () => stopWatching(state)
};
}
function relName(state, path) {
return convertToRelativePath(path, state.compilerHost.getCurrentDirectory(), state.compilerHost.getCanonicalFileName);
}
function reportStatus(state, message, ...args) {
state.host.reportSolutionBuilderStatus(createCompilerDiagnostic(message, ...args));
}
function reportWatchStatus(state, message, ...args) {
var _a, _b;
(_b = (_a = state.hostWithWatch).onWatchStatusChange) == null ? void 0 : _b.call(_a, createCompilerDiagnostic(message, ...args), state.host.getNewLine(), state.baseCompilerOptions);
}
function reportErrors({ host }, errors) {
errors.forEach((err) => host.reportDiagnostic(err));
}
function reportAndStoreErrors(state, proj, errors) {
reportErrors(state, errors);
state.projectErrorsReported.set(proj, true);
if (errors.length) {
state.diagnostics.set(proj, errors);
}
}
function reportParseConfigFileDiagnostic(state, proj) {
reportAndStoreErrors(state, proj, [state.configFileCache.get(proj)]);
}
function reportErrorSummary(state, buildOrder) {
if (!state.needsSummary)
return;
state.needsSummary = false;
const canReportSummary = state.watch || !!state.host.reportErrorSummary;
const { diagnostics } = state;
let totalErrors = 0;
let filesInError = [];
if (isCircularBuildOrder(buildOrder)) {
reportBuildQueue(state, buildOrder.buildOrder);
reportErrors(state, buildOrder.circularDiagnostics);
if (canReportSummary)
totalErrors += getErrorCountForSummary(buildOrder.circularDiagnostics);
if (canReportSummary)
filesInError = [...filesInError, ...getFilesInErrorForSummary(buildOrder.circularDiagnostics)];
} else {
buildOrder.forEach((project) => {
const projectPath = toResolvedConfigFilePath(state, project);
if (!state.projectErrorsReported.has(projectPath)) {
reportErrors(state, diagnostics.get(projectPath) || emptyArray);
}
});
if (canReportSummary)
diagnostics.forEach((singleProjectErrors) => totalErrors += getErrorCountForSummary(singleProjectErrors));
if (canReportSummary)
diagnostics.forEach((singleProjectErrors) => [...filesInError, ...getFilesInErrorForSummary(singleProjectErrors)]);
}
if (state.watch) {
reportWatchStatus(state, getWatchErrorSummaryDiagnosticMessage(totalErrors), totalErrors);
} else if (state.host.reportErrorSummary) {
state.host.reportErrorSummary(totalErrors, filesInError);
}
}
function reportBuildQueue(state, buildQueue) {
if (state.options.verbose) {
reportStatus(state, Diagnostics.Projects_in_this_build_Colon_0, buildQueue.map((s) => "\r\n * " + relName(state, s)).join(""));
}
}
function reportUpToDateStatus(state, configFileName, status) {
switch (status.type) {
case 6 /* OutOfDateWithSelf */:
return reportStatus(
state,
Diagnostics.Project_0_is_out_of_date_because_output_1_is_older_than_input_2,
relName(state, configFileName),
relName(state, status.outOfDateOutputFileName),
relName(state, status.newerInputFileName)
);
case 7 /* OutOfDateWithUpstream */:
return reportStatus(
state,
Diagnostics.Project_0_is_out_of_date_because_output_1_is_older_than_input_2,
relName(state, configFileName),
relName(state, status.outOfDateOutputFileName),
relName(state, status.newerProjectName)
);
case 4 /* OutputMissing */:
return reportStatus(
state,
Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist,
relName(state, configFileName),
relName(state, status.missingOutputFileName)
);
case 5 /* ErrorReadingFile */:
return reportStatus(
state,
Diagnostics.Project_0_is_out_of_date_because_there_was_error_reading_file_1,
relName(state, configFileName),
relName(state, status.fileName)
);
case 8 /* OutOfDateBuildInfo */:
return reportStatus(
state,
Diagnostics.Project_0_is_out_of_date_because_buildinfo_file_1_indicates_that_some_of_the_changes_were_not_emitted,
relName(state, configFileName),
relName(state, status.buildInfoFile)
);
case 9 /* OutOfDateOptions */:
return reportStatus(
state,
Diagnostics.Project_0_is_out_of_date_because_buildinfo_file_1_indicates_there_is_change_in_compilerOptions,
relName(state, configFileName),
relName(state, status.buildInfoFile)
);
case 10 /* OutOfDateRoots */:
return reportStatus(
state,
Diagnostics.Project_0_is_out_of_date_because_buildinfo_file_1_indicates_that_file_2_was_root_file_of_compilation_but_not_any_more,
relName(state, configFileName),
relName(state, status.buildInfoFile),
relName(state, status.inputFile)
);
case 1 /* UpToDate */:
if (status.newestInputFileTime !== void 0) {
return reportStatus(
state,
Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_output_2,
relName(state, configFileName),
relName(state, status.newestInputFileName || ""),
relName(state, status.oldestOutputFileName || "")
);
}
break;
case 3 /* OutOfDateWithPrepend */:
return reportStatus(
state,
Diagnostics.Project_0_is_out_of_date_because_output_of_its_dependency_1_has_changed,
relName(state, configFileName),
relName(state, status.newerProjectName)
);
case 2 /* UpToDateWithUpstreamTypes */:
return reportStatus(
state,
Diagnostics.Project_0_is_up_to_date_with_d_ts_files_from_its_dependencies,
relName(state, configFileName)
);
case 15 /* UpToDateWithInputFileText */:
return reportStatus(
state,
Diagnostics.Project_0_is_up_to_date_but_needs_to_update_timestamps_of_output_files_that_are_older_than_input_files,
relName(state, configFileName)
);
case 11 /* UpstreamOutOfDate */:
return reportStatus(
state,
Diagnostics.Project_0_is_out_of_date_because_its_dependency_1_is_out_of_date,
relName(state, configFileName),
relName(state, status.upstreamProjectName)
);
case 12 /* UpstreamBlocked */:
return reportStatus(
state,
status.upstreamProjectBlocked ? Diagnostics.Project_0_can_t_be_built_because_its_dependency_1_was_not_built : Diagnostics.Project_0_can_t_be_built_because_its_dependency_1_has_errors,
relName(state, configFileName),
relName(state, status.upstreamProjectName)
);
case 0 /* Unbuildable */:
return reportStatus(
state,
Diagnostics.Failed_to_parse_file_0_Colon_1,
relName(state, configFileName),
status.reason
);
case 14 /* TsVersionOutputOfDate */:
return reportStatus(
state,
Diagnostics.Project_0_is_out_of_date_because_output_for_it_was_generated_with_version_1_that_differs_with_current_version_2,
relName(state, configFileName),
status.version,
version
);
case 17 /* ForceBuild */:
return reportStatus(
state,
Diagnostics.Project_0_is_being_forcibly_rebuilt,
relName(state, configFileName)
);
case 16 /* ContainerOnly */:
case 13 /* ComputingUpstream */:
break;
default:
assertType(status);
}
}
function verboseReportProjectStatus(state, configFileName, status) {
if (state.options.verbose) {
reportUpToDateStatus(state, configFileName, status);
}
}
// src/executeCommandLine/executeCommandLine.ts
function countLines(program) {
const counts2 = getCountsMap();
forEach(program.getSourceFiles(), (file) => {
const key = getCountKey(program, file);
const lineCount = getLineStarts(file).length;
counts2.set(key, counts2.get(key) + lineCount);
});
return counts2;
}
function getCountsMap() {
const counts2 = /* @__PURE__ */ new Map();
counts2.set("Library", 0);
counts2.set("Definitions", 0);
counts2.set("TypeScript", 0);
counts2.set("JavaScript", 0);
counts2.set("JSON", 0);
counts2.set("Other", 0);
return counts2;
}
function getCountKey(program, file) {
if (program.isSourceFileDefaultLibrary(file)) {
return "Library";
} else if (file.isDeclarationFile) {
return "Definitions";
}
const path = file.path;
if (fileExtensionIsOneOf(path, supportedTSExtensionsFlat)) {
return "TypeScript";
} else if (fileExtensionIsOneOf(path, supportedJSExtensionsFlat)) {
return "JavaScript";
} else if (fileExtensionIs(path, ".json" /* Json */)) {
return "JSON";
} else {
return "Other";
}
}
function updateReportDiagnostic(sys2, existing, options) {
return shouldBePretty(sys2, options) ? createDiagnosticReporter(
sys2,
/*pretty*/
true
) : existing;
}
function defaultIsPretty(sys2) {
return !!sys2.writeOutputIsTTY && sys2.writeOutputIsTTY() && !sys2.getEnvironmentVariable("NO_COLOR");
}
function shouldBePretty(sys2, options) {
if (!options || typeof options.pretty === "undefined") {
return defaultIsPretty(sys2);
}
return options.pretty;
}
function getOptionsForHelp(commandLine) {
return !!commandLine.options.all ? sort(optionDeclarations, (a, b) => compareStringsCaseInsensitive(a.name, b.name)) : filter(optionDeclarations.slice(), (v) => !!v.showInSimplifiedHelpView);
}
function printVersion(sys2) {
sys2.write(getDiagnosticText(Diagnostics.Version_0, version) + sys2.newLine);
}
function createColors(sys2) {
const showColors = defaultIsPretty(sys2);
if (!showColors) {
return {
bold: (str) => str,
blue: (str) => str,
blueBackground: (str) => str,
brightWhite: (str) => str
};
}
function bold(str) {
return `\x1B[1m${str}\x1B[22m`;
}
const isWindows = sys2.getEnvironmentVariable("OS") && stringContains(sys2.getEnvironmentVariable("OS").toLowerCase(), "windows");
const isWindowsTerminal = sys2.getEnvironmentVariable("WT_SESSION");
const isVSCode = sys2.getEnvironmentVariable("TERM_PROGRAM") && sys2.getEnvironmentVariable("TERM_PROGRAM") === "vscode";
function blue(str) {
if (isWindows && !isWindowsTerminal && !isVSCode) {
return brightWhite(str);
}
return `\x1B[94m${str}\x1B[39m`;
}
const supportsRicherColors = sys2.getEnvironmentVariable("COLORTERM") === "truecolor" || sys2.getEnvironmentVariable("TERM") === "xterm-256color";
function blueBackground(str) {
if (supportsRicherColors) {
return `\x1B[48;5;68m${str}\x1B[39;49m`;
} else {
return `\x1B[44m${str}\x1B[39;49m`;
}
}
function brightWhite(str) {
return `\x1B[97m${str}\x1B[39m`;
}
return {
bold,
blue,
brightWhite,
blueBackground
};
}
function getDisplayNameTextOfOption(option) {
return `--${option.name}${option.shortName ? `, -${option.shortName}` : ""}`;
}
function generateOptionOutput(sys2, option, rightAlignOfLeft, leftAlignOfRight) {
var _a;
const text = [];
const colors = createColors(sys2);
const name = getDisplayNameTextOfOption(option);
const valueCandidates = getValueCandidate(option);
const defaultValueDescription = typeof option.defaultValueDescription === "object" ? getDiagnosticText(option.defaultValueDescription) : formatDefaultValue(
option.defaultValueDescription,
option.type === "list" || option.type === "listOrElement" ? option.element.type : option.type
);
const terminalWidth = ((_a = sys2.getWidthOfTerminal) == null ? void 0 : _a.call(sys2)) ?? 0;
if (terminalWidth >= 80) {
let description = "";
if (option.description) {
description = getDiagnosticText(option.description);
}
text.push(...getPrettyOutput(
name,
description,
rightAlignOfLeft,
leftAlignOfRight,
terminalWidth,
/*colorLeft*/
true
), sys2.newLine);
if (showAdditionalInfoOutput(valueCandidates, option)) {
if (valueCandidates) {
text.push(...getPrettyOutput(
valueCandidates.valueType,
valueCandidates.possibleValues,
rightAlignOfLeft,
leftAlignOfRight,
terminalWidth,
/*colorLeft*/
false
), sys2.newLine);
}
if (defaultValueDescription) {
text.push(...getPrettyOutput(
getDiagnosticText(Diagnostics.default_Colon),
defaultValueDescription,
rightAlignOfLeft,
leftAlignOfRight,
terminalWidth,
/*colorLeft*/
false
), sys2.newLine);
}
}
text.push(sys2.newLine);
} else {
text.push(colors.blue(name), sys2.newLine);
if (option.description) {
const description = getDiagnosticText(option.description);
text.push(description);
}
text.push(sys2.newLine);
if (showAdditionalInfoOutput(valueCandidates, option)) {
if (valueCandidates) {
text.push(`${valueCandidates.valueType} ${valueCandidates.possibleValues}`);
}
if (defaultValueDescription) {
if (valueCandidates)
text.push(sys2.newLine);
const diagType = getDiagnosticText(Diagnostics.default_Colon);
text.push(`${diagType} ${defaultValueDescription}`);
}
text.push(sys2.newLine);
}
text.push(sys2.newLine);
}
return text;
function formatDefaultValue(defaultValue, type) {
return defaultValue !== void 0 && typeof type === "object" ? arrayFrom(type.entries()).filter(([, value]) => value === defaultValue).map(([name2]) => name2).join("/") : String(defaultValue);
}
function showAdditionalInfoOutput(valueCandidates2, option2) {
const ignoreValues = ["string"];
const ignoredDescriptions = [void 0, "false", "n/a"];
const defaultValueDescription2 = option2.defaultValueDescription;
if (option2.category === Diagnostics.Command_line_Options)
return false;
if (contains(ignoreValues, valueCandidates2 == null ? void 0 : valueCandidates2.possibleValues) && contains(ignoredDescriptions, defaultValueDescription2)) {
return false;
}
return true;
}
function getPrettyOutput(left, right, rightAlignOfLeft2, leftAlignOfRight2, terminalWidth2, colorLeft) {
const res = [];
let isFirstLine = true;
let remainRight = right;
const rightCharacterNumber = terminalWidth2 - leftAlignOfRight2;
while (remainRight.length > 0) {
let curLeft = "";
if (isFirstLine) {
curLeft = padLeft(left, rightAlignOfLeft2);
curLeft = padRight(curLeft, leftAlignOfRight2);
curLeft = colorLeft ? colors.blue(curLeft) : curLeft;
} else {
curLeft = padLeft("", leftAlignOfRight2);
}
const curRight = remainRight.substr(0, rightCharacterNumber);
remainRight = remainRight.slice(rightCharacterNumber);
res.push(`${curLeft}${curRight}`);
isFirstLine = false;
}
return res;
}
function getValueCandidate(option2) {
if (option2.type === "object") {
return void 0;
}
return {
valueType: getValueType(option2),
possibleValues: getPossibleValues(option2)
};
function getValueType(option3) {
Debug.assert(option3.type !== "listOrElement");
switch (option3.type) {
case "string":
case "number":
case "boolean":
return getDiagnosticText(Diagnostics.type_Colon);
case "list":
return getDiagnosticText(Diagnostics.one_or_more_Colon);
default:
return getDiagnosticText(Diagnostics.one_of_Colon);
}
}
function getPossibleValues(option3) {
let possibleValues;
switch (option3.type) {
case "string":
case "number":
case "boolean":
possibleValues = option3.type;
break;
case "list":
case "listOrElement":
possibleValues = getPossibleValues(option3.element);
break;
case "object":
possibleValues = "";
break;
default:
const inverted = {};
option3.type.forEach((value, name2) => {
(inverted[value] || (inverted[value] = [])).push(name2);
});
return Object.entries(inverted).map(([, synonyms]) => synonyms.join("/")).join(", ");
}
return possibleValues;
}
}
}
function generateGroupOptionOutput(sys2, optionsList) {
let maxLength = 0;
for (const option of optionsList) {
const curLength = getDisplayNameTextOfOption(option).length;
maxLength = maxLength > curLength ? maxLength : curLength;
}
const rightAlignOfLeftPart = maxLength + 2;
const leftAlignOfRightPart = rightAlignOfLeftPart + 2;
let lines = [];
for (const option of optionsList) {
const tmp = generateOptionOutput(sys2, option, rightAlignOfLeftPart, leftAlignOfRightPart);
lines = [...lines, ...tmp];
}
if (lines[lines.length - 2] !== sys2.newLine) {
lines.push(sys2.newLine);
}
return lines;
}
function generateSectionOptionsOutput(sys2, sectionName, options, subCategory, beforeOptionsDescription, afterOptionsDescription) {
let res = [];
res.push(createColors(sys2).bold(sectionName) + sys2.newLine + sys2.newLine);
if (beforeOptionsDescription) {
res.push(beforeOptionsDescription + sys2.newLine + sys2.newLine);
}
if (!subCategory) {
res = [...res, ...generateGroupOptionOutput(sys2, options)];
if (afterOptionsDescription) {
res.push(afterOptionsDescription + sys2.newLine + sys2.newLine);
}
return res;
}
const categoryMap = /* @__PURE__ */ new Map();
for (const option of options) {
if (!option.category) {
continue;
}
const curCategory = getDiagnosticText(option.category);
const optionsOfCurCategory = categoryMap.get(curCategory) ?? [];
optionsOfCurCategory.push(option);
categoryMap.set(curCategory, optionsOfCurCategory);
}
categoryMap.forEach((value, key) => {
res.push(`### ${key}${sys2.newLine}${sys2.newLine}`);
res = [...res, ...generateGroupOptionOutput(sys2, value)];
});
if (afterOptionsDescription) {
res.push(afterOptionsDescription + sys2.newLine + sys2.newLine);
}
return res;
}
function printEasyHelp(sys2, simpleOptions) {
const colors = createColors(sys2);
let output = [...getHeader(sys2, `${getDiagnosticText(Diagnostics.tsc_Colon_The_TypeScript_Compiler)} - ${getDiagnosticText(Diagnostics.Version_0, version)}`)];
output.push(colors.bold(getDiagnosticText(Diagnostics.COMMON_COMMANDS)) + sys2.newLine + sys2.newLine);
example("tsc", Diagnostics.Compiles_the_current_project_tsconfig_json_in_the_working_directory);
example("tsc app.ts util.ts", Diagnostics.Ignoring_tsconfig_json_compiles_the_specified_files_with_default_compiler_options);
example("tsc -b", Diagnostics.Build_a_composite_project_in_the_working_directory);
example("tsc --init", Diagnostics.Creates_a_tsconfig_json_with_the_recommended_settings_in_the_working_directory);
example("tsc -p ./path/to/tsconfig.json", Diagnostics.Compiles_the_TypeScript_project_located_at_the_specified_path);
example("tsc --help --all", Diagnostics.An_expanded_version_of_this_information_showing_all_possible_compiler_options);
example(["tsc --noEmit", "tsc --target esnext"], Diagnostics.Compiles_the_current_project_with_additional_settings);
const cliCommands = simpleOptions.filter((opt) => opt.isCommandLineOnly || opt.category === Diagnostics.Command_line_Options);
const configOpts = simpleOptions.filter((opt) => !contains(cliCommands, opt));
output = [
...output,
...generateSectionOptionsOutput(
sys2,
getDiagnosticText(Diagnostics.COMMAND_LINE_FLAGS),
cliCommands,
/*subCategory*/
false,
/*beforeOptionsDescription*/
void 0,
/*afterOptionsDescription*/
void 0
),
...generateSectionOptionsOutput(
sys2,
getDiagnosticText(Diagnostics.COMMON_COMPILER_OPTIONS),
configOpts,
/*subCategory*/
false,
/*beforeOptionsDescription*/
void 0,
formatMessage(
/*dummy*/
void 0,
Diagnostics.You_can_learn_about_all_of_the_compiler_options_at_0,
"https://aka.ms/tsc"
)
)
];
for (const line of output) {
sys2.write(line);
}
function example(ex, desc) {
const examples = typeof ex === "string" ? [ex] : ex;
for (const example2 of examples) {
output.push(" " + colors.blue(example2) + sys2.newLine);
}
output.push(" " + getDiagnosticText(desc) + sys2.newLine + sys2.newLine);
}
}
function printAllHelp(sys2, compilerOptions, buildOptions, watchOptions) {
let output = [...getHeader(sys2, `${getDiagnosticText(Diagnostics.tsc_Colon_The_TypeScript_Compiler)} - ${getDiagnosticText(Diagnostics.Version_0, version)}`)];
output = [...output, ...generateSectionOptionsOutput(
sys2,
getDiagnosticText(Diagnostics.ALL_COMPILER_OPTIONS),
compilerOptions,
/*subCategory*/
true,
/*beforeOptionsDescription*/
void 0,
formatMessage(
/*dummy*/
void 0,
Diagnostics.You_can_learn_about_all_of_the_compiler_options_at_0,
"https://aka.ms/tsc"
)
)];
output = [...output, ...generateSectionOptionsOutput(
sys2,
getDiagnosticText(Diagnostics.WATCH_OPTIONS),
watchOptions,
/*subCategory*/
false,
getDiagnosticText(Diagnostics.Including_watch_w_will_start_watching_the_current_project_for_the_file_changes_Once_set_you_can_config_watch_mode_with_Colon)
)];
output = [...output, ...generateSectionOptionsOutput(
sys2,
getDiagnosticText(Diagnostics.BUILD_OPTIONS),
buildOptions,
/*subCategory*/
false,
formatMessage(
/*dummy*/
void 0,
Diagnostics.Using_build_b_will_make_tsc_behave_more_like_a_build_orchestrator_than_a_compiler_This_is_used_to_trigger_building_composite_projects_which_you_can_learn_more_about_at_0,
"https://aka.ms/tsc-composite-builds"
)
)];
for (const line of output) {
sys2.write(line);
}
}
function printBuildHelp(sys2, buildOptions) {
let output = [...getHeader(sys2, `${getDiagnosticText(Diagnostics.tsc_Colon_The_TypeScript_Compiler)} - ${getDiagnosticText(Diagnostics.Version_0, version)}`)];
output = [...output, ...generateSectionOptionsOutput(
sys2,
getDiagnosticText(Diagnostics.BUILD_OPTIONS),
buildOptions,
/*subCategory*/
false,
formatMessage(
/*dummy*/
void 0,
Diagnostics.Using_build_b_will_make_tsc_behave_more_like_a_build_orchestrator_than_a_compiler_This_is_used_to_trigger_building_composite_projects_which_you_can_learn_more_about_at_0,
"https://aka.ms/tsc-composite-builds"
)
)];
for (const line of output) {
sys2.write(line);
}
}
function getHeader(sys2, message) {
var _a;
const colors = createColors(sys2);
const header = [];
const terminalWidth = ((_a = sys2.getWidthOfTerminal) == null ? void 0 : _a.call(sys2)) ?? 0;
const tsIconLength = 5;
const tsIconFirstLine = colors.blueBackground(padLeft("", tsIconLength));
const tsIconSecondLine = colors.blueBackground(colors.brightWhite(padLeft("TS ", tsIconLength)));
if (terminalWidth >= message.length + tsIconLength) {
const rightAlign = terminalWidth > 120 ? 120 : terminalWidth;
const leftAlign = rightAlign - tsIconLength;
header.push(padRight(message, leftAlign) + tsIconFirstLine + sys2.newLine);
header.push(padLeft("", leftAlign) + tsIconSecondLine + sys2.newLine);
} else {
header.push(message + sys2.newLine);
header.push(sys2.newLine);
}
return header;
}
function printHelp(sys2, commandLine) {
if (!commandLine.options.all) {
printEasyHelp(sys2, getOptionsForHelp(commandLine));
} else {
printAllHelp(sys2, getOptionsForHelp(commandLine), optionsForBuild, optionsForWatch);
}
}
function executeCommandLineWorker(sys2, cb, commandLine) {
let reportDiagnostic = createDiagnosticReporter(sys2);
if (commandLine.options.build) {
reportDiagnostic(createCompilerDiagnostic(Diagnostics.Option_build_must_be_the_first_command_line_argument));
return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */);
}
let configFileName;
if (commandLine.options.locale) {
validateLocaleAndSetLanguage(commandLine.options.locale, sys2, commandLine.errors);
}
if (commandLine.errors.length > 0) {
commandLine.errors.forEach(reportDiagnostic);
return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */);
}
if (commandLine.options.init) {
writeConfigFile(sys2, reportDiagnostic, commandLine.options, commandLine.fileNames);
return sys2.exit(0 /* Success */);
}
if (commandLine.options.version) {
printVersion(sys2);
return sys2.exit(0 /* Success */);
}
if (commandLine.options.help || commandLine.options.all) {
printHelp(sys2, commandLine);
return sys2.exit(0 /* Success */);
}
if (commandLine.options.watch && commandLine.options.listFilesOnly) {
reportDiagnostic(createCompilerDiagnostic(Diagnostics.Options_0_and_1_cannot_be_combined, "watch", "listFilesOnly"));
return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */);
}
if (commandLine.options.project) {
if (commandLine.fileNames.length !== 0) {
reportDiagnostic(createCompilerDiagnostic(Diagnostics.Option_project_cannot_be_mixed_with_source_files_on_a_command_line));
return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */);
}
const fileOrDirectory = normalizePath(commandLine.options.project);
if (!fileOrDirectory || sys2.directoryExists(fileOrDirectory)) {
configFileName = combinePaths(fileOrDirectory, "tsconfig.json");
if (!sys2.fileExists(configFileName)) {
reportDiagnostic(createCompilerDiagnostic(Diagnostics.Cannot_find_a_tsconfig_json_file_at_the_specified_directory_Colon_0, commandLine.options.project));
return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */);
}
} else {
configFileName = fileOrDirectory;
if (!sys2.fileExists(configFileName)) {
reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_specified_path_does_not_exist_Colon_0, commandLine.options.project));
return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */);
}
}
} else if (commandLine.fileNames.length === 0) {
const searchPath = normalizePath(sys2.getCurrentDirectory());
configFileName = findConfigFile(searchPath, (fileName) => sys2.fileExists(fileName));
}
if (commandLine.fileNames.length === 0 && !configFileName) {
if (commandLine.options.showConfig) {
reportDiagnostic(createCompilerDiagnostic(Diagnostics.Cannot_find_a_tsconfig_json_file_at_the_current_directory_Colon_0, normalizePath(sys2.getCurrentDirectory())));
} else {
printVersion(sys2);
printHelp(sys2, commandLine);
}
return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */);
}
const currentDirectory = sys2.getCurrentDirectory();
const commandLineOptions = convertToOptionsWithAbsolutePaths(
commandLine.options,
(fileName) => getNormalizedAbsolutePath(fileName, currentDirectory)
);
if (configFileName) {
const extendedConfigCache = /* @__PURE__ */ new Map();
const configParseResult = parseConfigFileWithSystem(configFileName, commandLineOptions, extendedConfigCache, commandLine.watchOptions, sys2, reportDiagnostic);
if (commandLineOptions.showConfig) {
if (configParseResult.errors.length !== 0) {
reportDiagnostic = updateReportDiagnostic(
sys2,
reportDiagnostic,
configParseResult.options
);
configParseResult.errors.forEach(reportDiagnostic);
return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */);
}
sys2.write(JSON.stringify(convertToTSConfig(configParseResult, configFileName, sys2), null, 4) + sys2.newLine);
return sys2.exit(0 /* Success */);
}
reportDiagnostic = updateReportDiagnostic(
sys2,
reportDiagnostic,
configParseResult.options
);
if (isWatchSet(configParseResult.options)) {
if (reportWatchModeWithoutSysSupport(sys2, reportDiagnostic))
return;
return createWatchOfConfigFile(
sys2,
cb,
reportDiagnostic,
configParseResult,
commandLineOptions,
commandLine.watchOptions,
extendedConfigCache
);
} else if (isIncrementalCompilation(configParseResult.options)) {
performIncrementalCompilation2(
sys2,
cb,
reportDiagnostic,
configParseResult
);
} else {
performCompilation(
sys2,
cb,
reportDiagnostic,
configParseResult
);
}
} else {
if (commandLineOptions.showConfig) {
sys2.write(JSON.stringify(convertToTSConfig(commandLine, combinePaths(currentDirectory, "tsconfig.json"), sys2), null, 4) + sys2.newLine);
return sys2.exit(0 /* Success */);
}
reportDiagnostic = updateReportDiagnostic(
sys2,
reportDiagnostic,
commandLineOptions
);
if (isWatchSet(commandLineOptions)) {
if (reportWatchModeWithoutSysSupport(sys2, reportDiagnostic))
return;
return createWatchOfFilesAndCompilerOptions(
sys2,
cb,
reportDiagnostic,
commandLine.fileNames,
commandLineOptions,
commandLine.watchOptions
);
} else if (isIncrementalCompilation(commandLineOptions)) {
performIncrementalCompilation2(
sys2,
cb,
reportDiagnostic,
{ ...commandLine, options: commandLineOptions }
);
} else {
performCompilation(
sys2,
cb,
reportDiagnostic,
{ ...commandLine, options: commandLineOptions }
);
}
}
}
function isBuild(commandLineArgs) {
if (commandLineArgs.length > 0 && commandLineArgs[0].charCodeAt(0) === 45 /* minus */) {
const firstOption = commandLineArgs[0].slice(commandLineArgs[0].charCodeAt(1) === 45 /* minus */ ? 2 : 1).toLowerCase();
return firstOption === "build" || firstOption === "b";
}
return false;
}
function executeCommandLine(system, cb, commandLineArgs) {
if (isBuild(commandLineArgs)) {
const { buildOptions, watchOptions, projects, errors } = parseBuildCommand(commandLineArgs.slice(1));
if (buildOptions.generateCpuProfile && system.enableCPUProfiler) {
system.enableCPUProfiler(buildOptions.generateCpuProfile, () => performBuild(
system,
cb,
buildOptions,
watchOptions,
projects,
errors
));
} else {
return performBuild(
system,
cb,
buildOptions,
watchOptions,
projects,
errors
);
}
}
const commandLine = parseCommandLine(commandLineArgs, (path) => system.readFile(path));
if (commandLine.options.generateCpuProfile && system.enableCPUProfiler) {
system.enableCPUProfiler(commandLine.options.generateCpuProfile, () => executeCommandLineWorker(
system,
cb,
commandLine
));
} else {
return executeCommandLineWorker(system, cb, commandLine);
}
}
function reportWatchModeWithoutSysSupport(sys2, reportDiagnostic) {
if (!sys2.watchFile || !sys2.watchDirectory) {
reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"));
sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */);
return true;
}
return false;
}
function performBuild(sys2, cb, buildOptions, watchOptions, projects, errors) {
const reportDiagnostic = updateReportDiagnostic(
sys2,
createDiagnosticReporter(sys2),
buildOptions
);
if (buildOptions.locale) {
validateLocaleAndSetLanguage(buildOptions.locale, sys2, errors);
}
if (errors.length > 0) {
errors.forEach(reportDiagnostic);
return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */);
}
if (buildOptions.help) {
printVersion(sys2);
printBuildHelp(sys2, buildOpts);
return sys2.exit(0 /* Success */);
}
if (projects.length === 0) {
printVersion(sys2);
printBuildHelp(sys2, buildOpts);
return sys2.exit(0 /* Success */);
}
if (!sys2.getModifiedTime || !sys2.setModifiedTime || buildOptions.clean && !sys2.deleteFile) {
reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--build"));
return sys2.exit(1 /* DiagnosticsPresent_OutputsSkipped */);
}
if (buildOptions.watch) {
if (reportWatchModeWithoutSysSupport(sys2, reportDiagnostic))
return;
const buildHost2 = createSolutionBuilderWithWatchHost(
sys2,
/*createProgram*/
void 0,
reportDiagnostic,
createBuilderStatusReporter(sys2, shouldBePretty(sys2, buildOptions)),
createWatchStatusReporter2(sys2, buildOptions)
);
const solutionPerformance2 = enableSolutionPerformance(sys2, buildOptions);
updateSolutionBuilderHost(sys2, cb, buildHost2, solutionPerformance2);
const onWatchStatusChange = buildHost2.onWatchStatusChange;
let reportBuildStatistics = false;
buildHost2.onWatchStatusChange = (d, newLine, options, errorCount) => {
onWatchStatusChange == null ? void 0 : onWatchStatusChange(d, newLine, options, errorCount);
if (reportBuildStatistics && (d.code === Diagnostics.Found_0_errors_Watching_for_file_changes.code || d.code === Diagnostics.Found_1_error_Watching_for_file_changes.code)) {
reportSolutionBuilderTimes(builder2, solutionPerformance2);
}
};
const builder2 = createSolutionBuilderWithWatch(buildHost2, projects, buildOptions, watchOptions);
builder2.build();
reportSolutionBuilderTimes(builder2, solutionPerformance2);
reportBuildStatistics = true;
return builder2;
}
const buildHost = createSolutionBuilderHost(
sys2,
/*createProgram*/
void 0,
reportDiagnostic,
createBuilderStatusReporter(sys2, shouldBePretty(sys2, buildOptions)),
createReportErrorSummary(sys2, buildOptions)
);
const solutionPerformance = enableSolutionPerformance(sys2, buildOptions);
updateSolutionBuilderHost(sys2, cb, buildHost, solutionPerformance);
const builder = createSolutionBuilder(buildHost, projects, buildOptions);
const exitStatus = buildOptions.clean ? builder.clean() : builder.build();
reportSolutionBuilderTimes(builder, solutionPerformance);
dumpTracingLegend();
return sys2.exit(exitStatus);
}
function createReportErrorSummary(sys2, options) {
return shouldBePretty(sys2, options) ? (errorCount, filesInError) => sys2.write(getErrorSummaryText(errorCount, filesInError, sys2.newLine, sys2)) : void 0;
}
function performCompilation(sys2, cb, reportDiagnostic, config) {
const { fileNames, options, projectReferences } = config;
const host = createCompilerHostWorker(
options,
/*setParentNodes*/
void 0,
sys2
);
const currentDirectory = host.getCurrentDirectory();
const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames());
changeCompilerHostLikeToUseCache(host, (fileName) => toPath(fileName, currentDirectory, getCanonicalFileName));
enableStatisticsAndTracing(
sys2,
options,
/*isBuildMode*/
false
);
const programOptions = {
rootNames: fileNames,
options,
projectReferences,
host,
configFileParsingDiagnostics: getConfigFileParsingDiagnostics(config)
};
const program = createProgram(programOptions);
const exitStatus = emitFilesAndReportErrorsAndGetExitStatus(
program,
reportDiagnostic,
(s) => sys2.write(s + sys2.newLine),
createReportErrorSummary(sys2, options)
);
reportStatistics(
sys2,
program,
/*solutionPerformance*/
void 0
);
cb(program);
return sys2.exit(exitStatus);
}
function performIncrementalCompilation2(sys2, cb, reportDiagnostic, config) {
const { options, fileNames, projectReferences } = config;
enableStatisticsAndTracing(
sys2,
options,
/*isBuildMode*/
false
);
const host = createIncrementalCompilerHost(options, sys2);
const exitStatus = performIncrementalCompilation({
host,
system: sys2,
rootNames: fileNames,
options,
configFileParsingDiagnostics: getConfigFileParsingDiagnostics(config),
projectReferences,
reportDiagnostic,
reportErrorSummary: createReportErrorSummary(sys2, options),
afterProgramEmitAndDiagnostics: (builderProgram) => {
reportStatistics(
sys2,
builderProgram.getProgram(),
/*solutionPerformance*/
void 0
);
cb(builderProgram);
}
});
return sys2.exit(exitStatus);
}
function updateSolutionBuilderHost(sys2, cb, buildHost, solutionPerformance) {
updateCreateProgram(
sys2,
buildHost,
/*isBuildMode*/
true
);
buildHost.afterProgramEmitAndDiagnostics = (program) => {
reportStatistics(sys2, program.getProgram(), solutionPerformance);
cb(program);
};
buildHost.beforeEmitBundle = (config) => enableStatisticsAndTracing(
sys2,
config.options,
/*isBuildMode*/
true
);
buildHost.afterEmitBundle = (config) => {
reportStatistics(sys2, config, solutionPerformance);
cb(config);
};
}
function updateCreateProgram(sys2, host, isBuildMode) {
const compileUsingBuilder = host.createProgram;
host.createProgram = (rootNames, options, host2, oldProgram, configFileParsingDiagnostics, projectReferences) => {
Debug.assert(rootNames !== void 0 || options === void 0 && !!oldProgram);
if (options !== void 0) {
enableStatisticsAndTracing(sys2, options, isBuildMode);
}
return compileUsingBuilder(rootNames, options, host2, oldProgram, configFileParsingDiagnostics, projectReferences);
};
}
function updateWatchCompilationHost(sys2, cb, watchCompilerHost) {
updateCreateProgram(
sys2,
watchCompilerHost,
/*isBuildMode*/
false
);
const emitFilesUsingBuilder = watchCompilerHost.afterProgramCreate;
watchCompilerHost.afterProgramCreate = (builderProgram) => {
emitFilesUsingBuilder(builderProgram);
reportStatistics(
sys2,
builderProgram.getProgram(),
/*solutionPerformance*/
void 0
);
cb(builderProgram);
};
}
function createWatchStatusReporter2(sys2, options) {
return createWatchStatusReporter(sys2, shouldBePretty(sys2, options));
}
function createWatchOfConfigFile(system, cb, reportDiagnostic, configParseResult, optionsToExtend, watchOptionsToExtend, extendedConfigCache) {
const watchCompilerHost = createWatchCompilerHostOfConfigFile({
configFileName: configParseResult.options.configFilePath,
optionsToExtend,
watchOptionsToExtend,
system,
reportDiagnostic,
reportWatchStatus: createWatchStatusReporter2(system, configParseResult.options)
});
updateWatchCompilationHost(system, cb, watchCompilerHost);
watchCompilerHost.configFileParsingResult = configParseResult;
watchCompilerHost.extendedConfigCache = extendedConfigCache;
return createWatchProgram(watchCompilerHost);
}
function createWatchOfFilesAndCompilerOptions(system, cb, reportDiagnostic, rootFiles, options, watchOptions) {
const watchCompilerHost = createWatchCompilerHostOfFilesAndCompilerOptions({
rootFiles,
options,
watchOptions,
system,
reportDiagnostic,
reportWatchStatus: createWatchStatusReporter2(system, options)
});
updateWatchCompilationHost(system, cb, watchCompilerHost);
return createWatchProgram(watchCompilerHost);
}
function enableSolutionPerformance(system, options) {
if (system === sys && options.extendedDiagnostics) {
enable();
return createSolutionPerfomrance();
}
}
function createSolutionPerfomrance() {
let statistics;
return {
addAggregateStatistic,
forEachAggregateStatistics: forEachAggreateStatistics,
clear: clear2
};
function addAggregateStatistic(s) {
const existing = statistics == null ? void 0 : statistics.get(s.name);
if (existing) {
if (existing.type === 2 /* memory */)
existing.value = Math.max(existing.value, s.value);
else
existing.value += s.value;
} else {
(statistics ?? (statistics = /* @__PURE__ */ new Map())).set(s.name, s);
}
}
function forEachAggreateStatistics(cb) {
statistics == null ? void 0 : statistics.forEach(cb);
}
function clear2() {
statistics = void 0;
}
}
function reportSolutionBuilderTimes(builder, solutionPerformance) {
if (!solutionPerformance)
return;
if (!isEnabled()) {
sys.write(Diagnostics.Performance_timings_for_diagnostics_or_extendedDiagnostics_are_not_available_in_this_session_A_native_implementation_of_the_Web_Performance_API_could_not_be_found.message + "\n");
return;
}
const statistics = [];
statistics.push(
{ name: "Projects in scope", value: getBuildOrderFromAnyBuildOrder(builder.getBuildOrder()).length, type: 1 /* count */ }
);
reportSolutionBuilderCountStatistic("SolutionBuilder::Projects built");
reportSolutionBuilderCountStatistic("SolutionBuilder::Timestamps only updates");
reportSolutionBuilderCountStatistic("SolutionBuilder::Bundles updated");
solutionPerformance.forEachAggregateStatistics((s) => {
s.name = `Aggregate ${s.name}`;
statistics.push(s);
});
forEachMeasure((name, duration) => {
if (isSolutionMarkOrMeasure(name))
statistics.push({ name: `${getNameFromSolutionBuilderMarkOrMeasure(name)} time`, value: duration, type: 0 /* time */ });
});
disable();
enable();
solutionPerformance.clear();
reportAllStatistics(sys, statistics);
function reportSolutionBuilderCountStatistic(name) {
const value = getCount(name);
if (value) {
statistics.push({ name: getNameFromSolutionBuilderMarkOrMeasure(name), value, type: 1 /* count */ });
}
}
function getNameFromSolutionBuilderMarkOrMeasure(name) {
return name.replace("SolutionBuilder::", "");
}
}
function canReportDiagnostics(system, compilerOptions) {
return system === sys && (compilerOptions.diagnostics || compilerOptions.extendedDiagnostics);
}
function canTrace(system, compilerOptions) {
return system === sys && compilerOptions.generateTrace;
}
function enableStatisticsAndTracing(system, compilerOptions, isBuildMode) {
if (canReportDiagnostics(system, compilerOptions)) {
enable(system);
}
if (canTrace(system, compilerOptions)) {
startTracing(
isBuildMode ? "build" : "project",
compilerOptions.generateTrace,
compilerOptions.configFilePath
);
}
}
function isSolutionMarkOrMeasure(name) {
return startsWith(name, "SolutionBuilder::");
}
function isProgram(programOrConfig) {
return !programOrConfig.options;
}
function reportStatistics(sys2, programOrConfig, solutionPerformance) {
var _a;
const program = isProgram(programOrConfig) ? programOrConfig : void 0;
const config = isProgram(programOrConfig) ? void 0 : programOrConfig;
const compilerOptions = program ? program.getCompilerOptions() : config.options;
if (canTrace(sys2, compilerOptions)) {
(_a = tracing) == null ? void 0 : _a.stopTracing();
}
let statistics;
if (canReportDiagnostics(sys2, compilerOptions)) {
statistics = [];
const memoryUsed = sys2.getMemoryUsage ? sys2.getMemoryUsage() : -1;
if (program) {
reportCountStatistic("Files", program.getSourceFiles().length);
const lineCounts = countLines(program);
if (compilerOptions.extendedDiagnostics) {
for (const [key, value] of lineCounts.entries()) {
reportCountStatistic("Lines of " + key, value);
}
} else {
reportCountStatistic("Lines", reduceLeftIterator(lineCounts.values(), (sum, count) => sum + count, 0));
}
reportCountStatistic("Identifiers", program.getIdentifierCount());
reportCountStatistic("Symbols", program.getSymbolCount());
reportCountStatistic("Types", program.getTypeCount());
reportCountStatistic("Instantiations", program.getInstantiationCount());
}
if (memoryUsed >= 0) {
reportStatisticalValue(
{ name: "Memory used", value: memoryUsed, type: 2 /* memory */ },
/*aggregate*/
true
);
}
const isPerformanceEnabled = isEnabled();
const programTime = isPerformanceEnabled ? getDuration("Program") : 0;
const bindTime = isPerformanceEnabled ? getDuration("Bind") : 0;
const checkTime = isPerformanceEnabled ? getDuration("Check") : 0;
const emitTime = isPerformanceEnabled ? getDuration("Emit") : 0;
if (compilerOptions.extendedDiagnostics) {
if (program) {
const caches = program.getRelationCacheSizes();
reportCountStatistic("Assignability cache size", caches.assignable);
reportCountStatistic("Identity cache size", caches.identity);
reportCountStatistic("Subtype cache size", caches.subtype);
reportCountStatistic("Strict subtype cache size", caches.strictSubtype);
}
if (isPerformanceEnabled) {
forEachMeasure((name, duration) => {
if (!isSolutionMarkOrMeasure(name))
reportTimeStatistic(
`${name} time`,
duration,
/*aggregate*/
true
);
});
}
} else if (isPerformanceEnabled) {
reportTimeStatistic(
"I/O read",
getDuration("I/O Read"),
/*aggregate*/
true
);
reportTimeStatistic(
"I/O write",
getDuration("I/O Write"),
/*aggregate*/
true
);
reportTimeStatistic(
"Parse time",
programTime,
/*aggregate*/
true
);
reportTimeStatistic(
"Bind time",
bindTime,
/*aggregate*/
true
);
reportTimeStatistic(
"Check time",
checkTime,
/*aggregate*/
true
);
reportTimeStatistic(
"Emit time",
emitTime,
/*aggregate*/
true
);
}
if (isPerformanceEnabled) {
reportTimeStatistic(
"Total time",
programTime + bindTime + checkTime + emitTime,
/*aggregate*/
false
);
}
reportAllStatistics(sys2, statistics);
if (!isPerformanceEnabled) {
sys2.write(Diagnostics.Performance_timings_for_diagnostics_or_extendedDiagnostics_are_not_available_in_this_session_A_native_implementation_of_the_Web_Performance_API_could_not_be_found.message + "\n");
} else {
if (solutionPerformance) {
forEachMeasure((name) => {
if (!isSolutionMarkOrMeasure(name))
clearMeasures(name);
});
forEachMark((name) => {
if (!isSolutionMarkOrMeasure(name))
clearMarks(name);
});
} else {
disable();
}
}
}
function reportStatisticalValue(s, aggregate) {
statistics.push(s);
if (aggregate)
solutionPerformance == null ? void 0 : solutionPerformance.addAggregateStatistic(s);
}
function reportCountStatistic(name, count) {
reportStatisticalValue(
{ name, value: count, type: 1 /* count */ },
/*aggregate*/
true
);
}
function reportTimeStatistic(name, time, aggregate) {
reportStatisticalValue({ name, value: time, type: 0 /* time */ }, aggregate);
}
}
function reportAllStatistics(sys2, statistics) {
let nameSize = 0;
let valueSize = 0;
for (const s of statistics) {
if (s.name.length > nameSize) {
nameSize = s.name.length;
}
const value = statisticValue(s);
if (value.length > valueSize) {
valueSize = value.length;
}
}
for (const s of statistics) {
sys2.write(padRight(s.name + ":", nameSize + 2) + padLeft(statisticValue(s).toString(), valueSize) + sys2.newLine);
}
}
function statisticValue(s) {
switch (s.type) {
case 1 /* count */:
return "" + s.value;
case 0 /* time */:
return (s.value / 1e3).toFixed(2) + "s";
case 2 /* memory */:
return Math.round(s.value / 1e3) + "K";
default:
Debug.assertNever(s.type);
}
}
function writeConfigFile(sys2, reportDiagnostic, options, fileNames) {
const currentDirectory = sys2.getCurrentDirectory();
const file = normalizePath(combinePaths(currentDirectory, "tsconfig.json"));
if (sys2.fileExists(file)) {
reportDiagnostic(createCompilerDiagnostic(Diagnostics.A_tsconfig_json_file_is_already_defined_at_Colon_0, file));
} else {
sys2.writeFile(file, generateTSConfig(options, fileNames, sys2.newLine));
const output = [sys2.newLine, ...getHeader(sys2, "Created a new tsconfig.json with:")];
output.push(getCompilerOptionsDiffValue(options, sys2.newLine) + sys2.newLine + sys2.newLine);
output.push(`You can learn more at https://aka.ms/tsconfig` + sys2.newLine);
for (const line of output) {
sys2.write(line);
}
}
return;
}
// src/tsc/tsc.ts
Debug.loggingHost = {
log(_level, s) {
sys.write(`${s || ""}${sys.newLine}`);
}
};
if (Debug.isDebugging) {
Debug.enableDebugInfo();
}
if (sys.tryEnableSourceMapsForHost && /^development$/i.test(sys.getEnvironmentVariable("NODE_ENV"))) {
sys.tryEnableSourceMapsForHost();
}
if (sys.setBlocking) {
sys.setBlocking();
}
executeCommandLine(sys, noop, sys.args);
//# sourceMappingURL=tsc.js.map