); 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(""); } 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