
    );
    return updated;
  }
  function visitArrowFunction(node) {
    const updated = factory2.updateArrowFunction(
      node,
      visitNodes2(node.modifiers, modifierVisitor, isModifier),
      /*typeParameters*/
      void 0,
      visitParameterList(node.parameters, visitor, context),
      /*type*/
      void 0,
      node.equalsGreaterThanToken,
      visitFunctionBody(node.body, visitor, context)
    );
    return updated;
  }
  function visitParameter(node) {
    if (parameterIsThisKeyword(node)) {
      return void 0;
    }
    const updated = factory2.updateParameterDeclaration(
      node,
      visitNodes2(node.modifiers, (node2) => isDecorator(node2) ? visitor(node2) : void 0, isModifierLike),
      node.dotDotDotToken,
      Debug.checkDefined(visitNode(node.name, visitor, isBindingName)),
      /*questionToken*/
      void 0,
      /*type*/
      void 0,
      visitNode(node.initializer, visitor, isExpression)
    );
    if (updated !== node) {
      setCommentRange(updated, node);
      setTextRange(updated, moveRangePastModifiers(node));
      setSourceMapRange(updated, moveRangePastModifiers(node));
      setEmitFlags(updated.name, 64 /* NoTrailingSourceMap */);
    }
    return updated;
  }
  function visitVariableStatement(node) {
    if (isExportOfNamespace(node)) {
      const variables = getInitializedVariables(node.declarationList);
      if (variables.length === 0) {
        return void 0;
      }
      return setTextRange(
        factory2.createExpressionStatement(
          factory2.inlineExpressions(
            map(variables, transformInitializedVariable)
          )
        ),
        node
      );
    } else {
      return visitEachChild(node, visitor, context);
    }
  }
  function transformInitializedVariable(node) {
    const name = node.name;
    if (isBindingPattern(name)) {
      return flattenDestructuringAssignment(
        node,
        visitor,
        context,
        0 /* All */,
        /*needsValue*/
        false,
        createNamespaceExportExpression
      );
    } else {
      return setTextRange(
        factory2.createAssignment(
          getNamespaceMemberNameWithSourceMapsAndWithoutComments(name),
          Debug.checkDefined(visitNode(node.initializer, visitor, isExpression))
        ),
        /*location*/
        node
      );
    }
  }
  function visitVariableDeclaration(node) {
    const updated = factory2.updateVariableDeclaration(
      node,
      Debug.checkDefined(visitNode(node.name, visitor, isBindingName)),
      /*exclamationToken*/
      void 0,
      /*type*/
      void 0,
      visitNode(node.initializer, visitor, isExpression)
    );
    if (node.type) {
      setTypeNode(updated.name, node.type);
    }
    return updated;
  }
  function visitParenthesizedExpression(node) {
    const innerExpression = skipOuterExpressions(node.expression, ~6 /* Assertions */);
    if (isAssertionExpression(innerExpression)) {
      const expression = visitNode(node.expression, visitor, isExpression);
      Debug.assert(expression);
      return factory2.createPartiallyEmittedExpression(expression, node);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitAssertionExpression(node) {
    const expression = visitNode(node.expression, visitor, isExpression);
    Debug.assert(expression);
    return factory2.createPartiallyEmittedExpression(expression, node);
  }
  function visitNonNullExpression(node) {
    const expression = visitNode(node.expression, visitor, isLeftHandSideExpression);
    Debug.assert(expression);
    return factory2.createPartiallyEmittedExpression(expression, node);
  }
  function visitSatisfiesExpression(node) {
    const expression = visitNode(node.expression, visitor, isExpression);
    Debug.assert(expression);
    return factory2.createPartiallyEmittedExpression(expression, node);
  }
  function visitCallExpression(node) {
    return factory2.updateCallExpression(
      node,
      Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
      /*typeArguments*/
      void 0,
      visitNodes2(node.arguments, visitor, isExpression)
    );
  }
  function visitNewExpression(node) {
    return factory2.updateNewExpression(
      node,
      Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
      /*typeArguments*/
      void 0,
      visitNodes2(node.arguments, visitor, isExpression)
    );
  }
  function visitTaggedTemplateExpression(node) {
    return factory2.updateTaggedTemplateExpression(
      node,
      Debug.checkDefined(visitNode(node.tag, visitor, isExpression)),
      /*typeArguments*/
      void 0,
      Debug.checkDefined(visitNode(node.template, visitor, isTemplateLiteral))
    );
  }
  function visitJsxSelfClosingElement(node) {
    return factory2.updateJsxSelfClosingElement(
      node,
      Debug.checkDefined(visitNode(node.tagName, visitor, isJsxTagNameExpression)),
      /*typeArguments*/
      void 0,
      Debug.checkDefined(visitNode(node.attributes, visitor, isJsxAttributes))
    );
  }
  function visitJsxJsxOpeningElement(node) {
    return factory2.updateJsxOpeningElement(
      node,
      Debug.checkDefined(visitNode(node.tagName, visitor, isJsxTagNameExpression)),
      /*typeArguments*/
      void 0,
      Debug.checkDefined(visitNode(node.attributes, visitor, isJsxAttributes))
    );
  }
  function shouldEmitEnumDeclaration(node) {
    return !isEnumConst(node) || shouldPreserveConstEnums(compilerOptions);
  }
  function visitEnumDeclaration(node) {
    if (!shouldEmitEnumDeclaration(node)) {
      return factory2.createNotEmittedStatement(node);
    }
    const statements = [];
    let emitFlags = 4 /* AdviseOnEmitNode */;
    const varAdded = addVarForEnumOrModuleDeclaration(statements, node);
    if (varAdded) {
      if (moduleKind !== 4 /* System */ || currentLexicalScope !== currentSourceFile) {
        emitFlags |= 1024 /* NoLeadingComments */;
      }
    }
    const parameterName = getNamespaceParameterName(node);
    const containerName = getNamespaceContainerName(node);
    const exportName = isExportOfNamespace(node) ? factory2.getExternalModuleOrNamespaceExportName(
      currentNamespaceContainerName,
      node,
      /*allowComments*/
      false,
      /*allowSourceMaps*/
      true
    ) : factory2.getDeclarationName(
      node,
      /*allowComments*/
      false,
      /*allowSourceMaps*/
      true
    );
    let moduleArg = factory2.createLogicalOr(
      exportName,
      factory2.createAssignment(
        exportName,
        factory2.createObjectLiteralExpression()
      )
    );
    if (isExportOfNamespace(node)) {
      const localName = factory2.getLocalName(
        node,
        /*allowComments*/
        false,
        /*allowSourceMaps*/
        true
      );
      moduleArg = factory2.createAssignment(localName, moduleArg);
    }
    const enumStatement = factory2.createExpressionStatement(
      factory2.createCallExpression(
        factory2.createFunctionExpression(
          /*modifiers*/
          void 0,
          /*asteriskToken*/
          void 0,
          /*name*/
          void 0,
          /*typeParameters*/
          void 0,
          [factory2.createParameterDeclaration(
            /*modifiers*/
            void 0,
            /*dotDotDotToken*/
            void 0,
            parameterName
          )],
          /*type*/
          void 0,
          transformEnumBody(node, containerName)
        ),
        /*typeArguments*/
        void 0,
        [moduleArg]
      )
    );
    setOriginalNode(enumStatement, node);
    if (varAdded) {
      setSyntheticLeadingComments(enumStatement, void 0);
      setSyntheticTrailingComments(enumStatement, void 0);
    }
    setTextRange(enumStatement, node);
    addEmitFlags(enumStatement, emitFlags);
    statements.push(enumStatement);
    return statements;
  }
  function transformEnumBody(node, localName) {
    const savedCurrentNamespaceLocalName = currentNamespaceContainerName;
    currentNamespaceContainerName = localName;
    const statements = [];
    startLexicalEnvironment();
    const members = map(node.members, transformEnumMember);
    insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
    addRange(statements, members);
    currentNamespaceContainerName = savedCurrentNamespaceLocalName;
    return factory2.createBlock(
      setTextRange(
        factory2.createNodeArray(statements),
        /*location*/
        node.members
      ),
      /*multiLine*/
      true
    );
  }
  function transformEnumMember(member) {
    const name = getExpressionForPropertyName(
      member,
      /*generateNameForComputedPropertyName*/
      false
    );
    const valueExpression = transformEnumMemberDeclarationValue(member);
    const innerAssignment = factory2.createAssignment(
      factory2.createElementAccessExpression(
        currentNamespaceContainerName,
        name
      ),
      valueExpression
    );
    const outerAssignment = valueExpression.kind === 11 /* StringLiteral */ ? innerAssignment : factory2.createAssignment(
      factory2.createElementAccessExpression(
        currentNamespaceContainerName,
        innerAssignment
      ),
      name
    );
    return setTextRange(
      factory2.createExpressionStatement(
        setTextRange(
          outerAssignment,
          member
        )
      ),
      member
    );
  }
  function transformEnumMemberDeclarationValue(member) {
    const value = resolver.getConstantValue(member);
    if (value !== void 0) {
      return typeof value === "string" ? factory2.createStringLiteral(value) : factory2.createNumericLiteral(value);
    } else {
      enableSubstitutionForNonQualifiedEnumMembers();
      if (member.initializer) {
        return Debug.checkDefined(visitNode(member.initializer, visitor, isExpression));
      } else {
        return factory2.createVoidZero();
      }
    }
  }
  function shouldEmitModuleDeclaration(nodeIn) {
    const node = getParseTreeNode(nodeIn, isModuleDeclaration);
    if (!node) {
      return true;
    }
    return isInstantiatedModule(node, shouldPreserveConstEnums(compilerOptions));
  }
  function recordEmittedDeclarationInScope(node) {
    if (!currentScopeFirstDeclarationsOfName) {
      currentScopeFirstDeclarationsOfName = /* @__PURE__ */ new Map();
    }
    const name = declaredNameInScope(node);
    if (!currentScopeFirstDeclarationsOfName.has(name)) {
      currentScopeFirstDeclarationsOfName.set(name, node);
    }
  }
  function isFirstEmittedDeclarationInScope(node) {
    if (currentScopeFirstDeclarationsOfName) {
      const name = declaredNameInScope(node);
      return currentScopeFirstDeclarationsOfName.get(name) === node;
    }
    return true;
  }
  function declaredNameInScope(node) {
    Debug.assertNode(node.name, isIdentifier);
    return node.name.escapedText;
  }
  function addVarForEnumOrModuleDeclaration(statements, node) {
    const varDecl = factory2.createVariableDeclaration(factory2.getLocalName(
      node,
      /*allowComments*/
      false,
      /*allowSourceMaps*/
      true
    ));
    const varFlags = currentLexicalScope.kind === 311 /* SourceFile */ ? 0 /* None */ : 1 /* Let */;
    const statement = factory2.createVariableStatement(
      visitNodes2(node.modifiers, modifierVisitor, isModifier),
      factory2.createVariableDeclarationList([varDecl], varFlags)
    );
    setOriginalNode(varDecl, node);
    setSyntheticLeadingComments(varDecl, void 0);
    setSyntheticTrailingComments(varDecl, void 0);
    setOriginalNode(statement, node);
    recordEmittedDeclarationInScope(node);
    if (isFirstEmittedDeclarationInScope(node)) {
      if (node.kind === 265 /* EnumDeclaration */) {
        setSourceMapRange(statement.declarationList, node);
      } else {
        setSourceMapRange(statement, node);
      }
      setCommentRange(statement, node);
      addEmitFlags(statement, 2048 /* NoTrailingComments */);
      statements.push(statement);
      return true;
    }
    return false;
  }
  function visitModuleDeclaration(node) {
    if (!shouldEmitModuleDeclaration(node)) {
      return factory2.createNotEmittedStatement(node);
    }
    Debug.assertNode(node.name, isIdentifier, "A TypeScript namespace should have an Identifier name.");
    enableSubstitutionForNamespaceExports();
    const statements = [];
    let emitFlags = 4 /* AdviseOnEmitNode */;
    const varAdded = addVarForEnumOrModuleDeclaration(statements, node);
    if (varAdded) {
      if (moduleKind !== 4 /* System */ || currentLexicalScope !== currentSourceFile) {
        emitFlags |= 1024 /* NoLeadingComments */;
      }
    }
    const parameterName = getNamespaceParameterName(node);
    const containerName = getNamespaceContainerName(node);
    const exportName = isExportOfNamespace(node) ? factory2.getExternalModuleOrNamespaceExportName(
      currentNamespaceContainerName,
      node,
      /*allowComments*/
      false,
      /*allowSourceMaps*/
      true
    ) : factory2.getDeclarationName(
      node,
      /*allowComments*/
      false,
      /*allowSourceMaps*/
      true
    );
    let moduleArg = factory2.createLogicalOr(
      exportName,
      factory2.createAssignment(
        exportName,
        factory2.createObjectLiteralExpression()
      )
    );
    if (isExportOfNamespace(node)) {
      const localName = factory2.getLocalName(
        node,
        /*allowComments*/
        false,
        /*allowSourceMaps*/
        true
      );
      moduleArg = factory2.createAssignment(localName, moduleArg);
    }
    const moduleStatement = factory2.createExpressionStatement(
      factory2.createCallExpression(
        factory2.createFunctionExpression(
          /*modifiers*/
          void 0,
          /*asteriskToken*/
          void 0,
          /*name*/
          void 0,
          /*typeParameters*/
          void 0,
          [factory2.createParameterDeclaration(
            /*modifiers*/
            void 0,
            /*dotDotDotToken*/
            void 0,
            parameterName
          )],
          /*type*/
          void 0,
          transformModuleBody(node, containerName)
        ),
        /*typeArguments*/
        void 0,
        [moduleArg]
      )
    );
    setOriginalNode(moduleStatement, node);
    if (varAdded) {
      setSyntheticLeadingComments(moduleStatement, void 0);
      setSyntheticTrailingComments(moduleStatement, void 0);
    }
    setTextRange(moduleStatement, node);
    addEmitFlags(moduleStatement, emitFlags);
    statements.push(moduleStatement);
    return statements;
  }
  function transformModuleBody(node, namespaceLocalName) {
    const savedCurrentNamespaceContainerName = currentNamespaceContainerName;
    const savedCurrentNamespace = currentNamespace;
    const savedCurrentScopeFirstDeclarationsOfName = currentScopeFirstDeclarationsOfName;
    currentNamespaceContainerName = namespaceLocalName;
    currentNamespace = node;
    currentScopeFirstDeclarationsOfName = void 0;
    const statements = [];
    startLexicalEnvironment();
    let statementsLocation;
    let blockLocation;
    if (node.body) {
      if (node.body.kind === 267 /* ModuleBlock */) {
        saveStateAndInvoke(node.body, (body) => addRange(statements, visitNodes2(body.statements, namespaceElementVisitor, isStatement)));
        statementsLocation = node.body.statements;
        blockLocation = node.body;
      } else {
        const result = visitModuleDeclaration(node.body);
        if (result) {
          if (isArray(result)) {
            addRange(statements, result);
          } else {
            statements.push(result);
          }
        }
        const moduleBlock = getInnerMostModuleDeclarationFromDottedModule(node).body;
        statementsLocation = moveRangePos(moduleBlock.statements, -1);
      }
    }
    insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
    currentNamespaceContainerName = savedCurrentNamespaceContainerName;
    currentNamespace = savedCurrentNamespace;
    currentScopeFirstDeclarationsOfName = savedCurrentScopeFirstDeclarationsOfName;
    const block = factory2.createBlock(
      setTextRange(
        factory2.createNodeArray(statements),
        /*location*/
        statementsLocation
      ),
      /*multiLine*/
      true
    );
    setTextRange(block, blockLocation);
    if (!node.body || node.body.kind !== 267 /* ModuleBlock */) {
      setEmitFlags(block, getEmitFlags(block) | 3072 /* NoComments */);
    }
    return block;
  }
  function getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration) {
    if (moduleDeclaration.body.kind === 266 /* ModuleDeclaration */) {
      const recursiveInnerModule = getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration.body);
      return recursiveInnerModule || moduleDeclaration.body;
    }
  }
  function visitImportDeclaration(node) {
    if (!node.importClause) {
      return node;
    }
    if (node.importClause.isTypeOnly) {
      return void 0;
    }
    const importClause = visitNode(node.importClause, visitImportClause, isImportClause);
    return importClause || compilerOptions.importsNotUsedAsValues === 1 /* Preserve */ || compilerOptions.importsNotUsedAsValues === 2 /* Error */ ? factory2.updateImportDeclaration(
      node,
      /*modifiers*/
      void 0,
      importClause,
      node.moduleSpecifier,
      node.assertClause
    ) : void 0;
  }
  function visitImportClause(node) {
    Debug.assert(!node.isTypeOnly);
    const name = shouldEmitAliasDeclaration(node) ? node.name : void 0;
    const namedBindings = visitNode(node.namedBindings, visitNamedImportBindings, isNamedImportBindings);
    return name || namedBindings ? factory2.updateImportClause(
      node,
      /*isTypeOnly*/
      false,
      name,
      namedBindings
    ) : void 0;
  }
  function visitNamedImportBindings(node) {
    if (node.kind === 273 /* NamespaceImport */) {
      return shouldEmitAliasDeclaration(node) ? node : void 0;
    } else {
      const allowEmpty = compilerOptions.verbatimModuleSyntax || compilerOptions.preserveValueImports && (compilerOptions.importsNotUsedAsValues === 1 /* Preserve */ || compilerOptions.importsNotUsedAsValues === 2 /* Error */);
      const elements = visitNodes2(node.elements, visitImportSpecifier, isImportSpecifier);
      return allowEmpty || some(elements) ? factory2.updateNamedImports(node, elements) : void 0;
    }
  }
  function visitImportSpecifier(node) {
    return !node.isTypeOnly && shouldEmitAliasDeclaration(node) ? node : void 0;
  }
  function visitExportAssignment(node) {
    return compilerOptions.verbatimModuleSyntax || resolver.isValueAliasDeclaration(node) ? visitEachChild(node, visitor, context) : void 0;
  }
  function visitExportDeclaration(node) {
    if (node.isTypeOnly) {
      return void 0;
    }
    if (!node.exportClause || isNamespaceExport(node.exportClause)) {
      return node;
    }
    const allowEmpty = compilerOptions.verbatimModuleSyntax || !!node.moduleSpecifier && (compilerOptions.importsNotUsedAsValues === 1 /* Preserve */ || compilerOptions.importsNotUsedAsValues === 2 /* Error */);
    const exportClause = visitNode(
      node.exportClause,
      (bindings) => visitNamedExportBindings(bindings, allowEmpty),
      isNamedExportBindings
    );
    return exportClause ? factory2.updateExportDeclaration(
      node,
      /*modifiers*/
      void 0,
      node.isTypeOnly,
      exportClause,
      node.moduleSpecifier,
      node.assertClause
    ) : void 0;
  }
  function visitNamedExports(node, allowEmpty) {
    const elements = visitNodes2(node.elements, visitExportSpecifier, isExportSpecifier);
    return allowEmpty || some(elements) ? factory2.updateNamedExports(node, elements) : void 0;
  }
  function visitNamespaceExports(node) {
    return factory2.updateNamespaceExport(node, Debug.checkDefined(visitNode(node.name, visitor, isIdentifier)));
  }
  function visitNamedExportBindings(node, allowEmpty) {
    return isNamespaceExport(node) ? visitNamespaceExports(node) : visitNamedExports(node, allowEmpty);
  }
  function visitExportSpecifier(node) {
    return !node.isTypeOnly && (compilerOptions.verbatimModuleSyntax || resolver.isValueAliasDeclaration(node)) ? node : void 0;
  }
  function shouldEmitImportEqualsDeclaration(node) {
    return shouldEmitAliasDeclaration(node) || !isExternalModule(currentSourceFile) && resolver.isTopLevelValueImportEqualsWithEntityName(node);
  }
  function visitImportEqualsDeclaration(node) {
    if (node.isTypeOnly) {
      return void 0;
    }
    if (isExternalModuleImportEqualsDeclaration(node)) {
      const isReferenced = shouldEmitAliasDeclaration(node);
      if (!isReferenced && compilerOptions.importsNotUsedAsValues === 1 /* Preserve */) {
        return setOriginalNode(
          setTextRange(
            factory2.createImportDeclaration(
              /*modifiers*/
              void 0,
              /*importClause*/
              void 0,
              node.moduleReference.expression,
              /*assertClause*/
              void 0
            ),
            node
          ),
          node
        );
      }
      return isReferenced ? visitEachChild(node, visitor, context) : void 0;
    }
    if (!shouldEmitImportEqualsDeclaration(node)) {
      return void 0;
    }
    const moduleReference = createExpressionFromEntityName(factory2, node.moduleReference);
    setEmitFlags(moduleReference, 3072 /* NoComments */ | 4096 /* NoNestedComments */);
    if (isNamedExternalModuleExport(node) || !isExportOfNamespace(node)) {
      return setOriginalNode(
        setTextRange(
          factory2.createVariableStatement(
            visitNodes2(node.modifiers, modifierVisitor, isModifier),
            factory2.createVariableDeclarationList([
              setOriginalNode(
                factory2.createVariableDeclaration(
                  node.name,
                  /*exclamationToken*/
                  void 0,
                  /*type*/
                  void 0,
                  moduleReference
                ),
                node
              )
            ])
          ),
          node
        ),
        node
      );
    } else {
      return setOriginalNode(
        createNamespaceExport(
          node.name,
          moduleReference,
          node
        ),
        node
      );
    }
  }
  function isExportOfNamespace(node) {
    return currentNamespace !== void 0 && hasSyntacticModifier(node, 1 /* Export */);
  }
  function isExternalModuleExport(node) {
    return currentNamespace === void 0 && hasSyntacticModifier(node, 1 /* Export */);
  }
  function isNamedExternalModuleExport(node) {
    return isExternalModuleExport(node) && !hasSyntacticModifier(node, 1024 /* Default */);
  }
  function isDefaultExternalModuleExport(node) {
    return isExternalModuleExport(node) && hasSyntacticModifier(node, 1024 /* Default */);
  }
  function createExportMemberAssignmentStatement(node) {
    const expression = factory2.createAssignment(
      factory2.getExternalModuleOrNamespaceExportName(
        currentNamespaceContainerName,
        node,
        /*allowComments*/
        false,
        /*allowSourceMaps*/
        true
      ),
      factory2.getLocalName(node)
    );
    setSourceMapRange(expression, createRange(node.name ? node.name.pos : node.pos, node.end));
    const statement = factory2.createExpressionStatement(expression);
    setSourceMapRange(statement, createRange(-1, node.end));
    return statement;
  }
  function addExportMemberAssignment(statements, node) {
    statements.push(createExportMemberAssignmentStatement(node));
  }
  function createNamespaceExport(exportName, exportValue, location) {
    return setTextRange(
      factory2.createExpressionStatement(
        factory2.createAssignment(
          factory2.getNamespaceMemberName(
            currentNamespaceContainerName,
            exportName,
            /*allowComments*/
            false,
            /*allowSourceMaps*/
            true
          ),
          exportValue
        )
      ),
      location
    );
  }
  function createNamespaceExportExpression(exportName, exportValue, location) {
    return setTextRange(factory2.createAssignment(getNamespaceMemberNameWithSourceMapsAndWithoutComments(exportName), exportValue), location);
  }
  function getNamespaceMemberNameWithSourceMapsAndWithoutComments(name) {
    return factory2.getNamespaceMemberName(
      currentNamespaceContainerName,
      name,
      /*allowComments*/
      false,
      /*allowSourceMaps*/
      true
    );
  }
  function getNamespaceParameterName(node) {
    const name = factory2.getGeneratedNameForNode(node);
    setSourceMapRange(name, node.name);
    return name;
  }
  function getNamespaceContainerName(node) {
    return factory2.getGeneratedNameForNode(node);
  }
  function enableSubstitutionForNonQualifiedEnumMembers() {
    if ((enabledSubstitutions & 8 /* NonQualifiedEnumMembers */) === 0) {
      enabledSubstitutions |= 8 /* NonQualifiedEnumMembers */;
      context.enableSubstitution(80 /* Identifier */);
    }
  }
  function enableSubstitutionForNamespaceExports() {
    if ((enabledSubstitutions & 2 /* NamespaceExports */) === 0) {
      enabledSubstitutions |= 2 /* NamespaceExports */;
      context.enableSubstitution(80 /* Identifier */);
      context.enableSubstitution(303 /* ShorthandPropertyAssignment */);
      context.enableEmitNotification(266 /* ModuleDeclaration */);
    }
  }
  function isTransformedModuleDeclaration(node) {
    return getOriginalNode(node).kind === 266 /* ModuleDeclaration */;
  }
  function isTransformedEnumDeclaration(node) {
    return getOriginalNode(node).kind === 265 /* EnumDeclaration */;
  }
  function onEmitNode(hint, node, emitCallback) {
    const savedApplicableSubstitutions = applicableSubstitutions;
    const savedCurrentSourceFile = currentSourceFile;
    if (isSourceFile(node)) {
      currentSourceFile = node;
    }
    if (enabledSubstitutions & 2 /* NamespaceExports */ && isTransformedModuleDeclaration(node)) {
      applicableSubstitutions |= 2 /* NamespaceExports */;
    }
    if (enabledSubstitutions & 8 /* NonQualifiedEnumMembers */ && isTransformedEnumDeclaration(node)) {
      applicableSubstitutions |= 8 /* NonQualifiedEnumMembers */;
    }
    previousOnEmitNode(hint, node, emitCallback);
    applicableSubstitutions = savedApplicableSubstitutions;
    currentSourceFile = savedCurrentSourceFile;
  }
  function onSubstituteNode(hint, node) {
    node = previousOnSubstituteNode(hint, node);
    if (hint === 1 /* Expression */) {
      return substituteExpression(node);
    } else if (isShorthandPropertyAssignment(node)) {
      return substituteShorthandPropertyAssignment(node);
    }
    return node;
  }
  function substituteShorthandPropertyAssignment(node) {
    if (enabledSubstitutions & 2 /* NamespaceExports */) {
      const name = node.name;
      const exportedName = trySubstituteNamespaceExportedName(name);
      if (exportedName) {
        if (node.objectAssignmentInitializer) {
          const initializer = factory2.createAssignment(exportedName, node.objectAssignmentInitializer);
          return setTextRange(factory2.createPropertyAssignment(name, initializer), node);
        }
        return setTextRange(factory2.createPropertyAssignment(name, exportedName), node);
      }
    }
    return node;
  }
  function substituteExpression(node) {
    switch (node.kind) {
      case 80 /* Identifier */:
        return substituteExpressionIdentifier(node);
      case 210 /* PropertyAccessExpression */:
        return substitutePropertyAccessExpression(node);
      case 211 /* ElementAccessExpression */:
        return substituteElementAccessExpression(node);
    }
    return node;
  }
  function substituteExpressionIdentifier(node) {
    return trySubstituteNamespaceExportedName(node) || node;
  }
  function trySubstituteNamespaceExportedName(node) {
    if (enabledSubstitutions & applicableSubstitutions && !isGeneratedIdentifier(node) && !isLocalName(node)) {
      const container = resolver.getReferencedExportContainer(
        node,
        /*prefixLocals*/
        false
      );
      if (container && container.kind !== 311 /* SourceFile */) {
        const substitute = applicableSubstitutions & 2 /* NamespaceExports */ && container.kind === 266 /* ModuleDeclaration */ || applicableSubstitutions & 8 /* NonQualifiedEnumMembers */ && container.kind === 265 /* EnumDeclaration */;
        if (substitute) {
          return setTextRange(
            factory2.createPropertyAccessExpression(factory2.getGeneratedNameForNode(container), node),
            /*location*/
            node
          );
        }
      }
    }
    return void 0;
  }
  function substitutePropertyAccessExpression(node) {
    return substituteConstantValue(node);
  }
  function substituteElementAccessExpression(node) {
    return substituteConstantValue(node);
  }
  function safeMultiLineComment(value) {
    return value.replace(/\*\//g, "*_/");
  }
  function substituteConstantValue(node) {
    const constantValue = tryGetConstEnumValue(node);
    if (constantValue !== void 0) {
      setConstantValue(node, constantValue);
      const substitute = typeof constantValue === "string" ? factory2.createStringLiteral(constantValue) : factory2.createNumericLiteral(constantValue);
      if (!compilerOptions.removeComments) {
        const originalNode = getOriginalNode(node, isAccessExpression);
        addSyntheticTrailingComment(substitute, 3 /* MultiLineCommentTrivia */, ` ${safeMultiLineComment(getTextOfNode(originalNode))} `);
      }
      return substitute;
    }
    return node;
  }
  function tryGetConstEnumValue(node) {
    if (getIsolatedModules(compilerOptions)) {
      return void 0;
    }
    return isPropertyAccessExpression(node) || isElementAccessExpression(node) ? resolver.getConstantValue(node) : void 0;
  }
  function shouldEmitAliasDeclaration(node) {
    return compilerOptions.verbatimModuleSyntax || isInJSFile(node) || (compilerOptions.preserveValueImports ? resolver.isValueAliasDeclaration(node) : resolver.isReferencedAliasDeclaration(node));
  }
}

// src/compiler/transformers/classFields.ts
function transformClassFields(context) {
  const {
    factory: factory2,
    getEmitHelperFactory: emitHelpers,
    hoistVariableDeclaration,
    endLexicalEnvironment,
    startLexicalEnvironment,
    resumeLexicalEnvironment,
    addBlockScopedVariable
  } = context;
  const resolver = context.getEmitResolver();
  const compilerOptions = context.getCompilerOptions();
  const languageVersion = getEmitScriptTarget(compilerOptions);
  const useDefineForClassFields = getUseDefineForClassFields(compilerOptions);
  const legacyDecorators = !!compilerOptions.experimentalDecorators;
  const shouldTransformInitializersUsingSet = !useDefineForClassFields;
  const shouldTransformInitializersUsingDefine = useDefineForClassFields && languageVersion < 9 /* ES2022 */;
  const shouldTransformInitializers = shouldTransformInitializersUsingSet || shouldTransformInitializersUsingDefine;
  const shouldTransformPrivateElementsOrClassStaticBlocks = languageVersion < 9 /* ES2022 */;
  const shouldTransformAutoAccessors = languageVersion < 99 /* ESNext */ ? -1 /* True */ : !useDefineForClassFields ? 3 /* Maybe */ : 0 /* False */;
  const shouldTransformThisInStaticInitializers = languageVersion < 9 /* ES2022 */;
  const shouldTransformSuperInStaticInitializers = shouldTransformThisInStaticInitializers && languageVersion >= 2 /* ES2015 */;
  const shouldTransformAnything = shouldTransformInitializers || shouldTransformPrivateElementsOrClassStaticBlocks || shouldTransformAutoAccessors === -1 /* True */;
  const previousOnSubstituteNode = context.onSubstituteNode;
  context.onSubstituteNode = onSubstituteNode;
  const previousOnEmitNode = context.onEmitNode;
  context.onEmitNode = onEmitNode;
  let shouldTransformPrivateStaticElementsInFile = false;
  let enabledSubstitutions;
  let classAliases;
  let pendingExpressions;
  let pendingStatements;
  let lexicalEnvironment;
  const lexicalEnvironmentMap = /* @__PURE__ */ new Map();
  let currentClassContainer;
  let currentStaticPropertyDeclarationOrStaticBlock;
  let shouldSubstituteThisWithClassThis = false;
  let previousShouldSubstituteThisWithClassThis = false;
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    if (node.isDeclarationFile) {
      return node;
    }
    lexicalEnvironment = void 0;
    shouldTransformPrivateStaticElementsInFile = !!(getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */);
    if (!shouldTransformAnything && !shouldTransformPrivateStaticElementsInFile) {
      return node;
    }
    const visited = visitEachChild(node, visitor, context);
    addEmitHelpers(visited, context.readEmitHelpers());
    return visited;
  }
  function modifierVisitor(node) {
    switch (node.kind) {
      case 129 /* AccessorKeyword */:
        return shouldTransformAutoAccessorsInCurrentClass() ? void 0 : node;
      default:
        return tryCast(node, isModifier);
    }
  }
  function visitor(node) {
    if (!(node.transformFlags & 16777216 /* ContainsClassFields */) && !(node.transformFlags & 134234112 /* ContainsLexicalThisOrSuper */)) {
      return node;
    }
    switch (node.kind) {
      case 129 /* AccessorKeyword */:
        return Debug.fail("Use `modifierVisitor` instead.");
      case 262 /* ClassDeclaration */:
        return visitClassDeclaration(node);
      case 230 /* ClassExpression */:
        return visitClassExpression(
          node,
          /*referencedName*/
          void 0
        );
      case 174 /* ClassStaticBlockDeclaration */:
      case 171 /* PropertyDeclaration */:
        return Debug.fail("Use `classElementVisitor` instead.");
      case 302 /* PropertyAssignment */:
        return visitPropertyAssignment(node);
      case 242 /* VariableStatement */:
        return visitVariableStatement(node);
      case 259 /* VariableDeclaration */:
        return visitVariableDeclaration(node);
      case 168 /* Parameter */:
        return visitParameterDeclaration(node);
      case 207 /* BindingElement */:
        return visitBindingElement(node);
      case 276 /* ExportAssignment */:
        return visitExportAssignment(node);
      case 81 /* PrivateIdentifier */:
        return visitPrivateIdentifier(node);
      case 210 /* PropertyAccessExpression */:
        return visitPropertyAccessExpression(node);
      case 211 /* ElementAccessExpression */:
        return visitElementAccessExpression(node);
      case 223 /* PrefixUnaryExpression */:
      case 224 /* PostfixUnaryExpression */:
        return visitPreOrPostfixUnaryExpression(
          node,
          /*discarded*/
          false
        );
      case 225 /* BinaryExpression */:
        return visitBinaryExpression(
          node,
          /*discarded*/
          false
        );
      case 216 /* ParenthesizedExpression */:
        return visitParenthesizedExpression(
          node,
          /*discarded*/
          false,
          /*referencedName*/
          void 0
        );
      case 212 /* CallExpression */:
        return visitCallExpression(node);
      case 243 /* ExpressionStatement */:
        return visitExpressionStatement(node);
      case 214 /* TaggedTemplateExpression */:
        return visitTaggedTemplateExpression(node);
      case 247 /* ForStatement */:
        return visitForStatement(node);
      case 261 /* FunctionDeclaration */:
      case 217 /* FunctionExpression */:
      case 175 /* Constructor */:
      case 173 /* MethodDeclaration */:
      case 176 /* GetAccessor */:
      case 177 /* SetAccessor */: {
        return setCurrentStaticPropertyDeclarationOrStaticBlockAnd(
          /*current*/
          void 0,
          fallbackVisitor,
          node
        );
      }
      default:
        return fallbackVisitor(node);
    }
  }
  function fallbackVisitor(node) {
    return visitEachChild(node, visitor, context);
  }
  function namedEvaluationVisitor(node, referencedName) {
    switch (node.kind) {
      case 359 /* PartiallyEmittedExpression */:
        return visitPartiallyEmittedExpression(
          node,
          /*discarded*/
          false,
          referencedName
        );
      case 216 /* ParenthesizedExpression */:
        return visitParenthesizedExpression(
          node,
          /*discarded*/
          false,
          referencedName
        );
      case 230 /* ClassExpression */:
        return visitClassExpression(node, referencedName);
      default:
        return visitor(node);
    }
  }
  function discardedValueVisitor(node) {
    switch (node.kind) {
      case 223 /* PrefixUnaryExpression */:
      case 224 /* PostfixUnaryExpression */:
        return visitPreOrPostfixUnaryExpression(
          node,
          /*discarded*/
          true
        );
      case 225 /* BinaryExpression */:
        return visitBinaryExpression(
          node,
          /*discarded*/
          true
        );
      case 360 /* CommaListExpression */:
        return visitCommaListExpression(
          node,
          /*discarded*/
          true
        );
      case 216 /* ParenthesizedExpression */:
        return visitParenthesizedExpression(
          node,
          /*discarded*/
          true,
          /*referencedName*/
          void 0
        );
      default:
        return visitor(node);
    }
  }
  function heritageClauseVisitor(node) {
    switch (node.kind) {
      case 297 /* HeritageClause */:
        return visitEachChild(node, heritageClauseVisitor, context);
      case 232 /* ExpressionWithTypeArguments */:
        return visitExpressionWithTypeArgumentsInHeritageClause(node);
      default:
        return visitor(node);
    }
  }
  function assignmentTargetVisitor(node) {
    switch (node.kind) {
      case 209 /* ObjectLiteralExpression */:
      case 208 /* ArrayLiteralExpression */:
        return visitAssignmentPattern(node);
      default:
        return visitor(node);
    }
  }
  function classElementVisitor(node) {
    switch (node.kind) {
      case 175 /* Constructor */:
        return visitConstructorDeclaration(node);
      case 176 /* GetAccessor */:
      case 177 /* SetAccessor */:
      case 173 /* MethodDeclaration */:
        return setCurrentStaticPropertyDeclarationOrStaticBlockAnd(
          /*current*/
          void 0,
          visitMethodOrAccessorDeclaration,
          node
        );
      case 171 /* PropertyDeclaration */:
        return setCurrentStaticPropertyDeclarationOrStaticBlockAnd(
          /*current*/
          void 0,
          visitPropertyDeclaration,
          node
        );
      case 174 /* ClassStaticBlockDeclaration */:
        return visitClassStaticBlockDeclaration(node);
      case 166 /* ComputedPropertyName */:
        return visitComputedPropertyName(node);
      case 239 /* SemicolonClassElement */:
        return node;
      default:
        return isModifierLike(node) ? modifierVisitor(node) : visitor(node);
    }
  }
  function propertyNameVisitor(node) {
    switch (node.kind) {
      case 166 /* ComputedPropertyName */:
        return visitComputedPropertyName(node);
      default:
        return visitor(node);
    }
  }
  function accessorFieldResultVisitor(node) {
    switch (node.kind) {
      case 171 /* PropertyDeclaration */:
        return transformFieldInitializer(node);
      case 176 /* GetAccessor */:
      case 177 /* SetAccessor */:
        return classElementVisitor(node);
      default:
        Debug.assertMissingNode(node, "Expected node to either be a PropertyDeclaration, GetAccessorDeclaration, or SetAccessorDeclaration");
        break;
    }
  }
  function visitPrivateIdentifier(node) {
    if (!shouldTransformPrivateElementsOrClassStaticBlocks) {
      return node;
    }
    if (isStatement(node.parent)) {
      return node;
    }
    return setOriginalNode(factory2.createIdentifier(""), node);
  }
  function transformPrivateIdentifierInInExpression(node) {
    const info = accessPrivateIdentifier2(node.left);
    if (info) {
      const receiver = visitNode(node.right, visitor, isExpression);
      return setOriginalNode(
        emitHelpers().createClassPrivateFieldInHelper(info.brandCheckIdentifier, receiver),
        node
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitPropertyAssignment(node) {
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const { referencedName, name } = visitReferencedPropertyName(node.name);
      const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, referencedName), isExpression);
      return factory2.updatePropertyAssignment(node, name, initializer);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitVariableStatement(node) {
    const savedPendingStatements = pendingStatements;
    pendingStatements = [];
    const visitedNode = visitEachChild(node, visitor, context);
    const statement = some(pendingStatements) ? [visitedNode, ...pendingStatements] : visitedNode;
    pendingStatements = savedPendingStatements;
    return statement;
  }
  function getAssignedNameOfIdentifier(name, initializer) {
    const originalClass = getOriginalNode(initializer, isClassLike);
    return originalClass && !originalClass.name && hasSyntacticModifier(originalClass, 1024 /* Default */) ? factory2.createStringLiteral("default") : factory2.createStringLiteralFromNode(name);
  }
  function visitVariableDeclaration(node) {
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
      const name = visitNode(node.name, visitor, isBindingName);
      const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
      return factory2.updateVariableDeclaration(
        node,
        name,
        /*exclamationToken*/
        void 0,
        /*type*/
        void 0,
        initializer
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitParameterDeclaration(node) {
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
      const name = visitNode(node.name, visitor, isBindingName);
      const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
      return factory2.updateParameterDeclaration(
        node,
        /*modifiers*/
        void 0,
        /*dotDotDotToken*/
        void 0,
        name,
        /*questionToken*/
        void 0,
        /*type*/
        void 0,
        initializer
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitBindingElement(node) {
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
      const propertyName = visitNode(node.propertyName, visitor, isPropertyName);
      const name = visitNode(node.name, visitor, isBindingName);
      const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
      return factory2.updateBindingElement(
        node,
        /*dotDotDotToken*/
        void 0,
        propertyName,
        name,
        initializer
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitExportAssignment(node) {
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const assignedName = factory2.createStringLiteral(node.isExportEquals ? "" : "default");
      const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
      const expression = visitNode(node.expression, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
      return factory2.updateExportAssignment(node, modifiers, expression);
    }
    return visitEachChild(node, visitor, context);
  }
  function injectPendingExpressions(expression) {
    if (some(pendingExpressions)) {
      if (isParenthesizedExpression(expression)) {
        pendingExpressions.push(expression.expression);
        expression = factory2.updateParenthesizedExpression(expression, factory2.inlineExpressions(pendingExpressions));
      } else {
        pendingExpressions.push(expression);
        expression = factory2.inlineExpressions(pendingExpressions);
      }
      pendingExpressions = void 0;
    }
    return expression;
  }
  function visitComputedPropertyName(node) {
    const expression = visitNode(node.expression, visitor, isExpression);
    return factory2.updateComputedPropertyName(node, injectPendingExpressions(expression));
  }
  function visitConstructorDeclaration(node) {
    if (currentClassContainer) {
      return transformConstructor(node, currentClassContainer);
    }
    return fallbackVisitor(node);
  }
  function shouldTransformClassElementToWeakMap(node) {
    if (shouldTransformPrivateElementsOrClassStaticBlocks)
      return true;
    if (hasStaticModifier(node) && getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */)
      return true;
    return false;
  }
  function visitMethodOrAccessorDeclaration(node) {
    Debug.assert(!hasDecorators(node));
    if (!isPrivateIdentifierClassElementDeclaration(node) || !shouldTransformClassElementToWeakMap(node)) {
      return visitEachChild(node, classElementVisitor, context);
    }
    const info = accessPrivateIdentifier2(node.name);
    Debug.assert(info, "Undeclared private name for property declaration.");
    if (!info.isValid) {
      return node;
    }
    const functionName = getHoistedFunctionName(node);
    if (functionName) {
      getPendingExpressions().push(
        factory2.createAssignment(
          functionName,
          factory2.createFunctionExpression(
            filter(node.modifiers, (m) => isModifier(m) && !isStaticModifier(m) && !isAccessorModifier(m)),
            node.asteriskToken,
            functionName,
            /*typeParameters*/
            void 0,
            visitParameterList(node.parameters, visitor, context),
            /*type*/
            void 0,
            visitFunctionBody(node.body, visitor, context)
          )
        )
      );
    }
    return void 0;
  }
  function setCurrentStaticPropertyDeclarationOrStaticBlockAnd(current, visitor2, arg) {
    const savedCurrentStaticPropertyDeclarationOrStaticBlock = currentStaticPropertyDeclarationOrStaticBlock;
    currentStaticPropertyDeclarationOrStaticBlock = current;
    const result = visitor2(arg);
    currentStaticPropertyDeclarationOrStaticBlock = savedCurrentStaticPropertyDeclarationOrStaticBlock;
    return result;
  }
  function getHoistedFunctionName(node) {
    Debug.assert(isPrivateIdentifier(node.name));
    const info = accessPrivateIdentifier2(node.name);
    Debug.assert(info, "Undeclared private name for property declaration.");
    if (info.kind === "m" /* Method */) {
      return info.methodName;
    }
    if (info.kind === "a" /* Accessor */) {
      if (isGetAccessor(node)) {
        return info.getterName;
      }
      if (isSetAccessor(node)) {
        return info.setterName;
      }
    }
  }
  function transformAutoAccessor(node) {
    const commentRange = getCommentRange(node);
    const sourceMapRange = getSourceMapRange(node);
    const name = node.name;
    let getterName = name;
    let setterName = name;
    if (isComputedPropertyName(name) && !isSimpleInlineableExpression(name.expression)) {
      const cacheAssignment = findComputedPropertyNameCacheAssignment(name);
      if (cacheAssignment) {
        getterName = factory2.updateComputedPropertyName(name, visitNode(name.expression, visitor, isExpression));
        setterName = factory2.updateComputedPropertyName(name, cacheAssignment.left);
      } else {
        const temp = factory2.createTempVariable(hoistVariableDeclaration);
        setSourceMapRange(temp, name.expression);
        const expression = visitNode(name.expression, visitor, isExpression);
        const assignment = factory2.createAssignment(temp, expression);
        setSourceMapRange(assignment, name.expression);
        getterName = factory2.updateComputedPropertyName(name, assignment);
        setterName = factory2.updateComputedPropertyName(name, temp);
      }
    }
    const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
    const backingField = createAccessorPropertyBackingField(factory2, node, modifiers, node.initializer);
    setOriginalNode(backingField, node);
    setEmitFlags(backingField, 3072 /* NoComments */);
    setSourceMapRange(backingField, sourceMapRange);
    const getter = createAccessorPropertyGetRedirector(factory2, node, modifiers, getterName);
    setOriginalNode(getter, node);
    setCommentRange(getter, commentRange);
    setSourceMapRange(getter, sourceMapRange);
    const setter = createAccessorPropertySetRedirector(factory2, node, modifiers, setterName);
    setOriginalNode(setter, node);
    setEmitFlags(setter, 3072 /* NoComments */);
    setSourceMapRange(setter, sourceMapRange);
    return visitArray([backingField, getter, setter], accessorFieldResultVisitor, isClassElement);
  }
  function transformPrivateFieldInitializer(node) {
    if (shouldTransformClassElementToWeakMap(node)) {
      const info = accessPrivateIdentifier2(node.name);
      Debug.assert(info, "Undeclared private name for property declaration.");
      if (!info.isValid) {
        return node;
      }
      if (info.isStatic && !shouldTransformPrivateElementsOrClassStaticBlocks) {
        const statement = transformPropertyOrClassStaticBlock(node, factory2.createThis());
        if (statement) {
          return factory2.createClassStaticBlockDeclaration(factory2.createBlock(
            [statement],
            /*multiLine*/
            true
          ));
        }
      }
      return void 0;
    }
    if (shouldTransformInitializersUsingSet && !isStatic(node) && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) && lexicalEnvironment.data.facts & 16 /* WillHoistInitializersToConstructor */) {
      return factory2.updatePropertyDeclaration(
        node,
        visitNodes2(node.modifiers, visitor, isModifierLike),
        node.name,
        /*questionOrExclamationToken*/
        void 0,
        /*type*/
        void 0,
        /*initializer*/
        void 0
      );
    }
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const { referencedName, name } = visitReferencedPropertyName(node.name);
      return factory2.updatePropertyDeclaration(
        node,
        visitNodes2(node.modifiers, modifierVisitor, isModifier),
        name,
        /*questionOrExclamationToken*/
        void 0,
        /*type*/
        void 0,
        visitNode(node.initializer, (child) => namedEvaluationVisitor(child, referencedName), isExpression)
      );
    }
    return factory2.updatePropertyDeclaration(
      node,
      visitNodes2(node.modifiers, modifierVisitor, isModifier),
      visitNode(node.name, propertyNameVisitor, isPropertyName),
      /*questionOrExclamationToken*/
      void 0,
      /*type*/
      void 0,
      visitNode(node.initializer, visitor, isExpression)
    );
  }
  function transformPublicFieldInitializer(node) {
    if (shouldTransformInitializers && !isAutoAccessorPropertyDeclaration(node)) {
      const expr = getPropertyNameExpressionIfNeeded(
        node.name,
        /*shouldHoist*/
        !!node.initializer || useDefineForClassFields,
        /*captureReferencedName*/
        isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)
      );
      if (expr) {
        getPendingExpressions().push(...flattenCommaList(expr));
      }
      if (isStatic(node) && !shouldTransformPrivateElementsOrClassStaticBlocks) {
        const initializerStatement = transformPropertyOrClassStaticBlock(node, factory2.createThis());
        if (initializerStatement) {
          const staticBlock = factory2.createClassStaticBlockDeclaration(
            factory2.createBlock([initializerStatement])
          );
          setOriginalNode(staticBlock, node);
          setCommentRange(staticBlock, node);
          setCommentRange(initializerStatement, { pos: -1, end: -1 });
          setSyntheticLeadingComments(initializerStatement, void 0);
          setSyntheticTrailingComments(initializerStatement, void 0);
          return staticBlock;
        }
      }
      return void 0;
    }
    return factory2.updatePropertyDeclaration(
      node,
      visitNodes2(node.modifiers, modifierVisitor, isModifier),
      visitNode(node.name, propertyNameVisitor, isPropertyName),
      /*questionOrExclamationToken*/
      void 0,
      /*type*/
      void 0,
      visitNode(node.initializer, visitor, isExpression)
    );
  }
  function transformFieldInitializer(node) {
    Debug.assert(!hasDecorators(node), "Decorators should already have been transformed and elided.");
    return isPrivateIdentifierClassElementDeclaration(node) ? transformPrivateFieldInitializer(node) : transformPublicFieldInitializer(node);
  }
  function shouldTransformAutoAccessorsInCurrentClass() {
    return shouldTransformAutoAccessors === -1 /* True */ || shouldTransformAutoAccessors === 3 /* Maybe */ && !!(lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) && !!(lexicalEnvironment.data.facts & 16 /* WillHoistInitializersToConstructor */);
  }
  function visitPropertyDeclaration(node) {
    if (isAutoAccessorPropertyDeclaration(node) && (shouldTransformAutoAccessorsInCurrentClass() || hasStaticModifier(node) && getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */)) {
      return transformAutoAccessor(node);
    }
    return transformFieldInitializer(node);
  }
  function createPrivateIdentifierAccess(info, receiver) {
    return createPrivateIdentifierAccessHelper(info, visitNode(receiver, visitor, isExpression));
  }
  function createPrivateIdentifierAccessHelper(info, receiver) {
    setCommentRange(receiver, moveRangePos(receiver, -1));
    switch (info.kind) {
      case "a" /* Accessor */:
        return emitHelpers().createClassPrivateFieldGetHelper(
          receiver,
          info.brandCheckIdentifier,
          info.kind,
          info.getterName
        );
      case "m" /* Method */:
        return emitHelpers().createClassPrivateFieldGetHelper(
          receiver,
          info.brandCheckIdentifier,
          info.kind,
          info.methodName
        );
      case "f" /* Field */:
        return emitHelpers().createClassPrivateFieldGetHelper(
          receiver,
          info.brandCheckIdentifier,
          info.kind,
          info.isStatic ? info.variableName : void 0
        );
      case "untransformed":
        return Debug.fail("Access helpers should not be created for untransformed private elements");
      default:
        Debug.assertNever(info, "Unknown private element type");
    }
  }
  function visitPropertyAccessExpression(node) {
    if (isPrivateIdentifier(node.name)) {
      const privateIdentifierInfo = accessPrivateIdentifier2(node.name);
      if (privateIdentifierInfo) {
        return setTextRange(
          setOriginalNode(
            createPrivateIdentifierAccess(privateIdentifierInfo, node.expression),
            node
          ),
          node
        );
      }
    }
    if (shouldTransformSuperInStaticInitializers && isSuperProperty(node) && isIdentifier(node.name) && currentStaticPropertyDeclarationOrStaticBlock && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) {
      const { classConstructor, superClassReference, facts } = lexicalEnvironment.data;
      if (facts & 1 /* ClassWasDecorated */) {
        return visitInvalidSuperProperty(node);
      }
      if (classConstructor && superClassReference) {
        const superProperty = factory2.createReflectGetCall(
          superClassReference,
          factory2.createStringLiteralFromNode(node.name),
          classConstructor
        );
        setOriginalNode(superProperty, node.expression);
        setTextRange(superProperty, node.expression);
        return superProperty;
      }
    }
    return visitEachChild(node, visitor, context);
  }
  function visitElementAccessExpression(node) {
    if (shouldTransformSuperInStaticInitializers && isSuperProperty(node) && currentStaticPropertyDeclarationOrStaticBlock && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) {
      const { classConstructor, superClassReference, facts } = lexicalEnvironment.data;
      if (facts & 1 /* ClassWasDecorated */) {
        return visitInvalidSuperProperty(node);
      }
      if (classConstructor && superClassReference) {
        const superProperty = factory2.createReflectGetCall(
          superClassReference,
          visitNode(node.argumentExpression, visitor, isExpression),
          classConstructor
        );
        setOriginalNode(superProperty, node.expression);
        setTextRange(superProperty, node.expression);
        return superProperty;
      }
    }
    return visitEachChild(node, visitor, context);
  }
  function visitPreOrPostfixUnaryExpression(node, discarded) {
    if (node.operator === 46 /* PlusPlusToken */ || node.operator === 47 /* MinusMinusToken */) {
      const operand = skipParentheses(node.operand);
      if (isPrivateIdentifierPropertyAccessExpression(operand)) {
        let info;
        if (info = accessPrivateIdentifier2(operand.name)) {
          const receiver = visitNode(operand.expression, visitor, isExpression);
          const { readExpression, initializeExpression } = createCopiableReceiverExpr(receiver);
          let expression = createPrivateIdentifierAccess(info, readExpression);
          const temp = isPrefixUnaryExpression(node) || discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration);
          expression = expandPreOrPostfixIncrementOrDecrementExpression(factory2, node, expression, hoistVariableDeclaration, temp);
          expression = createPrivateIdentifierAssignment(
            info,
            initializeExpression || readExpression,
            expression,
            64 /* EqualsToken */
          );
          setOriginalNode(expression, node);
          setTextRange(expression, node);
          if (temp) {
            expression = factory2.createComma(expression, temp);
            setTextRange(expression, node);
          }
          return expression;
        }
      } else if (shouldTransformSuperInStaticInitializers && isSuperProperty(operand) && currentStaticPropertyDeclarationOrStaticBlock && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) {
        const { classConstructor, superClassReference, facts } = lexicalEnvironment.data;
        if (facts & 1 /* ClassWasDecorated */) {
          const expression = visitInvalidSuperProperty(operand);
          return isPrefixUnaryExpression(node) ? factory2.updatePrefixUnaryExpression(node, expression) : factory2.updatePostfixUnaryExpression(node, expression);
        }
        if (classConstructor && superClassReference) {
          let setterName;
          let getterName;
          if (isPropertyAccessExpression(operand)) {
            if (isIdentifier(operand.name)) {
              getterName = setterName = factory2.createStringLiteralFromNode(operand.name);
            }
          } else {
            if (isSimpleInlineableExpression(operand.argumentExpression)) {
              getterName = setterName = operand.argumentExpression;
            } else {
              getterName = factory2.createTempVariable(hoistVariableDeclaration);
              setterName = factory2.createAssignment(getterName, visitNode(operand.argumentExpression, visitor, isExpression));
            }
          }
          if (setterName && getterName) {
            let expression = factory2.createReflectGetCall(superClassReference, getterName, classConstructor);
            setTextRange(expression, operand);
            const temp = discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration);
            expression = expandPreOrPostfixIncrementOrDecrementExpression(factory2, node, expression, hoistVariableDeclaration, temp);
            expression = factory2.createReflectSetCall(superClassReference, setterName, expression, classConstructor);
            setOriginalNode(expression, node);
            setTextRange(expression, node);
            if (temp) {
              expression = factory2.createComma(expression, temp);
              setTextRange(expression, node);
            }
            return expression;
          }
        }
      }
    }
    return visitEachChild(node, visitor, context);
  }
  function visitForStatement(node) {
    return factory2.updateForStatement(
      node,
      visitNode(node.initializer, discardedValueVisitor, isForInitializer),
      visitNode(node.condition, visitor, isExpression),
      visitNode(node.incrementor, discardedValueVisitor, isExpression),
      visitIterationBody(node.statement, visitor, context)
    );
  }
  function visitExpressionStatement(node) {
    return factory2.updateExpressionStatement(
      node,
      visitNode(node.expression, discardedValueVisitor, isExpression)
    );
  }
  function createCopiableReceiverExpr(receiver) {
    const clone2 = nodeIsSynthesized(receiver) ? receiver : factory2.cloneNode(receiver);
    if (isSimpleInlineableExpression(receiver)) {
      return { readExpression: clone2, initializeExpression: void 0 };
    }
    const readExpression = factory2.createTempVariable(hoistVariableDeclaration);
    const initializeExpression = factory2.createAssignment(readExpression, clone2);
    return { readExpression, initializeExpression };
  }
  function visitCallExpression(node) {
    var _a;
    if (isPrivateIdentifierPropertyAccessExpression(node.expression) && accessPrivateIdentifier2(node.expression.name)) {
      const { thisArg, target } = factory2.createCallBinding(node.expression, hoistVariableDeclaration, languageVersion);
      if (isCallChain(node)) {
        return factory2.updateCallChain(
          node,
          factory2.createPropertyAccessChain(visitNode(target, visitor, isExpression), node.questionDotToken, "call"),
          /*questionDotToken*/
          void 0,
          /*typeArguments*/
          void 0,
          [visitNode(thisArg, visitor, isExpression), ...visitNodes2(node.arguments, visitor, isExpression)]
        );
      }
      return factory2.updateCallExpression(
        node,
        factory2.createPropertyAccessExpression(visitNode(target, visitor, isExpression), "call"),
        /*typeArguments*/
        void 0,
        [visitNode(thisArg, visitor, isExpression), ...visitNodes2(node.arguments, visitor, isExpression)]
      );
    }
    if (shouldTransformSuperInStaticInitializers && isSuperProperty(node.expression) && currentStaticPropertyDeclarationOrStaticBlock && ((_a = lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) == null ? void 0 : _a.classConstructor)) {
      const invocation = factory2.createFunctionCallCall(
        visitNode(node.expression, visitor, isExpression),
        lexicalEnvironment.data.classConstructor,
        visitNodes2(node.arguments, visitor, isExpression)
      );
      setOriginalNode(invocation, node);
      setTextRange(invocation, node);
      return invocation;
    }
    return visitEachChild(node, visitor, context);
  }
  function visitTaggedTemplateExpression(node) {
    var _a;
    if (isPrivateIdentifierPropertyAccessExpression(node.tag) && accessPrivateIdentifier2(node.tag.name)) {
      const { thisArg, target } = factory2.createCallBinding(node.tag, hoistVariableDeclaration, languageVersion);
      return factory2.updateTaggedTemplateExpression(
        node,
        factory2.createCallExpression(
          factory2.createPropertyAccessExpression(visitNode(target, visitor, isExpression), "bind"),
          /*typeArguments*/
          void 0,
          [visitNode(thisArg, visitor, isExpression)]
        ),
        /*typeArguments*/
        void 0,
        visitNode(node.template, visitor, isTemplateLiteral)
      );
    }
    if (shouldTransformSuperInStaticInitializers && isSuperProperty(node.tag) && currentStaticPropertyDeclarationOrStaticBlock && ((_a = lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) == null ? void 0 : _a.classConstructor)) {
      const invocation = factory2.createFunctionBindCall(
        visitNode(node.tag, visitor, isExpression),
        lexicalEnvironment.data.classConstructor,
        []
      );
      setOriginalNode(invocation, node);
      setTextRange(invocation, node);
      return factory2.updateTaggedTemplateExpression(
        node,
        invocation,
        /*typeArguments*/
        void 0,
        visitNode(node.template, visitor, isTemplateLiteral)
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function transformClassStaticBlockDeclaration(node) {
    if (lexicalEnvironment) {
      lexicalEnvironmentMap.set(getOriginalNode(node), lexicalEnvironment);
    }
    if (shouldTransformPrivateElementsOrClassStaticBlocks) {
      startLexicalEnvironment();
      let statements = setCurrentStaticPropertyDeclarationOrStaticBlockAnd(
        node,
        (statements2) => visitNodes2(statements2, visitor, isStatement),
        node.body.statements
      );
      statements = factory2.mergeLexicalEnvironment(statements, endLexicalEnvironment());
      const iife = factory2.createImmediatelyInvokedArrowFunction(statements);
      setOriginalNode(iife, node);
      setTextRange(iife, node);
      addEmitFlags(iife, 4 /* AdviseOnEmitNode */);
      return iife;
    }
  }
  function isAnonymousClassNeedingAssignedName(node) {
    if (isClassExpression(node) && !node.name) {
      const staticPropertiesOrClassStaticBlocks = getStaticPropertiesAndClassStaticBlock(node);
      const classStaticBlock = find(staticPropertiesOrClassStaticBlocks, isClassStaticBlockDeclaration);
      if (classStaticBlock) {
        for (const statement of classStaticBlock.body.statements) {
          if (isExpressionStatement(statement) && isCallToHelper(statement.expression, "___setFunctionName")) {
            return false;
          }
        }
      }
      const hasTransformableStatics = (shouldTransformPrivateElementsOrClassStaticBlocks || !!(getInternalEmitFlags(node) && 32 /* TransformPrivateStaticElements */)) && some(staticPropertiesOrClassStaticBlocks, (node2) => isClassStaticBlockDeclaration(node2) || isPrivateIdentifierClassElementDeclaration(node2) || shouldTransformInitializers && isInitializedProperty(node2));
      return hasTransformableStatics;
    }
    return false;
  }
  function visitBinaryExpression(node, discarded) {
    if (isDestructuringAssignment(node)) {
      const savedPendingExpressions = pendingExpressions;
      pendingExpressions = void 0;
      node = factory2.updateBinaryExpression(
        node,
        visitNode(node.left, assignmentTargetVisitor, isExpression),
        node.operatorToken,
        visitNode(node.right, visitor, isExpression)
      );
      const expr = some(pendingExpressions) ? factory2.inlineExpressions(compact([...pendingExpressions, node])) : node;
      pendingExpressions = savedPendingExpressions;
      return expr;
    }
    if (isAssignmentExpression(node)) {
      if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
        const assignedName = getAssignedNameOfIdentifier(node.left, node.right);
        const left2 = visitNode(node.left, visitor, isExpression);
        const right = visitNode(node.right, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
        return factory2.updateBinaryExpression(node, left2, node.operatorToken, right);
      }
      const left = skipOuterExpressions(node.left, 8 /* PartiallyEmittedExpressions */ | 1 /* Parentheses */);
      if (isPrivateIdentifierPropertyAccessExpression(left)) {
        const info = accessPrivateIdentifier2(left.name);
        if (info) {
          return setTextRange(
            setOriginalNode(
              createPrivateIdentifierAssignment(info, left.expression, node.right, node.operatorToken.kind),
              node
            ),
            node
          );
        }
      } else if (shouldTransformSuperInStaticInitializers && isSuperProperty(node.left) && currentStaticPropertyDeclarationOrStaticBlock && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) {
        const { classConstructor, superClassReference, facts } = lexicalEnvironment.data;
        if (facts & 1 /* ClassWasDecorated */) {
          return factory2.updateBinaryExpression(
            node,
            visitInvalidSuperProperty(node.left),
            node.operatorToken,
            visitNode(node.right, visitor, isExpression)
          );
        }
        if (classConstructor && superClassReference) {
          let setterName = isElementAccessExpression(node.left) ? visitNode(node.left.argumentExpression, visitor, isExpression) : isIdentifier(node.left.name) ? factory2.createStringLiteralFromNode(node.left.name) : void 0;
          if (setterName) {
            let expression = visitNode(node.right, visitor, isExpression);
            if (isCompoundAssignment(node.operatorToken.kind)) {
              let getterName = setterName;
              if (!isSimpleInlineableExpression(setterName)) {
                getterName = factory2.createTempVariable(hoistVariableDeclaration);
                setterName = factory2.createAssignment(getterName, setterName);
              }
              const superPropertyGet = factory2.createReflectGetCall(
                superClassReference,
                getterName,
                classConstructor
              );
              setOriginalNode(superPropertyGet, node.left);
              setTextRange(superPropertyGet, node.left);
              expression = factory2.createBinaryExpression(
                superPropertyGet,
                getNonAssignmentOperatorForCompoundAssignment(node.operatorToken.kind),
                expression
              );
              setTextRange(expression, node);
            }
            const temp = discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration);
            if (temp) {
              expression = factory2.createAssignment(temp, expression);
              setTextRange(temp, node);
            }
            expression = factory2.createReflectSetCall(
              superClassReference,
              setterName,
              expression,
              classConstructor
            );
            setOriginalNode(expression, node);
            setTextRange(expression, node);
            if (temp) {
              expression = factory2.createComma(expression, temp);
              setTextRange(expression, node);
            }
            return expression;
          }
        }
      }
    }
    if (isPrivateIdentifierInExpression(node)) {
      return transformPrivateIdentifierInInExpression(node);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitCommaListExpression(node, discarded) {
    const elements = discarded ? visitCommaListElements(node.elements, discardedValueVisitor) : visitCommaListElements(node.elements, visitor, discardedValueVisitor);
    return factory2.updateCommaListExpression(node, elements);
  }
  function visitParenthesizedExpression(node, discarded, referencedName) {
    const visitorFunc = discarded ? discardedValueVisitor : referencedName ? (node2) => namedEvaluationVisitor(node2, referencedName) : visitor;
    const expression = visitNode(node.expression, visitorFunc, isExpression);
    return factory2.updateParenthesizedExpression(node, expression);
  }
  function visitPartiallyEmittedExpression(node, discarded, referencedName) {
    const visitorFunc = discarded ? discardedValueVisitor : referencedName ? (node2) => namedEvaluationVisitor(node2, referencedName) : visitor;
    const expression = visitNode(node.expression, visitorFunc, isExpression);
    return factory2.updatePartiallyEmittedExpression(node, expression);
  }
  function visitReferencedPropertyName(node) {
    if (isPropertyNameLiteral(node) || isPrivateIdentifier(node)) {
      const referencedName2 = factory2.createStringLiteralFromNode(node);
      const name2 = visitNode(node, visitor, isPropertyName);
      return { referencedName: referencedName2, name: name2 };
    }
    if (isPropertyNameLiteral(node.expression) && !isIdentifier(node.expression)) {
      const referencedName2 = factory2.createStringLiteralFromNode(node.expression);
      const name2 = visitNode(node, visitor, isPropertyName);
      return { referencedName: referencedName2, name: name2 };
    }
    const referencedName = factory2.createTempVariable(hoistVariableDeclaration);
    const key = emitHelpers().createPropKeyHelper(visitNode(node.expression, visitor, isExpression));
    const assignment = factory2.createAssignment(referencedName, key);
    const name = factory2.updateComputedPropertyName(node, injectPendingExpressions(assignment));
    return { referencedName, name };
  }
  function createPrivateIdentifierAssignment(info, receiver, right, operator) {
    receiver = visitNode(receiver, visitor, isExpression);
    right = visitNode(right, visitor, isExpression);
    if (isCompoundAssignment(operator)) {
      const { readExpression, initializeExpression } = createCopiableReceiverExpr(receiver);
      receiver = initializeExpression || readExpression;
      right = factory2.createBinaryExpression(
        createPrivateIdentifierAccessHelper(info, readExpression),
        getNonAssignmentOperatorForCompoundAssignment(operator),
        right
      );
    }
    setCommentRange(receiver, moveRangePos(receiver, -1));
    switch (info.kind) {
      case "a" /* Accessor */:
        return emitHelpers().createClassPrivateFieldSetHelper(
          receiver,
          info.brandCheckIdentifier,
          right,
          info.kind,
          info.setterName
        );
      case "m" /* Method */:
        return emitHelpers().createClassPrivateFieldSetHelper(
          receiver,
          info.brandCheckIdentifier,
          right,
          info.kind,
          /*f*/
          void 0
        );
      case "f" /* Field */:
        return emitHelpers().createClassPrivateFieldSetHelper(
          receiver,
          info.brandCheckIdentifier,
          right,
          info.kind,
          info.isStatic ? info.variableName : void 0
        );
      case "untransformed":
        return Debug.fail("Access helpers should not be created for untransformed private elements");
      default:
        Debug.assertNever(info, "Unknown private element type");
    }
  }
  function getPrivateInstanceMethodsAndAccessors(node) {
    return filter(node.members, isNonStaticMethodOrAccessorWithPrivateName);
  }
  function getClassFacts(node) {
    let facts = 0 /* None */;
    const original = getOriginalNode(node);
    if (isClassDeclaration(original) && classOrConstructorParameterIsDecorated(legacyDecorators, original)) {
      facts |= 1 /* ClassWasDecorated */;
    }
    let containsPublicInstanceFields = false;
    let containsInitializedPublicInstanceFields = false;
    let containsInstancePrivateElements = false;
    let containsInstanceAutoAccessors = false;
    for (const member of node.members) {
      if (isStatic(member)) {
        if (member.name && (isPrivateIdentifier(member.name) || isAutoAccessorPropertyDeclaration(member)) && shouldTransformPrivateElementsOrClassStaticBlocks) {
          facts |= 2 /* NeedsClassConstructorReference */;
        }
        if (isPropertyDeclaration(member) || isClassStaticBlockDeclaration(member)) {
          if (shouldTransformThisInStaticInitializers && member.transformFlags & 16384 /* ContainsLexicalThis */) {
            facts |= 8 /* NeedsSubstitutionForThisInClassStaticField */;
            if (!(facts & 1 /* ClassWasDecorated */)) {
              facts |= 2 /* NeedsClassConstructorReference */;
            }
          }
          if (shouldTransformSuperInStaticInitializers && member.transformFlags & 134217728 /* ContainsLexicalSuper */) {
            if (!(facts & 1 /* ClassWasDecorated */)) {
              facts |= 2 /* NeedsClassConstructorReference */ | 4 /* NeedsClassSuperReference */;
            }
          }
        }
      } else if (!hasAbstractModifier(getOriginalNode(member))) {
        if (isAutoAccessorPropertyDeclaration(member)) {
          containsInstanceAutoAccessors = true;
          containsInstancePrivateElements || (containsInstancePrivateElements = isPrivateIdentifierClassElementDeclaration(member));
        } else if (isPrivateIdentifierClassElementDeclaration(member)) {
          containsInstancePrivateElements = true;
        } else if (isPropertyDeclaration(member)) {
          containsPublicInstanceFields = true;
          containsInitializedPublicInstanceFields || (containsInitializedPublicInstanceFields = !!member.initializer);
        }
      }
    }
    const willHoistInitializersToConstructor = shouldTransformInitializersUsingDefine && containsPublicInstanceFields || shouldTransformInitializersUsingSet && containsInitializedPublicInstanceFields || shouldTransformPrivateElementsOrClassStaticBlocks && containsInstancePrivateElements || shouldTransformPrivateElementsOrClassStaticBlocks && containsInstanceAutoAccessors && shouldTransformAutoAccessors === -1 /* True */;
    if (willHoistInitializersToConstructor) {
      facts |= 16 /* WillHoistInitializersToConstructor */;
    }
    return facts;
  }
  function visitExpressionWithTypeArgumentsInHeritageClause(node) {
    var _a;
    const facts = ((_a = lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) == null ? void 0 : _a.facts) || 0 /* None */;
    if (facts & 4 /* NeedsClassSuperReference */) {
      const temp = factory2.createTempVariable(
        hoistVariableDeclaration,
        /*reservedInNestedScopes*/
        true
      );
      getClassLexicalEnvironment().superClassReference = temp;
      return factory2.updateExpressionWithTypeArguments(
        node,
        factory2.createAssignment(
          temp,
          visitNode(node.expression, visitor, isExpression)
        ),
        /*typeArguments*/
        void 0
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitInNewClassLexicalEnvironment(node, referencedName, visitor2) {
    const savedCurrentClassContainer = currentClassContainer;
    const savedPendingExpressions = pendingExpressions;
    const savedLexicalEnvironment = lexicalEnvironment;
    currentClassContainer = node;
    pendingExpressions = void 0;
    startClassLexicalEnvironment();
    const shouldAlwaysTransformPrivateStaticElements = getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */;
    if (shouldTransformPrivateElementsOrClassStaticBlocks || shouldAlwaysTransformPrivateStaticElements) {
      const name = getNameOfDeclaration(node);
      if (name && isIdentifier(name)) {
        getPrivateIdentifierEnvironment().data.className = name;
      }
    }
    if (shouldTransformPrivateElementsOrClassStaticBlocks) {
      const privateInstanceMethodsAndAccessors = getPrivateInstanceMethodsAndAccessors(node);
      if (some(privateInstanceMethodsAndAccessors)) {
        getPrivateIdentifierEnvironment().data.weakSetName = createHoistedVariableForClass(
          "instances",
          privateInstanceMethodsAndAccessors[0].name
        );
      }
    }
    const facts = getClassFacts(node);
    if (facts) {
      getClassLexicalEnvironment().facts = facts;
    }
    if (facts & 8 /* NeedsSubstitutionForThisInClassStaticField */) {
      enableSubstitutionForClassStaticThisOrSuperReference();
    }
    const result = visitor2(node, facts, referencedName);
    endClassLexicalEnvironment();
    Debug.assert(lexicalEnvironment === savedLexicalEnvironment);
    currentClassContainer = savedCurrentClassContainer;
    pendingExpressions = savedPendingExpressions;
    return result;
  }
  function visitClassDeclaration(node) {
    return visitInNewClassLexicalEnvironment(
      node,
      /*referencedName*/
      void 0,
      visitClassDeclarationInNewClassLexicalEnvironment
    );
  }
  function visitClassDeclarationInNewClassLexicalEnvironment(node, facts) {
    var _a, _b;
    let pendingClassReferenceAssignment;
    if (facts & 2 /* NeedsClassConstructorReference */) {
      if (shouldTransformPrivateElementsOrClassStaticBlocks && ((_a = node.emitNode) == null ? void 0 : _a.classThis)) {
        getClassLexicalEnvironment().classConstructor = node.emitNode.classThis;
        pendingClassReferenceAssignment = factory2.createAssignment(node.emitNode.classThis, factory2.getInternalName(node));
      } else {
        const temp = factory2.createTempVariable(
          hoistVariableDeclaration,
          /*reservedInNestedScopes*/
          true
        );
        getClassLexicalEnvironment().classConstructor = factory2.cloneNode(temp);
        pendingClassReferenceAssignment = factory2.createAssignment(temp, factory2.getInternalName(node));
      }
      if ((_b = node.emitNode) == null ? void 0 : _b.classThis) {
        getClassLexicalEnvironment().classThis = node.emitNode.classThis;
      }
    }
    const isExport = hasSyntacticModifier(node, 1 /* Export */);
    const isDefault = hasSyntacticModifier(node, 1024 /* Default */);
    let modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
    const heritageClauses = visitNodes2(node.heritageClauses, heritageClauseVisitor, isHeritageClause);
    const { members, prologue } = transformClassMembers(node);
    const statements = [];
    if (pendingClassReferenceAssignment) {
      getPendingExpressions().unshift(pendingClassReferenceAssignment);
    }
    if (some(pendingExpressions)) {
      statements.push(factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions)));
    }
    if (shouldTransformInitializersUsingSet || shouldTransformPrivateElementsOrClassStaticBlocks || getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */) {
      const staticProperties = getStaticPropertiesAndClassStaticBlock(node);
      if (some(staticProperties)) {
        addPropertyOrClassStaticBlockStatements(statements, staticProperties, factory2.getInternalName(node));
      }
    }
    if (statements.length > 0 && isExport && isDefault) {
      modifiers = visitNodes2(modifiers, (node2) => isExportOrDefaultModifier(node2) ? void 0 : node2, isModifier);
      statements.push(factory2.createExportAssignment(
        /*modifiers*/
        void 0,
        /*isExportEquals*/
        false,
        factory2.getLocalName(
          node,
          /*allowComments*/
          false,
          /*allowSourceMaps*/
          true
        )
      ));
    }
    const classDecl = factory2.updateClassDeclaration(
      node,
      modifiers,
      node.name,
      /*typeParameters*/
      void 0,
      heritageClauses,
      members
    );
    statements.unshift(classDecl);
    if (prologue) {
      statements.unshift(factory2.createExpressionStatement(prologue));
    }
    return statements;
  }
  function visitClassExpression(node, referencedName) {
    return visitInNewClassLexicalEnvironment(node, referencedName, visitClassExpressionInNewClassLexicalEnvironment);
  }
  function visitClassExpressionInNewClassLexicalEnvironment(node, facts, referencedName) {
    var _a, _b, _c, _d;
    const isDecoratedClassDeclaration = !!(facts & 1 /* ClassWasDecorated */);
    const staticPropertiesOrClassStaticBlocks = getStaticPropertiesAndClassStaticBlock(node);
    const isClassWithConstructorReference = resolver.getNodeCheckFlags(node) & 1048576 /* ClassWithConstructorReference */;
    let temp;
    function createClassTempVar() {
      var _a2;
      if (shouldTransformPrivateElementsOrClassStaticBlocks && ((_a2 = node.emitNode) == null ? void 0 : _a2.classThis)) {
        return getClassLexicalEnvironment().classConstructor = node.emitNode.classThis;
      }
      const classCheckFlags = resolver.getNodeCheckFlags(node);
      const isClassWithConstructorReference2 = classCheckFlags & 1048576 /* ClassWithConstructorReference */;
      const requiresBlockScopedVar = classCheckFlags & 32768 /* BlockScopedBindingInLoop */;
      const temp2 = factory2.createTempVariable(requiresBlockScopedVar ? addBlockScopedVariable : hoistVariableDeclaration, !!isClassWithConstructorReference2);
      getClassLexicalEnvironment().classConstructor = factory2.cloneNode(temp2);
      return temp2;
    }
    if ((_a = node.emitNode) == null ? void 0 : _a.classThis) {
      getClassLexicalEnvironment().classThis = node.emitNode.classThis;
    }
    if (facts & 2 /* NeedsClassConstructorReference */) {
      temp ?? (temp = createClassTempVar());
    }
    const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
    const heritageClauses = visitNodes2(node.heritageClauses, heritageClauseVisitor, isHeritageClause);
    const { members, prologue } = transformClassMembers(node);
    let classExpression = factory2.updateClassExpression(
      node,
      modifiers,
      node.name,
      /*typeParameters*/
      void 0,
      heritageClauses,
      members
    );
    const expressions = [];
    if (prologue) {
      expressions.push(prologue);
    }
    const hasTransformableStatics = (shouldTransformPrivateElementsOrClassStaticBlocks || getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */) && some(staticPropertiesOrClassStaticBlocks, (node2) => isClassStaticBlockDeclaration(node2) || isPrivateIdentifierClassElementDeclaration(node2) || shouldTransformInitializers && isInitializedProperty(node2));
    if (hasTransformableStatics || some(pendingExpressions) || referencedName) {
      if (isDecoratedClassDeclaration) {
        Debug.assertIsDefined(pendingStatements, "Decorated classes transformed by TypeScript are expected to be within a variable declaration.");
        if (some(pendingExpressions)) {
          addRange(pendingStatements, map(pendingExpressions, factory2.createExpressionStatement));
        }
        if (referencedName) {
          if (shouldTransformPrivateElementsOrClassStaticBlocks) {
            const setNameExpression = emitHelpers().createSetFunctionNameHelper(temp ?? ((_b = node.emitNode) == null ? void 0 : _b.classThis) ?? factory2.getInternalName(node), referencedName);
            pendingStatements.push(factory2.createExpressionStatement(setNameExpression));
          } else {
            const setNameExpression = emitHelpers().createSetFunctionNameHelper(factory2.createThis(), referencedName);
            classExpression = factory2.updateClassExpression(
              classExpression,
              classExpression.modifiers,
              classExpression.name,
              classExpression.typeParameters,
              classExpression.heritageClauses,
              [
                factory2.createClassStaticBlockDeclaration(
                  factory2.createBlock([
                    factory2.createExpressionStatement(setNameExpression)
                  ])
                ),
                ...classExpression.members
              ]
            );
          }
        }
        if (some(staticPropertiesOrClassStaticBlocks)) {
          addPropertyOrClassStaticBlockStatements(pendingStatements, staticPropertiesOrClassStaticBlocks, ((_c = node.emitNode) == null ? void 0 : _c.classThis) ?? factory2.getInternalName(node));
        }
        if (temp) {
          expressions.push(factory2.createAssignment(temp, classExpression));
        } else if (shouldTransformPrivateElementsOrClassStaticBlocks && ((_d = node.emitNode) == null ? void 0 : _d.classThis)) {
          expressions.push(factory2.createAssignment(node.emitNode.classThis, classExpression));
        } else {
          expressions.push(classExpression);
        }
      } else {
        temp ?? (temp = createClassTempVar());
        if (isClassWithConstructorReference) {
          enableSubstitutionForClassAliases();
          const alias = factory2.cloneNode(temp);
          alias.emitNode.autoGenerate.flags &= ~8 /* ReservedInNestedScopes */;
          classAliases[getOriginalNodeId(node)] = alias;
        }
        expressions.push(factory2.createAssignment(temp, classExpression));
        addRange(expressions, pendingExpressions);
        if (referencedName) {
          expressions.push(emitHelpers().createSetFunctionNameHelper(temp, referencedName));
        }
        addRange(expressions, generateInitializedPropertyExpressionsOrClassStaticBlock(staticPropertiesOrClassStaticBlocks, temp));
        expressions.push(factory2.cloneNode(temp));
      }
    } else {
      expressions.push(classExpression);
    }
    if (expressions.length > 1) {
      addEmitFlags(classExpression, 131072 /* Indented */);
      expressions.forEach(startOnNewLine);
    }
    return factory2.inlineExpressions(expressions);
  }
  function visitClassStaticBlockDeclaration(node) {
    if (!shouldTransformPrivateElementsOrClassStaticBlocks) {
      return visitEachChild(node, visitor, context);
    }
    return void 0;
  }
  function transformClassMembers(node) {
    const shouldTransformPrivateStaticElementsInClass = !!(getInternalEmitFlags(node) & 32 /* TransformPrivateStaticElements */);
    if (shouldTransformPrivateElementsOrClassStaticBlocks || shouldTransformPrivateStaticElementsInFile) {
      for (const member of node.members) {
        if (isPrivateIdentifierClassElementDeclaration(member)) {
          if (shouldTransformClassElementToWeakMap(member)) {
            addPrivateIdentifierToEnvironment(member, member.name, addPrivateIdentifierClassElementToEnvironment);
          } else {
            const privateEnv = getPrivateIdentifierEnvironment();
            setPrivateIdentifier(privateEnv, member.name, { kind: "untransformed" });
          }
        }
      }
      if (shouldTransformPrivateElementsOrClassStaticBlocks) {
        if (some(getPrivateInstanceMethodsAndAccessors(node))) {
          createBrandCheckWeakSetForPrivateMethods();
        }
      }
      if (shouldTransformAutoAccessorsInCurrentClass()) {
        for (const member of node.members) {
          if (isAutoAccessorPropertyDeclaration(member)) {
            const storageName = factory2.getGeneratedPrivateNameForNode(
              member.name,
              /*prefix*/
              void 0,
              "_accessor_storage"
            );
            if (shouldTransformPrivateElementsOrClassStaticBlocks || shouldTransformPrivateStaticElementsInClass && hasStaticModifier(member)) {
              addPrivateIdentifierToEnvironment(member, storageName, addPrivateIdentifierPropertyDeclarationToEnvironment);
            } else {
              const privateEnv = getPrivateIdentifierEnvironment();
              setPrivateIdentifier(privateEnv, storageName, { kind: "untransformed" });
            }
          }
        }
      }
    }
    let members = visitNodes2(node.members, classElementVisitor, isClassElement);
    let syntheticConstructor;
    if (!some(members, isConstructorDeclaration)) {
      syntheticConstructor = transformConstructor(
        /*constructor*/
        void 0,
        node
      );
    }
    let prologue;
    let syntheticStaticBlock;
    if (!shouldTransformPrivateElementsOrClassStaticBlocks && some(pendingExpressions)) {
      let statement = factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions));
      if (statement.transformFlags & 134234112 /* ContainsLexicalThisOrSuper */) {
        const temp = factory2.createTempVariable(hoistVariableDeclaration);
        const arrow = factory2.createArrowFunction(
          /*modifiers*/
          void 0,
          /*typeParameters*/
          void 0,
          /*parameters*/
          [],
          /*type*/
          void 0,
          /*equalsGreaterThanToken*/
          void 0,
          factory2.createBlock([statement])
        );
        prologue = factory2.createAssignment(temp, arrow);
        statement = factory2.createExpressionStatement(factory2.createCallExpression(
          temp,
          /*typeArguments*/
          void 0,
          []
        ));
      }
      const block = factory2.createBlock([statement]);
      syntheticStaticBlock = factory2.createClassStaticBlockDeclaration(block);
      pendingExpressions = void 0;
    }
    if (syntheticConstructor || syntheticStaticBlock) {
      let membersArray;
      membersArray = append(membersArray, syntheticConstructor);
      membersArray = append(membersArray, syntheticStaticBlock);
      membersArray = addRange(membersArray, members);
      members = setTextRange(
        factory2.createNodeArray(membersArray),
        /*location*/
        node.members
      );
    }
    return { members, prologue };
  }
  function createBrandCheckWeakSetForPrivateMethods() {
    const { weakSetName } = getPrivateIdentifierEnvironment().data;
    Debug.assert(weakSetName, "weakSetName should be set in private identifier environment");
    getPendingExpressions().push(
      factory2.createAssignment(
        weakSetName,
        factory2.createNewExpression(
          factory2.createIdentifier("WeakSet"),
          /*typeArguments*/
          void 0,
          []
        )
      )
    );
  }
  function transformConstructor(constructor, container) {
    constructor = visitNode(constructor, visitor, isConstructorDeclaration);
    if (!(lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) || !(lexicalEnvironment.data.facts & 16 /* WillHoistInitializersToConstructor */)) {
      return constructor;
    }
    const extendsClauseElement = getEffectiveBaseTypeNode(container);
    const isDerivedClass = !!(extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== 106 /* NullKeyword */);
    const parameters = visitParameterList(constructor ? constructor.parameters : void 0, visitor, context);
    const body = transformConstructorBody(container, constructor, isDerivedClass);
    if (!body) {
      return constructor;
    }
    if (constructor) {
      Debug.assert(parameters);
      return factory2.updateConstructorDeclaration(
        constructor,
        /*modifiers*/
        void 0,
        parameters,
        body
      );
    }
    return startOnNewLine(
      setOriginalNode(
        setTextRange(
          factory2.createConstructorDeclaration(
            /*modifiers*/
            void 0,
            parameters ?? [],
            body
          ),
          constructor || container
        ),
        constructor
      )
    );
  }
  function transformConstructorBody(node, constructor, isDerivedClass) {
    var _a;
    const instanceProperties = getProperties(
      node,
      /*requireInitializer*/
      false,
      /*isStatic*/
      false
    );
    let properties = instanceProperties;
    if (!useDefineForClassFields) {
      properties = filter(properties, (property) => !!property.initializer || isPrivateIdentifier(property.name) || hasAccessorModifier(property));
    }
    const privateMethodsAndAccessors = getPrivateInstanceMethodsAndAccessors(node);
    const needsConstructorBody = some(properties) || some(privateMethodsAndAccessors);
    if (!constructor && !needsConstructorBody) {
      return visitFunctionBody(
        /*node*/
        void 0,
        visitor,
        context
      );
    }
    resumeLexicalEnvironment();
    const needsSyntheticConstructor = !constructor && isDerivedClass;
    let indexOfFirstStatementAfterSuperAndPrologue = 0;
    let prologueStatementCount = 0;
    let superStatementIndex = -1;
    let statements = [];
    if ((_a = constructor == null ? void 0 : constructor.body) == null ? void 0 : _a.statements) {
      prologueStatementCount = factory2.copyPrologue(
        constructor.body.statements,
        statements,
        /*ensureUseStrict*/
        false,
        visitor
      );
      superStatementIndex = findSuperStatementIndex(constructor.body.statements, prologueStatementCount);
      if (superStatementIndex >= 0) {
        indexOfFirstStatementAfterSuperAndPrologue = superStatementIndex + 1;
        statements = [
          ...statements.slice(0, prologueStatementCount),
          ...visitNodes2(constructor.body.statements, visitor, isStatement, prologueStatementCount, indexOfFirstStatementAfterSuperAndPrologue - prologueStatementCount),
          ...statements.slice(prologueStatementCount)
        ];
      } else if (prologueStatementCount >= 0) {
        indexOfFirstStatementAfterSuperAndPrologue = prologueStatementCount;
      }
    }
    if (needsSyntheticConstructor) {
      statements.push(
        factory2.createExpressionStatement(
          factory2.createCallExpression(
            factory2.createSuper(),
            /*typeArguments*/
            void 0,
            [factory2.createSpreadElement(factory2.createIdentifier("arguments"))]
          )
        )
      );
    }
    let parameterPropertyDeclarationCount = 0;
    if (constructor == null ? void 0 : constructor.body) {
      for (let i = indexOfFirstStatementAfterSuperAndPrologue; i < constructor.body.statements.length; i++) {
        const statement = constructor.body.statements[i];
        if (isParameterPropertyDeclaration(getOriginalNode(statement), constructor)) {
          parameterPropertyDeclarationCount++;
        } else {
          break;
        }
      }
      if (parameterPropertyDeclarationCount > 0) {
        indexOfFirstStatementAfterSuperAndPrologue += parameterPropertyDeclarationCount;
      }
    }
    const receiver = factory2.createThis();
    addInstanceMethodStatements(statements, privateMethodsAndAccessors, receiver);
    if (constructor) {
      const parameterProperties = filter(instanceProperties, (prop) => isParameterPropertyDeclaration(getOriginalNode(prop), constructor));
      const nonParameterProperties = filter(properties, (prop) => !isParameterPropertyDeclaration(getOriginalNode(prop), constructor));
      addPropertyOrClassStaticBlockStatements(statements, parameterProperties, receiver);
      addPropertyOrClassStaticBlockStatements(statements, nonParameterProperties, receiver);
    } else {
      addPropertyOrClassStaticBlockStatements(statements, properties, receiver);
    }
    if (constructor) {
      addRange(statements, visitNodes2(constructor.body.statements, visitor, isStatement, indexOfFirstStatementAfterSuperAndPrologue));
    }
    statements = factory2.mergeLexicalEnvironment(statements, endLexicalEnvironment());
    if (statements.length === 0 && !constructor) {
      return void 0;
    }
    const multiLine = (constructor == null ? void 0 : constructor.body) && constructor.body.statements.length >= statements.length ? constructor.body.multiLine ?? statements.length > 0 : statements.length > 0;
    return setTextRange(
      factory2.createBlock(
        setTextRange(
          factory2.createNodeArray(statements),
          /*location*/
          constructor ? constructor.body.statements : node.members
        ),
        multiLine
      ),
      /*location*/
      constructor ? constructor.body : void 0
    );
  }
  function addPropertyOrClassStaticBlockStatements(statements, properties, receiver) {
    for (const property of properties) {
      if (isStatic(property) && !shouldTransformPrivateElementsOrClassStaticBlocks) {
        continue;
      }
      const statement = transformPropertyOrClassStaticBlock(property, receiver);
      if (!statement) {
        continue;
      }
      statements.push(statement);
    }
  }
  function transformPropertyOrClassStaticBlock(property, receiver) {
    const expression = isClassStaticBlockDeclaration(property) ? transformClassStaticBlockDeclaration(property) : transformProperty(property, receiver);
    if (!expression) {
      return void 0;
    }
    const statement = factory2.createExpressionStatement(expression);
    setOriginalNode(statement, property);
    addEmitFlags(statement, getEmitFlags(property) & 3072 /* NoComments */);
    setCommentRange(statement, property);
    const propertyOriginalNode = getOriginalNode(property);
    if (isParameter(propertyOriginalNode)) {
      setSourceMapRange(statement, propertyOriginalNode);
      removeAllComments(statement);
    } else {
      setSourceMapRange(statement, moveRangePastModifiers(property));
    }
    setSyntheticLeadingComments(expression, void 0);
    setSyntheticTrailingComments(expression, void 0);
    if (hasAccessorModifier(propertyOriginalNode)) {
      addEmitFlags(statement, 3072 /* NoComments */);
    }
    return statement;
  }
  function generateInitializedPropertyExpressionsOrClassStaticBlock(propertiesOrClassStaticBlocks, receiver) {
    const expressions = [];
    for (const property of propertiesOrClassStaticBlocks) {
      const expression = isClassStaticBlockDeclaration(property) ? transformClassStaticBlockDeclaration(property) : transformProperty(property, receiver);
      if (!expression) {
        continue;
      }
      startOnNewLine(expression);
      setOriginalNode(expression, property);
      addEmitFlags(expression, getEmitFlags(property) & 3072 /* NoComments */);
      setSourceMapRange(expression, moveRangePastModifiers(property));
      setCommentRange(expression, property);
      expressions.push(expression);
    }
    return expressions;
  }
  function transformProperty(property, receiver) {
    var _a;
    const savedCurrentStaticPropertyDeclarationOrStaticBlock = currentStaticPropertyDeclarationOrStaticBlock;
    const transformed = transformPropertyWorker(property, receiver);
    if (transformed && hasStaticModifier(property) && ((_a = lexicalEnvironment == null ? void 0 : lexicalEnvironment.data) == null ? void 0 : _a.facts)) {
      setOriginalNode(transformed, property);
      addEmitFlags(transformed, 4 /* AdviseOnEmitNode */);
      setSourceMapRange(transformed, getSourceMapRange(property.name));
      lexicalEnvironmentMap.set(getOriginalNode(property), lexicalEnvironment);
    }
    currentStaticPropertyDeclarationOrStaticBlock = savedCurrentStaticPropertyDeclarationOrStaticBlock;
    return transformed;
  }
  function transformPropertyWorker(property, receiver) {
    const emitAssignment = !useDefineForClassFields;
    let referencedName;
    if (isNamedEvaluation(property, isAnonymousClassNeedingAssignedName)) {
      if (isPropertyNameLiteral(property.name) || isPrivateIdentifier(property.name)) {
        referencedName = factory2.createStringLiteralFromNode(property.name);
      } else if (isPropertyNameLiteral(property.name.expression) && !isIdentifier(property.name.expression)) {
        referencedName = factory2.createStringLiteralFromNode(property.name.expression);
      } else {
        referencedName = factory2.getGeneratedNameForNode(property.name);
      }
    }
    const propertyName = hasAccessorModifier(property) ? factory2.getGeneratedPrivateNameForNode(property.name) : isComputedPropertyName(property.name) && !isSimpleInlineableExpression(property.name.expression) ? factory2.updateComputedPropertyName(property.name, factory2.getGeneratedNameForNode(property.name)) : property.name;
    if (hasStaticModifier(property)) {
      currentStaticPropertyDeclarationOrStaticBlock = property;
    }
    const initializerVisitor = referencedName ? (child) => namedEvaluationVisitor(child, referencedName) : visitor;
    if (isPrivateIdentifier(propertyName) && shouldTransformClassElementToWeakMap(property)) {
      const privateIdentifierInfo = accessPrivateIdentifier2(propertyName);
      if (privateIdentifierInfo) {
        if (privateIdentifierInfo.kind === "f" /* Field */) {
          if (!privateIdentifierInfo.isStatic) {
            return createPrivateInstanceFieldInitializer(
              factory2,
              receiver,
              visitNode(property.initializer, initializerVisitor, isExpression),
              privateIdentifierInfo.brandCheckIdentifier
            );
          } else {
            return createPrivateStaticFieldInitializer(
              factory2,
              privateIdentifierInfo.variableName,
              visitNode(property.initializer, initializerVisitor, isExpression)
            );
          }
        } else {
          return void 0;
        }
      } else {
        Debug.fail("Undeclared private name for property declaration.");
      }
    }
    if ((isPrivateIdentifier(propertyName) || hasStaticModifier(property)) && !property.initializer) {
      return void 0;
    }
    const propertyOriginalNode = getOriginalNode(property);
    if (hasSyntacticModifier(propertyOriginalNode, 256 /* Abstract */)) {
      return void 0;
    }
    let initializer = visitNode(property.initializer, initializerVisitor, isExpression);
    if (isParameterPropertyDeclaration(propertyOriginalNode, propertyOriginalNode.parent) && isIdentifier(propertyName)) {
      const localName = factory2.cloneNode(propertyName);
      if (initializer) {
        if (isParenthesizedExpression(initializer) && isCommaExpression(initializer.expression) && isCallToHelper(initializer.expression.left, "___runInitializers") && isVoidExpression(initializer.expression.right) && isNumericLiteral(initializer.expression.right.expression)) {
          initializer = initializer.expression.left;
        }
        initializer = factory2.inlineExpressions([initializer, localName]);
      } else {
        initializer = localName;
      }
      setEmitFlags(propertyName, 3072 /* NoComments */ | 96 /* NoSourceMap */);
      setSourceMapRange(localName, propertyOriginalNode.name);
      setEmitFlags(localName, 3072 /* NoComments */);
    } else {
      initializer ?? (initializer = factory2.createVoidZero());
    }
    if (emitAssignment || isPrivateIdentifier(propertyName)) {
      const memberAccess = createMemberAccessForPropertyName(
        factory2,
        receiver,
        propertyName,
        /*location*/
        propertyName
      );
      addEmitFlags(memberAccess, 1024 /* NoLeadingComments */);
      const expression = factory2.createAssignment(memberAccess, initializer);
      return expression;
    } else {
      const name = isComputedPropertyName(propertyName) ? propertyName.expression : isIdentifier(propertyName) ? factory2.createStringLiteral(unescapeLeadingUnderscores(propertyName.escapedText)) : propertyName;
      const descriptor = factory2.createPropertyDescriptor({ value: initializer, configurable: true, writable: true, enumerable: true });
      return factory2.createObjectDefinePropertyCall(receiver, name, descriptor);
    }
  }
  function enableSubstitutionForClassAliases() {
    if ((enabledSubstitutions & 1 /* ClassAliases */) === 0) {
      enabledSubstitutions |= 1 /* ClassAliases */;
      context.enableSubstitution(80 /* Identifier */);
      classAliases = [];
    }
  }
  function enableSubstitutionForClassStaticThisOrSuperReference() {
    if ((enabledSubstitutions & 2 /* ClassStaticThisOrSuperReference */) === 0) {
      enabledSubstitutions |= 2 /* ClassStaticThisOrSuperReference */;
      context.enableSubstitution(110 /* ThisKeyword */);
      context.enableEmitNotification(261 /* FunctionDeclaration */);
      context.enableEmitNotification(217 /* FunctionExpression */);
      context.enableEmitNotification(175 /* Constructor */);
      context.enableEmitNotification(176 /* GetAccessor */);
      context.enableEmitNotification(177 /* SetAccessor */);
      context.enableEmitNotification(173 /* MethodDeclaration */);
      context.enableEmitNotification(171 /* PropertyDeclaration */);
      context.enableEmitNotification(166 /* ComputedPropertyName */);
    }
  }
  function addInstanceMethodStatements(statements, methods, receiver) {
    if (!shouldTransformPrivateElementsOrClassStaticBlocks || !some(methods)) {
      return;
    }
    const { weakSetName } = getPrivateIdentifierEnvironment().data;
    Debug.assert(weakSetName, "weakSetName should be set in private identifier environment");
    statements.push(
      factory2.createExpressionStatement(
        createPrivateInstanceMethodInitializer(factory2, receiver, weakSetName)
      )
    );
  }
  function visitInvalidSuperProperty(node) {
    return isPropertyAccessExpression(node) ? factory2.updatePropertyAccessExpression(
      node,
      factory2.createVoidZero(),
      node.name
    ) : factory2.updateElementAccessExpression(
      node,
      factory2.createVoidZero(),
      visitNode(node.argumentExpression, visitor, isExpression)
    );
  }
  function getPropertyNameExpressionIfNeeded(name, shouldHoist, captureReferencedName) {
    if (isComputedPropertyName(name)) {
      const cacheAssignment = findComputedPropertyNameCacheAssignment(name);
      let expression = visitNode(name.expression, visitor, isExpression);
      const innerExpression = skipPartiallyEmittedExpressions(expression);
      const inlinable = isSimpleInlineableExpression(innerExpression);
      const alreadyTransformed = !!cacheAssignment || isAssignmentExpression(innerExpression) && isGeneratedIdentifier(innerExpression.left);
      if (!alreadyTransformed && !inlinable && shouldHoist) {
        const generatedName = factory2.getGeneratedNameForNode(name);
        if (resolver.getNodeCheckFlags(name) & 32768 /* BlockScopedBindingInLoop */) {
          addBlockScopedVariable(generatedName);
        } else {
          hoistVariableDeclaration(generatedName);
        }
        if (captureReferencedName) {
          expression = emitHelpers().createPropKeyHelper(expression);
        }
        return factory2.createAssignment(generatedName, expression);
      }
      return inlinable || isIdentifier(innerExpression) ? void 0 : expression;
    }
  }
  function startClassLexicalEnvironment() {
    lexicalEnvironment = { previous: lexicalEnvironment, data: void 0 };
  }
  function endClassLexicalEnvironment() {
    lexicalEnvironment = lexicalEnvironment == null ? void 0 : lexicalEnvironment.previous;
  }
  function getClassLexicalEnvironment() {
    Debug.assert(lexicalEnvironment);
    return lexicalEnvironment.data ?? (lexicalEnvironment.data = {
      facts: 0 /* None */,
      classConstructor: void 0,
      classThis: void 0,
      superClassReference: void 0
      // privateIdentifierEnvironment: undefined,
    });
  }
  function getPrivateIdentifierEnvironment() {
    Debug.assert(lexicalEnvironment);
    return lexicalEnvironment.privateEnv ?? (lexicalEnvironment.privateEnv = newPrivateEnvironment({
      className: void 0,
      weakSetName: void 0
    }));
  }
  function getPendingExpressions() {
    return pendingExpressions ?? (pendingExpressions = []);
  }
  function addPrivateIdentifierClassElementToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo) {
    if (isAutoAccessorPropertyDeclaration(node)) {
      addPrivateIdentifierAutoAccessorPropertyDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo);
    } else if (isPropertyDeclaration(node)) {
      addPrivateIdentifierPropertyDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo);
    } else if (isMethodDeclaration(node)) {
      addPrivateIdentifierMethodDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo);
    } else if (isGetAccessorDeclaration(node)) {
      addPrivateIdentifierGetAccessorDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo);
    } else if (isSetAccessorDeclaration(node)) {
      addPrivateIdentifierSetAccessorDeclarationToEnvironment(node, name, lex, privateEnv, isStatic2, isValid, previousInfo);
    }
  }
  function addPrivateIdentifierPropertyDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, _previousInfo) {
    if (isStatic2) {
      const brandCheckIdentifier = Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment");
      const variableName = createHoistedVariableForPrivateName(name);
      setPrivateIdentifier(privateEnv, name, {
        kind: "f" /* Field */,
        isStatic: true,
        brandCheckIdentifier,
        variableName,
        isValid
      });
    } else {
      const weakMapName = createHoistedVariableForPrivateName(name);
      setPrivateIdentifier(privateEnv, name, {
        kind: "f" /* Field */,
        isStatic: false,
        brandCheckIdentifier: weakMapName,
        isValid
      });
      getPendingExpressions().push(factory2.createAssignment(
        weakMapName,
        factory2.createNewExpression(
          factory2.createIdentifier("WeakMap"),
          /*typeArguments*/
          void 0,
          []
        )
      ));
    }
  }
  function addPrivateIdentifierMethodDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, _previousInfo) {
    const methodName = createHoistedVariableForPrivateName(name);
    const brandCheckIdentifier = isStatic2 ? Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment") : Debug.checkDefined(privateEnv.data.weakSetName, "weakSetName should be set in private identifier environment");
    setPrivateIdentifier(privateEnv, name, {
      kind: "m" /* Method */,
      methodName,
      brandCheckIdentifier,
      isStatic: isStatic2,
      isValid
    });
  }
  function addPrivateIdentifierGetAccessorDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, previousInfo) {
    const getterName = createHoistedVariableForPrivateName(name, "_get");
    const brandCheckIdentifier = isStatic2 ? Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment") : Debug.checkDefined(privateEnv.data.weakSetName, "weakSetName should be set in private identifier environment");
    if ((previousInfo == null ? void 0 : previousInfo.kind) === "a" /* Accessor */ && previousInfo.isStatic === isStatic2 && !previousInfo.getterName) {
      previousInfo.getterName = getterName;
    } else {
      setPrivateIdentifier(privateEnv, name, {
        kind: "a" /* Accessor */,
        getterName,
        setterName: void 0,
        brandCheckIdentifier,
        isStatic: isStatic2,
        isValid
      });
    }
  }
  function addPrivateIdentifierSetAccessorDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, previousInfo) {
    const setterName = createHoistedVariableForPrivateName(name, "_set");
    const brandCheckIdentifier = isStatic2 ? Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment") : Debug.checkDefined(privateEnv.data.weakSetName, "weakSetName should be set in private identifier environment");
    if ((previousInfo == null ? void 0 : previousInfo.kind) === "a" /* Accessor */ && previousInfo.isStatic === isStatic2 && !previousInfo.setterName) {
      previousInfo.setterName = setterName;
    } else {
      setPrivateIdentifier(privateEnv, name, {
        kind: "a" /* Accessor */,
        getterName: void 0,
        setterName,
        brandCheckIdentifier,
        isStatic: isStatic2,
        isValid
      });
    }
  }
  function addPrivateIdentifierAutoAccessorPropertyDeclarationToEnvironment(_node, name, lex, privateEnv, isStatic2, isValid, _previousInfo) {
    const getterName = createHoistedVariableForPrivateName(name, "_get");
    const setterName = createHoistedVariableForPrivateName(name, "_set");
    const brandCheckIdentifier = isStatic2 ? Debug.checkDefined(lex.classThis ?? lex.classConstructor, "classConstructor should be set in private identifier environment") : Debug.checkDefined(privateEnv.data.weakSetName, "weakSetName should be set in private identifier environment");
    setPrivateIdentifier(privateEnv, name, {
      kind: "a" /* Accessor */,
      getterName,
      setterName,
      brandCheckIdentifier,
      isStatic: isStatic2,
      isValid
    });
  }
  function addPrivateIdentifierToEnvironment(node, name, addDeclaration) {
    const lex = getClassLexicalEnvironment();
    const privateEnv = getPrivateIdentifierEnvironment();
    const previousInfo = getPrivateIdentifier(privateEnv, name);
    const isStatic2 = hasStaticModifier(node);
    const isValid = !isReservedPrivateName(name) && previousInfo === void 0;
    addDeclaration(node, name, lex, privateEnv, isStatic2, isValid, previousInfo);
  }
  function createHoistedVariableForClass(name, node, suffix) {
    const { className } = getPrivateIdentifierEnvironment().data;
    const prefix = className ? { prefix: "_", node: className, suffix: "_" } : "_";
    const identifier = typeof name === "object" ? factory2.getGeneratedNameForNode(name, 16 /* Optimistic */ | 8 /* ReservedInNestedScopes */, prefix, suffix) : typeof name === "string" ? factory2.createUniqueName(name, 16 /* Optimistic */, prefix, suffix) : factory2.createTempVariable(
      /*recordTempVariable*/
      void 0,
      /*reservedInNestedScopes*/
      true,
      prefix,
      suffix
    );
    if (resolver.getNodeCheckFlags(node) & 32768 /* BlockScopedBindingInLoop */) {
      addBlockScopedVariable(identifier);
    } else {
      hoistVariableDeclaration(identifier);
    }
    return identifier;
  }
  function createHoistedVariableForPrivateName(name, suffix) {
    const text = tryGetTextOfPropertyName(name);
    return createHoistedVariableForClass((text == null ? void 0 : text.substring(1)) ?? name, name, suffix);
  }
  function accessPrivateIdentifier2(name) {
    const info = accessPrivateIdentifier(lexicalEnvironment, name);
    return (info == null ? void 0 : info.kind) === "untransformed" ? void 0 : info;
  }
  function wrapPrivateIdentifierForDestructuringTarget(node) {
    const parameter = factory2.getGeneratedNameForNode(node);
    const info = accessPrivateIdentifier2(node.name);
    if (!info) {
      return visitEachChild(node, visitor, context);
    }
    let receiver = node.expression;
    if (isThisProperty(node) || isSuperProperty(node) || !isSimpleCopiableExpression(node.expression)) {
      receiver = factory2.createTempVariable(
        hoistVariableDeclaration,
        /*reservedInNestedScopes*/
        true
      );
      getPendingExpressions().push(factory2.createBinaryExpression(receiver, 64 /* EqualsToken */, visitNode(node.expression, visitor, isExpression)));
    }
    return factory2.createAssignmentTargetWrapper(
      parameter,
      createPrivateIdentifierAssignment(
        info,
        receiver,
        parameter,
        64 /* EqualsToken */
      )
    );
  }
  function visitDestructuringAssignmentTarget(node) {
    if (isObjectLiteralExpression(node) || isArrayLiteralExpression(node)) {
      return visitAssignmentPattern(node);
    }
    if (isPrivateIdentifierPropertyAccessExpression(node)) {
      return wrapPrivateIdentifierForDestructuringTarget(node);
    } else if (shouldTransformSuperInStaticInitializers && isSuperProperty(node) && currentStaticPropertyDeclarationOrStaticBlock && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) {
      const { classConstructor, superClassReference, facts } = lexicalEnvironment.data;
      if (facts & 1 /* ClassWasDecorated */) {
        return visitInvalidSuperProperty(node);
      } else if (classConstructor && superClassReference) {
        const name = isElementAccessExpression(node) ? visitNode(node.argumentExpression, visitor, isExpression) : isIdentifier(node.name) ? factory2.createStringLiteralFromNode(node.name) : void 0;
        if (name) {
          const temp = factory2.createTempVariable(
            /*recordTempVariable*/
            void 0
          );
          return factory2.createAssignmentTargetWrapper(
            temp,
            factory2.createReflectSetCall(
              superClassReference,
              name,
              temp,
              classConstructor
            )
          );
        }
      }
    }
    return visitEachChild(node, visitor, context);
  }
  function visitAssignmentElement(node) {
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const left = visitDestructuringAssignmentTarget(node.left);
      const assignedName = getAssignedNameOfIdentifier(node.left, node.right);
      const right = visitNode(node.right, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
      return factory2.updateBinaryExpression(node, left, node.operatorToken, right);
    }
    if (isAssignmentExpression(
      node,
      /*excludeCompoundAssignment*/
      true
    )) {
      const left = visitDestructuringAssignmentTarget(node.left);
      const right = visitNode(node.right, visitor, isExpression);
      return factory2.updateBinaryExpression(node, left, node.operatorToken, right);
    }
    return visitDestructuringAssignmentTarget(node);
  }
  function visitAssignmentRestElement(node) {
    if (isLeftHandSideExpression(node.expression)) {
      const expression = visitDestructuringAssignmentTarget(node.expression);
      return factory2.updateSpreadElement(node, expression);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitArrayAssignmentElement(node) {
    if (isArrayBindingOrAssignmentElement(node)) {
      if (isSpreadElement(node))
        return visitAssignmentRestElement(node);
      if (!isOmittedExpression(node))
        return visitAssignmentElement(node);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitAssignmentProperty(node) {
    const name = visitNode(node.name, visitor, isPropertyName);
    if (isAssignmentExpression(
      node.initializer,
      /*excludeCompoundAssignment*/
      true
    )) {
      const assignmentElement = visitAssignmentElement(node.initializer);
      return factory2.updatePropertyAssignment(node, name, assignmentElement);
    }
    if (isLeftHandSideExpression(node.initializer)) {
      const assignmentElement = visitDestructuringAssignmentTarget(node.initializer);
      return factory2.updatePropertyAssignment(node, name, assignmentElement);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitShorthandAssignmentProperty(node) {
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const assignedName = getAssignedNameOfIdentifier(node.name, node.objectAssignmentInitializer);
      const objectAssignmentInitializer = visitNode(node.objectAssignmentInitializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
      return factory2.updateShorthandPropertyAssignment(node, node.name, objectAssignmentInitializer);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitAssignmentRestProperty(node) {
    if (isLeftHandSideExpression(node.expression)) {
      const expression = visitDestructuringAssignmentTarget(node.expression);
      return factory2.updateSpreadAssignment(node, expression);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitObjectAssignmentElement(node) {
    Debug.assertNode(node, isObjectBindingOrAssignmentElement);
    if (isSpreadAssignment(node))
      return visitAssignmentRestProperty(node);
    if (isShorthandPropertyAssignment(node))
      return visitShorthandAssignmentProperty(node);
    if (isPropertyAssignment(node))
      return visitAssignmentProperty(node);
    return visitEachChild(node, visitor, context);
  }
  function visitAssignmentPattern(node) {
    if (isArrayLiteralExpression(node)) {
      return factory2.updateArrayLiteralExpression(
        node,
        visitNodes2(node.elements, visitArrayAssignmentElement, isExpression)
      );
    } else {
      return factory2.updateObjectLiteralExpression(
        node,
        visitNodes2(node.properties, visitObjectAssignmentElement, isObjectLiteralElementLike)
      );
    }
  }
  function onEmitNode(hint, node, emitCallback) {
    const original = getOriginalNode(node);
    const lex = lexicalEnvironmentMap.get(original);
    if (lex) {
      const savedLexicalEnvironment = lexicalEnvironment;
      const savedPreviousShouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis;
      lexicalEnvironment = lex;
      previousShouldSubstituteThisWithClassThis = shouldSubstituteThisWithClassThis;
      shouldSubstituteThisWithClassThis = !isClassStaticBlockDeclaration(original) || !(getInternalEmitFlags(original) & 32 /* TransformPrivateStaticElements */);
      previousOnEmitNode(hint, node, emitCallback);
      shouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis;
      previousShouldSubstituteThisWithClassThis = savedPreviousShouldSubstituteThisWithClassThis;
      lexicalEnvironment = savedLexicalEnvironment;
      return;
    }
    switch (node.kind) {
      case 217 /* FunctionExpression */:
        if (isArrowFunction(original) || getEmitFlags(node) & 524288 /* AsyncFunctionBody */) {
          break;
        }
      case 261 /* FunctionDeclaration */:
      case 175 /* Constructor */:
      case 176 /* GetAccessor */:
      case 177 /* SetAccessor */:
      case 173 /* MethodDeclaration */:
      case 171 /* PropertyDeclaration */: {
        const savedLexicalEnvironment = lexicalEnvironment;
        const savedPreviousShouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis;
        lexicalEnvironment = void 0;
        previousShouldSubstituteThisWithClassThis = shouldSubstituteThisWithClassThis;
        shouldSubstituteThisWithClassThis = false;
        previousOnEmitNode(hint, node, emitCallback);
        shouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis;
        previousShouldSubstituteThisWithClassThis = savedPreviousShouldSubstituteThisWithClassThis;
        lexicalEnvironment = savedLexicalEnvironment;
        return;
      }
      case 166 /* ComputedPropertyName */: {
        const savedLexicalEnvironment = lexicalEnvironment;
        const savedShouldSubstituteThisWithClassThis = shouldSubstituteThisWithClassThis;
        lexicalEnvironment = lexicalEnvironment == null ? void 0 : lexicalEnvironment.previous;
        shouldSubstituteThisWithClassThis = previousShouldSubstituteThisWithClassThis;
        previousOnEmitNode(hint, node, emitCallback);
        shouldSubstituteThisWithClassThis = savedShouldSubstituteThisWithClassThis;
        lexicalEnvironment = savedLexicalEnvironment;
        return;
      }
    }
    previousOnEmitNode(hint, node, emitCallback);
  }
  function onSubstituteNode(hint, node) {
    node = previousOnSubstituteNode(hint, node);
    if (hint === 1 /* Expression */) {
      return substituteExpression(node);
    }
    return node;
  }
  function substituteExpression(node) {
    switch (node.kind) {
      case 80 /* Identifier */:
        return substituteExpressionIdentifier(node);
      case 110 /* ThisKeyword */:
        return substituteThisExpression(node);
    }
    return node;
  }
  function substituteThisExpression(node) {
    if (enabledSubstitutions & 2 /* ClassStaticThisOrSuperReference */ && (lexicalEnvironment == null ? void 0 : lexicalEnvironment.data)) {
      const { facts, classConstructor, classThis } = lexicalEnvironment.data;
      if (facts & 1 /* ClassWasDecorated */ && legacyDecorators) {
        return factory2.createParenthesizedExpression(factory2.createVoidZero());
      }
      const substituteThis = shouldSubstituteThisWithClassThis ? classThis ?? classConstructor : classConstructor;
      if (substituteThis) {
        return setTextRange(
          setOriginalNode(
            factory2.cloneNode(substituteThis),
            node
          ),
          node
        );
      }
    }
    return node;
  }
  function substituteExpressionIdentifier(node) {
    return trySubstituteClassAlias(node) || node;
  }
  function trySubstituteClassAlias(node) {
    if (enabledSubstitutions & 1 /* ClassAliases */) {
      if (resolver.getNodeCheckFlags(node) & 2097152 /* ConstructorReferenceInClass */) {
        const declaration = resolver.getReferencedValueDeclaration(node);
        if (declaration) {
          const classAlias = classAliases[declaration.id];
          if (classAlias) {
            const clone2 = factory2.cloneNode(classAlias);
            setSourceMapRange(clone2, node);
            setCommentRange(clone2, node);
            return clone2;
          }
        }
      }
    }
    return void 0;
  }
}
function createPrivateStaticFieldInitializer(factory2, variableName, initializer) {
  return factory2.createAssignment(
    variableName,
    factory2.createObjectLiteralExpression([
      factory2.createPropertyAssignment("value", initializer || factory2.createVoidZero())
    ])
  );
}
function createPrivateInstanceFieldInitializer(factory2, receiver, initializer, weakMapName) {
  return factory2.createCallExpression(
    factory2.createPropertyAccessExpression(weakMapName, "set"),
    /*typeArguments*/
    void 0,
    [receiver, initializer || factory2.createVoidZero()]
  );
}
function createPrivateInstanceMethodInitializer(factory2, receiver, weakSetName) {
  return factory2.createCallExpression(
    factory2.createPropertyAccessExpression(weakSetName, "add"),
    /*typeArguments*/
    void 0,
    [receiver]
  );
}
function isReservedPrivateName(node) {
  return !isGeneratedPrivateIdentifier(node) && node.escapedText === "#constructor";
}
function isPrivateIdentifierInExpression(node) {
  return isPrivateIdentifier(node.left) && node.operatorToken.kind === 103 /* InKeyword */;
}

// src/compiler/transformers/typeSerializer.ts
function createRuntimeTypeSerializer(context) {
  const {
    factory: factory2,
    hoistVariableDeclaration
  } = context;
  const resolver = context.getEmitResolver();
  const compilerOptions = context.getCompilerOptions();
  const languageVersion = getEmitScriptTarget(compilerOptions);
  const strictNullChecks = getStrictOptionValue(compilerOptions, "strictNullChecks");
  let currentLexicalScope;
  let currentNameScope;
  return {
    serializeTypeNode: (serializerContext, node) => setSerializerContextAnd(serializerContext, serializeTypeNode, node),
    serializeTypeOfNode: (serializerContext, node) => setSerializerContextAnd(serializerContext, serializeTypeOfNode, node),
    serializeParameterTypesOfNode: (serializerContext, node, container) => setSerializerContextAnd(serializerContext, serializeParameterTypesOfNode, node, container),
    serializeReturnTypeOfNode: (serializerContext, node) => setSerializerContextAnd(serializerContext, serializeReturnTypeOfNode, node)
  };
  function setSerializerContextAnd(serializerContext, cb, node, arg) {
    const savedCurrentLexicalScope = currentLexicalScope;
    const savedCurrentNameScope = currentNameScope;
    currentLexicalScope = serializerContext.currentLexicalScope;
    currentNameScope = serializerContext.currentNameScope;
    const result = arg === void 0 ? cb(node) : cb(node, arg);
    currentLexicalScope = savedCurrentLexicalScope;
    currentNameScope = savedCurrentNameScope;
    return result;
  }
  function getAccessorTypeNode(node) {
    const accessors = resolver.getAllAccessorDeclarations(node);
    return accessors.setAccessor && getSetAccessorTypeAnnotationNode(accessors.setAccessor) || accessors.getAccessor && getEffectiveReturnTypeNode(accessors.getAccessor);
  }
  function serializeTypeOfNode(node) {
    switch (node.kind) {
      case 171 /* PropertyDeclaration */:
      case 168 /* Parameter */:
        return serializeTypeNode(node.type);
      case 177 /* SetAccessor */:
      case 176 /* GetAccessor */:
        return serializeTypeNode(getAccessorTypeNode(node));
      case 262 /* ClassDeclaration */:
      case 230 /* ClassExpression */:
      case 173 /* MethodDeclaration */:
        return factory2.createIdentifier("Function");
      default:
        return factory2.createVoidZero();
    }
  }
  function serializeParameterTypesOfNode(node, container) {
    const valueDeclaration = isClassLike(node) ? getFirstConstructorWithBody(node) : isFunctionLike(node) && nodeIsPresent(node.body) ? node : void 0;
    const expressions = [];
    if (valueDeclaration) {
      const parameters = getParametersOfDecoratedDeclaration(valueDeclaration, container);
      const numParameters = parameters.length;
      for (let i = 0; i < numParameters; i++) {
        const parameter = parameters[i];
        if (i === 0 && isIdentifier(parameter.name) && parameter.name.escapedText === "this") {
          continue;
        }
        if (parameter.dotDotDotToken) {
          expressions.push(serializeTypeNode(getRestParameterElementType(parameter.type)));
        } else {
          expressions.push(serializeTypeOfNode(parameter));
        }
      }
    }
    return factory2.createArrayLiteralExpression(expressions);
  }
  function getParametersOfDecoratedDeclaration(node, container) {
    if (container && node.kind === 176 /* GetAccessor */) {
      const { setAccessor } = getAllAccessorDeclarations(container.members, node);
      if (setAccessor) {
        return setAccessor.parameters;
      }
    }
    return node.parameters;
  }
  function serializeReturnTypeOfNode(node) {
    if (isFunctionLike(node) && node.type) {
      return serializeTypeNode(node.type);
    } else if (isAsyncFunction(node)) {
      return factory2.createIdentifier("Promise");
    }
    return factory2.createVoidZero();
  }
  function serializeTypeNode(node) {
    if (node === void 0) {
      return factory2.createIdentifier("Object");
    }
    node = skipTypeParentheses(node);
    switch (node.kind) {
      case 116 /* VoidKeyword */:
      case 157 /* UndefinedKeyword */:
      case 146 /* NeverKeyword */:
        return factory2.createVoidZero();
      case 183 /* FunctionType */:
      case 184 /* ConstructorType */:
        return factory2.createIdentifier("Function");
      case 187 /* ArrayType */:
      case 188 /* TupleType */:
        return factory2.createIdentifier("Array");
      case 181 /* TypePredicate */:
        return node.assertsModifier ? factory2.createVoidZero() : factory2.createIdentifier("Boolean");
      case 136 /* BooleanKeyword */:
        return factory2.createIdentifier("Boolean");
      case 202 /* TemplateLiteralType */:
      case 154 /* StringKeyword */:
        return factory2.createIdentifier("String");
      case 151 /* ObjectKeyword */:
        return factory2.createIdentifier("Object");
      case 200 /* LiteralType */:
        return serializeLiteralOfLiteralTypeNode(node.literal);
      case 150 /* NumberKeyword */:
        return factory2.createIdentifier("Number");
      case 162 /* BigIntKeyword */:
        return getGlobalConstructor("BigInt", 7 /* ES2020 */);
      case 155 /* SymbolKeyword */:
        return getGlobalConstructor("Symbol", 2 /* ES2015 */);
      case 182 /* TypeReference */:
        return serializeTypeReferenceNode(node);
      case 192 /* IntersectionType */:
        return serializeUnionOrIntersectionConstituents(
          node.types,
          /*isIntersection*/
          true
        );
      case 191 /* UnionType */:
        return serializeUnionOrIntersectionConstituents(
          node.types,
          /*isIntersection*/
          false
        );
      case 193 /* ConditionalType */:
        return serializeUnionOrIntersectionConstituents(
          [node.trueType, node.falseType],
          /*isIntersection*/
          false
        );
      case 197 /* TypeOperator */:
        if (node.operator === 148 /* ReadonlyKeyword */) {
          return serializeTypeNode(node.type);
        }
        break;
      case 185 /* TypeQuery */:
      case 198 /* IndexedAccessType */:
      case 199 /* MappedType */:
      case 186 /* TypeLiteral */:
      case 133 /* AnyKeyword */:
      case 159 /* UnknownKeyword */:
      case 196 /* ThisType */:
      case 204 /* ImportType */:
        break;
      case 318 /* JSDocAllType */:
      case 319 /* JSDocUnknownType */:
      case 323 /* JSDocFunctionType */:
      case 324 /* JSDocVariadicType */:
      case 325 /* JSDocNamepathType */:
        break;
      case 320 /* JSDocNullableType */:
      case 321 /* JSDocNonNullableType */:
      case 322 /* JSDocOptionalType */:
        return serializeTypeNode(node.type);
      default:
        return Debug.failBadSyntaxKind(node);
    }
    return factory2.createIdentifier("Object");
  }
  function serializeLiteralOfLiteralTypeNode(node) {
    switch (node.kind) {
      case 11 /* StringLiteral */:
      case 15 /* NoSubstitutionTemplateLiteral */:
        return factory2.createIdentifier("String");
      case 223 /* PrefixUnaryExpression */: {
        const operand = node.operand;
        switch (operand.kind) {
          case 9 /* NumericLiteral */:
          case 10 /* BigIntLiteral */:
            return serializeLiteralOfLiteralTypeNode(operand);
          default:
            return Debug.failBadSyntaxKind(operand);
        }
      }
      case 9 /* NumericLiteral */:
        return factory2.createIdentifier("Number");
      case 10 /* BigIntLiteral */:
        return getGlobalConstructor("BigInt", 7 /* ES2020 */);
      case 112 /* TrueKeyword */:
      case 97 /* FalseKeyword */:
        return factory2.createIdentifier("Boolean");
      case 106 /* NullKeyword */:
        return factory2.createVoidZero();
      default:
        return Debug.failBadSyntaxKind(node);
    }
  }
  function serializeUnionOrIntersectionConstituents(types, isIntersection) {
    let serializedType;
    for (let typeNode of types) {
      typeNode = skipTypeParentheses(typeNode);
      if (typeNode.kind === 146 /* NeverKeyword */) {
        if (isIntersection)
          return factory2.createVoidZero();
        continue;
      }
      if (typeNode.kind === 159 /* UnknownKeyword */) {
        if (!isIntersection)
          return factory2.createIdentifier("Object");
        continue;
      }
      if (typeNode.kind === 133 /* AnyKeyword */) {
        return factory2.createIdentifier("Object");
      }
      if (!strictNullChecks && (isLiteralTypeNode(typeNode) && typeNode.literal.kind === 106 /* NullKeyword */ || typeNode.kind === 157 /* UndefinedKeyword */)) {
        continue;
      }
      const serializedConstituent = serializeTypeNode(typeNode);
      if (isIdentifier(serializedConstituent) && serializedConstituent.escapedText === "Object") {
        return serializedConstituent;
      }
      if (serializedType) {
        if (!equateSerializedTypeNodes(serializedType, serializedConstituent)) {
          return factory2.createIdentifier("Object");
        }
      } else {
        serializedType = serializedConstituent;
      }
    }
    return serializedType ?? factory2.createVoidZero();
  }
  function equateSerializedTypeNodes(left, right) {
    return (
      // temp vars used in fallback
      isGeneratedIdentifier(left) ? isGeneratedIdentifier(right) : (
        // entity names
        isIdentifier(left) ? isIdentifier(right) && left.escapedText === right.escapedText : isPropertyAccessExpression(left) ? isPropertyAccessExpression(right) && equateSerializedTypeNodes(left.expression, right.expression) && equateSerializedTypeNodes(left.name, right.name) : (
          // `void 0`
          isVoidExpression(left) ? isVoidExpression(right) && isNumericLiteral(left.expression) && left.expression.text === "0" && isNumericLiteral(right.expression) && right.expression.text === "0" : (
            // `"undefined"` or `"function"` in `typeof` checks
            isStringLiteral(left) ? isStringLiteral(right) && left.text === right.text : (
              // used in `typeof` checks for fallback
              isTypeOfExpression(left) ? isTypeOfExpression(right) && equateSerializedTypeNodes(left.expression, right.expression) : (
                // parens in `typeof` checks with temps
                isParenthesizedExpression(left) ? isParenthesizedExpression(right) && equateSerializedTypeNodes(left.expression, right.expression) : (
                  // conditionals used in fallback
                  isConditionalExpression(left) ? isConditionalExpression(right) && equateSerializedTypeNodes(left.condition, right.condition) && equateSerializedTypeNodes(left.whenTrue, right.whenTrue) && equateSerializedTypeNodes(left.whenFalse, right.whenFalse) : (
                    // logical binary and assignments used in fallback
                    isBinaryExpression(left) ? isBinaryExpression(right) && left.operatorToken.kind === right.operatorToken.kind && equateSerializedTypeNodes(left.left, right.left) && equateSerializedTypeNodes(left.right, right.right) : false
                  )
                )
              )
            )
          )
        )
      )
    );
  }
  function serializeTypeReferenceNode(node) {
    const kind = resolver.getTypeReferenceSerializationKind(node.typeName, currentNameScope ?? currentLexicalScope);
    switch (kind) {
      case 0 /* Unknown */:
        if (findAncestor(node, (n) => n.parent && isConditionalTypeNode(n.parent) && (n.parent.trueType === n || n.parent.falseType === n))) {
          return factory2.createIdentifier("Object");
        }
        const serialized = serializeEntityNameAsExpressionFallback(node.typeName);
        const temp = factory2.createTempVariable(hoistVariableDeclaration);
        return factory2.createConditionalExpression(
          factory2.createTypeCheck(factory2.createAssignment(temp, serialized), "function"),
          /*questionToken*/
          void 0,
          temp,
          /*colonToken*/
          void 0,
          factory2.createIdentifier("Object")
        );
      case 1 /* TypeWithConstructSignatureAndValue */:
        return serializeEntityNameAsExpression(node.typeName);
      case 2 /* VoidNullableOrNeverType */:
        return factory2.createVoidZero();
      case 4 /* BigIntLikeType */:
        return getGlobalConstructor("BigInt", 7 /* ES2020 */);
      case 6 /* BooleanType */:
        return factory2.createIdentifier("Boolean");
      case 3 /* NumberLikeType */:
        return factory2.createIdentifier("Number");
      case 5 /* StringLikeType */:
        return factory2.createIdentifier("String");
      case 7 /* ArrayLikeType */:
        return factory2.createIdentifier("Array");
      case 8 /* ESSymbolType */:
        return getGlobalConstructor("Symbol", 2 /* ES2015 */);
      case 10 /* TypeWithCallSignature */:
        return factory2.createIdentifier("Function");
      case 9 /* Promise */:
        return factory2.createIdentifier("Promise");
      case 11 /* ObjectType */:
        return factory2.createIdentifier("Object");
      default:
        return Debug.assertNever(kind);
    }
  }
  function createCheckedValue(left, right) {
    return factory2.createLogicalAnd(
      factory2.createStrictInequality(factory2.createTypeOfExpression(left), factory2.createStringLiteral("undefined")),
      right
    );
  }
  function serializeEntityNameAsExpressionFallback(node) {
    if (node.kind === 80 /* Identifier */) {
      const copied = serializeEntityNameAsExpression(node);
      return createCheckedValue(copied, copied);
    }
    if (node.left.kind === 80 /* Identifier */) {
      return createCheckedValue(serializeEntityNameAsExpression(node.left), serializeEntityNameAsExpression(node));
    }
    const left = serializeEntityNameAsExpressionFallback(node.left);
    const temp = factory2.createTempVariable(hoistVariableDeclaration);
    return factory2.createLogicalAnd(
      factory2.createLogicalAnd(
        left.left,
        factory2.createStrictInequality(factory2.createAssignment(temp, left.right), factory2.createVoidZero())
      ),
      factory2.createPropertyAccessExpression(temp, node.right)
    );
  }
  function serializeEntityNameAsExpression(node) {
    switch (node.kind) {
      case 80 /* Identifier */:
        const name = setParent(setTextRange(parseNodeFactory.cloneNode(node), node), node.parent);
        name.original = void 0;
        setParent(name, getParseTreeNode(currentLexicalScope));
        return name;
      case 165 /* QualifiedName */:
        return serializeQualifiedNameAsExpression(node);
    }
  }
  function serializeQualifiedNameAsExpression(node) {
    return factory2.createPropertyAccessExpression(serializeEntityNameAsExpression(node.left), node.right);
  }
  function getGlobalConstructorWithFallback(name) {
    return factory2.createConditionalExpression(
      factory2.createTypeCheck(factory2.createIdentifier(name), "function"),
      /*questionToken*/
      void 0,
      factory2.createIdentifier(name),
      /*colonToken*/
      void 0,
      factory2.createIdentifier("Object")
    );
  }
  function getGlobalConstructor(name, minLanguageVersion) {
    return languageVersion < minLanguageVersion ? getGlobalConstructorWithFallback(name) : factory2.createIdentifier(name);
  }
}

// src/compiler/transformers/legacyDecorators.ts
function transformLegacyDecorators(context) {
  const {
    factory: factory2,
    getEmitHelperFactory: emitHelpers,
    hoistVariableDeclaration
  } = context;
  const resolver = context.getEmitResolver();
  const compilerOptions = context.getCompilerOptions();
  const languageVersion = getEmitScriptTarget(compilerOptions);
  const previousOnSubstituteNode = context.onSubstituteNode;
  context.onSubstituteNode = onSubstituteNode;
  let classAliases;
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    const visited = visitEachChild(node, visitor, context);
    addEmitHelpers(visited, context.readEmitHelpers());
    return visited;
  }
  function modifierVisitor(node) {
    return isDecorator(node) ? void 0 : node;
  }
  function visitor(node) {
    if (!(node.transformFlags & 33554432 /* ContainsDecorators */)) {
      return node;
    }
    switch (node.kind) {
      case 169 /* Decorator */:
        return void 0;
      case 262 /* ClassDeclaration */:
        return visitClassDeclaration(node);
      case 230 /* ClassExpression */:
        return visitClassExpression(node);
      case 175 /* Constructor */:
        return visitConstructorDeclaration(node);
      case 173 /* MethodDeclaration */:
        return visitMethodDeclaration(node);
      case 177 /* SetAccessor */:
        return visitSetAccessorDeclaration(node);
      case 176 /* GetAccessor */:
        return visitGetAccessorDeclaration(node);
      case 171 /* PropertyDeclaration */:
        return visitPropertyDeclaration(node);
      case 168 /* Parameter */:
        return visitParameterDeclaration(node);
      default:
        return visitEachChild(node, visitor, context);
    }
  }
  function visitClassDeclaration(node) {
    if (!(classOrConstructorParameterIsDecorated(
      /*useLegacyDecorators*/
      true,
      node
    ) || childIsDecorated(
      /*useLegacyDecorators*/
      true,
      node
    ))) {
      return visitEachChild(node, visitor, context);
    }
    const statements = classOrConstructorParameterIsDecorated(
      /*useLegacyDecorators*/
      true,
      node
    ) ? transformClassDeclarationWithClassDecorators(node, node.name) : transformClassDeclarationWithoutClassDecorators(node, node.name);
    return singleOrMany(statements);
  }
  function decoratorContainsPrivateIdentifierInExpression(decorator) {
    return !!(decorator.transformFlags & 536870912 /* ContainsPrivateIdentifierInExpression */);
  }
  function parameterDecoratorsContainPrivateIdentifierInExpression(parameterDecorators) {
    return some(parameterDecorators, decoratorContainsPrivateIdentifierInExpression);
  }
  function hasClassElementWithDecoratorContainingPrivateIdentifierInExpression(node) {
    for (const member of node.members) {
      if (!canHaveDecorators(member))
        continue;
      const allDecorators = getAllDecoratorsOfClassElement(
        member,
        node,
        /*useLegacyDecorators*/
        true
      );
      if (some(allDecorators == null ? void 0 : allDecorators.decorators, decoratorContainsPrivateIdentifierInExpression))
        return true;
      if (some(allDecorators == null ? void 0 : allDecorators.parameters, parameterDecoratorsContainPrivateIdentifierInExpression))
        return true;
    }
    return false;
  }
  function transformDecoratorsOfClassElements(node, members) {
    let decorationStatements = [];
    addClassElementDecorationStatements(
      decorationStatements,
      node,
      /*isStatic*/
      false
    );
    addClassElementDecorationStatements(
      decorationStatements,
      node,
      /*isStatic*/
      true
    );
    if (hasClassElementWithDecoratorContainingPrivateIdentifierInExpression(node)) {
      members = setTextRange(factory2.createNodeArray([
        ...members,
        factory2.createClassStaticBlockDeclaration(
          factory2.createBlock(
            decorationStatements,
            /*multiLine*/
            true
          )
        )
      ]), members);
      decorationStatements = void 0;
    }
    return { decorationStatements, members };
  }
  function transformClassDeclarationWithoutClassDecorators(node, name) {
    const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
    const heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause);
    let members = visitNodes2(node.members, visitor, isClassElement);
    let decorationStatements = [];
    ({ members, decorationStatements } = transformDecoratorsOfClassElements(node, members));
    const updated = factory2.updateClassDeclaration(
      node,
      modifiers,
      name,
      /*typeParameters*/
      void 0,
      heritageClauses,
      members
    );
    return addRange([updated], decorationStatements);
  }
  function transformClassDeclarationWithClassDecorators(node, name) {
    const isExport = hasSyntacticModifier(node, 1 /* Export */);
    const isDefault = hasSyntacticModifier(node, 1024 /* Default */);
    const modifiers = visitNodes2(node.modifiers, (node2) => isExportOrDefaultModifier(node2) || isDecorator(node2) ? void 0 : node2, isModifierLike);
    const location = moveRangePastModifiers(node);
    const classAlias = getClassAliasIfNeeded(node);
    const declName = languageVersion < 2 /* ES2015 */ ? factory2.getInternalName(
      node,
      /*allowComments*/
      false,
      /*allowSourceMaps*/
      true
    ) : factory2.getLocalName(
      node,
      /*allowComments*/
      false,
      /*allowSourceMaps*/
      true
    );
    const heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause);
    let members = visitNodes2(node.members, visitor, isClassElement);
    let decorationStatements = [];
    ({ members, decorationStatements } = transformDecoratorsOfClassElements(node, members));
    const assignClassAliasInStaticBlock = languageVersion >= 9 /* ES2022 */ && !!classAlias && some(members, (member) => isPropertyDeclaration(member) && hasSyntacticModifier(member, 32 /* Static */) || isClassStaticBlockDeclaration(member));
    if (assignClassAliasInStaticBlock) {
      members = setTextRange(factory2.createNodeArray([
        factory2.createClassStaticBlockDeclaration(
          factory2.createBlock([
            factory2.createExpressionStatement(
              factory2.createAssignment(classAlias, factory2.createThis())
            )
          ])
        ),
        ...members
      ]), members);
    }
    const classExpression = factory2.createClassExpression(
      modifiers,
      name && isGeneratedIdentifier(name) ? void 0 : name,
      /*typeParameters*/
      void 0,
      heritageClauses,
      members
    );
    setOriginalNode(classExpression, node);
    setTextRange(classExpression, location);
    const varDecl = factory2.createVariableDeclaration(
      declName,
      /*exclamationToken*/
      void 0,
      /*type*/
      void 0,
      classAlias && !assignClassAliasInStaticBlock ? factory2.createAssignment(classAlias, classExpression) : classExpression
    );
    setOriginalNode(varDecl, node);
    let varModifiers;
    if (isExport && !isDefault) {
      varModifiers = factory2.createModifiersFromModifierFlags(1 /* Export */);
    }
    const statement = factory2.createVariableStatement(
      varModifiers,
      factory2.createVariableDeclarationList([
        varDecl
      ], 1 /* Let */)
    );
    setOriginalNode(statement, node);
    setTextRange(statement, location);
    setCommentRange(statement, node);
    const statements = [statement];
    addRange(statements, decorationStatements);
    addConstructorDecorationStatement(statements, node);
    if (isExport && isDefault) {
      statements.push(factory2.createExportAssignment(
        /*modifiers*/
        void 0,
        /*isExportEquals*/
        false,
        declName
      ));
    }
    return statements;
  }
  function visitClassExpression(node) {
    return factory2.updateClassExpression(
      node,
      visitNodes2(node.modifiers, modifierVisitor, isModifier),
      node.name,
      /*typeParameters*/
      void 0,
      visitNodes2(node.heritageClauses, visitor, isHeritageClause),
      visitNodes2(node.members, visitor, isClassElement)
    );
  }
  function visitConstructorDeclaration(node) {
    return factory2.updateConstructorDeclaration(
      node,
      visitNodes2(node.modifiers, modifierVisitor, isModifier),
      visitNodes2(node.parameters, visitor, isParameter),
      visitNode(node.body, visitor, isBlock)
    );
  }
  function finishClassElement(updated, original) {
    if (updated !== original) {
      setCommentRange(updated, original);
      setSourceMapRange(updated, moveRangePastModifiers(original));
    }
    return updated;
  }
  function visitMethodDeclaration(node) {
    return finishClassElement(factory2.updateMethodDeclaration(
      node,
      visitNodes2(node.modifiers, modifierVisitor, isModifier),
      node.asteriskToken,
      Debug.checkDefined(visitNode(node.name, visitor, isPropertyName)),
      /*questionToken*/
      void 0,
      /*typeParameters*/
      void 0,
      visitNodes2(node.parameters, visitor, isParameter),
      /*type*/
      void 0,
      visitNode(node.body, visitor, isBlock)
    ), node);
  }
  function visitGetAccessorDeclaration(node) {
    return finishClassElement(factory2.updateGetAccessorDeclaration(
      node,
      visitNodes2(node.modifiers, modifierVisitor, isModifier),
      Debug.checkDefined(visitNode(node.name, visitor, isPropertyName)),
      visitNodes2(node.parameters, visitor, isParameter),
      /*type*/
      void 0,
      visitNode(node.body, visitor, isBlock)
    ), node);
  }
  function visitSetAccessorDeclaration(node) {
    return finishClassElement(factory2.updateSetAccessorDeclaration(
      node,
      visitNodes2(node.modifiers, modifierVisitor, isModifier),
      Debug.checkDefined(visitNode(node.name, visitor, isPropertyName)),
      visitNodes2(node.parameters, visitor, isParameter),
      visitNode(node.body, visitor, isBlock)
    ), node);
  }
  function visitPropertyDeclaration(node) {
    if (node.flags & 16777216 /* Ambient */ || hasSyntacticModifier(node, 2 /* Ambient */)) {
      return void 0;
    }
    return finishClassElement(factory2.updatePropertyDeclaration(
      node,
      visitNodes2(node.modifiers, modifierVisitor, isModifier),
      Debug.checkDefined(visitNode(node.name, visitor, isPropertyName)),
      /*questionOrExclamationToken*/
      void 0,
      /*type*/
      void 0,
      visitNode(node.initializer, visitor, isExpression)
    ), node);
  }
  function visitParameterDeclaration(node) {
    const updated = factory2.updateParameterDeclaration(
      node,
      elideNodes(factory2, node.modifiers),
      node.dotDotDotToken,
      Debug.checkDefined(visitNode(node.name, visitor, isBindingName)),
      /*questionToken*/
      void 0,
      /*type*/
      void 0,
      visitNode(node.initializer, visitor, isExpression)
    );
    if (updated !== node) {
      setCommentRange(updated, node);
      setTextRange(updated, moveRangePastModifiers(node));
      setSourceMapRange(updated, moveRangePastModifiers(node));
      setEmitFlags(updated.name, 64 /* NoTrailingSourceMap */);
    }
    return updated;
  }
  function isSyntheticMetadataDecorator(node) {
    return isCallToHelper(node.expression, "___metadata");
  }
  function transformAllDecoratorsOfDeclaration(allDecorators) {
    if (!allDecorators) {
      return void 0;
    }
    const { false: decorators, true: metadata } = groupBy(allDecorators.decorators, isSyntheticMetadataDecorator);
    const decoratorExpressions = [];
    addRange(decoratorExpressions, map(decorators, transformDecorator));
    addRange(decoratorExpressions, flatMap(allDecorators.parameters, transformDecoratorsOfParameter));
    addRange(decoratorExpressions, map(metadata, transformDecorator));
    return decoratorExpressions;
  }
  function addClassElementDecorationStatements(statements, node, isStatic2) {
    addRange(statements, map(generateClassElementDecorationExpressions(node, isStatic2), (expr) => factory2.createExpressionStatement(expr)));
  }
  function isDecoratedClassElement(member, isStaticElement, parent) {
    return nodeOrChildIsDecorated(
      /*useLegacyDecorators*/
      true,
      member,
      parent
    ) && isStaticElement === isStatic(member);
  }
  function getDecoratedClassElements(node, isStatic2) {
    return filter(node.members, (m) => isDecoratedClassElement(m, isStatic2, node));
  }
  function generateClassElementDecorationExpressions(node, isStatic2) {
    const members = getDecoratedClassElements(node, isStatic2);
    let expressions;
    for (const member of members) {
      expressions = append(expressions, generateClassElementDecorationExpression(node, member));
    }
    return expressions;
  }
  function generateClassElementDecorationExpression(node, member) {
    const allDecorators = getAllDecoratorsOfClassElement(
      member,
      node,
      /*useLegacyDecorators*/
      true
    );
    const decoratorExpressions = transformAllDecoratorsOfDeclaration(allDecorators);
    if (!decoratorExpressions) {
      return void 0;
    }
    const prefix = getClassMemberPrefix(node, member);
    const memberName = getExpressionForPropertyName(
      member,
      /*generateNameForComputedPropertyName*/
      !hasSyntacticModifier(member, 2 /* Ambient */)
    );
    const descriptor = languageVersion > 0 /* ES3 */ ? isPropertyDeclaration(member) && !hasAccessorModifier(member) ? factory2.createVoidZero() : factory2.createNull() : void 0;
    const helper = emitHelpers().createDecorateHelper(
      decoratorExpressions,
      prefix,
      memberName,
      descriptor
    );
    setEmitFlags(helper, 3072 /* NoComments */);
    setSourceMapRange(helper, moveRangePastModifiers(member));
    return helper;
  }
  function addConstructorDecorationStatement(statements, node) {
    const expression = generateConstructorDecorationExpression(node);
    if (expression) {
      statements.push(setOriginalNode(factory2.createExpressionStatement(expression), node));
    }
  }
  function generateConstructorDecorationExpression(node) {
    const allDecorators = getAllDecoratorsOfClass(node);
    const decoratorExpressions = transformAllDecoratorsOfDeclaration(allDecorators);
    if (!decoratorExpressions) {
      return void 0;
    }
    const classAlias = classAliases && classAliases[getOriginalNodeId(node)];
    const localName = languageVersion < 2 /* ES2015 */ ? factory2.getInternalName(
      node,
      /*allowComments*/
      false,
      /*allowSourceMaps*/
      true
    ) : factory2.getDeclarationName(
      node,
      /*allowComments*/
      false,
      /*allowSourceMaps*/
      true
    );
    const decorate = emitHelpers().createDecorateHelper(decoratorExpressions, localName);
    const expression = factory2.createAssignment(localName, classAlias ? factory2.createAssignment(classAlias, decorate) : decorate);
    setEmitFlags(expression, 3072 /* NoComments */);
    setSourceMapRange(expression, moveRangePastModifiers(node));
    return expression;
  }
  function transformDecorator(decorator) {
    return Debug.checkDefined(visitNode(decorator.expression, visitor, isExpression));
  }
  function transformDecoratorsOfParameter(decorators, parameterOffset) {
    let expressions;
    if (decorators) {
      expressions = [];
      for (const decorator of decorators) {
        const helper = emitHelpers().createParamHelper(
          transformDecorator(decorator),
          parameterOffset
        );
        setTextRange(helper, decorator.expression);
        setEmitFlags(helper, 3072 /* NoComments */);
        expressions.push(helper);
      }
    }
    return expressions;
  }
  function getExpressionForPropertyName(member, generateNameForComputedPropertyName) {
    const name = member.name;
    if (isPrivateIdentifier(name)) {
      return factory2.createIdentifier("");
    } else if (isComputedPropertyName(name)) {
      return generateNameForComputedPropertyName && !isSimpleInlineableExpression(name.expression) ? factory2.getGeneratedNameForNode(name) : name.expression;
    } else if (isIdentifier(name)) {
      return factory2.createStringLiteral(idText(name));
    } else {
      return factory2.cloneNode(name);
    }
  }
  function enableSubstitutionForClassAliases() {
    if (!classAliases) {
      context.enableSubstitution(80 /* Identifier */);
      classAliases = [];
    }
  }
  function getClassAliasIfNeeded(node) {
    if (resolver.getNodeCheckFlags(node) & 1048576 /* ClassWithConstructorReference */) {
      enableSubstitutionForClassAliases();
      const classAlias = factory2.createUniqueName(node.name && !isGeneratedIdentifier(node.name) ? idText(node.name) : "default");
      classAliases[getOriginalNodeId(node)] = classAlias;
      hoistVariableDeclaration(classAlias);
      return classAlias;
    }
  }
  function getClassPrototype(node) {
    return factory2.createPropertyAccessExpression(factory2.getDeclarationName(node), "prototype");
  }
  function getClassMemberPrefix(node, member) {
    return isStatic(member) ? factory2.getDeclarationName(node) : getClassPrototype(node);
  }
  function onSubstituteNode(hint, node) {
    node = previousOnSubstituteNode(hint, node);
    if (hint === 1 /* Expression */) {
      return substituteExpression(node);
    }
    return node;
  }
  function substituteExpression(node) {
    switch (node.kind) {
      case 80 /* Identifier */:
        return substituteExpressionIdentifier(node);
    }
    return node;
  }
  function substituteExpressionIdentifier(node) {
    return trySubstituteClassAlias(node) ?? node;
  }
  function trySubstituteClassAlias(node) {
    if (classAliases) {
      if (resolver.getNodeCheckFlags(node) & 2097152 /* ConstructorReferenceInClass */) {
        const declaration = resolver.getReferencedValueDeclaration(node);
        if (declaration) {
          const classAlias = classAliases[declaration.id];
          if (classAlias) {
            const clone2 = factory2.cloneNode(classAlias);
            setSourceMapRange(clone2, node);
            setCommentRange(clone2, node);
            return clone2;
          }
        }
      }
    }
    return void 0;
  }
}

// src/compiler/transformers/esDecorators.ts
function transformESDecorators(context) {
  const {
    factory: factory2,
    getEmitHelperFactory: emitHelpers,
    startLexicalEnvironment,
    endLexicalEnvironment,
    hoistVariableDeclaration
  } = context;
  const compilerOptions = context.getCompilerOptions();
  const languageVersion = getEmitScriptTarget(compilerOptions);
  let top;
  let classInfo;
  let classThis;
  let classSuper;
  let pendingExpressions;
  let shouldTransformPrivateStaticElementsInFile;
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    top = void 0;
    shouldTransformPrivateStaticElementsInFile = false;
    const visited = visitEachChild(node, visitor, context);
    addEmitHelpers(visited, context.readEmitHelpers());
    if (shouldTransformPrivateStaticElementsInFile) {
      addInternalEmitFlags(visited, 32 /* TransformPrivateStaticElements */);
      shouldTransformPrivateStaticElementsInFile = false;
    }
    return visited;
  }
  function updateState() {
    classInfo = void 0;
    classThis = void 0;
    classSuper = void 0;
    switch (top == null ? void 0 : top.kind) {
      case "class":
        classInfo = top.classInfo;
        break;
      case "class-element":
        classInfo = top.next.classInfo;
        classThis = top.classThis;
        classSuper = top.classSuper;
        break;
      case "name":
        const grandparent = top.next.next.next;
        if ((grandparent == null ? void 0 : grandparent.kind) === "class-element") {
          classInfo = grandparent.next.classInfo;
          classThis = grandparent.classThis;
          classSuper = grandparent.classSuper;
        }
        break;
    }
  }
  function enterClass(classInfo2) {
    top = { kind: "class", next: top, classInfo: classInfo2, savedPendingExpressions: pendingExpressions };
    pendingExpressions = void 0;
    updateState();
  }
  function exitClass() {
    Debug.assert((top == null ? void 0 : top.kind) === "class", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class' but got '${top == null ? void 0 : top.kind}' instead.`);
    pendingExpressions = top.savedPendingExpressions;
    top = top.next;
    updateState();
  }
  function enterClassElement(node) {
    var _a, _b;
    Debug.assert((top == null ? void 0 : top.kind) === "class", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class' but got '${top == null ? void 0 : top.kind}' instead.`);
    top = { kind: "class-element", next: top };
    if (isClassStaticBlockDeclaration(node) || isPropertyDeclaration(node) && hasStaticModifier(node)) {
      top.classThis = (_a = top.next.classInfo) == null ? void 0 : _a.classThis;
      top.classSuper = (_b = top.next.classInfo) == null ? void 0 : _b.classSuper;
    }
    updateState();
  }
  function exitClassElement() {
    var _a;
    Debug.assert((top == null ? void 0 : top.kind) === "class-element", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class-element' but got '${top == null ? void 0 : top.kind}' instead.`);
    Debug.assert(((_a = top.next) == null ? void 0 : _a.kind) === "class", "Incorrect value for top.next.kind.", () => {
      var _a2;
      return `Expected top.next.kind to be 'class' but got '${(_a2 = top.next) == null ? void 0 : _a2.kind}' instead.`;
    });
    top = top.next;
    updateState();
  }
  function enterName() {
    Debug.assert((top == null ? void 0 : top.kind) === "class-element", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class-element' but got '${top == null ? void 0 : top.kind}' instead.`);
    top = { kind: "name", next: top };
    updateState();
  }
  function exitName() {
    Debug.assert((top == null ? void 0 : top.kind) === "name", "Incorrect value for top.kind.", () => `Expected top.kind to be 'name' but got '${top == null ? void 0 : top.kind}' instead.`);
    top = top.next;
    updateState();
  }
  function enterOther() {
    if ((top == null ? void 0 : top.kind) === "other") {
      Debug.assert(!pendingExpressions);
      top.depth++;
    } else {
      top = { kind: "other", next: top, depth: 0, savedPendingExpressions: pendingExpressions };
      pendingExpressions = void 0;
      updateState();
    }
  }
  function exitOther() {
    Debug.assert((top == null ? void 0 : top.kind) === "other", "Incorrect value for top.kind.", () => `Expected top.kind to be 'other' but got '${top == null ? void 0 : top.kind}' instead.`);
    if (top.depth > 0) {
      Debug.assert(!pendingExpressions);
      top.depth--;
    } else {
      pendingExpressions = top.savedPendingExpressions;
      top = top.next;
      updateState();
    }
  }
  function shouldVisitNode(node) {
    return !!(node.transformFlags & 33554432 /* ContainsDecorators */) || !!classThis && !!(node.transformFlags & 16384 /* ContainsLexicalThis */) || !!classThis && !!classSuper && !!(node.transformFlags & 134217728 /* ContainsLexicalSuper */);
  }
  function visitor(node) {
    if (!shouldVisitNode(node)) {
      return node;
    }
    switch (node.kind) {
      case 169 /* Decorator */:
        return Debug.fail("Use `modifierVisitor` instead.");
      case 262 /* ClassDeclaration */:
        return visitClassDeclaration(node);
      case 230 /* ClassExpression */:
        return visitClassExpression(
          node,
          /*referencedName*/
          void 0
        );
      case 175 /* Constructor */:
      case 171 /* PropertyDeclaration */:
      case 174 /* ClassStaticBlockDeclaration */:
        return Debug.fail("Not supported outside of a class. Use 'classElementVisitor' instead.");
      case 168 /* Parameter */:
        return visitParameterDeclaration(node);
      case 225 /* BinaryExpression */:
        return visitBinaryExpression(
          node,
          /*discarded*/
          false
        );
      case 302 /* PropertyAssignment */:
        return visitPropertyAssignment(node);
      case 259 /* VariableDeclaration */:
        return visitVariableDeclaration(node);
      case 207 /* BindingElement */:
        return visitBindingElement(node);
      case 276 /* ExportAssignment */:
        return visitExportAssignment(node);
      case 110 /* ThisKeyword */:
        return visitThisExpression(node);
      case 247 /* ForStatement */:
        return visitForStatement(node);
      case 243 /* ExpressionStatement */:
        return visitExpressionStatement(node);
      case 360 /* CommaListExpression */:
        return visitCommaListExpression(
          node,
          /*discarded*/
          false
        );
      case 216 /* ParenthesizedExpression */:
        return visitParenthesizedExpression(
          node,
          /*discarded*/
          false,
          /*referencedName*/
          void 0
        );
      case 359 /* PartiallyEmittedExpression */:
        return visitPartiallyEmittedExpression(
          node,
          /*discarded*/
          false,
          /*referencedName*/
          void 0
        );
      case 212 /* CallExpression */:
        return visitCallExpression(node);
      case 214 /* TaggedTemplateExpression */:
        return visitTaggedTemplateExpression(node);
      case 223 /* PrefixUnaryExpression */:
      case 224 /* PostfixUnaryExpression */:
        return visitPreOrPostfixUnaryExpression(
          node,
          /*discarded*/
          false
        );
      case 210 /* PropertyAccessExpression */:
        return visitPropertyAccessExpression(node);
      case 211 /* ElementAccessExpression */:
        return visitElementAccessExpression(node);
      case 166 /* ComputedPropertyName */:
        return visitComputedPropertyName(node);
      case 173 /* MethodDeclaration */:
      case 177 /* SetAccessor */:
      case 176 /* GetAccessor */:
      case 217 /* FunctionExpression */:
      case 261 /* FunctionDeclaration */: {
        enterOther();
        const result = visitEachChild(node, fallbackVisitor, context);
        exitOther();
        return result;
      }
      default:
        return visitEachChild(node, fallbackVisitor, context);
    }
  }
  function fallbackVisitor(node) {
    switch (node.kind) {
      case 169 /* Decorator */:
        return void 0;
      default:
        return visitor(node);
    }
  }
  function modifierVisitor(node) {
    switch (node.kind) {
      case 169 /* Decorator */:
        return void 0;
      default:
        return node;
    }
  }
  function classElementVisitor(node) {
    switch (node.kind) {
      case 175 /* Constructor */:
        return visitConstructorDeclaration(node);
      case 173 /* MethodDeclaration */:
        return visitMethodDeclaration(node);
      case 176 /* GetAccessor */:
        return visitGetAccessorDeclaration(node);
      case 177 /* SetAccessor */:
        return visitSetAccessorDeclaration(node);
      case 171 /* PropertyDeclaration */:
        return visitPropertyDeclaration(node);
      case 174 /* ClassStaticBlockDeclaration */:
        return visitClassStaticBlockDeclaration(node);
      default:
        return visitor(node);
    }
  }
  function namedEvaluationVisitor(node, referencedName) {
    switch (node.kind) {
      case 359 /* PartiallyEmittedExpression */:
        return visitPartiallyEmittedExpression(
          node,
          /*discarded*/
          false,
          referencedName
        );
      case 216 /* ParenthesizedExpression */:
        return visitParenthesizedExpression(
          node,
          /*discarded*/
          false,
          referencedName
        );
      case 230 /* ClassExpression */:
        return visitClassExpression(node, referencedName);
      default:
        return visitor(node);
    }
  }
  function discardedValueVisitor(node) {
    switch (node.kind) {
      case 223 /* PrefixUnaryExpression */:
      case 224 /* PostfixUnaryExpression */:
        return visitPreOrPostfixUnaryExpression(
          node,
          /*discarded*/
          true
        );
      case 225 /* BinaryExpression */:
        return visitBinaryExpression(
          node,
          /*discarded*/
          true
        );
      case 360 /* CommaListExpression */:
        return visitCommaListExpression(
          node,
          /*discarded*/
          true
        );
      case 216 /* ParenthesizedExpression */:
        return visitParenthesizedExpression(
          node,
          /*discarded*/
          true,
          /*referencedName*/
          void 0
        );
      default:
        return visitor(node);
    }
  }
  function getHelperVariableName(node) {
    let declarationName = node.name && isIdentifier(node.name) && !isGeneratedIdentifier(node.name) ? idText(node.name) : node.name && isPrivateIdentifier(node.name) && !isGeneratedIdentifier(node.name) ? idText(node.name).slice(1) : node.name && isStringLiteral(node.name) && isIdentifierText(node.name.text, 99 /* ESNext */) ? node.name.text : isClassLike(node) ? "class" : "member";
    if (isGetAccessor(node))
      declarationName = `get_${declarationName}`;
    if (isSetAccessor(node))
      declarationName = `set_${declarationName}`;
    if (node.name && isPrivateIdentifier(node.name))
      declarationName = `private_${declarationName}`;
    if (isStatic(node))
      declarationName = `static_${declarationName}`;
    return "_" + declarationName;
  }
  function createHelperVariable(node, suffix) {
    return factory2.createUniqueName(`${getHelperVariableName(node)}_${suffix}`, 16 /* Optimistic */ | 8 /* ReservedInNestedScopes */);
  }
  function createLet(name, initializer) {
    return factory2.createVariableStatement(
      /*modifiers*/
      void 0,
      factory2.createVariableDeclarationList([
        factory2.createVariableDeclaration(
          name,
          /*exclamationToken*/
          void 0,
          /*type*/
          void 0,
          initializer
        )
      ], 1 /* Let */)
    );
  }
  function createClassInfo(node) {
    let instanceExtraInitializersName;
    let staticExtraInitializersName;
    let hasStaticInitializers = false;
    let hasNonAmbientInstanceFields = false;
    let hasStaticPrivateClassElements = false;
    for (const member of node.members) {
      if (isNamedClassElement(member) && nodeOrChildIsDecorated(
        /*useLegacyDecorators*/
        false,
        member,
        node
      )) {
        if (hasStaticModifier(member)) {
          staticExtraInitializersName ?? (staticExtraInitializersName = factory2.createUniqueName("_staticExtraInitializers", 16 /* Optimistic */));
        } else {
          instanceExtraInitializersName ?? (instanceExtraInitializersName = factory2.createUniqueName("_instanceExtraInitializers", 16 /* Optimistic */));
        }
      }
      if (isClassStaticBlockDeclaration(member)) {
        hasStaticInitializers = true;
      } else if (isPropertyDeclaration(member)) {
        if (hasStaticModifier(member)) {
          hasStaticInitializers || (hasStaticInitializers = !!member.initializer || hasDecorators(member));
        } else {
          hasNonAmbientInstanceFields || (hasNonAmbientInstanceFields = !isAmbientPropertyDeclaration(member));
        }
      }
      if ((isPrivateIdentifierClassElementDeclaration(member) || isAutoAccessorPropertyDeclaration(member)) && hasStaticModifier(member)) {
        hasStaticPrivateClassElements = true;
      }
      if (staticExtraInitializersName && instanceExtraInitializersName && hasStaticInitializers && hasNonAmbientInstanceFields && hasStaticPrivateClassElements) {
        break;
      }
    }
    return {
      class: node,
      instanceExtraInitializersName,
      staticExtraInitializersName,
      hasStaticInitializers,
      hasNonAmbientInstanceFields,
      hasStaticPrivateClassElements
    };
  }
  function containsLexicalSuperInStaticInitializer(node) {
    for (const member of node.members) {
      if (isClassStaticBlockDeclaration(member) || isPropertyDeclaration(member) && hasStaticModifier(member)) {
        if (member.transformFlags & 134217728 /* ContainsLexicalSuper */) {
          return true;
        }
      }
    }
    return false;
  }
  function transformClassLike(node, className) {
    var _a;
    startLexicalEnvironment();
    const classReference = factory2.getLocalName(
      node,
      /*allowComments*/
      false,
      /*allowSourceMaps*/
      false,
      /*ignoreAssignedName*/
      true
    );
    const classInfo2 = createClassInfo(node);
    const classDefinitionStatements = [];
    let leadingBlockStatements;
    let trailingBlockStatements;
    let syntheticConstructor;
    let heritageClauses;
    let shouldTransformPrivateStaticElementsInClass = false;
    const classDecorators = transformAllDecoratorsOfDeclaration(getAllDecoratorsOfClass(node));
    if (classDecorators) {
      classInfo2.classDecoratorsName = factory2.createUniqueName("_classDecorators", 16 /* Optimistic */);
      classInfo2.classDescriptorName = factory2.createUniqueName("_classDescriptor", 16 /* Optimistic */);
      classInfo2.classExtraInitializersName = factory2.createUniqueName("_classExtraInitializers", 16 /* Optimistic */);
      classInfo2.classThis = factory2.createUniqueName("_classThis", 16 /* Optimistic */);
      classDefinitionStatements.push(
        createLet(classInfo2.classDecoratorsName, factory2.createArrayLiteralExpression(classDecorators)),
        createLet(classInfo2.classDescriptorName),
        createLet(classInfo2.classExtraInitializersName, factory2.createArrayLiteralExpression()),
        createLet(classInfo2.classThis)
      );
      if (classInfo2.hasStaticPrivateClassElements) {
        shouldTransformPrivateStaticElementsInClass = true;
        shouldTransformPrivateStaticElementsInFile = true;
      }
    }
    if (classDecorators && containsLexicalSuperInStaticInitializer(node)) {
      const extendsClause = getHeritageClause(node.heritageClauses, 96 /* ExtendsKeyword */);
      const extendsElement = extendsClause && firstOrUndefined(extendsClause.types);
      const extendsExpression = extendsElement && visitNode(extendsElement.expression, visitor, isExpression);
      if (extendsExpression) {
        classInfo2.classSuper = factory2.createUniqueName("_classSuper", 16 /* Optimistic */);
        const unwrapped = skipOuterExpressions(extendsExpression);
        const safeExtendsExpression = isClassExpression(unwrapped) && !unwrapped.name || isFunctionExpression(unwrapped) && !unwrapped.name || isArrowFunction(unwrapped) ? factory2.createComma(factory2.createNumericLiteral(0), extendsExpression) : extendsExpression;
        classDefinitionStatements.push(createLet(classInfo2.classSuper, safeExtendsExpression));
        const updatedExtendsElement = factory2.updateExpressionWithTypeArguments(
          extendsElement,
          classInfo2.classSuper,
          /*typeArguments*/
          void 0
        );
        const updatedExtendsClause = factory2.updateHeritageClause(extendsClause, [updatedExtendsElement]);
        heritageClauses = factory2.createNodeArray([updatedExtendsClause]);
      }
    } else {
      heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause);
    }
    const renamedClassThis = classInfo2.classThis ?? factory2.createThis();
    const needsSetNameHelper = !((_a = getOriginalNode(node, isClassLike)) == null ? void 0 : _a.name) && (classDecorators || !isStringLiteral(className) || !isEmptyStringLiteral(className));
    if (needsSetNameHelper) {
      const setNameExpr = emitHelpers().createSetFunctionNameHelper(factory2.createThis(), className);
      leadingBlockStatements = append(leadingBlockStatements, factory2.createExpressionStatement(setNameExpr));
    }
    enterClass(classInfo2);
    let members = visitNodes2(node.members, classElementVisitor, isClassElement);
    if (pendingExpressions) {
      let outerThis;
      for (let expression of pendingExpressions) {
        expression = visitNode(expression, function thisVisitor(node2) {
          if (!(node2.transformFlags & 16384 /* ContainsLexicalThis */)) {
            return node2;
          }
          switch (node2.kind) {
            case 110 /* ThisKeyword */:
              if (!outerThis) {
                outerThis = factory2.createUniqueName("_outerThis", 16 /* Optimistic */);
                classDefinitionStatements.unshift(createLet(outerThis, factory2.createThis()));
              }
              return outerThis;
            default:
              return visitEachChild(node2, thisVisitor, context);
          }
        }, isExpression);
        const statement = factory2.createExpressionStatement(expression);
        leadingBlockStatements = append(leadingBlockStatements, statement);
      }
      pendingExpressions = void 0;
    }
    exitClass();
    if (classInfo2.instanceExtraInitializersName && !getFirstConstructorWithBody(node)) {
      const initializerStatements = prepareConstructor(node, classInfo2);
      if (initializerStatements) {
        const extendsClauseElement = getEffectiveBaseTypeNode(node);
        const isDerivedClass = !!(extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== 106 /* NullKeyword */);
        const constructorStatements = [];
        if (isDerivedClass) {
          const spreadArguments = factory2.createSpreadElement(factory2.createIdentifier("arguments"));
          const superCall = factory2.createCallExpression(
            factory2.createSuper(),
            /*typeArguments*/
            void 0,
            [spreadArguments]
          );
          constructorStatements.push(factory2.createExpressionStatement(superCall));
        }
        addRange(constructorStatements, initializerStatements);
        const constructorBody = factory2.createBlock(
          constructorStatements,
          /*multiLine*/
          true
        );
        syntheticConstructor = factory2.createConstructorDeclaration(
          /*modifiers*/
          void 0,
          [],
          constructorBody
        );
      }
    }
    if (classInfo2.staticExtraInitializersName) {
      classDefinitionStatements.push(
        createLet(classInfo2.staticExtraInitializersName, factory2.createArrayLiteralExpression())
      );
    }
    if (classInfo2.instanceExtraInitializersName) {
      classDefinitionStatements.push(
        createLet(classInfo2.instanceExtraInitializersName, factory2.createArrayLiteralExpression())
      );
    }
    if (classInfo2.memberInfos) {
      forEachEntry(classInfo2.memberInfos, (memberInfo, member) => {
        if (isStatic(member)) {
          classDefinitionStatements.push(createLet(memberInfo.memberDecoratorsName));
          if (memberInfo.memberInitializersName) {
            classDefinitionStatements.push(createLet(memberInfo.memberInitializersName, factory2.createArrayLiteralExpression()));
          }
          if (memberInfo.memberDescriptorName) {
            classDefinitionStatements.push(createLet(memberInfo.memberDescriptorName));
          }
        }
      });
    }
    if (classInfo2.memberInfos) {
      forEachEntry(classInfo2.memberInfos, (memberInfo, member) => {
        if (!isStatic(member)) {
          classDefinitionStatements.push(createLet(memberInfo.memberDecoratorsName));
          if (memberInfo.memberInitializersName) {
            classDefinitionStatements.push(createLet(memberInfo.memberInitializersName, factory2.createArrayLiteralExpression()));
          }
          if (memberInfo.memberDescriptorName) {
            classDefinitionStatements.push(createLet(memberInfo.memberDescriptorName));
          }
        }
      });
    }
    leadingBlockStatements = addRange(leadingBlockStatements, classInfo2.staticNonFieldDecorationStatements);
    leadingBlockStatements = addRange(leadingBlockStatements, classInfo2.nonStaticNonFieldDecorationStatements);
    leadingBlockStatements = addRange(leadingBlockStatements, classInfo2.staticFieldDecorationStatements);
    leadingBlockStatements = addRange(leadingBlockStatements, classInfo2.nonStaticFieldDecorationStatements);
    if (classInfo2.classDescriptorName && classInfo2.classDecoratorsName && classInfo2.classExtraInitializersName && classInfo2.classThis) {
      leadingBlockStatements ?? (leadingBlockStatements = []);
      const valueProperty = factory2.createPropertyAssignment("value", factory2.createThis());
      const classDescriptor = factory2.createObjectLiteralExpression([valueProperty]);
      const classDescriptorAssignment = factory2.createAssignment(classInfo2.classDescriptorName, classDescriptor);
      const classNameReference = factory2.createPropertyAccessExpression(factory2.createThis(), "name");
      const esDecorateHelper2 = emitHelpers().createESDecorateHelper(
        factory2.createNull(),
        classDescriptorAssignment,
        classInfo2.classDecoratorsName,
        { kind: "class", name: classNameReference },
        factory2.createNull(),
        classInfo2.classExtraInitializersName
      );
      const esDecorateStatement = factory2.createExpressionStatement(esDecorateHelper2);
      setSourceMapRange(esDecorateStatement, moveRangePastDecorators(node));
      leadingBlockStatements.push(esDecorateStatement);
      const classDescriptorValueReference = factory2.createPropertyAccessExpression(classInfo2.classDescriptorName, "value");
      const classThisAssignment = factory2.createAssignment(classInfo2.classThis, classDescriptorValueReference);
      const classReferenceAssignment = factory2.createAssignment(classReference, classThisAssignment);
      leadingBlockStatements.push(factory2.createExpressionStatement(classReferenceAssignment));
    }
    if (classInfo2.staticExtraInitializersName) {
      const runStaticInitializersHelper = emitHelpers().createRunInitializersHelper(renamedClassThis, classInfo2.staticExtraInitializersName);
      const runStaticInitializersStatement = factory2.createExpressionStatement(runStaticInitializersHelper);
      setSourceMapRange(runStaticInitializersStatement, node.name ?? moveRangePastDecorators(node));
      leadingBlockStatements = append(leadingBlockStatements, runStaticInitializersStatement);
    }
    if (classInfo2.classExtraInitializersName) {
      const runClassInitializersHelper = emitHelpers().createRunInitializersHelper(renamedClassThis, classInfo2.classExtraInitializersName);
      const runClassInitializersStatement = factory2.createExpressionStatement(runClassInitializersHelper);
      setSourceMapRange(runClassInitializersStatement, node.name ?? moveRangePastDecorators(node));
      trailingBlockStatements = append(trailingBlockStatements, runClassInitializersStatement);
    }
    if (leadingBlockStatements && trailingBlockStatements && !classInfo2.hasStaticInitializers) {
      addRange(leadingBlockStatements, trailingBlockStatements);
      trailingBlockStatements = void 0;
    }
    let newMembers = members;
    if (leadingBlockStatements) {
      const leadingStaticBlockBody = factory2.createBlock(
        leadingBlockStatements,
        /*multiLine*/
        true
      );
      const leadingStaticBlock = factory2.createClassStaticBlockDeclaration(leadingStaticBlockBody);
      if (shouldTransformPrivateStaticElementsInClass) {
        setInternalEmitFlags(leadingStaticBlock, 32 /* TransformPrivateStaticElements */);
      }
      newMembers = [leadingStaticBlock, ...newMembers];
    }
    if (syntheticConstructor) {
      newMembers = [...newMembers, syntheticConstructor];
    }
    if (trailingBlockStatements) {
      const trailingStaticBlockBody = factory2.createBlock(
        trailingBlockStatements,
        /*multiLine*/
        true
      );
      const trailingStaticBlock = factory2.createClassStaticBlockDeclaration(trailingStaticBlockBody);
      newMembers = [...newMembers, trailingStaticBlock];
    }
    if (newMembers !== members) {
      members = setTextRange(factory2.createNodeArray(newMembers), members);
    }
    const lexicalEnvironment = endLexicalEnvironment();
    let classExpression;
    if (classDecorators) {
      classExpression = factory2.createClassExpression(
        /*modifiers*/
        void 0,
        /*name*/
        void 0,
        /*typeParameters*/
        void 0,
        heritageClauses,
        members
      );
      const classReferenceDeclaration = factory2.createVariableDeclaration(
        classReference,
        /*exclamationToken*/
        void 0,
        /*type*/
        void 0,
        classExpression
      );
      const classReferenceVarDeclList = factory2.createVariableDeclarationList([classReferenceDeclaration]);
      const returnExpr = classInfo2.classThis ? factory2.createAssignment(classReference, classInfo2.classThis) : classReference;
      classDefinitionStatements.push(
        factory2.createVariableStatement(
          /*modifiers*/
          void 0,
          classReferenceVarDeclList
        ),
        factory2.createReturnStatement(returnExpr)
      );
    } else {
      classExpression = factory2.createClassExpression(
        /*modifiers*/
        void 0,
        node.name,
        /*typeParameters*/
        void 0,
        heritageClauses,
        members
      );
      classDefinitionStatements.push(factory2.createReturnStatement(classExpression));
    }
    if (shouldTransformPrivateStaticElementsInClass) {
      addInternalEmitFlags(classExpression, 32 /* TransformPrivateStaticElements */);
      for (const member of classExpression.members) {
        if ((isPrivateIdentifierClassElementDeclaration(member) || isAutoAccessorPropertyDeclaration(member)) && hasStaticModifier(member)) {
          addInternalEmitFlags(member, 32 /* TransformPrivateStaticElements */);
        }
      }
    }
    setOriginalNode(classExpression, node);
    getOrCreateEmitNode(classExpression).classThis = classInfo2.classThis;
    return factory2.createImmediatelyInvokedArrowFunction(factory2.mergeLexicalEnvironment(classDefinitionStatements, lexicalEnvironment));
  }
  function isDecoratedClassLike(node) {
    return classOrConstructorParameterIsDecorated(
      /*useLegacyDecorators*/
      false,
      node
    ) || childIsDecorated(
      /*useLegacyDecorators*/
      false,
      node
    );
  }
  function visitClassDeclaration(node) {
    if (isDecoratedClassLike(node)) {
      if (hasSyntacticModifier(node, 1 /* Export */) && hasSyntacticModifier(node, 1024 /* Default */)) {
        const originalClass = getOriginalNode(node, isClassLike) ?? node;
        const className = originalClass.name ? factory2.createStringLiteralFromNode(originalClass.name) : factory2.createStringLiteral("default");
        const iife = transformClassLike(node, className);
        const statement = factory2.createExportDefault(iife);
        setOriginalNode(statement, node);
        setCommentRange(statement, getCommentRange(node));
        setSourceMapRange(statement, moveRangePastDecorators(node));
        return statement;
      } else {
        Debug.assertIsDefined(node.name, "A class declaration that is not a default export must have a name.");
        const iife = transformClassLike(node, factory2.createStringLiteralFromNode(node.name));
        const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
        const declName = languageVersion <= 2 /* ES2015 */ ? factory2.getInternalName(
          node,
          /*allowComments*/
          false,
          /*allowSourceMaps*/
          true
        ) : factory2.getLocalName(
          node,
          /*allowComments*/
          false,
          /*allowSourceMaps*/
          true
        );
        const varDecl = factory2.createVariableDeclaration(
          declName,
          /*exclamationToken*/
          void 0,
          /*type*/
          void 0,
          iife
        );
        setOriginalNode(varDecl, node);
        const varDecls = factory2.createVariableDeclarationList([varDecl], 1 /* Let */);
        const statement = factory2.createVariableStatement(modifiers, varDecls);
        setOriginalNode(statement, node);
        setCommentRange(statement, getCommentRange(node));
        return statement;
      }
    } else {
      const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
      const heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause);
      enterClass(
        /*classInfo*/
        void 0
      );
      const members = visitNodes2(node.members, classElementVisitor, isClassElement);
      exitClass();
      return factory2.updateClassDeclaration(
        node,
        modifiers,
        node.name,
        /*typeParameters*/
        void 0,
        heritageClauses,
        members
      );
    }
  }
  function visitClassExpression(node, referencedName) {
    if (isDecoratedClassLike(node)) {
      const className = node.name ? factory2.createStringLiteralFromNode(node.name) : referencedName ?? factory2.createStringLiteral("");
      const iife = transformClassLike(node, className);
      setOriginalNode(iife, node);
      return iife;
    } else {
      const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
      const heritageClauses = visitNodes2(node.heritageClauses, visitor, isHeritageClause);
      enterClass(
        /*classInfo*/
        void 0
      );
      const members = visitNodes2(node.members, classElementVisitor, isClassElement);
      exitClass();
      return factory2.updateClassExpression(
        node,
        modifiers,
        node.name,
        /*typeParameters*/
        void 0,
        heritageClauses,
        members
      );
    }
  }
  function prepareConstructor(_parent, classInfo2) {
    if (classInfo2.instanceExtraInitializersName && !classInfo2.hasNonAmbientInstanceFields) {
      const statements = [];
      statements.push(
        factory2.createExpressionStatement(
          emitHelpers().createRunInitializersHelper(
            factory2.createThis(),
            classInfo2.instanceExtraInitializersName
          )
        )
      );
      return statements;
    }
  }
  function visitConstructorDeclaration(node) {
    enterClassElement(node);
    const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
    const parameters = visitNodes2(node.parameters, visitor, isParameter);
    let body;
    if (node.body && classInfo) {
      const initializerStatements = prepareConstructor(classInfo.class, classInfo);
      if (initializerStatements) {
        const statements = [];
        const nonPrologueStart = factory2.copyPrologue(
          node.body.statements,
          statements,
          /*ensureUseStrict*/
          false,
          visitor
        );
        const superStatementIndex = findSuperStatementIndex(node.body.statements, nonPrologueStart);
        if (superStatementIndex >= 0) {
          addRange(statements, visitNodes2(node.body.statements, visitor, isStatement, nonPrologueStart, superStatementIndex + 1 - nonPrologueStart));
          addRange(statements, initializerStatements);
          addRange(statements, visitNodes2(node.body.statements, visitor, isStatement, superStatementIndex + 1));
        } else {
          addRange(statements, initializerStatements);
          addRange(statements, visitNodes2(node.body.statements, visitor, isStatement));
        }
        body = factory2.createBlock(
          statements,
          /*multiLine*/
          true
        );
        setOriginalNode(body, node.body);
        setTextRange(body, node.body);
      }
    }
    body ?? (body = visitNode(node.body, visitor, isBlock));
    exitClassElement();
    return factory2.updateConstructorDeclaration(node, modifiers, parameters, body);
  }
  function finishClassElement(updated, original) {
    if (updated !== original) {
      setCommentRange(updated, original);
      setSourceMapRange(updated, moveRangePastDecorators(original));
    }
    return updated;
  }
  function partialTransformClassElement(member, useNamedEvaluation, classInfo2, createDescriptor) {
    let referencedName;
    let name;
    let initializersName;
    let thisArg;
    let descriptorName;
    if (!classInfo2) {
      const modifiers2 = visitNodes2(member.modifiers, modifierVisitor, isModifier);
      enterName();
      if (useNamedEvaluation) {
        ({ referencedName, name } = visitReferencedPropertyName(member.name));
      } else {
        name = visitPropertyName(member.name);
      }
      exitName();
      return { modifiers: modifiers2, referencedName, name, initializersName, descriptorName, thisArg };
    }
    const memberDecorators = transformAllDecoratorsOfDeclaration(getAllDecoratorsOfClassElement(
      member,
      classInfo2.class,
      /*useLegacyDecorators*/
      false
    ));
    const modifiers = visitNodes2(member.modifiers, modifierVisitor, isModifier);
    if (memberDecorators) {
      const memberDecoratorsName = createHelperVariable(member, "decorators");
      const memberDecoratorsArray = factory2.createArrayLiteralExpression(memberDecorators);
      const memberDecoratorsAssignment = factory2.createAssignment(memberDecoratorsName, memberDecoratorsArray);
      const memberInfo = { memberDecoratorsName };
      classInfo2.memberInfos ?? (classInfo2.memberInfos = /* @__PURE__ */ new Map());
      classInfo2.memberInfos.set(member, memberInfo);
      pendingExpressions ?? (pendingExpressions = []);
      pendingExpressions.push(memberDecoratorsAssignment);
      const statements = isMethodOrAccessor(member) || isAutoAccessorPropertyDeclaration(member) ? isStatic(member) ? classInfo2.staticNonFieldDecorationStatements ?? (classInfo2.staticNonFieldDecorationStatements = []) : classInfo2.nonStaticNonFieldDecorationStatements ?? (classInfo2.nonStaticNonFieldDecorationStatements = []) : isPropertyDeclaration(member) && !isAutoAccessorPropertyDeclaration(member) ? isStatic(member) ? classInfo2.staticFieldDecorationStatements ?? (classInfo2.staticFieldDecorationStatements = []) : classInfo2.nonStaticFieldDecorationStatements ?? (classInfo2.nonStaticFieldDecorationStatements = []) : Debug.fail();
      const kind = isGetAccessorDeclaration(member) ? "getter" : isSetAccessorDeclaration(member) ? "setter" : isMethodDeclaration(member) ? "method" : isAutoAccessorPropertyDeclaration(member) ? "accessor" : isPropertyDeclaration(member) ? "field" : Debug.fail();
      let propertyName;
      if (isIdentifier(member.name) || isPrivateIdentifier(member.name)) {
        propertyName = { computed: false, name: member.name };
      } else if (isPropertyNameLiteral(member.name)) {
        propertyName = { computed: true, name: factory2.createStringLiteralFromNode(member.name) };
      } else {
        const expression = member.name.expression;
        if (isPropertyNameLiteral(expression) && !isIdentifier(expression)) {
          propertyName = { computed: true, name: factory2.createStringLiteralFromNode(expression) };
        } else {
          enterName();
          ({ referencedName, name } = visitReferencedPropertyName(member.name));
          propertyName = { computed: true, name: referencedName };
          exitName();
        }
      }
      const context2 = {
        kind,
        name: propertyName,
        static: isStatic(member),
        private: isPrivateIdentifier(member.name),
        access: {
          // 15.7.3 CreateDecoratorAccessObject (kind, name)
          // 2. If _kind_ is ~field~, ~method~, ~accessor~, or ~getter~, then ...
          get: isPropertyDeclaration(member) || isGetAccessorDeclaration(member) || isMethodDeclaration(member),
          // 3. If _kind_ is ~field~, ~accessor~, or ~setter~, then ...
          set: isPropertyDeclaration(member) || isSetAccessorDeclaration(member)
        }
      };
      const extraInitializers = isStatic(member) ? classInfo2.staticExtraInitializersName ?? (classInfo2.staticExtraInitializersName = factory2.createUniqueName("_staticExtraInitializers", 16 /* Optimistic */)) : classInfo2.instanceExtraInitializersName ?? (classInfo2.instanceExtraInitializersName = factory2.createUniqueName("_instanceExtraInitializers", 16 /* Optimistic */));
      if (isMethodOrAccessor(member)) {
        let descriptor;
        if (isPrivateIdentifierClassElementDeclaration(member) && createDescriptor) {
          descriptor = createDescriptor(member, visitNodes2(modifiers, (node) => tryCast(node, isAsyncModifier), isModifier));
          memberInfo.memberDescriptorName = descriptorName = createHelperVariable(member, "descriptor");
          descriptor = factory2.createAssignment(descriptorName, descriptor);
        }
        const esDecorateExpression = emitHelpers().createESDecorateHelper(factory2.createThis(), descriptor ?? factory2.createNull(), memberDecoratorsName, context2, factory2.createNull(), extraInitializers);
        const esDecorateStatement = factory2.createExpressionStatement(esDecorateExpression);
        setSourceMapRange(esDecorateStatement, moveRangePastDecorators(member));
        statements.push(esDecorateStatement);
      } else if (isPropertyDeclaration(member)) {
        initializersName = memberInfo.memberInitializersName ?? (memberInfo.memberInitializersName = createHelperVariable(member, "initializers"));
        if (isStatic(member)) {
          thisArg = classInfo2.classThis;
        }
        let descriptor;
        if (isPrivateIdentifierClassElementDeclaration(member) && hasAccessorModifier(member) && createDescriptor) {
          descriptor = createDescriptor(
            member,
            /*modifiers*/
            void 0
          );
          memberInfo.memberDescriptorName = descriptorName = createHelperVariable(member, "descriptor");
          descriptor = factory2.createAssignment(descriptorName, descriptor);
        }
        const esDecorateExpression = emitHelpers().createESDecorateHelper(
          isAutoAccessorPropertyDeclaration(member) ? factory2.createThis() : factory2.createNull(),
          descriptor ?? factory2.createNull(),
          memberDecoratorsName,
          context2,
          initializersName,
          extraInitializers
        );
        const esDecorateStatement = factory2.createExpressionStatement(esDecorateExpression);
        setSourceMapRange(esDecorateStatement, moveRangePastDecorators(member));
        statements.push(esDecorateStatement);
      }
    }
    if (name === void 0) {
      enterName();
      if (useNamedEvaluation) {
        ({ referencedName, name } = visitReferencedPropertyName(member.name));
      } else {
        name = visitPropertyName(member.name);
      }
      exitName();
    }
    if (!some(modifiers) && (isMethodDeclaration(member) || isPropertyDeclaration(member))) {
      setEmitFlags(name, 1024 /* NoLeadingComments */);
    }
    return { modifiers, referencedName, name, initializersName, descriptorName, thisArg };
  }
  function visitMethodDeclaration(node) {
    enterClassElement(node);
    const { modifiers, name, descriptorName } = partialTransformClassElement(
      node,
      /*useNamedEvaluation*/
      false,
      classInfo,
      createMethodDescriptorObject
    );
    if (descriptorName) {
      exitClassElement();
      return finishClassElement(createMethodDescriptorForwarder(modifiers, name, descriptorName), node);
    } else {
      const parameters = visitNodes2(node.parameters, visitor, isParameter);
      const body = visitNode(node.body, visitor, isBlock);
      exitClassElement();
      return finishClassElement(factory2.updateMethodDeclaration(
        node,
        modifiers,
        node.asteriskToken,
        name,
        /*questionToken*/
        void 0,
        /*typeParameters*/
        void 0,
        parameters,
        /*type*/
        void 0,
        body
      ), node);
    }
  }
  function visitGetAccessorDeclaration(node) {
    enterClassElement(node);
    const { modifiers, name, descriptorName } = partialTransformClassElement(
      node,
      /*useNamedEvaluation*/
      false,
      classInfo,
      createGetAccessorDescriptorObject
    );
    if (descriptorName) {
      exitClassElement();
      return finishClassElement(createGetAccessorDescriptorForwarder(modifiers, name, descriptorName), node);
    } else {
      const parameters = visitNodes2(node.parameters, visitor, isParameter);
      const body = visitNode(node.body, visitor, isBlock);
      exitClassElement();
      return finishClassElement(factory2.updateGetAccessorDeclaration(
        node,
        modifiers,
        name,
        parameters,
        /*type*/
        void 0,
        body
      ), node);
    }
  }
  function visitSetAccessorDeclaration(node) {
    enterClassElement(node);
    const { modifiers, name, descriptorName } = partialTransformClassElement(
      node,
      /*useNamedEvaluation*/
      false,
      classInfo,
      createSetAccessorDescriptorObject
    );
    if (descriptorName) {
      exitClassElement();
      return finishClassElement(createSetAccessorDescriptorForwarder(modifiers, name, descriptorName), node);
    } else {
      const parameters = visitNodes2(node.parameters, visitor, isParameter);
      const body = visitNode(node.body, visitor, isBlock);
      exitClassElement();
      return finishClassElement(factory2.updateSetAccessorDeclaration(node, modifiers, name, parameters, body), node);
    }
  }
  function visitClassStaticBlockDeclaration(node) {
    enterClassElement(node);
    if (classInfo)
      classInfo.hasStaticInitializers = true;
    const result = visitEachChild(node, visitor, context);
    exitClassElement();
    return result;
  }
  function visitPropertyDeclaration(node) {
    enterClassElement(node);
    Debug.assert(!isAmbientPropertyDeclaration(node), "Not yet implemented.");
    const useNamedEvaluation = isNamedEvaluation(node, isAnonymousClassNeedingAssignedName);
    const { modifiers, name, referencedName, initializersName, descriptorName, thisArg } = partialTransformClassElement(node, useNamedEvaluation, classInfo, hasAccessorModifier(node) ? createAccessorPropertyDescriptorObject : void 0);
    startLexicalEnvironment();
    let initializer = referencedName ? visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, referencedName), isExpression) : visitNode(node.initializer, visitor, isExpression);
    if (initializersName) {
      initializer = emitHelpers().createRunInitializersHelper(
        thisArg ?? factory2.createThis(),
        initializersName,
        initializer ?? factory2.createVoidZero()
      );
    }
    if (!isStatic(node) && (classInfo == null ? void 0 : classInfo.instanceExtraInitializersName) && !(classInfo == null ? void 0 : classInfo.hasInjectedInstanceInitializers)) {
      classInfo.hasInjectedInstanceInitializers = true;
      initializer ?? (initializer = factory2.createVoidZero());
      initializer = factory2.createParenthesizedExpression(factory2.createComma(
        emitHelpers().createRunInitializersHelper(
          factory2.createThis(),
          classInfo.instanceExtraInitializersName
        ),
        initializer
      ));
    }
    if (isStatic(node) && classInfo && initializer) {
      classInfo.hasStaticInitializers = true;
    }
    const declarations = endLexicalEnvironment();
    if (some(declarations)) {
      initializer = factory2.createImmediatelyInvokedArrowFunction([
        ...declarations,
        factory2.createReturnStatement(initializer)
      ]);
    }
    exitClassElement();
    if (hasAccessorModifier(node) && descriptorName) {
      const commentRange = getCommentRange(node);
      const sourceMapRange = getSourceMapRange(node);
      const name2 = node.name;
      let getterName = name2;
      let setterName = name2;
      if (isComputedPropertyName(name2) && !isSimpleInlineableExpression(name2.expression)) {
        const cacheAssignment = findComputedPropertyNameCacheAssignment(name2);
        if (cacheAssignment) {
          getterName = factory2.updateComputedPropertyName(name2, visitNode(name2.expression, visitor, isExpression));
          setterName = factory2.updateComputedPropertyName(name2, cacheAssignment.left);
        } else {
          const temp = factory2.createTempVariable(hoistVariableDeclaration);
          setSourceMapRange(temp, name2.expression);
          const expression = visitNode(name2.expression, visitor, isExpression);
          const assignment = factory2.createAssignment(temp, expression);
          setSourceMapRange(assignment, name2.expression);
          getterName = factory2.updateComputedPropertyName(name2, assignment);
          setterName = factory2.updateComputedPropertyName(name2, temp);
        }
      }
      const modifiersWithoutAccessor = visitNodes2(modifiers, (node2) => node2.kind !== 129 /* AccessorKeyword */ ? node2 : void 0, isModifier);
      const backingField = createAccessorPropertyBackingField(factory2, node, modifiersWithoutAccessor, initializer);
      setOriginalNode(backingField, node);
      setEmitFlags(backingField, 3072 /* NoComments */);
      setSourceMapRange(backingField, sourceMapRange);
      setSourceMapRange(backingField.name, node.name);
      const getter = createGetAccessorDescriptorForwarder(modifiersWithoutAccessor, getterName, descriptorName);
      setOriginalNode(getter, node);
      setCommentRange(getter, commentRange);
      setSourceMapRange(getter, sourceMapRange);
      const setter = createSetAccessorDescriptorForwarder(modifiersWithoutAccessor, setterName, descriptorName);
      setOriginalNode(setter, node);
      setEmitFlags(setter, 3072 /* NoComments */);
      setSourceMapRange(setter, sourceMapRange);
      return [backingField, getter, setter];
    }
    return finishClassElement(factory2.updatePropertyDeclaration(
      node,
      modifiers,
      name,
      /*questionOrExclamationToken*/
      void 0,
      /*type*/
      void 0,
      initializer
    ), node);
  }
  function visitThisExpression(node) {
    return classThis ?? node;
  }
  function visitCallExpression(node) {
    if (isSuperProperty(node.expression) && classThis) {
      const expression = visitNode(node.expression, visitor, isExpression);
      const argumentsList = visitNodes2(node.arguments, visitor, isExpression);
      const invocation = factory2.createFunctionCallCall(expression, classThis, argumentsList);
      setOriginalNode(invocation, node);
      setTextRange(invocation, node);
      return invocation;
    }
    return visitEachChild(node, visitor, context);
  }
  function visitTaggedTemplateExpression(node) {
    if (isSuperProperty(node.tag) && classThis) {
      const tag = visitNode(node.tag, visitor, isExpression);
      const boundTag = factory2.createFunctionBindCall(tag, classThis, []);
      setOriginalNode(boundTag, node);
      setTextRange(boundTag, node);
      const template = visitNode(node.template, visitor, isTemplateLiteral);
      return factory2.updateTaggedTemplateExpression(
        node,
        boundTag,
        /*typeArguments*/
        void 0,
        template
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitPropertyAccessExpression(node) {
    if (isSuperProperty(node) && isIdentifier(node.name) && classThis && classSuper) {
      const propertyName = factory2.createStringLiteralFromNode(node.name);
      const superProperty = factory2.createReflectGetCall(classSuper, propertyName, classThis);
      setOriginalNode(superProperty, node.expression);
      setTextRange(superProperty, node.expression);
      return superProperty;
    }
    return visitEachChild(node, visitor, context);
  }
  function visitElementAccessExpression(node) {
    if (isSuperProperty(node) && classThis && classSuper) {
      const propertyName = visitNode(node.argumentExpression, visitor, isExpression);
      const superProperty = factory2.createReflectGetCall(classSuper, propertyName, classThis);
      setOriginalNode(superProperty, node.expression);
      setTextRange(superProperty, node.expression);
      return superProperty;
    }
    return visitEachChild(node, visitor, context);
  }
  function visitParameterDeclaration(node) {
    let updated;
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
      const name = visitNode(node.name, visitor, isBindingName);
      const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
      updated = factory2.updateParameterDeclaration(
        node,
        /*modifiers*/
        void 0,
        /*dotDotDotToken*/
        void 0,
        name,
        /*questionToken*/
        void 0,
        /*type*/
        void 0,
        initializer
      );
    } else {
      updated = factory2.updateParameterDeclaration(
        node,
        /*modifiers*/
        void 0,
        node.dotDotDotToken,
        visitNode(node.name, visitor, isBindingName),
        /*questionToken*/
        void 0,
        /*type*/
        void 0,
        visitNode(node.initializer, visitor, isExpression)
      );
    }
    if (updated !== node) {
      setCommentRange(updated, node);
      setTextRange(updated, moveRangePastModifiers(node));
      setSourceMapRange(updated, moveRangePastModifiers(node));
      setEmitFlags(updated.name, 64 /* NoTrailingSourceMap */);
    }
    return updated;
  }
  function isAnonymousClassNeedingAssignedName(node) {
    return isClassExpression(node) && !node.name && isDecoratedClassLike(node);
  }
  function visitForStatement(node) {
    return factory2.updateForStatement(
      node,
      visitNode(node.initializer, discardedValueVisitor, isForInitializer),
      visitNode(node.condition, visitor, isExpression),
      visitNode(node.incrementor, discardedValueVisitor, isExpression),
      visitIterationBody(node.statement, visitor, context)
    );
  }
  function visitExpressionStatement(node) {
    return visitEachChild(node, discardedValueVisitor, context);
  }
  function visitBinaryExpression(node, discarded) {
    if (isDestructuringAssignment(node)) {
      const left = visitAssignmentPattern(node.left);
      const right = visitNode(node.right, visitor, isExpression);
      return factory2.updateBinaryExpression(node, left, node.operatorToken, right);
    }
    if (isAssignmentExpression(node)) {
      if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
        const assignedName = getAssignedNameOfIdentifier(node.left, node.right);
        const left = visitNode(node.left, visitor, isExpression);
        const right = visitNode(node.right, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
        return factory2.updateBinaryExpression(node, left, node.operatorToken, right);
      }
      if (isSuperProperty(node.left) && classThis && classSuper) {
        let setterName = isElementAccessExpression(node.left) ? visitNode(node.left.argumentExpression, visitor, isExpression) : isIdentifier(node.left.name) ? factory2.createStringLiteralFromNode(node.left.name) : void 0;
        if (setterName) {
          let expression = visitNode(node.right, visitor, isExpression);
          if (isCompoundAssignment(node.operatorToken.kind)) {
            let getterName = setterName;
            if (!isSimpleInlineableExpression(setterName)) {
              getterName = factory2.createTempVariable(hoistVariableDeclaration);
              setterName = factory2.createAssignment(getterName, setterName);
            }
            const superPropertyGet = factory2.createReflectGetCall(
              classSuper,
              getterName,
              classThis
            );
            setOriginalNode(superPropertyGet, node.left);
            setTextRange(superPropertyGet, node.left);
            expression = factory2.createBinaryExpression(
              superPropertyGet,
              getNonAssignmentOperatorForCompoundAssignment(node.operatorToken.kind),
              expression
            );
            setTextRange(expression, node);
          }
          const temp = discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration);
          if (temp) {
            expression = factory2.createAssignment(temp, expression);
            setTextRange(temp, node);
          }
          expression = factory2.createReflectSetCall(
            classSuper,
            setterName,
            expression,
            classThis
          );
          setOriginalNode(expression, node);
          setTextRange(expression, node);
          if (temp) {
            expression = factory2.createComma(expression, temp);
            setTextRange(expression, node);
          }
          return expression;
        }
      }
    }
    if (node.operatorToken.kind === 28 /* CommaToken */) {
      const left = visitNode(node.left, discardedValueVisitor, isExpression);
      const right = visitNode(node.right, discarded ? discardedValueVisitor : visitor, isExpression);
      return factory2.updateBinaryExpression(node, left, node.operatorToken, right);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitPreOrPostfixUnaryExpression(node, discarded) {
    if (node.operator === 46 /* PlusPlusToken */ || node.operator === 47 /* MinusMinusToken */) {
      const operand = skipParentheses(node.operand);
      if (isSuperProperty(operand) && classThis && classSuper) {
        let setterName = isElementAccessExpression(operand) ? visitNode(operand.argumentExpression, visitor, isExpression) : isIdentifier(operand.name) ? factory2.createStringLiteralFromNode(operand.name) : void 0;
        if (setterName) {
          let getterName = setterName;
          if (!isSimpleInlineableExpression(setterName)) {
            getterName = factory2.createTempVariable(hoistVariableDeclaration);
            setterName = factory2.createAssignment(getterName, setterName);
          }
          let expression = factory2.createReflectGetCall(classSuper, getterName, classThis);
          setOriginalNode(expression, node);
          setTextRange(expression, node);
          const temp = discarded ? void 0 : factory2.createTempVariable(hoistVariableDeclaration);
          expression = expandPreOrPostfixIncrementOrDecrementExpression(factory2, node, expression, hoistVariableDeclaration, temp);
          expression = factory2.createReflectSetCall(classSuper, setterName, expression, classThis);
          setOriginalNode(expression, node);
          setTextRange(expression, node);
          if (temp) {
            expression = factory2.createComma(expression, temp);
            setTextRange(expression, node);
          }
          return expression;
        }
      }
    }
    return visitEachChild(node, visitor, context);
  }
  function visitCommaListExpression(node, discarded) {
    const elements = discarded ? visitCommaListElements(node.elements, discardedValueVisitor) : visitCommaListElements(node.elements, visitor, discardedValueVisitor);
    return factory2.updateCommaListExpression(node, elements);
  }
  function visitReferencedPropertyName(node) {
    if (isPropertyNameLiteral(node) || isPrivateIdentifier(node)) {
      const referencedName2 = factory2.createStringLiteralFromNode(node);
      const name2 = visitNode(node, visitor, isPropertyName);
      return { referencedName: referencedName2, name: name2 };
    }
    if (isPropertyNameLiteral(node.expression) && !isIdentifier(node.expression)) {
      const referencedName2 = factory2.createStringLiteralFromNode(node.expression);
      const name2 = visitNode(node, visitor, isPropertyName);
      return { referencedName: referencedName2, name: name2 };
    }
    const referencedName = factory2.getGeneratedNameForNode(node);
    hoistVariableDeclaration(referencedName);
    const key = emitHelpers().createPropKeyHelper(visitNode(node.expression, visitor, isExpression));
    const assignment = factory2.createAssignment(referencedName, key);
    const name = factory2.updateComputedPropertyName(node, injectPendingExpressions(assignment));
    return { referencedName, name };
  }
  function visitPropertyName(node) {
    if (isComputedPropertyName(node)) {
      return visitComputedPropertyName(node);
    }
    return visitNode(node, visitor, isPropertyName);
  }
  function visitComputedPropertyName(node) {
    let expression = visitNode(node.expression, visitor, isExpression);
    if (!isSimpleInlineableExpression(expression)) {
      expression = injectPendingExpressions(expression);
    }
    return factory2.updateComputedPropertyName(node, expression);
  }
  function visitPropertyAssignment(node) {
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const { referencedName, name } = visitReferencedPropertyName(node.name);
      const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, referencedName), isExpression);
      return factory2.updatePropertyAssignment(node, name, initializer);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitVariableDeclaration(node) {
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
      const name = visitNode(node.name, visitor, isBindingName);
      const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
      return factory2.updateVariableDeclaration(
        node,
        name,
        /*exclamationToken*/
        void 0,
        /*type*/
        void 0,
        initializer
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitBindingElement(node) {
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const assignedName = getAssignedNameOfIdentifier(node.name, node.initializer);
      const propertyName = visitNode(node.propertyName, visitor, isPropertyName);
      const name = visitNode(node.name, visitor, isBindingName);
      const initializer = visitNode(node.initializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
      return factory2.updateBindingElement(
        node,
        /*dotDotDotToken*/
        void 0,
        propertyName,
        name,
        initializer
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitDestructuringAssignmentTarget(node) {
    if (isObjectLiteralExpression(node) || isArrayLiteralExpression(node)) {
      return visitAssignmentPattern(node);
    }
    if (isSuperProperty(node) && classThis && classSuper) {
      const propertyName = isElementAccessExpression(node) ? visitNode(node.argumentExpression, visitor, isExpression) : isIdentifier(node.name) ? factory2.createStringLiteralFromNode(node.name) : void 0;
      if (propertyName) {
        const paramName = factory2.createTempVariable(
          /*recordTempVariable*/
          void 0
        );
        const expression = factory2.createAssignmentTargetWrapper(
          paramName,
          factory2.createReflectSetCall(
            classSuper,
            propertyName,
            paramName,
            classThis
          )
        );
        setOriginalNode(expression, node);
        setTextRange(expression, node);
        return expression;
      }
    }
    return visitEachChild(node, visitor, context);
  }
  function visitAssignmentElement(node) {
    if (isAssignmentExpression(
      node,
      /*excludeCompoundAssignment*/
      true
    )) {
      const assignmentTarget = visitDestructuringAssignmentTarget(node.left);
      let initializer;
      if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
        const assignedName = getAssignedNameOfIdentifier(node.left, node.right);
        initializer = visitNode(node.right, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
      } else {
        initializer = visitNode(node.right, visitor, isExpression);
      }
      return factory2.updateBinaryExpression(node, assignmentTarget, node.operatorToken, initializer);
    } else {
      return visitDestructuringAssignmentTarget(node);
    }
  }
  function visitAssignmentRestElement(node) {
    if (isLeftHandSideExpression(node.expression)) {
      const expression = visitDestructuringAssignmentTarget(node.expression);
      return factory2.updateSpreadElement(node, expression);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitArrayAssignmentElement(node) {
    Debug.assertNode(node, isArrayBindingOrAssignmentElement);
    if (isSpreadElement(node))
      return visitAssignmentRestElement(node);
    if (!isOmittedExpression(node))
      return visitAssignmentElement(node);
    return visitEachChild(node, visitor, context);
  }
  function visitAssignmentProperty(node) {
    const name = visitNode(node.name, visitor, isPropertyName);
    if (isAssignmentExpression(
      node.initializer,
      /*excludeCompoundAssignment*/
      true
    )) {
      const assignmentElement = visitAssignmentElement(node.initializer);
      return factory2.updatePropertyAssignment(node, name, assignmentElement);
    }
    if (isLeftHandSideExpression(node.initializer)) {
      const assignmentElement = visitDestructuringAssignmentTarget(node.initializer);
      return factory2.updatePropertyAssignment(node, name, assignmentElement);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitShorthandAssignmentProperty(node) {
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const assignedName = getAssignedNameOfIdentifier(node.name, node.objectAssignmentInitializer);
      const name = visitNode(node.name, visitor, isIdentifier);
      const objectAssignmentInitializer = visitNode(node.objectAssignmentInitializer, (node2) => namedEvaluationVisitor(node2, assignedName), isExpression);
      return factory2.updateShorthandPropertyAssignment(node, name, objectAssignmentInitializer);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitAssignmentRestProperty(node) {
    if (isLeftHandSideExpression(node.expression)) {
      const expression = visitDestructuringAssignmentTarget(node.expression);
      return factory2.updateSpreadAssignment(node, expression);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitObjectAssignmentElement(node) {
    Debug.assertNode(node, isObjectBindingOrAssignmentElement);
    if (isSpreadAssignment(node))
      return visitAssignmentRestProperty(node);
    if (isShorthandPropertyAssignment(node))
      return visitShorthandAssignmentProperty(node);
    if (isPropertyAssignment(node))
      return visitAssignmentProperty(node);
    return visitEachChild(node, visitor, context);
  }
  function visitAssignmentPattern(node) {
    if (isArrayLiteralExpression(node)) {
      const elements = visitNodes2(node.elements, visitArrayAssignmentElement, isExpression);
      return factory2.updateArrayLiteralExpression(node, elements);
    } else {
      const properties = visitNodes2(node.properties, visitObjectAssignmentElement, isObjectLiteralElementLike);
      return factory2.updateObjectLiteralExpression(node, properties);
    }
  }
  function visitExportAssignment(node) {
    if (isNamedEvaluation(node, isAnonymousClassNeedingAssignedName)) {
      const referencedName = factory2.createStringLiteral(node.isExportEquals ? "" : "default");
      const modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
      const expression = visitNode(node.expression, (node2) => namedEvaluationVisitor(node2, referencedName), isExpression);
      return factory2.updateExportAssignment(node, modifiers, expression);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitParenthesizedExpression(node, discarded, referencedName) {
    const visitorFunc = discarded ? discardedValueVisitor : referencedName ? (node2) => namedEvaluationVisitor(node2, referencedName) : visitor;
    const expression = visitNode(node.expression, visitorFunc, isExpression);
    return factory2.updateParenthesizedExpression(node, expression);
  }
  function visitPartiallyEmittedExpression(node, discarded, referencedName) {
    const visitorFunc = discarded ? discardedValueVisitor : referencedName ? (node2) => namedEvaluationVisitor(node2, referencedName) : visitor;
    const expression = visitNode(node.expression, visitorFunc, isExpression);
    return factory2.updatePartiallyEmittedExpression(node, expression);
  }
  function injectPendingExpressions(expression) {
    if (some(pendingExpressions)) {
      if (isParenthesizedExpression(expression)) {
        pendingExpressions.push(expression.expression);
        expression = factory2.updateParenthesizedExpression(expression, factory2.inlineExpressions(pendingExpressions));
      } else {
        pendingExpressions.push(expression);
        expression = factory2.inlineExpressions(pendingExpressions);
      }
      pendingExpressions = void 0;
    }
    return expression;
  }
  function transformAllDecoratorsOfDeclaration(allDecorators) {
    if (!allDecorators) {
      return void 0;
    }
    const decoratorExpressions = [];
    addRange(decoratorExpressions, map(allDecorators.decorators, transformDecorator));
    return decoratorExpressions;
  }
  function transformDecorator(decorator) {
    const expression = visitNode(decorator.expression, visitor, isExpression);
    setEmitFlags(expression, 3072 /* NoComments */);
    return expression;
  }
  function createDescriptorMethod(original, name, modifiers, asteriskToken, kind, parameters, body) {
    const func = factory2.createFunctionExpression(
      modifiers,
      asteriskToken,
      /*name*/
      void 0,
      /*typeParameters*/
      void 0,
      parameters,
      /*type*/
      void 0,
      body ?? factory2.createBlock([])
    );
    setOriginalNode(func, original);
    setSourceMapRange(func, moveRangePastDecorators(original));
    setEmitFlags(func, 3072 /* NoComments */);
    const prefix = kind === "get" || kind === "set" ? kind : void 0;
    const functionName = factory2.createStringLiteralFromNode(
      name,
      /*isSingleQuote*/
      void 0
    );
    const namedFunction = emitHelpers().createSetFunctionNameHelper(func, functionName, prefix);
    const method = factory2.createPropertyAssignment(factory2.createIdentifier(kind), namedFunction);
    setOriginalNode(method, original);
    setSourceMapRange(method, moveRangePastDecorators(original));
    setEmitFlags(method, 3072 /* NoComments */);
    return method;
  }
  function createMethodDescriptorObject(node, modifiers) {
    return factory2.createObjectLiteralExpression([
      createDescriptorMethod(
        node,
        node.name,
        modifiers,
        node.asteriskToken,
        "value",
        visitNodes2(node.parameters, visitor, isParameter),
        visitNode(node.body, visitor, isBlock)
      )
    ]);
  }
  function createGetAccessorDescriptorObject(node, modifiers) {
    return factory2.createObjectLiteralExpression([
      createDescriptorMethod(
        node,
        node.name,
        modifiers,
        /*asteriskToken*/
        void 0,
        "get",
        [],
        visitNode(node.body, visitor, isBlock)
      )
    ]);
  }
  function createSetAccessorDescriptorObject(node, modifiers) {
    return factory2.createObjectLiteralExpression([
      createDescriptorMethod(
        node,
        node.name,
        modifiers,
        /*asteriskToken*/
        void 0,
        "set",
        visitNodes2(node.parameters, visitor, isParameter),
        visitNode(node.body, visitor, isBlock)
      )
    ]);
  }
  function createAccessorPropertyDescriptorObject(node, modifiers) {
    return factory2.createObjectLiteralExpression([
      createDescriptorMethod(
        node,
        node.name,
        modifiers,
        /*asteriskToken*/
        void 0,
        "get",
        [],
        factory2.createBlock([
          factory2.createReturnStatement(
            factory2.createPropertyAccessExpression(
              factory2.createThis(),
              factory2.getGeneratedPrivateNameForNode(node.name)
            )
          )
        ])
      ),
      createDescriptorMethod(
        node,
        node.name,
        modifiers,
        /*asteriskToken*/
        void 0,
        "set",
        [factory2.createParameterDeclaration(
          /*modifiers*/
          void 0,
          /*dotDotDotToken*/
          void 0,
          "value"
        )],
        factory2.createBlock([
          factory2.createExpressionStatement(
            factory2.createAssignment(
              factory2.createPropertyAccessExpression(
                factory2.createThis(),
                factory2.getGeneratedPrivateNameForNode(node.name)
              ),
              factory2.createIdentifier("value")
            )
          )
        ])
      )
    ]);
  }
  function createMethodDescriptorForwarder(modifiers, name, descriptorName) {
    modifiers = visitNodes2(modifiers, (node) => isStaticModifier(node) ? node : void 0, isModifier);
    return factory2.createGetAccessorDeclaration(
      modifiers,
      name,
      [],
      /*type*/
      void 0,
      factory2.createBlock([
        factory2.createReturnStatement(
          factory2.createPropertyAccessExpression(
            descriptorName,
            factory2.createIdentifier("value")
          )
        )
      ])
    );
  }
  function createGetAccessorDescriptorForwarder(modifiers, name, descriptorName) {
    modifiers = visitNodes2(modifiers, (node) => isStaticModifier(node) ? node : void 0, isModifier);
    return factory2.createGetAccessorDeclaration(
      modifiers,
      name,
      [],
      /*type*/
      void 0,
      factory2.createBlock([
        factory2.createReturnStatement(
          factory2.createFunctionCallCall(
            factory2.createPropertyAccessExpression(
              descriptorName,
              factory2.createIdentifier("get")
            ),
            factory2.createThis(),
            []
          )
        )
      ])
    );
  }
  function createSetAccessorDescriptorForwarder(modifiers, name, descriptorName) {
    modifiers = visitNodes2(modifiers, (node) => isStaticModifier(node) ? node : void 0, isModifier);
    return factory2.createSetAccessorDeclaration(
      modifiers,
      name,
      [factory2.createParameterDeclaration(
        /*modifiers*/
        void 0,
        /*dotDotDotToken*/
        void 0,
        "value"
      )],
      factory2.createBlock([
        factory2.createReturnStatement(
          factory2.createFunctionCallCall(
            factory2.createPropertyAccessExpression(
              descriptorName,
              factory2.createIdentifier("set")
            ),
            factory2.createThis(),
            [factory2.createIdentifier("value")]
          )
        )
      ])
    );
  }
  function getAssignedNameOfIdentifier(name, initializer) {
    const originalClass = getOriginalNode(initializer, isClassLike);
    return originalClass && !originalClass.name && hasSyntacticModifier(originalClass, 1024 /* Default */) ? factory2.createStringLiteral("default") : factory2.createStringLiteralFromNode(name);
  }
}

// src/compiler/transformers/es2017.ts
function transformES2017(context) {
  const {
    factory: factory2,
    getEmitHelperFactory: emitHelpers,
    resumeLexicalEnvironment,
    endLexicalEnvironment,
    hoistVariableDeclaration
  } = context;
  const resolver = context.getEmitResolver();
  const compilerOptions = context.getCompilerOptions();
  const languageVersion = getEmitScriptTarget(compilerOptions);
  let enabledSubstitutions;
  let enclosingSuperContainerFlags = 0;
  let enclosingFunctionParameterNames;
  let capturedSuperProperties;
  let hasSuperElementAccess;
  const substitutedSuperAccessors = [];
  let contextFlags = 0 /* None */;
  const previousOnEmitNode = context.onEmitNode;
  const previousOnSubstituteNode = context.onSubstituteNode;
  context.onEmitNode = onEmitNode;
  context.onSubstituteNode = onSubstituteNode;
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    if (node.isDeclarationFile) {
      return node;
    }
    setContextFlag(1 /* NonTopLevel */, false);
    setContextFlag(2 /* HasLexicalThis */, !isEffectiveStrictModeSourceFile(node, compilerOptions));
    const visited = visitEachChild(node, visitor, context);
    addEmitHelpers(visited, context.readEmitHelpers());
    return visited;
  }
  function setContextFlag(flag, val) {
    contextFlags = val ? contextFlags | flag : contextFlags & ~flag;
  }
  function inContext(flags) {
    return (contextFlags & flags) !== 0;
  }
  function inTopLevelContext() {
    return !inContext(1 /* NonTopLevel */);
  }
  function inHasLexicalThisContext() {
    return inContext(2 /* HasLexicalThis */);
  }
  function doWithContext(flags, cb, value) {
    const contextFlagsToSet = flags & ~contextFlags;
    if (contextFlagsToSet) {
      setContextFlag(
        contextFlagsToSet,
        /*val*/
        true
      );
      const result = cb(value);
      setContextFlag(
        contextFlagsToSet,
        /*val*/
        false
      );
      return result;
    }
    return cb(value);
  }
  function visitDefault(node) {
    return visitEachChild(node, visitor, context);
  }
  function visitor(node) {
    if ((node.transformFlags & 256 /* ContainsES2017 */) === 0) {
      return node;
    }
    switch (node.kind) {
      case 134 /* AsyncKeyword */:
        return void 0;
      case 222 /* AwaitExpression */:
        return visitAwaitExpression(node);
      case 173 /* MethodDeclaration */:
        return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitMethodDeclaration, node);
      case 261 /* FunctionDeclaration */:
        return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitFunctionDeclaration, node);
      case 217 /* FunctionExpression */:
        return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitFunctionExpression, node);
      case 218 /* ArrowFunction */:
        return doWithContext(1 /* NonTopLevel */, visitArrowFunction, node);
      case 210 /* PropertyAccessExpression */:
        if (capturedSuperProperties && isPropertyAccessExpression(node) && node.expression.kind === 108 /* SuperKeyword */) {
          capturedSuperProperties.add(node.name.escapedText);
        }
        return visitEachChild(node, visitor, context);
      case 211 /* ElementAccessExpression */:
        if (capturedSuperProperties && node.expression.kind === 108 /* SuperKeyword */) {
          hasSuperElementAccess = true;
        }
        return visitEachChild(node, visitor, context);
      case 176 /* GetAccessor */:
        return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitGetAccessorDeclaration, node);
      case 177 /* SetAccessor */:
        return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitSetAccessorDeclaration, node);
      case 175 /* Constructor */:
        return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitConstructorDeclaration, node);
      case 262 /* ClassDeclaration */:
      case 230 /* ClassExpression */:
        return doWithContext(1 /* NonTopLevel */ | 2 /* HasLexicalThis */, visitDefault, node);
      default:
        return visitEachChild(node, visitor, context);
    }
  }
  function asyncBodyVisitor(node) {
    if (isNodeWithPossibleHoistedDeclaration(node)) {
      switch (node.kind) {
        case 242 /* VariableStatement */:
          return visitVariableStatementInAsyncBody(node);
        case 247 /* ForStatement */:
          return visitForStatementInAsyncBody(node);
        case 248 /* ForInStatement */:
          return visitForInStatementInAsyncBody(node);
        case 249 /* ForOfStatement */:
          return visitForOfStatementInAsyncBody(node);
        case 298 /* CatchClause */:
          return visitCatchClauseInAsyncBody(node);
        case 240 /* Block */:
        case 254 /* SwitchStatement */:
        case 268 /* CaseBlock */:
        case 295 /* CaseClause */:
        case 296 /* DefaultClause */:
        case 257 /* TryStatement */:
        case 245 /* DoStatement */:
        case 246 /* WhileStatement */:
        case 244 /* IfStatement */:
        case 253 /* WithStatement */:
        case 255 /* LabeledStatement */:
          return visitEachChild(node, asyncBodyVisitor, context);
        default:
          return Debug.assertNever(node, "Unhandled node.");
      }
    }
    return visitor(node);
  }
  function visitCatchClauseInAsyncBody(node) {
    const catchClauseNames = /* @__PURE__ */ new Set();
    recordDeclarationName(node.variableDeclaration, catchClauseNames);
    let catchClauseUnshadowedNames;
    catchClauseNames.forEach((_, escapedName) => {
      if (enclosingFunctionParameterNames.has(escapedName)) {
        if (!catchClauseUnshadowedNames) {
          catchClauseUnshadowedNames = new Set(enclosingFunctionParameterNames);
        }
        catchClauseUnshadowedNames.delete(escapedName);
      }
    });
    if (catchClauseUnshadowedNames) {
      const savedEnclosingFunctionParameterNames = enclosingFunctionParameterNames;
      enclosingFunctionParameterNames = catchClauseUnshadowedNames;
      const result = visitEachChild(node, asyncBodyVisitor, context);
      enclosingFunctionParameterNames = savedEnclosingFunctionParameterNames;
      return result;
    } else {
      return visitEachChild(node, asyncBodyVisitor, context);
    }
  }
  function visitVariableStatementInAsyncBody(node) {
    if (isVariableDeclarationListWithCollidingName(node.declarationList)) {
      const expression = visitVariableDeclarationListWithCollidingNames(
        node.declarationList,
        /*hasReceiver*/
        false
      );
      return expression ? factory2.createExpressionStatement(expression) : void 0;
    }
    return visitEachChild(node, visitor, context);
  }
  function visitForInStatementInAsyncBody(node) {
    return factory2.updateForInStatement(
      node,
      isVariableDeclarationListWithCollidingName(node.initializer) ? visitVariableDeclarationListWithCollidingNames(
        node.initializer,
        /*hasReceiver*/
        true
      ) : Debug.checkDefined(visitNode(node.initializer, visitor, isForInitializer)),
      Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
      visitIterationBody(node.statement, asyncBodyVisitor, context)
    );
  }
  function visitForOfStatementInAsyncBody(node) {
    return factory2.updateForOfStatement(
      node,
      visitNode(node.awaitModifier, visitor, isAwaitKeyword),
      isVariableDeclarationListWithCollidingName(node.initializer) ? visitVariableDeclarationListWithCollidingNames(
        node.initializer,
        /*hasReceiver*/
        true
      ) : Debug.checkDefined(visitNode(node.initializer, visitor, isForInitializer)),
      Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
      visitIterationBody(node.statement, asyncBodyVisitor, context)
    );
  }
  function visitForStatementInAsyncBody(node) {
    const initializer = node.initializer;
    return factory2.updateForStatement(
      node,
      isVariableDeclarationListWithCollidingName(initializer) ? visitVariableDeclarationListWithCollidingNames(
        initializer,
        /*hasReceiver*/
        false
      ) : visitNode(node.initializer, visitor, isForInitializer),
      visitNode(node.condition, visitor, isExpression),
      visitNode(node.incrementor, visitor, isExpression),
      visitIterationBody(node.statement, asyncBodyVisitor, context)
    );
  }
  function visitAwaitExpression(node) {
    if (inTopLevelContext()) {
      return visitEachChild(node, visitor, context);
    }
    return setOriginalNode(
      setTextRange(
        factory2.createYieldExpression(
          /*asteriskToken*/
          void 0,
          visitNode(node.expression, visitor, isExpression)
        ),
        node
      ),
      node
    );
  }
  function visitConstructorDeclaration(node) {
    return factory2.updateConstructorDeclaration(
      node,
      visitNodes2(node.modifiers, visitor, isModifier),
      visitParameterList(node.parameters, visitor, context),
      transformMethodBody(node)
    );
  }
  function visitMethodDeclaration(node) {
    return factory2.updateMethodDeclaration(
      node,
      visitNodes2(node.modifiers, visitor, isModifierLike),
      node.asteriskToken,
      node.name,
      /*questionToken*/
      void 0,
      /*typeParameters*/
      void 0,
      visitParameterList(node.parameters, visitor, context),
      /*type*/
      void 0,
      getFunctionFlags(node) & 2 /* Async */ ? transformAsyncFunctionBody(node) : transformMethodBody(node)
    );
  }
  function visitGetAccessorDeclaration(node) {
    return factory2.updateGetAccessorDeclaration(
      node,
      visitNodes2(node.modifiers, visitor, isModifierLike),
      node.name,
      visitParameterList(node.parameters, visitor, context),
      /*type*/
      void 0,
      transformMethodBody(node)
    );
  }
  function visitSetAccessorDeclaration(node) {
    return factory2.updateSetAccessorDeclaration(
      node,
      visitNodes2(node.modifiers, visitor, isModifierLike),
      node.name,
      visitParameterList(node.parameters, visitor, context),
      transformMethodBody(node)
    );
  }
  function visitFunctionDeclaration(node) {
    return factory2.updateFunctionDeclaration(
      node,
      visitNodes2(node.modifiers, visitor, isModifierLike),
      node.asteriskToken,
      node.name,
      /*typeParameters*/
      void 0,
      visitParameterList(node.parameters, visitor, context),
      /*type*/
      void 0,
      getFunctionFlags(node) & 2 /* Async */ ? transformAsyncFunctionBody(node) : visitFunctionBody(node.body, visitor, context)
    );
  }
  function visitFunctionExpression(node) {
    return factory2.updateFunctionExpression(
      node,
      visitNodes2(node.modifiers, visitor, isModifier),
      node.asteriskToken,
      node.name,
      /*typeParameters*/
      void 0,
      visitParameterList(node.parameters, visitor, context),
      /*type*/
      void 0,
      getFunctionFlags(node) & 2 /* Async */ ? transformAsyncFunctionBody(node) : visitFunctionBody(node.body, visitor, context)
    );
  }
  function visitArrowFunction(node) {
    return factory2.updateArrowFunction(
      node,
      visitNodes2(node.modifiers, visitor, isModifier),
      /*typeParameters*/
      void 0,
      visitParameterList(node.parameters, visitor, context),
      /*type*/
      void 0,
      node.equalsGreaterThanToken,
      getFunctionFlags(node) & 2 /* Async */ ? transformAsyncFunctionBody(node) : visitFunctionBody(node.body, visitor, context)
    );
  }
  function recordDeclarationName({ name }, names) {
    if (isIdentifier(name)) {
      names.add(name.escapedText);
    } else {
      for (const element of name.elements) {
        if (!isOmittedExpression(element)) {
          recordDeclarationName(element, names);
        }
      }
    }
  }
  function isVariableDeclarationListWithCollidingName(node) {
    return !!node && isVariableDeclarationList(node) && !(node.flags & 3 /* BlockScoped */) && node.declarations.some(collidesWithParameterName);
  }
  function visitVariableDeclarationListWithCollidingNames(node, hasReceiver) {
    hoistVariableDeclarationList(node);
    const variables = getInitializedVariables(node);
    if (variables.length === 0) {
      if (hasReceiver) {
        return visitNode(factory2.converters.convertToAssignmentElementTarget(node.declarations[0].name), visitor, isExpression);
      }
      return void 0;
    }
    return factory2.inlineExpressions(map(variables, transformInitializedVariable));
  }
  function hoistVariableDeclarationList(node) {
    forEach(node.declarations, hoistVariable);
  }
  function hoistVariable({ name }) {
    if (isIdentifier(name)) {
      hoistVariableDeclaration(name);
    } else {
      for (const element of name.elements) {
        if (!isOmittedExpression(element)) {
          hoistVariable(element);
        }
      }
    }
  }
  function transformInitializedVariable(node) {
    const converted = setSourceMapRange(
      factory2.createAssignment(
        factory2.converters.convertToAssignmentElementTarget(node.name),
        node.initializer
      ),
      node
    );
    return Debug.checkDefined(visitNode(converted, visitor, isExpression));
  }
  function collidesWithParameterName({ name }) {
    if (isIdentifier(name)) {
      return enclosingFunctionParameterNames.has(name.escapedText);
    } else {
      for (const element of name.elements) {
        if (!isOmittedExpression(element) && collidesWithParameterName(element)) {
          return true;
        }
      }
    }
    return false;
  }
  function transformMethodBody(node) {
    Debug.assertIsDefined(node.body);
    const savedCapturedSuperProperties = capturedSuperProperties;
    const savedHasSuperElementAccess = hasSuperElementAccess;
    capturedSuperProperties = /* @__PURE__ */ new Set();
    hasSuperElementAccess = false;
    let updated = visitFunctionBody(node.body, visitor, context);
    const originalMethod = getOriginalNode(node, isFunctionLikeDeclaration);
    const emitSuperHelpers = languageVersion >= 2 /* ES2015 */ && resolver.getNodeCheckFlags(node) & (256 /* MethodWithSuperPropertyAssignmentInAsync */ | 128 /* MethodWithSuperPropertyAccessInAsync */) && (getFunctionFlags(originalMethod) & 3 /* AsyncGenerator */) !== 3 /* AsyncGenerator */;
    if (emitSuperHelpers) {
      enableSubstitutionForAsyncMethodsWithSuper();
      if (capturedSuperProperties.size) {
        const variableStatement = createSuperAccessVariableStatement(factory2, resolver, node, capturedSuperProperties);
        substitutedSuperAccessors[getNodeId(variableStatement)] = true;
        const statements = updated.statements.slice();
        insertStatementsAfterStandardPrologue(statements, [variableStatement]);
        updated = factory2.updateBlock(updated, statements);
      }
      if (hasSuperElementAccess) {
        if (resolver.getNodeCheckFlags(node) & 256 /* MethodWithSuperPropertyAssignmentInAsync */) {
          addEmitHelper(updated, advancedAsyncSuperHelper);
        } else if (resolver.getNodeCheckFlags(node) & 128 /* MethodWithSuperPropertyAccessInAsync */) {
          addEmitHelper(updated, asyncSuperHelper);
        }
      }
    }
    capturedSuperProperties = savedCapturedSuperProperties;
    hasSuperElementAccess = savedHasSuperElementAccess;
    return updated;
  }
  function transformAsyncFunctionBody(node) {
    resumeLexicalEnvironment();
    const original = getOriginalNode(node, isFunctionLike);
    const nodeType = original.type;
    const promiseConstructor = languageVersion < 2 /* ES2015 */ ? getPromiseConstructor(nodeType) : void 0;
    const isArrowFunction2 = node.kind === 218 /* ArrowFunction */;
    const hasLexicalArguments = (resolver.getNodeCheckFlags(node) & 512 /* CaptureArguments */) !== 0;
    const savedEnclosingFunctionParameterNames = enclosingFunctionParameterNames;
    enclosingFunctionParameterNames = /* @__PURE__ */ new Set();
    for (const parameter of node.parameters) {
      recordDeclarationName(parameter, enclosingFunctionParameterNames);
    }
    const savedCapturedSuperProperties = capturedSuperProperties;
    const savedHasSuperElementAccess = hasSuperElementAccess;
    if (!isArrowFunction2) {
      capturedSuperProperties = /* @__PURE__ */ new Set();
      hasSuperElementAccess = false;
    }
    let result;
    if (!isArrowFunction2) {
      const statements = [];
      const statementOffset = factory2.copyPrologue(
        node.body.statements,
        statements,
        /*ensureUseStrict*/
        false,
        visitor
      );
      statements.push(
        factory2.createReturnStatement(
          emitHelpers().createAwaiterHelper(
            inHasLexicalThisContext(),
            hasLexicalArguments,
            promiseConstructor,
            transformAsyncFunctionBodyWorker(node.body, statementOffset)
          )
        )
      );
      insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
      const emitSuperHelpers = languageVersion >= 2 /* ES2015 */ && resolver.getNodeCheckFlags(node) & (256 /* MethodWithSuperPropertyAssignmentInAsync */ | 128 /* MethodWithSuperPropertyAccessInAsync */);
      if (emitSuperHelpers) {
        enableSubstitutionForAsyncMethodsWithSuper();
        if (capturedSuperProperties.size) {
          const variableStatement = createSuperAccessVariableStatement(factory2, resolver, node, capturedSuperProperties);
          substitutedSuperAccessors[getNodeId(variableStatement)] = true;
          insertStatementsAfterStandardPrologue(statements, [variableStatement]);
        }
      }
      const block = factory2.createBlock(
        statements,
        /*multiLine*/
        true
      );
      setTextRange(block, node.body);
      if (emitSuperHelpers && hasSuperElementAccess) {
        if (resolver.getNodeCheckFlags(node) & 256 /* MethodWithSuperPropertyAssignmentInAsync */) {
          addEmitHelper(block, advancedAsyncSuperHelper);
        } else if (resolver.getNodeCheckFlags(node) & 128 /* MethodWithSuperPropertyAccessInAsync */) {
          addEmitHelper(block, asyncSuperHelper);
        }
      }
      result = block;
    } else {
      const expression = emitHelpers().createAwaiterHelper(
        inHasLexicalThisContext(),
        hasLexicalArguments,
        promiseConstructor,
        transformAsyncFunctionBodyWorker(node.body)
      );
      const declarations = endLexicalEnvironment();
      if (some(declarations)) {
        const block = factory2.converters.convertToFunctionBlock(expression);
        result = factory2.updateBlock(block, setTextRange(factory2.createNodeArray(concatenate(declarations, block.statements)), block.statements));
      } else {
        result = expression;
      }
    }
    enclosingFunctionParameterNames = savedEnclosingFunctionParameterNames;
    if (!isArrowFunction2) {
      capturedSuperProperties = savedCapturedSuperProperties;
      hasSuperElementAccess = savedHasSuperElementAccess;
    }
    return result;
  }
  function transformAsyncFunctionBodyWorker(body, start) {
    if (isBlock(body)) {
      return factory2.updateBlock(body, visitNodes2(body.statements, asyncBodyVisitor, isStatement, start));
    } else {
      return factory2.converters.convertToFunctionBlock(Debug.checkDefined(visitNode(body, asyncBodyVisitor, isConciseBody)));
    }
  }
  function getPromiseConstructor(type) {
    const typeName = type && getEntityNameFromTypeNode(type);
    if (typeName && isEntityName(typeName)) {
      const serializationKind = resolver.getTypeReferenceSerializationKind(typeName);
      if (serializationKind === 1 /* TypeWithConstructSignatureAndValue */ || serializationKind === 0 /* Unknown */) {
        return typeName;
      }
    }
    return void 0;
  }
  function enableSubstitutionForAsyncMethodsWithSuper() {
    if ((enabledSubstitutions & 1 /* AsyncMethodsWithSuper */) === 0) {
      enabledSubstitutions |= 1 /* AsyncMethodsWithSuper */;
      context.enableSubstitution(212 /* CallExpression */);
      context.enableSubstitution(210 /* PropertyAccessExpression */);
      context.enableSubstitution(211 /* ElementAccessExpression */);
      context.enableEmitNotification(262 /* ClassDeclaration */);
      context.enableEmitNotification(173 /* MethodDeclaration */);
      context.enableEmitNotification(176 /* GetAccessor */);
      context.enableEmitNotification(177 /* SetAccessor */);
      context.enableEmitNotification(175 /* Constructor */);
      context.enableEmitNotification(242 /* VariableStatement */);
    }
  }
  function onEmitNode(hint, node, emitCallback) {
    if (enabledSubstitutions & 1 /* AsyncMethodsWithSuper */ && isSuperContainer(node)) {
      const superContainerFlags = resolver.getNodeCheckFlags(node) & (128 /* MethodWithSuperPropertyAccessInAsync */ | 256 /* MethodWithSuperPropertyAssignmentInAsync */);
      if (superContainerFlags !== enclosingSuperContainerFlags) {
        const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags;
        enclosingSuperContainerFlags = superContainerFlags;
        previousOnEmitNode(hint, node, emitCallback);
        enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags;
        return;
      }
    } else if (enabledSubstitutions && substitutedSuperAccessors[getNodeId(node)]) {
      const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags;
      enclosingSuperContainerFlags = 0;
      previousOnEmitNode(hint, node, emitCallback);
      enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags;
      return;
    }
    previousOnEmitNode(hint, node, emitCallback);
  }
  function onSubstituteNode(hint, node) {
    node = previousOnSubstituteNode(hint, node);
    if (hint === 1 /* Expression */ && enclosingSuperContainerFlags) {
      return substituteExpression(node);
    }
    return node;
  }
  function substituteExpression(node) {
    switch (node.kind) {
      case 210 /* PropertyAccessExpression */:
        return substitutePropertyAccessExpression(node);
      case 211 /* ElementAccessExpression */:
        return substituteElementAccessExpression(node);
      case 212 /* CallExpression */:
        return substituteCallExpression(node);
    }
    return node;
  }
  function substitutePropertyAccessExpression(node) {
    if (node.expression.kind === 108 /* SuperKeyword */) {
      return setTextRange(
        factory2.createPropertyAccessExpression(
          factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */),
          node.name
        ),
        node
      );
    }
    return node;
  }
  function substituteElementAccessExpression(node) {
    if (node.expression.kind === 108 /* SuperKeyword */) {
      return createSuperElementAccessInAsyncMethod(
        node.argumentExpression,
        node
      );
    }
    return node;
  }
  function substituteCallExpression(node) {
    const expression = node.expression;
    if (isSuperProperty(expression)) {
      const argumentExpression = isPropertyAccessExpression(expression) ? substitutePropertyAccessExpression(expression) : substituteElementAccessExpression(expression);
      return factory2.createCallExpression(
        factory2.createPropertyAccessExpression(argumentExpression, "call"),
        /*typeArguments*/
        void 0,
        [
          factory2.createThis(),
          ...node.arguments
        ]
      );
    }
    return node;
  }
  function isSuperContainer(node) {
    const kind = node.kind;
    return kind === 262 /* ClassDeclaration */ || kind === 175 /* Constructor */ || kind === 173 /* MethodDeclaration */ || kind === 176 /* GetAccessor */ || kind === 177 /* SetAccessor */;
  }
  function createSuperElementAccessInAsyncMethod(argumentExpression, location) {
    if (enclosingSuperContainerFlags & 256 /* MethodWithSuperPropertyAssignmentInAsync */) {
      return setTextRange(
        factory2.createPropertyAccessExpression(
          factory2.createCallExpression(
            factory2.createUniqueName("_superIndex", 16 /* Optimistic */ | 32 /* FileLevel */),
            /*typeArguments*/
            void 0,
            [argumentExpression]
          ),
          "value"
        ),
        location
      );
    } else {
      return setTextRange(
        factory2.createCallExpression(
          factory2.createUniqueName("_superIndex", 16 /* Optimistic */ | 32 /* FileLevel */),
          /*typeArguments*/
          void 0,
          [argumentExpression]
        ),
        location
      );
    }
  }
}
function createSuperAccessVariableStatement(factory2, resolver, node, names) {
  const hasBinding = (resolver.getNodeCheckFlags(node) & 256 /* MethodWithSuperPropertyAssignmentInAsync */) !== 0;
  const accessors = [];
  names.forEach((_, key) => {
    const name = unescapeLeadingUnderscores(key);
    const getterAndSetter = [];
    getterAndSetter.push(factory2.createPropertyAssignment(
      "get",
      factory2.createArrowFunction(
        /*modifiers*/
        void 0,
        /*typeParameters*/
        void 0,
        /* parameters */
        [],
        /*type*/
        void 0,
        /*equalsGreaterThanToken*/
        void 0,
        setEmitFlags(
          factory2.createPropertyAccessExpression(
            setEmitFlags(
              factory2.createSuper(),
              8 /* NoSubstitution */
            ),
            name
          ),
          8 /* NoSubstitution */
        )
      )
    ));
    if (hasBinding) {
      getterAndSetter.push(
        factory2.createPropertyAssignment(
          "set",
          factory2.createArrowFunction(
            /*modifiers*/
            void 0,
            /*typeParameters*/
            void 0,
            /* parameters */
            [
              factory2.createParameterDeclaration(
                /*modifiers*/
                void 0,
                /*dotDotDotToken*/
                void 0,
                "v",
                /*questionToken*/
                void 0,
                /*type*/
                void 0,
                /*initializer*/
                void 0
              )
            ],
            /*type*/
            void 0,
            /*equalsGreaterThanToken*/
            void 0,
            factory2.createAssignment(
              setEmitFlags(
                factory2.createPropertyAccessExpression(
                  setEmitFlags(
                    factory2.createSuper(),
                    8 /* NoSubstitution */
                  ),
                  name
                ),
                8 /* NoSubstitution */
              ),
              factory2.createIdentifier("v")
            )
          )
        )
      );
    }
    accessors.push(
      factory2.createPropertyAssignment(
        name,
        factory2.createObjectLiteralExpression(getterAndSetter)
      )
    );
  });
  return factory2.createVariableStatement(
    /*modifiers*/
    void 0,
    factory2.createVariableDeclarationList(
      [
        factory2.createVariableDeclaration(
          factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */),
          /*exclamationToken*/
          void 0,
          /*type*/
          void 0,
          factory2.createCallExpression(
            factory2.createPropertyAccessExpression(
              factory2.createIdentifier("Object"),
              "create"
            ),
            /*typeArguments*/
            void 0,
            [
              factory2.createNull(),
              factory2.createObjectLiteralExpression(
                accessors,
                /*multiLine*/
                true
              )
            ]
          )
        )
      ],
      2 /* Const */
    )
  );
}

// src/compiler/transformers/es2018.ts
function transformES2018(context) {
  const {
    factory: factory2,
    getEmitHelperFactory: emitHelpers,
    resumeLexicalEnvironment,
    endLexicalEnvironment,
    hoistVariableDeclaration
  } = context;
  const resolver = context.getEmitResolver();
  const compilerOptions = context.getCompilerOptions();
  const languageVersion = getEmitScriptTarget(compilerOptions);
  const previousOnEmitNode = context.onEmitNode;
  context.onEmitNode = onEmitNode;
  const previousOnSubstituteNode = context.onSubstituteNode;
  context.onSubstituteNode = onSubstituteNode;
  let exportedVariableStatement = false;
  let enabledSubstitutions;
  let enclosingFunctionFlags;
  let parametersWithPrecedingObjectRestOrSpread;
  let enclosingSuperContainerFlags = 0;
  let hierarchyFacts = 0;
  let currentSourceFile;
  let taggedTemplateStringDeclarations;
  let capturedSuperProperties;
  let hasSuperElementAccess;
  const substitutedSuperAccessors = [];
  return chainBundle(context, transformSourceFile);
  function affectsSubtree(excludeFacts, includeFacts) {
    return hierarchyFacts !== (hierarchyFacts & ~excludeFacts | includeFacts);
  }
  function enterSubtree(excludeFacts, includeFacts) {
    const ancestorFacts = hierarchyFacts;
    hierarchyFacts = (hierarchyFacts & ~excludeFacts | includeFacts) & 3 /* AncestorFactsMask */;
    return ancestorFacts;
  }
  function exitSubtree(ancestorFacts) {
    hierarchyFacts = ancestorFacts;
  }
  function recordTaggedTemplateString(temp) {
    taggedTemplateStringDeclarations = append(
      taggedTemplateStringDeclarations,
      factory2.createVariableDeclaration(temp)
    );
  }
  function transformSourceFile(node) {
    if (node.isDeclarationFile) {
      return node;
    }
    currentSourceFile = node;
    const visited = visitSourceFile(node);
    addEmitHelpers(visited, context.readEmitHelpers());
    currentSourceFile = void 0;
    taggedTemplateStringDeclarations = void 0;
    return visited;
  }
  function visitor(node) {
    return visitorWorker(
      node,
      /*expressionResultIsUnused*/
      false
    );
  }
  function visitorWithUnusedExpressionResult(node) {
    return visitorWorker(
      node,
      /*expressionResultIsUnused*/
      true
    );
  }
  function visitorNoAsyncModifier(node) {
    if (node.kind === 134 /* AsyncKeyword */) {
      return void 0;
    }
    return node;
  }
  function doWithHierarchyFacts(cb, value, excludeFacts, includeFacts) {
    if (affectsSubtree(excludeFacts, includeFacts)) {
      const ancestorFacts = enterSubtree(excludeFacts, includeFacts);
      const result = cb(value);
      exitSubtree(ancestorFacts);
      return result;
    }
    return cb(value);
  }
  function visitDefault(node) {
    return visitEachChild(node, visitor, context);
  }
  function visitorWorker(node, expressionResultIsUnused2) {
    if ((node.transformFlags & 128 /* ContainsES2018 */) === 0) {
      return node;
    }
    switch (node.kind) {
      case 222 /* AwaitExpression */:
        return visitAwaitExpression(node);
      case 228 /* YieldExpression */:
        return visitYieldExpression(node);
      case 252 /* ReturnStatement */:
        return visitReturnStatement(node);
      case 255 /* LabeledStatement */:
        return visitLabeledStatement(node);
      case 209 /* ObjectLiteralExpression */:
        return visitObjectLiteralExpression(node);
      case 225 /* BinaryExpression */:
        return visitBinaryExpression(node, expressionResultIsUnused2);
      case 360 /* CommaListExpression */:
        return visitCommaListExpression(node, expressionResultIsUnused2);
      case 298 /* CatchClause */:
        return visitCatchClause(node);
      case 242 /* VariableStatement */:
        return visitVariableStatement(node);
      case 259 /* VariableDeclaration */:
        return visitVariableDeclaration(node);
      case 245 /* DoStatement */:
      case 246 /* WhileStatement */:
      case 248 /* ForInStatement */:
        return doWithHierarchyFacts(
          visitDefault,
          node,
          0 /* IterationStatementExcludes */,
          2 /* IterationStatementIncludes */
        );
      case 249 /* ForOfStatement */:
        return visitForOfStatement(
          node,
          /*outermostLabeledStatement*/
          void 0
        );
      case 247 /* ForStatement */:
        return doWithHierarchyFacts(
          visitForStatement,
          node,
          0 /* IterationStatementExcludes */,
          2 /* IterationStatementIncludes */
        );
      case 221 /* VoidExpression */:
        return visitVoidExpression(node);
      case 175 /* Constructor */:
        return doWithHierarchyFacts(
          visitConstructorDeclaration,
          node,
          2 /* ClassOrFunctionExcludes */,
          1 /* ClassOrFunctionIncludes */
        );
      case 173 /* MethodDeclaration */:
        return doWithHierarchyFacts(
          visitMethodDeclaration,
          node,
          2 /* ClassOrFunctionExcludes */,
          1 /* ClassOrFunctionIncludes */
        );
      case 176 /* GetAccessor */:
        return doWithHierarchyFacts(
          visitGetAccessorDeclaration,
          node,
          2 /* ClassOrFunctionExcludes */,
          1 /* ClassOrFunctionIncludes */
        );
      case 177 /* SetAccessor */:
        return doWithHierarchyFacts(
          visitSetAccessorDeclaration,
          node,
          2 /* ClassOrFunctionExcludes */,
          1 /* ClassOrFunctionIncludes */
        );
      case 261 /* FunctionDeclaration */:
        return doWithHierarchyFacts(
          visitFunctionDeclaration,
          node,
          2 /* ClassOrFunctionExcludes */,
          1 /* ClassOrFunctionIncludes */
        );
      case 217 /* FunctionExpression */:
        return doWithHierarchyFacts(
          visitFunctionExpression,
          node,
          2 /* ClassOrFunctionExcludes */,
          1 /* ClassOrFunctionIncludes */
        );
      case 218 /* ArrowFunction */:
        return doWithHierarchyFacts(
          visitArrowFunction,
          node,
          2 /* ArrowFunctionExcludes */,
          0 /* ArrowFunctionIncludes */
        );
      case 168 /* Parameter */:
        return visitParameter(node);
      case 243 /* ExpressionStatement */:
        return visitExpressionStatement(node);
      case 216 /* ParenthesizedExpression */:
        return visitParenthesizedExpression(node, expressionResultIsUnused2);
      case 214 /* TaggedTemplateExpression */:
        return visitTaggedTemplateExpression(node);
      case 210 /* PropertyAccessExpression */:
        if (capturedSuperProperties && isPropertyAccessExpression(node) && node.expression.kind === 108 /* SuperKeyword */) {
          capturedSuperProperties.add(node.name.escapedText);
        }
        return visitEachChild(node, visitor, context);
      case 211 /* ElementAccessExpression */:
        if (capturedSuperProperties && node.expression.kind === 108 /* SuperKeyword */) {
          hasSuperElementAccess = true;
        }
        return visitEachChild(node, visitor, context);
      case 262 /* ClassDeclaration */:
      case 230 /* ClassExpression */:
        return doWithHierarchyFacts(
          visitDefault,
          node,
          2 /* ClassOrFunctionExcludes */,
          1 /* ClassOrFunctionIncludes */
        );
      default:
        return visitEachChild(node, visitor, context);
    }
  }
  function visitAwaitExpression(node) {
    if (enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */) {
      return setOriginalNode(
        setTextRange(
          factory2.createYieldExpression(
            /*asteriskToken*/
            void 0,
            emitHelpers().createAwaitHelper(visitNode(node.expression, visitor, isExpression))
          ),
          /*location*/
          node
        ),
        node
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitYieldExpression(node) {
    if (enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */) {
      if (node.asteriskToken) {
        const expression = visitNode(Debug.checkDefined(node.expression), visitor, isExpression);
        return setOriginalNode(
          setTextRange(
            factory2.createYieldExpression(
              /*asteriskToken*/
              void 0,
              emitHelpers().createAwaitHelper(
                factory2.updateYieldExpression(
                  node,
                  node.asteriskToken,
                  setTextRange(
                    emitHelpers().createAsyncDelegatorHelper(
                      setTextRange(
                        emitHelpers().createAsyncValuesHelper(expression),
                        expression
                      )
                    ),
                    expression
                  )
                )
              )
            ),
            node
          ),
          node
        );
      }
      return setOriginalNode(
        setTextRange(
          factory2.createYieldExpression(
            /*asteriskToken*/
            void 0,
            createDownlevelAwait(
              node.expression ? visitNode(node.expression, visitor, isExpression) : factory2.createVoidZero()
            )
          ),
          node
        ),
        node
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitReturnStatement(node) {
    if (enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */) {
      return factory2.updateReturnStatement(node, createDownlevelAwait(
        node.expression ? visitNode(node.expression, visitor, isExpression) : factory2.createVoidZero()
      ));
    }
    return visitEachChild(node, visitor, context);
  }
  function visitLabeledStatement(node) {
    if (enclosingFunctionFlags & 2 /* Async */) {
      const statement = unwrapInnermostStatementOfLabel(node);
      if (statement.kind === 249 /* ForOfStatement */ && statement.awaitModifier) {
        return visitForOfStatement(statement, node);
      }
      return factory2.restoreEnclosingLabel(visitNode(statement, visitor, isStatement, factory2.liftToBlock), node);
    }
    return visitEachChild(node, visitor, context);
  }
  function chunkObjectLiteralElements(elements) {
    let chunkObject;
    const objects = [];
    for (const e of elements) {
      if (e.kind === 304 /* SpreadAssignment */) {
        if (chunkObject) {
          objects.push(factory2.createObjectLiteralExpression(chunkObject));
          chunkObject = void 0;
        }
        const target = e.expression;
        objects.push(visitNode(target, visitor, isExpression));
      } else {
        chunkObject = append(chunkObject, e.kind === 302 /* PropertyAssignment */ ? factory2.createPropertyAssignment(e.name, visitNode(e.initializer, visitor, isExpression)) : visitNode(e, visitor, isObjectLiteralElementLike));
      }
    }
    if (chunkObject) {
      objects.push(factory2.createObjectLiteralExpression(chunkObject));
    }
    return objects;
  }
  function visitObjectLiteralExpression(node) {
    if (node.transformFlags & 65536 /* ContainsObjectRestOrSpread */) {
      const objects = chunkObjectLiteralElements(node.properties);
      if (objects.length && objects[0].kind !== 209 /* ObjectLiteralExpression */) {
        objects.unshift(factory2.createObjectLiteralExpression());
      }
      let expression = objects[0];
      if (objects.length > 1) {
        for (let i = 1; i < objects.length; i++) {
          expression = emitHelpers().createAssignHelper([expression, objects[i]]);
        }
        return expression;
      } else {
        return emitHelpers().createAssignHelper(objects);
      }
    }
    return visitEachChild(node, visitor, context);
  }
  function visitExpressionStatement(node) {
    return visitEachChild(node, visitorWithUnusedExpressionResult, context);
  }
  function visitParenthesizedExpression(node, expressionResultIsUnused2) {
    return visitEachChild(node, expressionResultIsUnused2 ? visitorWithUnusedExpressionResult : visitor, context);
  }
  function visitSourceFile(node) {
    const ancestorFacts = enterSubtree(
      2 /* SourceFileExcludes */,
      isEffectiveStrictModeSourceFile(node, compilerOptions) ? 0 /* StrictModeSourceFileIncludes */ : 1 /* SourceFileIncludes */
    );
    exportedVariableStatement = false;
    const visited = visitEachChild(node, visitor, context);
    const statement = concatenate(visited.statements, taggedTemplateStringDeclarations && [
      factory2.createVariableStatement(
        /*modifiers*/
        void 0,
        factory2.createVariableDeclarationList(taggedTemplateStringDeclarations)
      )
    ]);
    const result = factory2.updateSourceFile(visited, setTextRange(factory2.createNodeArray(statement), node.statements));
    exitSubtree(ancestorFacts);
    return result;
  }
  function visitTaggedTemplateExpression(node) {
    return processTaggedTemplateExpression(
      context,
      node,
      visitor,
      currentSourceFile,
      recordTaggedTemplateString,
      0 /* LiftRestriction */
    );
  }
  function visitBinaryExpression(node, expressionResultIsUnused2) {
    if (isDestructuringAssignment(node) && containsObjectRestOrSpread(node.left)) {
      return flattenDestructuringAssignment(
        node,
        visitor,
        context,
        1 /* ObjectRest */,
        !expressionResultIsUnused2
      );
    }
    if (node.operatorToken.kind === 28 /* CommaToken */) {
      return factory2.updateBinaryExpression(
        node,
        visitNode(node.left, visitorWithUnusedExpressionResult, isExpression),
        node.operatorToken,
        visitNode(node.right, expressionResultIsUnused2 ? visitorWithUnusedExpressionResult : visitor, isExpression)
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitCommaListExpression(node, expressionResultIsUnused2) {
    if (expressionResultIsUnused2) {
      return visitEachChild(node, visitorWithUnusedExpressionResult, context);
    }
    let result;
    for (let i = 0; i < node.elements.length; i++) {
      const element = node.elements[i];
      const visited = visitNode(element, i < node.elements.length - 1 ? visitorWithUnusedExpressionResult : visitor, isExpression);
      if (result || visited !== element) {
        result || (result = node.elements.slice(0, i));
        result.push(visited);
      }
    }
    const elements = result ? setTextRange(factory2.createNodeArray(result), node.elements) : node.elements;
    return factory2.updateCommaListExpression(node, elements);
  }
  function visitCatchClause(node) {
    if (node.variableDeclaration && isBindingPattern(node.variableDeclaration.name) && node.variableDeclaration.name.transformFlags & 65536 /* ContainsObjectRestOrSpread */) {
      const name = factory2.getGeneratedNameForNode(node.variableDeclaration.name);
      const updatedDecl = factory2.updateVariableDeclaration(
        node.variableDeclaration,
        node.variableDeclaration.name,
        /*exclamationToken*/
        void 0,
        /*type*/
        void 0,
        name
      );
      const visitedBindings = flattenDestructuringBinding(updatedDecl, visitor, context, 1 /* ObjectRest */);
      let block = visitNode(node.block, visitor, isBlock);
      if (some(visitedBindings)) {
        block = factory2.updateBlock(block, [
          factory2.createVariableStatement(
            /*modifiers*/
            void 0,
            visitedBindings
          ),
          ...block.statements
        ]);
      }
      return factory2.updateCatchClause(
        node,
        factory2.updateVariableDeclaration(
          node.variableDeclaration,
          name,
          /*exclamationToken*/
          void 0,
          /*type*/
          void 0,
          /*initializer*/
          void 0
        ),
        block
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitVariableStatement(node) {
    if (hasSyntacticModifier(node, 1 /* Export */)) {
      const savedExportedVariableStatement = exportedVariableStatement;
      exportedVariableStatement = true;
      const visited = visitEachChild(node, visitor, context);
      exportedVariableStatement = savedExportedVariableStatement;
      return visited;
    }
    return visitEachChild(node, visitor, context);
  }
  function visitVariableDeclaration(node) {
    if (exportedVariableStatement) {
      const savedExportedVariableStatement = exportedVariableStatement;
      exportedVariableStatement = false;
      const visited = visitVariableDeclarationWorker(
        node,
        /*exportedVariableStatement*/
        true
      );
      exportedVariableStatement = savedExportedVariableStatement;
      return visited;
    }
    return visitVariableDeclarationWorker(
      node,
      /*exportedVariableStatement*/
      false
    );
  }
  function visitVariableDeclarationWorker(node, exportedVariableStatement2) {
    if (isBindingPattern(node.name) && node.name.transformFlags & 65536 /* ContainsObjectRestOrSpread */) {
      return flattenDestructuringBinding(
        node,
        visitor,
        context,
        1 /* ObjectRest */,
        /*rval*/
        void 0,
        exportedVariableStatement2
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitForStatement(node) {
    return factory2.updateForStatement(
      node,
      visitNode(node.initializer, visitorWithUnusedExpressionResult, isForInitializer),
      visitNode(node.condition, visitor, isExpression),
      visitNode(node.incrementor, visitorWithUnusedExpressionResult, isExpression),
      visitIterationBody(node.statement, visitor, context)
    );
  }
  function visitVoidExpression(node) {
    return visitEachChild(node, visitorWithUnusedExpressionResult, context);
  }
  function visitForOfStatement(node, outermostLabeledStatement) {
    const ancestorFacts = enterSubtree(0 /* IterationStatementExcludes */, 2 /* IterationStatementIncludes */);
    if (node.initializer.transformFlags & 65536 /* ContainsObjectRestOrSpread */ || isAssignmentPattern(node.initializer) && containsObjectRestOrSpread(node.initializer)) {
      node = transformForOfStatementWithObjectRest(node);
    }
    const result = node.awaitModifier ? transformForAwaitOfStatement(node, outermostLabeledStatement, ancestorFacts) : factory2.restoreEnclosingLabel(visitEachChild(node, visitor, context), outermostLabeledStatement);
    exitSubtree(ancestorFacts);
    return result;
  }
  function transformForOfStatementWithObjectRest(node) {
    const initializerWithoutParens = skipParentheses(node.initializer);
    if (isVariableDeclarationList(initializerWithoutParens) || isAssignmentPattern(initializerWithoutParens)) {
      let bodyLocation;
      let statementsLocation;
      const temp = factory2.createTempVariable(
        /*recordTempVariable*/
        void 0
      );
      const statements = [createForOfBindingStatement(factory2, initializerWithoutParens, temp)];
      if (isBlock(node.statement)) {
        addRange(statements, node.statement.statements);
        bodyLocation = node.statement;
        statementsLocation = node.statement.statements;
      } else if (node.statement) {
        append(statements, node.statement);
        bodyLocation = node.statement;
        statementsLocation = node.statement;
      }
      return factory2.updateForOfStatement(
        node,
        node.awaitModifier,
        setTextRange(
          factory2.createVariableDeclarationList(
            [
              setTextRange(factory2.createVariableDeclaration(temp), node.initializer)
            ],
            1 /* Let */
          ),
          node.initializer
        ),
        node.expression,
        setTextRange(
          factory2.createBlock(
            setTextRange(factory2.createNodeArray(statements), statementsLocation),
            /*multiLine*/
            true
          ),
          bodyLocation
        )
      );
    }
    return node;
  }
  function convertForOfStatementHead(node, boundValue, nonUserCode) {
    const value = factory2.createTempVariable(hoistVariableDeclaration);
    const iteratorValueExpression = factory2.createAssignment(value, boundValue);
    const iteratorValueStatement = factory2.createExpressionStatement(iteratorValueExpression);
    setSourceMapRange(iteratorValueStatement, node.expression);
    const exitNonUserCodeExpression = factory2.createAssignment(nonUserCode, factory2.createFalse());
    const exitNonUserCodeStatement = factory2.createExpressionStatement(exitNonUserCodeExpression);
    setSourceMapRange(exitNonUserCodeStatement, node.expression);
    const statements = [iteratorValueStatement, exitNonUserCodeStatement];
    const binding = createForOfBindingStatement(factory2, node.initializer, value);
    statements.push(visitNode(binding, visitor, isStatement));
    let bodyLocation;
    let statementsLocation;
    const statement = visitIterationBody(node.statement, visitor, context);
    if (isBlock(statement)) {
      addRange(statements, statement.statements);
      bodyLocation = statement;
      statementsLocation = statement.statements;
    } else {
      statements.push(statement);
    }
    return setTextRange(
      factory2.createBlock(
        setTextRange(factory2.createNodeArray(statements), statementsLocation),
        /*multiLine*/
        true
      ),
      bodyLocation
    );
  }
  function createDownlevelAwait(expression) {
    return enclosingFunctionFlags & 1 /* Generator */ ? factory2.createYieldExpression(
      /*asteriskToken*/
      void 0,
      emitHelpers().createAwaitHelper(expression)
    ) : factory2.createAwaitExpression(expression);
  }
  function transformForAwaitOfStatement(node, outermostLabeledStatement, ancestorFacts) {
    const expression = visitNode(node.expression, visitor, isExpression);
    const iterator = isIdentifier(expression) ? factory2.getGeneratedNameForNode(expression) : factory2.createTempVariable(
      /*recordTempVariable*/
      void 0
    );
    const result = isIdentifier(expression) ? factory2.getGeneratedNameForNode(iterator) : factory2.createTempVariable(
      /*recordTempVariable*/
      void 0
    );
    const nonUserCode = factory2.createTempVariable(
      /*recordTempVariable*/
      void 0
    );
    const done = factory2.createTempVariable(hoistVariableDeclaration);
    const errorRecord = factory2.createUniqueName("e");
    const catchVariable = factory2.getGeneratedNameForNode(errorRecord);
    const returnMethod = factory2.createTempVariable(
      /*recordTempVariable*/
      void 0
    );
    const callValues = setTextRange(emitHelpers().createAsyncValuesHelper(expression), node.expression);
    const callNext = factory2.createCallExpression(
      factory2.createPropertyAccessExpression(iterator, "next"),
      /*typeArguments*/
      void 0,
      []
    );
    const getDone = factory2.createPropertyAccessExpression(result, "done");
    const getValue = factory2.createPropertyAccessExpression(result, "value");
    const callReturn = factory2.createFunctionCallCall(returnMethod, iterator, []);
    hoistVariableDeclaration(errorRecord);
    hoistVariableDeclaration(returnMethod);
    const initializer = ancestorFacts & 2 /* IterationContainer */ ? factory2.inlineExpressions([factory2.createAssignment(errorRecord, factory2.createVoidZero()), callValues]) : callValues;
    const forStatement = setEmitFlags(
      setTextRange(
        factory2.createForStatement(
          /*initializer*/
          setEmitFlags(
            setTextRange(
              factory2.createVariableDeclarationList([
                factory2.createVariableDeclaration(
                  nonUserCode,
                  /*exclamationToken*/
                  void 0,
                  /*type*/
                  void 0,
                  factory2.createTrue()
                ),
                setTextRange(factory2.createVariableDeclaration(
                  iterator,
                  /*exclamationToken*/
                  void 0,
                  /*type*/
                  void 0,
                  initializer
                ), node.expression),
                factory2.createVariableDeclaration(result)
              ]),
              node.expression
            ),
            4194304 /* NoHoisting */
          ),
          /*condition*/
          factory2.inlineExpressions([
            factory2.createAssignment(result, createDownlevelAwait(callNext)),
            factory2.createAssignment(done, getDone),
            factory2.createLogicalNot(done)
          ]),
          /*incrementor*/
          factory2.createAssignment(nonUserCode, factory2.createTrue()),
          /*statement*/
          convertForOfStatementHead(node, getValue, nonUserCode)
        ),
        /*location*/
        node
      ),
      512 /* NoTokenTrailingSourceMaps */
    );
    setOriginalNode(forStatement, node);
    return factory2.createTryStatement(
      factory2.createBlock([
        factory2.restoreEnclosingLabel(
          forStatement,
          outermostLabeledStatement
        )
      ]),
      factory2.createCatchClause(
        factory2.createVariableDeclaration(catchVariable),
        setEmitFlags(
          factory2.createBlock([
            factory2.createExpressionStatement(
              factory2.createAssignment(
                errorRecord,
                factory2.createObjectLiteralExpression([
                  factory2.createPropertyAssignment("error", catchVariable)
                ])
              )
            )
          ]),
          1 /* SingleLine */
        )
      ),
      factory2.createBlock([
        factory2.createTryStatement(
          /*tryBlock*/
          factory2.createBlock([
            setEmitFlags(
              factory2.createIfStatement(
                factory2.createLogicalAnd(
                  factory2.createLogicalAnd(
                    factory2.createLogicalNot(nonUserCode),
                    factory2.createLogicalNot(done)
                  ),
                  factory2.createAssignment(
                    returnMethod,
                    factory2.createPropertyAccessExpression(iterator, "return")
                  )
                ),
                factory2.createExpressionStatement(createDownlevelAwait(callReturn))
              ),
              1 /* SingleLine */
            )
          ]),
          /*catchClause*/
          void 0,
          /*finallyBlock*/
          setEmitFlags(
            factory2.createBlock([
              setEmitFlags(
                factory2.createIfStatement(
                  errorRecord,
                  factory2.createThrowStatement(
                    factory2.createPropertyAccessExpression(errorRecord, "error")
                  )
                ),
                1 /* SingleLine */
              )
            ]),
            1 /* SingleLine */
          )
        )
      ])
    );
  }
  function parameterVisitor(node) {
    Debug.assertNode(node, isParameter);
    return visitParameter(node);
  }
  function visitParameter(node) {
    if (parametersWithPrecedingObjectRestOrSpread == null ? void 0 : parametersWithPrecedingObjectRestOrSpread.has(node)) {
      return factory2.updateParameterDeclaration(
        node,
        /*modifiers*/
        void 0,
        node.dotDotDotToken,
        isBindingPattern(node.name) ? factory2.getGeneratedNameForNode(node) : node.name,
        /*questionToken*/
        void 0,
        /*type*/
        void 0,
        /*initializer*/
        void 0
      );
    }
    if (node.transformFlags & 65536 /* ContainsObjectRestOrSpread */) {
      return factory2.updateParameterDeclaration(
        node,
        /*modifiers*/
        void 0,
        node.dotDotDotToken,
        factory2.getGeneratedNameForNode(node),
        /*questionToken*/
        void 0,
        /*type*/
        void 0,
        visitNode(node.initializer, visitor, isExpression)
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function collectParametersWithPrecedingObjectRestOrSpread(node) {
    let parameters;
    for (const parameter of node.parameters) {
      if (parameters) {
        parameters.add(parameter);
      } else if (parameter.transformFlags & 65536 /* ContainsObjectRestOrSpread */) {
        parameters = /* @__PURE__ */ new Set();
      }
    }
    return parameters;
  }
  function visitConstructorDeclaration(node) {
    const savedEnclosingFunctionFlags = enclosingFunctionFlags;
    const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
    enclosingFunctionFlags = getFunctionFlags(node);
    parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
    const updated = factory2.updateConstructorDeclaration(
      node,
      node.modifiers,
      visitParameterList(node.parameters, parameterVisitor, context),
      transformFunctionBody(node)
    );
    enclosingFunctionFlags = savedEnclosingFunctionFlags;
    parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
    return updated;
  }
  function visitGetAccessorDeclaration(node) {
    const savedEnclosingFunctionFlags = enclosingFunctionFlags;
    const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
    enclosingFunctionFlags = getFunctionFlags(node);
    parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
    const updated = factory2.updateGetAccessorDeclaration(
      node,
      node.modifiers,
      visitNode(node.name, visitor, isPropertyName),
      visitParameterList(node.parameters, parameterVisitor, context),
      /*type*/
      void 0,
      transformFunctionBody(node)
    );
    enclosingFunctionFlags = savedEnclosingFunctionFlags;
    parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
    return updated;
  }
  function visitSetAccessorDeclaration(node) {
    const savedEnclosingFunctionFlags = enclosingFunctionFlags;
    const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
    enclosingFunctionFlags = getFunctionFlags(node);
    parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
    const updated = factory2.updateSetAccessorDeclaration(
      node,
      node.modifiers,
      visitNode(node.name, visitor, isPropertyName),
      visitParameterList(node.parameters, parameterVisitor, context),
      transformFunctionBody(node)
    );
    enclosingFunctionFlags = savedEnclosingFunctionFlags;
    parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
    return updated;
  }
  function visitMethodDeclaration(node) {
    const savedEnclosingFunctionFlags = enclosingFunctionFlags;
    const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
    enclosingFunctionFlags = getFunctionFlags(node);
    parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
    const updated = factory2.updateMethodDeclaration(
      node,
      enclosingFunctionFlags & 1 /* Generator */ ? visitNodes2(node.modifiers, visitorNoAsyncModifier, isModifierLike) : node.modifiers,
      enclosingFunctionFlags & 2 /* Async */ ? void 0 : node.asteriskToken,
      visitNode(node.name, visitor, isPropertyName),
      visitNode(
        /*node*/
        void 0,
        visitor,
        isQuestionToken
      ),
      /*typeParameters*/
      void 0,
      visitParameterList(node.parameters, parameterVisitor, context),
      /*type*/
      void 0,
      enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody(node)
    );
    enclosingFunctionFlags = savedEnclosingFunctionFlags;
    parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
    return updated;
  }
  function visitFunctionDeclaration(node) {
    const savedEnclosingFunctionFlags = enclosingFunctionFlags;
    const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
    enclosingFunctionFlags = getFunctionFlags(node);
    parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
    const updated = factory2.updateFunctionDeclaration(
      node,
      enclosingFunctionFlags & 1 /* Generator */ ? visitNodes2(node.modifiers, visitorNoAsyncModifier, isModifier) : node.modifiers,
      enclosingFunctionFlags & 2 /* Async */ ? void 0 : node.asteriskToken,
      node.name,
      /*typeParameters*/
      void 0,
      visitParameterList(node.parameters, parameterVisitor, context),
      /*type*/
      void 0,
      enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody(node)
    );
    enclosingFunctionFlags = savedEnclosingFunctionFlags;
    parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
    return updated;
  }
  function visitArrowFunction(node) {
    const savedEnclosingFunctionFlags = enclosingFunctionFlags;
    const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
    enclosingFunctionFlags = getFunctionFlags(node);
    parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
    const updated = factory2.updateArrowFunction(
      node,
      node.modifiers,
      /*typeParameters*/
      void 0,
      visitParameterList(node.parameters, parameterVisitor, context),
      /*type*/
      void 0,
      node.equalsGreaterThanToken,
      transformFunctionBody(node)
    );
    enclosingFunctionFlags = savedEnclosingFunctionFlags;
    parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
    return updated;
  }
  function visitFunctionExpression(node) {
    const savedEnclosingFunctionFlags = enclosingFunctionFlags;
    const savedParametersWithPrecedingObjectRestOrSpread = parametersWithPrecedingObjectRestOrSpread;
    enclosingFunctionFlags = getFunctionFlags(node);
    parametersWithPrecedingObjectRestOrSpread = collectParametersWithPrecedingObjectRestOrSpread(node);
    const updated = factory2.updateFunctionExpression(
      node,
      enclosingFunctionFlags & 1 /* Generator */ ? visitNodes2(node.modifiers, visitorNoAsyncModifier, isModifier) : node.modifiers,
      enclosingFunctionFlags & 2 /* Async */ ? void 0 : node.asteriskToken,
      node.name,
      /*typeParameters*/
      void 0,
      visitParameterList(node.parameters, parameterVisitor, context),
      /*type*/
      void 0,
      enclosingFunctionFlags & 2 /* Async */ && enclosingFunctionFlags & 1 /* Generator */ ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody(node)
    );
    enclosingFunctionFlags = savedEnclosingFunctionFlags;
    parametersWithPrecedingObjectRestOrSpread = savedParametersWithPrecedingObjectRestOrSpread;
    return updated;
  }
  function transformAsyncGeneratorFunctionBody(node) {
    resumeLexicalEnvironment();
    const statements = [];
    const statementOffset = factory2.copyPrologue(
      node.body.statements,
      statements,
      /*ensureUseStrict*/
      false,
      visitor
    );
    appendObjectRestAssignmentsIfNeeded(statements, node);
    const savedCapturedSuperProperties = capturedSuperProperties;
    const savedHasSuperElementAccess = hasSuperElementAccess;
    capturedSuperProperties = /* @__PURE__ */ new Set();
    hasSuperElementAccess = false;
    const returnStatement = factory2.createReturnStatement(
      emitHelpers().createAsyncGeneratorHelper(
        factory2.createFunctionExpression(
          /*modifiers*/
          void 0,
          factory2.createToken(42 /* AsteriskToken */),
          node.name && factory2.getGeneratedNameForNode(node.name),
          /*typeParameters*/
          void 0,
          /*parameters*/
          [],
          /*type*/
          void 0,
          factory2.updateBlock(
            node.body,
            visitLexicalEnvironment(node.body.statements, visitor, context, statementOffset)
          )
        ),
        !!(hierarchyFacts & 1 /* HasLexicalThis */)
      )
    );
    const emitSuperHelpers = languageVersion >= 2 /* ES2015 */ && resolver.getNodeCheckFlags(node) & (256 /* MethodWithSuperPropertyAssignmentInAsync */ | 128 /* MethodWithSuperPropertyAccessInAsync */);
    if (emitSuperHelpers) {
      enableSubstitutionForAsyncMethodsWithSuper();
      const variableStatement = createSuperAccessVariableStatement(factory2, resolver, node, capturedSuperProperties);
      substitutedSuperAccessors[getNodeId(variableStatement)] = true;
      insertStatementsAfterStandardPrologue(statements, [variableStatement]);
    }
    statements.push(returnStatement);
    insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
    const block = factory2.updateBlock(node.body, statements);
    if (emitSuperHelpers && hasSuperElementAccess) {
      if (resolver.getNodeCheckFlags(node) & 256 /* MethodWithSuperPropertyAssignmentInAsync */) {
        addEmitHelper(block, advancedAsyncSuperHelper);
      } else if (resolver.getNodeCheckFlags(node) & 128 /* MethodWithSuperPropertyAccessInAsync */) {
        addEmitHelper(block, asyncSuperHelper);
      }
    }
    capturedSuperProperties = savedCapturedSuperProperties;
    hasSuperElementAccess = savedHasSuperElementAccess;
    return block;
  }
  function transformFunctionBody(node) {
    resumeLexicalEnvironment();
    let statementOffset = 0;
    const statements = [];
    const body = visitNode(node.body, visitor, isConciseBody) ?? factory2.createBlock([]);
    if (isBlock(body)) {
      statementOffset = factory2.copyPrologue(
        body.statements,
        statements,
        /*ensureUseStrict*/
        false,
        visitor
      );
    }
    addRange(statements, appendObjectRestAssignmentsIfNeeded(
      /*statements*/
      void 0,
      node
    ));
    const leadingStatements = endLexicalEnvironment();
    if (statementOffset > 0 || some(statements) || some(leadingStatements)) {
      const block = factory2.converters.convertToFunctionBlock(
        body,
        /*multiLine*/
        true
      );
      insertStatementsAfterStandardPrologue(statements, leadingStatements);
      addRange(statements, block.statements.slice(statementOffset));
      return factory2.updateBlock(block, setTextRange(factory2.createNodeArray(statements), block.statements));
    }
    return body;
  }
  function appendObjectRestAssignmentsIfNeeded(statements, node) {
    let containsPrecedingObjectRestOrSpread = false;
    for (const parameter of node.parameters) {
      if (containsPrecedingObjectRestOrSpread) {
        if (isBindingPattern(parameter.name)) {
          if (parameter.name.elements.length > 0) {
            const declarations = flattenDestructuringBinding(
              parameter,
              visitor,
              context,
              0 /* All */,
              factory2.getGeneratedNameForNode(parameter)
            );
            if (some(declarations)) {
              const declarationList = factory2.createVariableDeclarationList(declarations);
              const statement = factory2.createVariableStatement(
                /*modifiers*/
                void 0,
                declarationList
              );
              setEmitFlags(statement, 2097152 /* CustomPrologue */);
              statements = append(statements, statement);
            }
          } else if (parameter.initializer) {
            const name = factory2.getGeneratedNameForNode(parameter);
            const initializer = visitNode(parameter.initializer, visitor, isExpression);
            const assignment = factory2.createAssignment(name, initializer);
            const statement = factory2.createExpressionStatement(assignment);
            setEmitFlags(statement, 2097152 /* CustomPrologue */);
            statements = append(statements, statement);
          }
        } else if (parameter.initializer) {
          const name = factory2.cloneNode(parameter.name);
          setTextRange(name, parameter.name);
          setEmitFlags(name, 96 /* NoSourceMap */);
          const initializer = visitNode(parameter.initializer, visitor, isExpression);
          addEmitFlags(initializer, 96 /* NoSourceMap */ | 3072 /* NoComments */);
          const assignment = factory2.createAssignment(name, initializer);
          setTextRange(assignment, parameter);
          setEmitFlags(assignment, 3072 /* NoComments */);
          const block = factory2.createBlock([factory2.createExpressionStatement(assignment)]);
          setTextRange(block, parameter);
          setEmitFlags(block, 1 /* SingleLine */ | 64 /* NoTrailingSourceMap */ | 768 /* NoTokenSourceMaps */ | 3072 /* NoComments */);
          const typeCheck = factory2.createTypeCheck(factory2.cloneNode(parameter.name), "undefined");
          const statement = factory2.createIfStatement(typeCheck, block);
          startOnNewLine(statement);
          setTextRange(statement, parameter);
          setEmitFlags(statement, 768 /* NoTokenSourceMaps */ | 64 /* NoTrailingSourceMap */ | 2097152 /* CustomPrologue */ | 3072 /* NoComments */);
          statements = append(statements, statement);
        }
      } else if (parameter.transformFlags & 65536 /* ContainsObjectRestOrSpread */) {
        containsPrecedingObjectRestOrSpread = true;
        const declarations = flattenDestructuringBinding(
          parameter,
          visitor,
          context,
          1 /* ObjectRest */,
          factory2.getGeneratedNameForNode(parameter),
          /*hoistTempVariables*/
          false,
          /*skipInitializer*/
          true
        );
        if (some(declarations)) {
          const declarationList = factory2.createVariableDeclarationList(declarations);
          const statement = factory2.createVariableStatement(
            /*modifiers*/
            void 0,
            declarationList
          );
          setEmitFlags(statement, 2097152 /* CustomPrologue */);
          statements = append(statements, statement);
        }
      }
    }
    return statements;
  }
  function enableSubstitutionForAsyncMethodsWithSuper() {
    if ((enabledSubstitutions & 1 /* AsyncMethodsWithSuper */) === 0) {
      enabledSubstitutions |= 1 /* AsyncMethodsWithSuper */;
      context.enableSubstitution(212 /* CallExpression */);
      context.enableSubstitution(210 /* PropertyAccessExpression */);
      context.enableSubstitution(211 /* ElementAccessExpression */);
      context.enableEmitNotification(262 /* ClassDeclaration */);
      context.enableEmitNotification(173 /* MethodDeclaration */);
      context.enableEmitNotification(176 /* GetAccessor */);
      context.enableEmitNotification(177 /* SetAccessor */);
      context.enableEmitNotification(175 /* Constructor */);
      context.enableEmitNotification(242 /* VariableStatement */);
    }
  }
  function onEmitNode(hint, node, emitCallback) {
    if (enabledSubstitutions & 1 /* AsyncMethodsWithSuper */ && isSuperContainer(node)) {
      const superContainerFlags = resolver.getNodeCheckFlags(node) & (128 /* MethodWithSuperPropertyAccessInAsync */ | 256 /* MethodWithSuperPropertyAssignmentInAsync */);
      if (superContainerFlags !== enclosingSuperContainerFlags) {
        const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags;
        enclosingSuperContainerFlags = superContainerFlags;
        previousOnEmitNode(hint, node, emitCallback);
        enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags;
        return;
      }
    } else if (enabledSubstitutions && substitutedSuperAccessors[getNodeId(node)]) {
      const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags;
      enclosingSuperContainerFlags = 0;
      previousOnEmitNode(hint, node, emitCallback);
      enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags;
      return;
    }
    previousOnEmitNode(hint, node, emitCallback);
  }
  function onSubstituteNode(hint, node) {
    node = previousOnSubstituteNode(hint, node);
    if (hint === 1 /* Expression */ && enclosingSuperContainerFlags) {
      return substituteExpression(node);
    }
    return node;
  }
  function substituteExpression(node) {
    switch (node.kind) {
      case 210 /* PropertyAccessExpression */:
        return substitutePropertyAccessExpression(node);
      case 211 /* ElementAccessExpression */:
        return substituteElementAccessExpression(node);
      case 212 /* CallExpression */:
        return substituteCallExpression(node);
    }
    return node;
  }
  function substitutePropertyAccessExpression(node) {
    if (node.expression.kind === 108 /* SuperKeyword */) {
      return setTextRange(
        factory2.createPropertyAccessExpression(
          factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */),
          node.name
        ),
        node
      );
    }
    return node;
  }
  function substituteElementAccessExpression(node) {
    if (node.expression.kind === 108 /* SuperKeyword */) {
      return createSuperElementAccessInAsyncMethod(
        node.argumentExpression,
        node
      );
    }
    return node;
  }
  function substituteCallExpression(node) {
    const expression = node.expression;
    if (isSuperProperty(expression)) {
      const argumentExpression = isPropertyAccessExpression(expression) ? substitutePropertyAccessExpression(expression) : substituteElementAccessExpression(expression);
      return factory2.createCallExpression(
        factory2.createPropertyAccessExpression(argumentExpression, "call"),
        /*typeArguments*/
        void 0,
        [
          factory2.createThis(),
          ...node.arguments
        ]
      );
    }
    return node;
  }
  function isSuperContainer(node) {
    const kind = node.kind;
    return kind === 262 /* ClassDeclaration */ || kind === 175 /* Constructor */ || kind === 173 /* MethodDeclaration */ || kind === 176 /* GetAccessor */ || kind === 177 /* SetAccessor */;
  }
  function createSuperElementAccessInAsyncMethod(argumentExpression, location) {
    if (enclosingSuperContainerFlags & 256 /* MethodWithSuperPropertyAssignmentInAsync */) {
      return setTextRange(
        factory2.createPropertyAccessExpression(
          factory2.createCallExpression(
            factory2.createIdentifier("_superIndex"),
            /*typeArguments*/
            void 0,
            [argumentExpression]
          ),
          "value"
        ),
        location
      );
    } else {
      return setTextRange(
        factory2.createCallExpression(
          factory2.createIdentifier("_superIndex"),
          /*typeArguments*/
          void 0,
          [argumentExpression]
        ),
        location
      );
    }
  }
}

// src/compiler/transformers/es2019.ts
function transformES2019(context) {
  const factory2 = context.factory;
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    if (node.isDeclarationFile) {
      return node;
    }
    return visitEachChild(node, visitor, context);
  }
  function visitor(node) {
    if ((node.transformFlags & 64 /* ContainsES2019 */) === 0) {
      return node;
    }
    switch (node.kind) {
      case 298 /* CatchClause */:
        return visitCatchClause(node);
      default:
        return visitEachChild(node, visitor, context);
    }
  }
  function visitCatchClause(node) {
    if (!node.variableDeclaration) {
      return factory2.updateCatchClause(
        node,
        factory2.createVariableDeclaration(factory2.createTempVariable(
          /*recordTempVariable*/
          void 0
        )),
        visitNode(node.block, visitor, isBlock)
      );
    }
    return visitEachChild(node, visitor, context);
  }
}

// src/compiler/transformers/es2020.ts
function transformES2020(context) {
  const {
    factory: factory2,
    hoistVariableDeclaration
  } = context;
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    if (node.isDeclarationFile) {
      return node;
    }
    return visitEachChild(node, visitor, context);
  }
  function visitor(node) {
    if ((node.transformFlags & 32 /* ContainsES2020 */) === 0) {
      return node;
    }
    switch (node.kind) {
      case 212 /* CallExpression */: {
        const updated = visitNonOptionalCallExpression(
          node,
          /*captureThisArg*/
          false
        );
        Debug.assertNotNode(updated, isSyntheticReference);
        return updated;
      }
      case 210 /* PropertyAccessExpression */:
      case 211 /* ElementAccessExpression */:
        if (isOptionalChain(node)) {
          const updated = visitOptionalExpression(
            node,
            /*captureThisArg*/
            false,
            /*isDelete*/
            false
          );
          Debug.assertNotNode(updated, isSyntheticReference);
          return updated;
        }
        return visitEachChild(node, visitor, context);
      case 225 /* BinaryExpression */:
        if (node.operatorToken.kind === 61 /* QuestionQuestionToken */) {
          return transformNullishCoalescingExpression(node);
        }
        return visitEachChild(node, visitor, context);
      case 219 /* DeleteExpression */:
        return visitDeleteExpression(node);
      default:
        return visitEachChild(node, visitor, context);
    }
  }
  function flattenChain(chain) {
    Debug.assertNotNode(chain, isNonNullChain);
    const links = [chain];
    while (!chain.questionDotToken && !isTaggedTemplateExpression(chain)) {
      chain = cast(skipPartiallyEmittedExpressions(chain.expression), isOptionalChain);
      Debug.assertNotNode(chain, isNonNullChain);
      links.unshift(chain);
    }
    return { expression: chain.expression, chain: links };
  }
  function visitNonOptionalParenthesizedExpression(node, captureThisArg, isDelete) {
    const expression = visitNonOptionalExpression(node.expression, captureThisArg, isDelete);
    if (isSyntheticReference(expression)) {
      return factory2.createSyntheticReferenceExpression(factory2.updateParenthesizedExpression(node, expression.expression), expression.thisArg);
    }
    return factory2.updateParenthesizedExpression(node, expression);
  }
  function visitNonOptionalPropertyOrElementAccessExpression(node, captureThisArg, isDelete) {
    if (isOptionalChain(node)) {
      return visitOptionalExpression(node, captureThisArg, isDelete);
    }
    let expression = visitNode(node.expression, visitor, isExpression);
    Debug.assertNotNode(expression, isSyntheticReference);
    let thisArg;
    if (captureThisArg) {
      if (!isSimpleCopiableExpression(expression)) {
        thisArg = factory2.createTempVariable(hoistVariableDeclaration);
        expression = factory2.createAssignment(thisArg, expression);
      } else {
        thisArg = expression;
      }
    }
    expression = node.kind === 210 /* PropertyAccessExpression */ ? factory2.updatePropertyAccessExpression(node, expression, visitNode(node.name, visitor, isIdentifier)) : factory2.updateElementAccessExpression(node, expression, visitNode(node.argumentExpression, visitor, isExpression));
    return thisArg ? factory2.createSyntheticReferenceExpression(expression, thisArg) : expression;
  }
  function visitNonOptionalCallExpression(node, captureThisArg) {
    if (isOptionalChain(node)) {
      return visitOptionalExpression(
        node,
        captureThisArg,
        /*isDelete*/
        false
      );
    }
    if (isParenthesizedExpression(node.expression) && isOptionalChain(skipParentheses(node.expression))) {
      const expression = visitNonOptionalParenthesizedExpression(
        node.expression,
        /*captureThisArg*/
        true,
        /*isDelete*/
        false
      );
      const args = visitNodes2(node.arguments, visitor, isExpression);
      if (isSyntheticReference(expression)) {
        return setTextRange(factory2.createFunctionCallCall(expression.expression, expression.thisArg, args), node);
      }
      return factory2.updateCallExpression(
        node,
        expression,
        /*typeArguments*/
        void 0,
        args
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitNonOptionalExpression(node, captureThisArg, isDelete) {
    switch (node.kind) {
      case 216 /* ParenthesizedExpression */:
        return visitNonOptionalParenthesizedExpression(node, captureThisArg, isDelete);
      case 210 /* PropertyAccessExpression */:
      case 211 /* ElementAccessExpression */:
        return visitNonOptionalPropertyOrElementAccessExpression(node, captureThisArg, isDelete);
      case 212 /* CallExpression */:
        return visitNonOptionalCallExpression(node, captureThisArg);
      default:
        return visitNode(node, visitor, isExpression);
    }
  }
  function visitOptionalExpression(node, captureThisArg, isDelete) {
    const { expression, chain } = flattenChain(node);
    const left = visitNonOptionalExpression(
      skipPartiallyEmittedExpressions(expression),
      isCallChain(chain[0]),
      /*isDelete*/
      false
    );
    let leftThisArg = isSyntheticReference(left) ? left.thisArg : void 0;
    let capturedLeft = isSyntheticReference(left) ? left.expression : left;
    let leftExpression = factory2.restoreOuterExpressions(expression, capturedLeft, 8 /* PartiallyEmittedExpressions */);
    if (!isSimpleCopiableExpression(capturedLeft)) {
      capturedLeft = factory2.createTempVariable(hoistVariableDeclaration);
      leftExpression = factory2.createAssignment(capturedLeft, leftExpression);
    }
    let rightExpression = capturedLeft;
    let thisArg;
    for (let i = 0; i < chain.length; i++) {
      const segment = chain[i];
      switch (segment.kind) {
        case 210 /* PropertyAccessExpression */:
        case 211 /* ElementAccessExpression */:
          if (i === chain.length - 1 && captureThisArg) {
            if (!isSimpleCopiableExpression(rightExpression)) {
              thisArg = factory2.createTempVariable(hoistVariableDeclaration);
              rightExpression = factory2.createAssignment(thisArg, rightExpression);
            } else {
              thisArg = rightExpression;
            }
          }
          rightExpression = segment.kind === 210 /* PropertyAccessExpression */ ? factory2.createPropertyAccessExpression(rightExpression, visitNode(segment.name, visitor, isIdentifier)) : factory2.createElementAccessExpression(rightExpression, visitNode(segment.argumentExpression, visitor, isExpression));
          break;
        case 212 /* CallExpression */:
          if (i === 0 && leftThisArg) {
            if (!isGeneratedIdentifier(leftThisArg)) {
              leftThisArg = factory2.cloneNode(leftThisArg);
              addEmitFlags(leftThisArg, 3072 /* NoComments */);
            }
            rightExpression = factory2.createFunctionCallCall(
              rightExpression,
              leftThisArg.kind === 108 /* SuperKeyword */ ? factory2.createThis() : leftThisArg,
              visitNodes2(segment.arguments, visitor, isExpression)
            );
          } else {
            rightExpression = factory2.createCallExpression(
              rightExpression,
              /*typeArguments*/
              void 0,
              visitNodes2(segment.arguments, visitor, isExpression)
            );
          }
          break;
      }
      setOriginalNode(rightExpression, segment);
    }
    const target = isDelete ? factory2.createConditionalExpression(
      createNotNullCondition(
        leftExpression,
        capturedLeft,
        /*invert*/
        true
      ),
      /*questionToken*/
      void 0,
      factory2.createTrue(),
      /*colonToken*/
      void 0,
      factory2.createDeleteExpression(rightExpression)
    ) : factory2.createConditionalExpression(
      createNotNullCondition(
        leftExpression,
        capturedLeft,
        /*invert*/
        true
      ),
      /*questionToken*/
      void 0,
      factory2.createVoidZero(),
      /*colonToken*/
      void 0,
      rightExpression
    );
    setTextRange(target, node);
    return thisArg ? factory2.createSyntheticReferenceExpression(target, thisArg) : target;
  }
  function createNotNullCondition(left, right, invert) {
    return factory2.createBinaryExpression(
      factory2.createBinaryExpression(
        left,
        factory2.createToken(invert ? 37 /* EqualsEqualsEqualsToken */ : 38 /* ExclamationEqualsEqualsToken */),
        factory2.createNull()
      ),
      factory2.createToken(invert ? 57 /* BarBarToken */ : 56 /* AmpersandAmpersandToken */),
      factory2.createBinaryExpression(
        right,
        factory2.createToken(invert ? 37 /* EqualsEqualsEqualsToken */ : 38 /* ExclamationEqualsEqualsToken */),
        factory2.createVoidZero()
      )
    );
  }
  function transformNullishCoalescingExpression(node) {
    let left = visitNode(node.left, visitor, isExpression);
    let right = left;
    if (!isSimpleCopiableExpression(left)) {
      right = factory2.createTempVariable(hoistVariableDeclaration);
      left = factory2.createAssignment(right, left);
    }
    return setTextRange(factory2.createConditionalExpression(
      createNotNullCondition(left, right),
      /*questionToken*/
      void 0,
      right,
      /*colonToken*/
      void 0,
      visitNode(node.right, visitor, isExpression)
    ), node);
  }
  function visitDeleteExpression(node) {
    return isOptionalChain(skipParentheses(node.expression)) ? setOriginalNode(visitNonOptionalExpression(
      node.expression,
      /*captureThisArg*/
      false,
      /*isDelete*/
      true
    ), node) : factory2.updateDeleteExpression(node, visitNode(node.expression, visitor, isExpression));
  }
}

// src/compiler/transformers/es2021.ts
function transformES2021(context) {
  const {
    hoistVariableDeclaration,
    factory: factory2
  } = context;
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    if (node.isDeclarationFile) {
      return node;
    }
    return visitEachChild(node, visitor, context);
  }
  function visitor(node) {
    if ((node.transformFlags & 16 /* ContainsES2021 */) === 0) {
      return node;
    }
    if (isLogicalOrCoalescingAssignmentExpression(node)) {
      return transformLogicalAssignment(node);
    }
    return visitEachChild(node, visitor, context);
  }
  function transformLogicalAssignment(binaryExpression) {
    const operator = binaryExpression.operatorToken;
    const nonAssignmentOperator = getNonAssignmentOperatorForCompoundAssignment(operator.kind);
    let left = skipParentheses(visitNode(binaryExpression.left, visitor, isLeftHandSideExpression));
    let assignmentTarget = left;
    const right = skipParentheses(visitNode(binaryExpression.right, visitor, isExpression));
    if (isAccessExpression(left)) {
      const propertyAccessTargetSimpleCopiable = isSimpleCopiableExpression(left.expression);
      const propertyAccessTarget = propertyAccessTargetSimpleCopiable ? left.expression : factory2.createTempVariable(hoistVariableDeclaration);
      const propertyAccessTargetAssignment = propertyAccessTargetSimpleCopiable ? left.expression : factory2.createAssignment(
        propertyAccessTarget,
        left.expression
      );
      if (isPropertyAccessExpression(left)) {
        assignmentTarget = factory2.createPropertyAccessExpression(
          propertyAccessTarget,
          left.name
        );
        left = factory2.createPropertyAccessExpression(
          propertyAccessTargetAssignment,
          left.name
        );
      } else {
        const elementAccessArgumentSimpleCopiable = isSimpleCopiableExpression(left.argumentExpression);
        const elementAccessArgument = elementAccessArgumentSimpleCopiable ? left.argumentExpression : factory2.createTempVariable(hoistVariableDeclaration);
        assignmentTarget = factory2.createElementAccessExpression(
          propertyAccessTarget,
          elementAccessArgument
        );
        left = factory2.createElementAccessExpression(
          propertyAccessTargetAssignment,
          elementAccessArgumentSimpleCopiable ? left.argumentExpression : factory2.createAssignment(
            elementAccessArgument,
            left.argumentExpression
          )
        );
      }
    }
    return factory2.createBinaryExpression(
      left,
      nonAssignmentOperator,
      factory2.createParenthesizedExpression(
        factory2.createAssignment(
          assignmentTarget,
          right
        )
      )
    );
  }
}

// src/compiler/transformers/esnext.ts
function transformESNext(context) {
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    if (node.isDeclarationFile) {
      return node;
    }
    return visitEachChild(node, visitor, context);
  }
  function visitor(node) {
    if ((node.transformFlags & 4 /* ContainsESNext */) === 0) {
      return node;
    }
    switch (node.kind) {
      default:
        return visitEachChild(node, visitor, context);
    }
  }
}

// src/compiler/transformers/jsx.ts
function transformJsx(context) {
  const {
    factory: factory2,
    getEmitHelperFactory: emitHelpers
  } = context;
  const compilerOptions = context.getCompilerOptions();
  let currentSourceFile;
  let currentFileState;
  return chainBundle(context, transformSourceFile);
  function getCurrentFileNameExpression() {
    if (currentFileState.filenameDeclaration) {
      return currentFileState.filenameDeclaration.name;
    }
    const declaration = factory2.createVariableDeclaration(
      factory2.createUniqueName("_jsxFileName", 16 /* Optimistic */ | 32 /* FileLevel */),
      /*exclamationToken*/
      void 0,
      /*type*/
      void 0,
      factory2.createStringLiteral(currentSourceFile.fileName)
    );
    currentFileState.filenameDeclaration = declaration;
    return currentFileState.filenameDeclaration.name;
  }
  function getJsxFactoryCalleePrimitive(isStaticChildren) {
    return compilerOptions.jsx === 5 /* ReactJSXDev */ ? "jsxDEV" : isStaticChildren ? "jsxs" : "jsx";
  }
  function getJsxFactoryCallee(isStaticChildren) {
    const type = getJsxFactoryCalleePrimitive(isStaticChildren);
    return getImplicitImportForName(type);
  }
  function getImplicitJsxFragmentReference() {
    return getImplicitImportForName("Fragment");
  }
  function getImplicitImportForName(name) {
    var _a, _b;
    const importSource = name === "createElement" ? currentFileState.importSpecifier : getJSXRuntimeImport(currentFileState.importSpecifier, compilerOptions);
    const existing = (_b = (_a = currentFileState.utilizedImplicitRuntimeImports) == null ? void 0 : _a.get(importSource)) == null ? void 0 : _b.get(name);
    if (existing) {
      return existing.name;
    }
    if (!currentFileState.utilizedImplicitRuntimeImports) {
      currentFileState.utilizedImplicitRuntimeImports = /* @__PURE__ */ new Map();
    }
    let specifierSourceImports = currentFileState.utilizedImplicitRuntimeImports.get(importSource);
    if (!specifierSourceImports) {
      specifierSourceImports = /* @__PURE__ */ new Map();
      currentFileState.utilizedImplicitRuntimeImports.set(importSource, specifierSourceImports);
    }
    const generatedName = factory2.createUniqueName(`_${name}`, 16 /* Optimistic */ | 32 /* FileLevel */ | 64 /* AllowNameSubstitution */);
    const specifier = factory2.createImportSpecifier(
      /*isTypeOnly*/
      false,
      factory2.createIdentifier(name),
      generatedName
    );
    setIdentifierGeneratedImportReference(generatedName, specifier);
    specifierSourceImports.set(name, specifier);
    return generatedName;
  }
  function transformSourceFile(node) {
    if (node.isDeclarationFile) {
      return node;
    }
    currentSourceFile = node;
    currentFileState = {};
    currentFileState.importSpecifier = getJSXImplicitImportBase(compilerOptions, node);
    let visited = visitEachChild(node, visitor, context);
    addEmitHelpers(visited, context.readEmitHelpers());
    let statements = visited.statements;
    if (currentFileState.filenameDeclaration) {
      statements = insertStatementAfterCustomPrologue(statements.slice(), factory2.createVariableStatement(
        /*modifiers*/
        void 0,
        factory2.createVariableDeclarationList([currentFileState.filenameDeclaration], 2 /* Const */)
      ));
    }
    if (currentFileState.utilizedImplicitRuntimeImports) {
      for (const [importSource, importSpecifiersMap] of arrayFrom(currentFileState.utilizedImplicitRuntimeImports.entries())) {
        if (isExternalModule(node)) {
          const importStatement = factory2.createImportDeclaration(
            /*modifiers*/
            void 0,
            factory2.createImportClause(
              /*isTypeOnly*/
              false,
              /*name*/
              void 0,
              factory2.createNamedImports(arrayFrom(importSpecifiersMap.values()))
            ),
            factory2.createStringLiteral(importSource),
            /*assertClause*/
            void 0
          );
          setParentRecursive(
            importStatement,
            /*incremental*/
            false
          );
          statements = insertStatementAfterCustomPrologue(statements.slice(), importStatement);
        } else if (isExternalOrCommonJsModule(node)) {
          const requireStatement = factory2.createVariableStatement(
            /*modifiers*/
            void 0,
            factory2.createVariableDeclarationList([
              factory2.createVariableDeclaration(
                factory2.createObjectBindingPattern(arrayFrom(importSpecifiersMap.values(), (s) => factory2.createBindingElement(
                  /*dotDotDotToken*/
                  void 0,
                  s.propertyName,
                  s.name
                ))),
                /*exclamationToken*/
                void 0,
                /*type*/
                void 0,
                factory2.createCallExpression(
                  factory2.createIdentifier("require"),
                  /*typeArguments*/
                  void 0,
                  [factory2.createStringLiteral(importSource)]
                )
              )
            ], 2 /* Const */)
          );
          setParentRecursive(
            requireStatement,
            /*incremental*/
            false
          );
          statements = insertStatementAfterCustomPrologue(statements.slice(), requireStatement);
        } else {
        }
      }
    }
    if (statements !== visited.statements) {
      visited = factory2.updateSourceFile(visited, statements);
    }
    currentFileState = void 0;
    return visited;
  }
  function visitor(node) {
    if (node.transformFlags & 2 /* ContainsJsx */) {
      return visitorWorker(node);
    } else {
      return node;
    }
  }
  function visitorWorker(node) {
    switch (node.kind) {
      case 283 /* JsxElement */:
        return visitJsxElement(
          node,
          /*isChild*/
          false
        );
      case 284 /* JsxSelfClosingElement */:
        return visitJsxSelfClosingElement(
          node,
          /*isChild*/
          false
        );
      case 287 /* JsxFragment */:
        return visitJsxFragment(
          node,
          /*isChild*/
          false
        );
      case 293 /* JsxExpression */:
        return visitJsxExpression(node);
      default:
        return visitEachChild(node, visitor, context);
    }
  }
  function transformJsxChildToExpression(node) {
    switch (node.kind) {
      case 12 /* JsxText */:
        return visitJsxText(node);
      case 293 /* JsxExpression */:
        return visitJsxExpression(node);
      case 283 /* JsxElement */:
        return visitJsxElement(
          node,
          /*isChild*/
          true
        );
      case 284 /* JsxSelfClosingElement */:
        return visitJsxSelfClosingElement(
          node,
          /*isChild*/
          true
        );
      case 287 /* JsxFragment */:
        return visitJsxFragment(
          node,
          /*isChild*/
          true
        );
      default:
        return Debug.failBadSyntaxKind(node);
    }
  }
  function hasProto(obj) {
    return obj.properties.some((p) => isPropertyAssignment(p) && (isIdentifier(p.name) && idText(p.name) === "__proto__" || isStringLiteral(p.name) && p.name.text === "__proto__"));
  }
  function hasKeyAfterPropsSpread(node) {
    let spread = false;
    for (const elem of node.attributes.properties) {
      if (isJsxSpreadAttribute(elem) && (!isObjectLiteralExpression(elem.expression) || elem.expression.properties.some(isSpreadAssignment))) {
        spread = true;
      } else if (spread && isJsxAttribute(elem) && isIdentifier(elem.name) && elem.name.escapedText === "key") {
        return true;
      }
    }
    return false;
  }
  function shouldUseCreateElement(node) {
    return currentFileState.importSpecifier === void 0 || hasKeyAfterPropsSpread(node);
  }
  function visitJsxElement(node, isChild) {
    const tagTransform = shouldUseCreateElement(node.openingElement) ? visitJsxOpeningLikeElementCreateElement : visitJsxOpeningLikeElementJSX;
    return tagTransform(
      node.openingElement,
      node.children,
      isChild,
      /*location*/
      node
    );
  }
  function visitJsxSelfClosingElement(node, isChild) {
    const tagTransform = shouldUseCreateElement(node) ? visitJsxOpeningLikeElementCreateElement : visitJsxOpeningLikeElementJSX;
    return tagTransform(
      node,
      /*children*/
      void 0,
      isChild,
      /*location*/
      node
    );
  }
  function visitJsxFragment(node, isChild) {
    const tagTransform = currentFileState.importSpecifier === void 0 ? visitJsxOpeningFragmentCreateElement : visitJsxOpeningFragmentJSX;
    return tagTransform(
      node.openingFragment,
      node.children,
      isChild,
      /*location*/
      node
    );
  }
  function convertJsxChildrenToChildrenPropObject(children) {
    const prop = convertJsxChildrenToChildrenPropAssignment(children);
    return prop && factory2.createObjectLiteralExpression([prop]);
  }
  function convertJsxChildrenToChildrenPropAssignment(children) {
    const nonWhitespaceChildren = getSemanticJsxChildren(children);
    if (length(nonWhitespaceChildren) === 1 && !nonWhitespaceChildren[0].dotDotDotToken) {
      const result2 = transformJsxChildToExpression(nonWhitespaceChildren[0]);
      return result2 && factory2.createPropertyAssignment("children", result2);
    }
    const result = mapDefined(children, transformJsxChildToExpression);
    return length(result) ? factory2.createPropertyAssignment("children", factory2.createArrayLiteralExpression(result)) : void 0;
  }
  function visitJsxOpeningLikeElementJSX(node, children, isChild, location) {
    const tagName = getTagName(node);
    const childrenProp = children && children.length ? convertJsxChildrenToChildrenPropAssignment(children) : void 0;
    const keyAttr = find(node.attributes.properties, (p) => !!p.name && isIdentifier(p.name) && p.name.escapedText === "key");
    const attrs = keyAttr ? filter(node.attributes.properties, (p) => p !== keyAttr) : node.attributes.properties;
    const objectProperties = length(attrs) ? transformJsxAttributesToObjectProps(attrs, childrenProp) : factory2.createObjectLiteralExpression(childrenProp ? [childrenProp] : emptyArray);
    return visitJsxOpeningLikeElementOrFragmentJSX(
      tagName,
      objectProperties,
      keyAttr,
      children || emptyArray,
      isChild,
      location
    );
  }
  function visitJsxOpeningLikeElementOrFragmentJSX(tagName, objectProperties, keyAttr, children, isChild, location) {
    var _a;
    const nonWhitespaceChildren = getSemanticJsxChildren(children);
    const isStaticChildren = length(nonWhitespaceChildren) > 1 || !!((_a = nonWhitespaceChildren[0]) == null ? void 0 : _a.dotDotDotToken);
    const args = [tagName, objectProperties];
    if (keyAttr) {
      args.push(transformJsxAttributeInitializer(keyAttr.initializer));
    }
    if (compilerOptions.jsx === 5 /* ReactJSXDev */) {
      const originalFile = getOriginalNode(currentSourceFile);
      if (originalFile && isSourceFile(originalFile)) {
        if (keyAttr === void 0) {
          args.push(factory2.createVoidZero());
        }
        args.push(isStaticChildren ? factory2.createTrue() : factory2.createFalse());
        const lineCol = getLineAndCharacterOfPosition(originalFile, location.pos);
        args.push(factory2.createObjectLiteralExpression([
          factory2.createPropertyAssignment("fileName", getCurrentFileNameExpression()),
          factory2.createPropertyAssignment("lineNumber", factory2.createNumericLiteral(lineCol.line + 1)),
          factory2.createPropertyAssignment("columnNumber", factory2.createNumericLiteral(lineCol.character + 1))
        ]));
        args.push(factory2.createThis());
      }
    }
    const element = setTextRange(
      factory2.createCallExpression(
        getJsxFactoryCallee(isStaticChildren),
        /*typeArguments*/
        void 0,
        args
      ),
      location
    );
    if (isChild) {
      startOnNewLine(element);
    }
    return element;
  }
  function visitJsxOpeningLikeElementCreateElement(node, children, isChild, location) {
    const tagName = getTagName(node);
    const attrs = node.attributes.properties;
    const objectProperties = length(attrs) ? transformJsxAttributesToObjectProps(attrs) : factory2.createNull();
    const callee = currentFileState.importSpecifier === void 0 ? createJsxFactoryExpression(
      factory2,
      context.getEmitResolver().getJsxFactoryEntity(currentSourceFile),
      compilerOptions.reactNamespace,
      // TODO: GH#18217
      node
    ) : getImplicitImportForName("createElement");
    const element = createExpressionForJsxElement(
      factory2,
      callee,
      tagName,
      objectProperties,
      mapDefined(children, transformJsxChildToExpression),
      location
    );
    if (isChild) {
      startOnNewLine(element);
    }
    return element;
  }
  function visitJsxOpeningFragmentJSX(_node, children, isChild, location) {
    let childrenProps;
    if (children && children.length) {
      const result = convertJsxChildrenToChildrenPropObject(children);
      if (result) {
        childrenProps = result;
      }
    }
    return visitJsxOpeningLikeElementOrFragmentJSX(
      getImplicitJsxFragmentReference(),
      childrenProps || factory2.createObjectLiteralExpression([]),
      /*keyAttr*/
      void 0,
      children,
      isChild,
      location
    );
  }
  function visitJsxOpeningFragmentCreateElement(node, children, isChild, location) {
    const element = createExpressionForJsxFragment(
      factory2,
      context.getEmitResolver().getJsxFactoryEntity(currentSourceFile),
      context.getEmitResolver().getJsxFragmentFactoryEntity(currentSourceFile),
      compilerOptions.reactNamespace,
      // TODO: GH#18217
      mapDefined(children, transformJsxChildToExpression),
      node,
      location
    );
    if (isChild) {
      startOnNewLine(element);
    }
    return element;
  }
  function transformJsxSpreadAttributeToProps(node) {
    if (isObjectLiteralExpression(node.expression) && !hasProto(node.expression)) {
      return node.expression.properties;
    }
    return factory2.createSpreadAssignment(Debug.checkDefined(visitNode(node.expression, visitor, isExpression)));
  }
  function transformJsxAttributesToObjectProps(attrs, children) {
    const target = getEmitScriptTarget(compilerOptions);
    return target && target >= 5 /* ES2018 */ ? factory2.createObjectLiteralExpression(transformJsxAttributesToProps(attrs, children)) : transformJsxAttributesToExpression(attrs, children);
  }
  function transformJsxAttributesToProps(attrs, children) {
    const props = flatten(spanMap(attrs, isJsxSpreadAttribute, (attrs2, isSpread) => flatten(map(attrs2, (attr) => isSpread ? transformJsxSpreadAttributeToProps(attr) : transformJsxAttributeToObjectLiteralElement(attr)))));
    if (children) {
      props.push(children);
    }
    return props;
  }
  function transformJsxAttributesToExpression(attrs, children) {
    const expressions = [];
    let properties = [];
    for (const attr of attrs) {
      if (isJsxSpreadAttribute(attr)) {
        if (isObjectLiteralExpression(attr.expression) && !hasProto(attr.expression)) {
          for (const prop of attr.expression.properties) {
            if (isSpreadAssignment(prop)) {
              finishObjectLiteralIfNeeded();
              expressions.push(prop.expression);
              continue;
            }
            properties.push(prop);
          }
          continue;
        }
        finishObjectLiteralIfNeeded();
        expressions.push(Debug.checkDefined(visitNode(attr.expression, visitor, isExpression)));
        continue;
      }
      properties.push(transformJsxAttributeToObjectLiteralElement(attr));
    }
    if (children) {
      properties.push(children);
    }
    finishObjectLiteralIfNeeded();
    if (expressions.length && !isObjectLiteralExpression(expressions[0])) {
      expressions.unshift(factory2.createObjectLiteralExpression());
    }
    return singleOrUndefined(expressions) || emitHelpers().createAssignHelper(expressions);
    function finishObjectLiteralIfNeeded() {
      if (properties.length) {
        expressions.push(factory2.createObjectLiteralExpression(properties));
        properties = [];
      }
    }
  }
  function transformJsxAttributeToObjectLiteralElement(node) {
    const name = getAttributeName(node);
    const expression = transformJsxAttributeInitializer(node.initializer);
    return factory2.createPropertyAssignment(name, expression);
  }
  function transformJsxAttributeInitializer(node) {
    if (node === void 0) {
      return factory2.createTrue();
    }
    if (node.kind === 11 /* StringLiteral */) {
      const singleQuote = node.singleQuote !== void 0 ? node.singleQuote : !isStringDoubleQuoted(node, currentSourceFile);
      const literal = factory2.createStringLiteral(tryDecodeEntities(node.text) || node.text, singleQuote);
      return setTextRange(literal, node);
    }
    if (node.kind === 293 /* JsxExpression */) {
      if (node.expression === void 0) {
        return factory2.createTrue();
      }
      return Debug.checkDefined(visitNode(node.expression, visitor, isExpression));
    }
    if (isJsxElement(node)) {
      return visitJsxElement(
        node,
        /*isChild*/
        false
      );
    }
    if (isJsxSelfClosingElement(node)) {
      return visitJsxSelfClosingElement(
        node,
        /*isChild*/
        false
      );
    }
    if (isJsxFragment(node)) {
      return visitJsxFragment(
        node,
        /*isChild*/
        false
      );
    }
    return Debug.failBadSyntaxKind(node);
  }
  function visitJsxText(node) {
    const fixed = fixupWhitespaceAndDecodeEntities(node.text);
    return fixed === void 0 ? void 0 : factory2.createStringLiteral(fixed);
  }
  function fixupWhitespaceAndDecodeEntities(text) {
    let acc;
    let firstNonWhitespace = 0;
    let lastNonWhitespace = -1;
    for (let i = 0; i < text.length; i++) {
      const c = text.charCodeAt(i);
      if (isLineBreak(c)) {
        if (firstNonWhitespace !== -1 && lastNonWhitespace !== -1) {
          acc = addLineOfJsxText(acc, text.substr(firstNonWhitespace, lastNonWhitespace - firstNonWhitespace + 1));
        }
        firstNonWhitespace = -1;
      } else if (!isWhiteSpaceSingleLine(c)) {
        lastNonWhitespace = i;
        if (firstNonWhitespace === -1) {
          firstNonWhitespace = i;
        }
      }
    }
    return firstNonWhitespace !== -1 ? addLineOfJsxText(acc, text.substr(firstNonWhitespace)) : acc;
  }
  function addLineOfJsxText(acc, trimmedLine) {
    const decoded = decodeEntities(trimmedLine);
    return acc === void 0 ? decoded : acc + " " + decoded;
  }
  function decodeEntities(text) {
    return text.replace(/&((#((\d+)|x([\da-fA-F]+)))|(\w+));/g, (match, _all, _number, _digits, decimal, hex, word) => {
      if (decimal) {
        return utf16EncodeAsString(parseInt(decimal, 10));
      } else if (hex) {
        return utf16EncodeAsString(parseInt(hex, 16));
      } else {
        const ch = entities.get(word);
        return ch ? utf16EncodeAsString(ch) : match;
      }
    });
  }
  function tryDecodeEntities(text) {
    const decoded = decodeEntities(text);
    return decoded === text ? void 0 : decoded;
  }
  function getTagName(node) {
    if (node.kind === 283 /* JsxElement */) {
      return getTagName(node.openingElement);
    } else {
      const tagName = node.tagName;
      if (isIdentifier(tagName) && isIntrinsicJsxName(tagName.escapedText)) {
        return factory2.createStringLiteral(idText(tagName));
      } else if (isJsxNamespacedName(tagName)) {
        return factory2.createStringLiteral(idText(tagName.namespace) + ":" + idText(tagName.name));
      } else {
        return createExpressionFromEntityName(factory2, tagName);
      }
    }
  }
  function getAttributeName(node) {
    const name = node.name;
    if (isIdentifier(name)) {
      const text = idText(name);
      return /^[A-Za-z_]\w*$/.test(text) ? name : factory2.createStringLiteral(text);
    }
    return factory2.createStringLiteral(idText(name.namespace) + ":" + idText(name.name));
  }
  function visitJsxExpression(node) {
    const expression = visitNode(node.expression, visitor, isExpression);
    return node.dotDotDotToken ? factory2.createSpreadElement(expression) : expression;
  }
}
var entities = new Map(Object.entries({
  quot: 34,
  amp: 38,
  apos: 39,
  lt: 60,
  gt: 62,
  nbsp: 160,
  iexcl: 161,
  cent: 162,
  pound: 163,
  curren: 164,
  yen: 165,
  brvbar: 166,
  sect: 167,
  uml: 168,
  copy: 169,
  ordf: 170,
  laquo: 171,
  not: 172,
  shy: 173,
  reg: 174,
  macr: 175,
  deg: 176,
  plusmn: 177,
  sup2: 178,
  sup3: 179,
  acute: 180,
  micro: 181,
  para: 182,
  middot: 183,
  cedil: 184,
  sup1: 185,
  ordm: 186,
  raquo: 187,
  frac14: 188,
  frac12: 189,
  frac34: 190,
  iquest: 191,
  Agrave: 192,
  Aacute: 193,
  Acirc: 194,
  Atilde: 195,
  Auml: 196,
  Aring: 197,
  AElig: 198,
  Ccedil: 199,
  Egrave: 200,
  Eacute: 201,
  Ecirc: 202,
  Euml: 203,
  Igrave: 204,
  Iacute: 205,
  Icirc: 206,
  Iuml: 207,
  ETH: 208,
  Ntilde: 209,
  Ograve: 210,
  Oacute: 211,
  Ocirc: 212,
  Otilde: 213,
  Ouml: 214,
  times: 215,
  Oslash: 216,
  Ugrave: 217,
  Uacute: 218,
  Ucirc: 219,
  Uuml: 220,
  Yacute: 221,
  THORN: 222,
  szlig: 223,
  agrave: 224,
  aacute: 225,
  acirc: 226,
  atilde: 227,
  auml: 228,
  aring: 229,
  aelig: 230,
  ccedil: 231,
  egrave: 232,
  eacute: 233,
  ecirc: 234,
  euml: 235,
  igrave: 236,
  iacute: 237,
  icirc: 238,
  iuml: 239,
  eth: 240,
  ntilde: 241,
  ograve: 242,
  oacute: 243,
  ocirc: 244,
  otilde: 245,
  ouml: 246,
  divide: 247,
  oslash: 248,
  ugrave: 249,
  uacute: 250,
  ucirc: 251,
  uuml: 252,
  yacute: 253,
  thorn: 254,
  yuml: 255,
  OElig: 338,
  oelig: 339,
  Scaron: 352,
  scaron: 353,
  Yuml: 376,
  fnof: 402,
  circ: 710,
  tilde: 732,
  Alpha: 913,
  Beta: 914,
  Gamma: 915,
  Delta: 916,
  Epsilon: 917,
  Zeta: 918,
  Eta: 919,
  Theta: 920,
  Iota: 921,
  Kappa: 922,
  Lambda: 923,
  Mu: 924,
  Nu: 925,
  Xi: 926,
  Omicron: 927,
  Pi: 928,
  Rho: 929,
  Sigma: 931,
  Tau: 932,
  Upsilon: 933,
  Phi: 934,
  Chi: 935,
  Psi: 936,
  Omega: 937,
  alpha: 945,
  beta: 946,
  gamma: 947,
  delta: 948,
  epsilon: 949,
  zeta: 950,
  eta: 951,
  theta: 952,
  iota: 953,
  kappa: 954,
  lambda: 955,
  mu: 956,
  nu: 957,
  xi: 958,
  omicron: 959,
  pi: 960,
  rho: 961,
  sigmaf: 962,
  sigma: 963,
  tau: 964,
  upsilon: 965,
  phi: 966,
  chi: 967,
  psi: 968,
  omega: 969,
  thetasym: 977,
  upsih: 978,
  piv: 982,
  ensp: 8194,
  emsp: 8195,
  thinsp: 8201,
  zwnj: 8204,
  zwj: 8205,
  lrm: 8206,
  rlm: 8207,
  ndash: 8211,
  mdash: 8212,
  lsquo: 8216,
  rsquo: 8217,
  sbquo: 8218,
  ldquo: 8220,
  rdquo: 8221,
  bdquo: 8222,
  dagger: 8224,
  Dagger: 8225,
  bull: 8226,
  hellip: 8230,
  permil: 8240,
  prime: 8242,
  Prime: 8243,
  lsaquo: 8249,
  rsaquo: 8250,
  oline: 8254,
  frasl: 8260,
  euro: 8364,
  image: 8465,
  weierp: 8472,
  real: 8476,
  trade: 8482,
  alefsym: 8501,
  larr: 8592,
  uarr: 8593,
  rarr: 8594,
  darr: 8595,
  harr: 8596,
  crarr: 8629,
  lArr: 8656,
  uArr: 8657,
  rArr: 8658,
  dArr: 8659,
  hArr: 8660,
  forall: 8704,
  part: 8706,
  exist: 8707,
  empty: 8709,
  nabla: 8711,
  isin: 8712,
  notin: 8713,
  ni: 8715,
  prod: 8719,
  sum: 8721,
  minus: 8722,
  lowast: 8727,
  radic: 8730,
  prop: 8733,
  infin: 8734,
  ang: 8736,
  and: 8743,
  or: 8744,
  cap: 8745,
  cup: 8746,
  int: 8747,
  there4: 8756,
  sim: 8764,
  cong: 8773,
  asymp: 8776,
  ne: 8800,
  equiv: 8801,
  le: 8804,
  ge: 8805,
  sub: 8834,
  sup: 8835,
  nsub: 8836,
  sube: 8838,
  supe: 8839,
  oplus: 8853,
  otimes: 8855,
  perp: 8869,
  sdot: 8901,
  lceil: 8968,
  rceil: 8969,
  lfloor: 8970,
  rfloor: 8971,
  lang: 9001,
  rang: 9002,
  loz: 9674,
  spades: 9824,
  clubs: 9827,
  hearts: 9829,
  diams: 9830
}));

// src/compiler/transformers/es2016.ts
function transformES2016(context) {
  const {
    factory: factory2,
    hoistVariableDeclaration
  } = context;
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    if (node.isDeclarationFile) {
      return node;
    }
    return visitEachChild(node, visitor, context);
  }
  function visitor(node) {
    if ((node.transformFlags & 512 /* ContainsES2016 */) === 0) {
      return node;
    }
    switch (node.kind) {
      case 225 /* BinaryExpression */:
        return visitBinaryExpression(node);
      default:
        return visitEachChild(node, visitor, context);
    }
  }
  function visitBinaryExpression(node) {
    switch (node.operatorToken.kind) {
      case 68 /* AsteriskAsteriskEqualsToken */:
        return visitExponentiationAssignmentExpression(node);
      case 43 /* AsteriskAsteriskToken */:
        return visitExponentiationExpression(node);
      default:
        return visitEachChild(node, visitor, context);
    }
  }
  function visitExponentiationAssignmentExpression(node) {
    let target;
    let value;
    const left = visitNode(node.left, visitor, isExpression);
    const right = visitNode(node.right, visitor, isExpression);
    if (isElementAccessExpression(left)) {
      const expressionTemp = factory2.createTempVariable(hoistVariableDeclaration);
      const argumentExpressionTemp = factory2.createTempVariable(hoistVariableDeclaration);
      target = setTextRange(
        factory2.createElementAccessExpression(
          setTextRange(factory2.createAssignment(expressionTemp, left.expression), left.expression),
          setTextRange(factory2.createAssignment(argumentExpressionTemp, left.argumentExpression), left.argumentExpression)
        ),
        left
      );
      value = setTextRange(
        factory2.createElementAccessExpression(
          expressionTemp,
          argumentExpressionTemp
        ),
        left
      );
    } else if (isPropertyAccessExpression(left)) {
      const expressionTemp = factory2.createTempVariable(hoistVariableDeclaration);
      target = setTextRange(
        factory2.createPropertyAccessExpression(
          setTextRange(factory2.createAssignment(expressionTemp, left.expression), left.expression),
          left.name
        ),
        left
      );
      value = setTextRange(
        factory2.createPropertyAccessExpression(
          expressionTemp,
          left.name
        ),
        left
      );
    } else {
      target = left;
      value = left;
    }
    return setTextRange(
      factory2.createAssignment(
        target,
        setTextRange(factory2.createGlobalMethodCall("Math", "pow", [value, right]), node)
      ),
      node
    );
  }
  function visitExponentiationExpression(node) {
    const left = visitNode(node.left, visitor, isExpression);
    const right = visitNode(node.right, visitor, isExpression);
    return setTextRange(factory2.createGlobalMethodCall("Math", "pow", [left, right]), node);
  }
}

// src/compiler/transformers/es2015.ts
function createSpreadSegment(kind, expression) {
  return { kind, expression };
}
function transformES2015(context) {
  const {
    factory: factory2,
    getEmitHelperFactory: emitHelpers,
    startLexicalEnvironment,
    resumeLexicalEnvironment,
    endLexicalEnvironment,
    hoistVariableDeclaration
  } = context;
  const compilerOptions = context.getCompilerOptions();
  const resolver = context.getEmitResolver();
  const previousOnSubstituteNode = context.onSubstituteNode;
  const previousOnEmitNode = context.onEmitNode;
  context.onEmitNode = onEmitNode;
  context.onSubstituteNode = onSubstituteNode;
  let currentSourceFile;
  let currentText;
  let hierarchyFacts;
  let taggedTemplateStringDeclarations;
  function recordTaggedTemplateString(temp) {
    taggedTemplateStringDeclarations = append(
      taggedTemplateStringDeclarations,
      factory2.createVariableDeclaration(temp)
    );
  }
  let convertedLoopState;
  let enabledSubstitutions;
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    if (node.isDeclarationFile) {
      return node;
    }
    currentSourceFile = node;
    currentText = node.text;
    const visited = visitSourceFile(node);
    addEmitHelpers(visited, context.readEmitHelpers());
    currentSourceFile = void 0;
    currentText = void 0;
    taggedTemplateStringDeclarations = void 0;
    hierarchyFacts = 0 /* None */;
    return visited;
  }
  function enterSubtree(excludeFacts, includeFacts) {
    const ancestorFacts = hierarchyFacts;
    hierarchyFacts = (hierarchyFacts & ~excludeFacts | includeFacts) & 32767 /* AncestorFactsMask */;
    return ancestorFacts;
  }
  function exitSubtree(ancestorFacts, excludeFacts, includeFacts) {
    hierarchyFacts = (hierarchyFacts & ~excludeFacts | includeFacts) & -32768 /* SubtreeFactsMask */ | ancestorFacts;
  }
  function isReturnVoidStatementInConstructorWithCapturedSuper(node) {
    return (hierarchyFacts & 8192 /* ConstructorWithCapturedSuper */) !== 0 && node.kind === 252 /* ReturnStatement */ && !node.expression;
  }
  function isOrMayContainReturnCompletion(node) {
    return node.transformFlags & 4194304 /* ContainsHoistedDeclarationOrCompletion */ && (isReturnStatement(node) || isIfStatement(node) || isWithStatement(node) || isSwitchStatement(node) || isCaseBlock(node) || isCaseClause(node) || isDefaultClause(node) || isTryStatement(node) || isCatchClause(node) || isLabeledStatement(node) || isIterationStatement(
      node,
      /*lookInLabeledStatements*/
      false
    ) || isBlock(node));
  }
  function shouldVisitNode(node) {
    return (node.transformFlags & 1024 /* ContainsES2015 */) !== 0 || convertedLoopState !== void 0 || hierarchyFacts & 8192 /* ConstructorWithCapturedSuper */ && isOrMayContainReturnCompletion(node) || isIterationStatement(
      node,
      /*lookInLabeledStatements*/
      false
    ) && shouldConvertIterationStatement(node) || (getInternalEmitFlags(node) & 1 /* TypeScriptClassWrapper */) !== 0;
  }
  function visitor(node) {
    return shouldVisitNode(node) ? visitorWorker(
      node,
      /*expressionResultIsUnused*/
      false
    ) : node;
  }
  function visitorWithUnusedExpressionResult(node) {
    return shouldVisitNode(node) ? visitorWorker(
      node,
      /*expressionResultIsUnused*/
      true
    ) : node;
  }
  function classWrapperStatementVisitor(node) {
    if (shouldVisitNode(node)) {
      const original = getOriginalNode(node);
      if (isPropertyDeclaration(original) && hasStaticModifier(original)) {
        const ancestorFacts = enterSubtree(
          32670 /* StaticInitializerExcludes */,
          16449 /* StaticInitializerIncludes */
        );
        const result = visitorWorker(
          node,
          /*expressionResultIsUnused*/
          false
        );
        exitSubtree(ancestorFacts, 98304 /* FunctionSubtreeExcludes */, 0 /* None */);
        return result;
      }
      return visitorWorker(
        node,
        /*expressionResultIsUnused*/
        false
      );
    }
    return node;
  }
  function callExpressionVisitor(node) {
    if (node.kind === 108 /* SuperKeyword */) {
      return visitSuperKeyword(
        /*isExpressionOfCall*/
        true
      );
    }
    return visitor(node);
  }
  function visitorWorker(node, expressionResultIsUnused2) {
    switch (node.kind) {
      case 126 /* StaticKeyword */:
        return void 0;
      case 262 /* ClassDeclaration */:
        return visitClassDeclaration(node);
      case 230 /* ClassExpression */:
        return visitClassExpression(node);
      case 168 /* Parameter */:
        return visitParameter(node);
      case 261 /* FunctionDeclaration */:
        return visitFunctionDeclaration(node);
      case 218 /* ArrowFunction */:
        return visitArrowFunction(node);
      case 217 /* FunctionExpression */:
        return visitFunctionExpression(node);
      case 259 /* VariableDeclaration */:
        return visitVariableDeclaration(node);
      case 80 /* Identifier */:
        return visitIdentifier(node);
      case 260 /* VariableDeclarationList */:
        return visitVariableDeclarationList(node);
      case 254 /* SwitchStatement */:
        return visitSwitchStatement(node);
      case 268 /* CaseBlock */:
        return visitCaseBlock(node);
      case 240 /* Block */:
        return visitBlock(
          node,
          /*isFunctionBody*/
          false
        );
      case 251 /* BreakStatement */:
      case 250 /* ContinueStatement */:
        return visitBreakOrContinueStatement(node);
      case 255 /* LabeledStatement */:
        return visitLabeledStatement(node);
      case 245 /* DoStatement */:
      case 246 /* WhileStatement */:
        return visitDoOrWhileStatement(
          node,
          /*outermostLabeledStatement*/
          void 0
        );
      case 247 /* ForStatement */:
        return visitForStatement(
          node,
          /*outermostLabeledStatement*/
          void 0
        );
      case 248 /* ForInStatement */:
        return visitForInStatement(
          node,
          /*outermostLabeledStatement*/
          void 0
        );
      case 249 /* ForOfStatement */:
        return visitForOfStatement(
          node,
          /*outermostLabeledStatement*/
          void 0
        );
      case 243 /* ExpressionStatement */:
        return visitExpressionStatement(node);
      case 209 /* ObjectLiteralExpression */:
        return visitObjectLiteralExpression(node);
      case 298 /* CatchClause */:
        return visitCatchClause(node);
      case 303 /* ShorthandPropertyAssignment */:
        return visitShorthandPropertyAssignment(node);
      case 166 /* ComputedPropertyName */:
        return visitComputedPropertyName(node);
      case 208 /* ArrayLiteralExpression */:
        return visitArrayLiteralExpression(node);
      case 212 /* CallExpression */:
        return visitCallExpression(node);
      case 213 /* NewExpression */:
        return visitNewExpression(node);
      case 216 /* ParenthesizedExpression */:
        return visitParenthesizedExpression(node, expressionResultIsUnused2);
      case 225 /* BinaryExpression */:
        return visitBinaryExpression(node, expressionResultIsUnused2);
      case 360 /* CommaListExpression */:
        return visitCommaListExpression(node, expressionResultIsUnused2);
      case 15 /* NoSubstitutionTemplateLiteral */:
      case 16 /* TemplateHead */:
      case 17 /* TemplateMiddle */:
      case 18 /* TemplateTail */:
        return visitTemplateLiteral(node);
      case 11 /* StringLiteral */:
        return visitStringLiteral(node);
      case 9 /* NumericLiteral */:
        return visitNumericLiteral(node);
      case 214 /* TaggedTemplateExpression */:
        return visitTaggedTemplateExpression(node);
      case 227 /* TemplateExpression */:
        return visitTemplateExpression(node);
      case 228 /* YieldExpression */:
        return visitYieldExpression(node);
      case 229 /* SpreadElement */:
        return visitSpreadElement(node);
      case 108 /* SuperKeyword */:
        return visitSuperKeyword(
          /*isExpressionOfCall*/
          false
        );
      case 110 /* ThisKeyword */:
        return visitThisKeyword(node);
      case 235 /* MetaProperty */:
        return visitMetaProperty(node);
      case 173 /* MethodDeclaration */:
        return visitMethodDeclaration(node);
      case 176 /* GetAccessor */:
      case 177 /* SetAccessor */:
        return visitAccessorDeclaration(node);
      case 242 /* VariableStatement */:
        return visitVariableStatement(node);
      case 252 /* ReturnStatement */:
        return visitReturnStatement(node);
      case 221 /* VoidExpression */:
        return visitVoidExpression(node);
      default:
        return visitEachChild(node, visitor, context);
    }
  }
  function visitSourceFile(node) {
    const ancestorFacts = enterSubtree(8064 /* SourceFileExcludes */, 64 /* SourceFileIncludes */);
    const prologue = [];
    const statements = [];
    startLexicalEnvironment();
    const statementOffset = factory2.copyPrologue(
      node.statements,
      prologue,
      /*ensureUseStrict*/
      false,
      visitor
    );
    addRange(statements, visitNodes2(node.statements, visitor, isStatement, statementOffset));
    if (taggedTemplateStringDeclarations) {
      statements.push(
        factory2.createVariableStatement(
          /*modifiers*/
          void 0,
          factory2.createVariableDeclarationList(taggedTemplateStringDeclarations)
        )
      );
    }
    factory2.mergeLexicalEnvironment(prologue, endLexicalEnvironment());
    insertCaptureThisForNodeIfNeeded(prologue, node);
    exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
    return factory2.updateSourceFile(
      node,
      setTextRange(factory2.createNodeArray(concatenate(prologue, statements)), node.statements)
    );
  }
  function visitSwitchStatement(node) {
    if (convertedLoopState !== void 0) {
      const savedAllowedNonLabeledJumps = convertedLoopState.allowedNonLabeledJumps;
      convertedLoopState.allowedNonLabeledJumps |= 2 /* Break */;
      const result = visitEachChild(node, visitor, context);
      convertedLoopState.allowedNonLabeledJumps = savedAllowedNonLabeledJumps;
      return result;
    }
    return visitEachChild(node, visitor, context);
  }
  function visitCaseBlock(node) {
    const ancestorFacts = enterSubtree(7104 /* BlockScopeExcludes */, 0 /* BlockScopeIncludes */);
    const updated = visitEachChild(node, visitor, context);
    exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
    return updated;
  }
  function returnCapturedThis(node) {
    return setOriginalNode(factory2.createReturnStatement(factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */)), node);
  }
  function visitReturnStatement(node) {
    if (convertedLoopState) {
      convertedLoopState.nonLocalJumps |= 8 /* Return */;
      if (isReturnVoidStatementInConstructorWithCapturedSuper(node)) {
        node = returnCapturedThis(node);
      }
      return factory2.createReturnStatement(
        factory2.createObjectLiteralExpression(
          [
            factory2.createPropertyAssignment(
              factory2.createIdentifier("value"),
              node.expression ? Debug.checkDefined(visitNode(node.expression, visitor, isExpression)) : factory2.createVoidZero()
            )
          ]
        )
      );
    } else if (isReturnVoidStatementInConstructorWithCapturedSuper(node)) {
      return returnCapturedThis(node);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitThisKeyword(node) {
    if (hierarchyFacts & 2 /* ArrowFunction */ && !(hierarchyFacts & 16384 /* StaticInitializer */)) {
      hierarchyFacts |= 65536 /* CapturedLexicalThis */;
    }
    if (convertedLoopState) {
      if (hierarchyFacts & 2 /* ArrowFunction */) {
        convertedLoopState.containsLexicalThis = true;
        return node;
      }
      return convertedLoopState.thisName || (convertedLoopState.thisName = factory2.createUniqueName("this"));
    }
    return node;
  }
  function visitVoidExpression(node) {
    return visitEachChild(node, visitorWithUnusedExpressionResult, context);
  }
  function visitIdentifier(node) {
    if (convertedLoopState) {
      if (resolver.isArgumentsLocalBinding(node)) {
        return convertedLoopState.argumentsName || (convertedLoopState.argumentsName = factory2.createUniqueName("arguments"));
      }
    }
    if (node.flags & 128 /* IdentifierHasExtendedUnicodeEscape */) {
      return setOriginalNode(setTextRange(
        factory2.createIdentifier(unescapeLeadingUnderscores(node.escapedText)),
        node
      ), node);
    }
    return node;
  }
  function visitBreakOrContinueStatement(node) {
    if (convertedLoopState) {
      const jump = node.kind === 251 /* BreakStatement */ ? 2 /* Break */ : 4 /* Continue */;
      const canUseBreakOrContinue = node.label && convertedLoopState.labels && convertedLoopState.labels.get(idText(node.label)) || !node.label && convertedLoopState.allowedNonLabeledJumps & jump;
      if (!canUseBreakOrContinue) {
        let labelMarker;
        const label = node.label;
        if (!label) {
          if (node.kind === 251 /* BreakStatement */) {
            convertedLoopState.nonLocalJumps |= 2 /* Break */;
            labelMarker = "break";
          } else {
            convertedLoopState.nonLocalJumps |= 4 /* Continue */;
            labelMarker = "continue";
          }
        } else {
          if (node.kind === 251 /* BreakStatement */) {
            labelMarker = `break-${label.escapedText}`;
            setLabeledJump(
              convertedLoopState,
              /*isBreak*/
              true,
              idText(label),
              labelMarker
            );
          } else {
            labelMarker = `continue-${label.escapedText}`;
            setLabeledJump(
              convertedLoopState,
              /*isBreak*/
              false,
              idText(label),
              labelMarker
            );
          }
        }
        let returnExpression = factory2.createStringLiteral(labelMarker);
        if (convertedLoopState.loopOutParameters.length) {
          const outParams = convertedLoopState.loopOutParameters;
          let expr;
          for (let i = 0; i < outParams.length; i++) {
            const copyExpr = copyOutParameter(outParams[i], 1 /* ToOutParameter */);
            if (i === 0) {
              expr = copyExpr;
            } else {
              expr = factory2.createBinaryExpression(expr, 28 /* CommaToken */, copyExpr);
            }
          }
          returnExpression = factory2.createBinaryExpression(expr, 28 /* CommaToken */, returnExpression);
        }
        return factory2.createReturnStatement(returnExpression);
      }
    }
    return visitEachChild(node, visitor, context);
  }
  function visitClassDeclaration(node) {
    const variable = factory2.createVariableDeclaration(
      factory2.getLocalName(
        node,
        /*allowComments*/
        true
      ),
      /*exclamationToken*/
      void 0,
      /*type*/
      void 0,
      transformClassLikeDeclarationToExpression(node)
    );
    setOriginalNode(variable, node);
    const statements = [];
    const statement = factory2.createVariableStatement(
      /*modifiers*/
      void 0,
      factory2.createVariableDeclarationList([variable])
    );
    setOriginalNode(statement, node);
    setTextRange(statement, node);
    startOnNewLine(statement);
    statements.push(statement);
    if (hasSyntacticModifier(node, 1 /* Export */)) {
      const exportStatement = hasSyntacticModifier(node, 1024 /* Default */) ? factory2.createExportDefault(factory2.getLocalName(node)) : factory2.createExternalModuleExport(factory2.getLocalName(node));
      setOriginalNode(exportStatement, statement);
      statements.push(exportStatement);
    }
    return singleOrMany(statements);
  }
  function visitClassExpression(node) {
    return transformClassLikeDeclarationToExpression(node);
  }
  function transformClassLikeDeclarationToExpression(node) {
    if (node.name) {
      enableSubstitutionsForBlockScopedBindings();
    }
    const extendsClauseElement = getClassExtendsHeritageElement(node);
    const classFunction = factory2.createFunctionExpression(
      /*modifiers*/
      void 0,
      /*asteriskToken*/
      void 0,
      /*name*/
      void 0,
      /*typeParameters*/
      void 0,
      extendsClauseElement ? [factory2.createParameterDeclaration(
        /*modifiers*/
        void 0,
        /*dotDotDotToken*/
        void 0,
        factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */)
      )] : [],
      /*type*/
      void 0,
      transformClassBody(node, extendsClauseElement)
    );
    setEmitFlags(classFunction, getEmitFlags(node) & 131072 /* Indented */ | 1048576 /* ReuseTempVariableScope */);
    const inner = factory2.createPartiallyEmittedExpression(classFunction);
    setTextRangeEnd(inner, node.end);
    setEmitFlags(inner, 3072 /* NoComments */);
    const outer = factory2.createPartiallyEmittedExpression(inner);
    setTextRangeEnd(outer, skipTrivia(currentText, node.pos));
    setEmitFlags(outer, 3072 /* NoComments */);
    const result = factory2.createParenthesizedExpression(
      factory2.createCallExpression(
        outer,
        /*typeArguments*/
        void 0,
        extendsClauseElement ? [Debug.checkDefined(visitNode(extendsClauseElement.expression, visitor, isExpression))] : []
      )
    );
    addSyntheticLeadingComment(result, 3 /* MultiLineCommentTrivia */, "* @class ");
    return result;
  }
  function transformClassBody(node, extendsClauseElement) {
    const statements = [];
    const name = factory2.getInternalName(node);
    const constructorLikeName = isIdentifierANonContextualKeyword(name) ? factory2.getGeneratedNameForNode(name) : name;
    startLexicalEnvironment();
    addExtendsHelperIfNeeded(statements, node, extendsClauseElement);
    addConstructor(statements, node, constructorLikeName, extendsClauseElement);
    addClassMembers(statements, node);
    const closingBraceLocation = createTokenRange(skipTrivia(currentText, node.members.end), 20 /* CloseBraceToken */);
    const outer = factory2.createPartiallyEmittedExpression(constructorLikeName);
    setTextRangeEnd(outer, closingBraceLocation.end);
    setEmitFlags(outer, 3072 /* NoComments */);
    const statement = factory2.createReturnStatement(outer);
    setTextRangePos(statement, closingBraceLocation.pos);
    setEmitFlags(statement, 3072 /* NoComments */ | 768 /* NoTokenSourceMaps */);
    statements.push(statement);
    insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
    const block = factory2.createBlock(
      setTextRange(
        factory2.createNodeArray(statements),
        /*location*/
        node.members
      ),
      /*multiLine*/
      true
    );
    setEmitFlags(block, 3072 /* NoComments */);
    return block;
  }
  function addExtendsHelperIfNeeded(statements, node, extendsClauseElement) {
    if (extendsClauseElement) {
      statements.push(
        setTextRange(
          factory2.createExpressionStatement(
            emitHelpers().createExtendsHelper(factory2.getInternalName(node))
          ),
          /*location*/
          extendsClauseElement
        )
      );
    }
  }
  function addConstructor(statements, node, name, extendsClauseElement) {
    const savedConvertedLoopState = convertedLoopState;
    convertedLoopState = void 0;
    const ancestorFacts = enterSubtree(32662 /* ConstructorExcludes */, 73 /* ConstructorIncludes */);
    const constructor = getFirstConstructorWithBody(node);
    const hasSynthesizedSuper = hasSynthesizedDefaultSuperCall(constructor, extendsClauseElement !== void 0);
    const constructorFunction = factory2.createFunctionDeclaration(
      /*modifiers*/
      void 0,
      /*asteriskToken*/
      void 0,
      name,
      /*typeParameters*/
      void 0,
      transformConstructorParameters(constructor, hasSynthesizedSuper),
      /*type*/
      void 0,
      transformConstructorBody(constructor, node, extendsClauseElement, hasSynthesizedSuper)
    );
    setTextRange(constructorFunction, constructor || node);
    if (extendsClauseElement) {
      setEmitFlags(constructorFunction, 16 /* CapturesThis */);
    }
    statements.push(constructorFunction);
    exitSubtree(ancestorFacts, 98304 /* FunctionSubtreeExcludes */, 0 /* None */);
    convertedLoopState = savedConvertedLoopState;
  }
  function transformConstructorParameters(constructor, hasSynthesizedSuper) {
    return visitParameterList(constructor && !hasSynthesizedSuper ? constructor.parameters : void 0, visitor, context) || [];
  }
  function createDefaultConstructorBody(node, isDerivedClass) {
    const statements = [];
    resumeLexicalEnvironment();
    factory2.mergeLexicalEnvironment(statements, endLexicalEnvironment());
    if (isDerivedClass) {
      statements.push(factory2.createReturnStatement(createDefaultSuperCallOrThis()));
    }
    const statementsArray = factory2.createNodeArray(statements);
    setTextRange(statementsArray, node.members);
    const block = factory2.createBlock(
      statementsArray,
      /*multiLine*/
      true
    );
    setTextRange(block, node);
    setEmitFlags(block, 3072 /* NoComments */);
    return block;
  }
  function transformConstructorBody(constructor, node, extendsClauseElement, hasSynthesizedSuper) {
    const isDerivedClass = !!extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== 106 /* NullKeyword */;
    if (!constructor)
      return createDefaultConstructorBody(node, isDerivedClass);
    const prologue = [];
    const statements = [];
    resumeLexicalEnvironment();
    const existingPrologue = takeWhile(constructor.body.statements, isPrologueDirective);
    const { superCall, superStatementIndex } = findSuperCallAndStatementIndex(constructor.body.statements, existingPrologue);
    const postSuperStatementsStart = superStatementIndex === -1 ? existingPrologue.length : superStatementIndex + 1;
    let statementOffset = postSuperStatementsStart;
    if (!hasSynthesizedSuper)
      statementOffset = factory2.copyStandardPrologue(
        constructor.body.statements,
        prologue,
        statementOffset,
        /*ensureUseStrict*/
        false
      );
    if (!hasSynthesizedSuper)
      statementOffset = factory2.copyCustomPrologue(
        constructor.body.statements,
        statements,
        statementOffset,
        visitor,
        /*filter*/
        void 0
      );
    let superCallExpression;
    if (hasSynthesizedSuper) {
      superCallExpression = createDefaultSuperCallOrThis();
    } else if (superCall) {
      superCallExpression = visitSuperCallInBody(superCall);
    }
    if (superCallExpression) {
      hierarchyFacts |= 8192 /* ConstructorWithCapturedSuper */;
    }
    addDefaultValueAssignmentsIfNeeded2(prologue, constructor);
    addRestParameterIfNeeded(prologue, constructor, hasSynthesizedSuper);
    addRange(statements, visitNodes2(
      constructor.body.statements,
      visitor,
      isStatement,
      /*start*/
      statementOffset
    ));
    factory2.mergeLexicalEnvironment(prologue, endLexicalEnvironment());
    insertCaptureNewTargetIfNeeded(
      prologue,
      constructor,
      /*copyOnWrite*/
      false
    );
    if (isDerivedClass || superCallExpression) {
      if (superCallExpression && postSuperStatementsStart === constructor.body.statements.length && !(constructor.body.transformFlags & 16384 /* ContainsLexicalThis */)) {
        const superCall2 = cast(cast(superCallExpression, isBinaryExpression).left, isCallExpression);
        const returnStatement = factory2.createReturnStatement(superCallExpression);
        setCommentRange(returnStatement, getCommentRange(superCall2));
        setEmitFlags(superCall2, 3072 /* NoComments */);
        statements.push(returnStatement);
      } else {
        if (superStatementIndex <= existingPrologue.length) {
          insertCaptureThisForNode(statements, constructor, superCallExpression || createActualThis());
        } else {
          insertCaptureThisForNode(prologue, constructor, createActualThis());
          if (superCallExpression) {
            insertSuperThisCaptureThisForNode(statements, superCallExpression);
          }
        }
        if (!isSufficientlyCoveredByReturnStatements(constructor.body)) {
          statements.push(factory2.createReturnStatement(factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */)));
        }
      }
    } else {
      insertCaptureThisForNodeIfNeeded(prologue, constructor);
    }
    const body = factory2.createBlock(
      setTextRange(
        factory2.createNodeArray(
          [
            ...existingPrologue,
            ...prologue,
            ...superStatementIndex <= existingPrologue.length ? emptyArray : visitNodes2(constructor.body.statements, visitor, isStatement, existingPrologue.length, superStatementIndex - existingPrologue.length),
            ...statements
          ]
        ),
        /*location*/
        constructor.body.statements
      ),
      /*multiLine*/
      true
    );
    setTextRange(body, constructor.body);
    return body;
  }
  function findSuperCallAndStatementIndex(originalBodyStatements, existingPrologue) {
    for (let i = existingPrologue.length; i < originalBodyStatements.length; i += 1) {
      const superCall = getSuperCallFromStatement(originalBodyStatements[i]);
      if (superCall) {
        return {
          superCall,
          superStatementIndex: i
        };
      }
    }
    return {
      superStatementIndex: -1
    };
  }
  function isSufficientlyCoveredByReturnStatements(statement) {
    if (statement.kind === 252 /* ReturnStatement */) {
      return true;
    } else if (statement.kind === 244 /* IfStatement */) {
      const ifStatement = statement;
      if (ifStatement.elseStatement) {
        return isSufficientlyCoveredByReturnStatements(ifStatement.thenStatement) && isSufficientlyCoveredByReturnStatements(ifStatement.elseStatement);
      }
    } else if (statement.kind === 240 /* Block */) {
      const lastStatement = lastOrUndefined(statement.statements);
      if (lastStatement && isSufficientlyCoveredByReturnStatements(lastStatement)) {
        return true;
      }
    }
    return false;
  }
  function createActualThis() {
    return setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */);
  }
  function createDefaultSuperCallOrThis() {
    return factory2.createLogicalOr(
      factory2.createLogicalAnd(
        factory2.createStrictInequality(
          factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */),
          factory2.createNull()
        ),
        factory2.createFunctionApplyCall(
          factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */),
          createActualThis(),
          factory2.createIdentifier("arguments")
        )
      ),
      createActualThis()
    );
  }
  function visitParameter(node) {
    if (node.dotDotDotToken) {
      return void 0;
    } else if (isBindingPattern(node.name)) {
      return setOriginalNode(
        setTextRange(
          factory2.createParameterDeclaration(
            /*modifiers*/
            void 0,
            /*dotDotDotToken*/
            void 0,
            factory2.getGeneratedNameForNode(node),
            /*questionToken*/
            void 0,
            /*type*/
            void 0,
            /*initializer*/
            void 0
          ),
          /*location*/
          node
        ),
        /*original*/
        node
      );
    } else if (node.initializer) {
      return setOriginalNode(
        setTextRange(
          factory2.createParameterDeclaration(
            /*modifiers*/
            void 0,
            /*dotDotDotToken*/
            void 0,
            node.name,
            /*questionToken*/
            void 0,
            /*type*/
            void 0,
            /*initializer*/
            void 0
          ),
          /*location*/
          node
        ),
        /*original*/
        node
      );
    } else {
      return node;
    }
  }
  function hasDefaultValueOrBindingPattern(node) {
    return node.initializer !== void 0 || isBindingPattern(node.name);
  }
  function addDefaultValueAssignmentsIfNeeded2(statements, node) {
    if (!some(node.parameters, hasDefaultValueOrBindingPattern)) {
      return false;
    }
    let added = false;
    for (const parameter of node.parameters) {
      const { name, initializer, dotDotDotToken } = parameter;
      if (dotDotDotToken) {
        continue;
      }
      if (isBindingPattern(name)) {
        added = insertDefaultValueAssignmentForBindingPattern(statements, parameter, name, initializer) || added;
      } else if (initializer) {
        insertDefaultValueAssignmentForInitializer(statements, parameter, name, initializer);
        added = true;
      }
    }
    return added;
  }
  function insertDefaultValueAssignmentForBindingPattern(statements, parameter, name, initializer) {
    if (name.elements.length > 0) {
      insertStatementAfterCustomPrologue(
        statements,
        setEmitFlags(
          factory2.createVariableStatement(
            /*modifiers*/
            void 0,
            factory2.createVariableDeclarationList(
              flattenDestructuringBinding(
                parameter,
                visitor,
                context,
                0 /* All */,
                factory2.getGeneratedNameForNode(parameter)
              )
            )
          ),
          2097152 /* CustomPrologue */
        )
      );
      return true;
    } else if (initializer) {
      insertStatementAfterCustomPrologue(
        statements,
        setEmitFlags(
          factory2.createExpressionStatement(
            factory2.createAssignment(
              factory2.getGeneratedNameForNode(parameter),
              Debug.checkDefined(visitNode(initializer, visitor, isExpression))
            )
          ),
          2097152 /* CustomPrologue */
        )
      );
      return true;
    }
    return false;
  }
  function insertDefaultValueAssignmentForInitializer(statements, parameter, name, initializer) {
    initializer = Debug.checkDefined(visitNode(initializer, visitor, isExpression));
    const statement = factory2.createIfStatement(
      factory2.createTypeCheck(factory2.cloneNode(name), "undefined"),
      setEmitFlags(
        setTextRange(
          factory2.createBlock([
            factory2.createExpressionStatement(
              setEmitFlags(
                setTextRange(
                  factory2.createAssignment(
                    // TODO(rbuckton): Does this need to be parented?
                    setEmitFlags(setParent(setTextRange(factory2.cloneNode(name), name), name.parent), 96 /* NoSourceMap */),
                    setEmitFlags(initializer, 96 /* NoSourceMap */ | getEmitFlags(initializer) | 3072 /* NoComments */)
                  ),
                  parameter
                ),
                3072 /* NoComments */
              )
            )
          ]),
          parameter
        ),
        1 /* SingleLine */ | 64 /* NoTrailingSourceMap */ | 768 /* NoTokenSourceMaps */ | 3072 /* NoComments */
      )
    );
    startOnNewLine(statement);
    setTextRange(statement, parameter);
    setEmitFlags(statement, 768 /* NoTokenSourceMaps */ | 64 /* NoTrailingSourceMap */ | 2097152 /* CustomPrologue */ | 3072 /* NoComments */);
    insertStatementAfterCustomPrologue(statements, statement);
  }
  function shouldAddRestParameter(node, inConstructorWithSynthesizedSuper) {
    return !!(node && node.dotDotDotToken && !inConstructorWithSynthesizedSuper);
  }
  function addRestParameterIfNeeded(statements, node, inConstructorWithSynthesizedSuper) {
    const prologueStatements = [];
    const parameter = lastOrUndefined(node.parameters);
    if (!shouldAddRestParameter(parameter, inConstructorWithSynthesizedSuper)) {
      return false;
    }
    const declarationName = parameter.name.kind === 80 /* Identifier */ ? setParent(setTextRange(factory2.cloneNode(parameter.name), parameter.name), parameter.name.parent) : factory2.createTempVariable(
      /*recordTempVariable*/
      void 0
    );
    setEmitFlags(declarationName, 96 /* NoSourceMap */);
    const expressionName = parameter.name.kind === 80 /* Identifier */ ? factory2.cloneNode(parameter.name) : declarationName;
    const restIndex = node.parameters.length - 1;
    const temp = factory2.createLoopVariable();
    prologueStatements.push(
      setEmitFlags(
        setTextRange(
          factory2.createVariableStatement(
            /*modifiers*/
            void 0,
            factory2.createVariableDeclarationList([
              factory2.createVariableDeclaration(
                declarationName,
                /*exclamationToken*/
                void 0,
                /*type*/
                void 0,
                factory2.createArrayLiteralExpression([])
              )
            ])
          ),
          /*location*/
          parameter
        ),
        2097152 /* CustomPrologue */
      )
    );
    const forStatement = factory2.createForStatement(
      setTextRange(
        factory2.createVariableDeclarationList([
          factory2.createVariableDeclaration(
            temp,
            /*exclamationToken*/
            void 0,
            /*type*/
            void 0,
            factory2.createNumericLiteral(restIndex)
          )
        ]),
        parameter
      ),
      setTextRange(
        factory2.createLessThan(
          temp,
          factory2.createPropertyAccessExpression(factory2.createIdentifier("arguments"), "length")
        ),
        parameter
      ),
      setTextRange(factory2.createPostfixIncrement(temp), parameter),
      factory2.createBlock([
        startOnNewLine(
          setTextRange(
            factory2.createExpressionStatement(
              factory2.createAssignment(
                factory2.createElementAccessExpression(
                  expressionName,
                  restIndex === 0 ? temp : factory2.createSubtract(temp, factory2.createNumericLiteral(restIndex))
                ),
                factory2.createElementAccessExpression(factory2.createIdentifier("arguments"), temp)
              )
            ),
            /*location*/
            parameter
          )
        )
      ])
    );
    setEmitFlags(forStatement, 2097152 /* CustomPrologue */);
    startOnNewLine(forStatement);
    prologueStatements.push(forStatement);
    if (parameter.name.kind !== 80 /* Identifier */) {
      prologueStatements.push(
        setEmitFlags(
          setTextRange(
            factory2.createVariableStatement(
              /*modifiers*/
              void 0,
              factory2.createVariableDeclarationList(
                flattenDestructuringBinding(parameter, visitor, context, 0 /* All */, expressionName)
              )
            ),
            parameter
          ),
          2097152 /* CustomPrologue */
        )
      );
    }
    insertStatementsAfterCustomPrologue(statements, prologueStatements);
    return true;
  }
  function insertCaptureThisForNodeIfNeeded(statements, node) {
    if (hierarchyFacts & 65536 /* CapturedLexicalThis */ && node.kind !== 218 /* ArrowFunction */) {
      insertCaptureThisForNode(statements, node, factory2.createThis());
      return true;
    }
    return false;
  }
  function insertSuperThisCaptureThisForNode(statements, superExpression) {
    enableSubstitutionsForCapturedThis();
    const assignSuperExpression = factory2.createExpressionStatement(
      factory2.createBinaryExpression(
        factory2.createThis(),
        64 /* EqualsToken */,
        superExpression
      )
    );
    insertStatementAfterCustomPrologue(statements, assignSuperExpression);
    setCommentRange(assignSuperExpression, getOriginalNode(superExpression).parent);
  }
  function insertCaptureThisForNode(statements, node, initializer) {
    enableSubstitutionsForCapturedThis();
    const captureThisStatement = factory2.createVariableStatement(
      /*modifiers*/
      void 0,
      factory2.createVariableDeclarationList([
        factory2.createVariableDeclaration(
          factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */),
          /*exclamationToken*/
          void 0,
          /*type*/
          void 0,
          initializer
        )
      ])
    );
    setEmitFlags(captureThisStatement, 3072 /* NoComments */ | 2097152 /* CustomPrologue */);
    setSourceMapRange(captureThisStatement, node);
    insertStatementAfterCustomPrologue(statements, captureThisStatement);
  }
  function insertCaptureNewTargetIfNeeded(statements, node, copyOnWrite) {
    if (hierarchyFacts & 32768 /* NewTarget */) {
      let newTarget;
      switch (node.kind) {
        case 218 /* ArrowFunction */:
          return statements;
        case 173 /* MethodDeclaration */:
        case 176 /* GetAccessor */:
        case 177 /* SetAccessor */:
          newTarget = factory2.createVoidZero();
          break;
        case 175 /* Constructor */:
          newTarget = factory2.createPropertyAccessExpression(
            setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */),
            "constructor"
          );
          break;
        case 261 /* FunctionDeclaration */:
        case 217 /* FunctionExpression */:
          newTarget = factory2.createConditionalExpression(
            factory2.createLogicalAnd(
              setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */),
              factory2.createBinaryExpression(
                setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */),
                104 /* InstanceOfKeyword */,
                factory2.getLocalName(node)
              )
            ),
            /*questionToken*/
            void 0,
            factory2.createPropertyAccessExpression(
              setEmitFlags(factory2.createThis(), 8 /* NoSubstitution */),
              "constructor"
            ),
            /*colonToken*/
            void 0,
            factory2.createVoidZero()
          );
          break;
        default:
          return Debug.failBadSyntaxKind(node);
      }
      const captureNewTargetStatement = factory2.createVariableStatement(
        /*modifiers*/
        void 0,
        factory2.createVariableDeclarationList([
          factory2.createVariableDeclaration(
            factory2.createUniqueName("_newTarget", 16 /* Optimistic */ | 32 /* FileLevel */),
            /*exclamationToken*/
            void 0,
            /*type*/
            void 0,
            newTarget
          )
        ])
      );
      setEmitFlags(captureNewTargetStatement, 3072 /* NoComments */ | 2097152 /* CustomPrologue */);
      if (copyOnWrite) {
        statements = statements.slice();
      }
      insertStatementAfterCustomPrologue(statements, captureNewTargetStatement);
    }
    return statements;
  }
  function addClassMembers(statements, node) {
    for (const member of node.members) {
      switch (member.kind) {
        case 239 /* SemicolonClassElement */:
          statements.push(transformSemicolonClassElementToStatement(member));
          break;
        case 173 /* MethodDeclaration */:
          statements.push(transformClassMethodDeclarationToStatement(getClassMemberPrefix(node, member), member, node));
          break;
        case 176 /* GetAccessor */:
        case 177 /* SetAccessor */:
          const accessors = getAllAccessorDeclarations(node.members, member);
          if (member === accessors.firstAccessor) {
            statements.push(transformAccessorsToStatement(getClassMemberPrefix(node, member), accessors, node));
          }
          break;
        case 175 /* Constructor */:
        case 174 /* ClassStaticBlockDeclaration */:
          break;
        default:
          Debug.failBadSyntaxKind(member, currentSourceFile && currentSourceFile.fileName);
          break;
      }
    }
  }
  function transformSemicolonClassElementToStatement(member) {
    return setTextRange(factory2.createEmptyStatement(), member);
  }
  function transformClassMethodDeclarationToStatement(receiver, member, container) {
    const commentRange = getCommentRange(member);
    const sourceMapRange = getSourceMapRange(member);
    const memberFunction = transformFunctionLikeToExpression(
      member,
      /*location*/
      member,
      /*name*/
      void 0,
      container
    );
    const propertyName = visitNode(member.name, visitor, isPropertyName);
    Debug.assert(propertyName);
    let e;
    if (!isPrivateIdentifier(propertyName) && getUseDefineForClassFields(context.getCompilerOptions())) {
      const name = isComputedPropertyName(propertyName) ? propertyName.expression : isIdentifier(propertyName) ? factory2.createStringLiteral(unescapeLeadingUnderscores(propertyName.escapedText)) : propertyName;
      e = factory2.createObjectDefinePropertyCall(receiver, name, factory2.createPropertyDescriptor({ value: memberFunction, enumerable: false, writable: true, configurable: true }));
    } else {
      const memberName = createMemberAccessForPropertyName(
        factory2,
        receiver,
        propertyName,
        /*location*/
        member.name
      );
      e = factory2.createAssignment(memberName, memberFunction);
    }
    setEmitFlags(memberFunction, 3072 /* NoComments */);
    setSourceMapRange(memberFunction, sourceMapRange);
    const statement = setTextRange(
      factory2.createExpressionStatement(e),
      /*location*/
      member
    );
    setOriginalNode(statement, member);
    setCommentRange(statement, commentRange);
    setEmitFlags(statement, 96 /* NoSourceMap */);
    return statement;
  }
  function transformAccessorsToStatement(receiver, accessors, container) {
    const statement = factory2.createExpressionStatement(transformAccessorsToExpression(
      receiver,
      accessors,
      container,
      /*startsOnNewLine*/
      false
    ));
    setEmitFlags(statement, 3072 /* NoComments */);
    setSourceMapRange(statement, getSourceMapRange(accessors.firstAccessor));
    return statement;
  }
  function transformAccessorsToExpression(receiver, { firstAccessor, getAccessor, setAccessor }, container, startsOnNewLine) {
    const target = setParent(setTextRange(factory2.cloneNode(receiver), receiver), receiver.parent);
    setEmitFlags(target, 3072 /* NoComments */ | 64 /* NoTrailingSourceMap */);
    setSourceMapRange(target, firstAccessor.name);
    const visitedAccessorName = visitNode(firstAccessor.name, visitor, isPropertyName);
    Debug.assert(visitedAccessorName);
    if (isPrivateIdentifier(visitedAccessorName)) {
      return Debug.failBadSyntaxKind(visitedAccessorName, "Encountered unhandled private identifier while transforming ES2015.");
    }
    const propertyName = createExpressionForPropertyName(factory2, visitedAccessorName);
    setEmitFlags(propertyName, 3072 /* NoComments */ | 32 /* NoLeadingSourceMap */);
    setSourceMapRange(propertyName, firstAccessor.name);
    const properties = [];
    if (getAccessor) {
      const getterFunction = transformFunctionLikeToExpression(
        getAccessor,
        /*location*/
        void 0,
        /*name*/
        void 0,
        container
      );
      setSourceMapRange(getterFunction, getSourceMapRange(getAccessor));
      setEmitFlags(getterFunction, 1024 /* NoLeadingComments */);
      const getter = factory2.createPropertyAssignment("get", getterFunction);
      setCommentRange(getter, getCommentRange(getAccessor));
      properties.push(getter);
    }
    if (setAccessor) {
      const setterFunction = transformFunctionLikeToExpression(
        setAccessor,
        /*location*/
        void 0,
        /*name*/
        void 0,
        container
      );
      setSourceMapRange(setterFunction, getSourceMapRange(setAccessor));
      setEmitFlags(setterFunction, 1024 /* NoLeadingComments */);
      const setter = factory2.createPropertyAssignment("set", setterFunction);
      setCommentRange(setter, getCommentRange(setAccessor));
      properties.push(setter);
    }
    properties.push(
      factory2.createPropertyAssignment("enumerable", getAccessor || setAccessor ? factory2.createFalse() : factory2.createTrue()),
      factory2.createPropertyAssignment("configurable", factory2.createTrue())
    );
    const call = factory2.createCallExpression(
      factory2.createPropertyAccessExpression(factory2.createIdentifier("Object"), "defineProperty"),
      /*typeArguments*/
      void 0,
      [
        target,
        propertyName,
        factory2.createObjectLiteralExpression(
          properties,
          /*multiLine*/
          true
        )
      ]
    );
    if (startsOnNewLine) {
      startOnNewLine(call);
    }
    return call;
  }
  function visitArrowFunction(node) {
    if (node.transformFlags & 16384 /* ContainsLexicalThis */ && !(hierarchyFacts & 16384 /* StaticInitializer */)) {
      hierarchyFacts |= 65536 /* CapturedLexicalThis */;
    }
    const savedConvertedLoopState = convertedLoopState;
    convertedLoopState = void 0;
    const ancestorFacts = enterSubtree(15232 /* ArrowFunctionExcludes */, 66 /* ArrowFunctionIncludes */);
    const func = factory2.createFunctionExpression(
      /*modifiers*/
      void 0,
      /*asteriskToken*/
      void 0,
      /*name*/
      void 0,
      /*typeParameters*/
      void 0,
      visitParameterList(node.parameters, visitor, context),
      /*type*/
      void 0,
      transformFunctionBody(node)
    );
    setTextRange(func, node);
    setOriginalNode(func, node);
    setEmitFlags(func, 16 /* CapturesThis */);
    exitSubtree(ancestorFacts, 0 /* ArrowFunctionSubtreeExcludes */, 0 /* None */);
    convertedLoopState = savedConvertedLoopState;
    return func;
  }
  function visitFunctionExpression(node) {
    const ancestorFacts = getEmitFlags(node) & 524288 /* AsyncFunctionBody */ ? enterSubtree(32662 /* AsyncFunctionBodyExcludes */, 69 /* AsyncFunctionBodyIncludes */) : enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */);
    const savedConvertedLoopState = convertedLoopState;
    convertedLoopState = void 0;
    const parameters = visitParameterList(node.parameters, visitor, context);
    const body = transformFunctionBody(node);
    const name = hierarchyFacts & 32768 /* NewTarget */ ? factory2.getLocalName(node) : node.name;
    exitSubtree(ancestorFacts, 98304 /* FunctionSubtreeExcludes */, 0 /* None */);
    convertedLoopState = savedConvertedLoopState;
    return factory2.updateFunctionExpression(
      node,
      /*modifiers*/
      void 0,
      node.asteriskToken,
      name,
      /*typeParameters*/
      void 0,
      parameters,
      /*type*/
      void 0,
      body
    );
  }
  function visitFunctionDeclaration(node) {
    const savedConvertedLoopState = convertedLoopState;
    convertedLoopState = void 0;
    const ancestorFacts = enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */);
    const parameters = visitParameterList(node.parameters, visitor, context);
    const body = transformFunctionBody(node);
    const name = hierarchyFacts & 32768 /* NewTarget */ ? factory2.getLocalName(node) : node.name;
    exitSubtree(ancestorFacts, 98304 /* FunctionSubtreeExcludes */, 0 /* None */);
    convertedLoopState = savedConvertedLoopState;
    return factory2.updateFunctionDeclaration(
      node,
      visitNodes2(node.modifiers, visitor, isModifier),
      node.asteriskToken,
      name,
      /*typeParameters*/
      void 0,
      parameters,
      /*type*/
      void 0,
      body
    );
  }
  function transformFunctionLikeToExpression(node, location, name, container) {
    const savedConvertedLoopState = convertedLoopState;
    convertedLoopState = void 0;
    const ancestorFacts = container && isClassLike(container) && !isStatic(node) ? enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */ | 8 /* NonStaticClassElement */) : enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */);
    const parameters = visitParameterList(node.parameters, visitor, context);
    const body = transformFunctionBody(node);
    if (hierarchyFacts & 32768 /* NewTarget */ && !name && (node.kind === 261 /* FunctionDeclaration */ || node.kind === 217 /* FunctionExpression */)) {
      name = factory2.getGeneratedNameForNode(node);
    }
    exitSubtree(ancestorFacts, 98304 /* FunctionSubtreeExcludes */, 0 /* None */);
    convertedLoopState = savedConvertedLoopState;
    return setOriginalNode(
      setTextRange(
        factory2.createFunctionExpression(
          /*modifiers*/
          void 0,
          node.asteriskToken,
          name,
          /*typeParameters*/
          void 0,
          parameters,
          /*type*/
          void 0,
          body
        ),
        location
      ),
      /*original*/
      node
    );
  }
  function transformFunctionBody(node) {
    let multiLine = false;
    let singleLine = false;
    let statementsLocation;
    let closeBraceLocation;
    const prologue = [];
    const statements = [];
    const body = node.body;
    let statementOffset;
    resumeLexicalEnvironment();
    if (isBlock(body)) {
      statementOffset = factory2.copyStandardPrologue(
        body.statements,
        prologue,
        0,
        /*ensureUseStrict*/
        false
      );
      statementOffset = factory2.copyCustomPrologue(body.statements, statements, statementOffset, visitor, isHoistedFunction);
      statementOffset = factory2.copyCustomPrologue(body.statements, statements, statementOffset, visitor, isHoistedVariableStatement);
    }
    multiLine = addDefaultValueAssignmentsIfNeeded2(statements, node) || multiLine;
    multiLine = addRestParameterIfNeeded(
      statements,
      node,
      /*inConstructorWithSynthesizedSuper*/
      false
    ) || multiLine;
    if (isBlock(body)) {
      statementOffset = factory2.copyCustomPrologue(body.statements, statements, statementOffset, visitor);
      statementsLocation = body.statements;
      addRange(statements, visitNodes2(body.statements, visitor, isStatement, statementOffset));
      if (!multiLine && body.multiLine) {
        multiLine = true;
      }
    } else {
      Debug.assert(node.kind === 218 /* ArrowFunction */);
      statementsLocation = moveRangeEnd(body, -1);
      const equalsGreaterThanToken = node.equalsGreaterThanToken;
      if (!nodeIsSynthesized(equalsGreaterThanToken) && !nodeIsSynthesized(body)) {
        if (rangeEndIsOnSameLineAsRangeStart(equalsGreaterThanToken, body, currentSourceFile)) {
          singleLine = true;
        } else {
          multiLine = true;
        }
      }
      const expression = visitNode(body, visitor, isExpression);
      const returnStatement = factory2.createReturnStatement(expression);
      setTextRange(returnStatement, body);
      moveSyntheticComments(returnStatement, body);
      setEmitFlags(returnStatement, 768 /* NoTokenSourceMaps */ | 64 /* NoTrailingSourceMap */ | 2048 /* NoTrailingComments */);
      statements.push(returnStatement);
      closeBraceLocation = body;
    }
    factory2.mergeLexicalEnvironment(prologue, endLexicalEnvironment());
    insertCaptureNewTargetIfNeeded(
      prologue,
      node,
      /*copyOnWrite*/
      false
    );
    insertCaptureThisForNodeIfNeeded(prologue, node);
    if (some(prologue)) {
      multiLine = true;
    }
    statements.unshift(...prologue);
    if (isBlock(body) && arrayIsEqualTo(statements, body.statements)) {
      return body;
    }
    const block = factory2.createBlock(setTextRange(factory2.createNodeArray(statements), statementsLocation), multiLine);
    setTextRange(block, node.body);
    if (!multiLine && singleLine) {
      setEmitFlags(block, 1 /* SingleLine */);
    }
    if (closeBraceLocation) {
      setTokenSourceMapRange(block, 20 /* CloseBraceToken */, closeBraceLocation);
    }
    setOriginalNode(block, node.body);
    return block;
  }
  function visitBlock(node, isFunctionBody) {
    if (isFunctionBody) {
      return visitEachChild(node, visitor, context);
    }
    const ancestorFacts = hierarchyFacts & 256 /* IterationStatement */ ? enterSubtree(7104 /* IterationStatementBlockExcludes */, 512 /* IterationStatementBlockIncludes */) : enterSubtree(6976 /* BlockExcludes */, 128 /* BlockIncludes */);
    const updated = visitEachChild(node, visitor, context);
    exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
    return updated;
  }
  function visitExpressionStatement(node) {
    return visitEachChild(node, visitorWithUnusedExpressionResult, context);
  }
  function visitParenthesizedExpression(node, expressionResultIsUnused2) {
    return visitEachChild(node, expressionResultIsUnused2 ? visitorWithUnusedExpressionResult : visitor, context);
  }
  function visitBinaryExpression(node, expressionResultIsUnused2) {
    if (isDestructuringAssignment(node)) {
      return flattenDestructuringAssignment(
        node,
        visitor,
        context,
        0 /* All */,
        !expressionResultIsUnused2
      );
    }
    if (node.operatorToken.kind === 28 /* CommaToken */) {
      return factory2.updateBinaryExpression(
        node,
        Debug.checkDefined(visitNode(node.left, visitorWithUnusedExpressionResult, isExpression)),
        node.operatorToken,
        Debug.checkDefined(visitNode(node.right, expressionResultIsUnused2 ? visitorWithUnusedExpressionResult : visitor, isExpression))
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitCommaListExpression(node, expressionResultIsUnused2) {
    if (expressionResultIsUnused2) {
      return visitEachChild(node, visitorWithUnusedExpressionResult, context);
    }
    let result;
    for (let i = 0; i < node.elements.length; i++) {
      const element = node.elements[i];
      const visited = visitNode(element, i < node.elements.length - 1 ? visitorWithUnusedExpressionResult : visitor, isExpression);
      if (result || visited !== element) {
        result || (result = node.elements.slice(0, i));
        Debug.assert(visited);
        result.push(visited);
      }
    }
    const elements = result ? setTextRange(factory2.createNodeArray(result), node.elements) : node.elements;
    return factory2.updateCommaListExpression(node, elements);
  }
  function isVariableStatementOfTypeScriptClassWrapper(node) {
    return node.declarationList.declarations.length === 1 && !!node.declarationList.declarations[0].initializer && !!(getInternalEmitFlags(node.declarationList.declarations[0].initializer) & 1 /* TypeScriptClassWrapper */);
  }
  function visitVariableStatement(node) {
    const ancestorFacts = enterSubtree(0 /* None */, hasSyntacticModifier(node, 1 /* Export */) ? 32 /* ExportedVariableStatement */ : 0 /* None */);
    let updated;
    if (convertedLoopState && (node.declarationList.flags & 3 /* BlockScoped */) === 0 && !isVariableStatementOfTypeScriptClassWrapper(node)) {
      let assignments;
      for (const decl of node.declarationList.declarations) {
        hoistVariableDeclarationDeclaredInConvertedLoop(convertedLoopState, decl);
        if (decl.initializer) {
          let assignment;
          if (isBindingPattern(decl.name)) {
            assignment = flattenDestructuringAssignment(
              decl,
              visitor,
              context,
              0 /* All */
            );
          } else {
            assignment = factory2.createBinaryExpression(decl.name, 64 /* EqualsToken */, Debug.checkDefined(visitNode(decl.initializer, visitor, isExpression)));
            setTextRange(assignment, decl);
          }
          assignments = append(assignments, assignment);
        }
      }
      if (assignments) {
        updated = setTextRange(factory2.createExpressionStatement(factory2.inlineExpressions(assignments)), node);
      } else {
        updated = void 0;
      }
    } else {
      updated = visitEachChild(node, visitor, context);
    }
    exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
    return updated;
  }
  function visitVariableDeclarationList(node) {
    if (node.flags & 3 /* BlockScoped */ || node.transformFlags & 524288 /* ContainsBindingPattern */) {
      if (node.flags & 3 /* BlockScoped */) {
        enableSubstitutionsForBlockScopedBindings();
      }
      const declarations = visitNodes2(node.declarations, node.flags & 1 /* Let */ ? visitVariableDeclarationInLetDeclarationList : visitVariableDeclaration, isVariableDeclaration);
      const declarationList = factory2.createVariableDeclarationList(declarations);
      setOriginalNode(declarationList, node);
      setTextRange(declarationList, node);
      setCommentRange(declarationList, node);
      if (node.transformFlags & 524288 /* ContainsBindingPattern */ && (isBindingPattern(node.declarations[0].name) || isBindingPattern(last(node.declarations).name))) {
        setSourceMapRange(declarationList, getRangeUnion(declarations));
      }
      return declarationList;
    }
    return visitEachChild(node, visitor, context);
  }
  function getRangeUnion(declarations) {
    let pos = -1, end = -1;
    for (const node of declarations) {
      pos = pos === -1 ? node.pos : node.pos === -1 ? pos : Math.min(pos, node.pos);
      end = Math.max(end, node.end);
    }
    return createRange(pos, end);
  }
  function shouldEmitExplicitInitializerForLetDeclaration(node) {
    const flags = resolver.getNodeCheckFlags(node);
    const isCapturedInFunction = flags & 16384 /* CapturedBlockScopedBinding */;
    const isDeclaredInLoop = flags & 32768 /* BlockScopedBindingInLoop */;
    const emittedAsTopLevel = (hierarchyFacts & 64 /* TopLevel */) !== 0 || isCapturedInFunction && isDeclaredInLoop && (hierarchyFacts & 512 /* IterationStatementBlock */) !== 0;
    const emitExplicitInitializer = !emittedAsTopLevel && (hierarchyFacts & 4096 /* ForInOrForOfStatement */) === 0 && (!resolver.isDeclarationWithCollidingName(node) || isDeclaredInLoop && !isCapturedInFunction && (hierarchyFacts & (2048 /* ForStatement */ | 4096 /* ForInOrForOfStatement */)) === 0);
    return emitExplicitInitializer;
  }
  function visitVariableDeclarationInLetDeclarationList(node) {
    const name = node.name;
    if (isBindingPattern(name)) {
      return visitVariableDeclaration(node);
    }
    if (!node.initializer && shouldEmitExplicitInitializerForLetDeclaration(node)) {
      return factory2.updateVariableDeclaration(
        node,
        node.name,
        /*exclamationToken*/
        void 0,
        /*type*/
        void 0,
        factory2.createVoidZero()
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitVariableDeclaration(node) {
    const ancestorFacts = enterSubtree(32 /* ExportedVariableStatement */, 0 /* None */);
    let updated;
    if (isBindingPattern(node.name)) {
      updated = flattenDestructuringBinding(
        node,
        visitor,
        context,
        0 /* All */,
        /*rval*/
        void 0,
        (ancestorFacts & 32 /* ExportedVariableStatement */) !== 0
      );
    } else {
      updated = visitEachChild(node, visitor, context);
    }
    exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
    return updated;
  }
  function recordLabel(node) {
    convertedLoopState.labels.set(idText(node.label), true);
  }
  function resetLabel(node) {
    convertedLoopState.labels.set(idText(node.label), false);
  }
  function visitLabeledStatement(node) {
    if (convertedLoopState && !convertedLoopState.labels) {
      convertedLoopState.labels = /* @__PURE__ */ new Map();
    }
    const statement = unwrapInnermostStatementOfLabel(node, convertedLoopState && recordLabel);
    return isIterationStatement(
      statement,
      /*lookInLabeledStatements*/
      false
    ) ? visitIterationStatement(
      statement,
      /*outermostLabeledStatement*/
      node
    ) : factory2.restoreEnclosingLabel(Debug.checkDefined(visitNode(statement, visitor, isStatement, factory2.liftToBlock)), node, convertedLoopState && resetLabel);
  }
  function visitIterationStatement(node, outermostLabeledStatement) {
    switch (node.kind) {
      case 245 /* DoStatement */:
      case 246 /* WhileStatement */:
        return visitDoOrWhileStatement(node, outermostLabeledStatement);
      case 247 /* ForStatement */:
        return visitForStatement(node, outermostLabeledStatement);
      case 248 /* ForInStatement */:
        return visitForInStatement(node, outermostLabeledStatement);
      case 249 /* ForOfStatement */:
        return visitForOfStatement(node, outermostLabeledStatement);
    }
  }
  function visitIterationStatementWithFacts(excludeFacts, includeFacts, node, outermostLabeledStatement, convert) {
    const ancestorFacts = enterSubtree(excludeFacts, includeFacts);
    const updated = convertIterationStatementBodyIfNecessary(node, outermostLabeledStatement, ancestorFacts, convert);
    exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
    return updated;
  }
  function visitDoOrWhileStatement(node, outermostLabeledStatement) {
    return visitIterationStatementWithFacts(
      0 /* DoOrWhileStatementExcludes */,
      1280 /* DoOrWhileStatementIncludes */,
      node,
      outermostLabeledStatement
    );
  }
  function visitForStatement(node, outermostLabeledStatement) {
    return visitIterationStatementWithFacts(
      5056 /* ForStatementExcludes */,
      3328 /* ForStatementIncludes */,
      node,
      outermostLabeledStatement
    );
  }
  function visitEachChildOfForStatement2(node) {
    return factory2.updateForStatement(
      node,
      visitNode(node.initializer, visitorWithUnusedExpressionResult, isForInitializer),
      visitNode(node.condition, visitor, isExpression),
      visitNode(node.incrementor, visitorWithUnusedExpressionResult, isExpression),
      Debug.checkDefined(visitNode(node.statement, visitor, isStatement, factory2.liftToBlock))
    );
  }
  function visitForInStatement(node, outermostLabeledStatement) {
    return visitIterationStatementWithFacts(
      3008 /* ForInOrForOfStatementExcludes */,
      5376 /* ForInOrForOfStatementIncludes */,
      node,
      outermostLabeledStatement
    );
  }
  function visitForOfStatement(node, outermostLabeledStatement) {
    return visitIterationStatementWithFacts(
      3008 /* ForInOrForOfStatementExcludes */,
      5376 /* ForInOrForOfStatementIncludes */,
      node,
      outermostLabeledStatement,
      compilerOptions.downlevelIteration ? convertForOfStatementForIterable : convertForOfStatementForArray
    );
  }
  function convertForOfStatementHead(node, boundValue, convertedLoopBodyStatements) {
    const statements = [];
    const initializer = node.initializer;
    if (isVariableDeclarationList(initializer)) {
      if (node.initializer.flags & 3 /* BlockScoped */) {
        enableSubstitutionsForBlockScopedBindings();
      }
      const firstOriginalDeclaration = firstOrUndefined(initializer.declarations);
      if (firstOriginalDeclaration && isBindingPattern(firstOriginalDeclaration.name)) {
        const declarations = flattenDestructuringBinding(
          firstOriginalDeclaration,
          visitor,
          context,
          0 /* All */,
          boundValue
        );
        const declarationList = setTextRange(factory2.createVariableDeclarationList(declarations), node.initializer);
        setOriginalNode(declarationList, node.initializer);
        setSourceMapRange(declarationList, createRange(declarations[0].pos, last(declarations).end));
        statements.push(
          factory2.createVariableStatement(
            /*modifiers*/
            void 0,
            declarationList
          )
        );
      } else {
        statements.push(
          setTextRange(
            factory2.createVariableStatement(
              /*modifiers*/
              void 0,
              setOriginalNode(
                setTextRange(
                  factory2.createVariableDeclarationList([
                    factory2.createVariableDeclaration(
                      firstOriginalDeclaration ? firstOriginalDeclaration.name : factory2.createTempVariable(
                        /*recordTempVariable*/
                        void 0
                      ),
                      /*exclamationToken*/
                      void 0,
                      /*type*/
                      void 0,
                      boundValue
                    )
                  ]),
                  moveRangePos(initializer, -1)
                ),
                initializer
              )
            ),
            moveRangeEnd(initializer, -1)
          )
        );
      }
    } else {
      const assignment = factory2.createAssignment(initializer, boundValue);
      if (isDestructuringAssignment(assignment)) {
        statements.push(factory2.createExpressionStatement(visitBinaryExpression(
          assignment,
          /*expressionResultIsUnused*/
          true
        )));
      } else {
        setTextRangeEnd(assignment, initializer.end);
        statements.push(setTextRange(factory2.createExpressionStatement(Debug.checkDefined(visitNode(assignment, visitor, isExpression))), moveRangeEnd(initializer, -1)));
      }
    }
    if (convertedLoopBodyStatements) {
      return createSyntheticBlockForConvertedStatements(addRange(statements, convertedLoopBodyStatements));
    } else {
      const statement = visitNode(node.statement, visitor, isStatement, factory2.liftToBlock);
      Debug.assert(statement);
      if (isBlock(statement)) {
        return factory2.updateBlock(statement, setTextRange(factory2.createNodeArray(concatenate(statements, statement.statements)), statement.statements));
      } else {
        statements.push(statement);
        return createSyntheticBlockForConvertedStatements(statements);
      }
    }
  }
  function createSyntheticBlockForConvertedStatements(statements) {
    return setEmitFlags(
      factory2.createBlock(
        factory2.createNodeArray(statements),
        /*multiLine*/
        true
      ),
      96 /* NoSourceMap */ | 768 /* NoTokenSourceMaps */
    );
  }
  function convertForOfStatementForArray(node, outermostLabeledStatement, convertedLoopBodyStatements) {
    const expression = visitNode(node.expression, visitor, isExpression);
    Debug.assert(expression);
    const counter = factory2.createLoopVariable();
    const rhsReference = isIdentifier(expression) ? factory2.getGeneratedNameForNode(expression) : factory2.createTempVariable(
      /*recordTempVariable*/
      void 0
    );
    setEmitFlags(expression, 96 /* NoSourceMap */ | getEmitFlags(expression));
    const forStatement = setTextRange(
      factory2.createForStatement(
        /*initializer*/
        setEmitFlags(
          setTextRange(
            factory2.createVariableDeclarationList([
              setTextRange(factory2.createVariableDeclaration(
                counter,
                /*exclamationToken*/
                void 0,
                /*type*/
                void 0,
                factory2.createNumericLiteral(0)
              ), moveRangePos(node.expression, -1)),
              setTextRange(factory2.createVariableDeclaration(
                rhsReference,
                /*exclamationToken*/
                void 0,
                /*type*/
                void 0,
                expression
              ), node.expression)
            ]),
            node.expression
          ),
          4194304 /* NoHoisting */
        ),
        /*condition*/
        setTextRange(
          factory2.createLessThan(
            counter,
            factory2.createPropertyAccessExpression(rhsReference, "length")
          ),
          node.expression
        ),
        /*incrementor*/
        setTextRange(factory2.createPostfixIncrement(counter), node.expression),
        /*statement*/
        convertForOfStatementHead(
          node,
          factory2.createElementAccessExpression(rhsReference, counter),
          convertedLoopBodyStatements
        )
      ),
      /*location*/
      node
    );
    setEmitFlags(forStatement, 512 /* NoTokenTrailingSourceMaps */);
    setTextRange(forStatement, node);
    return factory2.restoreEnclosingLabel(forStatement, outermostLabeledStatement, convertedLoopState && resetLabel);
  }
  function convertForOfStatementForIterable(node, outermostLabeledStatement, convertedLoopBodyStatements, ancestorFacts) {
    const expression = visitNode(node.expression, visitor, isExpression);
    Debug.assert(expression);
    const iterator = isIdentifier(expression) ? factory2.getGeneratedNameForNode(expression) : factory2.createTempVariable(
      /*recordTempVariable*/
      void 0
    );
    const result = isIdentifier(expression) ? factory2.getGeneratedNameForNode(iterator) : factory2.createTempVariable(
      /*recordTempVariable*/
      void 0
    );
    const errorRecord = factory2.createUniqueName("e");
    const catchVariable = factory2.getGeneratedNameForNode(errorRecord);
    const returnMethod = factory2.createTempVariable(
      /*recordTempVariable*/
      void 0
    );
    const values = setTextRange(emitHelpers().createValuesHelper(expression), node.expression);
    const next = factory2.createCallExpression(
      factory2.createPropertyAccessExpression(iterator, "next"),
      /*typeArguments*/
      void 0,
      []
    );
    hoistVariableDeclaration(errorRecord);
    hoistVariableDeclaration(returnMethod);
    const initializer = ancestorFacts & 1024 /* IterationContainer */ ? factory2.inlineExpressions([factory2.createAssignment(errorRecord, factory2.createVoidZero()), values]) : values;
    const forStatement = setEmitFlags(
      setTextRange(
        factory2.createForStatement(
          /*initializer*/
          setEmitFlags(
            setTextRange(
              factory2.createVariableDeclarationList([
                setTextRange(factory2.createVariableDeclaration(
                  iterator,
                  /*exclamationToken*/
                  void 0,
                  /*type*/
                  void 0,
                  initializer
                ), node.expression),
                factory2.createVariableDeclaration(
                  result,
                  /*exclamationToken*/
                  void 0,
                  /*type*/
                  void 0,
                  next
                )
              ]),
              node.expression
            ),
            4194304 /* NoHoisting */
          ),
          /*condition*/
          factory2.createLogicalNot(factory2.createPropertyAccessExpression(result, "done")),
          /*incrementor*/
          factory2.createAssignment(result, next),
          /*statement*/
          convertForOfStatementHead(
            node,
            factory2.createPropertyAccessExpression(result, "value"),
            convertedLoopBodyStatements
          )
        ),
        /*location*/
        node
      ),
      512 /* NoTokenTrailingSourceMaps */
    );
    return factory2.createTryStatement(
      factory2.createBlock([
        factory2.restoreEnclosingLabel(
          forStatement,
          outermostLabeledStatement,
          convertedLoopState && resetLabel
        )
      ]),
      factory2.createCatchClause(
        factory2.createVariableDeclaration(catchVariable),
        setEmitFlags(
          factory2.createBlock([
            factory2.createExpressionStatement(
              factory2.createAssignment(
                errorRecord,
                factory2.createObjectLiteralExpression([
                  factory2.createPropertyAssignment("error", catchVariable)
                ])
              )
            )
          ]),
          1 /* SingleLine */
        )
      ),
      factory2.createBlock([
        factory2.createTryStatement(
          /*tryBlock*/
          factory2.createBlock([
            setEmitFlags(
              factory2.createIfStatement(
                factory2.createLogicalAnd(
                  factory2.createLogicalAnd(
                    result,
                    factory2.createLogicalNot(
                      factory2.createPropertyAccessExpression(result, "done")
                    )
                  ),
                  factory2.createAssignment(
                    returnMethod,
                    factory2.createPropertyAccessExpression(iterator, "return")
                  )
                ),
                factory2.createExpressionStatement(
                  factory2.createFunctionCallCall(returnMethod, iterator, [])
                )
              ),
              1 /* SingleLine */
            )
          ]),
          /*catchClause*/
          void 0,
          /*finallyBlock*/
          setEmitFlags(
            factory2.createBlock([
              setEmitFlags(
                factory2.createIfStatement(
                  errorRecord,
                  factory2.createThrowStatement(
                    factory2.createPropertyAccessExpression(errorRecord, "error")
                  )
                ),
                1 /* SingleLine */
              )
            ]),
            1 /* SingleLine */
          )
        )
      ])
    );
  }
  function visitObjectLiteralExpression(node) {
    const properties = node.properties;
    let numInitialProperties = -1, hasComputed = false;
    for (let i = 0; i < properties.length; i++) {
      const property = properties[i];
      if (property.transformFlags & 1048576 /* ContainsYield */ && hierarchyFacts & 4 /* AsyncFunctionBody */ || (hasComputed = Debug.checkDefined(property.name).kind === 166 /* ComputedPropertyName */)) {
        numInitialProperties = i;
        break;
      }
    }
    if (numInitialProperties < 0) {
      return visitEachChild(node, visitor, context);
    }
    const temp = factory2.createTempVariable(hoistVariableDeclaration);
    const expressions = [];
    const assignment = factory2.createAssignment(
      temp,
      setEmitFlags(
        factory2.createObjectLiteralExpression(
          visitNodes2(properties, visitor, isObjectLiteralElementLike, 0, numInitialProperties),
          node.multiLine
        ),
        hasComputed ? 131072 /* Indented */ : 0
      )
    );
    if (node.multiLine) {
      startOnNewLine(assignment);
    }
    expressions.push(assignment);
    addObjectLiteralMembers(expressions, node, temp, numInitialProperties);
    expressions.push(node.multiLine ? startOnNewLine(setParent(setTextRange(factory2.cloneNode(temp), temp), temp.parent)) : temp);
    return factory2.inlineExpressions(expressions);
  }
  function shouldConvertPartOfIterationStatement(node) {
    return (resolver.getNodeCheckFlags(node) & 8192 /* ContainsCapturedBlockScopeBinding */) !== 0;
  }
  function shouldConvertInitializerOfForStatement(node) {
    return isForStatement(node) && !!node.initializer && shouldConvertPartOfIterationStatement(node.initializer);
  }
  function shouldConvertConditionOfForStatement(node) {
    return isForStatement(node) && !!node.condition && shouldConvertPartOfIterationStatement(node.condition);
  }
  function shouldConvertIncrementorOfForStatement(node) {
    return isForStatement(node) && !!node.incrementor && shouldConvertPartOfIterationStatement(node.incrementor);
  }
  function shouldConvertIterationStatement(node) {
    return shouldConvertBodyOfIterationStatement(node) || shouldConvertInitializerOfForStatement(node);
  }
  function shouldConvertBodyOfIterationStatement(node) {
    return (resolver.getNodeCheckFlags(node) & 4096 /* LoopWithCapturedBlockScopedBinding */) !== 0;
  }
  function hoistVariableDeclarationDeclaredInConvertedLoop(state, node) {
    if (!state.hoistedLocalVariables) {
      state.hoistedLocalVariables = [];
    }
    visit(node.name);
    function visit(node2) {
      if (node2.kind === 80 /* Identifier */) {
        state.hoistedLocalVariables.push(node2);
      } else {
        for (const element of node2.elements) {
          if (!isOmittedExpression(element)) {
            visit(element.name);
          }
        }
      }
    }
  }
  function convertIterationStatementBodyIfNecessary(node, outermostLabeledStatement, ancestorFacts, convert) {
    if (!shouldConvertIterationStatement(node)) {
      let saveAllowedNonLabeledJumps;
      if (convertedLoopState) {
        saveAllowedNonLabeledJumps = convertedLoopState.allowedNonLabeledJumps;
        convertedLoopState.allowedNonLabeledJumps = 2 /* Break */ | 4 /* Continue */;
      }
      const result = convert ? convert(
        node,
        outermostLabeledStatement,
        /*convertedLoopBodyStatements*/
        void 0,
        ancestorFacts
      ) : factory2.restoreEnclosingLabel(
        isForStatement(node) ? visitEachChildOfForStatement2(node) : visitEachChild(node, visitor, context),
        outermostLabeledStatement,
        convertedLoopState && resetLabel
      );
      if (convertedLoopState) {
        convertedLoopState.allowedNonLabeledJumps = saveAllowedNonLabeledJumps;
      }
      return result;
    }
    const currentState = createConvertedLoopState(node);
    const statements = [];
    const outerConvertedLoopState = convertedLoopState;
    convertedLoopState = currentState;
    const initializerFunction = shouldConvertInitializerOfForStatement(node) ? createFunctionForInitializerOfForStatement(node, currentState) : void 0;
    const bodyFunction = shouldConvertBodyOfIterationStatement(node) ? createFunctionForBodyOfIterationStatement(node, currentState, outerConvertedLoopState) : void 0;
    convertedLoopState = outerConvertedLoopState;
    if (initializerFunction)
      statements.push(initializerFunction.functionDeclaration);
    if (bodyFunction)
      statements.push(bodyFunction.functionDeclaration);
    addExtraDeclarationsForConvertedLoop(statements, currentState, outerConvertedLoopState);
    if (initializerFunction) {
      statements.push(generateCallToConvertedLoopInitializer(initializerFunction.functionName, initializerFunction.containsYield));
    }
    let loop;
    if (bodyFunction) {
      if (convert) {
        loop = convert(node, outermostLabeledStatement, bodyFunction.part, ancestorFacts);
      } else {
        const clone2 = convertIterationStatementCore(node, initializerFunction, factory2.createBlock(
          bodyFunction.part,
          /*multiLine*/
          true
        ));
        loop = factory2.restoreEnclosingLabel(clone2, outermostLabeledStatement, convertedLoopState && resetLabel);
      }
    } else {
      const clone2 = convertIterationStatementCore(node, initializerFunction, Debug.checkDefined(visitNode(node.statement, visitor, isStatement, factory2.liftToBlock)));
      loop = factory2.restoreEnclosingLabel(clone2, outermostLabeledStatement, convertedLoopState && resetLabel);
    }
    statements.push(loop);
    return statements;
  }
  function convertIterationStatementCore(node, initializerFunction, convertedLoopBody) {
    switch (node.kind) {
      case 247 /* ForStatement */:
        return convertForStatement(node, initializerFunction, convertedLoopBody);
      case 248 /* ForInStatement */:
        return convertForInStatement(node, convertedLoopBody);
      case 249 /* ForOfStatement */:
        return convertForOfStatement(node, convertedLoopBody);
      case 245 /* DoStatement */:
        return convertDoStatement(node, convertedLoopBody);
      case 246 /* WhileStatement */:
        return convertWhileStatement(node, convertedLoopBody);
      default:
        return Debug.failBadSyntaxKind(node, "IterationStatement expected");
    }
  }
  function convertForStatement(node, initializerFunction, convertedLoopBody) {
    const shouldConvertCondition = node.condition && shouldConvertPartOfIterationStatement(node.condition);
    const shouldConvertIncrementor = shouldConvertCondition || node.incrementor && shouldConvertPartOfIterationStatement(node.incrementor);
    return factory2.updateForStatement(
      node,
      visitNode(initializerFunction ? initializerFunction.part : node.initializer, visitorWithUnusedExpressionResult, isForInitializer),
      visitNode(shouldConvertCondition ? void 0 : node.condition, visitor, isExpression),
      visitNode(shouldConvertIncrementor ? void 0 : node.incrementor, visitorWithUnusedExpressionResult, isExpression),
      convertedLoopBody
    );
  }
  function convertForOfStatement(node, convertedLoopBody) {
    return factory2.updateForOfStatement(
      node,
      /*awaitModifier*/
      void 0,
      Debug.checkDefined(visitNode(node.initializer, visitor, isForInitializer)),
      Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
      convertedLoopBody
    );
  }
  function convertForInStatement(node, convertedLoopBody) {
    return factory2.updateForInStatement(
      node,
      Debug.checkDefined(visitNode(node.initializer, visitor, isForInitializer)),
      Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
      convertedLoopBody
    );
  }
  function convertDoStatement(node, convertedLoopBody) {
    return factory2.updateDoStatement(
      node,
      convertedLoopBody,
      Debug.checkDefined(visitNode(node.expression, visitor, isExpression))
    );
  }
  function convertWhileStatement(node, convertedLoopBody) {
    return factory2.updateWhileStatement(
      node,
      Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
      convertedLoopBody
    );
  }
  function createConvertedLoopState(node) {
    let loopInitializer;
    switch (node.kind) {
      case 247 /* ForStatement */:
      case 248 /* ForInStatement */:
      case 249 /* ForOfStatement */:
        const initializer = node.initializer;
        if (initializer && initializer.kind === 260 /* VariableDeclarationList */) {
          loopInitializer = initializer;
        }
        break;
    }
    const loopParameters = [];
    const loopOutParameters = [];
    if (loopInitializer && getCombinedNodeFlags(loopInitializer) & 3 /* BlockScoped */) {
      const hasCapturedBindingsInForHead = shouldConvertInitializerOfForStatement(node) || shouldConvertConditionOfForStatement(node) || shouldConvertIncrementorOfForStatement(node);
      for (const decl of loopInitializer.declarations) {
        processLoopVariableDeclaration(node, decl, loopParameters, loopOutParameters, hasCapturedBindingsInForHead);
      }
    }
    const currentState = { loopParameters, loopOutParameters };
    if (convertedLoopState) {
      if (convertedLoopState.argumentsName) {
        currentState.argumentsName = convertedLoopState.argumentsName;
      }
      if (convertedLoopState.thisName) {
        currentState.thisName = convertedLoopState.thisName;
      }
      if (convertedLoopState.hoistedLocalVariables) {
        currentState.hoistedLocalVariables = convertedLoopState.hoistedLocalVariables;
      }
    }
    return currentState;
  }
  function addExtraDeclarationsForConvertedLoop(statements, state, outerState) {
    let extraVariableDeclarations;
    if (state.argumentsName) {
      if (outerState) {
        outerState.argumentsName = state.argumentsName;
      } else {
        (extraVariableDeclarations || (extraVariableDeclarations = [])).push(
          factory2.createVariableDeclaration(
            state.argumentsName,
            /*exclamationToken*/
            void 0,
            /*type*/
            void 0,
            factory2.createIdentifier("arguments")
          )
        );
      }
    }
    if (state.thisName) {
      if (outerState) {
        outerState.thisName = state.thisName;
      } else {
        (extraVariableDeclarations || (extraVariableDeclarations = [])).push(
          factory2.createVariableDeclaration(
            state.thisName,
            /*exclamationToken*/
            void 0,
            /*type*/
            void 0,
            factory2.createIdentifier("this")
          )
        );
      }
    }
    if (state.hoistedLocalVariables) {
      if (outerState) {
        outerState.hoistedLocalVariables = state.hoistedLocalVariables;
      } else {
        if (!extraVariableDeclarations) {
          extraVariableDeclarations = [];
        }
        for (const identifier of state.hoistedLocalVariables) {
          extraVariableDeclarations.push(factory2.createVariableDeclaration(identifier));
        }
      }
    }
    if (state.loopOutParameters.length) {
      if (!extraVariableDeclarations) {
        extraVariableDeclarations = [];
      }
      for (const outParam of state.loopOutParameters) {
        extraVariableDeclarations.push(factory2.createVariableDeclaration(outParam.outParamName));
      }
    }
    if (state.conditionVariable) {
      if (!extraVariableDeclarations) {
        extraVariableDeclarations = [];
      }
      extraVariableDeclarations.push(factory2.createVariableDeclaration(
        state.conditionVariable,
        /*exclamationToken*/
        void 0,
        /*type*/
        void 0,
        factory2.createFalse()
      ));
    }
    if (extraVariableDeclarations) {
      statements.push(factory2.createVariableStatement(
        /*modifiers*/
        void 0,
        factory2.createVariableDeclarationList(extraVariableDeclarations)
      ));
    }
  }
  function createOutVariable(p) {
    return factory2.createVariableDeclaration(
      p.originalName,
      /*exclamationToken*/
      void 0,
      /*type*/
      void 0,
      p.outParamName
    );
  }
  function createFunctionForInitializerOfForStatement(node, currentState) {
    const functionName = factory2.createUniqueName("_loop_init");
    const containsYield = (node.initializer.transformFlags & 1048576 /* ContainsYield */) !== 0;
    let emitFlags = 0 /* None */;
    if (currentState.containsLexicalThis)
      emitFlags |= 16 /* CapturesThis */;
    if (containsYield && hierarchyFacts & 4 /* AsyncFunctionBody */)
      emitFlags |= 524288 /* AsyncFunctionBody */;
    const statements = [];
    statements.push(factory2.createVariableStatement(
      /*modifiers*/
      void 0,
      node.initializer
    ));
    copyOutParameters(currentState.loopOutParameters, 2 /* Initializer */, 1 /* ToOutParameter */, statements);
    const functionDeclaration = factory2.createVariableStatement(
      /*modifiers*/
      void 0,
      setEmitFlags(
        factory2.createVariableDeclarationList([
          factory2.createVariableDeclaration(
            functionName,
            /*exclamationToken*/
            void 0,
            /*type*/
            void 0,
            setEmitFlags(
              factory2.createFunctionExpression(
                /*modifiers*/
                void 0,
                containsYield ? factory2.createToken(42 /* AsteriskToken */) : void 0,
                /*name*/
                void 0,
                /*typeParameters*/
                void 0,
                /*parameters*/
                void 0,
                /*type*/
                void 0,
                Debug.checkDefined(visitNode(
                  factory2.createBlock(
                    statements,
                    /*multiLine*/
                    true
                  ),
                  visitor,
                  isBlock
                ))
              ),
              emitFlags
            )
          )
        ]),
        4194304 /* NoHoisting */
      )
    );
    const part = factory2.createVariableDeclarationList(map(currentState.loopOutParameters, createOutVariable));
    return { functionName, containsYield, functionDeclaration, part };
  }
  function createFunctionForBodyOfIterationStatement(node, currentState, outerState) {
    const functionName = factory2.createUniqueName("_loop");
    startLexicalEnvironment();
    const statement = visitNode(node.statement, visitor, isStatement, factory2.liftToBlock);
    const lexicalEnvironment = endLexicalEnvironment();
    const statements = [];
    if (shouldConvertConditionOfForStatement(node) || shouldConvertIncrementorOfForStatement(node)) {
      currentState.conditionVariable = factory2.createUniqueName("inc");
      if (node.incrementor) {
        statements.push(factory2.createIfStatement(
          currentState.conditionVariable,
          factory2.createExpressionStatement(Debug.checkDefined(visitNode(node.incrementor, visitor, isExpression))),
          factory2.createExpressionStatement(factory2.createAssignment(currentState.conditionVariable, factory2.createTrue()))
        ));
      } else {
        statements.push(factory2.createIfStatement(
          factory2.createLogicalNot(currentState.conditionVariable),
          factory2.createExpressionStatement(factory2.createAssignment(currentState.conditionVariable, factory2.createTrue()))
        ));
      }
      if (shouldConvertConditionOfForStatement(node)) {
        statements.push(factory2.createIfStatement(
          factory2.createPrefixUnaryExpression(54 /* ExclamationToken */, Debug.checkDefined(visitNode(node.condition, visitor, isExpression))),
          Debug.checkDefined(visitNode(factory2.createBreakStatement(), visitor, isStatement))
        ));
      }
    }
    Debug.assert(statement);
    if (isBlock(statement)) {
      addRange(statements, statement.statements);
    } else {
      statements.push(statement);
    }
    copyOutParameters(currentState.loopOutParameters, 1 /* Body */, 1 /* ToOutParameter */, statements);
    insertStatementsAfterStandardPrologue(statements, lexicalEnvironment);
    const loopBody = factory2.createBlock(
      statements,
      /*multiLine*/
      true
    );
    if (isBlock(statement))
      setOriginalNode(loopBody, statement);
    const containsYield = (node.statement.transformFlags & 1048576 /* ContainsYield */) !== 0;
    let emitFlags = 1048576 /* ReuseTempVariableScope */;
    if (currentState.containsLexicalThis)
      emitFlags |= 16 /* CapturesThis */;
    if (containsYield && (hierarchyFacts & 4 /* AsyncFunctionBody */) !== 0)
      emitFlags |= 524288 /* AsyncFunctionBody */;
    const functionDeclaration = factory2.createVariableStatement(
      /*modifiers*/
      void 0,
      setEmitFlags(
        factory2.createVariableDeclarationList(
          [
            factory2.createVariableDeclaration(
              functionName,
              /*exclamationToken*/
              void 0,
              /*type*/
              void 0,
              setEmitFlags(
                factory2.createFunctionExpression(
                  /*modifiers*/
                  void 0,
                  containsYield ? factory2.createToken(42 /* AsteriskToken */) : void 0,
                  /*name*/
                  void 0,
                  /*typeParameters*/
                  void 0,
                  currentState.loopParameters,
                  /*type*/
                  void 0,
                  loopBody
                ),
                emitFlags
              )
            )
          ]
        ),
        4194304 /* NoHoisting */
      )
    );
    const part = generateCallToConvertedLoop(functionName, currentState, outerState, containsYield);
    return { functionName, containsYield, functionDeclaration, part };
  }
  function copyOutParameter(outParam, copyDirection) {
    const source = copyDirection === 0 /* ToOriginal */ ? outParam.outParamName : outParam.originalName;
    const target = copyDirection === 0 /* ToOriginal */ ? outParam.originalName : outParam.outParamName;
    return factory2.createBinaryExpression(target, 64 /* EqualsToken */, source);
  }
  function copyOutParameters(outParams, partFlags, copyDirection, statements) {
    for (const outParam of outParams) {
      if (outParam.flags & partFlags) {
        statements.push(factory2.createExpressionStatement(copyOutParameter(outParam, copyDirection)));
      }
    }
  }
  function generateCallToConvertedLoopInitializer(initFunctionExpressionName, containsYield) {
    const call = factory2.createCallExpression(
      initFunctionExpressionName,
      /*typeArguments*/
      void 0,
      []
    );
    const callResult = containsYield ? factory2.createYieldExpression(
      factory2.createToken(42 /* AsteriskToken */),
      setEmitFlags(call, 8388608 /* Iterator */)
    ) : call;
    return factory2.createExpressionStatement(callResult);
  }
  function generateCallToConvertedLoop(loopFunctionExpressionName, state, outerState, containsYield) {
    const statements = [];
    const isSimpleLoop = !(state.nonLocalJumps & ~4 /* Continue */) && !state.labeledNonLocalBreaks && !state.labeledNonLocalContinues;
    const call = factory2.createCallExpression(
      loopFunctionExpressionName,
      /*typeArguments*/
      void 0,
      map(state.loopParameters, (p) => p.name)
    );
    const callResult = containsYield ? factory2.createYieldExpression(
      factory2.createToken(42 /* AsteriskToken */),
      setEmitFlags(call, 8388608 /* Iterator */)
    ) : call;
    if (isSimpleLoop) {
      statements.push(factory2.createExpressionStatement(callResult));
      copyOutParameters(state.loopOutParameters, 1 /* Body */, 0 /* ToOriginal */, statements);
    } else {
      const loopResultName = factory2.createUniqueName("state");
      const stateVariable = factory2.createVariableStatement(
        /*modifiers*/
        void 0,
        factory2.createVariableDeclarationList(
          [factory2.createVariableDeclaration(
            loopResultName,
            /*exclamationToken*/
            void 0,
            /*type*/
            void 0,
            callResult
          )]
        )
      );
      statements.push(stateVariable);
      copyOutParameters(state.loopOutParameters, 1 /* Body */, 0 /* ToOriginal */, statements);
      if (state.nonLocalJumps & 8 /* Return */) {
        let returnStatement;
        if (outerState) {
          outerState.nonLocalJumps |= 8 /* Return */;
          returnStatement = factory2.createReturnStatement(loopResultName);
        } else {
          returnStatement = factory2.createReturnStatement(factory2.createPropertyAccessExpression(loopResultName, "value"));
        }
        statements.push(
          factory2.createIfStatement(
            factory2.createTypeCheck(loopResultName, "object"),
            returnStatement
          )
        );
      }
      if (state.nonLocalJumps & 2 /* Break */) {
        statements.push(
          factory2.createIfStatement(
            factory2.createStrictEquality(
              loopResultName,
              factory2.createStringLiteral("break")
            ),
            factory2.createBreakStatement()
          )
        );
      }
      if (state.labeledNonLocalBreaks || state.labeledNonLocalContinues) {
        const caseClauses = [];
        processLabeledJumps(
          state.labeledNonLocalBreaks,
          /*isBreak*/
          true,
          loopResultName,
          outerState,
          caseClauses
        );
        processLabeledJumps(
          state.labeledNonLocalContinues,
          /*isBreak*/
          false,
          loopResultName,
          outerState,
          caseClauses
        );
        statements.push(
          factory2.createSwitchStatement(
            loopResultName,
            factory2.createCaseBlock(caseClauses)
          )
        );
      }
    }
    return statements;
  }
  function setLabeledJump(state, isBreak, labelText, labelMarker) {
    if (isBreak) {
      if (!state.labeledNonLocalBreaks) {
        state.labeledNonLocalBreaks = /* @__PURE__ */ new Map();
      }
      state.labeledNonLocalBreaks.set(labelText, labelMarker);
    } else {
      if (!state.labeledNonLocalContinues) {
        state.labeledNonLocalContinues = /* @__PURE__ */ new Map();
      }
      state.labeledNonLocalContinues.set(labelText, labelMarker);
    }
  }
  function processLabeledJumps(table, isBreak, loopResultName, outerLoop, caseClauses) {
    if (!table) {
      return;
    }
    table.forEach((labelMarker, labelText) => {
      const statements = [];
      if (!outerLoop || outerLoop.labels && outerLoop.labels.get(labelText)) {
        const label = factory2.createIdentifier(labelText);
        statements.push(isBreak ? factory2.createBreakStatement(label) : factory2.createContinueStatement(label));
      } else {
        setLabeledJump(outerLoop, isBreak, labelText, labelMarker);
        statements.push(factory2.createReturnStatement(loopResultName));
      }
      caseClauses.push(factory2.createCaseClause(factory2.createStringLiteral(labelMarker), statements));
    });
  }
  function processLoopVariableDeclaration(container, decl, loopParameters, loopOutParameters, hasCapturedBindingsInForHead) {
    const name = decl.name;
    if (isBindingPattern(name)) {
      for (const element of name.elements) {
        if (!isOmittedExpression(element)) {
          processLoopVariableDeclaration(container, element, loopParameters, loopOutParameters, hasCapturedBindingsInForHead);
        }
      }
    } else {
      loopParameters.push(factory2.createParameterDeclaration(
        /*modifiers*/
        void 0,
        /*dotDotDotToken*/
        void 0,
        name
      ));
      const checkFlags = resolver.getNodeCheckFlags(decl);
      if (checkFlags & 262144 /* NeedsLoopOutParameter */ || hasCapturedBindingsInForHead) {
        const outParamName = factory2.createUniqueName("out_" + idText(name));
        let flags = 0 /* None */;
        if (checkFlags & 262144 /* NeedsLoopOutParameter */) {
          flags |= 1 /* Body */;
        }
        if (isForStatement(container)) {
          if (container.initializer && resolver.isBindingCapturedByNode(container.initializer, decl)) {
            flags |= 2 /* Initializer */;
          }
          if (container.condition && resolver.isBindingCapturedByNode(container.condition, decl) || container.incrementor && resolver.isBindingCapturedByNode(container.incrementor, decl)) {
            flags |= 1 /* Body */;
          }
        }
        loopOutParameters.push({ flags, originalName: name, outParamName });
      }
    }
  }
  function addObjectLiteralMembers(expressions, node, receiver, start) {
    const properties = node.properties;
    const numProperties = properties.length;
    for (let i = start; i < numProperties; i++) {
      const property = properties[i];
      switch (property.kind) {
        case 176 /* GetAccessor */:
        case 177 /* SetAccessor */:
          const accessors = getAllAccessorDeclarations(node.properties, property);
          if (property === accessors.firstAccessor) {
            expressions.push(transformAccessorsToExpression(receiver, accessors, node, !!node.multiLine));
          }
          break;
        case 173 /* MethodDeclaration */:
          expressions.push(transformObjectLiteralMethodDeclarationToExpression(property, receiver, node, node.multiLine));
          break;
        case 302 /* PropertyAssignment */:
          expressions.push(transformPropertyAssignmentToExpression(property, receiver, node.multiLine));
          break;
        case 303 /* ShorthandPropertyAssignment */:
          expressions.push(transformShorthandPropertyAssignmentToExpression(property, receiver, node.multiLine));
          break;
        default:
          Debug.failBadSyntaxKind(node);
          break;
      }
    }
  }
  function transformPropertyAssignmentToExpression(property, receiver, startsOnNewLine) {
    const expression = factory2.createAssignment(
      createMemberAccessForPropertyName(
        factory2,
        receiver,
        Debug.checkDefined(visitNode(property.name, visitor, isPropertyName))
      ),
      Debug.checkDefined(visitNode(property.initializer, visitor, isExpression))
    );
    setTextRange(expression, property);
    if (startsOnNewLine) {
      startOnNewLine(expression);
    }
    return expression;
  }
  function transformShorthandPropertyAssignmentToExpression(property, receiver, startsOnNewLine) {
    const expression = factory2.createAssignment(
      createMemberAccessForPropertyName(
        factory2,
        receiver,
        Debug.checkDefined(visitNode(property.name, visitor, isPropertyName))
      ),
      factory2.cloneNode(property.name)
    );
    setTextRange(expression, property);
    if (startsOnNewLine) {
      startOnNewLine(expression);
    }
    return expression;
  }
  function transformObjectLiteralMethodDeclarationToExpression(method, receiver, container, startsOnNewLine) {
    const expression = factory2.createAssignment(
      createMemberAccessForPropertyName(
        factory2,
        receiver,
        Debug.checkDefined(visitNode(method.name, visitor, isPropertyName))
      ),
      transformFunctionLikeToExpression(
        method,
        /*location*/
        method,
        /*name*/
        void 0,
        container
      )
    );
    setTextRange(expression, method);
    if (startsOnNewLine) {
      startOnNewLine(expression);
    }
    return expression;
  }
  function visitCatchClause(node) {
    const ancestorFacts = enterSubtree(7104 /* BlockScopeExcludes */, 0 /* BlockScopeIncludes */);
    let updated;
    Debug.assert(!!node.variableDeclaration, "Catch clause variable should always be present when downleveling ES2015.");
    if (isBindingPattern(node.variableDeclaration.name)) {
      const temp = factory2.createTempVariable(
        /*recordTempVariable*/
        void 0
      );
      const newVariableDeclaration = factory2.createVariableDeclaration(temp);
      setTextRange(newVariableDeclaration, node.variableDeclaration);
      const vars = flattenDestructuringBinding(
        node.variableDeclaration,
        visitor,
        context,
        0 /* All */,
        temp
      );
      const list = factory2.createVariableDeclarationList(vars);
      setTextRange(list, node.variableDeclaration);
      const destructure = factory2.createVariableStatement(
        /*modifiers*/
        void 0,
        list
      );
      updated = factory2.updateCatchClause(node, newVariableDeclaration, addStatementToStartOfBlock(node.block, destructure));
    } else {
      updated = visitEachChild(node, visitor, context);
    }
    exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
    return updated;
  }
  function addStatementToStartOfBlock(block, statement) {
    const transformedStatements = visitNodes2(block.statements, visitor, isStatement);
    return factory2.updateBlock(block, [statement, ...transformedStatements]);
  }
  function visitMethodDeclaration(node) {
    Debug.assert(!isComputedPropertyName(node.name));
    const functionExpression = transformFunctionLikeToExpression(
      node,
      /*location*/
      moveRangePos(node, -1),
      /*name*/
      void 0,
      /*container*/
      void 0
    );
    setEmitFlags(functionExpression, 1024 /* NoLeadingComments */ | getEmitFlags(functionExpression));
    return setTextRange(
      factory2.createPropertyAssignment(
        node.name,
        functionExpression
      ),
      /*location*/
      node
    );
  }
  function visitAccessorDeclaration(node) {
    Debug.assert(!isComputedPropertyName(node.name));
    const savedConvertedLoopState = convertedLoopState;
    convertedLoopState = void 0;
    const ancestorFacts = enterSubtree(32670 /* FunctionExcludes */, 65 /* FunctionIncludes */);
    let updated;
    const parameters = visitParameterList(node.parameters, visitor, context);
    const body = transformFunctionBody(node);
    if (node.kind === 176 /* GetAccessor */) {
      updated = factory2.updateGetAccessorDeclaration(node, node.modifiers, node.name, parameters, node.type, body);
    } else {
      updated = factory2.updateSetAccessorDeclaration(node, node.modifiers, node.name, parameters, body);
    }
    exitSubtree(ancestorFacts, 98304 /* FunctionSubtreeExcludes */, 0 /* None */);
    convertedLoopState = savedConvertedLoopState;
    return updated;
  }
  function visitShorthandPropertyAssignment(node) {
    return setTextRange(
      factory2.createPropertyAssignment(
        node.name,
        visitIdentifier(factory2.cloneNode(node.name))
      ),
      /*location*/
      node
    );
  }
  function visitComputedPropertyName(node) {
    return visitEachChild(node, visitor, context);
  }
  function visitYieldExpression(node) {
    return visitEachChild(node, visitor, context);
  }
  function visitArrayLiteralExpression(node) {
    if (some(node.elements, isSpreadElement)) {
      return transformAndSpreadElements(
        node.elements,
        /*isArgumentList*/
        false,
        !!node.multiLine,
        /*hasTrailingComma*/
        !!node.elements.hasTrailingComma
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitCallExpression(node) {
    if (getInternalEmitFlags(node) & 1 /* TypeScriptClassWrapper */) {
      return visitTypeScriptClassWrapper(node);
    }
    const expression = skipOuterExpressions(node.expression);
    if (expression.kind === 108 /* SuperKeyword */ || isSuperProperty(expression) || some(node.arguments, isSpreadElement)) {
      return visitCallExpressionWithPotentialCapturedThisAssignment(
        node,
        /*assignToCapturedThis*/
        true
      );
    }
    return factory2.updateCallExpression(
      node,
      Debug.checkDefined(visitNode(node.expression, callExpressionVisitor, isExpression)),
      /*typeArguments*/
      void 0,
      visitNodes2(node.arguments, visitor, isExpression)
    );
  }
  function visitTypeScriptClassWrapper(node) {
    const body = cast(cast(skipOuterExpressions(node.expression), isArrowFunction).body, isBlock);
    const isVariableStatementWithInitializer = (stmt) => isVariableStatement(stmt) && !!first(stmt.declarationList.declarations).initializer;
    const savedConvertedLoopState = convertedLoopState;
    convertedLoopState = void 0;
    const bodyStatements = visitNodes2(body.statements, classWrapperStatementVisitor, isStatement);
    convertedLoopState = savedConvertedLoopState;
    const classStatements = filter(bodyStatements, isVariableStatementWithInitializer);
    const remainingStatements = filter(bodyStatements, (stmt) => !isVariableStatementWithInitializer(stmt));
    const varStatement = cast(first(classStatements), isVariableStatement);
    const variable = varStatement.declarationList.declarations[0];
    const initializer = skipOuterExpressions(variable.initializer);
    let aliasAssignment = tryCast(initializer, isAssignmentExpression);
    if (!aliasAssignment && isBinaryExpression(initializer) && initializer.operatorToken.kind === 28 /* CommaToken */) {
      aliasAssignment = tryCast(initializer.left, isAssignmentExpression);
    }
    const call = cast(aliasAssignment ? skipOuterExpressions(aliasAssignment.right) : initializer, isCallExpression);
    const func = cast(skipOuterExpressions(call.expression), isFunctionExpression);
    const funcStatements = func.body.statements;
    let classBodyStart = 0;
    let classBodyEnd = -1;
    const statements = [];
    if (aliasAssignment) {
      const extendsCall = tryCast(funcStatements[classBodyStart], isExpressionStatement);
      if (extendsCall) {
        statements.push(extendsCall);
        classBodyStart++;
      }
      statements.push(funcStatements[classBodyStart]);
      classBodyStart++;
      statements.push(
        factory2.createExpressionStatement(
          factory2.createAssignment(
            aliasAssignment.left,
            cast(variable.name, isIdentifier)
          )
        )
      );
    }
    while (!isReturnStatement(elementAt(funcStatements, classBodyEnd))) {
      classBodyEnd--;
    }
    addRange(statements, funcStatements, classBodyStart, classBodyEnd);
    if (classBodyEnd < -1) {
      addRange(statements, funcStatements, classBodyEnd + 1);
    }
    const returnStatement = tryCast(elementAt(funcStatements, classBodyEnd), isReturnStatement);
    for (const statement of remainingStatements) {
      if (isReturnStatement(statement) && (returnStatement == null ? void 0 : returnStatement.expression) && !isIdentifier(returnStatement.expression)) {
        statements.push(returnStatement);
      } else {
        statements.push(statement);
      }
    }
    addRange(
      statements,
      classStatements,
      /*start*/
      1
    );
    return factory2.restoreOuterExpressions(
      node.expression,
      factory2.restoreOuterExpressions(
        variable.initializer,
        factory2.restoreOuterExpressions(
          aliasAssignment && aliasAssignment.right,
          factory2.updateCallExpression(
            call,
            factory2.restoreOuterExpressions(
              call.expression,
              factory2.updateFunctionExpression(
                func,
                /*modifiers*/
                void 0,
                /*asteriskToken*/
                void 0,
                /*name*/
                void 0,
                /*typeParameters*/
                void 0,
                func.parameters,
                /*type*/
                void 0,
                factory2.updateBlock(
                  func.body,
                  statements
                )
              )
            ),
            /*typeArguments*/
            void 0,
            call.arguments
          )
        )
      )
    );
  }
  function visitSuperCallInBody(node) {
    return visitCallExpressionWithPotentialCapturedThisAssignment(
      node,
      /*assignToCapturedThis*/
      false
    );
  }
  function visitCallExpressionWithPotentialCapturedThisAssignment(node, assignToCapturedThis) {
    if (node.transformFlags & 32768 /* ContainsRestOrSpread */ || node.expression.kind === 108 /* SuperKeyword */ || isSuperProperty(skipOuterExpressions(node.expression))) {
      const { target, thisArg } = factory2.createCallBinding(node.expression, hoistVariableDeclaration);
      if (node.expression.kind === 108 /* SuperKeyword */) {
        setEmitFlags(thisArg, 8 /* NoSubstitution */);
      }
      let resultingCall;
      if (node.transformFlags & 32768 /* ContainsRestOrSpread */) {
        resultingCall = factory2.createFunctionApplyCall(
          Debug.checkDefined(visitNode(target, callExpressionVisitor, isExpression)),
          node.expression.kind === 108 /* SuperKeyword */ ? thisArg : Debug.checkDefined(visitNode(thisArg, visitor, isExpression)),
          transformAndSpreadElements(
            node.arguments,
            /*isArgumentList*/
            true,
            /*multiLine*/
            false,
            /*hasTrailingComma*/
            false
          )
        );
      } else {
        resultingCall = setTextRange(
          factory2.createFunctionCallCall(
            Debug.checkDefined(visitNode(target, callExpressionVisitor, isExpression)),
            node.expression.kind === 108 /* SuperKeyword */ ? thisArg : Debug.checkDefined(visitNode(thisArg, visitor, isExpression)),
            visitNodes2(node.arguments, visitor, isExpression)
          ),
          node
        );
      }
      if (node.expression.kind === 108 /* SuperKeyword */) {
        const initializer = factory2.createLogicalOr(
          resultingCall,
          createActualThis()
        );
        resultingCall = assignToCapturedThis ? factory2.createAssignment(factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */), initializer) : initializer;
      }
      return setOriginalNode(resultingCall, node);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitNewExpression(node) {
    if (some(node.arguments, isSpreadElement)) {
      const { target, thisArg } = factory2.createCallBinding(factory2.createPropertyAccessExpression(node.expression, "bind"), hoistVariableDeclaration);
      return factory2.createNewExpression(
        factory2.createFunctionApplyCall(
          Debug.checkDefined(visitNode(target, visitor, isExpression)),
          thisArg,
          transformAndSpreadElements(
            factory2.createNodeArray([factory2.createVoidZero(), ...node.arguments]),
            /*isArgumentList*/
            true,
            /*multiLine*/
            false,
            /*hasTrailingComma*/
            false
          )
        ),
        /*typeArguments*/
        void 0,
        []
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function transformAndSpreadElements(elements, isArgumentList, multiLine, hasTrailingComma) {
    const numElements = elements.length;
    const segments = flatten(
      // As we visit each element, we return one of two functions to use as the "key":
      // - `visitSpanOfSpreads` for one or more contiguous `...` spread expressions, i.e. `...a, ...b` in `[1, 2, ...a, ...b]`
      // - `visitSpanOfNonSpreads` for one or more contiguous non-spread elements, i.e. `1, 2`, in `[1, 2, ...a, ...b]`
      spanMap(
        elements,
        partitionSpread,
        (partition, visitPartition, _start, end) => visitPartition(partition, multiLine, hasTrailingComma && end === numElements)
      )
    );
    if (segments.length === 1) {
      const firstSegment = segments[0];
      if (isArgumentList && !compilerOptions.downlevelIteration || isPackedArrayLiteral(firstSegment.expression) || isCallToHelper(firstSegment.expression, "___spreadArray")) {
        return firstSegment.expression;
      }
    }
    const helpers = emitHelpers();
    const startsWithSpread = segments[0].kind !== 0 /* None */;
    let expression = startsWithSpread ? factory2.createArrayLiteralExpression() : segments[0].expression;
    for (let i = startsWithSpread ? 0 : 1; i < segments.length; i++) {
      const segment = segments[i];
      expression = helpers.createSpreadArrayHelper(
        expression,
        segment.expression,
        segment.kind === 1 /* UnpackedSpread */ && !isArgumentList
      );
    }
    return expression;
  }
  function partitionSpread(node) {
    return isSpreadElement(node) ? visitSpanOfSpreads : visitSpanOfNonSpreads;
  }
  function visitSpanOfSpreads(chunk) {
    return map(chunk, visitExpressionOfSpread);
  }
  function visitExpressionOfSpread(node) {
    Debug.assertNode(node, isSpreadElement);
    let expression = visitNode(node.expression, visitor, isExpression);
    Debug.assert(expression);
    const isCallToReadHelper = isCallToHelper(expression, "___read");
    let kind = isCallToReadHelper || isPackedArrayLiteral(expression) ? 2 /* PackedSpread */ : 1 /* UnpackedSpread */;
    if (compilerOptions.downlevelIteration && kind === 1 /* UnpackedSpread */ && !isArrayLiteralExpression(expression) && !isCallToReadHelper) {
      expression = emitHelpers().createReadHelper(
        expression,
        /*count*/
        void 0
      );
      kind = 2 /* PackedSpread */;
    }
    return createSpreadSegment(kind, expression);
  }
  function visitSpanOfNonSpreads(chunk, multiLine, hasTrailingComma) {
    const expression = factory2.createArrayLiteralExpression(
      visitNodes2(factory2.createNodeArray(chunk, hasTrailingComma), visitor, isExpression),
      multiLine
    );
    return createSpreadSegment(0 /* None */, expression);
  }
  function visitSpreadElement(node) {
    return visitNode(node.expression, visitor, isExpression);
  }
  function visitTemplateLiteral(node) {
    return setTextRange(factory2.createStringLiteral(node.text), node);
  }
  function visitStringLiteral(node) {
    if (node.hasExtendedUnicodeEscape) {
      return setTextRange(factory2.createStringLiteral(node.text), node);
    }
    return node;
  }
  function visitNumericLiteral(node) {
    if (node.numericLiteralFlags & 384 /* BinaryOrOctalSpecifier */) {
      return setTextRange(factory2.createNumericLiteral(node.text), node);
    }
    return node;
  }
  function visitTaggedTemplateExpression(node) {
    return processTaggedTemplateExpression(
      context,
      node,
      visitor,
      currentSourceFile,
      recordTaggedTemplateString,
      1 /* All */
    );
  }
  function visitTemplateExpression(node) {
    let expression = factory2.createStringLiteral(node.head.text);
    for (const span of node.templateSpans) {
      const args = [Debug.checkDefined(visitNode(span.expression, visitor, isExpression))];
      if (span.literal.text.length > 0) {
        args.push(factory2.createStringLiteral(span.literal.text));
      }
      expression = factory2.createCallExpression(
        factory2.createPropertyAccessExpression(expression, "concat"),
        /*typeArguments*/
        void 0,
        args
      );
    }
    return setTextRange(expression, node);
  }
  function visitSuperKeyword(isExpressionOfCall) {
    return hierarchyFacts & 8 /* NonStaticClassElement */ && !isExpressionOfCall ? factory2.createPropertyAccessExpression(factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */), "prototype") : factory2.createUniqueName("_super", 16 /* Optimistic */ | 32 /* FileLevel */);
  }
  function visitMetaProperty(node) {
    if (node.keywordToken === 105 /* NewKeyword */ && node.name.escapedText === "target") {
      hierarchyFacts |= 32768 /* NewTarget */;
      return factory2.createUniqueName("_newTarget", 16 /* Optimistic */ | 32 /* FileLevel */);
    }
    return node;
  }
  function onEmitNode(hint, node, emitCallback) {
    if (enabledSubstitutions & 1 /* CapturedThis */ && isFunctionLike(node)) {
      const ancestorFacts = enterSubtree(
        32670 /* FunctionExcludes */,
        getEmitFlags(node) & 16 /* CapturesThis */ ? 65 /* FunctionIncludes */ | 16 /* CapturesThis */ : 65 /* FunctionIncludes */
      );
      previousOnEmitNode(hint, node, emitCallback);
      exitSubtree(ancestorFacts, 0 /* None */, 0 /* None */);
      return;
    }
    previousOnEmitNode(hint, node, emitCallback);
  }
  function enableSubstitutionsForBlockScopedBindings() {
    if ((enabledSubstitutions & 2 /* BlockScopedBindings */) === 0) {
      enabledSubstitutions |= 2 /* BlockScopedBindings */;
      context.enableSubstitution(80 /* Identifier */);
    }
  }
  function enableSubstitutionsForCapturedThis() {
    if ((enabledSubstitutions & 1 /* CapturedThis */) === 0) {
      enabledSubstitutions |= 1 /* CapturedThis */;
      context.enableSubstitution(110 /* ThisKeyword */);
      context.enableEmitNotification(175 /* Constructor */);
      context.enableEmitNotification(173 /* MethodDeclaration */);
      context.enableEmitNotification(176 /* GetAccessor */);
      context.enableEmitNotification(177 /* SetAccessor */);
      context.enableEmitNotification(218 /* ArrowFunction */);
      context.enableEmitNotification(217 /* FunctionExpression */);
      context.enableEmitNotification(261 /* FunctionDeclaration */);
    }
  }
  function onSubstituteNode(hint, node) {
    node = previousOnSubstituteNode(hint, node);
    if (hint === 1 /* Expression */) {
      return substituteExpression(node);
    }
    if (isIdentifier(node)) {
      return substituteIdentifier(node);
    }
    return node;
  }
  function substituteIdentifier(node) {
    if (enabledSubstitutions & 2 /* BlockScopedBindings */ && !isInternalName(node)) {
      const original = getParseTreeNode(node, isIdentifier);
      if (original && isNameOfDeclarationWithCollidingName(original)) {
        return setTextRange(factory2.getGeneratedNameForNode(original), node);
      }
    }
    return node;
  }
  function isNameOfDeclarationWithCollidingName(node) {
    switch (node.parent.kind) {
      case 207 /* BindingElement */:
      case 262 /* ClassDeclaration */:
      case 265 /* EnumDeclaration */:
      case 259 /* VariableDeclaration */:
        return node.parent.name === node && resolver.isDeclarationWithCollidingName(node.parent);
    }
    return false;
  }
  function substituteExpression(node) {
    switch (node.kind) {
      case 80 /* Identifier */:
        return substituteExpressionIdentifier(node);
      case 110 /* ThisKeyword */:
        return substituteThisKeyword(node);
    }
    return node;
  }
  function substituteExpressionIdentifier(node) {
    if (enabledSubstitutions & 2 /* BlockScopedBindings */ && !isInternalName(node)) {
      const declaration = resolver.getReferencedDeclarationWithCollidingName(node);
      if (declaration && !(isClassLike(declaration) && isPartOfClassBody(declaration, node))) {
        return setTextRange(factory2.getGeneratedNameForNode(getNameOfDeclaration(declaration)), node);
      }
    }
    return node;
  }
  function isPartOfClassBody(declaration, node) {
    let currentNode = getParseTreeNode(node);
    if (!currentNode || currentNode === declaration || currentNode.end <= declaration.pos || currentNode.pos >= declaration.end) {
      return false;
    }
    const blockScope = getEnclosingBlockScopeContainer(declaration);
    while (currentNode) {
      if (currentNode === blockScope || currentNode === declaration) {
        return false;
      }
      if (isClassElement(currentNode) && currentNode.parent === declaration) {
        return true;
      }
      currentNode = currentNode.parent;
    }
    return false;
  }
  function substituteThisKeyword(node) {
    if (enabledSubstitutions & 1 /* CapturedThis */ && hierarchyFacts & 16 /* CapturesThis */) {
      return setTextRange(factory2.createUniqueName("_this", 16 /* Optimistic */ | 32 /* FileLevel */), node);
    }
    return node;
  }
  function getClassMemberPrefix(node, member) {
    return isStatic(member) ? factory2.getInternalName(node) : factory2.createPropertyAccessExpression(factory2.getInternalName(node), "prototype");
  }
  function hasSynthesizedDefaultSuperCall(constructor, hasExtendsClause) {
    if (!constructor || !hasExtendsClause) {
      return false;
    }
    if (some(constructor.parameters)) {
      return false;
    }
    const statement = firstOrUndefined(constructor.body.statements);
    if (!statement || !nodeIsSynthesized(statement) || statement.kind !== 243 /* ExpressionStatement */) {
      return false;
    }
    const statementExpression = statement.expression;
    if (!nodeIsSynthesized(statementExpression) || statementExpression.kind !== 212 /* CallExpression */) {
      return false;
    }
    const callTarget = statementExpression.expression;
    if (!nodeIsSynthesized(callTarget) || callTarget.kind !== 108 /* SuperKeyword */) {
      return false;
    }
    const callArgument = singleOrUndefined(statementExpression.arguments);
    if (!callArgument || !nodeIsSynthesized(callArgument) || callArgument.kind !== 229 /* SpreadElement */) {
      return false;
    }
    const expression = callArgument.expression;
    return isIdentifier(expression) && expression.escapedText === "arguments";
  }
}

// src/compiler/transformers/es5.ts
function transformES5(context) {
  const { factory: factory2 } = context;
  const compilerOptions = context.getCompilerOptions();
  let previousOnEmitNode;
  let noSubstitution;
  if (compilerOptions.jsx === 1 /* Preserve */ || compilerOptions.jsx === 3 /* ReactNative */) {
    previousOnEmitNode = context.onEmitNode;
    context.onEmitNode = onEmitNode;
    context.enableEmitNotification(285 /* JsxOpeningElement */);
    context.enableEmitNotification(286 /* JsxClosingElement */);
    context.enableEmitNotification(284 /* JsxSelfClosingElement */);
    noSubstitution = [];
  }
  const previousOnSubstituteNode = context.onSubstituteNode;
  context.onSubstituteNode = onSubstituteNode;
  context.enableSubstitution(210 /* PropertyAccessExpression */);
  context.enableSubstitution(302 /* PropertyAssignment */);
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    return node;
  }
  function onEmitNode(hint, node, emitCallback) {
    switch (node.kind) {
      case 285 /* JsxOpeningElement */:
      case 286 /* JsxClosingElement */:
      case 284 /* JsxSelfClosingElement */:
        const tagName = node.tagName;
        noSubstitution[getOriginalNodeId(tagName)] = true;
        break;
    }
    previousOnEmitNode(hint, node, emitCallback);
  }
  function onSubstituteNode(hint, node) {
    if (node.id && noSubstitution && noSubstitution[node.id]) {
      return previousOnSubstituteNode(hint, node);
    }
    node = previousOnSubstituteNode(hint, node);
    if (isPropertyAccessExpression(node)) {
      return substitutePropertyAccessExpression(node);
    } else if (isPropertyAssignment(node)) {
      return substitutePropertyAssignment(node);
    }
    return node;
  }
  function substitutePropertyAccessExpression(node) {
    if (isPrivateIdentifier(node.name)) {
      return node;
    }
    const literalName = trySubstituteReservedName(node.name);
    if (literalName) {
      return setTextRange(factory2.createElementAccessExpression(node.expression, literalName), node);
    }
    return node;
  }
  function substitutePropertyAssignment(node) {
    const literalName = isIdentifier(node.name) && trySubstituteReservedName(node.name);
    if (literalName) {
      return factory2.updatePropertyAssignment(node, literalName, node.initializer);
    }
    return node;
  }
  function trySubstituteReservedName(name) {
    const token = identifierToKeywordKind(name);
    if (token !== void 0 && token >= 83 /* FirstReservedWord */ && token <= 118 /* LastReservedWord */) {
      return setTextRange(factory2.createStringLiteralFromNode(name), name);
    }
    return void 0;
  }
}

// src/compiler/transformers/generators.ts
function getInstructionName(instruction) {
  switch (instruction) {
    case 2 /* Return */:
      return "return";
    case 3 /* Break */:
      return "break";
    case 4 /* Yield */:
      return "yield";
    case 5 /* YieldStar */:
      return "yield*";
    case 7 /* Endfinally */:
      return "endfinally";
    default:
      return void 0;
  }
}
function transformGenerators(context) {
  const {
    factory: factory2,
    getEmitHelperFactory: emitHelpers,
    resumeLexicalEnvironment,
    endLexicalEnvironment,
    hoistFunctionDeclaration,
    hoistVariableDeclaration
  } = context;
  const compilerOptions = context.getCompilerOptions();
  const languageVersion = getEmitScriptTarget(compilerOptions);
  const resolver = context.getEmitResolver();
  const previousOnSubstituteNode = context.onSubstituteNode;
  context.onSubstituteNode = onSubstituteNode;
  let renamedCatchVariables;
  let renamedCatchVariableDeclarations;
  let inGeneratorFunctionBody;
  let inStatementContainingYield;
  let blocks;
  let blockOffsets;
  let blockActions;
  let blockStack;
  let labelOffsets;
  let labelExpressions;
  let nextLabelId = 1;
  let operations;
  let operationArguments;
  let operationLocations;
  let state;
  let blockIndex = 0;
  let labelNumber = 0;
  let labelNumbers;
  let lastOperationWasAbrupt;
  let lastOperationWasCompletion;
  let clauses;
  let statements;
  let exceptionBlockStack;
  let currentExceptionBlock;
  let withBlockStack;
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    if (node.isDeclarationFile || (node.transformFlags & 2048 /* ContainsGenerator */) === 0) {
      return node;
    }
    const visited = visitEachChild(node, visitor, context);
    addEmitHelpers(visited, context.readEmitHelpers());
    return visited;
  }
  function visitor(node) {
    const transformFlags = node.transformFlags;
    if (inStatementContainingYield) {
      return visitJavaScriptInStatementContainingYield(node);
    } else if (inGeneratorFunctionBody) {
      return visitJavaScriptInGeneratorFunctionBody(node);
    } else if (isFunctionLikeDeclaration(node) && node.asteriskToken) {
      return visitGenerator(node);
    } else if (transformFlags & 2048 /* ContainsGenerator */) {
      return visitEachChild(node, visitor, context);
    } else {
      return node;
    }
  }
  function visitJavaScriptInStatementContainingYield(node) {
    switch (node.kind) {
      case 245 /* DoStatement */:
        return visitDoStatement(node);
      case 246 /* WhileStatement */:
        return visitWhileStatement(node);
      case 254 /* SwitchStatement */:
        return visitSwitchStatement(node);
      case 255 /* LabeledStatement */:
        return visitLabeledStatement(node);
      default:
        return visitJavaScriptInGeneratorFunctionBody(node);
    }
  }
  function visitJavaScriptInGeneratorFunctionBody(node) {
    switch (node.kind) {
      case 261 /* FunctionDeclaration */:
        return visitFunctionDeclaration(node);
      case 217 /* FunctionExpression */:
        return visitFunctionExpression(node);
      case 176 /* GetAccessor */:
      case 177 /* SetAccessor */:
        return visitAccessorDeclaration(node);
      case 242 /* VariableStatement */:
        return visitVariableStatement(node);
      case 247 /* ForStatement */:
        return visitForStatement(node);
      case 248 /* ForInStatement */:
        return visitForInStatement(node);
      case 251 /* BreakStatement */:
        return visitBreakStatement(node);
      case 250 /* ContinueStatement */:
        return visitContinueStatement(node);
      case 252 /* ReturnStatement */:
        return visitReturnStatement(node);
      default:
        if (node.transformFlags & 1048576 /* ContainsYield */) {
          return visitJavaScriptContainingYield(node);
        } else if (node.transformFlags & (2048 /* ContainsGenerator */ | 4194304 /* ContainsHoistedDeclarationOrCompletion */)) {
          return visitEachChild(node, visitor, context);
        } else {
          return node;
        }
    }
  }
  function visitJavaScriptContainingYield(node) {
    switch (node.kind) {
      case 225 /* BinaryExpression */:
        return visitBinaryExpression(node);
      case 360 /* CommaListExpression */:
        return visitCommaListExpression(node);
      case 226 /* ConditionalExpression */:
        return visitConditionalExpression(node);
      case 228 /* YieldExpression */:
        return visitYieldExpression(node);
      case 208 /* ArrayLiteralExpression */:
        return visitArrayLiteralExpression(node);
      case 209 /* ObjectLiteralExpression */:
        return visitObjectLiteralExpression(node);
      case 211 /* ElementAccessExpression */:
        return visitElementAccessExpression(node);
      case 212 /* CallExpression */:
        return visitCallExpression(node);
      case 213 /* NewExpression */:
        return visitNewExpression(node);
      default:
        return visitEachChild(node, visitor, context);
    }
  }
  function visitGenerator(node) {
    switch (node.kind) {
      case 261 /* FunctionDeclaration */:
        return visitFunctionDeclaration(node);
      case 217 /* FunctionExpression */:
        return visitFunctionExpression(node);
      default:
        return Debug.failBadSyntaxKind(node);
    }
  }
  function visitFunctionDeclaration(node) {
    if (node.asteriskToken) {
      node = setOriginalNode(
        setTextRange(
          factory2.createFunctionDeclaration(
            node.modifiers,
            /*asteriskToken*/
            void 0,
            node.name,
            /*typeParameters*/
            void 0,
            visitParameterList(node.parameters, visitor, context),
            /*type*/
            void 0,
            transformGeneratorFunctionBody(node.body)
          ),
          /*location*/
          node
        ),
        node
      );
    } else {
      const savedInGeneratorFunctionBody = inGeneratorFunctionBody;
      const savedInStatementContainingYield = inStatementContainingYield;
      inGeneratorFunctionBody = false;
      inStatementContainingYield = false;
      node = visitEachChild(node, visitor, context);
      inGeneratorFunctionBody = savedInGeneratorFunctionBody;
      inStatementContainingYield = savedInStatementContainingYield;
    }
    if (inGeneratorFunctionBody) {
      hoistFunctionDeclaration(node);
      return void 0;
    } else {
      return node;
    }
  }
  function visitFunctionExpression(node) {
    if (node.asteriskToken) {
      node = setOriginalNode(
        setTextRange(
          factory2.createFunctionExpression(
            /*modifiers*/
            void 0,
            /*asteriskToken*/
            void 0,
            node.name,
            /*typeParameters*/
            void 0,
            visitParameterList(node.parameters, visitor, context),
            /*type*/
            void 0,
            transformGeneratorFunctionBody(node.body)
          ),
          /*location*/
          node
        ),
        node
      );
    } else {
      const savedInGeneratorFunctionBody = inGeneratorFunctionBody;
      const savedInStatementContainingYield = inStatementContainingYield;
      inGeneratorFunctionBody = false;
      inStatementContainingYield = false;
      node = visitEachChild(node, visitor, context);
      inGeneratorFunctionBody = savedInGeneratorFunctionBody;
      inStatementContainingYield = savedInStatementContainingYield;
    }
    return node;
  }
  function visitAccessorDeclaration(node) {
    const savedInGeneratorFunctionBody = inGeneratorFunctionBody;
    const savedInStatementContainingYield = inStatementContainingYield;
    inGeneratorFunctionBody = false;
    inStatementContainingYield = false;
    node = visitEachChild(node, visitor, context);
    inGeneratorFunctionBody = savedInGeneratorFunctionBody;
    inStatementContainingYield = savedInStatementContainingYield;
    return node;
  }
  function transformGeneratorFunctionBody(body) {
    const statements2 = [];
    const savedInGeneratorFunctionBody = inGeneratorFunctionBody;
    const savedInStatementContainingYield = inStatementContainingYield;
    const savedBlocks = blocks;
    const savedBlockOffsets = blockOffsets;
    const savedBlockActions = blockActions;
    const savedBlockStack = blockStack;
    const savedLabelOffsets = labelOffsets;
    const savedLabelExpressions = labelExpressions;
    const savedNextLabelId = nextLabelId;
    const savedOperations = operations;
    const savedOperationArguments = operationArguments;
    const savedOperationLocations = operationLocations;
    const savedState = state;
    inGeneratorFunctionBody = true;
    inStatementContainingYield = false;
    blocks = void 0;
    blockOffsets = void 0;
    blockActions = void 0;
    blockStack = void 0;
    labelOffsets = void 0;
    labelExpressions = void 0;
    nextLabelId = 1;
    operations = void 0;
    operationArguments = void 0;
    operationLocations = void 0;
    state = factory2.createTempVariable(
      /*recordTempVariable*/
      void 0
    );
    resumeLexicalEnvironment();
    const statementOffset = factory2.copyPrologue(
      body.statements,
      statements2,
      /*ensureUseStrict*/
      false,
      visitor
    );
    transformAndEmitStatements(body.statements, statementOffset);
    const buildResult = build2();
    insertStatementsAfterStandardPrologue(statements2, endLexicalEnvironment());
    statements2.push(factory2.createReturnStatement(buildResult));
    inGeneratorFunctionBody = savedInGeneratorFunctionBody;
    inStatementContainingYield = savedInStatementContainingYield;
    blocks = savedBlocks;
    blockOffsets = savedBlockOffsets;
    blockActions = savedBlockActions;
    blockStack = savedBlockStack;
    labelOffsets = savedLabelOffsets;
    labelExpressions = savedLabelExpressions;
    nextLabelId = savedNextLabelId;
    operations = savedOperations;
    operationArguments = savedOperationArguments;
    operationLocations = savedOperationLocations;
    state = savedState;
    return setTextRange(factory2.createBlock(statements2, body.multiLine), body);
  }
  function visitVariableStatement(node) {
    if (node.transformFlags & 1048576 /* ContainsYield */) {
      transformAndEmitVariableDeclarationList(node.declarationList);
      return void 0;
    } else {
      if (getEmitFlags(node) & 2097152 /* CustomPrologue */) {
        return node;
      }
      for (const variable of node.declarationList.declarations) {
        hoistVariableDeclaration(variable.name);
      }
      const variables = getInitializedVariables(node.declarationList);
      if (variables.length === 0) {
        return void 0;
      }
      return setSourceMapRange(
        factory2.createExpressionStatement(
          factory2.inlineExpressions(
            map(variables, transformInitializedVariable)
          )
        ),
        node
      );
    }
  }
  function visitBinaryExpression(node) {
    const assoc = getExpressionAssociativity(node);
    switch (assoc) {
      case 0 /* Left */:
        return visitLeftAssociativeBinaryExpression(node);
      case 1 /* Right */:
        return visitRightAssociativeBinaryExpression(node);
      default:
        return Debug.assertNever(assoc);
    }
  }
  function visitRightAssociativeBinaryExpression(node) {
    const { left, right } = node;
    if (containsYield(right)) {
      let target;
      switch (left.kind) {
        case 210 /* PropertyAccessExpression */:
          target = factory2.updatePropertyAccessExpression(
            left,
            cacheExpression(Debug.checkDefined(visitNode(left.expression, visitor, isLeftHandSideExpression))),
            left.name
          );
          break;
        case 211 /* ElementAccessExpression */:
          target = factory2.updateElementAccessExpression(
            left,
            cacheExpression(Debug.checkDefined(visitNode(left.expression, visitor, isLeftHandSideExpression))),
            cacheExpression(Debug.checkDefined(visitNode(left.argumentExpression, visitor, isExpression)))
          );
          break;
        default:
          target = Debug.checkDefined(visitNode(left, visitor, isExpression));
          break;
      }
      const operator = node.operatorToken.kind;
      if (isCompoundAssignment(operator)) {
        return setTextRange(
          factory2.createAssignment(
            target,
            setTextRange(
              factory2.createBinaryExpression(
                cacheExpression(target),
                getNonAssignmentOperatorForCompoundAssignment(operator),
                Debug.checkDefined(visitNode(right, visitor, isExpression))
              ),
              node
            )
          ),
          node
        );
      } else {
        return factory2.updateBinaryExpression(node, target, node.operatorToken, Debug.checkDefined(visitNode(right, visitor, isExpression)));
      }
    }
    return visitEachChild(node, visitor, context);
  }
  function visitLeftAssociativeBinaryExpression(node) {
    if (containsYield(node.right)) {
      if (isLogicalOperator(node.operatorToken.kind)) {
        return visitLogicalBinaryExpression(node);
      } else if (node.operatorToken.kind === 28 /* CommaToken */) {
        return visitCommaExpression(node);
      }
      return factory2.updateBinaryExpression(
        node,
        cacheExpression(Debug.checkDefined(visitNode(node.left, visitor, isExpression))),
        node.operatorToken,
        Debug.checkDefined(visitNode(node.right, visitor, isExpression))
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitCommaExpression(node) {
    let pendingExpressions = [];
    visit(node.left);
    visit(node.right);
    return factory2.inlineExpressions(pendingExpressions);
    function visit(node2) {
      if (isBinaryExpression(node2) && node2.operatorToken.kind === 28 /* CommaToken */) {
        visit(node2.left);
        visit(node2.right);
      } else {
        if (containsYield(node2) && pendingExpressions.length > 0) {
          emitWorker(1 /* Statement */, [factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions))]);
          pendingExpressions = [];
        }
        pendingExpressions.push(Debug.checkDefined(visitNode(node2, visitor, isExpression)));
      }
    }
  }
  function visitCommaListExpression(node) {
    let pendingExpressions = [];
    for (const elem of node.elements) {
      if (isBinaryExpression(elem) && elem.operatorToken.kind === 28 /* CommaToken */) {
        pendingExpressions.push(visitCommaExpression(elem));
      } else {
        if (containsYield(elem) && pendingExpressions.length > 0) {
          emitWorker(1 /* Statement */, [factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions))]);
          pendingExpressions = [];
        }
        pendingExpressions.push(Debug.checkDefined(visitNode(elem, visitor, isExpression)));
      }
    }
    return factory2.inlineExpressions(pendingExpressions);
  }
  function visitLogicalBinaryExpression(node) {
    const resultLabel = defineLabel();
    const resultLocal = declareLocal();
    emitAssignment(
      resultLocal,
      Debug.checkDefined(visitNode(node.left, visitor, isExpression)),
      /*location*/
      node.left
    );
    if (node.operatorToken.kind === 56 /* AmpersandAmpersandToken */) {
      emitBreakWhenFalse(
        resultLabel,
        resultLocal,
        /*location*/
        node.left
      );
    } else {
      emitBreakWhenTrue(
        resultLabel,
        resultLocal,
        /*location*/
        node.left
      );
    }
    emitAssignment(
      resultLocal,
      Debug.checkDefined(visitNode(node.right, visitor, isExpression)),
      /*location*/
      node.right
    );
    markLabel(resultLabel);
    return resultLocal;
  }
  function visitConditionalExpression(node) {
    if (containsYield(node.whenTrue) || containsYield(node.whenFalse)) {
      const whenFalseLabel = defineLabel();
      const resultLabel = defineLabel();
      const resultLocal = declareLocal();
      emitBreakWhenFalse(
        whenFalseLabel,
        Debug.checkDefined(visitNode(node.condition, visitor, isExpression)),
        /*location*/
        node.condition
      );
      emitAssignment(
        resultLocal,
        Debug.checkDefined(visitNode(node.whenTrue, visitor, isExpression)),
        /*location*/
        node.whenTrue
      );
      emitBreak(resultLabel);
      markLabel(whenFalseLabel);
      emitAssignment(
        resultLocal,
        Debug.checkDefined(visitNode(node.whenFalse, visitor, isExpression)),
        /*location*/
        node.whenFalse
      );
      markLabel(resultLabel);
      return resultLocal;
    }
    return visitEachChild(node, visitor, context);
  }
  function visitYieldExpression(node) {
    const resumeLabel = defineLabel();
    const expression = visitNode(node.expression, visitor, isExpression);
    if (node.asteriskToken) {
      const iterator = (getEmitFlags(node.expression) & 8388608 /* Iterator */) === 0 ? setTextRange(emitHelpers().createValuesHelper(expression), node) : expression;
      emitYieldStar(
        iterator,
        /*location*/
        node
      );
    } else {
      emitYield(
        expression,
        /*location*/
        node
      );
    }
    markLabel(resumeLabel);
    return createGeneratorResume(
      /*location*/
      node
    );
  }
  function visitArrayLiteralExpression(node) {
    return visitElements(
      node.elements,
      /*leadingElement*/
      void 0,
      /*location*/
      void 0,
      node.multiLine
    );
  }
  function visitElements(elements, leadingElement, location, multiLine) {
    const numInitialElements = countInitialNodesWithoutYield(elements);
    let temp;
    if (numInitialElements > 0) {
      temp = declareLocal();
      const initialElements = visitNodes2(elements, visitor, isExpression, 0, numInitialElements);
      emitAssignment(
        temp,
        factory2.createArrayLiteralExpression(
          leadingElement ? [leadingElement, ...initialElements] : initialElements
        )
      );
      leadingElement = void 0;
    }
    const expressions = reduceLeft(elements, reduceElement, [], numInitialElements);
    return temp ? factory2.createArrayConcatCall(temp, [factory2.createArrayLiteralExpression(expressions, multiLine)]) : setTextRange(
      factory2.createArrayLiteralExpression(leadingElement ? [leadingElement, ...expressions] : expressions, multiLine),
      location
    );
    function reduceElement(expressions2, element) {
      if (containsYield(element) && expressions2.length > 0) {
        const hasAssignedTemp = temp !== void 0;
        if (!temp) {
          temp = declareLocal();
        }
        emitAssignment(
          temp,
          hasAssignedTemp ? factory2.createArrayConcatCall(
            temp,
            [factory2.createArrayLiteralExpression(expressions2, multiLine)]
          ) : factory2.createArrayLiteralExpression(
            leadingElement ? [leadingElement, ...expressions2] : expressions2,
            multiLine
          )
        );
        leadingElement = void 0;
        expressions2 = [];
      }
      expressions2.push(Debug.checkDefined(visitNode(element, visitor, isExpression)));
      return expressions2;
    }
  }
  function visitObjectLiteralExpression(node) {
    const properties = node.properties;
    const multiLine = node.multiLine;
    const numInitialProperties = countInitialNodesWithoutYield(properties);
    const temp = declareLocal();
    emitAssignment(
      temp,
      factory2.createObjectLiteralExpression(
        visitNodes2(properties, visitor, isObjectLiteralElementLike, 0, numInitialProperties),
        multiLine
      )
    );
    const expressions = reduceLeft(properties, reduceProperty, [], numInitialProperties);
    expressions.push(multiLine ? startOnNewLine(setParent(setTextRange(factory2.cloneNode(temp), temp), temp.parent)) : temp);
    return factory2.inlineExpressions(expressions);
    function reduceProperty(expressions2, property) {
      if (containsYield(property) && expressions2.length > 0) {
        emitStatement(factory2.createExpressionStatement(factory2.inlineExpressions(expressions2)));
        expressions2 = [];
      }
      const expression = createExpressionForObjectLiteralElementLike(factory2, node, property, temp);
      const visited = visitNode(expression, visitor, isExpression);
      if (visited) {
        if (multiLine) {
          startOnNewLine(visited);
        }
        expressions2.push(visited);
      }
      return expressions2;
    }
  }
  function visitElementAccessExpression(node) {
    if (containsYield(node.argumentExpression)) {
      return factory2.updateElementAccessExpression(
        node,
        cacheExpression(Debug.checkDefined(visitNode(node.expression, visitor, isLeftHandSideExpression))),
        Debug.checkDefined(visitNode(node.argumentExpression, visitor, isExpression))
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitCallExpression(node) {
    if (!isImportCall(node) && forEach(node.arguments, containsYield)) {
      const { target, thisArg } = factory2.createCallBinding(
        node.expression,
        hoistVariableDeclaration,
        languageVersion,
        /*cacheIdentifiers*/
        true
      );
      return setOriginalNode(
        setTextRange(
          factory2.createFunctionApplyCall(
            cacheExpression(Debug.checkDefined(visitNode(target, visitor, isLeftHandSideExpression))),
            thisArg,
            visitElements(node.arguments)
          ),
          node
        ),
        node
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function visitNewExpression(node) {
    if (forEach(node.arguments, containsYield)) {
      const { target, thisArg } = factory2.createCallBinding(factory2.createPropertyAccessExpression(node.expression, "bind"), hoistVariableDeclaration);
      return setOriginalNode(
        setTextRange(
          factory2.createNewExpression(
            factory2.createFunctionApplyCall(
              cacheExpression(Debug.checkDefined(visitNode(target, visitor, isExpression))),
              thisArg,
              visitElements(
                node.arguments,
                /*leadingElement*/
                factory2.createVoidZero()
              )
            ),
            /*typeArguments*/
            void 0,
            []
          ),
          node
        ),
        node
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function transformAndEmitStatements(statements2, start = 0) {
    const numStatements = statements2.length;
    for (let i = start; i < numStatements; i++) {
      transformAndEmitStatement(statements2[i]);
    }
  }
  function transformAndEmitEmbeddedStatement(node) {
    if (isBlock(node)) {
      transformAndEmitStatements(node.statements);
    } else {
      transformAndEmitStatement(node);
    }
  }
  function transformAndEmitStatement(node) {
    const savedInStatementContainingYield = inStatementContainingYield;
    if (!inStatementContainingYield) {
      inStatementContainingYield = containsYield(node);
    }
    transformAndEmitStatementWorker(node);
    inStatementContainingYield = savedInStatementContainingYield;
  }
  function transformAndEmitStatementWorker(node) {
    switch (node.kind) {
      case 240 /* Block */:
        return transformAndEmitBlock(node);
      case 243 /* ExpressionStatement */:
        return transformAndEmitExpressionStatement(node);
      case 244 /* IfStatement */:
        return transformAndEmitIfStatement(node);
      case 245 /* DoStatement */:
        return transformAndEmitDoStatement(node);
      case 246 /* WhileStatement */:
        return transformAndEmitWhileStatement(node);
      case 247 /* ForStatement */:
        return transformAndEmitForStatement(node);
      case 248 /* ForInStatement */:
        return transformAndEmitForInStatement(node);
      case 250 /* ContinueStatement */:
        return transformAndEmitContinueStatement(node);
      case 251 /* BreakStatement */:
        return transformAndEmitBreakStatement(node);
      case 252 /* ReturnStatement */:
        return transformAndEmitReturnStatement(node);
      case 253 /* WithStatement */:
        return transformAndEmitWithStatement(node);
      case 254 /* SwitchStatement */:
        return transformAndEmitSwitchStatement(node);
      case 255 /* LabeledStatement */:
        return transformAndEmitLabeledStatement(node);
      case 256 /* ThrowStatement */:
        return transformAndEmitThrowStatement(node);
      case 257 /* TryStatement */:
        return transformAndEmitTryStatement(node);
      default:
        return emitStatement(visitNode(node, visitor, isStatement));
    }
  }
  function transformAndEmitBlock(node) {
    if (containsYield(node)) {
      transformAndEmitStatements(node.statements);
    } else {
      emitStatement(visitNode(node, visitor, isStatement));
    }
  }
  function transformAndEmitExpressionStatement(node) {
    emitStatement(visitNode(node, visitor, isStatement));
  }
  function transformAndEmitVariableDeclarationList(node) {
    for (const variable of node.declarations) {
      const name = factory2.cloneNode(variable.name);
      setCommentRange(name, variable.name);
      hoistVariableDeclaration(name);
    }
    const variables = getInitializedVariables(node);
    const numVariables = variables.length;
    let variablesWritten = 0;
    let pendingExpressions = [];
    while (variablesWritten < numVariables) {
      for (let i = variablesWritten; i < numVariables; i++) {
        const variable = variables[i];
        if (containsYield(variable.initializer) && pendingExpressions.length > 0) {
          break;
        }
        pendingExpressions.push(transformInitializedVariable(variable));
      }
      if (pendingExpressions.length) {
        emitStatement(factory2.createExpressionStatement(factory2.inlineExpressions(pendingExpressions)));
        variablesWritten += pendingExpressions.length;
        pendingExpressions = [];
      }
    }
    return void 0;
  }
  function transformInitializedVariable(node) {
    return setSourceMapRange(
      factory2.createAssignment(
        setSourceMapRange(factory2.cloneNode(node.name), node.name),
        Debug.checkDefined(visitNode(node.initializer, visitor, isExpression))
      ),
      node
    );
  }
  function transformAndEmitIfStatement(node) {
    if (containsYield(node)) {
      if (containsYield(node.thenStatement) || containsYield(node.elseStatement)) {
        const endLabel = defineLabel();
        const elseLabel = node.elseStatement ? defineLabel() : void 0;
        emitBreakWhenFalse(
          node.elseStatement ? elseLabel : endLabel,
          Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
          /*location*/
          node.expression
        );
        transformAndEmitEmbeddedStatement(node.thenStatement);
        if (node.elseStatement) {
          emitBreak(endLabel);
          markLabel(elseLabel);
          transformAndEmitEmbeddedStatement(node.elseStatement);
        }
        markLabel(endLabel);
      } else {
        emitStatement(visitNode(node, visitor, isStatement));
      }
    } else {
      emitStatement(visitNode(node, visitor, isStatement));
    }
  }
  function transformAndEmitDoStatement(node) {
    if (containsYield(node)) {
      const conditionLabel = defineLabel();
      const loopLabel = defineLabel();
      beginLoopBlock(
        /*continueLabel*/
        conditionLabel
      );
      markLabel(loopLabel);
      transformAndEmitEmbeddedStatement(node.statement);
      markLabel(conditionLabel);
      emitBreakWhenTrue(loopLabel, Debug.checkDefined(visitNode(node.expression, visitor, isExpression)));
      endLoopBlock();
    } else {
      emitStatement(visitNode(node, visitor, isStatement));
    }
  }
  function visitDoStatement(node) {
    if (inStatementContainingYield) {
      beginScriptLoopBlock();
      node = visitEachChild(node, visitor, context);
      endLoopBlock();
      return node;
    } else {
      return visitEachChild(node, visitor, context);
    }
  }
  function transformAndEmitWhileStatement(node) {
    if (containsYield(node)) {
      const loopLabel = defineLabel();
      const endLabel = beginLoopBlock(loopLabel);
      markLabel(loopLabel);
      emitBreakWhenFalse(endLabel, Debug.checkDefined(visitNode(node.expression, visitor, isExpression)));
      transformAndEmitEmbeddedStatement(node.statement);
      emitBreak(loopLabel);
      endLoopBlock();
    } else {
      emitStatement(visitNode(node, visitor, isStatement));
    }
  }
  function visitWhileStatement(node) {
    if (inStatementContainingYield) {
      beginScriptLoopBlock();
      node = visitEachChild(node, visitor, context);
      endLoopBlock();
      return node;
    } else {
      return visitEachChild(node, visitor, context);
    }
  }
  function transformAndEmitForStatement(node) {
    if (containsYield(node)) {
      const conditionLabel = defineLabel();
      const incrementLabel = defineLabel();
      const endLabel = beginLoopBlock(incrementLabel);
      if (node.initializer) {
        const initializer = node.initializer;
        if (isVariableDeclarationList(initializer)) {
          transformAndEmitVariableDeclarationList(initializer);
        } else {
          emitStatement(
            setTextRange(
              factory2.createExpressionStatement(
                Debug.checkDefined(visitNode(initializer, visitor, isExpression))
              ),
              initializer
            )
          );
        }
      }
      markLabel(conditionLabel);
      if (node.condition) {
        emitBreakWhenFalse(endLabel, Debug.checkDefined(visitNode(node.condition, visitor, isExpression)));
      }
      transformAndEmitEmbeddedStatement(node.statement);
      markLabel(incrementLabel);
      if (node.incrementor) {
        emitStatement(
          setTextRange(
            factory2.createExpressionStatement(
              Debug.checkDefined(visitNode(node.incrementor, visitor, isExpression))
            ),
            node.incrementor
          )
        );
      }
      emitBreak(conditionLabel);
      endLoopBlock();
    } else {
      emitStatement(visitNode(node, visitor, isStatement));
    }
  }
  function visitForStatement(node) {
    if (inStatementContainingYield) {
      beginScriptLoopBlock();
    }
    const initializer = node.initializer;
    if (initializer && isVariableDeclarationList(initializer)) {
      for (const variable of initializer.declarations) {
        hoistVariableDeclaration(variable.name);
      }
      const variables = getInitializedVariables(initializer);
      node = factory2.updateForStatement(
        node,
        variables.length > 0 ? factory2.inlineExpressions(map(variables, transformInitializedVariable)) : void 0,
        visitNode(node.condition, visitor, isExpression),
        visitNode(node.incrementor, visitor, isExpression),
        visitIterationBody(node.statement, visitor, context)
      );
    } else {
      node = visitEachChild(node, visitor, context);
    }
    if (inStatementContainingYield) {
      endLoopBlock();
    }
    return node;
  }
  function transformAndEmitForInStatement(node) {
    if (containsYield(node)) {
      const obj = declareLocal();
      const keysArray = declareLocal();
      const key = declareLocal();
      const keysIndex = factory2.createLoopVariable();
      const initializer = node.initializer;
      hoistVariableDeclaration(keysIndex);
      emitAssignment(obj, Debug.checkDefined(visitNode(node.expression, visitor, isExpression)));
      emitAssignment(keysArray, factory2.createArrayLiteralExpression());
      emitStatement(
        factory2.createForInStatement(
          key,
          obj,
          factory2.createExpressionStatement(
            factory2.createCallExpression(
              factory2.createPropertyAccessExpression(keysArray, "push"),
              /*typeArguments*/
              void 0,
              [key]
            )
          )
        )
      );
      emitAssignment(keysIndex, factory2.createNumericLiteral(0));
      const conditionLabel = defineLabel();
      const incrementLabel = defineLabel();
      const endLoopLabel = beginLoopBlock(incrementLabel);
      markLabel(conditionLabel);
      emitBreakWhenFalse(endLoopLabel, factory2.createLessThan(keysIndex, factory2.createPropertyAccessExpression(keysArray, "length")));
      emitAssignment(key, factory2.createElementAccessExpression(keysArray, keysIndex));
      emitBreakWhenFalse(incrementLabel, factory2.createBinaryExpression(key, 103 /* InKeyword */, obj));
      let variable;
      if (isVariableDeclarationList(initializer)) {
        for (const variable2 of initializer.declarations) {
          hoistVariableDeclaration(variable2.name);
        }
        variable = factory2.cloneNode(initializer.declarations[0].name);
      } else {
        variable = Debug.checkDefined(visitNode(initializer, visitor, isExpression));
        Debug.assert(isLeftHandSideExpression(variable));
      }
      emitAssignment(variable, key);
      transformAndEmitEmbeddedStatement(node.statement);
      markLabel(incrementLabel);
      emitStatement(factory2.createExpressionStatement(factory2.createPostfixIncrement(keysIndex)));
      emitBreak(conditionLabel);
      endLoopBlock();
    } else {
      emitStatement(visitNode(node, visitor, isStatement));
    }
  }
  function visitForInStatement(node) {
    if (inStatementContainingYield) {
      beginScriptLoopBlock();
    }
    const initializer = node.initializer;
    if (isVariableDeclarationList(initializer)) {
      for (const variable of initializer.declarations) {
        hoistVariableDeclaration(variable.name);
      }
      node = factory2.updateForInStatement(
        node,
        initializer.declarations[0].name,
        Debug.checkDefined(visitNode(node.expression, visitor, isExpression)),
        Debug.checkDefined(visitNode(node.statement, visitor, isStatement, factory2.liftToBlock))
      );
    } else {
      node = visitEachChild(node, visitor, context);
    }
    if (inStatementContainingYield) {
      endLoopBlock();
    }
    return node;
  }
  function transformAndEmitContinueStatement(node) {
    const label = findContinueTarget(node.label ? idText(node.label) : void 0);
    if (label > 0) {
      emitBreak(
        label,
        /*location*/
        node
      );
    } else {
      emitStatement(node);
    }
  }
  function visitContinueStatement(node) {
    if (inStatementContainingYield) {
      const label = findContinueTarget(node.label && idText(node.label));
      if (label > 0) {
        return createInlineBreak(
          label,
          /*location*/
          node
        );
      }
    }
    return visitEachChild(node, visitor, context);
  }
  function transformAndEmitBreakStatement(node) {
    const label = findBreakTarget(node.label ? idText(node.label) : void 0);
    if (label > 0) {
      emitBreak(
        label,
        /*location*/
        node
      );
    } else {
      emitStatement(node);
    }
  }
  function visitBreakStatement(node) {
    if (inStatementContainingYield) {
      const label = findBreakTarget(node.label && idText(node.label));
      if (label > 0) {
        return createInlineBreak(
          label,
          /*location*/
          node
        );
      }
    }
    return visitEachChild(node, visitor, context);
  }
  function transformAndEmitReturnStatement(node) {
    emitReturn(
      visitNode(node.expression, visitor, isExpression),
      /*location*/
      node
    );
  }
  function visitReturnStatement(node) {
    return createInlineReturn(
      visitNode(node.expression, visitor, isExpression),
      /*location*/
      node
    );
  }
  function transformAndEmitWithStatement(node) {
    if (containsYield(node)) {
      beginWithBlock(cacheExpression(Debug.checkDefined(visitNode(node.expression, visitor, isExpression))));
      transformAndEmitEmbeddedStatement(node.statement);
      endWithBlock();
    } else {
      emitStatement(visitNode(node, visitor, isStatement));
    }
  }
  function transformAndEmitSwitchStatement(node) {
    if (containsYield(node.caseBlock)) {
      const caseBlock = node.caseBlock;
      const numClauses = caseBlock.clauses.length;
      const endLabel = beginSwitchBlock();
      const expression = cacheExpression(Debug.checkDefined(visitNode(node.expression, visitor, isExpression)));
      const clauseLabels = [];
      let defaultClauseIndex = -1;
      for (let i = 0; i < numClauses; i++) {
        const clause = caseBlock.clauses[i];
        clauseLabels.push(defineLabel());
        if (clause.kind === 296 /* DefaultClause */ && defaultClauseIndex === -1) {
          defaultClauseIndex = i;
        }
      }
      let clausesWritten = 0;
      let pendingClauses = [];
      while (clausesWritten < numClauses) {
        let defaultClausesSkipped = 0;
        for (let i = clausesWritten; i < numClauses; i++) {
          const clause = caseBlock.clauses[i];
          if (clause.kind === 295 /* CaseClause */) {
            if (containsYield(clause.expression) && pendingClauses.length > 0) {
              break;
            }
            pendingClauses.push(
              factory2.createCaseClause(
                Debug.checkDefined(visitNode(clause.expression, visitor, isExpression)),
                [
                  createInlineBreak(
                    clauseLabels[i],
                    /*location*/
                    clause.expression
                  )
                ]
              )
            );
          } else {
            defaultClausesSkipped++;
          }
        }
        if (pendingClauses.length) {
          emitStatement(factory2.createSwitchStatement(expression, factory2.createCaseBlock(pendingClauses)));
          clausesWritten += pendingClauses.length;
          pendingClauses = [];
        }
        if (defaultClausesSkipped > 0) {
          clausesWritten += defaultClausesSkipped;
          defaultClausesSkipped = 0;
        }
      }
      if (defaultClauseIndex >= 0) {
        emitBreak(clauseLabels[defaultClauseIndex]);
      } else {
        emitBreak(endLabel);
      }
      for (let i = 0; i < numClauses; i++) {
        markLabel(clauseLabels[i]);
        transformAndEmitStatements(caseBlock.clauses[i].statements);
      }
      endSwitchBlock();
    } else {
      emitStatement(visitNode(node, visitor, isStatement));
    }
  }
  function visitSwitchStatement(node) {
    if (inStatementContainingYield) {
      beginScriptSwitchBlock();
    }
    node = visitEachChild(node, visitor, context);
    if (inStatementContainingYield) {
      endSwitchBlock();
    }
    return node;
  }
  function transformAndEmitLabeledStatement(node) {
    if (containsYield(node)) {
      beginLabeledBlock(idText(node.label));
      transformAndEmitEmbeddedStatement(node.statement);
      endLabeledBlock();
    } else {
      emitStatement(visitNode(node, visitor, isStatement));
    }
  }
  function visitLabeledStatement(node) {
    if (inStatementContainingYield) {
      beginScriptLabeledBlock(idText(node.label));
    }
    node = visitEachChild(node, visitor, context);
    if (inStatementContainingYield) {
      endLabeledBlock();
    }
    return node;
  }
  function transformAndEmitThrowStatement(node) {
    emitThrow(
      Debug.checkDefined(visitNode(node.expression ?? factory2.createVoidZero(), visitor, isExpression)),
      /*location*/
      node
    );
  }
  function transformAndEmitTryStatement(node) {
    if (containsYield(node)) {
      beginExceptionBlock();
      transformAndEmitEmbeddedStatement(node.tryBlock);
      if (node.catchClause) {
        beginCatchBlock(node.catchClause.variableDeclaration);
        transformAndEmitEmbeddedStatement(node.catchClause.block);
      }
      if (node.finallyBlock) {
        beginFinallyBlock();
        transformAndEmitEmbeddedStatement(node.finallyBlock);
      }
      endExceptionBlock();
    } else {
      emitStatement(visitEachChild(node, visitor, context));
    }
  }
  function containsYield(node) {
    return !!node && (node.transformFlags & 1048576 /* ContainsYield */) !== 0;
  }
  function countInitialNodesWithoutYield(nodes) {
    const numNodes = nodes.length;
    for (let i = 0; i < numNodes; i++) {
      if (containsYield(nodes[i])) {
        return i;
      }
    }
    return -1;
  }
  function onSubstituteNode(hint, node) {
    node = previousOnSubstituteNode(hint, node);
    if (hint === 1 /* Expression */) {
      return substituteExpression(node);
    }
    return node;
  }
  function substituteExpression(node) {
    if (isIdentifier(node)) {
      return substituteExpressionIdentifier(node);
    }
    return node;
  }
  function substituteExpressionIdentifier(node) {
    if (!isGeneratedIdentifier(node) && renamedCatchVariables && renamedCatchVariables.has(idText(node))) {
      const original = getOriginalNode(node);
      if (isIdentifier(original) && original.parent) {
        const declaration = resolver.getReferencedValueDeclaration(original);
        if (declaration) {
          const name = renamedCatchVariableDeclarations[getOriginalNodeId(declaration)];
          if (name) {
            const clone2 = setParent(setTextRange(factory2.cloneNode(name), name), name.parent);
            setSourceMapRange(clone2, node);
            setCommentRange(clone2, node);
            return clone2;
          }
        }
      }
    }
    return node;
  }
  function cacheExpression(node) {
    if (isGeneratedIdentifier(node) || getEmitFlags(node) & 8192 /* HelperName */) {
      return node;
    }
    const temp = factory2.createTempVariable(hoistVariableDeclaration);
    emitAssignment(
      temp,
      node,
      /*location*/
      node
    );
    return temp;
  }
  function declareLocal(name) {
    const temp = name ? factory2.createUniqueName(name) : factory2.createTempVariable(
      /*recordTempVariable*/
      void 0
    );
    hoistVariableDeclaration(temp);
    return temp;
  }
  function defineLabel() {
    if (!labelOffsets) {
      labelOffsets = [];
    }
    const label = nextLabelId;
    nextLabelId++;
    labelOffsets[label] = -1;
    return label;
  }
  function markLabel(label) {
    Debug.assert(labelOffsets !== void 0, "No labels were defined.");
    labelOffsets[label] = operations ? operations.length : 0;
  }
  function beginBlock(block) {
    if (!blocks) {
      blocks = [];
      blockActions = [];
      blockOffsets = [];
      blockStack = [];
    }
    const index = blockActions.length;
    blockActions[index] = 0 /* Open */;
    blockOffsets[index] = operations ? operations.length : 0;
    blocks[index] = block;
    blockStack.push(block);
    return index;
  }
  function endBlock() {
    const block = peekBlock();
    if (block === void 0)
      return Debug.fail("beginBlock was never called.");
    const index = blockActions.length;
    blockActions[index] = 1 /* Close */;
    blockOffsets[index] = operations ? operations.length : 0;
    blocks[index] = block;
    blockStack.pop();
    return block;
  }
  function peekBlock() {
    return lastOrUndefined(blockStack);
  }
  function peekBlockKind() {
    const block = peekBlock();
    return block && block.kind;
  }
  function beginWithBlock(expression) {
    const startLabel = defineLabel();
    const endLabel = defineLabel();
    markLabel(startLabel);
    beginBlock({
      kind: 1 /* With */,
      expression,
      startLabel,
      endLabel
    });
  }
  function endWithBlock() {
    Debug.assert(peekBlockKind() === 1 /* With */);
    const block = endBlock();
    markLabel(block.endLabel);
  }
  function beginExceptionBlock() {
    const startLabel = defineLabel();
    const endLabel = defineLabel();
    markLabel(startLabel);
    beginBlock({
      kind: 0 /* Exception */,
      state: 0 /* Try */,
      startLabel,
      endLabel
    });
    emitNop();
    return endLabel;
  }
  function beginCatchBlock(variable) {
    Debug.assert(peekBlockKind() === 0 /* Exception */);
    let name;
    if (isGeneratedIdentifier(variable.name)) {
      name = variable.name;
      hoistVariableDeclaration(variable.name);
    } else {
      const text = idText(variable.name);
      name = declareLocal(text);
      if (!renamedCatchVariables) {
        renamedCatchVariables = /* @__PURE__ */ new Map();
        renamedCatchVariableDeclarations = [];
        context.enableSubstitution(80 /* Identifier */);
      }
      renamedCatchVariables.set(text, true);
      renamedCatchVariableDeclarations[getOriginalNodeId(variable)] = name;
    }
    const exception = peekBlock();
    Debug.assert(exception.state < 1 /* Catch */);
    const endLabel = exception.endLabel;
    emitBreak(endLabel);
    const catchLabel = defineLabel();
    markLabel(catchLabel);
    exception.state = 1 /* Catch */;
    exception.catchVariable = name;
    exception.catchLabel = catchLabel;
    emitAssignment(name, factory2.createCallExpression(
      factory2.createPropertyAccessExpression(state, "sent"),
      /*typeArguments*/
      void 0,
      []
    ));
    emitNop();
  }
  function beginFinallyBlock() {
    Debug.assert(peekBlockKind() === 0 /* Exception */);
    const exception = peekBlock();
    Debug.assert(exception.state < 2 /* Finally */);
    const endLabel = exception.endLabel;
    emitBreak(endLabel);
    const finallyLabel = defineLabel();
    markLabel(finallyLabel);
    exception.state = 2 /* Finally */;
    exception.finallyLabel = finallyLabel;
  }
  function endExceptionBlock() {
    Debug.assert(peekBlockKind() === 0 /* Exception */);
    const exception = endBlock();
    const state2 = exception.state;
    if (state2 < 2 /* Finally */) {
      emitBreak(exception.endLabel);
    } else {
      emitEndfinally();
    }
    markLabel(exception.endLabel);
    emitNop();
    exception.state = 3 /* Done */;
  }
  function beginScriptLoopBlock() {
    beginBlock({
      kind: 3 /* Loop */,
      isScript: true,
      breakLabel: -1,
      continueLabel: -1
    });
  }
  function beginLoopBlock(continueLabel) {
    const breakLabel = defineLabel();
    beginBlock({
      kind: 3 /* Loop */,
      isScript: false,
      breakLabel,
      continueLabel
    });
    return breakLabel;
  }
  function endLoopBlock() {
    Debug.assert(peekBlockKind() === 3 /* Loop */);
    const block = endBlock();
    const breakLabel = block.breakLabel;
    if (!block.isScript) {
      markLabel(breakLabel);
    }
  }
  function beginScriptSwitchBlock() {
    beginBlock({
      kind: 2 /* Switch */,
      isScript: true,
      breakLabel: -1
    });
  }
  function beginSwitchBlock() {
    const breakLabel = defineLabel();
    beginBlock({
      kind: 2 /* Switch */,
      isScript: false,
      breakLabel
    });
    return breakLabel;
  }
  function endSwitchBlock() {
    Debug.assert(peekBlockKind() === 2 /* Switch */);
    const block = endBlock();
    const breakLabel = block.breakLabel;
    if (!block.isScript) {
      markLabel(breakLabel);
    }
  }
  function beginScriptLabeledBlock(labelText) {
    beginBlock({
      kind: 4 /* Labeled */,
      isScript: true,
      labelText,
      breakLabel: -1
    });
  }
  function beginLabeledBlock(labelText) {
    const breakLabel = defineLabel();
    beginBlock({
      kind: 4 /* Labeled */,
      isScript: false,
      labelText,
      breakLabel
    });
  }
  function endLabeledBlock() {
    Debug.assert(peekBlockKind() === 4 /* Labeled */);
    const block = endBlock();
    if (!block.isScript) {
      markLabel(block.breakLabel);
    }
  }
  function supportsUnlabeledBreak(block) {
    return block.kind === 2 /* Switch */ || block.kind === 3 /* Loop */;
  }
  function supportsLabeledBreakOrContinue(block) {
    return block.kind === 4 /* Labeled */;
  }
  function supportsUnlabeledContinue(block) {
    return block.kind === 3 /* Loop */;
  }
  function hasImmediateContainingLabeledBlock(labelText, start) {
    for (let j = start; j >= 0; j--) {
      const containingBlock = blockStack[j];
      if (supportsLabeledBreakOrContinue(containingBlock)) {
        if (containingBlock.labelText === labelText) {
          return true;
        }
      } else {
        break;
      }
    }
    return false;
  }
  function findBreakTarget(labelText) {
    if (blockStack) {
      if (labelText) {
        for (let i = blockStack.length - 1; i >= 0; i--) {
          const block = blockStack[i];
          if (supportsLabeledBreakOrContinue(block) && block.labelText === labelText) {
            return block.breakLabel;
          } else if (supportsUnlabeledBreak(block) && hasImmediateContainingLabeledBlock(labelText, i - 1)) {
            return block.breakLabel;
          }
        }
      } else {
        for (let i = blockStack.length - 1; i >= 0; i--) {
          const block = blockStack[i];
          if (supportsUnlabeledBreak(block)) {
            return block.breakLabel;
          }
        }
      }
    }
    return 0;
  }
  function findContinueTarget(labelText) {
    if (blockStack) {
      if (labelText) {
        for (let i = blockStack.length - 1; i >= 0; i--) {
          const block = blockStack[i];
          if (supportsUnlabeledContinue(block) && hasImmediateContainingLabeledBlock(labelText, i - 1)) {
            return block.continueLabel;
          }
        }
      } else {
        for (let i = blockStack.length - 1; i >= 0; i--) {
          const block = blockStack[i];
          if (supportsUnlabeledContinue(block)) {
            return block.continueLabel;
          }
        }
      }
    }
    return 0;
  }
  function createLabel(label) {
    if (label !== void 0 && label > 0) {
      if (labelExpressions === void 0) {
        labelExpressions = [];
      }
      const expression = factory2.createNumericLiteral(-1);
      if (labelExpressions[label] === void 0) {
        labelExpressions[label] = [expression];
      } else {
        labelExpressions[label].push(expression);
      }
      return expression;
    }
    return factory2.createOmittedExpression();
  }
  function createInstruction(instruction) {
    const literal = factory2.createNumericLiteral(instruction);
    addSyntheticTrailingComment(literal, 3 /* MultiLineCommentTrivia */, getInstructionName(instruction));
    return literal;
  }
  function createInlineBreak(label, location) {
    Debug.assertLessThan(0, label, "Invalid label");
    return setTextRange(
      factory2.createReturnStatement(
        factory2.createArrayLiteralExpression([
          createInstruction(3 /* Break */),
          createLabel(label)
        ])
      ),
      location
    );
  }
  function createInlineReturn(expression, location) {
    return setTextRange(
      factory2.createReturnStatement(
        factory2.createArrayLiteralExpression(
          expression ? [createInstruction(2 /* Return */), expression] : [createInstruction(2 /* Return */)]
        )
      ),
      location
    );
  }
  function createGeneratorResume(location) {
    return setTextRange(
      factory2.createCallExpression(
        factory2.createPropertyAccessExpression(state, "sent"),
        /*typeArguments*/
        void 0,
        []
      ),
      location
    );
  }
  function emitNop() {
    emitWorker(0 /* Nop */);
  }
  function emitStatement(node) {
    if (node) {
      emitWorker(1 /* Statement */, [node]);
    } else {
      emitNop();
    }
  }
  function emitAssignment(left, right, location) {
    emitWorker(2 /* Assign */, [left, right], location);
  }
  function emitBreak(label, location) {
    emitWorker(3 /* Break */, [label], location);
  }
  function emitBreakWhenTrue(label, condition, location) {
    emitWorker(4 /* BreakWhenTrue */, [label, condition], location);
  }
  function emitBreakWhenFalse(label, condition, location) {
    emitWorker(5 /* BreakWhenFalse */, [label, condition], location);
  }
  function emitYieldStar(expression, location) {
    emitWorker(7 /* YieldStar */, [expression], location);
  }
  function emitYield(expression, location) {
    emitWorker(6 /* Yield */, [expression], location);
  }
  function emitReturn(expression, location) {
    emitWorker(8 /* Return */, [expression], location);
  }
  function emitThrow(expression, location) {
    emitWorker(9 /* Throw */, [expression], location);
  }
  function emitEndfinally() {
    emitWorker(10 /* Endfinally */);
  }
  function emitWorker(code, args, location) {
    if (operations === void 0) {
      operations = [];
      operationArguments = [];
      operationLocations = [];
    }
    if (labelOffsets === void 0) {
      markLabel(defineLabel());
    }
    const operationIndex = operations.length;
    operations[operationIndex] = code;
    operationArguments[operationIndex] = args;
    operationLocations[operationIndex] = location;
  }
  function build2() {
    blockIndex = 0;
    labelNumber = 0;
    labelNumbers = void 0;
    lastOperationWasAbrupt = false;
    lastOperationWasCompletion = false;
    clauses = void 0;
    statements = void 0;
    exceptionBlockStack = void 0;
    currentExceptionBlock = void 0;
    withBlockStack = void 0;
    const buildResult = buildStatements();
    return emitHelpers().createGeneratorHelper(
      setEmitFlags(
        factory2.createFunctionExpression(
          /*modifiers*/
          void 0,
          /*asteriskToken*/
          void 0,
          /*name*/
          void 0,
          /*typeParameters*/
          void 0,
          [factory2.createParameterDeclaration(
            /*modifiers*/
            void 0,
            /*dotDotDotToken*/
            void 0,
            state
          )],
          /*type*/
          void 0,
          factory2.createBlock(
            buildResult,
            /*multiLine*/
            buildResult.length > 0
          )
        ),
        1048576 /* ReuseTempVariableScope */
      )
    );
  }
  function buildStatements() {
    if (operations) {
      for (let operationIndex = 0; operationIndex < operations.length; operationIndex++) {
        writeOperation(operationIndex);
      }
      flushFinalLabel(operations.length);
    } else {
      flushFinalLabel(0);
    }
    if (clauses) {
      const labelExpression = factory2.createPropertyAccessExpression(state, "label");
      const switchStatement = factory2.createSwitchStatement(labelExpression, factory2.createCaseBlock(clauses));
      return [startOnNewLine(switchStatement)];
    }
    if (statements) {
      return statements;
    }
    return [];
  }
  function flushLabel() {
    if (!statements) {
      return;
    }
    appendLabel(
      /*markLabelEnd*/
      !lastOperationWasAbrupt
    );
    lastOperationWasAbrupt = false;
    lastOperationWasCompletion = false;
    labelNumber++;
  }
  function flushFinalLabel(operationIndex) {
    if (isFinalLabelReachable(operationIndex)) {
      tryEnterLabel(operationIndex);
      withBlockStack = void 0;
      writeReturn(
        /*expression*/
        void 0,
        /*operationLocation*/
        void 0
      );
    }
    if (statements && clauses) {
      appendLabel(
        /*markLabelEnd*/
        false
      );
    }
    updateLabelExpressions();
  }
  function isFinalLabelReachable(operationIndex) {
    if (!lastOperationWasCompletion) {
      return true;
    }
    if (!labelOffsets || !labelExpressions) {
      return false;
    }
    for (let label = 0; label < labelOffsets.length; label++) {
      if (labelOffsets[label] === operationIndex && labelExpressions[label]) {
        return true;
      }
    }
    return false;
  }
  function appendLabel(markLabelEnd) {
    if (!clauses) {
      clauses = [];
    }
    if (statements) {
      if (withBlockStack) {
        for (let i = withBlockStack.length - 1; i >= 0; i--) {
          const withBlock = withBlockStack[i];
          statements = [factory2.createWithStatement(withBlock.expression, factory2.createBlock(statements))];
        }
      }
      if (currentExceptionBlock) {
        const { startLabel, catchLabel, finallyLabel, endLabel } = currentExceptionBlock;
        statements.unshift(
          factory2.createExpressionStatement(
            factory2.createCallExpression(
              factory2.createPropertyAccessExpression(factory2.createPropertyAccessExpression(state, "trys"), "push"),
              /*typeArguments*/
              void 0,
              [
                factory2.createArrayLiteralExpression([
                  createLabel(startLabel),
                  createLabel(catchLabel),
                  createLabel(finallyLabel),
                  createLabel(endLabel)
                ])
              ]
            )
          )
        );
        currentExceptionBlock = void 0;
      }
      if (markLabelEnd) {
        statements.push(
          factory2.createExpressionStatement(
            factory2.createAssignment(
              factory2.createPropertyAccessExpression(state, "label"),
              factory2.createNumericLiteral(labelNumber + 1)
            )
          )
        );
      }
    }
    clauses.push(
      factory2.createCaseClause(
        factory2.createNumericLiteral(labelNumber),
        statements || []
      )
    );
    statements = void 0;
  }
  function tryEnterLabel(operationIndex) {
    if (!labelOffsets) {
      return;
    }
    for (let label = 0; label < labelOffsets.length; label++) {
      if (labelOffsets[label] === operationIndex) {
        flushLabel();
        if (labelNumbers === void 0) {
          labelNumbers = [];
        }
        if (labelNumbers[labelNumber] === void 0) {
          labelNumbers[labelNumber] = [label];
        } else {
          labelNumbers[labelNumber].push(label);
        }
      }
    }
  }
  function updateLabelExpressions() {
    if (labelExpressions !== void 0 && labelNumbers !== void 0) {
      for (let labelNumber2 = 0; labelNumber2 < labelNumbers.length; labelNumber2++) {
        const labels = labelNumbers[labelNumber2];
        if (labels !== void 0) {
          for (const label of labels) {
            const expressions = labelExpressions[label];
            if (expressions !== void 0) {
              for (const expression of expressions) {
                expression.text = String(labelNumber2);
              }
            }
          }
        }
      }
    }
  }
  function tryEnterOrLeaveBlock(operationIndex) {
    if (blocks) {
      for (; blockIndex < blockActions.length && blockOffsets[blockIndex] <= operationIndex; blockIndex++) {
        const block = blocks[blockIndex];
        const blockAction = blockActions[blockIndex];
        switch (block.kind) {
          case 0 /* Exception */:
            if (blockAction === 0 /* Open */) {
              if (!exceptionBlockStack) {
                exceptionBlockStack = [];
              }
              if (!statements) {
                statements = [];
              }
              exceptionBlockStack.push(currentExceptionBlock);
              currentExceptionBlock = block;
            } else if (blockAction === 1 /* Close */) {
              currentExceptionBlock = exceptionBlockStack.pop();
            }
            break;
          case 1 /* With */:
            if (blockAction === 0 /* Open */) {
              if (!withBlockStack) {
                withBlockStack = [];
              }
              withBlockStack.push(block);
            } else if (blockAction === 1 /* Close */) {
              withBlockStack.pop();
            }
            break;
        }
      }
    }
  }
  function writeOperation(operationIndex) {
    tryEnterLabel(operationIndex);
    tryEnterOrLeaveBlock(operationIndex);
    if (lastOperationWasAbrupt) {
      return;
    }
    lastOperationWasAbrupt = false;
    lastOperationWasCompletion = false;
    const opcode = operations[operationIndex];
    if (opcode === 0 /* Nop */) {
      return;
    } else if (opcode === 10 /* Endfinally */) {
      return writeEndfinally();
    }
    const args = operationArguments[operationIndex];
    if (opcode === 1 /* Statement */) {
      return writeStatement(args[0]);
    }
    const location = operationLocations[operationIndex];
    switch (opcode) {
      case 2 /* Assign */:
        return writeAssign(args[0], args[1], location);
      case 3 /* Break */:
        return writeBreak(args[0], location);
      case 4 /* BreakWhenTrue */:
        return writeBreakWhenTrue(args[0], args[1], location);
      case 5 /* BreakWhenFalse */:
        return writeBreakWhenFalse(args[0], args[1], location);
      case 6 /* Yield */:
        return writeYield(args[0], location);
      case 7 /* YieldStar */:
        return writeYieldStar(args[0], location);
      case 8 /* Return */:
        return writeReturn(args[0], location);
      case 9 /* Throw */:
        return writeThrow(args[0], location);
    }
  }
  function writeStatement(statement) {
    if (statement) {
      if (!statements) {
        statements = [statement];
      } else {
        statements.push(statement);
      }
    }
  }
  function writeAssign(left, right, operationLocation) {
    writeStatement(setTextRange(factory2.createExpressionStatement(factory2.createAssignment(left, right)), operationLocation));
  }
  function writeThrow(expression, operationLocation) {
    lastOperationWasAbrupt = true;
    lastOperationWasCompletion = true;
    writeStatement(setTextRange(factory2.createThrowStatement(expression), operationLocation));
  }
  function writeReturn(expression, operationLocation) {
    lastOperationWasAbrupt = true;
    lastOperationWasCompletion = true;
    writeStatement(
      setEmitFlags(
        setTextRange(
          factory2.createReturnStatement(
            factory2.createArrayLiteralExpression(
              expression ? [createInstruction(2 /* Return */), expression] : [createInstruction(2 /* Return */)]
            )
          ),
          operationLocation
        ),
        768 /* NoTokenSourceMaps */
      )
    );
  }
  function writeBreak(label, operationLocation) {
    lastOperationWasAbrupt = true;
    writeStatement(
      setEmitFlags(
        setTextRange(
          factory2.createReturnStatement(
            factory2.createArrayLiteralExpression([
              createInstruction(3 /* Break */),
              createLabel(label)
            ])
          ),
          operationLocation
        ),
        768 /* NoTokenSourceMaps */
      )
    );
  }
  function writeBreakWhenTrue(label, condition, operationLocation) {
    writeStatement(
      setEmitFlags(
        factory2.createIfStatement(
          condition,
          setEmitFlags(
            setTextRange(
              factory2.createReturnStatement(
                factory2.createArrayLiteralExpression([
                  createInstruction(3 /* Break */),
                  createLabel(label)
                ])
              ),
              operationLocation
            ),
            768 /* NoTokenSourceMaps */
          )
        ),
        1 /* SingleLine */
      )
    );
  }
  function writeBreakWhenFalse(label, condition, operationLocation) {
    writeStatement(
      setEmitFlags(
        factory2.createIfStatement(
          factory2.createLogicalNot(condition),
          setEmitFlags(
            setTextRange(
              factory2.createReturnStatement(
                factory2.createArrayLiteralExpression([
                  createInstruction(3 /* Break */),
                  createLabel(label)
                ])
              ),
              operationLocation
            ),
            768 /* NoTokenSourceMaps */
          )
        ),
        1 /* SingleLine */
      )
    );
  }
  function writeYield(expression, operationLocation) {
    lastOperationWasAbrupt = true;
    writeStatement(
      setEmitFlags(
        setTextRange(
          factory2.createReturnStatement(
            factory2.createArrayLiteralExpression(
              expression ? [createInstruction(4 /* Yield */), expression] : [createInstruction(4 /* Yield */)]
            )
          ),
          operationLocation
        ),
        768 /* NoTokenSourceMaps */
      )
    );
  }
  function writeYieldStar(expression, operationLocation) {
    lastOperationWasAbrupt = true;
    writeStatement(
      setEmitFlags(
        setTextRange(
          factory2.createReturnStatement(
            factory2.createArrayLiteralExpression([
              createInstruction(5 /* YieldStar */),
              expression
            ])
          ),
          operationLocation
        ),
        768 /* NoTokenSourceMaps */
      )
    );
  }
  function writeEndfinally() {
    lastOperationWasAbrupt = true;
    writeStatement(
      factory2.createReturnStatement(
        factory2.createArrayLiteralExpression([
          createInstruction(7 /* Endfinally */)
        ])
      )
    );
  }
}

// src/compiler/transformers/module/module.ts
function transformModule(context) {
  function getTransformModuleDelegate(moduleKind2) {
    switch (moduleKind2) {
      case 2 /* AMD */:
        return transformAMDModule;
      case 3 /* UMD */:
        return transformUMDModule;
      default:
        return transformCommonJSModule;
    }
  }
  const {
    factory: factory2,
    getEmitHelperFactory: emitHelpers,
    startLexicalEnvironment,
    endLexicalEnvironment,
    hoistVariableDeclaration
  } = context;
  const compilerOptions = context.getCompilerOptions();
  const resolver = context.getEmitResolver();
  const host = context.getEmitHost();
  const languageVersion = getEmitScriptTarget(compilerOptions);
  const moduleKind = getEmitModuleKind(compilerOptions);
  const previousOnSubstituteNode = context.onSubstituteNode;
  const previousOnEmitNode = context.onEmitNode;
  context.onSubstituteNode = onSubstituteNode;
  context.onEmitNode = onEmitNode;
  context.enableSubstitution(212 /* CallExpression */);
  context.enableSubstitution(214 /* TaggedTemplateExpression */);
  context.enableSubstitution(80 /* Identifier */);
  context.enableSubstitution(225 /* BinaryExpression */);
  context.enableSubstitution(303 /* ShorthandPropertyAssignment */);
  context.enableEmitNotification(311 /* SourceFile */);
  const moduleInfoMap = [];
  let currentSourceFile;
  let currentModuleInfo;
  const noSubstitution = [];
  let needUMDDynamicImportHelper;
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    if (node.isDeclarationFile || !(isEffectiveExternalModule(node, compilerOptions) || node.transformFlags & 8388608 /* ContainsDynamicImport */ || isJsonSourceFile(node) && hasJsonModuleEmitEnabled(compilerOptions) && outFile(compilerOptions))) {
      return node;
    }
    currentSourceFile = node;
    currentModuleInfo = collectExternalModuleInfo(context, node, resolver, compilerOptions);
    moduleInfoMap[getOriginalNodeId(node)] = currentModuleInfo;
    const transformModule2 = getTransformModuleDelegate(moduleKind);
    const updated = transformModule2(node);
    currentSourceFile = void 0;
    currentModuleInfo = void 0;
    needUMDDynamicImportHelper = false;
    return updated;
  }
  function shouldEmitUnderscoreUnderscoreESModule() {
    if (!currentModuleInfo.exportEquals && isExternalModule(currentSourceFile)) {
      return true;
    }
    return false;
  }
  function transformCommonJSModule(node) {
    startLexicalEnvironment();
    const statements = [];
    const ensureUseStrict = getStrictOptionValue(compilerOptions, "alwaysStrict") || !compilerOptions.noImplicitUseStrict && isExternalModule(currentSourceFile);
    const statementOffset = factory2.copyPrologue(node.statements, statements, ensureUseStrict && !isJsonSourceFile(node), topLevelVisitor);
    if (shouldEmitUnderscoreUnderscoreESModule()) {
      append(statements, createUnderscoreUnderscoreESModule());
    }
    if (length(currentModuleInfo.exportedNames)) {
      const chunkSize = 50;
      for (let i = 0; i < currentModuleInfo.exportedNames.length; i += chunkSize) {
        append(
          statements,
          factory2.createExpressionStatement(
            reduceLeft(
              currentModuleInfo.exportedNames.slice(i, i + chunkSize),
              (prev, nextId) => factory2.createAssignment(factory2.createPropertyAccessExpression(factory2.createIdentifier("exports"), factory2.createIdentifier(idText(nextId))), prev),
              factory2.createVoidZero()
            )
          )
        );
      }
    }
    append(statements, visitNode(currentModuleInfo.externalHelpersImportDeclaration, topLevelVisitor, isStatement));
    addRange(statements, visitNodes2(node.statements, topLevelVisitor, isStatement, statementOffset));
    addExportEqualsIfNeeded(
      statements,
      /*emitAsReturn*/
      false
    );
    insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
    const updated = factory2.updateSourceFile(node, setTextRange(factory2.createNodeArray(statements), node.statements));
    addEmitHelpers(updated, context.readEmitHelpers());
    return updated;
  }
  function transformAMDModule(node) {
    const define = factory2.createIdentifier("define");
    const moduleName = tryGetModuleNameFromFile(factory2, node, host, compilerOptions);
    const jsonSourceFile = isJsonSourceFile(node) && node;
    const { aliasedModuleNames, unaliasedModuleNames, importAliasNames } = collectAsynchronousDependencies(
      node,
      /*includeNonAmdDependencies*/
      true
    );
    const updated = factory2.updateSourceFile(
      node,
      setTextRange(
        factory2.createNodeArray([
          factory2.createExpressionStatement(
            factory2.createCallExpression(
              define,
              /*typeArguments*/
              void 0,
              [
                // Add the module name (if provided).
                ...moduleName ? [moduleName] : [],
                // Add the dependency array argument:
                //
                //     ["require", "exports", module1", "module2", ...]
                factory2.createArrayLiteralExpression(jsonSourceFile ? emptyArray : [
                  factory2.createStringLiteral("require"),
                  factory2.createStringLiteral("exports"),
                  ...aliasedModuleNames,
                  ...unaliasedModuleNames
                ]),
                // Add the module body function argument:
                //
                //     function (require, exports, module1, module2) ...
                jsonSourceFile ? jsonSourceFile.statements.length ? jsonSourceFile.statements[0].expression : factory2.createObjectLiteralExpression() : factory2.createFunctionExpression(
                  /*modifiers*/
                  void 0,
                  /*asteriskToken*/
                  void 0,
                  /*name*/
                  void 0,
                  /*typeParameters*/
                  void 0,
                  [
                    factory2.createParameterDeclaration(
                      /*modifiers*/
                      void 0,
                      /*dotDotDotToken*/
                      void 0,
                      "require"
                    ),
                    factory2.createParameterDeclaration(
                      /*modifiers*/
                      void 0,
                      /*dotDotDotToken*/
                      void 0,
                      "exports"
                    ),
                    ...importAliasNames
                  ],
                  /*type*/
                  void 0,
                  transformAsynchronousModuleBody(node)
                )
              ]
            )
          )
        ]),
        /*location*/
        node.statements
      )
    );
    addEmitHelpers(updated, context.readEmitHelpers());
    return updated;
  }
  function transformUMDModule(node) {
    const { aliasedModuleNames, unaliasedModuleNames, importAliasNames } = collectAsynchronousDependencies(
      node,
      /*includeNonAmdDependencies*/
      false
    );
    const moduleName = tryGetModuleNameFromFile(factory2, node, host, compilerOptions);
    const umdHeader = factory2.createFunctionExpression(
      /*modifiers*/
      void 0,
      /*asteriskToken*/
      void 0,
      /*name*/
      void 0,
      /*typeParameters*/
      void 0,
      [factory2.createParameterDeclaration(
        /*modifiers*/
        void 0,
        /*dotDotDotToken*/
        void 0,
        "factory"
      )],
      /*type*/
      void 0,
      setTextRange(
        factory2.createBlock(
          [
            factory2.createIfStatement(
              factory2.createLogicalAnd(
                factory2.createTypeCheck(factory2.createIdentifier("module"), "object"),
                factory2.createTypeCheck(factory2.createPropertyAccessExpression(factory2.createIdentifier("module"), "exports"), "object")
              ),
              factory2.createBlock([
                factory2.createVariableStatement(
                  /*modifiers*/
                  void 0,
                  [
                    factory2.createVariableDeclaration(
                      "v",
                      /*exclamationToken*/
                      void 0,
                      /*type*/
                      void 0,
                      factory2.createCallExpression(
                        factory2.createIdentifier("factory"),
                        /*typeArguments*/
                        void 0,
                        [
                          factory2.createIdentifier("require"),
                          factory2.createIdentifier("exports")
                        ]
                      )
                    )
                  ]
                ),
                setEmitFlags(
                  factory2.createIfStatement(
                    factory2.createStrictInequality(
                      factory2.createIdentifier("v"),
                      factory2.createIdentifier("undefined")
                    ),
                    factory2.createExpressionStatement(
                      factory2.createAssignment(
                        factory2.createPropertyAccessExpression(factory2.createIdentifier("module"), "exports"),
                        factory2.createIdentifier("v")
                      )
                    )
                  ),
                  1 /* SingleLine */
                )
              ]),
              factory2.createIfStatement(
                factory2.createLogicalAnd(
                  factory2.createTypeCheck(factory2.createIdentifier("define"), "function"),
                  factory2.createPropertyAccessExpression(factory2.createIdentifier("define"), "amd")
                ),
                factory2.createBlock([
                  factory2.createExpressionStatement(
                    factory2.createCallExpression(
                      factory2.createIdentifier("define"),
                      /*typeArguments*/
                      void 0,
                      [
                        // Add the module name (if provided).
                        ...moduleName ? [moduleName] : [],
                        factory2.createArrayLiteralExpression([
                          factory2.createStringLiteral("require"),
                          factory2.createStringLiteral("exports"),
                          ...aliasedModuleNames,
                          ...unaliasedModuleNames
                        ]),
                        factory2.createIdentifier("factory")
                      ]
                    )
                  )
                ])
              )
            )
          ],
          /*multiLine*/
          true
        ),
        /*location*/
        void 0
      )
    );
    const updated = factory2.updateSourceFile(
      node,
      setTextRange(
        factory2.createNodeArray([
          factory2.createExpressionStatement(
            factory2.createCallExpression(
              umdHeader,
              /*typeArguments*/
              void 0,
              [
                // Add the module body function argument:
                //
                //     function (require, exports) ...
                factory2.createFunctionExpression(
                  /*modifiers*/
                  void 0,
                  /*asteriskToken*/
                  void 0,
                  /*name*/
                  void 0,
                  /*typeParameters*/
                  void 0,
                  [
                    factory2.createParameterDeclaration(
                      /*modifiers*/
                      void 0,
                      /*dotDotDotToken*/
                      void 0,
                      "require"
                    ),
                    factory2.createParameterDeclaration(
                      /*modifiers*/
                      void 0,
                      /*dotDotDotToken*/
                      void 0,
                      "exports"
                    ),
                    ...importAliasNames
                  ],
                  /*type*/
                  void 0,
                  transformAsynchronousModuleBody(node)
                )
              ]
            )
          )
        ]),
        /*location*/
        node.statements
      )
    );
    addEmitHelpers(updated, context.readEmitHelpers());
    return updated;
  }
  function collectAsynchronousDependencies(node, includeNonAmdDependencies) {
    const aliasedModuleNames = [];
    const unaliasedModuleNames = [];
    const importAliasNames = [];
    for (const amdDependency of node.amdDependencies) {
      if (amdDependency.name) {
        aliasedModuleNames.push(factory2.createStringLiteral(amdDependency.path));
        importAliasNames.push(factory2.createParameterDeclaration(
          /*modifiers*/
          void 0,
          /*dotDotDotToken*/
          void 0,
          amdDependency.name
        ));
      } else {
        unaliasedModuleNames.push(factory2.createStringLiteral(amdDependency.path));
      }
    }
    for (const importNode of currentModuleInfo.externalImports) {
      const externalModuleName = getExternalModuleNameLiteral(factory2, importNode, currentSourceFile, host, resolver, compilerOptions);
      const importAliasName = getLocalNameForExternalImport(factory2, importNode, currentSourceFile);
      if (externalModuleName) {
        if (includeNonAmdDependencies && importAliasName) {
          setEmitFlags(importAliasName, 8 /* NoSubstitution */);
          aliasedModuleNames.push(externalModuleName);
          importAliasNames.push(factory2.createParameterDeclaration(
            /*modifiers*/
            void 0,
            /*dotDotDotToken*/
            void 0,
            importAliasName
          ));
        } else {
          unaliasedModuleNames.push(externalModuleName);
        }
      }
    }
    return { aliasedModuleNames, unaliasedModuleNames, importAliasNames };
  }
  function getAMDImportExpressionForImport(node) {
    if (isImportEqualsDeclaration(node) || isExportDeclaration(node) || !getExternalModuleNameLiteral(factory2, node, currentSourceFile, host, resolver, compilerOptions)) {
      return void 0;
    }
    const name = getLocalNameForExternalImport(factory2, node, currentSourceFile);
    const expr = getHelperExpressionForImport(node, name);
    if (expr === name) {
      return void 0;
    }
    return factory2.createExpressionStatement(factory2.createAssignment(name, expr));
  }
  function transformAsynchronousModuleBody(node) {
    startLexicalEnvironment();
    const statements = [];
    const statementOffset = factory2.copyPrologue(
      node.statements,
      statements,
      /*ensureUseStrict*/
      !compilerOptions.noImplicitUseStrict,
      topLevelVisitor
    );
    if (shouldEmitUnderscoreUnderscoreESModule()) {
      append(statements, createUnderscoreUnderscoreESModule());
    }
    if (length(currentModuleInfo.exportedNames)) {
      append(statements, factory2.createExpressionStatement(reduceLeft(currentModuleInfo.exportedNames, (prev, nextId) => factory2.createAssignment(factory2.createPropertyAccessExpression(factory2.createIdentifier("exports"), factory2.createIdentifier(idText(nextId))), prev), factory2.createVoidZero())));
    }
    append(statements, visitNode(currentModuleInfo.externalHelpersImportDeclaration, topLevelVisitor, isStatement));
    if (moduleKind === 2 /* AMD */) {
      addRange(statements, mapDefined(currentModuleInfo.externalImports, getAMDImportExpressionForImport));
    }
    addRange(statements, visitNodes2(node.statements, topLevelVisitor, isStatement, statementOffset));
    addExportEqualsIfNeeded(
      statements,
      /*emitAsReturn*/
      true
    );
    insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
    const body = factory2.createBlock(
      statements,
      /*multiLine*/
      true
    );
    if (needUMDDynamicImportHelper) {
      addEmitHelper(body, dynamicImportUMDHelper);
    }
    return body;
  }
  function addExportEqualsIfNeeded(statements, emitAsReturn) {
    if (currentModuleInfo.exportEquals) {
      const expressionResult = visitNode(currentModuleInfo.exportEquals.expression, visitor, isExpression);
      if (expressionResult) {
        if (emitAsReturn) {
          const statement = factory2.createReturnStatement(expressionResult);
          setTextRange(statement, currentModuleInfo.exportEquals);
          setEmitFlags(statement, 768 /* NoTokenSourceMaps */ | 3072 /* NoComments */);
          statements.push(statement);
        } else {
          const statement = factory2.createExpressionStatement(
            factory2.createAssignment(
              factory2.createPropertyAccessExpression(
                factory2.createIdentifier("module"),
                "exports"
              ),
              expressionResult
            )
          );
          setTextRange(statement, currentModuleInfo.exportEquals);
          setEmitFlags(statement, 3072 /* NoComments */);
          statements.push(statement);
        }
      }
    }
  }
  function topLevelVisitor(node) {
    switch (node.kind) {
      case 271 /* ImportDeclaration */:
        return visitImportDeclaration(node);
      case 270 /* ImportEqualsDeclaration */:
        return visitImportEqualsDeclaration(node);
      case 277 /* ExportDeclaration */:
        return visitExportDeclaration(node);
      case 276 /* ExportAssignment */:
        return visitExportAssignment(node);
      case 261 /* FunctionDeclaration */:
        return visitFunctionDeclaration(node);
      case 262 /* ClassDeclaration */:
        return visitClassDeclaration(node);
      default:
        return topLevelNestedVisitor(node);
    }
  }
  function topLevelNestedVisitor(node) {
    switch (node.kind) {
      case 242 /* VariableStatement */:
        return visitVariableStatement(node);
      case 261 /* FunctionDeclaration */:
        return visitFunctionDeclaration(node);
      case 262 /* ClassDeclaration */:
        return visitClassDeclaration(node);
      case 247 /* ForStatement */:
        return visitForStatement(
          node,
          /*isTopLevel*/
          true
        );
      case 248 /* ForInStatement */:
        return visitForInStatement(node);
      case 249 /* ForOfStatement */:
        return visitForOfStatement(node);
      case 245 /* DoStatement */:
        return visitDoStatement(node);
      case 246 /* WhileStatement */:
        return visitWhileStatement(node);
      case 255 /* LabeledStatement */:
        return visitLabeledStatement(node);
      case 253 /* WithStatement */:
        return visitWithStatement(node);
      case 244 /* IfStatement */:
        return visitIfStatement(node);
      case 254 /* SwitchStatement */:
        return visitSwitchStatement(node);
      case 268 /* CaseBlock */:
        return visitCaseBlock(node);
      case 295 /* CaseClause */:
        return visitCaseClause(node);
      case 296 /* DefaultClause */:
        return visitDefaultClause(node);
      case 257 /* TryStatement */:
        return visitTryStatement(node);
      case 298 /* CatchClause */:
        return visitCatchClause(node);
      case 240 /* Block */:
        return visitBlock(node);
      default:
        return visitor(node);
    }
  }
  function visitorWorker(node, valueIsDiscarded) {
    if (!(node.transformFlags & (8388608 /* ContainsDynamicImport */ | 4096 /* ContainsDestructuringAssignment */ | 268435456 /* ContainsUpdateExpressionForIdentifier */))) {
      return node;
    }
    switch (node.kind) {
      case 247 /* ForStatement */:
        return visitForStatement(
          node,
          /*isTopLevel*/
          false
        );
      case 243 /* ExpressionStatement */:
        return visitExpressionStatement(node);
      case 216 /* ParenthesizedExpression */:
        return visitParenthesizedExpression(node, valueIsDiscarded);
      case 359 /* PartiallyEmittedExpression */:
        return visitPartiallyEmittedExpression(node, valueIsDiscarded);
      case 212 /* CallExpression */:
        if (isImportCall(node) && currentSourceFile.impliedNodeFormat === void 0) {
          return visitImportCallExpression(node);
        }
        break;
      case 225 /* BinaryExpression */:
        if (isDestructuringAssignment(node)) {
          return visitDestructuringAssignment(node, valueIsDiscarded);
        }
        break;
      case 223 /* PrefixUnaryExpression */:
      case 224 /* PostfixUnaryExpression */:
        return visitPreOrPostfixUnaryExpression(node, valueIsDiscarded);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitor(node) {
    return visitorWorker(
      node,
      /*valueIsDiscarded*/
      false
    );
  }
  function discardedValueVisitor(node) {
    return visitorWorker(
      node,
      /*valueIsDiscarded*/
      true
    );
  }
  function destructuringNeedsFlattening(node) {
    if (isObjectLiteralExpression(node)) {
      for (const elem of node.properties) {
        switch (elem.kind) {
          case 302 /* PropertyAssignment */:
            if (destructuringNeedsFlattening(elem.initializer)) {
              return true;
            }
            break;
          case 303 /* ShorthandPropertyAssignment */:
            if (destructuringNeedsFlattening(elem.name)) {
              return true;
            }
            break;
          case 304 /* SpreadAssignment */:
            if (destructuringNeedsFlattening(elem.expression)) {
              return true;
            }
            break;
          case 173 /* MethodDeclaration */:
          case 176 /* GetAccessor */:
          case 177 /* SetAccessor */:
            return false;
          default:
            Debug.assertNever(elem, "Unhandled object member kind");
        }
      }
    } else if (isArrayLiteralExpression(node)) {
      for (const elem of node.elements) {
        if (isSpreadElement(elem)) {
          if (destructuringNeedsFlattening(elem.expression)) {
            return true;
          }
        } else if (destructuringNeedsFlattening(elem)) {
          return true;
        }
      }
    } else if (isIdentifier(node)) {
      return length(getExports(node)) > (isExportName(node) ? 1 : 0);
    }
    return false;
  }
  function visitDestructuringAssignment(node, valueIsDiscarded) {
    if (destructuringNeedsFlattening(node.left)) {
      return flattenDestructuringAssignment(node, visitor, context, 0 /* All */, !valueIsDiscarded, createAllExportExpressions);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitForStatement(node, isTopLevel) {
    if (isTopLevel && node.initializer && isVariableDeclarationList(node.initializer) && !(node.initializer.flags & 3 /* BlockScoped */)) {
      const exportStatements = appendExportsOfVariableDeclarationList(
        /*statements*/
        void 0,
        node.initializer,
        /*isForInOrOfInitializer*/
        false
      );
      if (exportStatements) {
        const statements = [];
        const varDeclList = visitNode(node.initializer, discardedValueVisitor, isVariableDeclarationList);
        const varStatement = factory2.createVariableStatement(
          /*modifiers*/
          void 0,
          varDeclList
        );
        statements.push(varStatement);
        addRange(statements, exportStatements);
        const condition = visitNode(node.condition, visitor, isExpression);
        const incrementor = visitNode(node.incrementor, discardedValueVisitor, isExpression);
        const body = visitIterationBody(node.statement, isTopLevel ? topLevelNestedVisitor : visitor, context);
        statements.push(factory2.updateForStatement(
          node,
          /*initializer*/
          void 0,
          condition,
          incrementor,
          body
        ));
        return statements;
      }
    }
    return factory2.updateForStatement(
      node,
      visitNode(node.initializer, discardedValueVisitor, isForInitializer),
      visitNode(node.condition, visitor, isExpression),
      visitNode(node.incrementor, discardedValueVisitor, isExpression),
      visitIterationBody(node.statement, isTopLevel ? topLevelNestedVisitor : visitor, context)
    );
  }
  function visitForInStatement(node) {
    if (isVariableDeclarationList(node.initializer) && !(node.initializer.flags & 3 /* BlockScoped */)) {
      const exportStatements = appendExportsOfVariableDeclarationList(
        /*statements*/
        void 0,
        node.initializer,
        /*isForInOrOfInitializer*/
        true
      );
      if (some(exportStatements)) {
        const initializer = visitNode(node.initializer, discardedValueVisitor, isForInitializer);
        const expression = visitNode(node.expression, visitor, isExpression);
        const body = visitIterationBody(node.statement, topLevelNestedVisitor, context);
        const mergedBody = isBlock(body) ? factory2.updateBlock(body, [...exportStatements, ...body.statements]) : factory2.createBlock(
          [...exportStatements, body],
          /*multiLine*/
          true
        );
        return factory2.updateForInStatement(node, initializer, expression, mergedBody);
      }
    }
    return factory2.updateForInStatement(
      node,
      visitNode(node.initializer, discardedValueVisitor, isForInitializer),
      visitNode(node.expression, visitor, isExpression),
      visitIterationBody(node.statement, topLevelNestedVisitor, context)
    );
  }
  function visitForOfStatement(node) {
    if (isVariableDeclarationList(node.initializer) && !(node.initializer.flags & 3 /* BlockScoped */)) {
      const exportStatements = appendExportsOfVariableDeclarationList(
        /*statements*/
        void 0,
        node.initializer,
        /*isForInOrOfInitializer*/
        true
      );
      const initializer = visitNode(node.initializer, discardedValueVisitor, isForInitializer);
      const expression = visitNode(node.expression, visitor, isExpression);
      let body = visitIterationBody(node.statement, topLevelNestedVisitor, context);
      if (some(exportStatements)) {
        body = isBlock(body) ? factory2.updateBlock(body, [...exportStatements, ...body.statements]) : factory2.createBlock(
          [...exportStatements, body],
          /*multiLine*/
          true
        );
      }
      return factory2.updateForOfStatement(node, node.awaitModifier, initializer, expression, body);
    }
    return factory2.updateForOfStatement(
      node,
      node.awaitModifier,
      visitNode(node.initializer, discardedValueVisitor, isForInitializer),
      visitNode(node.expression, visitor, isExpression),
      visitIterationBody(node.statement, topLevelNestedVisitor, context)
    );
  }
  function visitDoStatement(node) {
    return factory2.updateDoStatement(
      node,
      visitIterationBody(node.statement, topLevelNestedVisitor, context),
      visitNode(node.expression, visitor, isExpression)
    );
  }
  function visitWhileStatement(node) {
    return factory2.updateWhileStatement(
      node,
      visitNode(node.expression, visitor, isExpression),
      visitIterationBody(node.statement, topLevelNestedVisitor, context)
    );
  }
  function visitLabeledStatement(node) {
    return factory2.updateLabeledStatement(
      node,
      node.label,
      Debug.checkDefined(visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock))
    );
  }
  function visitWithStatement(node) {
    return factory2.updateWithStatement(
      node,
      visitNode(node.expression, visitor, isExpression),
      Debug.checkDefined(visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock))
    );
  }
  function visitIfStatement(node) {
    return factory2.updateIfStatement(
      node,
      visitNode(node.expression, visitor, isExpression),
      Debug.checkDefined(visitNode(node.thenStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock)),
      visitNode(node.elseStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock)
    );
  }
  function visitSwitchStatement(node) {
    return factory2.updateSwitchStatement(
      node,
      visitNode(node.expression, visitor, isExpression),
      Debug.checkDefined(visitNode(node.caseBlock, topLevelNestedVisitor, isCaseBlock))
    );
  }
  function visitCaseBlock(node) {
    return factory2.updateCaseBlock(
      node,
      visitNodes2(node.clauses, topLevelNestedVisitor, isCaseOrDefaultClause)
    );
  }
  function visitCaseClause(node) {
    return factory2.updateCaseClause(
      node,
      visitNode(node.expression, visitor, isExpression),
      visitNodes2(node.statements, topLevelNestedVisitor, isStatement)
    );
  }
  function visitDefaultClause(node) {
    return visitEachChild(node, topLevelNestedVisitor, context);
  }
  function visitTryStatement(node) {
    return visitEachChild(node, topLevelNestedVisitor, context);
  }
  function visitCatchClause(node) {
    return factory2.updateCatchClause(
      node,
      node.variableDeclaration,
      Debug.checkDefined(visitNode(node.block, topLevelNestedVisitor, isBlock))
    );
  }
  function visitBlock(node) {
    node = visitEachChild(node, topLevelNestedVisitor, context);
    return node;
  }
  function visitExpressionStatement(node) {
    return factory2.updateExpressionStatement(
      node,
      visitNode(node.expression, discardedValueVisitor, isExpression)
    );
  }
  function visitParenthesizedExpression(node, valueIsDiscarded) {
    return factory2.updateParenthesizedExpression(node, visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, isExpression));
  }
  function visitPartiallyEmittedExpression(node, valueIsDiscarded) {
    return factory2.updatePartiallyEmittedExpression(node, visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, isExpression));
  }
  function visitPreOrPostfixUnaryExpression(node, valueIsDiscarded) {
    if ((node.operator === 46 /* PlusPlusToken */ || node.operator === 47 /* MinusMinusToken */) && isIdentifier(node.operand) && !isGeneratedIdentifier(node.operand) && !isLocalName(node.operand) && !isDeclarationNameOfEnumOrNamespace(node.operand)) {
      const exportedNames = getExports(node.operand);
      if (exportedNames) {
        let temp;
        let expression = visitNode(node.operand, visitor, isExpression);
        if (isPrefixUnaryExpression(node)) {
          expression = factory2.updatePrefixUnaryExpression(node, expression);
        } else {
          expression = factory2.updatePostfixUnaryExpression(node, expression);
          if (!valueIsDiscarded) {
            temp = factory2.createTempVariable(hoistVariableDeclaration);
            expression = factory2.createAssignment(temp, expression);
            setTextRange(expression, node);
          }
          expression = factory2.createComma(expression, factory2.cloneNode(node.operand));
          setTextRange(expression, node);
        }
        for (const exportName of exportedNames) {
          noSubstitution[getNodeId(expression)] = true;
          expression = createExportExpression(exportName, expression);
          setTextRange(expression, node);
        }
        if (temp) {
          noSubstitution[getNodeId(expression)] = true;
          expression = factory2.createComma(expression, temp);
          setTextRange(expression, node);
        }
        return expression;
      }
    }
    return visitEachChild(node, visitor, context);
  }
  function visitImportCallExpression(node) {
    if (moduleKind === 0 /* None */ && languageVersion >= 7 /* ES2020 */) {
      return visitEachChild(node, visitor, context);
    }
    const externalModuleName = getExternalModuleNameLiteral(factory2, node, currentSourceFile, host, resolver, compilerOptions);
    const firstArgument = visitNode(firstOrUndefined(node.arguments), visitor, isExpression);
    const argument = externalModuleName && (!firstArgument || !isStringLiteral(firstArgument) || firstArgument.text !== externalModuleName.text) ? externalModuleName : firstArgument;
    const containsLexicalThis = !!(node.transformFlags & 16384 /* ContainsLexicalThis */);
    switch (compilerOptions.module) {
      case 2 /* AMD */:
        return createImportCallExpressionAMD(argument, containsLexicalThis);
      case 3 /* UMD */:
        return createImportCallExpressionUMD(argument ?? factory2.createVoidZero(), containsLexicalThis);
      case 1 /* CommonJS */:
      default:
        return createImportCallExpressionCommonJS(argument);
    }
  }
  function createImportCallExpressionUMD(arg, containsLexicalThis) {
    needUMDDynamicImportHelper = true;
    if (isSimpleCopiableExpression(arg)) {
      const argClone = isGeneratedIdentifier(arg) ? arg : isStringLiteral(arg) ? factory2.createStringLiteralFromNode(arg) : setEmitFlags(setTextRange(factory2.cloneNode(arg), arg), 3072 /* NoComments */);
      return factory2.createConditionalExpression(
        /*condition*/
        factory2.createIdentifier("__syncRequire"),
        /*questionToken*/
        void 0,
        /*whenTrue*/
        createImportCallExpressionCommonJS(arg),
        /*colonToken*/
        void 0,
        /*whenFalse*/
        createImportCallExpressionAMD(argClone, containsLexicalThis)
      );
    } else {
      const temp = factory2.createTempVariable(hoistVariableDeclaration);
      return factory2.createComma(factory2.createAssignment(temp, arg), factory2.createConditionalExpression(
        /*condition*/
        factory2.createIdentifier("__syncRequire"),
        /*questionToken*/
        void 0,
        /*whenTrue*/
        createImportCallExpressionCommonJS(
          temp,
          /*isInlineable*/
          true
        ),
        /*colonToken*/
        void 0,
        /*whenFalse*/
        createImportCallExpressionAMD(temp, containsLexicalThis)
      ));
    }
  }
  function createImportCallExpressionAMD(arg, containsLexicalThis) {
    const resolve = factory2.createUniqueName("resolve");
    const reject = factory2.createUniqueName("reject");
    const parameters = [
      factory2.createParameterDeclaration(
        /*modifiers*/
        void 0,
        /*dotDotDotToken*/
        void 0,
        /*name*/
        resolve
      ),
      factory2.createParameterDeclaration(
        /*modifiers*/
        void 0,
        /*dotDotDotToken*/
        void 0,
        /*name*/
        reject
      )
    ];
    const body = factory2.createBlock([
      factory2.createExpressionStatement(
        factory2.createCallExpression(
          factory2.createIdentifier("require"),
          /*typeArguments*/
          void 0,
          [factory2.createArrayLiteralExpression([arg || factory2.createOmittedExpression()]), resolve, reject]
        )
      )
    ]);
    let func;
    if (languageVersion >= 2 /* ES2015 */) {
      func = factory2.createArrowFunction(
        /*modifiers*/
        void 0,
        /*typeParameters*/
        void 0,
        parameters,
        /*type*/
        void 0,
        /*equalsGreaterThanToken*/
        void 0,
        body
      );
    } else {
      func = factory2.createFunctionExpression(
        /*modifiers*/
        void 0,
        /*asteriskToken*/
        void 0,
        /*name*/
        void 0,
        /*typeParameters*/
        void 0,
        parameters,
        /*type*/
        void 0,
        body
      );
      if (containsLexicalThis) {
        setEmitFlags(func, 16 /* CapturesThis */);
      }
    }
    const promise = factory2.createNewExpression(
      factory2.createIdentifier("Promise"),
      /*typeArguments*/
      void 0,
      [func]
    );
    if (getESModuleInterop(compilerOptions)) {
      return factory2.createCallExpression(
        factory2.createPropertyAccessExpression(promise, factory2.createIdentifier("then")),
        /*typeArguments*/
        void 0,
        [emitHelpers().createImportStarCallbackHelper()]
      );
    }
    return promise;
  }
  function createImportCallExpressionCommonJS(arg, isInlineable) {
    const needSyncEval = arg && !isSimpleInlineableExpression(arg) && !isInlineable;
    const promiseResolveCall = factory2.createCallExpression(
      factory2.createPropertyAccessExpression(factory2.createIdentifier("Promise"), "resolve"),
      /*typeArguments*/
      void 0,
      /*argumentsArray*/
      needSyncEval ? languageVersion >= 2 /* ES2015 */ ? [
        factory2.createTemplateExpression(factory2.createTemplateHead(""), [
          factory2.createTemplateSpan(arg, factory2.createTemplateTail(""))
        ])
      ] : [
        factory2.createCallExpression(
          factory2.createPropertyAccessExpression(factory2.createStringLiteral(""), "concat"),
          /*typeArguments*/
          void 0,
          [arg]
        )
      ] : []
    );
    let requireCall = factory2.createCallExpression(
      factory2.createIdentifier("require"),
      /*typeArguments*/
      void 0,
      needSyncEval ? [factory2.createIdentifier("s")] : arg ? [arg] : []
    );
    if (getESModuleInterop(compilerOptions)) {
      requireCall = emitHelpers().createImportStarHelper(requireCall);
    }
    const parameters = needSyncEval ? [
      factory2.createParameterDeclaration(
        /*modifiers*/
        void 0,
        /*dotDotDotToken*/
        void 0,
        /*name*/
        "s"
      )
    ] : [];
    let func;
    if (languageVersion >= 2 /* ES2015 */) {
      func = factory2.createArrowFunction(
        /*modifiers*/
        void 0,
        /*typeParameters*/
        void 0,
        /*parameters*/
        parameters,
        /*type*/
        void 0,
        /*equalsGreaterThanToken*/
        void 0,
        requireCall
      );
    } else {
      func = factory2.createFunctionExpression(
        /*modifiers*/
        void 0,
        /*asteriskToken*/
        void 0,
        /*name*/
        void 0,
        /*typeParameters*/
        void 0,
        /*parameters*/
        parameters,
        /*type*/
        void 0,
        factory2.createBlock([factory2.createReturnStatement(requireCall)])
      );
    }
    const downleveledImport = factory2.createCallExpression(
      factory2.createPropertyAccessExpression(promiseResolveCall, "then"),
      /*typeArguments*/
      void 0,
      [func]
    );
    return downleveledImport;
  }
  function getHelperExpressionForExport(node, innerExpr) {
    if (!getESModuleInterop(compilerOptions) || getInternalEmitFlags(node) & 2 /* NeverApplyImportHelper */) {
      return innerExpr;
    }
    if (getExportNeedsImportStarHelper(node)) {
      return emitHelpers().createImportStarHelper(innerExpr);
    }
    return innerExpr;
  }
  function getHelperExpressionForImport(node, innerExpr) {
    if (!getESModuleInterop(compilerOptions) || getInternalEmitFlags(node) & 2 /* NeverApplyImportHelper */) {
      return innerExpr;
    }
    if (getImportNeedsImportStarHelper(node)) {
      return emitHelpers().createImportStarHelper(innerExpr);
    }
    if (getImportNeedsImportDefaultHelper(node)) {
      return emitHelpers().createImportDefaultHelper(innerExpr);
    }
    return innerExpr;
  }
  function visitImportDeclaration(node) {
    let statements;
    const namespaceDeclaration = getNamespaceDeclarationNode(node);
    if (moduleKind !== 2 /* AMD */) {
      if (!node.importClause) {
        return setOriginalNode(setTextRange(factory2.createExpressionStatement(createRequireCall(node)), node), node);
      } else {
        const variables = [];
        if (namespaceDeclaration && !isDefaultImport(node)) {
          variables.push(
            factory2.createVariableDeclaration(
              factory2.cloneNode(namespaceDeclaration.name),
              /*exclamationToken*/
              void 0,
              /*type*/
              void 0,
              getHelperExpressionForImport(node, createRequireCall(node))
            )
          );
        } else {
          variables.push(
            factory2.createVariableDeclaration(
              factory2.getGeneratedNameForNode(node),
              /*exclamationToken*/
              void 0,
              /*type*/
              void 0,
              getHelperExpressionForImport(node, createRequireCall(node))
            )
          );
          if (namespaceDeclaration && isDefaultImport(node)) {
            variables.push(
              factory2.createVariableDeclaration(
                factory2.cloneNode(namespaceDeclaration.name),
                /*exclamationToken*/
                void 0,
                /*type*/
                void 0,
                factory2.getGeneratedNameForNode(node)
              )
            );
          }
        }
        statements = append(
          statements,
          setOriginalNode(
            setTextRange(
              factory2.createVariableStatement(
                /*modifiers*/
                void 0,
                factory2.createVariableDeclarationList(
                  variables,
                  languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */
                )
              ),
              /*location*/
              node
            ),
            /*original*/
            node
          )
        );
      }
    } else if (namespaceDeclaration && isDefaultImport(node)) {
      statements = append(
        statements,
        factory2.createVariableStatement(
          /*modifiers*/
          void 0,
          factory2.createVariableDeclarationList(
            [
              setOriginalNode(
                setTextRange(
                  factory2.createVariableDeclaration(
                    factory2.cloneNode(namespaceDeclaration.name),
                    /*exclamationToken*/
                    void 0,
                    /*type*/
                    void 0,
                    factory2.getGeneratedNameForNode(node)
                  ),
                  /*location*/
                  node
                ),
                /*original*/
                node
              )
            ],
            languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */
          )
        )
      );
    }
    statements = appendExportsOfImportDeclaration(statements, node);
    return singleOrMany(statements);
  }
  function createRequireCall(importNode) {
    const moduleName = getExternalModuleNameLiteral(factory2, importNode, currentSourceFile, host, resolver, compilerOptions);
    const args = [];
    if (moduleName) {
      args.push(moduleName);
    }
    return factory2.createCallExpression(
      factory2.createIdentifier("require"),
      /*typeArguments*/
      void 0,
      args
    );
  }
  function visitImportEqualsDeclaration(node) {
    Debug.assert(isExternalModuleImportEqualsDeclaration(node), "import= for internal module references should be handled in an earlier transformer.");
    let statements;
    if (moduleKind !== 2 /* AMD */) {
      if (hasSyntacticModifier(node, 1 /* Export */)) {
        statements = append(
          statements,
          setOriginalNode(
            setTextRange(
              factory2.createExpressionStatement(
                createExportExpression(
                  node.name,
                  createRequireCall(node)
                )
              ),
              node
            ),
            node
          )
        );
      } else {
        statements = append(
          statements,
          setOriginalNode(
            setTextRange(
              factory2.createVariableStatement(
                /*modifiers*/
                void 0,
                factory2.createVariableDeclarationList(
                  [
                    factory2.createVariableDeclaration(
                      factory2.cloneNode(node.name),
                      /*exclamationToken*/
                      void 0,
                      /*type*/
                      void 0,
                      createRequireCall(node)
                    )
                  ],
                  /*flags*/
                  languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */
                )
              ),
              node
            ),
            node
          )
        );
      }
    } else {
      if (hasSyntacticModifier(node, 1 /* Export */)) {
        statements = append(
          statements,
          setOriginalNode(
            setTextRange(
              factory2.createExpressionStatement(
                createExportExpression(factory2.getExportName(node), factory2.getLocalName(node))
              ),
              node
            ),
            node
          )
        );
      }
    }
    statements = appendExportsOfImportEqualsDeclaration(statements, node);
    return singleOrMany(statements);
  }
  function visitExportDeclaration(node) {
    if (!node.moduleSpecifier) {
      return void 0;
    }
    const generatedName = factory2.getGeneratedNameForNode(node);
    if (node.exportClause && isNamedExports(node.exportClause)) {
      const statements = [];
      if (moduleKind !== 2 /* AMD */) {
        statements.push(
          setOriginalNode(
            setTextRange(
              factory2.createVariableStatement(
                /*modifiers*/
                void 0,
                factory2.createVariableDeclarationList([
                  factory2.createVariableDeclaration(
                    generatedName,
                    /*exclamationToken*/
                    void 0,
                    /*type*/
                    void 0,
                    createRequireCall(node)
                  )
                ])
              ),
              /*location*/
              node
            ),
            /* original */
            node
          )
        );
      }
      for (const specifier of node.exportClause.elements) {
        if (languageVersion === 0 /* ES3 */) {
          statements.push(
            setOriginalNode(
              setTextRange(
                factory2.createExpressionStatement(
                  emitHelpers().createCreateBindingHelper(generatedName, factory2.createStringLiteralFromNode(specifier.propertyName || specifier.name), specifier.propertyName ? factory2.createStringLiteralFromNode(specifier.name) : void 0)
                ),
                specifier
              ),
              specifier
            )
          );
        } else {
          const exportNeedsImportDefault = !!getESModuleInterop(compilerOptions) && !(getInternalEmitFlags(node) & 2 /* NeverApplyImportHelper */) && idText(specifier.propertyName || specifier.name) === "default";
          const exportedValue = factory2.createPropertyAccessExpression(
            exportNeedsImportDefault ? emitHelpers().createImportDefaultHelper(generatedName) : generatedName,
            specifier.propertyName || specifier.name
          );
          statements.push(
            setOriginalNode(
              setTextRange(
                factory2.createExpressionStatement(
                  createExportExpression(
                    factory2.getExportName(specifier),
                    exportedValue,
                    /*location*/
                    void 0,
                    /*liveBinding*/
                    true
                  )
                ),
                specifier
              ),
              specifier
            )
          );
        }
      }
      return singleOrMany(statements);
    } else if (node.exportClause) {
      const statements = [];
      statements.push(
        setOriginalNode(
          setTextRange(
            factory2.createExpressionStatement(
              createExportExpression(
                factory2.cloneNode(node.exportClause.name),
                getHelperExpressionForExport(node, moduleKind !== 2 /* AMD */ ? createRequireCall(node) : isExportNamespaceAsDefaultDeclaration(node) ? generatedName : factory2.createIdentifier(idText(node.exportClause.name)))
              )
            ),
            node
          ),
          node
        )
      );
      return singleOrMany(statements);
    } else {
      return setOriginalNode(
        setTextRange(
          factory2.createExpressionStatement(
            emitHelpers().createExportStarHelper(moduleKind !== 2 /* AMD */ ? createRequireCall(node) : generatedName)
          ),
          node
        ),
        node
      );
    }
  }
  function visitExportAssignment(node) {
    if (node.isExportEquals) {
      return void 0;
    }
    return createExportStatement(
      factory2.createIdentifier("default"),
      visitNode(node.expression, visitor, isExpression),
      /*location*/
      node,
      /*allowComments*/
      true
    );
  }
  function visitFunctionDeclaration(node) {
    let statements;
    if (hasSyntacticModifier(node, 1 /* Export */)) {
      statements = append(
        statements,
        setOriginalNode(
          setTextRange(
            factory2.createFunctionDeclaration(
              visitNodes2(node.modifiers, modifierVisitor, isModifier),
              node.asteriskToken,
              factory2.getDeclarationName(
                node,
                /*allowComments*/
                true,
                /*allowSourceMaps*/
                true
              ),
              /*typeParameters*/
              void 0,
              visitNodes2(node.parameters, visitor, isParameter),
              /*type*/
              void 0,
              visitEachChild(node.body, visitor, context)
            ),
            /*location*/
            node
          ),
          /*original*/
          node
        )
      );
    } else {
      statements = append(statements, visitEachChild(node, visitor, context));
    }
    statements = appendExportsOfHoistedDeclaration(statements, node);
    return singleOrMany(statements);
  }
  function visitClassDeclaration(node) {
    let statements;
    if (hasSyntacticModifier(node, 1 /* Export */)) {
      statements = append(
        statements,
        setOriginalNode(
          setTextRange(
            factory2.createClassDeclaration(
              visitNodes2(node.modifiers, modifierVisitor, isModifierLike),
              factory2.getDeclarationName(
                node,
                /*allowComments*/
                true,
                /*allowSourceMaps*/
                true
              ),
              /*typeParameters*/
              void 0,
              visitNodes2(node.heritageClauses, visitor, isHeritageClause),
              visitNodes2(node.members, visitor, isClassElement)
            ),
            node
          ),
          node
        )
      );
    } else {
      statements = append(statements, visitEachChild(node, visitor, context));
    }
    statements = appendExportsOfHoistedDeclaration(statements, node);
    return singleOrMany(statements);
  }
  function visitVariableStatement(node) {
    let statements;
    let variables;
    let expressions;
    if (hasSyntacticModifier(node, 1 /* Export */)) {
      let modifiers;
      let removeCommentsOnExpressions = false;
      for (const variable of node.declarationList.declarations) {
        if (isIdentifier(variable.name) && isLocalName(variable.name)) {
          if (!modifiers) {
            modifiers = visitNodes2(node.modifiers, modifierVisitor, isModifier);
          }
          if (variable.initializer) {
            const updatedVariable = factory2.updateVariableDeclaration(
              variable,
              variable.name,
              /*exclamationToken*/
              void 0,
              /*type*/
              void 0,
              createExportExpression(
                variable.name,
                visitNode(variable.initializer, visitor, isExpression)
              )
            );
            variables = append(variables, updatedVariable);
          } else {
            variables = append(variables, variable);
          }
        } else if (variable.initializer) {
          if (!isBindingPattern(variable.name) && (isArrowFunction(variable.initializer) || isFunctionExpression(variable.initializer) || isClassExpression(variable.initializer))) {
            const expression = factory2.createAssignment(
              setTextRange(
                factory2.createPropertyAccessExpression(
                  factory2.createIdentifier("exports"),
                  variable.name
                ),
                /*location*/
                variable.name
              ),
              factory2.createIdentifier(getTextOfIdentifierOrLiteral(variable.name))
            );
            const updatedVariable = factory2.createVariableDeclaration(
              variable.name,
              variable.exclamationToken,
              variable.type,
              visitNode(variable.initializer, visitor, isExpression)
            );
            variables = append(variables, updatedVariable);
            expressions = append(expressions, expression);
            removeCommentsOnExpressions = true;
          } else {
            expressions = append(expressions, transformInitializedVariable(variable));
          }
        }
      }
      if (variables) {
        statements = append(statements, factory2.updateVariableStatement(node, modifiers, factory2.updateVariableDeclarationList(node.declarationList, variables)));
      }
      if (expressions) {
        const statement = setOriginalNode(setTextRange(factory2.createExpressionStatement(factory2.inlineExpressions(expressions)), node), node);
        if (removeCommentsOnExpressions) {
          removeAllComments(statement);
        }
        statements = append(statements, statement);
      }
    } else {
      statements = append(statements, visitEachChild(node, visitor, context));
    }
    statements = appendExportsOfVariableStatement(statements, node);
    return singleOrMany(statements);
  }
  function createAllExportExpressions(name, value, location) {
    const exportedNames = getExports(name);
    if (exportedNames) {
      let expression = isExportName(name) ? value : factory2.createAssignment(name, value);
      for (const exportName of exportedNames) {
        setEmitFlags(expression, 8 /* NoSubstitution */);
        expression = createExportExpression(
          exportName,
          expression,
          /*location*/
          location
        );
      }
      return expression;
    }
    return factory2.createAssignment(name, value);
  }
  function transformInitializedVariable(node) {
    if (isBindingPattern(node.name)) {
      return flattenDestructuringAssignment(
        visitNode(node, visitor, isInitializedVariable),
        visitor,
        context,
        0 /* All */,
        /*needsValue*/
        false,
        createAllExportExpressions
      );
    } else {
      return factory2.createAssignment(
        setTextRange(
          factory2.createPropertyAccessExpression(
            factory2.createIdentifier("exports"),
            node.name
          ),
          /*location*/
          node.name
        ),
        node.initializer ? visitNode(node.initializer, visitor, isExpression) : factory2.createVoidZero()
      );
    }
  }
  function appendExportsOfImportDeclaration(statements, decl) {
    if (currentModuleInfo.exportEquals) {
      return statements;
    }
    const importClause = decl.importClause;
    if (!importClause) {
      return statements;
    }
    if (importClause.name) {
      statements = appendExportsOfDeclaration(statements, importClause);
    }
    const namedBindings = importClause.namedBindings;
    if (namedBindings) {
      switch (namedBindings.kind) {
        case 273 /* NamespaceImport */:
          statements = appendExportsOfDeclaration(statements, namedBindings);
          break;
        case 274 /* NamedImports */:
          for (const importBinding of namedBindings.elements) {
            statements = appendExportsOfDeclaration(
              statements,
              importBinding,
              /*liveBinding*/
              true
            );
          }
          break;
      }
    }
    return statements;
  }
  function appendExportsOfImportEqualsDeclaration(statements, decl) {
    if (currentModuleInfo.exportEquals) {
      return statements;
    }
    return appendExportsOfDeclaration(statements, decl);
  }
  function appendExportsOfVariableStatement(statements, node) {
    return appendExportsOfVariableDeclarationList(
      statements,
      node.declarationList,
      /*isForInOrOfInitializer*/
      false
    );
  }
  function appendExportsOfVariableDeclarationList(statements, node, isForInOrOfInitializer) {
    if (currentModuleInfo.exportEquals) {
      return statements;
    }
    for (const decl of node.declarations) {
      statements = appendExportsOfBindingElement(statements, decl, isForInOrOfInitializer);
    }
    return statements;
  }
  function appendExportsOfBindingElement(statements, decl, isForInOrOfInitializer) {
    if (currentModuleInfo.exportEquals) {
      return statements;
    }
    if (isBindingPattern(decl.name)) {
      for (const element of decl.name.elements) {
        if (!isOmittedExpression(element)) {
          statements = appendExportsOfBindingElement(statements, element, isForInOrOfInitializer);
        }
      }
    } else if (!isGeneratedIdentifier(decl.name) && (!isVariableDeclaration(decl) || decl.initializer || isForInOrOfInitializer)) {
      statements = appendExportsOfDeclaration(statements, decl);
    }
    return statements;
  }
  function appendExportsOfHoistedDeclaration(statements, decl) {
    if (currentModuleInfo.exportEquals) {
      return statements;
    }
    if (hasSyntacticModifier(decl, 1 /* Export */)) {
      const exportName = hasSyntacticModifier(decl, 1024 /* Default */) ? factory2.createIdentifier("default") : factory2.getDeclarationName(decl);
      statements = appendExportStatement(
        statements,
        exportName,
        factory2.getLocalName(decl),
        /*location*/
        decl
      );
    }
    if (decl.name) {
      statements = appendExportsOfDeclaration(statements, decl);
    }
    return statements;
  }
  function appendExportsOfDeclaration(statements, decl, liveBinding) {
    const name = factory2.getDeclarationName(decl);
    const exportSpecifiers = currentModuleInfo.exportSpecifiers.get(idText(name));
    if (exportSpecifiers) {
      for (const exportSpecifier of exportSpecifiers) {
        statements = appendExportStatement(
          statements,
          exportSpecifier.name,
          name,
          /*location*/
          exportSpecifier.name,
          /*allowComments*/
          void 0,
          liveBinding
        );
      }
    }
    return statements;
  }
  function appendExportStatement(statements, exportName, expression, location, allowComments, liveBinding) {
    statements = append(statements, createExportStatement(exportName, expression, location, allowComments, liveBinding));
    return statements;
  }
  function createUnderscoreUnderscoreESModule() {
    let statement;
    if (languageVersion === 0 /* ES3 */) {
      statement = factory2.createExpressionStatement(
        createExportExpression(
          factory2.createIdentifier("__esModule"),
          factory2.createTrue()
        )
      );
    } else {
      statement = factory2.createExpressionStatement(
        factory2.createCallExpression(
          factory2.createPropertyAccessExpression(factory2.createIdentifier("Object"), "defineProperty"),
          /*typeArguments*/
          void 0,
          [
            factory2.createIdentifier("exports"),
            factory2.createStringLiteral("__esModule"),
            factory2.createObjectLiteralExpression([
              factory2.createPropertyAssignment("value", factory2.createTrue())
            ])
          ]
        )
      );
    }
    setEmitFlags(statement, 2097152 /* CustomPrologue */);
    return statement;
  }
  function createExportStatement(name, value, location, allowComments, liveBinding) {
    const statement = setTextRange(factory2.createExpressionStatement(createExportExpression(
      name,
      value,
      /*location*/
      void 0,
      liveBinding
    )), location);
    startOnNewLine(statement);
    if (!allowComments) {
      setEmitFlags(statement, 3072 /* NoComments */);
    }
    return statement;
  }
  function createExportExpression(name, value, location, liveBinding) {
    return setTextRange(
      liveBinding && languageVersion !== 0 /* ES3 */ ? factory2.createCallExpression(
        factory2.createPropertyAccessExpression(
          factory2.createIdentifier("Object"),
          "defineProperty"
        ),
        /*typeArguments*/
        void 0,
        [
          factory2.createIdentifier("exports"),
          factory2.createStringLiteralFromNode(name),
          factory2.createObjectLiteralExpression([
            factory2.createPropertyAssignment("enumerable", factory2.createTrue()),
            factory2.createPropertyAssignment("get", factory2.createFunctionExpression(
              /*modifiers*/
              void 0,
              /*asteriskToken*/
              void 0,
              /*name*/
              void 0,
              /*typeParameters*/
              void 0,
              /*parameters*/
              [],
              /*type*/
              void 0,
              factory2.createBlock([factory2.createReturnStatement(value)])
            ))
          ])
        ]
      ) : factory2.createAssignment(
        factory2.createPropertyAccessExpression(
          factory2.createIdentifier("exports"),
          factory2.cloneNode(name)
        ),
        value
      ),
      location
    );
  }
  function modifierVisitor(node) {
    switch (node.kind) {
      case 95 /* ExportKeyword */:
      case 90 /* DefaultKeyword */:
        return void 0;
    }
    return node;
  }
  function onEmitNode(hint, node, emitCallback) {
    if (node.kind === 311 /* SourceFile */) {
      currentSourceFile = node;
      currentModuleInfo = moduleInfoMap[getOriginalNodeId(currentSourceFile)];
      previousOnEmitNode(hint, node, emitCallback);
      currentSourceFile = void 0;
      currentModuleInfo = void 0;
    } else {
      previousOnEmitNode(hint, node, emitCallback);
    }
  }
  function onSubstituteNode(hint, node) {
    node = previousOnSubstituteNode(hint, node);
    if (node.id && noSubstitution[node.id]) {
      return node;
    }
    if (hint === 1 /* Expression */) {
      return substituteExpression(node);
    } else if (isShorthandPropertyAssignment(node)) {
      return substituteShorthandPropertyAssignment(node);
    }
    return node;
  }
  function substituteShorthandPropertyAssignment(node) {
    const name = node.name;
    const exportedOrImportedName = substituteExpressionIdentifier(name);
    if (exportedOrImportedName !== name) {
      if (node.objectAssignmentInitializer) {
        const initializer = factory2.createAssignment(exportedOrImportedName, node.objectAssignmentInitializer);
        return setTextRange(factory2.createPropertyAssignment(name, initializer), node);
      }
      return setTextRange(factory2.createPropertyAssignment(name, exportedOrImportedName), node);
    }
    return node;
  }
  function substituteExpression(node) {
    switch (node.kind) {
      case 80 /* Identifier */:
        return substituteExpressionIdentifier(node);
      case 212 /* CallExpression */:
        return substituteCallExpression(node);
      case 214 /* TaggedTemplateExpression */:
        return substituteTaggedTemplateExpression(node);
      case 225 /* BinaryExpression */:
        return substituteBinaryExpression(node);
    }
    return node;
  }
  function substituteCallExpression(node) {
    if (isIdentifier(node.expression)) {
      const expression = substituteExpressionIdentifier(node.expression);
      noSubstitution[getNodeId(expression)] = true;
      if (!isIdentifier(expression) && !(getEmitFlags(node.expression) & 8192 /* HelperName */)) {
        return addInternalEmitFlags(
          factory2.updateCallExpression(
            node,
            expression,
            /*typeArguments*/
            void 0,
            node.arguments
          ),
          16 /* IndirectCall */
        );
      }
    }
    return node;
  }
  function substituteTaggedTemplateExpression(node) {
    if (isIdentifier(node.tag)) {
      const tag = substituteExpressionIdentifier(node.tag);
      noSubstitution[getNodeId(tag)] = true;
      if (!isIdentifier(tag) && !(getEmitFlags(node.tag) & 8192 /* HelperName */)) {
        return addInternalEmitFlags(
          factory2.updateTaggedTemplateExpression(
            node,
            tag,
            /*typeArguments*/
            void 0,
            node.template
          ),
          16 /* IndirectCall */
        );
      }
    }
    return node;
  }
  function substituteExpressionIdentifier(node) {
    var _a, _b;
    if (getEmitFlags(node) & 8192 /* HelperName */) {
      const externalHelpersModuleName = getExternalHelpersModuleName(currentSourceFile);
      if (externalHelpersModuleName) {
        return factory2.createPropertyAccessExpression(externalHelpersModuleName, node);
      }
      return node;
    } else if (!(isGeneratedIdentifier(node) && !(node.emitNode.autoGenerate.flags & 64 /* AllowNameSubstitution */)) && !isLocalName(node)) {
      const exportContainer = resolver.getReferencedExportContainer(node, isExportName(node));
      if (exportContainer && exportContainer.kind === 311 /* SourceFile */) {
        return setTextRange(
          factory2.createPropertyAccessExpression(
            factory2.createIdentifier("exports"),
            factory2.cloneNode(node)
          ),
          /*location*/
          node
        );
      }
      const importDeclaration = resolver.getReferencedImportDeclaration(node);
      if (importDeclaration) {
        if (isImportClause(importDeclaration)) {
          return setTextRange(
            factory2.createPropertyAccessExpression(
              factory2.getGeneratedNameForNode(importDeclaration.parent),
              factory2.createIdentifier("default")
            ),
            /*location*/
            node
          );
        } else if (isImportSpecifier(importDeclaration)) {
          const name = importDeclaration.propertyName || importDeclaration.name;
          return setTextRange(
            factory2.createPropertyAccessExpression(
              factory2.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) == null ? void 0 : _a.parent) == null ? void 0 : _b.parent) || importDeclaration),
              factory2.cloneNode(name)
            ),
            /*location*/
            node
          );
        }
      }
    }
    return node;
  }
  function substituteBinaryExpression(node) {
    if (isAssignmentOperator(node.operatorToken.kind) && isIdentifier(node.left) && !isGeneratedIdentifier(node.left) && !isLocalName(node.left)) {
      const exportedNames = getExports(node.left);
      if (exportedNames) {
        let expression = node;
        for (const exportName of exportedNames) {
          noSubstitution[getNodeId(expression)] = true;
          expression = createExportExpression(
            exportName,
            expression,
            /*location*/
            node
          );
        }
        return expression;
      }
    }
    return node;
  }
  function getExports(name) {
    if (!isGeneratedIdentifier(name)) {
      const importDeclaration = resolver.getReferencedImportDeclaration(name);
      if (importDeclaration) {
        return currentModuleInfo == null ? void 0 : currentModuleInfo.exportedBindings[getOriginalNodeId(importDeclaration)];
      }
      const bindingsSet = /* @__PURE__ */ new Set();
      const declarations = resolver.getReferencedValueDeclarations(name);
      if (declarations) {
        for (const declaration of declarations) {
          const bindings = currentModuleInfo == null ? void 0 : currentModuleInfo.exportedBindings[getOriginalNodeId(declaration)];
          if (bindings) {
            for (const binding of bindings) {
              bindingsSet.add(binding);
            }
          }
        }
        if (bindingsSet.size) {
          return arrayFrom(bindingsSet);
        }
      }
    }
  }
}
var dynamicImportUMDHelper = {
  name: "typescript:dynamicimport-sync-require",
  scoped: true,
  text: `
            var __syncRequire = typeof module === "object" && typeof module.exports === "object";`
};

// src/compiler/transformers/module/system.ts
function transformSystemModule(context) {
  const {
    factory: factory2,
    startLexicalEnvironment,
    endLexicalEnvironment,
    hoistVariableDeclaration
  } = context;
  const compilerOptions = context.getCompilerOptions();
  const resolver = context.getEmitResolver();
  const host = context.getEmitHost();
  const previousOnSubstituteNode = context.onSubstituteNode;
  const previousOnEmitNode = context.onEmitNode;
  context.onSubstituteNode = onSubstituteNode;
  context.onEmitNode = onEmitNode;
  context.enableSubstitution(80 /* Identifier */);
  context.enableSubstitution(303 /* ShorthandPropertyAssignment */);
  context.enableSubstitution(225 /* BinaryExpression */);
  context.enableSubstitution(235 /* MetaProperty */);
  context.enableEmitNotification(311 /* SourceFile */);
  const moduleInfoMap = [];
  const exportFunctionsMap = [];
  const noSubstitutionMap = [];
  const contextObjectMap = [];
  let currentSourceFile;
  let moduleInfo;
  let exportFunction;
  let contextObject;
  let hoistedStatements;
  let enclosingBlockScopedContainer;
  let noSubstitution;
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    if (node.isDeclarationFile || !(isEffectiveExternalModule(node, compilerOptions) || node.transformFlags & 8388608 /* ContainsDynamicImport */)) {
      return node;
    }
    const id = getOriginalNodeId(node);
    currentSourceFile = node;
    enclosingBlockScopedContainer = node;
    moduleInfo = moduleInfoMap[id] = collectExternalModuleInfo(context, node, resolver, compilerOptions);
    exportFunction = factory2.createUniqueName("exports");
    exportFunctionsMap[id] = exportFunction;
    contextObject = contextObjectMap[id] = factory2.createUniqueName("context");
    const dependencyGroups = collectDependencyGroups(moduleInfo.externalImports);
    const moduleBodyBlock = createSystemModuleBody(node, dependencyGroups);
    const moduleBodyFunction = factory2.createFunctionExpression(
      /*modifiers*/
      void 0,
      /*asteriskToken*/
      void 0,
      /*name*/
      void 0,
      /*typeParameters*/
      void 0,
      [
        factory2.createParameterDeclaration(
          /*modifiers*/
          void 0,
          /*dotDotDotToken*/
          void 0,
          exportFunction
        ),
        factory2.createParameterDeclaration(
          /*modifiers*/
          void 0,
          /*dotDotDotToken*/
          void 0,
          contextObject
        )
      ],
      /*type*/
      void 0,
      moduleBodyBlock
    );
    const moduleName = tryGetModuleNameFromFile(factory2, node, host, compilerOptions);
    const dependencies = factory2.createArrayLiteralExpression(map(dependencyGroups, (dependencyGroup) => dependencyGroup.name));
    const updated = setEmitFlags(
      factory2.updateSourceFile(
        node,
        setTextRange(
          factory2.createNodeArray([
            factory2.createExpressionStatement(
              factory2.createCallExpression(
                factory2.createPropertyAccessExpression(factory2.createIdentifier("System"), "register"),
                /*typeArguments*/
                void 0,
                moduleName ? [moduleName, dependencies, moduleBodyFunction] : [dependencies, moduleBodyFunction]
              )
            )
          ]),
          node.statements
        )
      ),
      2048 /* NoTrailingComments */
    );
    if (!outFile(compilerOptions)) {
      moveEmitHelpers(updated, moduleBodyBlock, (helper) => !helper.scoped);
    }
    if (noSubstitution) {
      noSubstitutionMap[id] = noSubstitution;
      noSubstitution = void 0;
    }
    currentSourceFile = void 0;
    moduleInfo = void 0;
    exportFunction = void 0;
    contextObject = void 0;
    hoistedStatements = void 0;
    enclosingBlockScopedContainer = void 0;
    return updated;
  }
  function collectDependencyGroups(externalImports) {
    const groupIndices = /* @__PURE__ */ new Map();
    const dependencyGroups = [];
    for (const externalImport of externalImports) {
      const externalModuleName = getExternalModuleNameLiteral(factory2, externalImport, currentSourceFile, host, resolver, compilerOptions);
      if (externalModuleName) {
        const text = externalModuleName.text;
        const groupIndex = groupIndices.get(text);
        if (groupIndex !== void 0) {
          dependencyGroups[groupIndex].externalImports.push(externalImport);
        } else {
          groupIndices.set(text, dependencyGroups.length);
          dependencyGroups.push({
            name: externalModuleName,
            externalImports: [externalImport]
          });
        }
      }
    }
    return dependencyGroups;
  }
  function createSystemModuleBody(node, dependencyGroups) {
    const statements = [];
    startLexicalEnvironment();
    const ensureUseStrict = getStrictOptionValue(compilerOptions, "alwaysStrict") || !compilerOptions.noImplicitUseStrict && isExternalModule(currentSourceFile);
    const statementOffset = factory2.copyPrologue(node.statements, statements, ensureUseStrict, topLevelVisitor);
    statements.push(
      factory2.createVariableStatement(
        /*modifiers*/
        void 0,
        factory2.createVariableDeclarationList([
          factory2.createVariableDeclaration(
            "__moduleName",
            /*exclamationToken*/
            void 0,
            /*type*/
            void 0,
            factory2.createLogicalAnd(
              contextObject,
              factory2.createPropertyAccessExpression(contextObject, "id")
            )
          )
        ])
      )
    );
    visitNode(moduleInfo.externalHelpersImportDeclaration, topLevelVisitor, isStatement);
    const executeStatements = visitNodes2(node.statements, topLevelVisitor, isStatement, statementOffset);
    addRange(statements, hoistedStatements);
    insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
    const exportStarFunction = addExportStarIfNeeded(statements);
    const modifiers = node.transformFlags & 2097152 /* ContainsAwait */ ? factory2.createModifiersFromModifierFlags(512 /* Async */) : void 0;
    const moduleObject = factory2.createObjectLiteralExpression(
      [
        factory2.createPropertyAssignment(
          "setters",
          createSettersArray(exportStarFunction, dependencyGroups)
        ),
        factory2.createPropertyAssignment(
          "execute",
          factory2.createFunctionExpression(
            modifiers,
            /*asteriskToken*/
            void 0,
            /*name*/
            void 0,
            /*typeParameters*/
            void 0,
            /*parameters*/
            [],
            /*type*/
            void 0,
            factory2.createBlock(
              executeStatements,
              /*multiLine*/
              true
            )
          )
        )
      ],
      /*multiLine*/
      true
    );
    statements.push(factory2.createReturnStatement(moduleObject));
    return factory2.createBlock(
      statements,
      /*multiLine*/
      true
    );
  }
  function addExportStarIfNeeded(statements) {
    if (!moduleInfo.hasExportStarsToExportValues) {
      return;
    }
    if (!moduleInfo.exportedNames && moduleInfo.exportSpecifiers.size === 0) {
      let hasExportDeclarationWithExportClause = false;
      for (const externalImport of moduleInfo.externalImports) {
        if (externalImport.kind === 277 /* ExportDeclaration */ && externalImport.exportClause) {
          hasExportDeclarationWithExportClause = true;
          break;
        }
      }
      if (!hasExportDeclarationWithExportClause) {
        const exportStarFunction2 = createExportStarFunction(
          /*localNames*/
          void 0
        );
        statements.push(exportStarFunction2);
        return exportStarFunction2.name;
      }
    }
    const exportedNames = [];
    if (moduleInfo.exportedNames) {
      for (const exportedLocalName of moduleInfo.exportedNames) {
        if (exportedLocalName.escapedText === "default") {
          continue;
        }
        exportedNames.push(
          factory2.createPropertyAssignment(
            factory2.createStringLiteralFromNode(exportedLocalName),
            factory2.createTrue()
          )
        );
      }
    }
    const exportedNamesStorageRef = factory2.createUniqueName("exportedNames");
    statements.push(
      factory2.createVariableStatement(
        /*modifiers*/
        void 0,
        factory2.createVariableDeclarationList([
          factory2.createVariableDeclaration(
            exportedNamesStorageRef,
            /*exclamationToken*/
            void 0,
            /*type*/
            void 0,
            factory2.createObjectLiteralExpression(
              exportedNames,
              /*multiLine*/
              true
            )
          )
        ])
      )
    );
    const exportStarFunction = createExportStarFunction(exportedNamesStorageRef);
    statements.push(exportStarFunction);
    return exportStarFunction.name;
  }
  function createExportStarFunction(localNames) {
    const exportStarFunction = factory2.createUniqueName("exportStar");
    const m = factory2.createIdentifier("m");
    const n = factory2.createIdentifier("n");
    const exports = factory2.createIdentifier("exports");
    let condition = factory2.createStrictInequality(n, factory2.createStringLiteral("default"));
    if (localNames) {
      condition = factory2.createLogicalAnd(
        condition,
        factory2.createLogicalNot(
          factory2.createCallExpression(
            factory2.createPropertyAccessExpression(localNames, "hasOwnProperty"),
            /*typeArguments*/
            void 0,
            [n]
          )
        )
      );
    }
    return factory2.createFunctionDeclaration(
      /*modifiers*/
      void 0,
      /*asteriskToken*/
      void 0,
      exportStarFunction,
      /*typeParameters*/
      void 0,
      [factory2.createParameterDeclaration(
        /*modifiers*/
        void 0,
        /*dotDotDotToken*/
        void 0,
        m
      )],
      /*type*/
      void 0,
      factory2.createBlock(
        [
          factory2.createVariableStatement(
            /*modifiers*/
            void 0,
            factory2.createVariableDeclarationList([
              factory2.createVariableDeclaration(
                exports,
                /*exclamationToken*/
                void 0,
                /*type*/
                void 0,
                factory2.createObjectLiteralExpression([])
              )
            ])
          ),
          factory2.createForInStatement(
            factory2.createVariableDeclarationList([
              factory2.createVariableDeclaration(n)
            ]),
            m,
            factory2.createBlock([
              setEmitFlags(
                factory2.createIfStatement(
                  condition,
                  factory2.createExpressionStatement(
                    factory2.createAssignment(
                      factory2.createElementAccessExpression(exports, n),
                      factory2.createElementAccessExpression(m, n)
                    )
                  )
                ),
                1 /* SingleLine */
              )
            ])
          ),
          factory2.createExpressionStatement(
            factory2.createCallExpression(
              exportFunction,
              /*typeArguments*/
              void 0,
              [exports]
            )
          )
        ],
        /*multiLine*/
        true
      )
    );
  }
  function createSettersArray(exportStarFunction, dependencyGroups) {
    const setters = [];
    for (const group2 of dependencyGroups) {
      const localName = forEach(group2.externalImports, (i) => getLocalNameForExternalImport(factory2, i, currentSourceFile));
      const parameterName = localName ? factory2.getGeneratedNameForNode(localName) : factory2.createUniqueName("");
      const statements = [];
      for (const entry of group2.externalImports) {
        const importVariableName = getLocalNameForExternalImport(factory2, entry, currentSourceFile);
        switch (entry.kind) {
          case 271 /* ImportDeclaration */:
            if (!entry.importClause) {
              break;
            }
          case 270 /* ImportEqualsDeclaration */:
            Debug.assert(importVariableName !== void 0);
            statements.push(
              factory2.createExpressionStatement(
                factory2.createAssignment(importVariableName, parameterName)
              )
            );
            if (hasSyntacticModifier(entry, 1 /* Export */)) {
              statements.push(
                factory2.createExpressionStatement(
                  factory2.createCallExpression(
                    exportFunction,
                    /*typeArguments*/
                    void 0,
                    [
                      factory2.createStringLiteral(idText(importVariableName)),
                      parameterName
                    ]
                  )
                )
              );
            }
            break;
          case 277 /* ExportDeclaration */:
            Debug.assert(importVariableName !== void 0);
            if (entry.exportClause) {
              if (isNamedExports(entry.exportClause)) {
                const properties = [];
                for (const e of entry.exportClause.elements) {
                  properties.push(
                    factory2.createPropertyAssignment(
                      factory2.createStringLiteral(idText(e.name)),
                      factory2.createElementAccessExpression(
                        parameterName,
                        factory2.createStringLiteral(idText(e.propertyName || e.name))
                      )
                    )
                  );
                }
                statements.push(
                  factory2.createExpressionStatement(
                    factory2.createCallExpression(
                      exportFunction,
                      /*typeArguments*/
                      void 0,
                      [factory2.createObjectLiteralExpression(
                        properties,
                        /*multiLine*/
                        true
                      )]
                    )
                  )
                );
              } else {
                statements.push(
                  factory2.createExpressionStatement(
                    factory2.createCallExpression(
                      exportFunction,
                      /*typeArguments*/
                      void 0,
                      [
                        factory2.createStringLiteral(idText(entry.exportClause.name)),
                        parameterName
                      ]
                    )
                  )
                );
              }
            } else {
              statements.push(
                factory2.createExpressionStatement(
                  factory2.createCallExpression(
                    exportStarFunction,
                    /*typeArguments*/
                    void 0,
                    [parameterName]
                  )
                )
              );
            }
            break;
        }
      }
      setters.push(
        factory2.createFunctionExpression(
          /*modifiers*/
          void 0,
          /*asteriskToken*/
          void 0,
          /*name*/
          void 0,
          /*typeParameters*/
          void 0,
          [factory2.createParameterDeclaration(
            /*modifiers*/
            void 0,
            /*dotDotDotToken*/
            void 0,
            parameterName
          )],
          /*type*/
          void 0,
          factory2.createBlock(
            statements,
            /*multiLine*/
            true
          )
        )
      );
    }
    return factory2.createArrayLiteralExpression(
      setters,
      /*multiLine*/
      true
    );
  }
  function topLevelVisitor(node) {
    switch (node.kind) {
      case 271 /* ImportDeclaration */:
        return visitImportDeclaration(node);
      case 270 /* ImportEqualsDeclaration */:
        return visitImportEqualsDeclaration(node);
      case 277 /* ExportDeclaration */:
        return visitExportDeclaration(node);
      case 276 /* ExportAssignment */:
        return visitExportAssignment(node);
      default:
        return topLevelNestedVisitor(node);
    }
  }
  function visitImportDeclaration(node) {
    let statements;
    if (node.importClause) {
      hoistVariableDeclaration(getLocalNameForExternalImport(factory2, node, currentSourceFile));
    }
    return singleOrMany(appendExportsOfImportDeclaration(statements, node));
  }
  function visitExportDeclaration(node) {
    Debug.assertIsDefined(node);
    return void 0;
  }
  function visitImportEqualsDeclaration(node) {
    Debug.assert(isExternalModuleImportEqualsDeclaration(node), "import= for internal module references should be handled in an earlier transformer.");
    let statements;
    hoistVariableDeclaration(getLocalNameForExternalImport(factory2, node, currentSourceFile));
    return singleOrMany(appendExportsOfImportEqualsDeclaration(statements, node));
  }
  function visitExportAssignment(node) {
    if (node.isExportEquals) {
      return void 0;
    }
    const expression = visitNode(node.expression, visitor, isExpression);
    return createExportStatement(
      factory2.createIdentifier("default"),
      expression,
      /*allowComments*/
      true
    );
  }
  function visitFunctionDeclaration(node) {
    if (hasSyntacticModifier(node, 1 /* Export */)) {
      hoistedStatements = append(
        hoistedStatements,
        factory2.updateFunctionDeclaration(
          node,
          visitNodes2(node.modifiers, modifierVisitor, isModifierLike),
          node.asteriskToken,
          factory2.getDeclarationName(
            node,
            /*allowComments*/
            true,
            /*allowSourceMaps*/
            true
          ),
          /*typeParameters*/
          void 0,
          visitNodes2(node.parameters, visitor, isParameter),
          /*type*/
          void 0,
          visitNode(node.body, visitor, isBlock)
        )
      );
    } else {
      hoistedStatements = append(hoistedStatements, visitEachChild(node, visitor, context));
    }
    hoistedStatements = appendExportsOfHoistedDeclaration(hoistedStatements, node);
    return void 0;
  }
  function visitClassDeclaration(node) {
    let statements;
    const name = factory2.getLocalName(node);
    hoistVariableDeclaration(name);
    statements = append(
      statements,
      setTextRange(
        factory2.createExpressionStatement(
          factory2.createAssignment(
            name,
            setTextRange(
              factory2.createClassExpression(
                visitNodes2(node.modifiers, modifierVisitor, isModifierLike),
                node.name,
                /*typeParameters*/
                void 0,
                visitNodes2(node.heritageClauses, visitor, isHeritageClause),
                visitNodes2(node.members, visitor, isClassElement)
              ),
              node
            )
          )
        ),
        node
      )
    );
    statements = appendExportsOfHoistedDeclaration(statements, node);
    return singleOrMany(statements);
  }
  function visitVariableStatement(node) {
    if (!shouldHoistVariableDeclarationList(node.declarationList)) {
      return visitNode(node, visitor, isStatement);
    }
    let expressions;
    const isExportedDeclaration = hasSyntacticModifier(node, 1 /* Export */);
    for (const variable of node.declarationList.declarations) {
      if (variable.initializer) {
        expressions = append(expressions, transformInitializedVariable(variable, isExportedDeclaration));
      } else {
        hoistBindingElement(variable);
      }
    }
    let statements;
    if (expressions) {
      statements = append(statements, setTextRange(factory2.createExpressionStatement(factory2.inlineExpressions(expressions)), node));
    }
    statements = appendExportsOfVariableStatement(
      statements,
      node,
      /*exportSelf*/
      false
    );
    return singleOrMany(statements);
  }
  function hoistBindingElement(node) {
    if (isBindingPattern(node.name)) {
      for (const element of node.name.elements) {
        if (!isOmittedExpression(element)) {
          hoistBindingElement(element);
        }
      }
    } else {
      hoistVariableDeclaration(factory2.cloneNode(node.name));
    }
  }
  function shouldHoistVariableDeclarationList(node) {
    return (getEmitFlags(node) & 4194304 /* NoHoisting */) === 0 && (enclosingBlockScopedContainer.kind === 311 /* SourceFile */ || (getOriginalNode(node).flags & 3 /* BlockScoped */) === 0);
  }
  function transformInitializedVariable(node, isExportedDeclaration) {
    const createAssignment = isExportedDeclaration ? createExportedVariableAssignment : createNonExportedVariableAssignment;
    return isBindingPattern(node.name) ? flattenDestructuringAssignment(
      node,
      visitor,
      context,
      0 /* All */,
      /*needsValue*/
      false,
      createAssignment
    ) : node.initializer ? createAssignment(node.name, visitNode(node.initializer, visitor, isExpression)) : node.name;
  }
  function createExportedVariableAssignment(name, value, location) {
    return createVariableAssignment(
      name,
      value,
      location,
      /*isExportedDeclaration*/
      true
    );
  }
  function createNonExportedVariableAssignment(name, value, location) {
    return createVariableAssignment(
      name,
      value,
      location,
      /*isExportedDeclaration*/
      false
    );
  }
  function createVariableAssignment(name, value, location, isExportedDeclaration) {
    hoistVariableDeclaration(factory2.cloneNode(name));
    return isExportedDeclaration ? createExportExpression(name, preventSubstitution(setTextRange(factory2.createAssignment(name, value), location))) : preventSubstitution(setTextRange(factory2.createAssignment(name, value), location));
  }
  function appendExportsOfImportDeclaration(statements, decl) {
    if (moduleInfo.exportEquals) {
      return statements;
    }
    const importClause = decl.importClause;
    if (!importClause) {
      return statements;
    }
    if (importClause.name) {
      statements = appendExportsOfDeclaration(statements, importClause);
    }
    const namedBindings = importClause.namedBindings;
    if (namedBindings) {
      switch (namedBindings.kind) {
        case 273 /* NamespaceImport */:
          statements = appendExportsOfDeclaration(statements, namedBindings);
          break;
        case 274 /* NamedImports */:
          for (const importBinding of namedBindings.elements) {
            statements = appendExportsOfDeclaration(statements, importBinding);
          }
          break;
      }
    }
    return statements;
  }
  function appendExportsOfImportEqualsDeclaration(statements, decl) {
    if (moduleInfo.exportEquals) {
      return statements;
    }
    return appendExportsOfDeclaration(statements, decl);
  }
  function appendExportsOfVariableStatement(statements, node, exportSelf) {
    if (moduleInfo.exportEquals) {
      return statements;
    }
    for (const decl of node.declarationList.declarations) {
      if (decl.initializer || exportSelf) {
        statements = appendExportsOfBindingElement(statements, decl, exportSelf);
      }
    }
    return statements;
  }
  function appendExportsOfBindingElement(statements, decl, exportSelf) {
    if (moduleInfo.exportEquals) {
      return statements;
    }
    if (isBindingPattern(decl.name)) {
      for (const element of decl.name.elements) {
        if (!isOmittedExpression(element)) {
          statements = appendExportsOfBindingElement(statements, element, exportSelf);
        }
      }
    } else if (!isGeneratedIdentifier(decl.name)) {
      let excludeName;
      if (exportSelf) {
        statements = appendExportStatement(statements, decl.name, factory2.getLocalName(decl));
        excludeName = idText(decl.name);
      }
      statements = appendExportsOfDeclaration(statements, decl, excludeName);
    }
    return statements;
  }
  function appendExportsOfHoistedDeclaration(statements, decl) {
    if (moduleInfo.exportEquals) {
      return statements;
    }
    let excludeName;
    if (hasSyntacticModifier(decl, 1 /* Export */)) {
      const exportName = hasSyntacticModifier(decl, 1024 /* Default */) ? factory2.createStringLiteral("default") : decl.name;
      statements = appendExportStatement(statements, exportName, factory2.getLocalName(decl));
      excludeName = getTextOfIdentifierOrLiteral(exportName);
    }
    if (decl.name) {
      statements = appendExportsOfDeclaration(statements, decl, excludeName);
    }
    return statements;
  }
  function appendExportsOfDeclaration(statements, decl, excludeName) {
    if (moduleInfo.exportEquals) {
      return statements;
    }
    const name = factory2.getDeclarationName(decl);
    const exportSpecifiers = moduleInfo.exportSpecifiers.get(idText(name));
    if (exportSpecifiers) {
      for (const exportSpecifier of exportSpecifiers) {
        if (exportSpecifier.name.escapedText !== excludeName) {
          statements = appendExportStatement(statements, exportSpecifier.name, name);
        }
      }
    }
    return statements;
  }
  function appendExportStatement(statements, exportName, expression, allowComments) {
    statements = append(statements, createExportStatement(exportName, expression, allowComments));
    return statements;
  }
  function createExportStatement(name, value, allowComments) {
    const statement = factory2.createExpressionStatement(createExportExpression(name, value));
    startOnNewLine(statement);
    if (!allowComments) {
      setEmitFlags(statement, 3072 /* NoComments */);
    }
    return statement;
  }
  function createExportExpression(name, value) {
    const exportName = isIdentifier(name) ? factory2.createStringLiteralFromNode(name) : name;
    setEmitFlags(value, getEmitFlags(value) | 3072 /* NoComments */);
    return setCommentRange(factory2.createCallExpression(
      exportFunction,
      /*typeArguments*/
      void 0,
      [exportName, value]
    ), value);
  }
  function topLevelNestedVisitor(node) {
    switch (node.kind) {
      case 242 /* VariableStatement */:
        return visitVariableStatement(node);
      case 261 /* FunctionDeclaration */:
        return visitFunctionDeclaration(node);
      case 262 /* ClassDeclaration */:
        return visitClassDeclaration(node);
      case 247 /* ForStatement */:
        return visitForStatement(
          node,
          /*isTopLevel*/
          true
        );
      case 248 /* ForInStatement */:
        return visitForInStatement(node);
      case 249 /* ForOfStatement */:
        return visitForOfStatement(node);
      case 245 /* DoStatement */:
        return visitDoStatement(node);
      case 246 /* WhileStatement */:
        return visitWhileStatement(node);
      case 255 /* LabeledStatement */:
        return visitLabeledStatement(node);
      case 253 /* WithStatement */:
        return visitWithStatement(node);
      case 244 /* IfStatement */:
        return visitIfStatement(node);
      case 254 /* SwitchStatement */:
        return visitSwitchStatement(node);
      case 268 /* CaseBlock */:
        return visitCaseBlock(node);
      case 295 /* CaseClause */:
        return visitCaseClause(node);
      case 296 /* DefaultClause */:
        return visitDefaultClause(node);
      case 257 /* TryStatement */:
        return visitTryStatement(node);
      case 298 /* CatchClause */:
        return visitCatchClause(node);
      case 240 /* Block */:
        return visitBlock(node);
      default:
        return visitor(node);
    }
  }
  function visitForStatement(node, isTopLevel) {
    const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
    enclosingBlockScopedContainer = node;
    node = factory2.updateForStatement(
      node,
      visitNode(node.initializer, isTopLevel ? visitForInitializer : discardedValueVisitor, isForInitializer),
      visitNode(node.condition, visitor, isExpression),
      visitNode(node.incrementor, discardedValueVisitor, isExpression),
      visitIterationBody(node.statement, isTopLevel ? topLevelNestedVisitor : visitor, context)
    );
    enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
    return node;
  }
  function visitForInStatement(node) {
    const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
    enclosingBlockScopedContainer = node;
    node = factory2.updateForInStatement(
      node,
      visitForInitializer(node.initializer),
      visitNode(node.expression, visitor, isExpression),
      visitIterationBody(node.statement, topLevelNestedVisitor, context)
    );
    enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
    return node;
  }
  function visitForOfStatement(node) {
    const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
    enclosingBlockScopedContainer = node;
    node = factory2.updateForOfStatement(
      node,
      node.awaitModifier,
      visitForInitializer(node.initializer),
      visitNode(node.expression, visitor, isExpression),
      visitIterationBody(node.statement, topLevelNestedVisitor, context)
    );
    enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
    return node;
  }
  function shouldHoistForInitializer(node) {
    return isVariableDeclarationList(node) && shouldHoistVariableDeclarationList(node);
  }
  function visitForInitializer(node) {
    if (shouldHoistForInitializer(node)) {
      let expressions;
      for (const variable of node.declarations) {
        expressions = append(expressions, transformInitializedVariable(
          variable,
          /*isExportedDeclaration*/
          false
        ));
        if (!variable.initializer) {
          hoistBindingElement(variable);
        }
      }
      return expressions ? factory2.inlineExpressions(expressions) : factory2.createOmittedExpression();
    } else {
      return visitNode(node, discardedValueVisitor, isForInitializer);
    }
  }
  function visitDoStatement(node) {
    return factory2.updateDoStatement(
      node,
      visitIterationBody(node.statement, topLevelNestedVisitor, context),
      visitNode(node.expression, visitor, isExpression)
    );
  }
  function visitWhileStatement(node) {
    return factory2.updateWhileStatement(
      node,
      visitNode(node.expression, visitor, isExpression),
      visitIterationBody(node.statement, topLevelNestedVisitor, context)
    );
  }
  function visitLabeledStatement(node) {
    return factory2.updateLabeledStatement(
      node,
      node.label,
      Debug.checkDefined(visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock))
    );
  }
  function visitWithStatement(node) {
    return factory2.updateWithStatement(
      node,
      visitNode(node.expression, visitor, isExpression),
      Debug.checkDefined(visitNode(node.statement, topLevelNestedVisitor, isStatement, factory2.liftToBlock))
    );
  }
  function visitIfStatement(node) {
    return factory2.updateIfStatement(
      node,
      visitNode(node.expression, visitor, isExpression),
      Debug.checkDefined(visitNode(node.thenStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock)),
      visitNode(node.elseStatement, topLevelNestedVisitor, isStatement, factory2.liftToBlock)
    );
  }
  function visitSwitchStatement(node) {
    return factory2.updateSwitchStatement(
      node,
      visitNode(node.expression, visitor, isExpression),
      Debug.checkDefined(visitNode(node.caseBlock, topLevelNestedVisitor, isCaseBlock))
    );
  }
  function visitCaseBlock(node) {
    const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
    enclosingBlockScopedContainer = node;
    node = factory2.updateCaseBlock(
      node,
      visitNodes2(node.clauses, topLevelNestedVisitor, isCaseOrDefaultClause)
    );
    enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
    return node;
  }
  function visitCaseClause(node) {
    return factory2.updateCaseClause(
      node,
      visitNode(node.expression, visitor, isExpression),
      visitNodes2(node.statements, topLevelNestedVisitor, isStatement)
    );
  }
  function visitDefaultClause(node) {
    return visitEachChild(node, topLevelNestedVisitor, context);
  }
  function visitTryStatement(node) {
    return visitEachChild(node, topLevelNestedVisitor, context);
  }
  function visitCatchClause(node) {
    const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
    enclosingBlockScopedContainer = node;
    node = factory2.updateCatchClause(
      node,
      node.variableDeclaration,
      Debug.checkDefined(visitNode(node.block, topLevelNestedVisitor, isBlock))
    );
    enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
    return node;
  }
  function visitBlock(node) {
    const savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
    enclosingBlockScopedContainer = node;
    node = visitEachChild(node, topLevelNestedVisitor, context);
    enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
    return node;
  }
  function visitorWorker(node, valueIsDiscarded) {
    if (!(node.transformFlags & (4096 /* ContainsDestructuringAssignment */ | 8388608 /* ContainsDynamicImport */ | 268435456 /* ContainsUpdateExpressionForIdentifier */))) {
      return node;
    }
    switch (node.kind) {
      case 247 /* ForStatement */:
        return visitForStatement(
          node,
          /*isTopLevel*/
          false
        );
      case 243 /* ExpressionStatement */:
        return visitExpressionStatement(node);
      case 216 /* ParenthesizedExpression */:
        return visitParenthesizedExpression(node, valueIsDiscarded);
      case 359 /* PartiallyEmittedExpression */:
        return visitPartiallyEmittedExpression(node, valueIsDiscarded);
      case 225 /* BinaryExpression */:
        if (isDestructuringAssignment(node)) {
          return visitDestructuringAssignment(node, valueIsDiscarded);
        }
        break;
      case 212 /* CallExpression */:
        if (isImportCall(node)) {
          return visitImportCallExpression(node);
        }
        break;
      case 223 /* PrefixUnaryExpression */:
      case 224 /* PostfixUnaryExpression */:
        return visitPrefixOrPostfixUnaryExpression(node, valueIsDiscarded);
    }
    return visitEachChild(node, visitor, context);
  }
  function visitor(node) {
    return visitorWorker(
      node,
      /*valueIsDiscarded*/
      false
    );
  }
  function discardedValueVisitor(node) {
    return visitorWorker(
      node,
      /*valueIsDiscarded*/
      true
    );
  }
  function visitExpressionStatement(node) {
    return factory2.updateExpressionStatement(node, visitNode(node.expression, discardedValueVisitor, isExpression));
  }
  function visitParenthesizedExpression(node, valueIsDiscarded) {
    return factory2.updateParenthesizedExpression(node, visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, isExpression));
  }
  function visitPartiallyEmittedExpression(node, valueIsDiscarded) {
    return factory2.updatePartiallyEmittedExpression(node, visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, isExpression));
  }
  function visitImportCallExpression(node) {
    const externalModuleName = getExternalModuleNameLiteral(factory2, node, currentSourceFile, host, resolver, compilerOptions);
    const firstArgument = visitNode(firstOrUndefined(node.arguments), visitor, isExpression);
    const argument = externalModuleName && (!firstArgument || !isStringLiteral(firstArgument) || firstArgument.text !== externalModuleName.text) ? externalModuleName : firstArgument;
    return factory2.createCallExpression(
      factory2.createPropertyAccessExpression(
        contextObject,
        factory2.createIdentifier("import")
      ),
      /*typeArguments*/
      void 0,
      argument ? [argument] : []
    );
  }
  function visitDestructuringAssignment(node, valueIsDiscarded) {
    if (hasExportedReferenceInDestructuringTarget(node.left)) {
      return flattenDestructuringAssignment(
        node,
        visitor,
        context,
        0 /* All */,
        !valueIsDiscarded
      );
    }
    return visitEachChild(node, visitor, context);
  }
  function hasExportedReferenceInDestructuringTarget(node) {
    if (isAssignmentExpression(
      node,
      /*excludeCompoundAssignment*/
      true
    )) {
      return hasExportedReferenceInDestructuringTarget(node.left);
    } else if (isSpreadElement(node)) {
      return hasExportedReferenceInDestructuringTarget(node.expression);
    } else if (isObjectLiteralExpression(node)) {
      return some(node.properties, hasExportedReferenceInDestructuringTarget);
    } else if (isArrayLiteralExpression(node)) {
      return some(node.elements, hasExportedReferenceInDestructuringTarget);
    } else if (isShorthandPropertyAssignment(node)) {
      return hasExportedReferenceInDestructuringTarget(node.name);
    } else if (isPropertyAssignment(node)) {
      return hasExportedReferenceInDestructuringTarget(node.initializer);
    } else if (isIdentifier(node)) {
      const container = resolver.getReferencedExportContainer(node);
      return container !== void 0 && container.kind === 311 /* SourceFile */;
    } else {
      return false;
    }
  }
  function visitPrefixOrPostfixUnaryExpression(node, valueIsDiscarded) {
    if ((node.operator === 46 /* PlusPlusToken */ || node.operator === 47 /* MinusMinusToken */) && isIdentifier(node.operand) && !isGeneratedIdentifier(node.operand) && !isLocalName(node.operand) && !isDeclarationNameOfEnumOrNamespace(node.operand)) {
      const exportedNames = getExports(node.operand);
      if (exportedNames) {
        let temp;
        let expression = visitNode(node.operand, visitor, isExpression);
        if (isPrefixUnaryExpression(node)) {
          expression = factory2.updatePrefixUnaryExpression(node, expression);
        } else {
          expression = factory2.updatePostfixUnaryExpression(node, expression);
          if (!valueIsDiscarded) {
            temp = factory2.createTempVariable(hoistVariableDeclaration);
            expression = factory2.createAssignment(temp, expression);
            setTextRange(expression, node);
          }
          expression = factory2.createComma(expression, factory2.cloneNode(node.operand));
          setTextRange(expression, node);
        }
        for (const exportName of exportedNames) {
          expression = createExportExpression(exportName, preventSubstitution(expression));
        }
        if (temp) {
          expression = factory2.createComma(expression, temp);
          setTextRange(expression, node);
        }
        return expression;
      }
    }
    return visitEachChild(node, visitor, context);
  }
  function modifierVisitor(node) {
    switch (node.kind) {
      case 95 /* ExportKeyword */:
      case 90 /* DefaultKeyword */:
        return void 0;
    }
    return node;
  }
  function onEmitNode(hint, node, emitCallback) {
    if (node.kind === 311 /* SourceFile */) {
      const id = getOriginalNodeId(node);
      currentSourceFile = node;
      moduleInfo = moduleInfoMap[id];
      exportFunction = exportFunctionsMap[id];
      noSubstitution = noSubstitutionMap[id];
      contextObject = contextObjectMap[id];
      if (noSubstitution) {
        delete noSubstitutionMap[id];
      }
      previousOnEmitNode(hint, node, emitCallback);
      currentSourceFile = void 0;
      moduleInfo = void 0;
      exportFunction = void 0;
      contextObject = void 0;
      noSubstitution = void 0;
    } else {
      previousOnEmitNode(hint, node, emitCallback);
    }
  }
  function onSubstituteNode(hint, node) {
    node = previousOnSubstituteNode(hint, node);
    if (isSubstitutionPrevented(node)) {
      return node;
    }
    if (hint === 1 /* Expression */) {
      return substituteExpression(node);
    } else if (hint === 4 /* Unspecified */) {
      return substituteUnspecified(node);
    }
    return node;
  }
  function substituteUnspecified(node) {
    switch (node.kind) {
      case 303 /* ShorthandPropertyAssignment */:
        return substituteShorthandPropertyAssignment(node);
    }
    return node;
  }
  function substituteShorthandPropertyAssignment(node) {
    var _a, _b;
    const name = node.name;
    if (!isGeneratedIdentifier(name) && !isLocalName(name)) {
      const importDeclaration = resolver.getReferencedImportDeclaration(name);
      if (importDeclaration) {
        if (isImportClause(importDeclaration)) {
          return setTextRange(
            factory2.createPropertyAssignment(
              factory2.cloneNode(name),
              factory2.createPropertyAccessExpression(
                factory2.getGeneratedNameForNode(importDeclaration.parent),
                factory2.createIdentifier("default")
              )
            ),
            /*location*/
            node
          );
        } else if (isImportSpecifier(importDeclaration)) {
          return setTextRange(
            factory2.createPropertyAssignment(
              factory2.cloneNode(name),
              factory2.createPropertyAccessExpression(
                factory2.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) == null ? void 0 : _a.parent) == null ? void 0 : _b.parent) || importDeclaration),
                factory2.cloneNode(importDeclaration.propertyName || importDeclaration.name)
              )
            ),
            /*location*/
            node
          );
        }
      }
    }
    return node;
  }
  function substituteExpression(node) {
    switch (node.kind) {
      case 80 /* Identifier */:
        return substituteExpressionIdentifier(node);
      case 225 /* BinaryExpression */:
        return substituteBinaryExpression(node);
      case 235 /* MetaProperty */:
        return substituteMetaProperty(node);
    }
    return node;
  }
  function substituteExpressionIdentifier(node) {
    var _a, _b;
    if (getEmitFlags(node) & 8192 /* HelperName */) {
      const externalHelpersModuleName = getExternalHelpersModuleName(currentSourceFile);
      if (externalHelpersModuleName) {
        return factory2.createPropertyAccessExpression(externalHelpersModuleName, node);
      }
      return node;
    }
    if (!isGeneratedIdentifier(node) && !isLocalName(node)) {
      const importDeclaration = resolver.getReferencedImportDeclaration(node);
      if (importDeclaration) {
        if (isImportClause(importDeclaration)) {
          return setTextRange(
            factory2.createPropertyAccessExpression(
              factory2.getGeneratedNameForNode(importDeclaration.parent),
              factory2.createIdentifier("default")
            ),
            /*location*/
            node
          );
        } else if (isImportSpecifier(importDeclaration)) {
          return setTextRange(
            factory2.createPropertyAccessExpression(
              factory2.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) == null ? void 0 : _a.parent) == null ? void 0 : _b.parent) || importDeclaration),
              factory2.cloneNode(importDeclaration.propertyName || importDeclaration.name)
            ),
            /*location*/
            node
          );
        }
      }
    }
    return node;
  }
  function substituteBinaryExpression(node) {
    if (isAssignmentOperator(node.operatorToken.kind) && isIdentifier(node.left) && !isGeneratedIdentifier(node.left) && !isLocalName(node.left)) {
      const exportedNames = getExports(node.left);
      if (exportedNames) {
        let expression = node;
        for (const exportName of exportedNames) {
          expression = createExportExpression(exportName, preventSubstitution(expression));
        }
        return expression;
      }
    }
    return node;
  }
  function substituteMetaProperty(node) {
    if (isImportMeta(node)) {
      return factory2.createPropertyAccessExpression(contextObject, factory2.createIdentifier("meta"));
    }
    return node;
  }
  function getExports(name) {
    let exportedNames;
    const valueDeclaration = getReferencedDeclaration(name);
    if (valueDeclaration) {
      const exportContainer = resolver.getReferencedExportContainer(
        name,
        /*prefixLocals*/
        false
      );
      if (exportContainer && exportContainer.kind === 311 /* SourceFile */) {
        exportedNames = append(exportedNames, factory2.getDeclarationName(valueDeclaration));
      }
      exportedNames = addRange(exportedNames, moduleInfo == null ? void 0 : moduleInfo.exportedBindings[getOriginalNodeId(valueDeclaration)]);
    }
    return exportedNames;
  }
  function getReferencedDeclaration(name) {
    if (!isGeneratedIdentifier(name)) {
      const importDeclaration = resolver.getReferencedImportDeclaration(name);
      if (importDeclaration)
        return importDeclaration;
      const valueDeclaration = resolver.getReferencedValueDeclaration(name);
      if (valueDeclaration && (moduleInfo == null ? void 0 : moduleInfo.exportedBindings[getOriginalNodeId(valueDeclaration)]))
        return valueDeclaration;
      const declarations = resolver.getReferencedValueDeclarations(name);
      if (declarations) {
        for (const declaration of declarations) {
          if (declaration !== valueDeclaration && (moduleInfo == null ? void 0 : moduleInfo.exportedBindings[getOriginalNodeId(declaration)]))
            return declaration;
        }
      }
      return valueDeclaration;
    }
  }
  function preventSubstitution(node) {
    if (noSubstitution === void 0)
      noSubstitution = [];
    noSubstitution[getNodeId(node)] = true;
    return node;
  }
  function isSubstitutionPrevented(node) {
    return noSubstitution && node.id && noSubstitution[node.id];
  }
}

// src/compiler/transformers/module/esnextAnd2015.ts
function transformECMAScriptModule(context) {
  const {
    factory: factory2,
    getEmitHelperFactory: emitHelpers
  } = context;
  const host = context.getEmitHost();
  const resolver = context.getEmitResolver();
  const compilerOptions = context.getCompilerOptions();
  const languageVersion = getEmitScriptTarget(compilerOptions);
  const previousOnEmitNode = context.onEmitNode;
  const previousOnSubstituteNode = context.onSubstituteNode;
  context.onEmitNode = onEmitNode;
  context.onSubstituteNode = onSubstituteNode;
  context.enableEmitNotification(311 /* SourceFile */);
  context.enableSubstitution(80 /* Identifier */);
  let helperNameSubstitutions;
  let currentSourceFile;
  let importRequireStatements;
  return chainBundle(context, transformSourceFile);
  function transformSourceFile(node) {
    if (node.isDeclarationFile) {
      return node;
    }
    if (isExternalModule(node) || getIsolatedModules(compilerOptions)) {
      currentSourceFile = node;
      importRequireStatements = void 0;
      let result = updateExternalModule(node);
      currentSourceFile = void 0;
      if (importRequireStatements) {
        result = factory2.updateSourceFile(
          result,
          setTextRange(factory2.createNodeArray(insertStatementsAfterCustomPrologue(result.statements.slice(), importRequireStatements)), result.statements)
        );
      }
      if (!isExternalModule(node) || some(result.statements, isExternalModuleIndicator)) {
        return result;
      }
      return factory2.updateSourceFile(
        result,
        setTextRange(factory2.createNodeArray([...result.statements, createEmptyExports(factory2)]), result.statements)
      );
    }
    return node;
  }
  function updateExternalModule(node) {
    const externalHelpersImportDeclaration = createExternalHelpersImportDeclarationIfNeeded(factory2, emitHelpers(), node, compilerOptions);
    if (externalHelpersImportDeclaration) {
      const statements = [];
      const statementOffset = factory2.copyPrologue(node.statements, statements);
      append(statements, externalHelpersImportDeclaration);
      addRange(statements, visitNodes2(node.statements, visitor, isStatement, statementOffset));
      return factory2.updateSourceFile(
        node,
        setTextRange(factory2.createNodeArray(statements), node.statements)
      );
    } else {
      return visitEachChild(node, visitor, context);
    }
  }
  function visitor(node) {
    switch (node.kind) {
      case 270 /* ImportEqualsDeclaration */:
        return getEmitModuleKind(compilerOptions) >= 100 /* Node16 */ ? visitImportEqualsDeclaration(node) : void 0;
      case 276 /* ExportAssignment */:
        return visitExportAssignment(node);
      case 277 /* ExportDeclaration */:
        const exportDecl = node;
        return visitExportDeclaration(exportDecl);
    }
    return node;
  }
  function createRequireCall(importNode) {
    const moduleName = getExternalModuleNameLiteral(factory2, importNode, Debug.checkDefined(currentSourceFile), host, resolver, compilerOptions);
    const args = [];
    if (moduleName) {
      args.push(moduleName);
    }
    if (!importRequireStatements) {
      const createRequireName = factory2.createUniqueName("_createRequire", 16 /* Optimistic */ | 32 /* FileLevel */);
      const importStatement = factory2.createImportDeclaration(
        /*modifiers*/
        void 0,
        factory2.createImportClause(
          /*isTypeOnly*/
          false,
          /*name*/
          void 0,
          factory2.createNamedImports([
            factory2.createImportSpecifier(
              /*isTypeOnly*/
              false,
              factory2.createIdentifier("createRequire"),
              createRequireName
            )
          ])
        ),
        factory2.createStringLiteral("module")
      );
      const requireHelperName = factory2.createUniqueName("__require", 16 /* Optimistic */ | 32 /* FileLevel */);
      const requireStatement = factory2.createVariableStatement(
        /*modifiers*/
        void 0,
        factory2.createVariableDeclarationList(
          [
            factory2.createVariableDeclaration(
              requireHelperName,
              /*exclamationToken*/
              void 0,
              /*type*/
              void 0,
              factory2.createCallExpression(
                factory2.cloneNode(createRequireName),
                /*typeArguments*/
                void 0,
                [
                  factory2.createPropertyAccessExpression(factory2.createMetaProperty(102 /* ImportKeyword */, factory2.createIdentifier("meta")), factory2.createIdentifier("url"))
                ]
              )
            )
          ],
          /*flags*/
          languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */
        )
      );
      importRequireStatements = [importStatement, requireStatement];
    }
    const name = importRequireStatements[1].declarationList.declarations[0].name;
    Debug.assertNode(name, isIdentifier);
    return factory2.createCallExpression(
      factory2.cloneNode(name),
      /*typeArguments*/
      void 0,
      args
    );
  }
  function visitImportEqualsDeclaration(node) {
    Debug.assert(isExternalModuleImportEqualsDeclaration(node), "import= for internal module references should be handled in an earlier transformer.");
    let statements;
    statements = append(
      statements,
      setOriginalNode(
        setTextRange(
          factory2.createVariableStatement(
            /*modifiers*/
            void 0,
            factory2.createVariableDeclarationList(
              [
                factory2.createVariableDeclaration(
                  factory2.cloneNode(node.name),
                  /*exclamationToken*/
                  void 0,
                  /*type*/
                  void 0,
                  createRequireCall(node)
                )
              ],
              /*flags*/
              languageVersion >= 2 /* ES2015 */ ? 2 /* Const */ : 0 /* None */
            )
          ),
          node
        ),
        node
      )
    );
    statements = appendExportsOfImportEqualsDeclaration(statements, node);
    return singleOrMany(statements);
  }
  function appendExportsOfImportEqualsDeclaration(statements, node) {
    if (hasSyntacticModifier(node, 1 /* Export */)) {
      statements = append(statements, factory2.createExportDeclaration(
        /*modifiers*/
        void 0,
        node.isTypeOnly,
        factory2.createNamedExports([factory2.createExportSpecifier(
          /*isTypeOnly*/
          false,
          /*propertyName*/
          void 0,
          idText(node.name)
        )])
      ));
    }
    return statements;
  }
  function visitExportAssignment(node) {
    return node.isExportEquals ? void 0 : node;
  }
  function visitExportDeclaration(node) {
    if (compilerOptions.module !== void 0 && compilerOptions.module > 5 /* ES2015 */) {
      return node;
    }
    if (!node.exportClause || !isNamespaceExport(node.exportClause) || !node.moduleSpecifier) {
      return node;
    }
    const oldIdentifier = node.exportClause.name;
    const synthName = factory2.getGeneratedNameForNode(oldIdentifier);
    const importDecl = factory2.createImportDeclaration(
      /*modifiers*/
      void 0,
      factory2.createImportClause(
        /*isTypeOnly*/
        false,
        /*name*/
        void 0,
        factory2.createNamespaceImport(
          synthName
        )
      ),
      node.moduleSpecifier,
      node.assertClause
    );
    setOriginalNode(importDecl, node.exportClause);
    const exportDecl = isExportNamespaceAsDefaultDeclaration(node) ? factory2.createExportDefault(synthName) : factory2.createExportDeclaration(
      /*modifiers*/
      void 0,
      /*isTypeOnly*/
      false,
      factory2.createNamedExports([factory2.createExportSpecifier(
        /*isTypeOnly*/
        false,
        synthName,
        oldIdentifier
      )])
    );
    setOriginalNode(exportDecl, node);
    return [importDecl, exportDecl];
  }
  function onEmitNode(hint, node, emitCallback) {
    if (isSourceFile(node)) {
      if ((isExternalModule(node) || getIsolatedModules(compilerOptions)) && compilerOptions.importHelpers) {
        helperNameSubstitutions = /* @__PURE__ */ new Map();
      }
      previousOnEmitNode(hint, node, emitCallback);
      helperNameSubstitutions = void 0;
    } else {
      previousOnEmitNode(hint, node, emitCallback);
    }
  }
  function onSubstituteNode(hint, node) {
    node = previousOnSubstituteNode(hint, node);
    if (helperNameSubstitutions && isIdentifier(node) && getEmitFlags(node) & 8192 /* HelperName */) {
      return substituteHelperName(node);
    }
    return node;
  }
  function substituteHelperName(node) {
    const name = idText(node);
    let substitution = helperNameSubstitutions.get(name);
    if (!substitution) {
      helperNameSubstitutions.set(name, substitution = factory2.createUniqueName(name, 16 /* Optimistic */ | 32 /* FileLevel */));
    }
    return substitution;
  }
}

// src/compiler/transformers/module/node.ts
function transformNodeModule(context) {
  const previousOnSubstituteNode = context.onSubstituteNode;
  const previousOnEmitNode = context.onEmitNode;
  const esmTransform = transformECMAScriptModule(context);
  const esmOnSubstituteNode = context.onSubstituteNode;
  const esmOnEmitNode = context.onEmitNode;
  context.onSubstituteNode = previousOnSubstituteNode;
  context.onEmitNode = previousOnEmitNode;
  const cjsTransform = transformModule(context);
  const cjsOnSubstituteNode = context.onSubstituteNode;
  const cjsOnEmitNode = context.onEmitNode;
  context.onSubstituteNode = onSubstituteNode;
  context.onEmitNode = onEmitNode;
  context.enableSubstitution(311 /* SourceFile */);
  context.enableEmitNotification(311 /* SourceFile */);
  let currentSourceFile;
  return transformSourceFileOrBundle;
  function onSubstituteNode(hint, node) {
    if (isSourceFile(node)) {
      currentSourceFile = node;
      return previousOnSubstituteNode(hint, node);
    } else {
      if (!currentSourceFile) {
        return previousOnSubstituteNode(hint, node);
      }
      if (currentSourceFile.impliedNodeFormat === 99 /* ESNext */) {
        return esmOnSubstituteNode(hint, node);
      }
      return cjsOnSubstituteNode(hint, node);
    }
  }
  function onEmitNode(hint, node, emitCallback) {
    if (isSourceFile(node)) {
      currentSourceFile = node;
    }
    if (!currentSourceFile) {
      return previousOnEmitNode(hint, node, emitCallback);
    }
    if (currentSourceFile.impliedNodeFormat === 99 /* ESNext */) {
      return esmOnEmitNode(hint, node, emitCallback);
    }
    return cjsOnEmitNode(hint, node, emitCallback);
  }
  function getModuleTransformForFile(file) {
    return file.impliedNodeFormat === 99 /* ESNext */ ? esmTransform : cjsTransform;
  }
  function transformSourceFile(node) {
    if (node.isDeclarationFile) {
      return node;
    }
    currentSourceFile = node;
    const result = getModuleTransformForFile(node)(node);
    currentSourceFile = void 0;
    Debug.assert(isSourceFile(result));
    return result;
  }
  function transformSourceFileOrBundle(node) {
    return node.kind === 311 /* SourceFile */ ? transformSourceFile(node) : transformBundle(node);
  }
  function transformBundle(node) {
    return context.factory.createBundle(map(node.sourceFiles, transformSourceFile), node.prepends);
  }
}

// src/compiler/transformers/declarations/diagnostics.ts
function canProduceDiagnostics(node) {
  return isVariableDeclaration(node) || isPropertyDeclaration(node) || isPropertySignature(node) || isBindingElement(node) || isSetAccessor(node) || isGetAccessor(node) || isConstructSignatureDeclaration(node) || isCallSignatureDeclaration(node) || isMethodDeclaration(node) || isMethodSignature(node) || isFunctionDeclaration(node) || isParameter(node) || isTypeParameterDeclaration(node) || isExpressionWithTypeArguments(node) || isImportEqualsDeclaration(node) || isTypeAliasDeclaration(node) || isConstructorDeclaration(node) || isIndexSignatureDeclaration(node) || isPropertyAccessExpression(node) || isElementAccessExpression(node) || isBinaryExpression(node) || isJSDocTypeAlias(node);
}
function createGetSymbolAccessibilityDiagnosticForNodeName(node) {
  if (isSetAccessor(node) || isGetAccessor(node)) {
    return getAccessorNameVisibilityError;
  } else if (isMethodSignature(node) || isMethodDeclaration(node)) {
    return getMethodNameVisibilityError;
  } else {
    return createGetSymbolAccessibilityDiagnosticForNode(node);
  }
  function getAccessorNameVisibilityError(symbolAccessibilityResult) {
    const diagnosticMessage = getAccessorNameVisibilityDiagnosticMessage(symbolAccessibilityResult);
    return diagnosticMessage !== void 0 ? {
      diagnosticMessage,
      errorNode: node,
      typeName: node.name
    } : void 0;
  }
  function getAccessorNameVisibilityDiagnosticMessage(symbolAccessibilityResult) {
    if (isStatic(node)) {
      return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1;
    } else if (node.parent.kind === 262 /* ClassDeclaration */) {
      return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1;
    } else {
      return symbolAccessibilityResult.errorModuleName ? Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1;
    }
  }
  function getMethodNameVisibilityError(symbolAccessibilityResult) {
    const diagnosticMessage = getMethodNameVisibilityDiagnosticMessage(symbolAccessibilityResult);
    return diagnosticMessage !== void 0 ? {
      diagnosticMessage,
      errorNode: node,
      typeName: node.name
    } : void 0;
  }
  function getMethodNameVisibilityDiagnosticMessage(symbolAccessibilityResult) {
    if (isStatic(node)) {
      return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_private_name_1;
    } else if (node.parent.kind === 262 /* ClassDeclaration */) {
      return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_method_0_of_exported_class_has_or_is_using_private_name_1;
    } else {
      return symbolAccessibilityResult.errorModuleName ? Diagnostics.Method_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Method_0_of_exported_interface_has_or_is_using_private_name_1;
    }
  }
}
function createGetSymbolAccessibilityDiagnosticForNode(node) {
  if (isVariableDeclaration(node) || isPropertyDeclaration(node) || isPropertySignature(node) || isPropertyAccessExpression(node) || isElementAccessExpression(node) || isBinaryExpression(node) || isBindingElement(node) || isConstructorDeclaration(node)) {
    return getVariableDeclarationTypeVisibilityError;
  } else if (isSetAccessor(node) || isGetAccessor(node)) {
    return getAccessorDeclarationTypeVisibilityError;
  } else if (isConstructSignatureDeclaration(node) || isCallSignatureDeclaration(node) || isMethodDeclaration(node) || isMethodSignature(node) || isFunctionDeclaration(node) || isIndexSignatureDeclaration(node)) {
    return getReturnTypeVisibilityError;
  } else if (isParameter(node)) {
    if (isParameterPropertyDeclaration(node, node.parent) && hasSyntacticModifier(node.parent, 8 /* Private */)) {
      return getVariableDeclarationTypeVisibilityError;
    }
    return getParameterDeclarationTypeVisibilityError;
  } else if (isTypeParameterDeclaration(node)) {
    return getTypeParameterConstraintVisibilityError;
  } else if (isExpressionWithTypeArguments(node)) {
    return getHeritageClauseVisibilityError;
  } else if (isImportEqualsDeclaration(node)) {
    return getImportEntityNameVisibilityError;
  } else if (isTypeAliasDeclaration(node) || isJSDocTypeAlias(node)) {
    return getTypeAliasDeclarationVisibilityError;
  } else {
    return Debug.assertNever(node, `Attempted to set a declaration diagnostic context for unhandled node kind: ${Debug.formatSyntaxKind(node.kind)}`);
  }
  function getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult) {
    if (node.kind === 259 /* VariableDeclaration */ || node.kind === 207 /* BindingElement */) {
      return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Exported_variable_0_has_or_is_using_private_name_1;
    } else if (node.kind === 171 /* PropertyDeclaration */ || node.kind === 210 /* PropertyAccessExpression */ || node.kind === 211 /* ElementAccessExpression */ || node.kind === 225 /* BinaryExpression */ || node.kind === 170 /* PropertySignature */ || node.kind === 168 /* Parameter */ && hasSyntacticModifier(node.parent, 8 /* Private */)) {
      if (isStatic(node)) {
        return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1;
      } else if (node.parent.kind === 262 /* ClassDeclaration */ || node.kind === 168 /* Parameter */) {
        return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1;
      } else {
        return symbolAccessibilityResult.errorModuleName ? Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1;
      }
    }
  }
  function getVariableDeclarationTypeVisibilityError(symbolAccessibilityResult) {
    const diagnosticMessage = getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult);
    return diagnosticMessage !== void 0 ? {
      diagnosticMessage,
      errorNode: node,
      typeName: node.name
    } : void 0;
  }
  function getAccessorDeclarationTypeVisibilityError(symbolAccessibilityResult) {
    let diagnosticMessage;
    if (node.kind === 177 /* SetAccessor */) {
      if (isStatic(node)) {
        diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_private_name_1;
      } else {
        diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_private_name_1;
      }
    } else {
      if (isStatic(node)) {
        diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_private_name_1;
      } else {
        diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_private_name_1;
      }
    }
    return {
      diagnosticMessage,
      errorNode: node.name,
      typeName: node.name
    };
  }
  function getReturnTypeVisibilityError(symbolAccessibilityResult) {
    let diagnosticMessage;
    switch (node.kind) {
      case 179 /* ConstructSignature */:
        diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0;
        break;
      case 178 /* CallSignature */:
        diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0;
        break;
      case 180 /* IndexSignature */:
        diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0;
        break;
      case 173 /* MethodDeclaration */:
      case 172 /* MethodSignature */:
        if (isStatic(node)) {
          diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0;
        } else if (node.parent.kind === 262 /* ClassDeclaration */) {
          diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0;
        } else {
          diagnosticMessage = symbolAccessibilityResult.errorModuleName ? Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0;
        }
        break;
      case 261 /* FunctionDeclaration */:
        diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1 : Diagnostics.Return_type_of_exported_function_has_or_is_using_private_name_0;
        break;
      default:
        return Debug.fail("This is unknown kind for signature: " + node.kind);
    }
    return {
      diagnosticMessage,
      errorNode: node.name || node
    };
  }
  function getParameterDeclarationTypeVisibilityError(symbolAccessibilityResult) {
    const diagnosticMessage = getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult);
    return diagnosticMessage !== void 0 ? {
      diagnosticMessage,
      errorNode: node,
      typeName: node.name
    } : void 0;
  }
  function getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult) {
    switch (node.parent.kind) {
      case 175 /* Constructor */:
        return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1;
      case 179 /* ConstructSignature */:
      case 184 /* ConstructorType */:
        return symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
      case 178 /* CallSignature */:
        return symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
      case 180 /* IndexSignature */:
        return symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_private_name_1;
      case 173 /* MethodDeclaration */:
      case 172 /* MethodSignature */:
        if (isStatic(node.parent)) {
          return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
        } else if (node.parent.parent.kind === 262 /* ClassDeclaration */) {
          return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
        } else {
          return symbolAccessibilityResult.errorModuleName ? Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
        }
      case 261 /* FunctionDeclaration */:
      case 183 /* FunctionType */:
        return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_exported_function_has_or_is_using_private_name_1;
      case 177 /* SetAccessor */:
      case 176 /* GetAccessor */:
        return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 /* CannotBeNamed */ ? Diagnostics.Parameter_0_of_accessor_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : Diagnostics.Parameter_0_of_accessor_has_or_is_using_name_1_from_private_module_2 : Diagnostics.Parameter_0_of_accessor_has_or_is_using_private_name_1;
      default:
        return Debug.fail(`Unknown parent for parameter: ${Debug.formatSyntaxKind(node.parent.kind)}`);
    }
  }
  function getTypeParameterConstraintVisibilityError() {
    let diagnosticMessage;
    switch (node.parent.kind) {
      case 262 /* ClassDeclaration */:
        diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_class_has_or_is_using_private_name_1;
        break;
      case 263 /* InterfaceDeclaration */:
        diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1;
        break;
      case 199 /* MappedType */:
        diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_mapped_object_type_is_using_private_name_1;
        break;
      case 184 /* ConstructorType */:
      case 179 /* ConstructSignature */:
        diagnosticMessage = Diagnostics.Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
        break;
      case 178 /* CallSignature */:
        diagnosticMessage = Diagnostics.Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
        break;
      case 173 /* MethodDeclaration */:
      case 172 /* MethodSignature */:
        if (isStatic(node.parent)) {
          diagnosticMessage = Diagnostics.Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
        } else if (node.parent.parent.kind === 262 /* ClassDeclaration */) {
          diagnosticMessage = Diagnostics.Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
        } else {
          diagnosticMessage = Diagnostics.Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
        }
        break;
      case 183 /* FunctionType */:
      case 261 /* FunctionDeclaration */:
        diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_function_has_or_is_using_private_name_1;
        break;
      case 194 /* InferType */:
        diagnosticMessage = Diagnostics.Extends_clause_for_inferred_type_0_has_or_is_using_private_name_1;
        break;
      case 264 /* TypeAliasDeclaration */:
        diagnosticMessage = Diagnostics.Type_parameter_0_of_exported_type_alias_has_or_is_using_private_name_1;
        break;
      default:
        return Debug.fail("This is unknown parent for type parameter: " + node.parent.kind);
    }
    return {
      diagnosticMessage,
      errorNode: node,
      typeName: node.name
    };
  }
  function getHeritageClauseVisibilityError() {
    let diagnosticMessage;
    if (isClassDeclaration(node.parent.parent)) {
      diagnosticMessage = isHeritageClause(node.parent) && node.parent.token === 119 /* ImplementsKeyword */ ? Diagnostics.Implements_clause_of_exported_class_0_has_or_is_using_private_name_1 : node.parent.parent.name ? Diagnostics.extends_clause_of_exported_class_0_has_or_is_using_private_name_1 : Diagnostics.extends_clause_of_exported_class_has_or_is_using_private_name_0;
    } else {
      diagnosticMessage = Diagnostics.extends_clause_of_exported_interface_0_has_or_is_using_private_name_1;
    }
    return {
      diagnosticMessage,
      errorNode: node,
      typeName: getNameOfDeclaration(node.parent.parent)
    };
  }
  function getImportEntityNameVisibilityError() {
    return {
      diagnosticMessage: Diagnostics.Import_declaration_0_is_using_private_name_1,
      errorNode: node,
      typeName: node.name
    };
  }
  function getTypeAliasDeclarationVisibilityError(symbolAccessibilityResult) {
    return {
      diagnosticMessage: symbolAccessibilityResult.errorModuleName ? Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1_from_module_2 : Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1,
      errorNode: isJSDocTypeAlias(node) ? Debug.checkDefined(node.typeExpression) : node.type,
      typeName: isJSDocTypeAlias(node) ? getNameOfDeclaration(node) : node.name
    };
  }
}

// src/compiler/transformers/declarations.ts
function getDeclarationDiagnostics(host, resolver, file) {
  const compilerOptions = host.getCompilerOptions();
  const result = transformNodes(
    resolver,
    host,
    factory,
    compilerOptions,
    file ? [file] : filter(host.getSourceFiles(), isSourceFileNotJson),
    [transformDeclarations],
    /*allowDtsFiles*/
    false
  );
  return result.diagnostics;
}
function hasInternalAnnotation(range, currentSourceFile) {
  const comment = currentSourceFile.text.substring(range.pos, range.end);
  return stringContains(comment, "@internal");
}
function isInternalDeclaration(node, currentSourceFile) {
  const parseTreeNode = getParseTreeNode(node);
  if (parseTreeNode && parseTreeNode.kind === 168 /* Parameter */) {
    const paramIdx = parseTreeNode.parent.parameters.indexOf(parseTreeNode);
    const previousSibling = paramIdx > 0 ? parseTreeNode.parent.parameters[paramIdx - 1] : void 0;
    const text = currentSourceFile.text;
    const commentRanges = previousSibling ? concatenate(
      // to handle
      // ... parameters, /** @internal */
      // public param: string
      getTrailingCommentRanges(text, skipTrivia(
        text,
        previousSibling.end + 1,
        /*stopAfterLineBreak*/
        false,
        /*stopAtComments*/
        true
      )),
      getLeadingCommentRanges(text, node.pos)
    ) : getTrailingCommentRanges(text, skipTrivia(
      text,
      node.pos,
      /*stopAfterLineBreak*/
      false,
      /*stopAtComments*/
      true
    ));
    return commentRanges && commentRanges.length && hasInternalAnnotation(last(commentRanges), currentSourceFile);
  }
  const leadingCommentRanges = parseTreeNode && getLeadingCommentRangesOfNode(parseTreeNode, currentSourceFile);
  return !!forEach(leadingCommentRanges, (range) => {
    return hasInternalAnnotation(range, currentSourceFile);
  });
}
var declarationEmitNodeBuilderFlags = 1024 /* MultilineObjectLiterals */ | 2048 /* WriteClassExpressionAsTypeLiteral */ | 4096 /* UseTypeOfFunction */ | 8 /* UseStructuralFallback */ | 524288 /* AllowEmptyTuple */ | 4 /* GenerateNamesForShadowedTypeParams */ | 1 /* NoTruncation */;
function transformDeclarations(context) {
  const throwDiagnostic = () => Debug.fail("Diagnostic emitted without context");
  let getSymbolAccessibilityDiagnostic = throwDiagnostic;
  let needsDeclare = true;
  let isBundledEmit = false;
  let resultHasExternalModuleIndicator = false;
  let needsScopeFixMarker = false;
  let resultHasScopeMarker = false;
  let enclosingDeclaration;
  let necessaryTypeReferences;
  let lateMarkedStatements;
  let lateStatementReplacementMap;
  let suppressNewDiagnosticContexts;
  let exportedModulesFromDeclarationEmit;
  const { factory: factory2 } = context;
  const host = context.getEmitHost();
  const symbolTracker = {
    trackSymbol,
    reportInaccessibleThisError,
    reportInaccessibleUniqueSymbolError,
    reportCyclicStructureError,
    reportPrivateInBaseOfClassExpression,
    reportLikelyUnsafeImportRequiredError,
    reportTruncationError,
    moduleResolverHost: host,
    trackReferencedAmbientModule,
    trackExternalModuleSymbolOfImportTypeNode,
    reportNonlocalAugmentation,
    reportNonSerializableProperty,
    reportImportTypeNodeResolutionModeOverride
  };
  let errorNameNode;
  let errorFallbackNode;
  let currentSourceFile;
  let refs;
  let libs2;
  let emittedImports;
  const resolver = context.getEmitResolver();
  const options = context.getCompilerOptions();
  const { noResolve, stripInternal } = options;
  return transformRoot;
  function recordTypeReferenceDirectivesIfNecessary(typeReferenceDirectives) {
    if (!typeReferenceDirectives) {
      return;
    }
    necessaryTypeReferences = necessaryTypeReferences || /* @__PURE__ */ new Set();
    for (const ref of typeReferenceDirectives) {
      necessaryTypeReferences.add(ref);
    }
  }
  function trackReferencedAmbientModule(node, symbol) {
    const directives = resolver.getTypeReferenceDirectivesForSymbol(symbol, 67108863 /* All */);
    if (length(directives)) {
      return recordTypeReferenceDirectivesIfNecessary(directives);
    }
    const container = getSourceFileOfNode(node);
    refs.set(getOriginalNodeId(container), container);
  }
  function handleSymbolAccessibilityError(symbolAccessibilityResult) {
    if (symbolAccessibilityResult.accessibility === 0 /* Accessible */) {
      if (symbolAccessibilityResult && symbolAccessibilityResult.aliasesToMakeVisible) {
        if (!lateMarkedStatements) {
          lateMarkedStatements = symbolAccessibilityResult.aliasesToMakeVisible;
        } else {
          for (const ref of symbolAccessibilityResult.aliasesToMakeVisible) {
            pushIfUnique(lateMarkedStatements, ref);
          }
        }
      }
    } else {
      const errorInfo = getSymbolAccessibilityDiagnostic(symbolAccessibilityResult);
      if (errorInfo) {
        if (errorInfo.typeName) {
          context.addDiagnostic(createDiagnosticForNode(
            symbolAccessibilityResult.errorNode || errorInfo.errorNode,
            errorInfo.diagnosticMessage,
            getTextOfNode(errorInfo.typeName),
            symbolAccessibilityResult.errorSymbolName,
            symbolAccessibilityResult.errorModuleName
          ));
        } else {
          context.addDiagnostic(createDiagnosticForNode(
            symbolAccessibilityResult.errorNode || errorInfo.errorNode,
            errorInfo.diagnosticMessage,
            symbolAccessibilityResult.errorSymbolName,
            symbolAccessibilityResult.errorModuleName
          ));
        }
        return true;
      }
    }
    return false;
  }
  function trackExternalModuleSymbolOfImportTypeNode(symbol) {
    if (!isBundledEmit) {
      (exportedModulesFromDeclarationEmit || (exportedModulesFromDeclarationEmit = [])).push(symbol);
    }
  }
  function trackSymbol(symbol, enclosingDeclaration2, meaning) {
    if (symbol.flags & 262144 /* TypeParameter */)
      return false;
    const issuedDiagnostic = handleSymbolAccessibilityError(resolver.isSymbolAccessible(
      symbol,
      enclosingDeclaration2,
      meaning,
      /*shouldComputeAliasToMarkVisible*/
      true
    ));
    recordTypeReferenceDirectivesIfNecessary(resolver.getTypeReferenceDirectivesForSymbol(symbol, meaning));
    return issuedDiagnostic;
  }
  function reportPrivateInBaseOfClassExpression(propertyName) {
    if (errorNameNode || errorFallbackNode) {
      context.addDiagnostic(
        createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.Property_0_of_exported_class_expression_may_not_be_private_or_protected, propertyName)
      );
    }
  }
  function errorDeclarationNameWithFallback() {
    return errorNameNode ? declarationNameToString(errorNameNode) : errorFallbackNode && getNameOfDeclaration(errorFallbackNode) ? declarationNameToString(getNameOfDeclaration(errorFallbackNode)) : errorFallbackNode && isExportAssignment(errorFallbackNode) ? errorFallbackNode.isExportEquals ? "export=" : "default" : "(Missing)";
  }
  function reportInaccessibleUniqueSymbolError() {
    if (errorNameNode || errorFallbackNode) {
      context.addDiagnostic(createDiagnosticForNode(
        errorNameNode || errorFallbackNode,
        Diagnostics.The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary,
        errorDeclarationNameWithFallback(),
        "unique symbol"
      ));
    }
  }
  function reportCyclicStructureError() {
    if (errorNameNode || errorFallbackNode) {
      context.addDiagnostic(createDiagnosticForNode(
        errorNameNode || errorFallbackNode,
        Diagnostics.The_inferred_type_of_0_references_a_type_with_a_cyclic_structure_which_cannot_be_trivially_serialized_A_type_annotation_is_necessary,
        errorDeclarationNameWithFallback()
      ));
    }
  }
  function reportInaccessibleThisError() {
    if (errorNameNode || errorFallbackNode) {
      context.addDiagnostic(createDiagnosticForNode(
        errorNameNode || errorFallbackNode,
        Diagnostics.The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary,
        errorDeclarationNameWithFallback(),
        "this"
      ));
    }
  }
  function reportLikelyUnsafeImportRequiredError(specifier) {
    if (errorNameNode || errorFallbackNode) {
      context.addDiagnostic(createDiagnosticForNode(
        errorNameNode || errorFallbackNode,
        Diagnostics.The_inferred_type_of_0_cannot_be_named_without_a_reference_to_1_This_is_likely_not_portable_A_type_annotation_is_necessary,
        errorDeclarationNameWithFallback(),
        specifier
      ));
    }
  }
  function reportTruncationError() {
    if (errorNameNode || errorFallbackNode) {
      context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_inferred_type_of_this_node_exceeds_the_maximum_length_the_compiler_will_serialize_An_explicit_type_annotation_is_needed));
    }
  }
  function reportNonlocalAugmentation(containingFile, parentSymbol, symbol) {
    var _a;
    const primaryDeclaration = (_a = parentSymbol.declarations) == null ? void 0 : _a.find((d) => getSourceFileOfNode(d) === containingFile);
    const augmentingDeclarations = filter(symbol.declarations, (d) => getSourceFileOfNode(d) !== containingFile);
    if (primaryDeclaration && augmentingDeclarations) {
      for (const augmentations of augmentingDeclarations) {
        context.addDiagnostic(addRelatedInfo(
          createDiagnosticForNode(augmentations, Diagnostics.Declaration_augments_declaration_in_another_file_This_cannot_be_serialized),
          createDiagnosticForNode(primaryDeclaration, Diagnostics.This_is_the_declaration_being_augmented_Consider_moving_the_augmenting_declaration_into_the_same_file)
        ));
      }
    }
  }
  function reportNonSerializableProperty(propertyName) {
    if (errorNameNode || errorFallbackNode) {
      context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_type_of_this_node_cannot_be_serialized_because_its_property_0_cannot_be_serialized, propertyName));
    }
  }
  function reportImportTypeNodeResolutionModeOverride() {
    if (!isNightly() && (errorNameNode || errorFallbackNode)) {
      context.addDiagnostic(createDiagnosticForNode(errorNameNode || errorFallbackNode, Diagnostics.The_type_of_this_expression_cannot_be_named_without_a_resolution_mode_assertion_which_is_an_unstable_feature_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next));
    }
  }
  function transformDeclarationsForJS(sourceFile, bundled) {
    const oldDiag = getSymbolAccessibilityDiagnostic;
    getSymbolAccessibilityDiagnostic = (s) => s.errorNode && canProduceDiagnostics(s.errorNode) ? createGetSymbolAccessibilityDiagnosticForNode(s.errorNode)(s) : {
      diagnosticMessage: s.errorModuleName ? Diagnostics.Declaration_emit_for_this_file_requires_using_private_name_0_from_module_1_An_explicit_type_annotation_may_unblock_declaration_emit : Diagnostics.Declaration_emit_for_this_file_requires_using_private_name_0_An_explicit_type_annotation_may_unblock_declaration_emit,
      errorNode: s.errorNode || sourceFile
    };
    const result = resolver.getDeclarationStatementsForSourceFile(sourceFile, declarationEmitNodeBuilderFlags, symbolTracker, bundled);
    getSymbolAccessibilityDiagnostic = oldDiag;
    return result;
  }
  function transformRoot(node) {
    if (node.kind === 311 /* SourceFile */ && node.isDeclarationFile) {
      return node;
    }
    if (node.kind === 312 /* Bundle */) {
      isBundledEmit = true;
      refs = /* @__PURE__ */ new Map();
      libs2 = /* @__PURE__ */ new Map();
      let hasNoDefaultLib = false;
      const bundle = factory2.createBundle(map(
        node.sourceFiles,
        (sourceFile) => {
          if (sourceFile.isDeclarationFile)
            return void 0;
          hasNoDefaultLib = hasNoDefaultLib || sourceFile.hasNoDefaultLib;
          currentSourceFile = sourceFile;
          enclosingDeclaration = sourceFile;
          lateMarkedStatements = void 0;
          suppressNewDiagnosticContexts = false;
          lateStatementReplacementMap = /* @__PURE__ */ new Map();
          getSymbolAccessibilityDiagnostic = throwDiagnostic;
          needsScopeFixMarker = false;
          resultHasScopeMarker = false;
          collectReferences(sourceFile, refs);
          collectLibs(sourceFile, libs2);
          if (isExternalOrCommonJsModule(sourceFile) || isJsonSourceFile(sourceFile)) {
            resultHasExternalModuleIndicator = false;
            needsDeclare = false;
            const statements = isSourceFileJS(sourceFile) ? factory2.createNodeArray(transformDeclarationsForJS(
              sourceFile,
              /*bundled*/
              true
            )) : visitNodes2(sourceFile.statements, visitDeclarationStatements, isStatement);
            const newFile = factory2.updateSourceFile(
              sourceFile,
              [factory2.createModuleDeclaration(
                [factory2.createModifier(138 /* DeclareKeyword */)],
                factory2.createStringLiteral(getResolvedExternalModuleName(context.getEmitHost(), sourceFile)),
                factory2.createModuleBlock(setTextRange(factory2.createNodeArray(transformAndReplaceLatePaintedStatements(statements)), sourceFile.statements))
              )],
              /*isDeclarationFile*/
              true,
              /*referencedFiles*/
              [],
              /*typeReferences*/
              [],
              /*hasNoDefaultLib*/
              false,
              /*libReferences*/
              []
            );
            return newFile;
          }
          needsDeclare = true;
          const updated2 = isSourceFileJS(sourceFile) ? factory2.createNodeArray(transformDeclarationsForJS(sourceFile)) : visitNodes2(sourceFile.statements, visitDeclarationStatements, isStatement);
          return factory2.updateSourceFile(
            sourceFile,
            transformAndReplaceLatePaintedStatements(updated2),
            /*isDeclarationFile*/
            true,
            /*referencedFiles*/
            [],
            /*typeReferences*/
            [],
            /*hasNoDefaultLib*/
            false,
            /*libReferences*/
            []
          );
        }
      ), mapDefined(node.prepends, (prepend) => {
        if (prepend.kind === 314 /* InputFiles */) {
          const sourceFile = createUnparsedSourceFile(prepend, "dts", stripInternal);
          hasNoDefaultLib = hasNoDefaultLib || !!sourceFile.hasNoDefaultLib;
          collectReferences(sourceFile, refs);
          recordTypeReferenceDirectivesIfNecessary(map(sourceFile.typeReferenceDirectives, (ref) => [ref.fileName, ref.resolutionMode]));
          collectLibs(sourceFile, libs2);
          return sourceFile;
        }
        return prepend;
      }));
      bundle.syntheticFileReferences = [];
      bundle.syntheticTypeReferences = getFileReferencesForUsedTypeReferences();
      bundle.syntheticLibReferences = getLibReferences();
      bundle.hasNoDefaultLib = hasNoDefaultLib;
      const outputFilePath2 = getDirectoryPath(normalizeSlashes(getOutputPathsFor(
        node,
        host,
        /*forceDtsPaths*/
        true
      ).declarationFilePath));
      const referenceVisitor2 = mapReferencesIntoArray(bundle.syntheticFileReferences, outputFilePath2);
      refs.forEach(referenceVisitor2);
      return bundle;
    }
    needsDeclare = true;
    needsScopeFixMarker = false;
    resultHasScopeMarker = false;
    enclosingDeclaration = node;
    currentSourceFile = node;
    getSymbolAccessibilityDiagnostic = throwDiagnostic;
    isBundledEmit = false;
    resultHasExternalModuleIndicator = false;
    suppressNewDiagnosticContexts = false;
    lateMarkedStatements = void 0;
    lateStatementReplacementMap = /* @__PURE__ */ new Map();
    necessaryTypeReferences = void 0;
    refs = collectReferences(currentSourceFile, /* @__PURE__ */ new Map());
    libs2 = collectLibs(currentSourceFile, /* @__PURE__ */ new Map());
    const references = [];
    const outputFilePath = getDirectoryPath(normalizeSlashes(getOutputPathsFor(
      node,
      host,
      /*forceDtsPaths*/
      true
    ).declarationFilePath));
    const referenceVisitor = mapReferencesIntoArray(references, outputFilePath);
    let combinedStatements;
    if (isSourceFileJS(currentSourceFile)) {
      combinedStatements = factory2.createNodeArray(transformDeclarationsForJS(node));
      refs.forEach(referenceVisitor);
      emittedImports = filter(combinedStatements, isAnyImportSyntax);
    } else {
      const statements = visitNodes2(node.statements, visitDeclarationStatements, isStatement);
      combinedStatements = setTextRange(factory2.createNodeArray(transformAndReplaceLatePaintedStatements(statements)), node.statements);
      refs.forEach(referenceVisitor);
      emittedImports = filter(combinedStatements, isAnyImportSyntax);
      if (isExternalModule(node) && (!resultHasExternalModuleIndicator || needsScopeFixMarker && !resultHasScopeMarker)) {
        combinedStatements = setTextRange(factory2.createNodeArray([...combinedStatements, createEmptyExports(factory2)]), combinedStatements);
      }
    }
    const updated = factory2.updateSourceFile(
      node,
      combinedStatements,
      /*isDeclarationFile*/
      true,
      references,
      getFileReferencesForUsedTypeReferences(),
      node.hasNoDefaultLib,
      getLibReferences()
    );
    updated.exportedModulesFromDeclarationEmit = exportedModulesFromDeclarationEmit;
    return updated;
    function getLibReferences() {
      return arrayFrom(libs2.keys(), (lib) => ({ fileName: lib, pos: -1, end: -1 }));
    }
    function getFileReferencesForUsedTypeReferences() {
      return necessaryTypeReferences ? mapDefined(arrayFrom(necessaryTypeReferences.keys()), getFileReferenceForSpecifierModeTuple) : [];
    }
    function getFileReferenceForSpecifierModeTuple([typeName, mode]) {
      if (emittedImports) {
        for (const importStatement of emittedImports) {
          if (isImportEqualsDeclaration(importStatement) && isExternalModuleReference(importStatement.moduleReference)) {
            const expr = importStatement.moduleReference.expression;
            if (isStringLiteralLike(expr) && expr.text === typeName) {
              return void 0;
            }
          } else if (isImportDeclaration(importStatement) && isStringLiteral(importStatement.moduleSpecifier) && importStatement.moduleSpecifier.text === typeName) {
            return void 0;
          }
        }
      }
      return { fileName: typeName, pos: -1, end: -1, ...mode ? { resolutionMode: mode } : void 0 };
    }
    function mapReferencesIntoArray(references2, outputFilePath2) {
      return (file) => {
        let declFileName;
        if (file.isDeclarationFile) {
          declFileName = file.fileName;
        } else {
          if (isBundledEmit && contains(node.sourceFiles, file))
            return;
          const paths = getOutputPathsFor(
            file,
            host,
            /*forceDtsPaths*/
            true
          );
          declFileName = paths.declarationFilePath || paths.jsFilePath || file.fileName;
        }
        if (declFileName) {
          const specifier = getModuleSpecifier(
            options,
            currentSourceFile,
            toPath(outputFilePath2, host.getCurrentDirectory(), host.getCanonicalFileName),
            toPath(declFileName, host.getCurrentDirectory(), host.getCanonicalFileName),
            host
          );
          if (!pathIsRelative(specifier)) {
            recordTypeReferenceDirectivesIfNecessary([[
              specifier,
              /*mode*/
              void 0
            ]]);
            return;
          }
          let fileName = getRelativePathToDirectoryOrUrl(
            outputFilePath2,
            declFileName,
            host.getCurrentDirectory(),
            host.getCanonicalFileName,
            /*isAbsolutePathAnUrl*/
            false
          );
          if (startsWith(fileName, "./") && hasExtension(fileName)) {
            fileName = fileName.substring(2);
          }
          if (startsWith(fileName, "node_modules/") || pathContainsNodeModules(fileName)) {
            return;
          }
          references2.push({ pos: -1, end: -1, fileName });
        }
      };
    }
  }
  function collectReferences(sourceFile, ret) {
    if (noResolve || !isUnparsedSource(sourceFile) && isSourceFileJS(sourceFile))
      return ret;
    forEach(sourceFile.referencedFiles, (f) => {
      const elem = host.getSourceFileFromReference(sourceFile, f);
      if (elem) {
        ret.set(getOriginalNodeId(elem), elem);
      }
    });
    return ret;
  }
  function collectLibs(sourceFile, ret) {
    forEach(sourceFile.libReferenceDirectives, (ref) => {
      const lib = host.getLibFileFromReference(ref);
      if (lib) {
        ret.set(toFileNameLowerCase(ref.fileName), true);
      }
    });
    return ret;
  }
  function filterBindingPatternInitializersAndRenamings(name) {
    if (name.kind === 80 /* Identifier */) {
      return name;
    } else {
      if (name.kind === 206 /* ArrayBindingPattern */) {
        return factory2.updateArrayBindingPattern(name, visitNodes2(name.elements, visitBindingElement, isArrayBindingElement));
      } else {
        return factory2.updateObjectBindingPattern(name, visitNodes2(name.elements, visitBindingElement, isBindingElement));
      }
    }
    function visitBindingElement(elem) {
      if (elem.kind === 231 /* OmittedExpression */) {
        return elem;
      }
      if (elem.propertyName && isIdentifier(elem.propertyName) && isIdentifier(elem.name) && !elem.symbol.isReferenced && !isIdentifierANonContextualKeyword(elem.propertyName)) {
        return factory2.updateBindingElement(
          elem,
          elem.dotDotDotToken,
          /*propertyName*/
          void 0,
          elem.propertyName,
          shouldPrintWithInitializer(elem) ? elem.initializer : void 0
        );
      }
      return factory2.updateBindingElement(
        elem,
        elem.dotDotDotToken,
        elem.propertyName,
        filterBindingPatternInitializersAndRenamings(elem.name),
        shouldPrintWithInitializer(elem) ? elem.initializer : void 0
      );
    }
  }
  function ensureParameter(p, modifierMask, type) {
    let oldDiag;
    if (!suppressNewDiagnosticContexts) {
      oldDiag = getSymbolAccessibilityDiagnostic;
      getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(p);
    }
    const newParam = factory2.updateParameterDeclaration(
      p,
      maskModifiers(factory2, p, modifierMask),
      p.dotDotDotToken,
      filterBindingPatternInitializersAndRenamings(p.name),
      resolver.isOptionalParameter(p) ? p.questionToken || factory2.createToken(58 /* QuestionToken */) : void 0,
      ensureType(
        p,
        type || p.type,
        /*ignorePrivate*/
        true
      ),
      // Ignore private param props, since this type is going straight back into a param
      ensureNoInitializer(p)
    );
    if (!suppressNewDiagnosticContexts) {
      getSymbolAccessibilityDiagnostic = oldDiag;
    }
    return newParam;
  }
  function shouldPrintWithInitializer(node) {
    return canHaveLiteralInitializer(node) && resolver.isLiteralConstDeclaration(getParseTreeNode(node));
  }
  function ensureNoInitializer(node) {
    if (shouldPrintWithInitializer(node)) {
      return resolver.createLiteralConstValue(getParseTreeNode(node), symbolTracker);
    }
    return void 0;
  }
  function ensureType(node, type, ignorePrivate) {
    if (!ignorePrivate && hasEffectiveModifier(node, 8 /* Private */)) {
      return;
    }
    if (shouldPrintWithInitializer(node)) {
      return;
    }
    const shouldUseResolverType = node.kind === 168 /* Parameter */ && (resolver.isRequiredInitializedParameter(node) || resolver.isOptionalUninitializedParameterProperty(node));
    if (type && !shouldUseResolverType) {
      return visitNode(type, visitDeclarationSubtree, isTypeNode);
    }
    if (!getParseTreeNode(node)) {
      return type ? visitNode(type, visitDeclarationSubtree, isTypeNode) : factory2.createKeywordTypeNode(133 /* AnyKeyword */);
    }
    if (node.kind === 177 /* SetAccessor */) {
      return factory2.createKeywordTypeNode(133 /* AnyKeyword */);
    }
    errorNameNode = node.name;
    let oldDiag;
    if (!suppressNewDiagnosticContexts) {
      oldDiag = getSymbolAccessibilityDiagnostic;
      getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(node);
    }
    if (node.kind === 259 /* VariableDeclaration */ || node.kind === 207 /* BindingElement */) {
      return cleanup(resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker));
    }
    if (node.kind === 168 /* Parameter */ || node.kind === 171 /* PropertyDeclaration */ || node.kind === 170 /* PropertySignature */) {
      if (isPropertySignature(node) || !node.initializer)
        return cleanup(resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker, shouldUseResolverType));
      return cleanup(resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker, shouldUseResolverType) || resolver.createTypeOfExpression(node.initializer, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker));
    }
    return cleanup(resolver.createReturnTypeOfSignatureDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker));
    function cleanup(returnValue) {
      errorNameNode = void 0;
      if (!suppressNewDiagnosticContexts) {
        getSymbolAccessibilityDiagnostic = oldDiag;
      }
      return returnValue || factory2.createKeywordTypeNode(133 /* AnyKeyword */);
    }
  }
  function isDeclarationAndNotVisible(node) {
    node = getParseTreeNode(node);
    switch (node.kind) {
      case 261 /* FunctionDeclaration */:
      case 266 /* ModuleDeclaration */:
      case 263 /* InterfaceDeclaration */:
      case 262 /* ClassDeclaration */:
      case 264 /* TypeAliasDeclaration */:
      case 265 /* EnumDeclaration */:
        return !resolver.isDeclarationVisible(node);
      case 259 /* VariableDeclaration */:
        return !getBindingNameVisible(node);
      case 270 /* ImportEqualsDeclaration */:
      case 271 /* ImportDeclaration */:
      case 277 /* ExportDeclaration */:
      case 276 /* ExportAssignment */:
        return false;
      case 174 /* ClassStaticBlockDeclaration */:
        return true;
    }
    return false;
  }
  function shouldEmitFunctionProperties(input) {
    var _a;
    if (input.body) {
      return true;
    }
    const overloadSignatures = (_a = input.symbol.declarations) == null ? void 0 : _a.filter((decl) => isFunctionDeclaration(decl) && !decl.body);
    return !overloadSignatures || overloadSignatures.indexOf(input) === overloadSignatures.length - 1;
  }
  function getBindingNameVisible(elem) {
    if (isOmittedExpression(elem)) {
      return false;
    }
    if (isBindingPattern(elem.name)) {
      return some(elem.name.elements, getBindingNameVisible);
    } else {
      return resolver.isDeclarationVisible(elem);
    }
  }
  function updateParamsList(node, params, modifierMask) {
    if (hasEffectiveModifier(node, 8 /* Private */)) {
      return factory2.createNodeArray();
    }
    const newParams = map(params, (p) => ensureParameter(p, modifierMask));
    if (!newParams) {
      return factory2.createNodeArray();
    }
    return factory2.createNodeArray(newParams, params.hasTrailingComma);
  }
  function updateAccessorParamsList(input, isPrivate) {
    let newParams;
    if (!isPrivate) {
      const thisParameter = getThisParameter(input);
      if (thisParameter) {
        newParams = [ensureParameter(thisParameter)];
      }
    }
    if (isSetAccessorDeclaration(input)) {
      let newValueParameter;
      if (!isPrivate) {
        const valueParameter = getSetAccessorValueParameter(input);
        if (valueParameter) {
          const accessorType = getTypeAnnotationFromAllAccessorDeclarations(input, resolver.getAllAccessorDeclarations(input));
          newValueParameter = ensureParameter(
            valueParameter,
            /*modifierMask*/
            void 0,
            accessorType
          );
        }
      }
      if (!newValueParameter) {
        newValueParameter = factory2.createParameterDeclaration(
          /*modifiers*/
          void 0,
          /*dotDotDotToken*/
          void 0,
          "value"
        );
      }
      newParams = append(newParams, newValueParameter);
    }
    return factory2.createNodeArray(newParams || emptyArray);
  }
  function ensureTypeParams(node, params) {
    return hasEffectiveModifier(node, 8 /* Private */) ? void 0 : visitNodes2(params, visitDeclarationSubtree, isTypeParameterDeclaration);
  }
  function isEnclosingDeclaration(node) {
    return isSourceFile(node) || isTypeAliasDeclaration(node) || isModuleDeclaration(node) || isClassDeclaration(node) || isInterfaceDeclaration(node) || isFunctionLike(node) || isIndexSignatureDeclaration(node) || isMappedTypeNode(node);
  }
  function checkEntityNameVisibility(entityName, enclosingDeclaration2) {
    const visibilityResult = resolver.isEntityNameVisible(entityName, enclosingDeclaration2);
    handleSymbolAccessibilityError(visibilityResult);
    recordTypeReferenceDirectivesIfNecessary(resolver.getTypeReferenceDirectivesForEntityName(entityName));
  }
  function preserveJsDoc(updated, original) {
    if (hasJSDocNodes(updated) && hasJSDocNodes(original)) {
      updated.jsDoc = original.jsDoc;
    }
    return setCommentRange(updated, getCommentRange(original));
  }
  function rewriteModuleSpecifier(parent, input) {
    if (!input)
      return void 0;
    resultHasExternalModuleIndicator = resultHasExternalModuleIndicator || parent.kind !== 266 /* ModuleDeclaration */ && parent.kind !== 204 /* ImportType */;
    if (isStringLiteralLike(input)) {
      if (isBundledEmit) {
        const newName = getExternalModuleNameFromDeclaration(context.getEmitHost(), resolver, parent);
        if (newName) {
          return factory2.createStringLiteral(newName);
        }
      } else {
        const symbol = resolver.getSymbolOfExternalModuleSpecifier(input);
        if (symbol) {
          (exportedModulesFromDeclarationEmit || (exportedModulesFromDeclarationEmit = [])).push(symbol);
        }
      }
    }
    return input;
  }
  function transformImportEqualsDeclaration(decl) {
    if (!resolver.isDeclarationVisible(decl))
      return;
    if (decl.moduleReference.kind === 282 /* ExternalModuleReference */) {
      const specifier = getExternalModuleImportEqualsDeclarationExpression(decl);
      return factory2.updateImportEqualsDeclaration(
        decl,
        decl.modifiers,
        decl.isTypeOnly,
        decl.name,
        factory2.updateExternalModuleReference(decl.moduleReference, rewriteModuleSpecifier(decl, specifier))
      );
    } else {
      const oldDiag = getSymbolAccessibilityDiagnostic;
      getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(decl);
      checkEntityNameVisibility(decl.moduleReference, enclosingDeclaration);
      getSymbolAccessibilityDiagnostic = oldDiag;
      return decl;
    }
  }
  function transformImportDeclaration(decl) {
    if (!decl.importClause) {
      return factory2.updateImportDeclaration(
        decl,
        decl.modifiers,
        decl.importClause,
        rewriteModuleSpecifier(decl, decl.moduleSpecifier),
        getResolutionModeOverrideForClauseInNightly(decl.assertClause)
      );
    }
    const visibleDefaultBinding = decl.importClause && decl.importClause.name && resolver.isDeclarationVisible(decl.importClause) ? decl.importClause.name : void 0;
    if (!decl.importClause.namedBindings) {
      return visibleDefaultBinding && factory2.updateImportDeclaration(decl, decl.modifiers, factory2.updateImportClause(
        decl.importClause,
        decl.importClause.isTypeOnly,
        visibleDefaultBinding,
        /*namedBindings*/
        void 0
      ), rewriteModuleSpecifier(decl, decl.moduleSpecifier), getResolutionModeOverrideForClauseInNightly(decl.assertClause));
    }
    if (decl.importClause.namedBindings.kind === 273 /* NamespaceImport */) {
      const namedBindings = resolver.isDeclarationVisible(decl.importClause.namedBindings) ? decl.importClause.namedBindings : (
        /*namedBindings*/
        void 0
      );
      return visibleDefaultBinding || namedBindings ? factory2.updateImportDeclaration(decl, decl.modifiers, factory2.updateImportClause(
        decl.importClause,
        decl.importClause.isTypeOnly,
        visibleDefaultBinding,
        namedBindings
      ), rewriteModuleSpecifier(decl, decl.moduleSpecifier), getResolutionModeOverrideForClauseInNightly(decl.assertClause)) : void 0;
    }
    const bindingList = mapDefined(decl.importClause.namedBindings.elements, (b) => resolver.isDeclarationVisible(b) ? b : void 0);
    if (bindingList && bindingList.length || visibleDefaultBinding) {
      return factory2.updateImportDeclaration(
        decl,
        decl.modifiers,
        factory2.updateImportClause(
          decl.importClause,
          decl.importClause.isTypeOnly,
          visibleDefaultBinding,
          bindingList && bindingList.length ? factory2.updateNamedImports(decl.importClause.namedBindings, bindingList) : void 0
        ),
        rewriteModuleSpecifier(decl, decl.moduleSpecifier),
        getResolutionModeOverrideForClauseInNightly(decl.assertClause)
      );
    }
    if (resolver.isImportRequiredByAugmentation(decl)) {
      return factory2.updateImportDeclaration(
        decl,
        decl.modifiers,
        /*importClause*/
        void 0,
        rewriteModuleSpecifier(decl, decl.moduleSpecifier),
        getResolutionModeOverrideForClauseInNightly(decl.assertClause)
      );
    }
  }
  function getResolutionModeOverrideForClauseInNightly(assertClause) {
    const mode = getResolutionModeOverrideForClause(assertClause);
    if (mode !== void 0) {
      if (!isNightly()) {
        context.addDiagnostic(createDiagnosticForNode(assertClause, Diagnostics.resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next));
      }
      return assertClause;
    }
    return void 0;
  }
  function transformAndReplaceLatePaintedStatements(statements) {
    while (length(lateMarkedStatements)) {
      const i = lateMarkedStatements.shift();
      if (!isLateVisibilityPaintedStatement(i)) {
        return Debug.fail(`Late replaced statement was found which is not handled by the declaration transformer!: ${Debug.formatSyntaxKind(i.kind)}`);
      }
      const priorNeedsDeclare = needsDeclare;
      needsDeclare = i.parent && isSourceFile(i.parent) && !(isExternalModule(i.parent) && isBundledEmit);
      const result = transformTopLevelDeclaration(i);
      needsDeclare = priorNeedsDeclare;
      lateStatementReplacementMap.set(getOriginalNodeId(i), result);
    }
    return visitNodes2(statements, visitLateVisibilityMarkedStatements, isStatement);
    function visitLateVisibilityMarkedStatements(statement) {
      if (isLateVisibilityPaintedStatement(statement)) {
        const key = getOriginalNodeId(statement);
        if (lateStatementReplacementMap.has(key)) {
          const result = lateStatementReplacementMap.get(key);
          lateStatementReplacementMap.delete(key);
          if (result) {
            if (isArray(result) ? some(result, needsScopeMarker) : needsScopeMarker(result)) {
              needsScopeFixMarker = true;
            }
            if (isSourceFile(statement.parent) && (isArray(result) ? some(result, isExternalModuleIndicator) : isExternalModuleIndicator(result))) {
              resultHasExternalModuleIndicator = true;
            }
          }
          return result;
        }
      }
      return statement;
    }
  }
  function visitDeclarationSubtree(input) {
    if (shouldStripInternal(input))
      return;
    if (isDeclaration(input)) {
      if (isDeclarationAndNotVisible(input))
        return;
      if (hasDynamicName(input) && !resolver.isLateBound(getParseTreeNode(input))) {
        return;
      }
    }
    if (isFunctionLike(input) && resolver.isImplementationOfOverload(input))
      return;
    if (isSemicolonClassElement(input))
      return;
    let previousEnclosingDeclaration;
    if (isEnclosingDeclaration(input)) {
      previousEnclosingDeclaration = enclosingDeclaration;
      enclosingDeclaration = input;
    }
    const oldDiag = getSymbolAccessibilityDiagnostic;
    const canProduceDiagnostic = canProduceDiagnostics(input);
    const oldWithinObjectLiteralType = suppressNewDiagnosticContexts;
    let shouldEnterSuppressNewDiagnosticsContextContext = (input.kind === 186 /* TypeLiteral */ || input.kind === 199 /* MappedType */) && input.parent.kind !== 264 /* TypeAliasDeclaration */;
    if (isMethodDeclaration(input) || isMethodSignature(input)) {
      if (hasEffectiveModifier(input, 8 /* Private */)) {
        if (input.symbol && input.symbol.declarations && input.symbol.declarations[0] !== input)
          return;
        return cleanup(factory2.createPropertyDeclaration(
          ensureModifiers(input),
          input.name,
          /*questionOrExclamationToken*/
          void 0,
          /*type*/
          void 0,
          /*initializer*/
          void 0
        ));
      }
    }
    if (canProduceDiagnostic && !suppressNewDiagnosticContexts) {
      getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(input);
    }
    if (isTypeQueryNode(input)) {
      checkEntityNameVisibility(input.exprName, enclosingDeclaration);
    }
    if (shouldEnterSuppressNewDiagnosticsContextContext) {
      suppressNewDiagnosticContexts = true;
    }
    if (isProcessedComponent(input)) {
      switch (input.kind) {
        case 232 /* ExpressionWithTypeArguments */: {
          if (isEntityName(input.expression) || isEntityNameExpression(input.expression)) {
            checkEntityNameVisibility(input.expression, enclosingDeclaration);
          }
          const node = visitEachChild(input, visitDeclarationSubtree, context);
          return cleanup(factory2.updateExpressionWithTypeArguments(node, node.expression, node.typeArguments));
        }
        case 182 /* TypeReference */: {
          checkEntityNameVisibility(input.typeName, enclosingDeclaration);
          const node = visitEachChild(input, visitDeclarationSubtree, context);
          return cleanup(factory2.updateTypeReferenceNode(node, node.typeName, node.typeArguments));
        }
        case 179 /* ConstructSignature */:
          return cleanup(factory2.updateConstructSignature(
            input,
            ensureTypeParams(input, input.typeParameters),
            updateParamsList(input, input.parameters),
            ensureType(input, input.type)
          ));
        case 175 /* Constructor */: {
          const ctor = factory2.createConstructorDeclaration(
            /*modifiers*/
            ensureModifiers(input),
            updateParamsList(input, input.parameters, 0 /* None */),
            /*body*/
            void 0
          );
          return cleanup(ctor);
        }
        case 173 /* MethodDeclaration */: {
          if (isPrivateIdentifier(input.name)) {
            return cleanup(
              /*returnValue*/
              void 0
            );
          }
          const sig = factory2.createMethodDeclaration(
            ensureModifiers(input),
            /*asteriskToken*/
            void 0,
            input.name,
            input.questionToken,
            ensureTypeParams(input, input.typeParameters),
            updateParamsList(input, input.parameters),
            ensureType(input, input.type),
            /*body*/
            void 0
          );
          return cleanup(sig);
        }
        case 176 /* GetAccessor */: {
          if (isPrivateIdentifier(input.name)) {
            return cleanup(
              /*returnValue*/
              void 0
            );
          }
          const accessorType = getTypeAnnotationFromAllAccessorDeclarations(input, resolver.getAllAccessorDeclarations(input));
          return cleanup(factory2.updateGetAccessorDeclaration(
            input,
            ensureModifiers(input),
            input.name,
            updateAccessorParamsList(input, hasEffectiveModifier(input, 8 /* Private */)),
            ensureType(input, accessorType),
            /*body*/
            void 0
          ));
        }
        case 177 /* SetAccessor */: {
          if (isPrivateIdentifier(input.name)) {
            return cleanup(
              /*returnValue*/
              void 0
            );
          }
          return cleanup(factory2.updateSetAccessorDeclaration(
            input,
            ensureModifiers(input),
            input.name,
            updateAccessorParamsList(input, hasEffectiveModifier(input, 8 /* Private */)),
            /*body*/
            void 0
          ));
        }
        case 171 /* PropertyDeclaration */:
          if (isPrivateIdentifier(input.name)) {
            return cleanup(
              /*returnValue*/
              void 0
            );
          }
          return cleanup(factory2.updatePropertyDeclaration(
            input,
            ensureModifiers(input),
            input.name,
            input.questionToken,
            ensureType(input, input.type),
            ensureNoInitializer(input)
          ));
        case 170 /* PropertySignature */:
          if (isPrivateIdentifier(input.name)) {
            return cleanup(
              /*returnValue*/
              void 0
            );
          }
          return cleanup(factory2.updatePropertySignature(
            input,
            ensureModifiers(input),
            input.name,
            input.questionToken,
            ensureType(input, input.type)
          ));
        case 172 /* MethodSignature */: {
          if (isPrivateIdentifier(input.name)) {
            return cleanup(
              /*returnValue*/
              void 0
            );
          }
          return cleanup(factory2.updateMethodSignature(
            input,
            ensureModifiers(input),
            input.name,
            input.questionToken,
            ensureTypeParams(input, input.typeParameters),
            updateParamsList(input, input.parameters),
            ensureType(input, input.type)
          ));
        }
        case 178 /* CallSignature */: {
          return cleanup(factory2.updateCallSignature(
            input,
            ensureTypeParams(input, input.typeParameters),
            updateParamsList(input, input.parameters),
            ensureType(input, input.type)
          ));
        }
        case 180 /* IndexSignature */: {
          return cleanup(factory2.updateIndexSignature(
            input,
            ensureModifiers(input),
            updateParamsList(input, input.parameters),
            visitNode(input.type, visitDeclarationSubtree, isTypeNode) || factory2.createKeywordTypeNode(133 /* AnyKeyword */)
          ));
        }
        case 259 /* VariableDeclaration */: {
          if (isBindingPattern(input.name)) {
            return recreateBindingPattern(input.name);
          }
          shouldEnterSuppressNewDiagnosticsContextContext = true;
          suppressNewDiagnosticContexts = true;
          return cleanup(factory2.updateVariableDeclaration(
            input,
            input.name,
            /*exclamationToken*/
            void 0,
            ensureType(input, input.type),
            ensureNoInitializer(input)
          ));
        }
        case 167 /* TypeParameter */: {
          if (isPrivateMethodTypeParameter(input) && (input.default || input.constraint)) {
            return cleanup(factory2.updateTypeParameterDeclaration(
              input,
              input.modifiers,
              input.name,
              /*constraint*/
              void 0,
              /*defaultType*/
              void 0
            ));
          }
          return cleanup(visitEachChild(input, visitDeclarationSubtree, context));
        }
        case 193 /* ConditionalType */: {
          const checkType = visitNode(input.checkType, visitDeclarationSubtree, isTypeNode);
          const extendsType = visitNode(input.extendsType, visitDeclarationSubtree, isTypeNode);
          const oldEnclosingDecl = enclosingDeclaration;
          enclosingDeclaration = input.trueType;
          const trueType = visitNode(input.trueType, visitDeclarationSubtree, isTypeNode);
          enclosingDeclaration = oldEnclosingDecl;
          const falseType = visitNode(input.falseType, visitDeclarationSubtree, isTypeNode);
          Debug.assert(checkType);
          Debug.assert(extendsType);
          Debug.assert(trueType);
          Debug.assert(falseType);
          return cleanup(factory2.updateConditionalTypeNode(input, checkType, extendsType, trueType, falseType));
        }
        case 183 /* FunctionType */: {
          return cleanup(factory2.updateFunctionTypeNode(input, visitNodes2(input.typeParameters, visitDeclarationSubtree, isTypeParameterDeclaration), updateParamsList(input, input.parameters), Debug.checkDefined(visitNode(input.type, visitDeclarationSubtree, isTypeNode))));
        }
        case 184 /* ConstructorType */: {
          return cleanup(factory2.updateConstructorTypeNode(input, ensureModifiers(input), visitNodes2(input.typeParameters, visitDeclarationSubtree, isTypeParameterDeclaration), updateParamsList(input, input.parameters), Debug.checkDefined(visitNode(input.type, visitDeclarationSubtree, isTypeNode))));
        }
        case 204 /* ImportType */: {
          if (!isLiteralImportTypeNode(input))
            return cleanup(input);
          return cleanup(factory2.updateImportTypeNode(
            input,
            factory2.updateLiteralTypeNode(input.argument, rewriteModuleSpecifier(input, input.argument.literal)),
            input.assertions,
            input.qualifier,
            visitNodes2(input.typeArguments, visitDeclarationSubtree, isTypeNode),
            input.isTypeOf
          ));
        }
        default:
          Debug.assertNever(input, `Attempted to process unhandled node kind: ${Debug.formatSyntaxKind(input.kind)}`);
      }
    }
    if (isTupleTypeNode(input) && getLineAndCharacterOfPosition(currentSourceFile, input.pos).line === getLineAndCharacterOfPosition(currentSourceFile, input.end).line) {
      setEmitFlags(input, 1 /* SingleLine */);
    }
    return cleanup(visitEachChild(input, visitDeclarationSubtree, context));
    function cleanup(returnValue) {
      if (returnValue && canProduceDiagnostic && hasDynamicName(input)) {
        checkName(input);
      }
      if (isEnclosingDeclaration(input)) {
        enclosingDeclaration = previousEnclosingDeclaration;
      }
      if (canProduceDiagnostic && !suppressNewDiagnosticContexts) {
        getSymbolAccessibilityDiagnostic = oldDiag;
      }
      if (shouldEnterSuppressNewDiagnosticsContextContext) {
        suppressNewDiagnosticContexts = oldWithinObjectLiteralType;
      }
      if (returnValue === input) {
        return returnValue;
      }
      return returnValue && setOriginalNode(preserveJsDoc(returnValue, input), input);
    }
  }
  function isPrivateMethodTypeParameter(node) {
    return node.parent.kind === 173 /* MethodDeclaration */ && hasEffectiveModifier(node.parent, 8 /* Private */);
  }
  function visitDeclarationStatements(input) {
    if (!isPreservedDeclarationStatement(input)) {
      return;
    }
    if (shouldStripInternal(input))
      return;
    switch (input.kind) {
      case 277 /* ExportDeclaration */: {
        if (isSourceFile(input.parent)) {
          resultHasExternalModuleIndicator = true;
        }
        resultHasScopeMarker = true;
        return factory2.updateExportDeclaration(
          input,
          input.modifiers,
          input.isTypeOnly,
          input.exportClause,
          rewriteModuleSpecifier(input, input.moduleSpecifier),
          getResolutionModeOverrideForClause(input.assertClause) ? input.assertClause : void 0
        );
      }
      case 276 /* ExportAssignment */: {
        if (isSourceFile(input.parent)) {
          resultHasExternalModuleIndicator = true;
        }
        resultHasScopeMarker = true;
        if (input.expression.kind === 80 /* Identifier */) {
          return input;
        } else {
          const newId = factory2.createUniqueName("_default", 16 /* Optimistic */);
          getSymbolAccessibilityDiagnostic = () => ({
            diagnosticMessage: Diagnostics.Default_export_of_the_module_has_or_is_using_private_name_0,
            errorNode: input
          });
          errorFallbackNode = input;
          const varDecl = factory2.createVariableDeclaration(
            newId,
            /*exclamationToken*/
            void 0,
            resolver.createTypeOfExpression(input.expression, input, declarationEmitNodeBuilderFlags, symbolTracker),
            /*initializer*/
            void 0
          );
          errorFallbackNode = void 0;
          const statement = factory2.createVariableStatement(needsDeclare ? [factory2.createModifier(138 /* DeclareKeyword */)] : [], factory2.createVariableDeclarationList([varDecl], 2 /* Const */));
          preserveJsDoc(statement, input);
          removeAllComments(input);
          return [statement, factory2.updateExportAssignment(input, input.modifiers, newId)];
        }
      }
    }
    const result = transformTopLevelDeclaration(input);
    lateStatementReplacementMap.set(getOriginalNodeId(input), result);
    return input;
  }
  function stripExportModifiers(statement) {
    if (isImportEqualsDeclaration(statement) || hasEffectiveModifier(statement, 1024 /* Default */) || !canHaveModifiers(statement)) {
      return statement;
    }
    const modifiers = factory2.createModifiersFromModifierFlags(getEffectiveModifierFlags(statement) & (258047 /* All */ ^ 1 /* Export */));
    return factory2.updateModifiers(statement, modifiers);
  }
  function transformTopLevelDeclaration(input) {
    if (lateMarkedStatements) {
      while (orderedRemoveItem(lateMarkedStatements, input))
        ;
    }
    if (shouldStripInternal(input))
      return;
    switch (input.kind) {
      case 270 /* ImportEqualsDeclaration */: {
        return transformImportEqualsDeclaration(input);
      }
      case 271 /* ImportDeclaration */: {
        return transformImportDeclaration(input);
      }
    }
    if (isDeclaration(input) && isDeclarationAndNotVisible(input))
      return;
    if (isFunctionLike(input) && resolver.isImplementationOfOverload(input))
      return;
    let previousEnclosingDeclaration;
    if (isEnclosingDeclaration(input)) {
      previousEnclosingDeclaration = enclosingDeclaration;
      enclosingDeclaration = input;
    }
    const canProdiceDiagnostic = canProduceDiagnostics(input);
    const oldDiag = getSymbolAccessibilityDiagnostic;
    if (canProdiceDiagnostic) {
      getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(input);
    }
    const previousNeedsDeclare = needsDeclare;
    switch (input.kind) {
      case 264 /* TypeAliasDeclaration */: {
        needsDeclare = false;
        const clean2 = cleanup(factory2.updateTypeAliasDeclaration(
          input,
          ensureModifiers(input),
          input.name,
          visitNodes2(input.typeParameters, visitDeclarationSubtree, isTypeParameterDeclaration),
          Debug.checkDefined(visitNode(input.type, visitDeclarationSubtree, isTypeNode))
        ));
        needsDeclare = previousNeedsDeclare;
        return clean2;
      }
      case 263 /* InterfaceDeclaration */: {
        return cleanup(factory2.updateInterfaceDeclaration(
          input,
          ensureModifiers(input),
          input.name,
          ensureTypeParams(input, input.typeParameters),
          transformHeritageClauses(input.heritageClauses),
          visitNodes2(input.members, visitDeclarationSubtree, isTypeElement)
        ));
      }
      case 261 /* FunctionDeclaration */: {
        const clean2 = cleanup(factory2.updateFunctionDeclaration(
          input,
          ensureModifiers(input),
          /*asteriskToken*/
          void 0,
          input.name,
          ensureTypeParams(input, input.typeParameters),
          updateParamsList(input, input.parameters),
          ensureType(input, input.type),
          /*body*/
          void 0
        ));
        if (clean2 && resolver.isExpandoFunctionDeclaration(input) && shouldEmitFunctionProperties(input)) {
          const props = resolver.getPropertiesOfContainerFunction(input);
          const fakespace = parseNodeFactory.createModuleDeclaration(
            /*modifiers*/
            void 0,
            clean2.name || factory2.createIdentifier("_default"),
            factory2.createModuleBlock([]),
            16 /* Namespace */
          );
          setParent(fakespace, enclosingDeclaration);
          fakespace.locals = createSymbolTable(props);
          fakespace.symbol = props[0].parent;
          const exportMappings = [];
          let declarations = mapDefined(props, (p) => {
            if (!p.valueDeclaration || !(isPropertyAccessExpression(p.valueDeclaration) || isElementAccessExpression(p.valueDeclaration) || isBinaryExpression(p.valueDeclaration))) {
              return void 0;
            }
            const nameStr = unescapeLeadingUnderscores(p.escapedName);
            if (!isIdentifierText(nameStr, 99 /* ESNext */)) {
              return void 0;
            }
            getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(p.valueDeclaration);
            const type = resolver.createTypeOfDeclaration(p.valueDeclaration, fakespace, declarationEmitNodeBuilderFlags, symbolTracker);
            getSymbolAccessibilityDiagnostic = oldDiag;
            const isNonContextualKeywordName = isStringANonContextualKeyword(nameStr);
            const name = isNonContextualKeywordName ? factory2.getGeneratedNameForNode(p.valueDeclaration) : factory2.createIdentifier(nameStr);
            if (isNonContextualKeywordName) {
              exportMappings.push([name, nameStr]);
            }
            const varDecl = factory2.createVariableDeclaration(
              name,
              /*exclamationToken*/
              void 0,
              type,
              /*initializer*/
              void 0
            );
            return factory2.createVariableStatement(isNonContextualKeywordName ? void 0 : [factory2.createToken(95 /* ExportKeyword */)], factory2.createVariableDeclarationList([varDecl]));
          });
          if (!exportMappings.length) {
            declarations = mapDefined(declarations, (declaration) => factory2.updateModifiers(declaration, 0 /* None */));
          } else {
            declarations.push(factory2.createExportDeclaration(
              /*modifiers*/
              void 0,
              /*isTypeOnly*/
              false,
              factory2.createNamedExports(map(exportMappings, ([gen, exp]) => {
                return factory2.createExportSpecifier(
                  /*isTypeOnly*/
                  false,
                  gen,
                  exp
                );
              }))
            ));
          }
          const namespaceDecl = factory2.createModuleDeclaration(ensureModifiers(input), input.name, factory2.createModuleBlock(declarations), 16 /* Namespace */);
          if (!hasEffectiveModifier(clean2, 1024 /* Default */)) {
            return [clean2, namespaceDecl];
          }
          const modifiers = factory2.createModifiersFromModifierFlags(getEffectiveModifierFlags(clean2) & ~1025 /* ExportDefault */ | 2 /* Ambient */);
          const cleanDeclaration = factory2.updateFunctionDeclaration(
            clean2,
            modifiers,
            /*asteriskToken*/
            void 0,
            clean2.name,
            clean2.typeParameters,
            clean2.parameters,
            clean2.type,
            /*body*/
            void 0
          );
          const namespaceDeclaration = factory2.updateModuleDeclaration(
            namespaceDecl,
            modifiers,
            namespaceDecl.name,
            namespaceDecl.body
          );
          const exportDefaultDeclaration = factory2.createExportAssignment(
            /*modifiers*/
            void 0,
            /*isExportEquals*/
            false,
            namespaceDecl.name
          );
          if (isSourceFile(input.parent)) {
            resultHasExternalModuleIndicator = true;
          }
          resultHasScopeMarker = true;
          return [cleanDeclaration, namespaceDeclaration, exportDefaultDeclaration];
        } else {
          return clean2;
        }
      }
      case 266 /* ModuleDeclaration */: {
        needsDeclare = false;
        const inner = input.body;
        if (inner && inner.kind === 267 /* ModuleBlock */) {
          const oldNeedsScopeFix = needsScopeFixMarker;
          const oldHasScopeFix = resultHasScopeMarker;
          resultHasScopeMarker = false;
          needsScopeFixMarker = false;
          const statements = visitNodes2(inner.statements, visitDeclarationStatements, isStatement);
          let lateStatements = transformAndReplaceLatePaintedStatements(statements);
          if (input.flags & 16777216 /* Ambient */) {
            needsScopeFixMarker = false;
          }
          if (!isGlobalScopeAugmentation(input) && !hasScopeMarker2(lateStatements) && !resultHasScopeMarker) {
            if (needsScopeFixMarker) {
              lateStatements = factory2.createNodeArray([...lateStatements, createEmptyExports(factory2)]);
            } else {
              lateStatements = visitNodes2(lateStatements, stripExportModifiers, isStatement);
            }
          }
          const body = factory2.updateModuleBlock(inner, lateStatements);
          needsDeclare = previousNeedsDeclare;
          needsScopeFixMarker = oldNeedsScopeFix;
          resultHasScopeMarker = oldHasScopeFix;
          const mods = ensureModifiers(input);
          return cleanup(factory2.updateModuleDeclaration(
            input,
            mods,
            isExternalModuleAugmentation(input) ? rewriteModuleSpecifier(input, input.name) : input.name,
            body
          ));
        } else {
          needsDeclare = previousNeedsDeclare;
          const mods = ensureModifiers(input);
          needsDeclare = false;
          visitNode(inner, visitDeclarationStatements);
          const id = getOriginalNodeId(inner);
          const body = lateStatementReplacementMap.get(id);
          lateStatementReplacementMap.delete(id);
          return cleanup(factory2.updateModuleDeclaration(
            input,
            mods,
            input.name,
            body
          ));
        }
      }
      case 262 /* ClassDeclaration */: {
        errorNameNode = input.name;
        errorFallbackNode = input;
        const modifiers = factory2.createNodeArray(ensureModifiers(input));
        const typeParameters = ensureTypeParams(input, input.typeParameters);
        const ctor = getFirstConstructorWithBody(input);
        let parameterProperties;
        if (ctor) {
          const oldDiag2 = getSymbolAccessibilityDiagnostic;
          parameterProperties = compact(flatMap(ctor.parameters, (param) => {
            if (!hasSyntacticModifier(param, 16476 /* ParameterPropertyModifier */) || shouldStripInternal(param))
              return;
            getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(param);
            if (param.name.kind === 80 /* Identifier */) {
              return preserveJsDoc(factory2.createPropertyDeclaration(
                ensureModifiers(param),
                param.name,
                param.questionToken,
                ensureType(param, param.type),
                ensureNoInitializer(param)
              ), param);
            } else {
              return walkBindingPattern(param.name);
            }
            function walkBindingPattern(pattern) {
              let elems;
              for (const elem of pattern.elements) {
                if (isOmittedExpression(elem))
                  continue;
                if (isBindingPattern(elem.name)) {
                  elems = concatenate(elems, walkBindingPattern(elem.name));
                }
                elems = elems || [];
                elems.push(factory2.createPropertyDeclaration(
                  ensureModifiers(param),
                  elem.name,
                  /*questionOrExclamationToken*/
                  void 0,
                  ensureType(
                    elem,
                    /*type*/
                    void 0
                  ),
                  /*initializer*/
                  void 0
                ));
              }
              return elems;
            }
          }));
          getSymbolAccessibilityDiagnostic = oldDiag2;
        }
        const hasPrivateIdentifier = some(input.members, (member) => !!member.name && isPrivateIdentifier(member.name));
        const privateIdentifier = hasPrivateIdentifier ? [
          factory2.createPropertyDeclaration(
            /*modifiers*/
            void 0,
            factory2.createPrivateIdentifier("#private"),
            /*questionOrExclamationToken*/
            void 0,
            /*type*/
            void 0,
            /*initializer*/
            void 0
          )
        ] : void 0;
        const memberNodes = concatenate(concatenate(privateIdentifier, parameterProperties), visitNodes2(input.members, visitDeclarationSubtree, isClassElement));
        const members = factory2.createNodeArray(memberNodes);
        const extendsClause = getEffectiveBaseTypeNode(input);
        if (extendsClause && !isEntityNameExpression(extendsClause.expression) && extendsClause.expression.kind !== 106 /* NullKeyword */) {
          const oldId = input.name ? unescapeLeadingUnderscores(input.name.escapedText) : "default";
          const newId = factory2.createUniqueName(`${oldId}_base`, 16 /* Optimistic */);
          getSymbolAccessibilityDiagnostic = () => ({
            diagnosticMessage: Diagnostics.extends_clause_of_exported_class_0_has_or_is_using_private_name_1,
            errorNode: extendsClause,
            typeName: input.name
          });
          const varDecl = factory2.createVariableDeclaration(
            newId,
            /*exclamationToken*/
            void 0,
            resolver.createTypeOfExpression(extendsClause.expression, input, declarationEmitNodeBuilderFlags, symbolTracker),
            /*initializer*/
            void 0
          );
          const statement = factory2.createVariableStatement(needsDeclare ? [factory2.createModifier(138 /* DeclareKeyword */)] : [], factory2.createVariableDeclarationList([varDecl], 2 /* Const */));
          const heritageClauses = factory2.createNodeArray(map(input.heritageClauses, (clause) => {
            if (clause.token === 96 /* ExtendsKeyword */) {
              const oldDiag2 = getSymbolAccessibilityDiagnostic;
              getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(clause.types[0]);
              const newClause = factory2.updateHeritageClause(clause, map(clause.types, (t) => factory2.updateExpressionWithTypeArguments(t, newId, visitNodes2(t.typeArguments, visitDeclarationSubtree, isTypeNode))));
              getSymbolAccessibilityDiagnostic = oldDiag2;
              return newClause;
            }
            return factory2.updateHeritageClause(clause, visitNodes2(factory2.createNodeArray(filter(clause.types, (t) => isEntityNameExpression(t.expression) || t.expression.kind === 106 /* NullKeyword */)), visitDeclarationSubtree, isExpressionWithTypeArguments));
          }));
          return [statement, cleanup(factory2.updateClassDeclaration(
            input,
            modifiers,
            input.name,
            typeParameters,
            heritageClauses,
            members
          ))];
        } else {
          const heritageClauses = transformHeritageClauses(input.heritageClauses);
          return cleanup(factory2.updateClassDeclaration(
            input,
            modifiers,
            input.name,
            typeParameters,
            heritageClauses,
            members
          ));
        }
      }
      case 242 /* VariableStatement */: {
        return cleanup(transformVariableStatement(input));
      }
      case 265 /* EnumDeclaration */: {
        return cleanup(factory2.updateEnumDeclaration(input, factory2.createNodeArray(ensureModifiers(input)), input.name, factory2.createNodeArray(mapDefined(input.members, (m) => {
          if (shouldStripInternal(m))
            return;
          const constValue = resolver.getConstantValue(m);
          return preserveJsDoc(factory2.updateEnumMember(m, m.name, constValue !== void 0 ? typeof constValue === "string" ? factory2.createStringLiteral(constValue) : factory2.createNumericLiteral(constValue) : void 0), m);
        }))));
      }
    }
    return Debug.assertNever(input, `Unhandled top-level node in declaration emit: ${Debug.formatSyntaxKind(input.kind)}`);
    function cleanup(node) {
      if (isEnclosingDeclaration(input)) {
        enclosingDeclaration = previousEnclosingDeclaration;
      }
      if (canProdiceDiagnostic) {
        getSymbolAccessibilityDiagnostic = oldDiag;
      }
      if (input.kind === 266 /* ModuleDeclaration */) {
        needsDeclare = previousNeedsDeclare;
      }
      if (node === input) {
        return node;
      }
      errorFallbackNode = void 0;
      errorNameNode = void 0;
      return node && setOriginalNode(preserveJsDoc(node, input), input);
    }
  }
  function transformVariableStatement(input) {
    if (!forEach(input.declarationList.declarations, getBindingNameVisible))
      return;
    const nodes = visitNodes2(input.declarationList.declarations, visitDeclarationSubtree, isVariableDeclaration);
    if (!length(nodes))
      return;
    return factory2.updateVariableStatement(input, factory2.createNodeArray(ensureModifiers(input)), factory2.updateVariableDeclarationList(input.declarationList, nodes));
  }
  function recreateBindingPattern(d) {
    return flatten(mapDefined(d.elements, (e) => recreateBindingElement(e)));
  }
  function recreateBindingElement(e) {
    if (e.kind === 231 /* OmittedExpression */) {
      return;
    }
    if (e.name) {
      if (!getBindingNameVisible(e))
        return;
      if (isBindingPattern(e.name)) {
        return recreateBindingPattern(e.name);
      } else {
        return factory2.createVariableDeclaration(
          e.name,
          /*exclamationToken*/
          void 0,
          ensureType(
            e,
            /*type*/
            void 0
          ),
          /*initializer*/
          void 0
        );
      }
    }
  }
  function checkName(node) {
    let oldDiag;
    if (!suppressNewDiagnosticContexts) {
      oldDiag = getSymbolAccessibilityDiagnostic;
      getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNodeName(node);
    }
    errorNameNode = node.name;
    Debug.assert(resolver.isLateBound(getParseTreeNode(node)));
    const decl = node;
    const entityName = decl.name.expression;
    checkEntityNameVisibility(entityName, enclosingDeclaration);
    if (!suppressNewDiagnosticContexts) {
      getSymbolAccessibilityDiagnostic = oldDiag;
    }
    errorNameNode = void 0;
  }
  function shouldStripInternal(node) {
    return !!stripInternal && !!node && isInternalDeclaration(node, currentSourceFile);
  }
  function isScopeMarker2(node) {
    return isExportAssignment(node) || isExportDeclaration(node);
  }
  function hasScopeMarker2(statements) {
    return some(statements, isScopeMarker2);
  }
  function ensureModifiers(node) {
    const currentFlags = getEffectiveModifierFlags(node);
    const newFlags = ensureModifierFlags(node);
    if (currentFlags === newFlags) {
      return visitArray(node.modifiers, (n) => tryCast(n, isModifier), isModifier);
    }
    return factory2.createModifiersFromModifierFlags(newFlags);
  }
  function ensureModifierFlags(node) {
    let mask = 258047 /* All */ ^ (4 /* Public */ | 512 /* Async */ | 16384 /* Override */);
    let additions = needsDeclare && !isAlwaysType(node) ? 2 /* Ambient */ : 0 /* None */;
    const parentIsFile = node.parent.kind === 311 /* SourceFile */;
    if (!parentIsFile || isBundledEmit && parentIsFile && isExternalModule(node.parent)) {
      mask ^= 2 /* Ambient */;
      additions = 0 /* None */;
    }
    return maskModifierFlags(node, mask, additions);
  }
  function getTypeAnnotationFromAllAccessorDeclarations(node, accessors) {
    let accessorType = getTypeAnnotationFromAccessor(node);
    if (!accessorType && node !== accessors.firstAccessor) {
      accessorType = getTypeAnnotationFromAccessor(accessors.firstAccessor);
      getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(accessors.firstAccessor);
    }
    if (!accessorType && accessors.secondAccessor && node !== accessors.secondAccessor) {
      accessorType = getTypeAnnotationFromAccessor(accessors.secondAccessor);
      getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(accessors.secondAccessor);
    }
    return accessorType;
  }
  function transformHeritageClauses(nodes) {
    return factory2.createNodeArray(filter(map(nodes, (clause) => factory2.updateHeritageClause(clause, visitNodes2(factory2.createNodeArray(filter(clause.types, (t) => {
      return isEntityNameExpression(t.expression) || clause.token === 96 /* ExtendsKeyword */ && t.expression.kind === 106 /* NullKeyword */;
    })), visitDeclarationSubtree, isExpressionWithTypeArguments))), (clause) => clause.types && !!clause.types.length));
  }
}
function isAlwaysType(node) {
  if (node.kind === 263 /* InterfaceDeclaration */) {
    return true;
  }
  return false;
}
function maskModifiers(factory2, node, modifierMask, modifierAdditions) {
  return factory2.createModifiersFromModifierFlags(maskModifierFlags(node, modifierMask, modifierAdditions));
}
function maskModifierFlags(node, modifierMask = 258047 /* All */ ^ 4 /* Public */, modifierAdditions = 0 /* None */) {
  let flags = getEffectiveModifierFlags(node) & modifierMask | modifierAdditions;
  if (flags & 1024 /* Default */ && !(flags & 1 /* Export */)) {
    flags ^= 1 /* Export */;
  }
  if (flags & 1024 /* Default */ && flags & 2 /* Ambient */) {
    flags ^= 2 /* Ambient */;
  }
  return flags;
}
function getTypeAnnotationFromAccessor(accessor) {
  if (accessor) {
    return accessor.kind === 176 /* GetAccessor */ ? accessor.type : accessor.parameters.length > 0 ? accessor.parameters[0].type : void 0;
  }
}
function canHaveLiteralInitializer(node) {
  switch (node.kind) {
    case 171 /* PropertyDeclaration */:
    case 170 /* PropertySignature */:
      return !hasEffectiveModifier(node, 8 /* Private */);
    case 168 /* Parameter */:
    case 259 /* VariableDeclaration */:
      return true;
  }
  return false;
}
function isPreservedDeclarationStatement(node) {
  switch (node.kind) {
    case 261 /* FunctionDeclaration */:
    case 266 /* ModuleDeclaration */:
    case 270 /* ImportEqualsDeclaration */:
    case 263 /* InterfaceDeclaration */:
    case 262 /* ClassDeclaration */:
    case 264 /* TypeAliasDeclaration */:
    case 265 /* EnumDeclaration */:
    case 242 /* VariableStatement */:
    case 271 /* ImportDeclaration */:
    case 277 /* ExportDeclaration */:
    case 276 /* ExportAssignment */:
      return true;
  }
  return false;
}
function isProcessedComponent(node) {
  switch (node.kind) {
    case 179 /* ConstructSignature */:
    case 175 /* Constructor */:
    case 173 /* MethodDeclaration */:
    case 176 /* GetAccessor */:
    case 177 /* SetAccessor */:
    case 171 /* PropertyDeclaration */:
    case 170 /* PropertySignature */:
    case 172 /* MethodSignature */:
    case 178 /* CallSignature */:
    case 180 /* IndexSignature */:
    case 259 /* VariableDeclaration */:
    case 167 /* TypeParameter */:
    case 232 /* ExpressionWithTypeArguments */:
    case 182 /* TypeReference */:
    case 193 /* ConditionalType */:
    case 183 /* FunctionType */:
    case 184 /* ConstructorType */:
    case 204 /* ImportType */:
      return true;
  }
  return false;
}

// src/compiler/transformer.ts
function getModuleTransformer(moduleKind) {
  switch (moduleKind) {
    case 99 /* ESNext */:
    case 7 /* ES2022 */:
    case 6 /* ES2020 */:
    case 5 /* ES2015 */:
      return transformECMAScriptModule;
    case 4 /* System */:
      return transformSystemModule;
    case 100 /* Node16 */:
    case 199 /* NodeNext */:
      return transformNodeModule;
    default:
      return transformModule;
  }
}
var noTransformers = { scriptTransformers: emptyArray, declarationTransformers: emptyArray };
function getTransformers(compilerOptions, customTransformers, emitOnly) {
  return {
    scriptTransformers: getScriptTransformers(compilerOptions, customTransformers, emitOnly),
    declarationTransformers: getDeclarationTransformers(customTransformers)
  };
}
function getScriptTransformers(compilerOptions, customTransformers, emitOnly) {
  if (emitOnly)
    return emptyArray;
  const languageVersion = getEmitScriptTarget(compilerOptions);
  const moduleKind = getEmitModuleKind(compilerOptions);
  const useDefineForClassFields = getUseDefineForClassFields(compilerOptions);
  const transformers = [];
  addRange(transformers, customTransformers && map(customTransformers.before, wrapScriptTransformerFactory));
  transformers.push(transformTypeScript);
  if (compilerOptions.experimentalDecorators) {
    transformers.push(transformLegacyDecorators);
  } else if (languageVersion < 99 /* ESNext */ || !useDefineForClassFields) {
    transformers.push(transformESDecorators);
  }
  transformers.push(transformClassFields);
  if (getJSXTransformEnabled(compilerOptions)) {
    transformers.push(transformJsx);
  }
  if (languageVersion < 99 /* ESNext */) {
    transformers.push(transformESNext);
  }
  if (languageVersion < 8 /* ES2021 */) {
    transformers.push(transformES2021);
  }
  if (languageVersion < 7 /* ES2020 */) {
    transformers.push(transformES2020);
  }
  if (languageVersion < 6 /* ES2019 */) {
    transformers.push(transformES2019);
  }
  if (languageVersion < 5 /* ES2018 */) {
    transformers.push(transformES2018);
  }
  if (languageVersion < 4 /* ES2017 */) {
    transformers.push(transformES2017);
  }
  if (languageVersion < 3 /* ES2016 */) {
    transformers.push(transformES2016);
  }
  if (languageVersion < 2 /* ES2015 */) {
    transformers.push(transformES2015);
    transformers.push(transformGenerators);
  }
  transformers.push(getModuleTransformer(moduleKind));
  if (languageVersion < 1 /* ES5 */) {
    transformers.push(transformES5);
  }
  addRange(transformers, customTransformers && map(customTransformers.after, wrapScriptTransformerFactory));
  return transformers;
}
function getDeclarationTransformers(customTransformers) {
  const transformers = [];
  transformers.push(transformDeclarations);
  addRange(transformers, customTransformers && map(customTransformers.afterDeclarations, wrapDeclarationTransformerFactory));
  return transformers;
}
function wrapCustomTransformer(transformer) {
  return (node) => isBundle(node) ? transformer.transformBundle(node) : transformer.transformSourceFile(node);
}
function wrapCustomTransformerFactory(transformer, handleDefault) {
  return (context) => {
    const customTransformer = transformer(context);
    return typeof customTransformer === "function" ? handleDefault(context, customTransformer) : wrapCustomTransformer(customTransformer);
  };
}
function wrapScriptTransformerFactory(transformer) {
  return wrapCustomTransformerFactory(transformer, chainBundle);
}
function wrapDeclarationTransformerFactory(transformer) {
  return wrapCustomTransformerFactory(transformer, (_, node) => node);
}
function noEmitSubstitution(_hint, node) {
  return node;
}
function noEmitNotification(hint, node, callback) {
  callback(hint, node);
}
function transformNodes(resolver, host, factory2, options, nodes, transformers, allowDtsFiles) {
  var _a, _b;
  const enabledSyntaxKindFeatures = new Array(362 /* Count */);
  let lexicalEnvironmentVariableDeclarations;
  let lexicalEnvironmentFunctionDeclarations;
  let lexicalEnvironmentStatements;
  let lexicalEnvironmentFlags = 0 /* None */;
  let lexicalEnvironmentVariableDeclarationsStack = [];
  let lexicalEnvironmentFunctionDeclarationsStack = [];
  let lexicalEnvironmentStatementsStack = [];
  let lexicalEnvironmentFlagsStack = [];
  let lexicalEnvironmentStackOffset = 0;
  let lexicalEnvironmentSuspended = false;
  let blockScopedVariableDeclarationsStack = [];
  let blockScopeStackOffset = 0;
  let blockScopedVariableDeclarations;
  let emitHelpers;
  let onSubstituteNode = noEmitSubstitution;
  let onEmitNode = noEmitNotification;
  let state = 0 /* Uninitialized */;
  const diagnostics = [];
  const context = {
    factory: factory2,
    getCompilerOptions: () => options,
    getEmitResolver: () => resolver,
    // TODO: GH#18217
    getEmitHost: () => host,
    // TODO: GH#18217
    getEmitHelperFactory: memoize(() => createEmitHelperFactory(context)),
    startLexicalEnvironment,
    suspendLexicalEnvironment,
    resumeLexicalEnvironment,
    endLexicalEnvironment,
    setLexicalEnvironmentFlags,
    getLexicalEnvironmentFlags,
    hoistVariableDeclaration,
    hoistFunctionDeclaration,
    addInitializationStatement,
    startBlockScope,
    endBlockScope,
    addBlockScopedVariable,
    requestEmitHelper,
    readEmitHelpers,
    enableSubstitution,
    enableEmitNotification,
    isSubstitutionEnabled,
    isEmitNotificationEnabled,
    get onSubstituteNode() {
      return onSubstituteNode;
    },
    set onSubstituteNode(value) {
      Debug.assert(state < 1 /* Initialized */, "Cannot modify transformation hooks after initialization has completed.");
      Debug.assert(value !== void 0, "Value must not be 'undefined'");
      onSubstituteNode = value;
    },
    get onEmitNode() {
      return onEmitNode;
    },
    set onEmitNode(value) {
      Debug.assert(state < 1 /* Initialized */, "Cannot modify transformation hooks after initialization has completed.");
      Debug.assert(value !== void 0, "Value must not be 'undefined'");
      onEmitNode = value;
    },
    addDiagnostic(diag2) {
      diagnostics.push(diag2);
    }
  };
  for (const node of nodes) {
    disposeEmitNodes(getSourceFileOfNode(getParseTreeNode(node)));
  }
  mark("beforeTransform");
  const transformersWithContext = transformers.map((t) => t(context));
  const transformation = (node) => {
    for (const transform of transformersWithContext) {
      node = transform(node);
    }
    return node;
  };
  state = 1 /* Initialized */;
  const transformed = [];
  for (const node of nodes) {
    (_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Emit, "transformNodes", node.kind === 311 /* SourceFile */ ? { path: node.path } : { kind: node.kind, pos: node.pos, end: node.end });
    transformed.push((allowDtsFiles ? transformation : transformRoot)(node));
    (_b = tracing) == null ? void 0 : _b.pop();
  }
  state = 2 /* Completed */;
  mark("afterTransform");
  measure("transformTime", "beforeTransform", "afterTransform");
  return {
    transformed,
    substituteNode,
    emitNodeWithNotification,
    isEmitNotificationEnabled,
    dispose,
    diagnostics
  };
  function transformRoot(node) {
    return node && (!isSourceFile(node) || !node.isDeclarationFile) ? transformation(node) : node;
  }
  function enableSubstitution(kind) {
    Debug.assert(state < 2 /* Completed */, "Cannot modify the transformation context after transformation has completed.");
    enabledSyntaxKindFeatures[kind] |= 1 /* Substitution */;
  }
  function isSubstitutionEnabled(node) {
    return (enabledSyntaxKindFeatures[node.kind] & 1 /* Substitution */) !== 0 && (getEmitFlags(node) & 8 /* NoSubstitution */) === 0;
  }
  function substituteNode(hint, node) {
    Debug.assert(state < 3 /* Disposed */, "Cannot substitute a node after the result is disposed.");
    return node && isSubstitutionEnabled(node) && onSubstituteNode(hint, node) || node;
  }
  function enableEmitNotification(kind) {
    Debug.assert(state < 2 /* Completed */, "Cannot modify the transformation context after transformation has completed.");
    enabledSyntaxKindFeatures[kind] |= 2 /* EmitNotifications */;
  }
  function isEmitNotificationEnabled(node) {
    return (enabledSyntaxKindFeatures[node.kind] & 2 /* EmitNotifications */) !== 0 || (getEmitFlags(node) & 4 /* AdviseOnEmitNode */) !== 0;
  }
  function emitNodeWithNotification(hint, node, emitCallback) {
    Debug.assert(state < 3 /* Disposed */, "Cannot invoke TransformationResult callbacks after the result is disposed.");
    if (node) {
      if (isEmitNotificationEnabled(node)) {
        onEmitNode(hint, node, emitCallback);
      } else {
        emitCallback(hint, node);
      }
    }
  }
  function hoistVariableDeclaration(name) {
    Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
    Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
    const decl = setEmitFlags(factory2.createVariableDeclaration(name), 128 /* NoNestedSourceMaps */);
    if (!lexicalEnvironmentVariableDeclarations) {
      lexicalEnvironmentVariableDeclarations = [decl];
    } else {
      lexicalEnvironmentVariableDeclarations.push(decl);
    }
    if (lexicalEnvironmentFlags & 1 /* InParameters */) {
      lexicalEnvironmentFlags |= 2 /* VariablesHoistedInParameters */;
    }
  }
  function hoistFunctionDeclaration(func) {
    Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
    Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
    setEmitFlags(func, 2097152 /* CustomPrologue */);
    if (!lexicalEnvironmentFunctionDeclarations) {
      lexicalEnvironmentFunctionDeclarations = [func];
    } else {
      lexicalEnvironmentFunctionDeclarations.push(func);
    }
  }
  function addInitializationStatement(node) {
    Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
    Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
    setEmitFlags(node, 2097152 /* CustomPrologue */);
    if (!lexicalEnvironmentStatements) {
      lexicalEnvironmentStatements = [node];
    } else {
      lexicalEnvironmentStatements.push(node);
    }
  }
  function startLexicalEnvironment() {
    Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
    Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
    Debug.assert(!lexicalEnvironmentSuspended, "Lexical environment is suspended.");
    lexicalEnvironmentVariableDeclarationsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentVariableDeclarations;
    lexicalEnvironmentFunctionDeclarationsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentFunctionDeclarations;
    lexicalEnvironmentStatementsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentStatements;
    lexicalEnvironmentFlagsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentFlags;
    lexicalEnvironmentStackOffset++;
    lexicalEnvironmentVariableDeclarations = void 0;
    lexicalEnvironmentFunctionDeclarations = void 0;
    lexicalEnvironmentStatements = void 0;
    lexicalEnvironmentFlags = 0 /* None */;
  }
  function suspendLexicalEnvironment() {
    Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
    Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
    Debug.assert(!lexicalEnvironmentSuspended, "Lexical environment is already suspended.");
    lexicalEnvironmentSuspended = true;
  }
  function resumeLexicalEnvironment() {
    Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
    Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
    Debug.assert(lexicalEnvironmentSuspended, "Lexical environment is not suspended.");
    lexicalEnvironmentSuspended = false;
  }
  function endLexicalEnvironment() {
    Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization.");
    Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed.");
    Debug.assert(!lexicalEnvironmentSuspended, "Lexical environment is suspended.");
    let statements;
    if (lexicalEnvironmentVariableDeclarations || lexicalEnvironmentFunctionDeclarations || lexicalEnvironmentStatements) {
      if (lexicalEnvironmentFunctionDeclarations) {
        statements = [...lexicalEnvironmentFunctionDeclarations];
      }
      if (lexicalEnvironmentVariableDeclarations) {
        const statement = factory2.createVariableStatement(
          /*modifiers*/
          void 0,
          factory2.createVariableDeclarationList(lexicalEnvironmentVariableDeclarations)
        );
        setEmitFlags(statement, 2097152 /* CustomPrologue */);
        if (!statements) {
          statements = [statement];
        } else {
          statements.push(statement);
        }
      }
      if (lexicalEnvironmentStatements) {
        if (!statements) {
          statements = [...lexicalEnvironmentStatements];
        } else {
          statements = [...statements, ...lexicalEnvironmentStatements];
        }
      }
    }
    lexicalEnvironmentStackOffset--;
    lexicalEnvironmentVariableDeclarations = lexicalEnvironmentVariableDeclarationsStack[lexicalEnvironmentStackOffset];
    lexicalEnvironmentFunctionDeclarations = lexicalEnvironmentFunctionDeclarationsStack[lexicalEnvironmentStackOffset];
    lexicalEnvironmentStatements = lexicalEnvironmentStatementsStack[lexicalEnvironmentStackOffset];
    lexicalEnvironmentFlags = lexicalEnvironmentFlagsStack[lexicalEnvironmentStackOffset];
    if (lexicalEnvironmentStackOffset === 0) {
      lexicalEnvironmentVariableDeclarationsStack = [];
      lexicalEnvironmentFunctionDeclarationsStack = [];
      lexicalEnvironmentStatementsStack = [];
      lexicalEnvironmentFlagsStack = [];
    }
    return statements;
  }
  function setLexicalEnvironmentFlags(flags, value) {
    lexicalEnvironmentFlags = value ? lexicalEnvironmentFlags | flags : lexicalEnvironmentFlags & ~flags;
  }
  function getLexicalEnvironmentFlags() {
    return lexicalEnvironmentFlags;
  }
  function startBlockScope() {
    Debug.assert(state > 0 /* Uninitialized */, "Cannot start a block scope during initialization.");
    Debug.assert(state < 2 /* Completed */, "Cannot start a block scope after transformation has completed.");
    blockScopedVariableDeclarationsStack[blockScopeStackOffset] = blockScopedVariableDeclarations;
    blockScopeStackOffset++;
    blockScopedVariableDeclarations = void 0;
  }
  function endBlockScope() {
    Debug.assert(state > 0 /* Uninitialized */, "Cannot end a block scope during initialization.");
    Debug.assert(state < 2 /* Completed */, "Cannot end a block scope after transformation has completed.");
    const statements = some(blockScopedVariableDeclarations) ? [
      factory2.createVariableStatement(
        /*modifiers*/
        void 0,
        factory2.createVariableDeclarationList(
          blockScopedVariableDeclarations.map((identifier) => factory2.createVariableDeclaration(identifier)),
          1 /* Let */
        )
      )
    ] : void 0;
    blockScopeStackOffset--;
    blockScopedVariableDeclarations = blockScopedVariableDeclarationsStack[blockScopeStackOffset];
    if (blockScopeStackOffset === 0) {
      blockScopedVariableDeclarationsStack = [];
    }
    return statements;
  }
  function addBlockScopedVariable(name) {
    Debug.assert(blockScopeStackOffset > 0, "Cannot add a block scoped variable outside of an iteration body.");
    (blockScopedVariableDeclarations || (blockScopedVariableDeclarations = [])).push(name);
  }
  function requestEmitHelper(helper) {
    Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the transformation context during initialization.");
    Debug.assert(state < 2 /* Completed */, "Cannot modify the transformation context after transformation has completed.");
    Debug.assert(!helper.scoped, "Cannot request a scoped emit helper.");
    if (helper.dependencies) {
      for (const h of helper.dependencies) {
        requestEmitHelper(h);
      }
    }
    emitHelpers = append(emitHelpers, helper);
  }
  function readEmitHelpers() {
    Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the transformation context during initialization.");
    Debug.assert(state < 2 /* Completed */, "Cannot modify the transformation context after transformation has completed.");
    const helpers = emitHelpers;
    emitHelpers = void 0;
    return helpers;
  }
  function dispose() {
    if (state < 3 /* Disposed */) {
      for (const node of nodes) {
        disposeEmitNodes(getSourceFileOfNode(getParseTreeNode(node)));
      }
      lexicalEnvironmentVariableDeclarations = void 0;
      lexicalEnvironmentVariableDeclarationsStack = void 0;
      lexicalEnvironmentFunctionDeclarations = void 0;
      lexicalEnvironmentFunctionDeclarationsStack = void 0;
      onSubstituteNode = void 0;
      onEmitNode = void 0;
      emitHelpers = void 0;
      state = 3 /* Disposed */;
    }
  }
}
var nullTransformationContext = {
  factory,
  // eslint-disable-line object-shorthand
  getCompilerOptions: () => ({}),
  getEmitResolver: notImplemented,
  getEmitHost: notImplemented,
  getEmitHelperFactory: notImplemented,
  startLexicalEnvironment: noop,
  resumeLexicalEnvironment: noop,
  suspendLexicalEnvironment: noop,
  endLexicalEnvironment: returnUndefined,
  setLexicalEnvironmentFlags: noop,
  getLexicalEnvironmentFlags: () => 0,
  hoistVariableDeclaration: noop,
  hoistFunctionDeclaration: noop,
  addInitializationStatement: noop,
  startBlockScope: noop,
  endBlockScope: returnUndefined,
  addBlockScopedVariable: noop,
  requestEmitHelper: noop,
  readEmitHelpers: notImplemented,
  enableSubstitution: noop,
  enableEmitNotification: noop,
  isSubstitutionEnabled: notImplemented,
  isEmitNotificationEnabled: notImplemented,
  onSubstituteNode: noEmitSubstitution,
  onEmitNode: noEmitNotification,
  addDiagnostic: noop
};

// src/compiler/emitter.ts
var brackets = createBracketsMap();
function isBuildInfoFile(file) {
  return fileExtensionIs(file, ".tsbuildinfo" /* TsBuildInfo */);
}
function forEachEmittedFile(host, action, sourceFilesOrTargetSourceFile, forceDtsEmit = false, onlyBuildInfo, includeBuildInfo) {
  const sourceFiles = isArray(sourceFilesOrTargetSourceFile) ? sourceFilesOrTargetSourceFile : getSourceFilesToEmit(host, sourceFilesOrTargetSourceFile, forceDtsEmit);
  const options = host.getCompilerOptions();
  if (outFile(options)) {
    const prepends = host.getPrependNodes();
    if (sourceFiles.length || prepends.length) {
      const bundle = factory.createBundle(sourceFiles, prepends);
      const result = action(getOutputPathsFor(bundle, host, forceDtsEmit), bundle);
      if (result) {
        return result;
      }
    }
  } else {
    if (!onlyBuildInfo) {
      for (const sourceFile of sourceFiles) {
        const result = action(getOutputPathsFor(sourceFile, host, forceDtsEmit), sourceFile);
        if (result) {
          return result;
        }
      }
    }
    if (includeBuildInfo) {
      const buildInfoPath = getTsBuildInfoEmitOutputFilePath(options);
      if (buildInfoPath)
        return action(
          { buildInfoPath },
          /*sourceFileOrBundle*/
          void 0
        );
    }
  }
}
function getTsBuildInfoEmitOutputFilePath(options) {
  const configFile = options.configFilePath;
  if (!isIncrementalCompilation(options))
    return void 0;
  if (options.tsBuildInfoFile)
    return options.tsBuildInfoFile;
  const outPath = outFile(options);
  let buildInfoExtensionLess;
  if (outPath) {
    buildInfoExtensionLess = removeFileExtension(outPath);
  } else {
    if (!configFile)
      return void 0;
    const configFileExtensionLess = removeFileExtension(configFile);
    buildInfoExtensionLess = options.outDir ? options.rootDir ? resolvePath(options.outDir, getRelativePathFromDirectory(
      options.rootDir,
      configFileExtensionLess,
      /*ignoreCase*/
      true
    )) : combinePaths(options.outDir, getBaseFileName(configFileExtensionLess)) : configFileExtensionLess;
  }
  return buildInfoExtensionLess + ".tsbuildinfo" /* TsBuildInfo */;
}
function getOutputPathsForBundle(options, forceDtsPaths) {
  const outPath = outFile(options);
  const jsFilePath = options.emitDeclarationOnly ? void 0 : outPath;
  const sourceMapFilePath = jsFilePath && getSourceMapFilePath(jsFilePath, options);
  const declarationFilePath = forceDtsPaths || getEmitDeclarations(options) ? removeFileExtension(outPath) + ".d.ts" /* Dts */ : void 0;
  const declarationMapPath = declarationFilePath && getAreDeclarationMapsEnabled(options) ? declarationFilePath + ".map" : void 0;
  const buildInfoPath = getTsBuildInfoEmitOutputFilePath(options);
  return { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath };
}
function getOutputPathsFor(sourceFile, host, forceDtsPaths) {
  const options = host.getCompilerOptions();
  if (sourceFile.kind === 312 /* Bundle */) {
    return getOutputPathsForBundle(options, forceDtsPaths);
  } else {
    const ownOutputFilePath = getOwnEmitOutputFilePath(sourceFile.fileName, host, getOutputExtension(sourceFile.fileName, options));
    const isJsonFile = isJsonSourceFile(sourceFile);
    const isJsonEmittedToSameLocation = isJsonFile && comparePaths(sourceFile.fileName, ownOutputFilePath, host.getCurrentDirectory(), !host.useCaseSensitiveFileNames()) === 0 /* EqualTo */;
    const jsFilePath = options.emitDeclarationOnly || isJsonEmittedToSameLocation ? void 0 : ownOutputFilePath;
    const sourceMapFilePath = !jsFilePath || isJsonSourceFile(sourceFile) ? void 0 : getSourceMapFilePath(jsFilePath, options);
    const declarationFilePath = forceDtsPaths || getEmitDeclarations(options) && !isJsonFile ? getDeclarationEmitOutputFilePath(sourceFile.fileName, host) : void 0;
    const declarationMapPath = declarationFilePath && getAreDeclarationMapsEnabled(options) ? declarationFilePath + ".map" : void 0;
    return { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath: void 0 };
  }
}
function getSourceMapFilePath(jsFilePath, options) {
  return options.sourceMap && !options.inlineSourceMap ? jsFilePath + ".map" : void 0;
}
function getOutputExtension(fileName, options) {
  return fileExtensionIs(fileName, ".json" /* Json */) ? ".json" /* Json */ : options.jsx === 1 /* Preserve */ && fileExtensionIsOneOf(fileName, [".jsx" /* Jsx */, ".tsx" /* Tsx */]) ? ".jsx" /* Jsx */ : fileExtensionIsOneOf(fileName, [".mts" /* Mts */, ".mjs" /* Mjs */]) ? ".mjs" /* Mjs */ : fileExtensionIsOneOf(fileName, [".cts" /* Cts */, ".cjs" /* Cjs */]) ? ".cjs" /* Cjs */ : ".js" /* Js */;
}
function getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, outputDir, getCommonSourceDirectory2) {
  return outputDir ? resolvePath(
    outputDir,
    getRelativePathFromDirectory(getCommonSourceDirectory2 ? getCommonSourceDirectory2() : getCommonSourceDirectoryOfConfig(configFile, ignoreCase), inputFileName, ignoreCase)
  ) : inputFileName;
}
function getOutputDeclarationFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2) {
  return changeExtension(
    getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, configFile.options.declarationDir || configFile.options.outDir, getCommonSourceDirectory2),
    getDeclarationEmitExtensionForPath(inputFileName)
  );
}
function getOutputJSFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2) {
  if (configFile.options.emitDeclarationOnly)
    return void 0;
  const isJsonFile = fileExtensionIs(inputFileName, ".json" /* Json */);
  const outputFileName = changeExtension(
    getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, configFile.options.outDir, getCommonSourceDirectory2),
    getOutputExtension(inputFileName, configFile.options)
  );
  return !isJsonFile || comparePaths(inputFileName, outputFileName, Debug.checkDefined(configFile.options.configFilePath), ignoreCase) !== 0 /* EqualTo */ ? outputFileName : void 0;
}
function createAddOutput() {
  let outputs;
  return { addOutput, getOutputs };
  function addOutput(path) {
    if (path) {
      (outputs || (outputs = [])).push(path);
    }
  }
  function getOutputs() {
    return outputs || emptyArray;
  }
}
function getSingleOutputFileNames(configFile, addOutput) {
  const { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath } = getOutputPathsForBundle(
    configFile.options,
    /*forceDtsPaths*/
    false
  );
  addOutput(jsFilePath);
  addOutput(sourceMapFilePath);
  addOutput(declarationFilePath);
  addOutput(declarationMapPath);
  addOutput(buildInfoPath);
}
function getOwnOutputFileNames(configFile, inputFileName, ignoreCase, addOutput, getCommonSourceDirectory2) {
  if (isDeclarationFileName(inputFileName))
    return;
  const js = getOutputJSFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2);
  addOutput(js);
  if (fileExtensionIs(inputFileName, ".json" /* Json */))
    return;
  if (js && configFile.options.sourceMap) {
    addOutput(`${js}.map`);
  }
  if (getEmitDeclarations(configFile.options)) {
    const dts = getOutputDeclarationFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2);
    addOutput(dts);
    if (configFile.options.declarationMap) {
      addOutput(`${dts}.map`);
    }
  }
}
function getCommonSourceDirectory(options, emittedFiles, currentDirectory, getCanonicalFileName, checkSourceFilesBelongToPath) {
  let commonSourceDirectory;
  if (options.rootDir) {
    commonSourceDirectory = getNormalizedAbsolutePath(options.rootDir, currentDirectory);
    checkSourceFilesBelongToPath == null ? void 0 : checkSourceFilesBelongToPath(options.rootDir);
  } else if (options.composite && options.configFilePath) {
    commonSourceDirectory = getDirectoryPath(normalizeSlashes(options.configFilePath));
    checkSourceFilesBelongToPath == null ? void 0 : checkSourceFilesBelongToPath(commonSourceDirectory);
  } else {
    commonSourceDirectory = computeCommonSourceDirectoryOfFilenames(emittedFiles(), currentDirectory, getCanonicalFileName);
  }
  if (commonSourceDirectory && commonSourceDirectory[commonSourceDirectory.length - 1] !== directorySeparator) {
    commonSourceDirectory += directorySeparator;
  }
  return commonSourceDirectory;
}
function getCommonSourceDirectoryOfConfig({ options, fileNames }, ignoreCase) {
  return getCommonSourceDirectory(
    options,
    () => filter(fileNames, (file) => !(options.noEmitForJsFiles && fileExtensionIsOneOf(file, supportedJSExtensionsFlat)) && !isDeclarationFileName(file)),
    getDirectoryPath(normalizeSlashes(Debug.checkDefined(options.configFilePath))),
    createGetCanonicalFileName(!ignoreCase)
  );
}
function getAllProjectOutputs(configFile, ignoreCase) {
  const { addOutput, getOutputs } = createAddOutput();
  if (outFile(configFile.options)) {
    getSingleOutputFileNames(configFile, addOutput);
  } else {
    const getCommonSourceDirectory2 = memoize(() => getCommonSourceDirectoryOfConfig(configFile, ignoreCase));
    for (const inputFileName of configFile.fileNames) {
      getOwnOutputFileNames(configFile, inputFileName, ignoreCase, addOutput, getCommonSourceDirectory2);
    }
    addOutput(getTsBuildInfoEmitOutputFilePath(configFile.options));
  }
  return getOutputs();
}
function getFirstProjectOutput(configFile, ignoreCase) {
  if (outFile(configFile.options)) {
    const { jsFilePath, declarationFilePath } = getOutputPathsForBundle(
      configFile.options,
      /*forceDtsPaths*/
      false
    );
    return Debug.checkDefined(jsFilePath || declarationFilePath, `project ${configFile.options.configFilePath} expected to have at least one output`);
  }
  const getCommonSourceDirectory2 = memoize(() => getCommonSourceDirectoryOfConfig(configFile, ignoreCase));
  for (const inputFileName of configFile.fileNames) {
    if (isDeclarationFileName(inputFileName))
      continue;
    const jsFilePath = getOutputJSFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2);
    if (jsFilePath)
      return jsFilePath;
    if (fileExtensionIs(inputFileName, ".json" /* Json */))
      continue;
    if (getEmitDeclarations(configFile.options)) {
      return getOutputDeclarationFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2);
    }
  }
  const buildInfoPath = getTsBuildInfoEmitOutputFilePath(configFile.options);
  if (buildInfoPath)
    return buildInfoPath;
  return Debug.fail(`project ${configFile.options.configFilePath} expected to have at least one output`);
}
function emitFiles(resolver, host, targetSourceFile, { scriptTransformers, declarationTransformers }, emitOnly, onlyBuildInfo, forceDtsEmit) {
  var compilerOptions = host.getCompilerOptions();
  var sourceMapDataList = compilerOptions.sourceMap || compilerOptions.inlineSourceMap || getAreDeclarationMapsEnabled(compilerOptions) ? [] : void 0;
  var emittedFilesList = compilerOptions.listEmittedFiles ? [] : void 0;
  var emitterDiagnostics = createDiagnosticCollection();
  var newLine = getNewLineCharacter(compilerOptions);
  var writer = createTextWriter(newLine);
  var { enter, exit } = createTimer("printTime", "beforePrint", "afterPrint");
  var bundleBuildInfo;
  var emitSkipped = false;
  enter();
  forEachEmittedFile(
    host,
    emitSourceFileOrBundle,
    getSourceFilesToEmit(host, targetSourceFile, forceDtsEmit),
    forceDtsEmit,
    onlyBuildInfo,
    !targetSourceFile
  );
  exit();
  return {
    emitSkipped,
    diagnostics: emitterDiagnostics.getDiagnostics(),
    emittedFiles: emittedFilesList,
    sourceMaps: sourceMapDataList
  };
  function emitSourceFileOrBundle({ jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath }, sourceFileOrBundle) {
    var _a, _b, _c, _d, _e, _f;
    let buildInfoDirectory;
    if (buildInfoPath && sourceFileOrBundle && isBundle(sourceFileOrBundle)) {
      buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory()));
      bundleBuildInfo = {
        commonSourceDirectory: relativeToBuildInfo(host.getCommonSourceDirectory()),
        sourceFiles: sourceFileOrBundle.sourceFiles.map((file) => relativeToBuildInfo(getNormalizedAbsolutePath(file.fileName, host.getCurrentDirectory())))
      };
    }
    (_a = tracing) == null ? void 0 : _a.push(tracing.Phase.Emit, "emitJsFileOrBundle", { jsFilePath });
    emitJsFileOrBundle(sourceFileOrBundle, jsFilePath, sourceMapFilePath, relativeToBuildInfo);
    (_b = tracing) == null ? void 0 : _b.pop();
    (_c = tracing) == null ? void 0 : _c.push(tracing.Phase.Emit, "emitDeclarationFileOrBundle", { declarationFilePath });
    emitDeclarationFileOrBundle(sourceFileOrBundle, declarationFilePath, declarationMapPath, relativeToBuildInfo);
    (_d = tracing) == null ? void 0 : _d.pop();
    (_e = tracing) == null ? void 0 : _e.push(tracing.Phase.Emit, "emitBuildInfo", { buildInfoPath });
    emitBuildInfo(bundleBuildInfo, buildInfoPath);
    (_f = tracing) == null ? void 0 : _f.pop();
    if (!emitSkipped && emittedFilesList) {
      if (!emitOnly) {
        if (jsFilePath) {
          emittedFilesList.push(jsFilePath);
        }
        if (sourceMapFilePath) {
          emittedFilesList.push(sourceMapFilePath);
        }
        if (buildInfoPath) {
          emittedFilesList.push(buildInfoPath);
        }
      }
      if (emitOnly !== 0 /* Js */) {
        if (declarationFilePath) {
          emittedFilesList.push(declarationFilePath);
        }
        if (declarationMapPath) {
          emittedFilesList.push(declarationMapPath);
        }
      }
    }
    function relativeToBuildInfo(path) {
      return ensurePathIsNonModuleName(getRelativePathFromDirectory(buildInfoDirectory, path, host.getCanonicalFileName));
    }
  }
  function emitBuildInfo(bundle, buildInfoPath) {
    if (!buildInfoPath || targetSourceFile || emitSkipped)
      return;
    if (host.isEmitBlocked(buildInfoPath)) {
      emitSkipped = true;
      return;
    }
    const buildInfo = host.getBuildInfo(bundle) || createBuildInfo(
      /*program*/
      void 0,
      bundle
    );
    writeFile(
      host,
      emitterDiagnostics,
      buildInfoPath,
      getBuildInfoText(buildInfo),
      /*writeByteOrderMark*/
      false,
      /*sourceFiles*/
      void 0,
      { buildInfo }
    );
  }
  function emitJsFileOrBundle(sourceFileOrBundle, jsFilePath, sourceMapFilePath, relativeToBuildInfo) {
    if (!sourceFileOrBundle || emitOnly || !jsFilePath) {
      return;
    }
    if (host.isEmitBlocked(jsFilePath) || compilerOptions.noEmit) {
      emitSkipped = true;
      return;
    }
    const transform = transformNodes(
      resolver,
      host,
      factory,
      compilerOptions,
      [sourceFileOrBundle],
      scriptTransformers,
      /*allowDtsFiles*/
      false
    );
    const printerOptions = {
      removeComments: compilerOptions.removeComments,
      newLine: compilerOptions.newLine,
      noEmitHelpers: compilerOptions.noEmitHelpers,
      module: compilerOptions.module,
      target: compilerOptions.target,
      sourceMap: compilerOptions.sourceMap,
      inlineSourceMap: compilerOptions.inlineSourceMap,
      inlineSources: compilerOptions.inlineSources,
      extendedDiagnostics: compilerOptions.extendedDiagnostics,
      writeBundleFileInfo: !!bundleBuildInfo,
      relativeToBuildInfo
    };
    const printer = createPrinter(printerOptions, {
      // resolver hooks
      hasGlobalName: resolver.hasGlobalName,
      // transform hooks
      onEmitNode: transform.emitNodeWithNotification,
      isEmitNotificationEnabled: transform.isEmitNotificationEnabled,
      substituteNode: transform.substituteNode
    });
    Debug.assert(transform.transformed.length === 1, "Should only see one output from the transform");
    printSourceFileOrBundle(jsFilePath, sourceMapFilePath, transform, printer, compilerOptions);
    transform.dispose();
    if (bundleBuildInfo)
      bundleBuildInfo.js = printer.bundleFileInfo;
  }
  function emitDeclarationFileOrBundle(sourceFileOrBundle, declarationFilePath, declarationMapPath, relativeToBuildInfo) {
    if (!sourceFileOrBundle || emitOnly === 0 /* Js */)
      return;
    if (!declarationFilePath) {
      if (emitOnly || compilerOptions.emitDeclarationOnly)
        emitSkipped = true;
      return;
    }
    const sourceFiles = isSourceFile(sourceFileOrBundle) ? [sourceFileOrBundle] : sourceFileOrBundle.sourceFiles;
    const filesForEmit = forceDtsEmit ? sourceFiles : filter(sourceFiles, isSourceFileNotJson);
    const inputListOrBundle = outFile(compilerOptions) ? [factory.createBundle(filesForEmit, !isSourceFile(sourceFileOrBundle) ? sourceFileOrBundle.prepends : void 0)] : filesForEmit;
    if (emitOnly && !getEmitDeclarations(compilerOptions)) {
      filesForEmit.forEach(collectLinkedAliases);
    }
    const declarationTransform = transformNodes(
      resolver,
      host,
      factory,
      compilerOptions,
      inputListOrBundle,
      declarationTransformers,
      /*allowDtsFiles*/
      false
    );
    if (length(declarationTransform.diagnostics)) {
      for (const diagnostic of declarationTransform.diagnostics) {
        emitterDiagnostics.add(diagnostic);
      }
    }
    const printerOptions = {
      removeComments: compilerOptions.removeComments,
      newLine: compilerOptions.newLine,
      noEmitHelpers: true,
      module: compilerOptions.module,
      target: compilerOptions.target,
      sourceMap: !forceDtsEmit && compilerOptions.declarationMap,
      inlineSourceMap: compilerOptions.inlineSourceMap,
      extendedDiagnostics: compilerOptions.extendedDiagnostics,
      onlyPrintJsDocStyle: true,
      writeBundleFileInfo: !!bundleBuildInfo,
      recordInternalSection: !!bundleBuildInfo,
      relativeToBuildInfo
    };
    const declarationPrinter = createPrinter(printerOptions, {
      // resolver hooks
      hasGlobalName: resolver.hasGlobalName,
      // transform hooks
      onEmitNode: declarationTransform.emitNodeWithNotification,
      isEmitNotificationEnabled: declarationTransform.isEmitNotificationEnabled,
      substituteNode: declarationTransform.substituteNode
    });
    const declBlocked = !!declarationTransform.diagnostics && !!declarationTransform.diagnostics.length || !!host.isEmitBlocked(declarationFilePath) || !!compilerOptions.noEmit;
    emitSkipped = emitSkipped || declBlocked;
    if (!declBlocked || forceDtsEmit) {
      Debug.assert(declarationTransform.transformed.length === 1, "Should only see one output from the decl transform");
      printSourceFileOrBundle(
        declarationFilePath,
        declarationMapPath,
        declarationTransform,
        declarationPrinter,
        {
          sourceMap: printerOptions.sourceMap,
          sourceRoot: compilerOptions.sourceRoot,
          mapRoot: compilerOptions.mapRoot,
          extendedDiagnostics: compilerOptions.extendedDiagnostics
          // Explicitly do not passthru either `inline` option
        }
      );
    }
    declarationTransform.dispose();
    if (bundleBuildInfo)
      bundleBuildInfo.dts = declarationPrinter.bundleFileInfo;
  }
  function collectLinkedAliases(node) {
    if (isExportAssignment(node)) {
      if (node.expression.kind === 80 /* Identifier */) {
        resolver.collectLinkedAliases(
          node.expression,
          /*setVisibility*/
          true
        );
      }
      return;
    } else if (isExportSpecifier(node)) {
      resolver.collectLinkedAliases(
        node.propertyName || node.name,
        /*setVisibility*/
        true
      );
      return;
    }
    forEachChild(node, collectLinkedAliases);
  }
  function printSourceFileOrBundle(jsFilePath, sourceMapFilePath, transform, printer, mapOptions) {
    const sourceFileOrBundle = transform.transformed[0];
    const bundle = sourceFileOrBundle.kind === 312 /* Bundle */ ? sourceFileOrBundle : void 0;
    const sourceFile = sourceFileOrBundle.kind === 311 /* SourceFile */ ? sourceFileOrBundle : void 0;
    const sourceFiles = bundle ? bundle.sourceFiles : [sourceFile];
    let sourceMapGenerator;
    if (shouldEmitSourceMaps(mapOptions, sourceFileOrBundle)) {
      sourceMapGenerator = createSourceMapGenerator(
        host,
        getBaseFileName(normalizeSlashes(jsFilePath)),
        getSourceRoot(mapOptions),
        getSourceMapDirectory(mapOptions, jsFilePath, sourceFile),
        mapOptions
      );
    }
    if (bundle) {
      printer.writeBundle(bundle, writer, sourceMapGenerator);
    } else {
      printer.writeFile(sourceFile, writer, sourceMapGenerator);
    }
    let sourceMapUrlPos;
    if (sourceMapGenerator) {
      if (sourceMapDataList) {
        sourceMapDataList.push({
          inputSourceFileNames: sourceMapGenerator.getSources(),
          sourceMap: sourceMapGenerator.toJSON()
        });
      }
      const sourceMappingURL = getSourceMappingURL(
        mapOptions,
        sourceMapGenerator,
        jsFilePath,
        sourceMapFilePath,
        sourceFile
      );
      if (sourceMappingURL) {
        if (!writer.isAtStartOfLine())
          writer.rawWrite(newLine);
        sourceMapUrlPos = writer.getTextPos();
        writer.writeComment(`//# ${"sourceMappingURL"}=${sourceMappingURL}`);
      }
      if (sourceMapFilePath) {
        const sourceMap = sourceMapGenerator.toString();
        writeFile(
          host,
          emitterDiagnostics,
          sourceMapFilePath,
          sourceMap,
          /*writeByteOrderMark*/
          false,
          sourceFiles
        );
        if (printer.bundleFileInfo)
          printer.bundleFileInfo.mapHash = computeSignature(sourceMap, host);
      }
    } else {
      writer.writeLine();
    }
    const text = writer.getText();
    writeFile(host, emitterDiagnostics, jsFilePath, text, !!compilerOptions.emitBOM, sourceFiles, { sourceMapUrlPos, diagnostics: transform.diagnostics });
    if (printer.bundleFileInfo)
      printer.bundleFileInfo.hash = computeSignature(text, host);
    writer.clear();
  }
  function shouldEmitSourceMaps(mapOptions, sourceFileOrBundle) {
    return (mapOptions.sourceMap || mapOptions.inlineSourceMap) && (sourceFileOrBundle.kind !== 311 /* SourceFile */ || !fileExtensionIs(sourceFileOrBundle.fileName, ".json" /* Json */));
  }
  function getSourceRoot(mapOptions) {
    const sourceRoot = normalizeSlashes(mapOptions.sourceRoot || "");
    return sourceRoot ? ensureTrailingDirectorySeparator(sourceRoot) : sourceRoot;
  }
  function getSourceMapDirectory(mapOptions, filePath, sourceFile) {
    if (mapOptions.sourceRoot)
      return host.getCommonSourceDirectory();
    if (mapOptions.mapRoot) {
      let sourceMapDir = normalizeSlashes(mapOptions.mapRoot);
      if (sourceFile) {
        sourceMapDir = getDirectoryPath(getSourceFilePathInNewDir(sourceFile.fileName, host, sourceMapDir));
      }
      if (getRootLength(sourceMapDir) === 0) {
        sourceMapDir = combinePaths(host.getCommonSourceDirectory(), sourceMapDir);
      }
      return sourceMapDir;
    }
    return getDirectoryPath(normalizePath(filePath));
  }
  function getSourceMappingURL(mapOptions, sourceMapGenerator, filePath, sourceMapFilePath, sourceFile) {
    if (mapOptions.inlineSourceMap) {
      const sourceMapText = sourceMapGenerator.toString();
      const base64SourceMapText = base64encode(sys, sourceMapText);
      return `data:application/json;base64,${base64SourceMapText}`;
    }
    const sourceMapFile = getBaseFileName(normalizeSlashes(Debug.checkDefined(sourceMapFilePath)));
    if (mapOptions.mapRoot) {
      let sourceMapDir = normalizeSlashes(mapOptions.mapRoot);
      if (sourceFile) {
        sourceMapDir = getDirectoryPath(getSourceFilePathInNewDir(sourceFile.fileName, host, sourceMapDir));
      }
      if (getRootLength(sourceMapDir) === 0) {
        sourceMapDir = combinePaths(host.getCommonSourceDirectory(), sourceMapDir);
        return encodeURI(
          getRelativePathToDirectoryOrUrl(
            getDirectoryPath(normalizePath(filePath)),
            // get the relative sourceMapDir path based on jsFilePath
            combinePaths(sourceMapDir, sourceMapFile),
            // this is where user expects to see sourceMap
            host.getCurrentDirectory(),
            host.getCanonicalFileName,
            /*isAbsolutePathAnUrl*/
            true
          )
        );
      } else {
        return encodeURI(combinePaths(sourceMapDir, sourceMapFile));
      }
    }
    return encodeURI(sourceMapFile);
  }
}
function createBuildInfo(program, bundle) {
  return { bundle, program, version };
}
function getBuildInfoText(buildInfo) {
  return JSON.stringify(buildInfo);
}
function getBuildInfo(buildInfoFile, buildInfoText) {
  return readJsonOrUndefined(buildInfoFile, buildInfoText);
}
var notImplementedResolver = {
  hasGlobalName: notImplemented,
  getReferencedExportContainer: notImplemented,
  getReferencedImportDeclaration: notImplemented,
  getReferencedDeclarationWithCollidingName: notImplemented,
  isDeclarationWithCollidingName: notImplemented,
  isValueAliasDeclaration: notImplemented,
  isReferencedAliasDeclaration: notImplemented,
  isTopLevelValueImportEqualsWithEntityName: notImplemented,
  getNodeCheckFlags: notImplemented,
  isDeclarationVisible: notImplemented,
  isLateBound: (_node) => false,
  collectLinkedAliases: notImplemented,
  isImplementationOfOverload: notImplemented,
  isRequiredInitializedParameter: notImplemented,
  isOptionalUninitializedParameterProperty: notImplemented,
  isExpandoFunctionDeclaration: notImplemented,
  getPropertiesOfContainerFunction: notImplemented,
  createTypeOfDeclaration: notImplemented,
  createReturnTypeOfSignatureDeclaration: notImplemented,
  createTypeOfExpression: notImplemented,
  createLiteralConstValue: notImplemented,
  isSymbolAccessible: notImplemented,
  isEntityNameVisible: notImplemented,
  // Returns the constant value this property access resolves to: notImplemented, or 'undefined' for a non-constant
  getConstantValue: notImplemented,
  getReferencedValueDeclaration: notImplemented,
  getReferencedValueDeclarations: notImplemented,
  getTypeReferenceSerializationKind: notImplemented,
  isOptionalParameter: notImplemented,
  moduleExportsSomeValue: notImplemented,
  isArgumentsLocalBinding: notImplemented,
  getExternalModuleFileFromDeclaration: notImplemented,
  getTypeReferenceDirectivesForEntityName: notImplemented,
  getTypeReferenceDirectivesForSymbol: notImplemented,
  isLiteralConstDeclaration: notImplemented,
  getJsxFactoryEntity: notImplemented,
  getJsxFragmentFactoryEntity: notImplemented,
  getAllAccessorDeclarations: notImplemented,
  getSymbolOfExternalModuleSpecifier: notImplemented,
  isBindingCapturedByNode: notImplemented,
  getDeclarationStatementsForSourceFile: notImplemented,
  isImportRequiredByAugmentation: notImplemented
};
function createSourceFilesFromBundleBuildInfo(bundle, buildInfoDirectory, host) {
  var _a;
  const jsBundle = Debug.checkDefined(bundle.js);
  const prologueMap = ((_a = jsBundle.sources) == null ? void 0 : _a.prologues) && arrayToMap(jsBundle.sources.prologues, (prologueInfo) => prologueInfo.file);
  return bundle.sourceFiles.map((fileName, index) => {
    const prologueInfo = prologueMap == null ? void 0 : prologueMap.get(index);
    const statements = prologueInfo == null ? void 0 : prologueInfo.directives.map((directive) => {
      const literal = setTextRange(factory.createStringLiteral(directive.expression.text), directive.expression);
      const statement = setTextRange(factory.createExpressionStatement(literal), directive);
      setParent(literal, statement);
      return statement;
    });
    const eofToken = factory.createToken(1 /* EndOfFileToken */);
    const sourceFile = factory.createSourceFile(statements ?? [], eofToken, 0 /* None */);
    sourceFile.fileName = getRelativePathFromDirectory(
      host.getCurrentDirectory(),
      getNormalizedAbsolutePath(fileName, buildInfoDirectory),
      !host.useCaseSensitiveFileNames()
    );
    sourceFile.text = (prologueInfo == null ? void 0 : prologueInfo.text) ?? "";
    setTextRangePosWidth(sourceFile, 0, (prologueInfo == null ? void 0 : prologueInfo.text.length) ?? 0);
    setEachParent(sourceFile.statements, sourceFile);
    setTextRangePosWidth(eofToken, sourceFile.end, 0);
    setParent(eofToken, sourceFile);
    return sourceFile;
  });
}
function emitUsingBuildInfo(config, host, getCommandLine, customTransformers) {
  var _a, _b;
  (_a = tracing) == null ? void 0 : _a.push(
    tracing.Phase.Emit,
    "emitUsingBuildInfo",
    {},
    /*separateBeginAndEnd*/
    true
  );
  mark("beforeEmit");
  const result = emitUsingBuildInfoWorker(config, host, getCommandLine, customTransformers);
  mark("afterEmit");
  measure("Emit", "beforeEmit", "afterEmit");
  (_b = tracing) == null ? void 0 : _b.pop();
  return result;
}
function emitUsingBuildInfoWorker(config, host, getCommandLine, customTransformers) {
  const { buildInfoPath, jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath } = getOutputPathsForBundle(
    config.options,
    /*forceDtsPaths*/
    false
  );
  const buildInfo = host.getBuildInfo(buildInfoPath, config.options.configFilePath);
  if (!buildInfo)
    return buildInfoPath;
  if (!buildInfo.bundle || !buildInfo.bundle.js || declarationFilePath && !buildInfo.bundle.dts)
    return buildInfoPath;
  const jsFileText = host.readFile(Debug.checkDefined(jsFilePath));
  if (!jsFileText)
    return jsFilePath;
  if (computeSignature(jsFileText, host) !== buildInfo.bundle.js.hash)
    return jsFilePath;
  const sourceMapText = sourceMapFilePath && host.readFile(sourceMapFilePath);
  if (sourceMapFilePath && !sourceMapText || config.options.inlineSourceMap)
    return sourceMapFilePath || "inline sourcemap decoding";
  if (sourceMapFilePath && computeSignature(sourceMapText, host) !== buildInfo.bundle.js.mapHash)
    return sourceMapFilePath;
  const declarationText = declarationFilePath && host.readFile(declarationFilePath);
  if (declarationFilePath && !declarationText)
    return declarationFilePath;
  if (declarationFilePath && computeSignature(declarationText, host) !== buildInfo.bundle.dts.hash)
    return declarationFilePath;
  const declarationMapText = declarationMapPath && host.readFile(declarationMapPath);
  if (declarationMapPath && !declarationMapText || config.options.inlineSourceMap)
    return declarationMapPath || "inline sourcemap decoding";
  if (declarationMapPath && computeSignature(declarationMapText, host) !== buildInfo.bundle.dts.mapHash)
    return declarationMapPath;
  const buildInfoDirectory = getDirectoryPath(getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory()));
  const ownPrependInput = createInputFilesWithFileTexts(
    jsFilePath,
    jsFileText,
    sourceMapFilePath,
    sourceMapText,
    declarationFilePath,
    declarationText,
    declarationMapPath,
    declarationMapText,
    buildInfoPath,
    buildInfo,
    /*oldFileOfCurrentEmit*/
    true
  );
  const outputFiles = [];
  const prependNodes = createPrependNodes(config.projectReferences, getCommandLine, (f) => host.readFile(f), host);
  const sourceFilesForJsEmit = createSourceFilesFromBundleBuildInfo(buildInfo.bundle, buildInfoDirectory, host);
  let changedDtsText;
  let changedDtsData;
  const emitHost = {
    getPrependNodes: memoize(() => [...prependNodes, ownPrependInput]),
    getCanonicalFileName: host.getCanonicalFileName,
    getCommonSourceDirectory: () => getNormalizedAbsolutePath(buildInfo.bundle.commonSourceDirectory, buildInfoDirectory),
    getCompilerOptions: () => config.options,
    getCurrentDirectory: () => host.getCurrentDirectory(),
    getSourceFile: returnUndefined,
    getSourceFileByPath: returnUndefined,
    getSourceFiles: () => sourceFilesForJsEmit,
    getLibFileFromReference: notImplemented,
    isSourceFileFromExternalLibrary: returnFalse,
    getResolvedProjectReferenceToRedirect: returnUndefined,
    getProjectReferenceRedirect: returnUndefined,
    isSourceOfProjectReferenceRedirect: returnFalse,
    writeFile: (name, text, writeByteOrderMark, _onError, _sourceFiles, data) => {
      switch (name) {
        case jsFilePath:
          if (jsFileText === text)
            return;
          break;
        case sourceMapFilePath:
          if (sourceMapText === text)
            return;
          break;
        case buildInfoPath:
          break;
        case declarationFilePath:
          if (declarationText === text)
            return;
          changedDtsText = text;
          changedDtsData = data;
          break;
        case declarationMapPath:
          if (declarationMapText === text)
            return;
          break;
        default:
          Debug.fail(`Unexpected path: ${name}`);
      }
      outputFiles.push({ name, text, writeByteOrderMark, data });
    },
    isEmitBlocked: returnFalse,
    readFile: (f) => host.readFile(f),
    fileExists: (f) => host.fileExists(f),
    useCaseSensitiveFileNames: () => host.useCaseSensitiveFileNames(),
    getBuildInfo: (bundle) => {
      const program = buildInfo.program;
      if (program && changedDtsText !== void 0 && config.options.composite) {
        program.outSignature = computeSignature(changedDtsText, host, changedDtsData);
      }
      const { js, dts, sourceFiles } = buildInfo.bundle;
      bundle.js.sources = js.sources;
      if (dts) {
        bundle.dts.sources = dts.sources;
      }
      bundle.sourceFiles = sourceFiles;
      return createBuildInfo(program, bundle);
    },
    getSourceFileFromReference: returnUndefined,
    redirectTargetsMap: createMultiMap(),
    getFileIncludeReasons: notImplemented,
    createHash: maybeBind(host, host.createHash)
  };
  emitFiles(
    notImplementedResolver,
    emitHost,
    /*targetSourceFile*/
    void 0,
    getTransformers(config.options, customTransformers)
  );
  return outputFiles;
}
var createPrinterWithDefaults = /* @__PURE__ */ memoize(() => createPrinter({}));
var createPrinterWithRemoveComments = /* @__PURE__ */ memoize(() => createPrinter({ removeComments: true }));
var createPrinterWithRemoveCommentsNeverAsciiEscape = /* @__PURE__ */ memoize(() => createPrinter({ removeComments: true, neverAsciiEscape: true }));
var createPrinterWithRemoveCommentsOmitTrailingSemicolon = /* @__PURE__ */ memoize(() => createPrinter({ removeComments: true, omitTrailingSemicolon: true }));
function createPrinter(printerOptions = {}, handlers = {}) {
  var {
    hasGlobalName,
    onEmitNode = noEmitNotification,
    isEmitNotificationEnabled,
    substituteNode = noEmitSubstitution,
    onBeforeEmitNode,
    onAfterEmitNode,
    onBeforeEmitNodeArray,
    onAfterEmitNodeArray,
    onBeforeEmitToken,
    onAfterEmitToken
  } = handlers;
  var extendedDiagnostics = !!printerOptions.extendedDiagnostics;
  var newLine = getNewLineCharacter(printerOptions);
  var moduleKind = getEmitModuleKind(printerOptions);
  var bundledHelpers = /* @__PURE__ */ new Map();
  var currentSourceFile;
  var nodeIdToGeneratedName;
  var nodeIdToGeneratedPrivateName;
  var autoGeneratedIdToGeneratedName;
  var generatedNames;
  var formattedNameTempFlagsStack;
  var formattedNameTempFlags;
  var privateNameTempFlagsStack;
  var privateNameTempFlags;
  var tempFlagsStack;
  var tempFlags;
  var reservedNamesStack;
  var reservedNames;
  var reservedPrivateNamesStack;
  var reservedPrivateNames;
  var preserveSourceNewlines = printerOptions.preserveSourceNewlines;
  var nextListElementPos;
  var writer;
  var ownWriter;
  var write = writeBase;
  var isOwnFileEmit;
  var bundleFileInfo = printerOptions.writeBundleFileInfo ? { sections: [] } : void 0;
  var relativeToBuildInfo = bundleFileInfo ? Debug.checkDefined(printerOptions.relativeToBuildInfo) : void 0;
  var recordInternalSection = printerOptions.recordInternalSection;
  var sourceFileTextPos = 0;
  var sourceFileTextKind = "text" /* Text */;
  var sourceMapsDisabled = true;
  var sourceMapGenerator;
  var sourceMapSource;
  var sourceMapSourceIndex = -1;
  var mostRecentlyAddedSourceMapSource;
  var mostRecentlyAddedSourceMapSourceIndex = -1;
  var containerPos = -1;
  var containerEnd = -1;
  var declarationListContainerEnd = -1;
  var currentLineMap;
  var detachedCommentsInfo;
  var hasWrittenComment = false;
  var commentsDisabled = !!printerOptions.removeComments;
  var lastSubstitution;
  var currentParenthesizerRule;
  var { enter: enterComment, exit: exitComment } = createTimerIf(extendedDiagnostics, "commentTime", "beforeComment", "afterComment");
  var parenthesizer = factory.parenthesizer;
  var typeArgumentParenthesizerRuleSelector = {
    select: (index) => index === 0 ? parenthesizer.parenthesizeLeadingTypeArgument : void 0
  };
  var emitBinaryExpression = createEmitBinaryExpression();
  reset();
  return {
    // public API
    printNode,
    printList,
    printFile,
    printBundle,
    // internal API
    writeNode,
    writeList,
    writeFile: writeFile2,
    writeBundle,
    bundleFileInfo
  };
  function printNode(hint, node, sourceFile) {
    switch (hint) {
      case 0 /* SourceFile */:
        Debug.assert(isSourceFile(node), "Expected a SourceFile node.");
        break;
      case 2 /* IdentifierName */:
        Debug.assert(isIdentifier(node), "Expected an Identifier node.");
        break;
      case 1 /* Expression */:
        Debug.assert(isExpression(node), "Expected an Expression node.");
        break;
    }
    switch (node.kind) {
      case 311 /* SourceFile */:
        return printFile(node);
      case 312 /* Bundle */:
        return printBundle(node);
      case 313 /* UnparsedSource */:
        return printUnparsedSource(node);
    }
    writeNode(hint, node, sourceFile, beginPrint());
    return endPrint();
  }
  function printList(format, nodes, sourceFile) {
    writeList(format, nodes, sourceFile, beginPrint());
    return endPrint();
  }
  function printBundle(bundle) {
    writeBundle(
      bundle,
      beginPrint(),
      /*sourceMapGenerator*/
      void 0
    );
    return endPrint();
  }
  function printFile(sourceFile) {
    writeFile2(
      sourceFile,
      beginPrint(),
      /*sourceMapGenerator*/
      void 0
    );
    return endPrint();
  }
  function printUnparsedSource(unparsed) {
    writeUnparsedSource(unparsed, beginPrint());
    return endPrint();
  }
  function writeNode(hint, node, sourceFile, output) {
    const previousWriter = writer;
    setWriter(
      output,
      /*_sourceMapGenerator*/
      void 0
    );
    print(hint, node, sourceFile);
    reset();
    writer = previousWriter;
  }
  function writeList(format, nodes, sourceFile, output) {
    const previousWriter = writer;
    setWriter(
      output,
      /*_sourceMapGenerator*/
      void 0
    );
    if (sourceFile) {
      setSourceFile(sourceFile);
    }
    emitList(
      /*parentNode*/
      void 0,
      nodes,
      format
    );
    reset();
    writer = previousWriter;
  }
  function getTextPosWithWriteLine() {
    return writer.getTextPosWithWriteLine ? writer.getTextPosWithWriteLine() : writer.getTextPos();
  }
  function updateOrPushBundleFileTextLike(pos, end, kind) {
    const last2 = lastOrUndefined(bundleFileInfo.sections);
    if (last2 && last2.kind === kind) {
      last2.end = end;
    } else {
      bundleFileInfo.sections.push({ pos, end, kind });
    }
  }
  function recordBundleFileInternalSectionStart(node) {
    if (recordInternalSection && bundleFileInfo && currentSourceFile && (isDeclaration(node) || isVariableStatement(node)) && isInternalDeclaration(node, currentSourceFile) && sourceFileTextKind !== "internal" /* Internal */) {
      const prevSourceFileTextKind = sourceFileTextKind;
      recordBundleFileTextLikeSection(writer.getTextPos());
      sourceFileTextPos = getTextPosWithWriteLine();
      sourceFileTextKind = "internal" /* Internal */;
      return prevSourceFileTextKind;
    }
    return void 0;
  }
  function recordBundleFileInternalSectionEnd(prevSourceFileTextKind) {
    if (prevSourceFileTextKind) {
      recordBundleFileTextLikeSection(writer.getTextPos());
      sourceFileTextPos = getTextPosWithWriteLine();
      sourceFileTextKind = prevSourceFileTextKind;
    }
  }
  function recordBundleFileTextLikeSection(end) {
    if (sourceFileTextPos < end) {
      updateOrPushBundleFileTextLike(sourceFileTextPos, end, sourceFileTextKind);
      return true;
    }
    return false;
  }
  function writeBundle(bundle, output, sourceMapGenerator2) {
    isOwnFileEmit = false;
    const previousWriter = writer;
    setWriter(output, sourceMapGenerator2);
    emitShebangIfNeeded(bundle);
    emitPrologueDirectivesIfNeeded(bundle);
    emitHelpers(bundle);
    emitSyntheticTripleSlashReferencesIfNeeded(bundle);
    for (const prepend of bundle.prepends) {
      writeLine();
      const pos = writer.getTextPos();
      const savedSections = bundleFileInfo && bundleFileInfo.sections;
      if (savedSections)
        bundleFileInfo.sections = [];
      print(
        4 /* Unspecified */,
        prepend,
        /*sourceFile*/
        void 0
      );
      if (bundleFileInfo) {
        const newSections = bundleFileInfo.sections;
        bundleFileInfo.sections = savedSections;
        if (prepend.oldFileOfCurrentEmit)
          bundleFileInfo.sections.push(...newSections);
        else {
          newSections.forEach((section) => Debug.assert(isBundleFileTextLike(section)));
          bundleFileInfo.sections.push({
            pos,
            end: writer.getTextPos(),
            kind: "prepend" /* Prepend */,
            data: relativeToBuildInfo(prepend.fileName),
            texts: newSections
          });
        }
      }
    }
    sourceFileTextPos = getTextPosWithWriteLine();
    for (const sourceFile of bundle.sourceFiles) {
      print(0 /* SourceFile */, sourceFile, sourceFile);
    }
    if (bundleFileInfo && bundle.sourceFiles.length) {
      const end = writer.getTextPos();
      if (recordBundleFileTextLikeSection(end)) {
        const prologues = getPrologueDirectivesFromBundledSourceFiles(bundle);
        if (prologues) {
          if (!bundleFileInfo.sources)
            bundleFileInfo.sources = {};
          bundleFileInfo.sources.prologues = prologues;
        }
        const helpers = getHelpersFromBundledSourceFiles(bundle);
        if (helpers) {
          if (!bundleFileInfo.sources)
            bundleFileInfo.sources = {};
          bundleFileInfo.sources.helpers = helpers;
        }
      }
    }
    reset();
    writer = previousWriter;
  }
  function writeUnparsedSource(unparsed, output) {
    const previousWriter = writer;
    setWriter(
      output,
      /*_sourceMapGenerator*/
      void 0
    );
    print(
      4 /* Unspecified */,
      unparsed,
      /*sourceFile*/
      void 0
    );
    reset();
    writer = previousWriter;
  }
  function writeFile2(sourceFile, output, sourceMapGenerator2) {
    isOwnFileEmit = true;
    const previousWriter = writer;
    setWriter(output, sourceMapGenerator2);
    emitShebangIfNeeded(sourceFile);
    emitPrologueDirectivesIfNeeded(sourceFile);
    print(0 /* SourceFile */, sourceFile, sourceFile);
    reset();
    writer = previousWriter;
  }
  function beginPrint() {
    return ownWriter || (ownWriter = createTextWriter(newLine));
  }
  function endPrint() {
    const text = ownWriter.getText();
    ownWriter.clear();
    return text;
  }
  function print(hint, node, sourceFile) {
    if (sourceFile) {
      setSourceFile(sourceFile);
    }
    pipelineEmit(
      hint,
      node,
      /*parenthesizerRule*/
      void 0
    );
  }
  function setSourceFile(sourceFile) {
    currentSourceFile = sourceFile;
    currentLineMap = void 0;
    detachedCommentsInfo = void 0;
    if (sourceFile) {
      setSourceMapSource(sourceFile);
    }
  }
  function setWriter(_writer, _sourceMapGenerator) {
    if (_writer && printerOptions.omitTrailingSemicolon) {
      _writer = getTrailingSemicolonDeferringWriter(_writer);
    }
    writer = _writer;
    sourceMapGenerator = _sourceMapGenerator;
    sourceMapsDisabled = !writer || !sourceMapGenerator;
  }
  function reset() {
    nodeIdToGeneratedName = [];
    nodeIdToGeneratedPrivateName = [];
    autoGeneratedIdToGeneratedName = [];
    generatedNames = /* @__PURE__ */ new Set();
    formattedNameTempFlagsStack = [];
    formattedNameTempFlags = /* @__PURE__ */ new Map();
    privateNameTempFlagsStack = [];
    privateNameTempFlags = 0 /* Auto */;
    tempFlagsStack = [];
    tempFlags = 0 /* Auto */;
    reservedNamesStack = [];
    reservedNames = void 0;
    reservedPrivateNamesStack = [];
    reservedPrivateNames = void 0;
    currentSourceFile = void 0;
    currentLineMap = void 0;
    detachedCommentsInfo = void 0;
    setWriter(
      /*output*/
      void 0,
      /*_sourceMapGenerator*/
      void 0
    );
  }
  function getCurrentLineMap() {
    return currentLineMap || (currentLineMap = getLineStarts(Debug.checkDefined(currentSourceFile)));
  }
  function emit(node, parenthesizerRule) {
    if (node === void 0)
      return;
    const prevSourceFileTextKind = recordBundleFileInternalSectionStart(node);
    pipelineEmit(4 /* Unspecified */, node, parenthesizerRule);
    recordBundleFileInternalSectionEnd(prevSourceFileTextKind);
  }
  function emitIdentifierName(node) {
    if (node === void 0)
      return;
    pipelineEmit(
      2 /* IdentifierName */,
      node,
      /*parenthesizerRule*/
      void 0
    );
  }
  function emitExpression(node, parenthesizerRule) {
    if (node === void 0)
      return;
    pipelineEmit(1 /* Expression */, node, parenthesizerRule);
  }
  function emitJsxAttributeValue(node) {
    pipelineEmit(isStringLiteral(node) ? 6 /* JsxAttributeValue */ : 4 /* Unspecified */, node);
  }
  function beforeEmitNode(node) {
    if (preserveSourceNewlines && getInternalEmitFlags(node) & 4 /* IgnoreSourceNewlines */) {
      preserveSourceNewlines = false;
    }
  }
  function afterEmitNode(savedPreserveSourceNewlines) {
    preserveSourceNewlines = savedPreserveSourceNewlines;
  }
  function pipelineEmit(emitHint, node, parenthesizerRule) {
    currentParenthesizerRule = parenthesizerRule;
    const pipelinePhase = getPipelinePhase(0 /* Notification */, emitHint, node);
    pipelinePhase(emitHint, node);
    currentParenthesizerRule = void 0;
  }
  function shouldEmitComments(node) {
    return !commentsDisabled && !isSourceFile(node);
  }
  function shouldEmitSourceMaps(node) {
    return !sourceMapsDisabled && !isSourceFile(node) && !isInJsonFile(node) && !isUnparsedSource(node) && !isUnparsedPrepend(node);
  }
  function getPipelinePhase(phase, emitHint, node) {
    switch (phase) {
      case 0 /* Notification */:
        if (onEmitNode !== noEmitNotification && (!isEmitNotificationEnabled || isEmitNotificationEnabled(node))) {
          return pipelineEmitWithNotification;
        }
      case 1 /* Substitution */:
        if (substituteNode !== noEmitSubstitution && (lastSubstitution = substituteNode(emitHint, node) || node) !== node) {
          if (currentParenthesizerRule) {
            lastSubstitution = currentParenthesizerRule(lastSubstitution);
          }
          return pipelineEmitWithSubstitution;
        }
      case 2 /* Comments */:
        if (shouldEmitComments(node)) {
          return pipelineEmitWithComments;
        }
      case 3 /* SourceMaps */:
        if (shouldEmitSourceMaps(node)) {
          return pipelineEmitWithSourceMaps;
        }
      case 4 /* Emit */:
        return pipelineEmitWithHint;
      default:
        return Debug.assertNever(phase);
    }
  }
  function getNextPipelinePhase(currentPhase, emitHint, node) {
    return getPipelinePhase(currentPhase + 1, emitHint, node);
  }
  function pipelineEmitWithNotification(hint, node) {
    const pipelinePhase = getNextPipelinePhase(0 /* Notification */, hint, node);
    onEmitNode(hint, node, pipelinePhase);
  }
  function pipelineEmitWithHint(hint, node) {
    onBeforeEmitNode == null ? void 0 : onBeforeEmitNode(node);
    if (preserveSourceNewlines) {
      const savedPreserveSourceNewlines = preserveSourceNewlines;
      beforeEmitNode(node);
      pipelineEmitWithHintWorker(hint, node);
      afterEmitNode(savedPreserveSourceNewlines);
    } else {
      pipelineEmitWithHintWorker(hint, node);
    }
    onAfterEmitNode == null ? void 0 : onAfterEmitNode(node);
    currentParenthesizerRule = void 0;
  }
  function pipelineEmitWithHintWorker(hint, node, allowSnippets = true) {
    if (allowSnippets) {
      const snippet = getSnippetElement(node);
      if (snippet) {
        return emitSnippetNode(hint, node, snippet);
      }
    }
    if (hint === 0 /* SourceFile */)
      return emitSourceFile(cast(node, isSourceFile));
    if (hint === 2 /* IdentifierName */)
      return emitIdentifier(cast(node, isIdentifier));
    if (hint === 6 /* JsxAttributeValue */)
      return emitLiteral(
        cast(node, isStringLiteral),
        /*jsxAttributeEscape*/
        true
      );
    if (hint === 3 /* MappedTypeParameter */)
      return emitMappedTypeParameter(cast(node, isTypeParameterDeclaration));
    if (hint === 5 /* EmbeddedStatement */) {
      Debug.assertNode(node, isEmptyStatement);
      return emitEmptyStatement(
        /*isEmbeddedStatement*/
        true
      );
    }
    if (hint === 4 /* Unspecified */) {
      switch (node.kind) {
        case 16 /* TemplateHead */:
        case 17 /* TemplateMiddle */:
        case 18 /* TemplateTail */:
          return emitLiteral(
            node,
            /*jsxAttributeEscape*/
            false
          );
        case 80 /* Identifier */:
          return emitIdentifier(node);
        case 81 /* PrivateIdentifier */:
          return emitPrivateIdentifier(node);
        case 165 /* QualifiedName */:
          return emitQualifiedName(node);
        case 166 /* ComputedPropertyName */:
          return emitComputedPropertyName(node);
        case 167 /* TypeParameter */:
          return emitTypeParameter(node);
        case 168 /* Parameter */:
          return emitParameter(node);
        case 169 /* Decorator */:
          return emitDecorator(node);
        case 170 /* PropertySignature */:
          return emitPropertySignature(node);
        case 171 /* PropertyDeclaration */:
          return emitPropertyDeclaration(node);
        case 172 /* MethodSignature */:
          return emitMethodSignature(node);
        case 173 /* MethodDeclaration */:
          return emitMethodDeclaration(node);
        case 174 /* ClassStaticBlockDeclaration */:
          return emitClassStaticBlockDeclaration(node);
        case 175 /* Constructor */:
          return emitConstructor(node);
        case 176 /* GetAccessor */:
        case 177 /* SetAccessor */:
          return emitAccessorDeclaration(node);
        case 178 /* CallSignature */:
          return emitCallSignature(node);
        case 179 /* ConstructSignature */:
          return emitConstructSignature(node);
        case 180 /* IndexSignature */:
          return emitIndexSignature(node);
        case 181 /* TypePredicate */:
          return emitTypePredicate(node);
        case 182 /* TypeReference */:
          return emitTypeReference(node);
        case 183 /* FunctionType */:
          return emitFunctionType(node);
        case 184 /* ConstructorType */:
          return emitConstructorType(node);
        case 185 /* TypeQuery */:
          return emitTypeQuery(node);
        case 186 /* TypeLiteral */:
          return emitTypeLiteral(node);
        case 187 /* ArrayType */:
          return emitArrayType(node);
        case 188 /* TupleType */:
          return emitTupleType(node);
        case 189 /* OptionalType */:
          return emitOptionalType(node);
        case 191 /* UnionType */:
          return emitUnionType(node);
        case 192 /* IntersectionType */:
          return emitIntersectionType(node);
        case 193 /* ConditionalType */:
          return emitConditionalType(node);
        case 194 /* InferType */:
          return emitInferType(node);
        case 195 /* ParenthesizedType */:
          return emitParenthesizedType(node);
        case 232 /* ExpressionWithTypeArguments */:
          return emitExpressionWithTypeArguments(node);
        case 196 /* ThisType */:
          return emitThisType();
        case 197 /* TypeOperator */:
          return emitTypeOperator(node);
        case 198 /* IndexedAccessType */:
          return emitIndexedAccessType(node);
        case 199 /* MappedType */:
          return emitMappedType(node);
        case 200 /* LiteralType */:
          return emitLiteralType(node);
        case 201 /* NamedTupleMember */:
          return emitNamedTupleMember(node);
        case 202 /* TemplateLiteralType */:
          return emitTemplateType(node);
        case 203 /* TemplateLiteralTypeSpan */:
          return emitTemplateTypeSpan(node);
        case 204 /* ImportType */:
          return emitImportTypeNode(node);
        case 205 /* ObjectBindingPattern */:
          return emitObjectBindingPattern(node);
        case 206 /* ArrayBindingPattern */:
          return emitArrayBindingPattern(node);
        case 207 /* BindingElement */:
          return emitBindingElement(node);
        case 238 /* TemplateSpan */:
          return emitTemplateSpan(node);
        case 239 /* SemicolonClassElement */:
          return emitSemicolonClassElement();
        case 240 /* Block */:
          return emitBlock(node);
        case 242 /* VariableStatement */:
          return emitVariableStatement(node);
        case 241 /* EmptyStatement */:
          return emitEmptyStatement(
            /*isEmbeddedStatement*/
            false
          );
        case 243 /* ExpressionStatement */:
          return emitExpressionStatement(node);
        case 244 /* IfStatement */:
          return emitIfStatement(node);
        case 245 /* DoStatement */:
          return emitDoStatement(node);
        case 246 /* WhileStatement */:
          return emitWhileStatement(node);
        case 247 /* ForStatement */:
          return emitForStatement(node);
        case 248 /* ForInStatement */:
          return emitForInStatement(node);
        case 249 /* ForOfStatement */:
          return emitForOfStatement(node);
        case 250 /* ContinueStatement */:
          return emitContinueStatement(node);
        case 251 /* BreakStatement */:
          return emitBreakStatement(node);
        case 252 /* ReturnStatement */:
          return emitReturnStatement(node);
        case 253 /* WithStatement */:
          return emitWithStatement(node);
        case 254 /* SwitchStatement */:
          return emitSwitchStatement(node);
        case 255 /* LabeledStatement */:
          return emitLabeledStatement(node);
        case 256 /* ThrowStatement */:
          return emitThrowStatement(node);
        case 257 /* TryStatement */:
          return emitTryStatement(node);
        case 258 /* DebuggerStatement */:
          return emitDebuggerStatement(node);
        case 259 /* VariableDeclaration */:
          return emitVariableDeclaration(node);
        case 260 /* VariableDeclarationList */:
          return emitVariableDeclarationList(node);
        case 261 /* FunctionDeclaration */:
          return emitFunctionDeclaration(node);
        case 262 /* ClassDeclaration */:
          return emitClassDeclaration(node);
        case 263 /* InterfaceDeclaration */:
          return emitInterfaceDeclaration(node);
        case 264 /* TypeAliasDeclaration */:
          return emitTypeAliasDeclaration(node);
        case 265 /* EnumDeclaration */:
          return emitEnumDeclaration(node);
        case 266 /* ModuleDeclaration */:
          return emitModuleDeclaration(node);
        case 267 /* ModuleBlock */:
          return emitModuleBlock(node);
        case 268 /* CaseBlock */:
          return emitCaseBlock(node);
        case 269 /* NamespaceExportDeclaration */:
          return emitNamespaceExportDeclaration(node);
        case 270 /* ImportEqualsDeclaration */:
          return emitImportEqualsDeclaration(node);
        case 271 /* ImportDeclaration */:
          return emitImportDeclaration(node);
        case 272 /* ImportClause */:
          return emitImportClause(node);
        case 273 /* NamespaceImport */:
          return emitNamespaceImport(node);
        case 279 /* NamespaceExport */:
          return emitNamespaceExport(node);
        case 274 /* NamedImports */:
          return emitNamedImports(node);
        case 275 /* ImportSpecifier */:
          return emitImportSpecifier(node);
        case 276 /* ExportAssignment */:
          return emitExportAssignment(node);
        case 277 /* ExportDeclaration */:
          return emitExportDeclaration(node);
        case 278 /* NamedExports */:
          return emitNamedExports(node);
        case 280 /* ExportSpecifier */:
          return emitExportSpecifier(node);
        case 299 /* AssertClause */:
          return emitAssertClause(node);
        case 300 /* AssertEntry */:
          return emitAssertEntry(node);
        case 281 /* MissingDeclaration */:
          return;
        case 282 /* ExternalModuleReference */:
          return emitExternalModuleReference(node);
        case 12 /* JsxText */:
          return emitJsxText(node);
        case 285 /* JsxOpeningElement */:
        case 288 /* JsxOpeningFragment */:
          return emitJsxOpeningElementOrFragment(node);
        case 286 /* JsxClosingElement */:
        case 289 /* JsxClosingFragment */:
          return emitJsxClosingElementOrFragment(node);
        case 290 /* JsxAttribute */:
          return emitJsxAttribute(node);
        case 291 /* JsxAttributes */:
          return emitJsxAttributes(node);
        case 292 /* JsxSpreadAttribute */:
          return emitJsxSpreadAttribute(node);
        case 293 /* JsxExpression */:
          return emitJsxExpression(node);
        case 294 /* JsxNamespacedName */:
          return emitJsxNamespacedName(node);
        case 295 /* CaseClause */:
          return emitCaseClause(node);
        case 296 /* DefaultClause */:
          return emitDefaultClause(node);
        case 297 /* HeritageClause */:
          return emitHeritageClause(node);
        case 298 /* CatchClause */:
          return emitCatchClause(node);
        case 302 /* PropertyAssignment */:
          return emitPropertyAssignment(node);
        case 303 /* ShorthandPropertyAssignment */:
          return emitShorthandPropertyAssignment(node);
        case 304 /* SpreadAssignment */:
          return emitSpreadAssignment(node);
        case 305 /* EnumMember */:
          return emitEnumMember(node);
        case 306 /* UnparsedPrologue */:
          return writeUnparsedNode(node);
        case 313 /* UnparsedSource */:
        case 307 /* UnparsedPrepend */:
          return emitUnparsedSourceOrPrepend(node);
        case 308 /* UnparsedText */:
        case 309 /* UnparsedInternalText */:
          return emitUnparsedTextLike(node);
        case 310 /* UnparsedSyntheticReference */:
          return emitUnparsedSyntheticReference(node);
        case 311 /* SourceFile */:
          return emitSourceFile(node);
        case 312 /* Bundle */:
          return Debug.fail("Bundles should be printed using printBundle");
        case 314 /* InputFiles */:
          return Debug.fail("InputFiles should not be printed");
        case 315 /* JSDocTypeExpression */:
          return emitJSDocTypeExpression(node);
        case 316 /* JSDocNameReference */:
          return emitJSDocNameReference(node);
        case 318 /* JSDocAllType */:
          return writePunctuation("*");
        case 319 /* JSDocUnknownType */:
          return writePunctuation("?");
        case 320 /* JSDocNullableType */:
          return emitJSDocNullableType(node);
        case 321 /* JSDocNonNullableType */:
          return emitJSDocNonNullableType(node);
        case 322 /* JSDocOptionalType */:
          return emitJSDocOptionalType(node);
        case 323 /* JSDocFunctionType */:
          return emitJSDocFunctionType(node);
        case 190 /* RestType */:
        case 324 /* JSDocVariadicType */:
          return emitRestOrJSDocVariadicType(node);
        case 325 /* JSDocNamepathType */:
          return;
        case 326 /* JSDoc */:
          return emitJSDoc(node);
        case 328 /* JSDocTypeLiteral */:
          return emitJSDocTypeLiteral(node);
        case 329 /* JSDocSignature */:
          return emitJSDocSignature(node);
        case 333 /* JSDocTag */:
        case 338 /* JSDocClassTag */:
        case 343 /* JSDocOverrideTag */:
          return emitJSDocSimpleTag(node);
        case 334 /* JSDocAugmentsTag */:
        case 335 /* JSDocImplementsTag */:
          return emitJSDocHeritageTag(node);
        case 336 /* JSDocAuthorTag */:
        case 337 /* JSDocDeprecatedTag */:
          return;
        case 339 /* JSDocPublicTag */:
        case 340 /* JSDocPrivateTag */:
        case 341 /* JSDocProtectedTag */:
        case 342 /* JSDocReadonlyTag */:
          return;
        case 344 /* JSDocCallbackTag */:
          return emitJSDocCallbackTag(node);
        case 345 /* JSDocOverloadTag */:
          return emitJSDocOverloadTag(node);
        case 347 /* JSDocParameterTag */:
        case 354 /* JSDocPropertyTag */:
          return emitJSDocPropertyLikeTag(node);
        case 346 /* JSDocEnumTag */:
        case 348 /* JSDocReturnTag */:
        case 349 /* JSDocThisTag */:
        case 350 /* JSDocTypeTag */:
        case 355 /* JSDocThrowsTag */:
        case 356 /* JSDocSatisfiesTag */:
          return emitJSDocSimpleTypedTag(node);
        case 351 /* JSDocTemplateTag */:
          return emitJSDocTemplateTag(node);
        case 352 /* JSDocTypedefTag */:
          return emitJSDocTypedefTag(node);
        case 353 /* JSDocSeeTag */:
          return emitJSDocSeeTag(node);
        case 358 /* NotEmittedStatement */:
          return;
      }
      if (isExpression(node)) {
        hint = 1 /* Expression */;
        if (substituteNode !== noEmitSubstitution) {
          const substitute = substituteNode(hint, node) || node;
          if (substitute !== node) {
            node = substitute;
            if (currentParenthesizerRule) {
              node = currentParenthesizerRule(node);
            }
          }
        }
      }
    }
    if (hint === 1 /* Expression */) {
      switch (node.kind) {
        case 9 /* NumericLiteral */:
        case 10 /* BigIntLiteral */:
          return emitNumericOrBigIntLiteral(node);
        case 11 /* StringLiteral */:
        case 14 /* RegularExpressionLiteral */:
        case 15 /* NoSubstitutionTemplateLiteral */:
          return emitLiteral(
            node,
            /*jsxAttributeEscape*/
            false
          );
        case 80 /* Identifier */:
          return emitIdentifier(node);
        case 81 /* PrivateIdentifier */:
          return emitPrivateIdentifier(node);
        case 208 /* ArrayLiteralExpression */:
          return emitArrayLiteralExpression(node);
        case 209 /* ObjectLiteralExpression */:
          return emitObjectLiteralExpression(node);
        case 210 /* PropertyAccessExpression */:
          return emitPropertyAccessExpression(node);
        case 211 /* ElementAccessExpression */:
          return emitElementAccessExpression(node);
        case 212 /* CallExpression */:
          return emitCallExpression(node);
        case 213 /* NewExpression */:
          return emitNewExpression(node);
        case 214 /* TaggedTemplateExpression */:
          return emitTaggedTemplateExpression(node);
        case 215 /* TypeAssertionExpression */:
          return emitTypeAssertionExpression(node);
        case 216 /* ParenthesizedExpression */:
          return emitParenthesizedExpression(node);
        case 217 /* FunctionExpression */:
          return emitFunctionExpression(node);
        case 218 /* ArrowFunction */:
          return emitArrowFunction(node);
        case 219 /* DeleteExpression */:
          return emitDeleteExpression(node);
        case 220 /* TypeOfExpression */:
          return emitTypeOfExpression(node);
        case 221 /* VoidExpression */:
          return emitVoidExpression(node);
        case 222 /* AwaitExpression */:
          return emitAwaitExpression(node);
        case 223 /* PrefixUnaryExpression */:
          return emitPrefixUnaryExpression(node);
        case 224 /* PostfixUnaryExpression */:
          return emitPostfixUnaryExpression(node);
        case 225 /* BinaryExpression */:
          return emitBinaryExpression(node);
        case 226 /* ConditionalExpression */:
          return emitConditionalExpression(node);
        case 227 /* TemplateExpression */:
          return emitTemplateExpression(node);
        case 228 /* YieldExpression */:
          return emitYieldExpression(node);
        case 229 /* SpreadElement */:
          return emitSpreadElement(node);
        case 230 /* ClassExpression */:
          return emitClassExpression(node);
        case 231 /* OmittedExpression */:
          return;
        case 233 /* AsExpression */:
          return emitAsExpression(node);
        case 234 /* NonNullExpression */:
          return emitNonNullExpression(node);
        case 232 /* ExpressionWithTypeArguments */:
          return emitExpressionWithTypeArguments(node);
        case 237 /* SatisfiesExpression */:
          return emitSatisfiesExpression(node);
        case 235 /* MetaProperty */:
          return emitMetaProperty(node);
        case 236 /* SyntheticExpression */:
          return Debug.fail("SyntheticExpression should never be printed.");
        case 281 /* MissingDeclaration */:
          return;
        case 283 /* JsxElement */:
          return emitJsxElement(node);
        case 284 /* JsxSelfClosingElement */:
          return emitJsxSelfClosingElement(node);
        case 287 /* JsxFragment */:
          return emitJsxFragment(node);
        case 357 /* SyntaxList */:
          return Debug.fail("SyntaxList should not be printed");
        case 358 /* NotEmittedStatement */:
          return;
        case 359 /* PartiallyEmittedExpression */:
          return emitPartiallyEmittedExpression(node);
        case 360 /* CommaListExpression */:
          return emitCommaList(node);
        case 361 /* SyntheticReferenceExpression */:
          return Debug.fail("SyntheticReferenceExpression should not be printed");
      }
    }
    if (isKeyword(node.kind))
      return writeTokenNode(node, writeKeyword);
    if (isTokenKind(node.kind))
      return writeTokenNode(node, writePunctuation);
    Debug.fail(`Unhandled SyntaxKind: ${Debug.formatSyntaxKind(node.kind)}.`);
  }
  function emitMappedTypeParameter(node) {
    emit(node.name);
    writeSpace();
    writeKeyword("in");
    writeSpace();
    emit(node.constraint);
  }
  function pipelineEmitWithSubstitution(hint, node) {
    const pipelinePhase = getNextPipelinePhase(1 /* Substitution */, hint, node);
    Debug.assertIsDefined(lastSubstitution);
    node = lastSubstitution;
    lastSubstitution = void 0;
    pipelinePhase(hint, node);
  }
  function getHelpersFromBundledSourceFiles(bundle) {
    let result;
    if (moduleKind === 0 /* None */ || printerOptions.noEmitHelpers) {
      return void 0;
    }
    const bundledHelpers2 = /* @__PURE__ */ new Map();
    for (const sourceFile of bundle.sourceFiles) {
      const shouldSkip = getExternalHelpersModuleName(sourceFile) !== void 0;
      const helpers = getSortedEmitHelpers(sourceFile);
      if (!helpers)
        continue;
      for (const helper of helpers) {
        if (!helper.scoped && !shouldSkip && !bundledHelpers2.get(helper.name)) {
          bundledHelpers2.set(helper.name, true);
          (result || (result = [])).push(helper.name);
        }
      }
    }
    return result;
  }
  function emitHelpers(node) {
    let helpersEmitted = false;
    const bundle = node.kind === 312 /* Bundle */ ? node : void 0;
    if (bundle && moduleKind === 0 /* None */) {
      return;
    }
    const numPrepends = bundle ? bundle.prepends.length : 0;
    const numNodes = bundle ? bundle.sourceFiles.length + numPrepends : 1;
    for (let i = 0; i < numNodes; i++) {
      const currentNode = bundle ? i < numPrepends ? bundle.prepends[i] : bundle.sourceFiles[i - numPrepends] : node;
      const sourceFile = isSourceFile(currentNode) ? currentNode : isUnparsedSource(currentNode) ? void 0 : currentSourceFile;
      const shouldSkip = printerOptions.noEmitHelpers || !!sourceFile && hasRecordedExternalHelpers(sourceFile);
      const shouldBundle = (isSourceFile(currentNode) || isUnparsedSource(currentNode)) && !isOwnFileEmit;
      const helpers = isUnparsedSource(currentNode) ? currentNode.helpers : getSortedEmitHelpers(currentNode);
      if (helpers) {
        for (const helper of helpers) {
          if (!helper.scoped) {
            if (shouldSkip)
              continue;
            if (shouldBundle) {
              if (bundledHelpers.get(helper.name)) {
                continue;
              }
              bundledHelpers.set(helper.name, true);
            }
          } else if (bundle) {
            continue;
          }
          const pos = getTextPosWithWriteLine();
          if (typeof helper.text === "string") {
            writeLines(helper.text);
          } else {
            writeLines(helper.text(makeFileLevelOptimisticUniqueName));
          }
          if (bundleFileInfo)
            bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "emitHelpers" /* EmitHelpers */, data: helper.name });
          helpersEmitted = true;
        }
      }
    }
    return helpersEmitted;
  }
  function getSortedEmitHelpers(node) {
    const helpers = getEmitHelpers(node);
    return helpers && stableSort(helpers, compareEmitHelpers);
  }
  function emitNumericOrBigIntLiteral(node) {
    emitLiteral(
      node,
      /*jsxAttributeEscape*/
      false
    );
  }
  function emitLiteral(node, jsxAttributeEscape) {
    const text = getLiteralTextOfNode(node, printerOptions.neverAsciiEscape, jsxAttributeEscape);
    if ((printerOptions.sourceMap || printerOptions.inlineSourceMap) && (node.kind === 11 /* StringLiteral */ || isTemplateLiteralKind(node.kind))) {
      writeLiteral(text);
    } else {
      writeStringLiteral(text);
    }
  }
  function emitUnparsedSourceOrPrepend(unparsed) {
    for (const text of unparsed.texts) {
      writeLine();
      emit(text);
    }
  }
  function writeUnparsedNode(unparsed) {
    writer.rawWrite(unparsed.parent.text.substring(unparsed.pos, unparsed.end));
  }
  function emitUnparsedTextLike(unparsed) {
    const pos = getTextPosWithWriteLine();
    writeUnparsedNode(unparsed);
    if (bundleFileInfo) {
      updateOrPushBundleFileTextLike(
        pos,
        writer.getTextPos(),
        unparsed.kind === 308 /* UnparsedText */ ? "text" /* Text */ : "internal" /* Internal */
      );
    }
  }
  function emitUnparsedSyntheticReference(unparsed) {
    const pos = getTextPosWithWriteLine();
    writeUnparsedNode(unparsed);
    if (bundleFileInfo) {
      const section = clone(unparsed.section);
      section.pos = pos;
      section.end = writer.getTextPos();
      bundleFileInfo.sections.push(section);
    }
  }
  function emitSnippetNode(hint, node, snippet) {
    switch (snippet.kind) {
      case 1 /* Placeholder */:
        emitPlaceholder(hint, node, snippet);
        break;
      case 0 /* TabStop */:
        emitTabStop(hint, node, snippet);
        break;
    }
  }
  function emitPlaceholder(hint, node, snippet) {
    nonEscapingWrite(`\${${snippet.order}:`);
    pipelineEmitWithHintWorker(
      hint,
      node,
      /*allowSnippets*/
      false
    );
    nonEscapingWrite(`}`);
  }
  function emitTabStop(hint, node, snippet) {
    Debug.assert(
      node.kind === 241 /* EmptyStatement */,
      `A tab stop cannot be attached to a node of kind ${Debug.formatSyntaxKind(node.kind)}.`
    );
    Debug.assert(
      hint !== 5 /* EmbeddedStatement */,
      `A tab stop cannot be attached to an embedded statement.`
    );
    nonEscapingWrite(`$${snippet.order}`);
  }
  function emitIdentifier(node) {
    const writeText = node.symbol ? writeSymbol : write;
    writeText(getTextOfNode2(
      node,
      /*includeTrivia*/
      false
    ), node.symbol);
    emitList(node, getIdentifierTypeArguments(node), 53776 /* TypeParameters */);
  }
  function emitPrivateIdentifier(node) {
    write(getTextOfNode2(
      node,
      /*includeTrivia*/
      false
    ));
  }
  function emitQualifiedName(node) {
    emitEntityName(node.left);
    writePunctuation(".");
    emit(node.right);
  }
  function emitEntityName(node) {
    if (node.kind === 80 /* Identifier */) {
      emitExpression(node);
    } else {
      emit(node);
    }
  }
  function emitComputedPropertyName(node) {
    const savedPrivateNameTempFlags = privateNameTempFlags;
    const savedReservedMemberNames = reservedPrivateNames;
    popPrivateNameGenerationScope();
    writePunctuation("[");
    emitExpression(node.expression, parenthesizer.parenthesizeExpressionOfComputedPropertyName);
    writePunctuation("]");
    pushPrivateNameGenerationScope(savedPrivateNameTempFlags, savedReservedMemberNames);
  }
  function emitTypeParameter(node) {
    emitModifierList(node, node.modifiers);
    emit(node.name);
    if (node.constraint) {
      writeSpace();
      writeKeyword("extends");
      writeSpace();
      emit(node.constraint);
    }
    if (node.default) {
      writeSpace();
      writeOperator("=");
      writeSpace();
      emit(node.default);
    }
  }
  function emitParameter(node) {
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      true
    );
    emit(node.dotDotDotToken);
    emitNodeWithWriter(node.name, writeParameter);
    emit(node.questionToken);
    if (node.parent && node.parent.kind === 323 /* JSDocFunctionType */ && !node.name) {
      emit(node.type);
    } else {
      emitTypeAnnotation(node.type);
    }
    emitInitializer(node.initializer, node.type ? node.type.end : node.questionToken ? node.questionToken.end : node.name ? node.name.end : node.modifiers ? node.modifiers.end : node.pos, node, parenthesizer.parenthesizeExpressionForDisallowedComma);
  }
  function emitDecorator(decorator) {
    writePunctuation("@");
    emitExpression(decorator.expression, parenthesizer.parenthesizeLeftSideOfAccess);
  }
  function emitPropertySignature(node) {
    emitModifierList(node, node.modifiers);
    emitNodeWithWriter(node.name, writeProperty);
    emit(node.questionToken);
    emitTypeAnnotation(node.type);
    writeTrailingSemicolon();
  }
  function emitPropertyDeclaration(node) {
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      true
    );
    emit(node.name);
    emit(node.questionToken);
    emit(node.exclamationToken);
    emitTypeAnnotation(node.type);
    emitInitializer(node.initializer, node.type ? node.type.end : node.questionToken ? node.questionToken.end : node.name.end, node);
    writeTrailingSemicolon();
  }
  function emitMethodSignature(node) {
    pushNameGenerationScope(node);
    emitModifierList(node, node.modifiers);
    emit(node.name);
    emit(node.questionToken);
    emitTypeParameters(node, node.typeParameters);
    emitParameters(node, node.parameters);
    emitTypeAnnotation(node.type);
    writeTrailingSemicolon();
    popNameGenerationScope(node);
  }
  function emitMethodDeclaration(node) {
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      true
    );
    emit(node.asteriskToken);
    emit(node.name);
    emit(node.questionToken);
    emitSignatureAndBody(node, emitSignatureHead);
  }
  function emitClassStaticBlockDeclaration(node) {
    writeKeyword("static");
    emitBlockFunctionBody(node.body);
  }
  function emitConstructor(node) {
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      false
    );
    writeKeyword("constructor");
    emitSignatureAndBody(node, emitSignatureHead);
  }
  function emitAccessorDeclaration(node) {
    const pos = emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      true
    );
    const token = node.kind === 176 /* GetAccessor */ ? 139 /* GetKeyword */ : 153 /* SetKeyword */;
    emitTokenWithComment(token, pos, writeKeyword, node);
    writeSpace();
    emit(node.name);
    emitSignatureAndBody(node, emitSignatureHead);
  }
  function emitCallSignature(node) {
    pushNameGenerationScope(node);
    emitTypeParameters(node, node.typeParameters);
    emitParameters(node, node.parameters);
    emitTypeAnnotation(node.type);
    writeTrailingSemicolon();
    popNameGenerationScope(node);
  }
  function emitConstructSignature(node) {
    pushNameGenerationScope(node);
    writeKeyword("new");
    writeSpace();
    emitTypeParameters(node, node.typeParameters);
    emitParameters(node, node.parameters);
    emitTypeAnnotation(node.type);
    writeTrailingSemicolon();
    popNameGenerationScope(node);
  }
  function emitIndexSignature(node) {
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      false
    );
    emitParametersForIndexSignature(node, node.parameters);
    emitTypeAnnotation(node.type);
    writeTrailingSemicolon();
  }
  function emitTemplateTypeSpan(node) {
    emit(node.type);
    emit(node.literal);
  }
  function emitSemicolonClassElement() {
    writeTrailingSemicolon();
  }
  function emitTypePredicate(node) {
    if (node.assertsModifier) {
      emit(node.assertsModifier);
      writeSpace();
    }
    emit(node.parameterName);
    if (node.type) {
      writeSpace();
      writeKeyword("is");
      writeSpace();
      emit(node.type);
    }
  }
  function emitTypeReference(node) {
    emit(node.typeName);
    emitTypeArguments(node, node.typeArguments);
  }
  function emitFunctionType(node) {
    pushNameGenerationScope(node);
    emitTypeParameters(node, node.typeParameters);
    emitParametersForArrow(node, node.parameters);
    writeSpace();
    writePunctuation("=>");
    writeSpace();
    emit(node.type);
    popNameGenerationScope(node);
  }
  function emitJSDocFunctionType(node) {
    writeKeyword("function");
    emitParameters(node, node.parameters);
    writePunctuation(":");
    emit(node.type);
  }
  function emitJSDocNullableType(node) {
    writePunctuation("?");
    emit(node.type);
  }
  function emitJSDocNonNullableType(node) {
    writePunctuation("!");
    emit(node.type);
  }
  function emitJSDocOptionalType(node) {
    emit(node.type);
    writePunctuation("=");
  }
  function emitConstructorType(node) {
    pushNameGenerationScope(node);
    emitModifierList(node, node.modifiers);
    writeKeyword("new");
    writeSpace();
    emitTypeParameters(node, node.typeParameters);
    emitParameters(node, node.parameters);
    writeSpace();
    writePunctuation("=>");
    writeSpace();
    emit(node.type);
    popNameGenerationScope(node);
  }
  function emitTypeQuery(node) {
    writeKeyword("typeof");
    writeSpace();
    emit(node.exprName);
    emitTypeArguments(node, node.typeArguments);
  }
  function emitTypeLiteral(node) {
    pushPrivateNameGenerationScope(
      0 /* Auto */,
      /*newReservedMemberNames*/
      void 0
    );
    writePunctuation("{");
    const flags = getEmitFlags(node) & 1 /* SingleLine */ ? 768 /* SingleLineTypeLiteralMembers */ : 32897 /* MultiLineTypeLiteralMembers */;
    emitList(node, node.members, flags | 524288 /* NoSpaceIfEmpty */);
    writePunctuation("}");
    popPrivateNameGenerationScope();
  }
  function emitArrayType(node) {
    emit(node.elementType, parenthesizer.parenthesizeNonArrayTypeOfPostfixType);
    writePunctuation("[");
    writePunctuation("]");
  }
  function emitRestOrJSDocVariadicType(node) {
    writePunctuation("...");
    emit(node.type);
  }
  function emitTupleType(node) {
    emitTokenWithComment(23 /* OpenBracketToken */, node.pos, writePunctuation, node);
    const flags = getEmitFlags(node) & 1 /* SingleLine */ ? 528 /* SingleLineTupleTypeElements */ : 657 /* MultiLineTupleTypeElements */;
    emitList(node, node.elements, flags | 524288 /* NoSpaceIfEmpty */, parenthesizer.parenthesizeElementTypeOfTupleType);
    emitTokenWithComment(24 /* CloseBracketToken */, node.elements.end, writePunctuation, node);
  }
  function emitNamedTupleMember(node) {
    emit(node.dotDotDotToken);
    emit(node.name);
    emit(node.questionToken);
    emitTokenWithComment(59 /* ColonToken */, node.name.end, writePunctuation, node);
    writeSpace();
    emit(node.type);
  }
  function emitOptionalType(node) {
    emit(node.type, parenthesizer.parenthesizeTypeOfOptionalType);
    writePunctuation("?");
  }
  function emitUnionType(node) {
    emitList(node, node.types, 516 /* UnionTypeConstituents */, parenthesizer.parenthesizeConstituentTypeOfUnionType);
  }
  function emitIntersectionType(node) {
    emitList(node, node.types, 520 /* IntersectionTypeConstituents */, parenthesizer.parenthesizeConstituentTypeOfIntersectionType);
  }
  function emitConditionalType(node) {
    emit(node.checkType, parenthesizer.parenthesizeCheckTypeOfConditionalType);
    writeSpace();
    writeKeyword("extends");
    writeSpace();
    emit(node.extendsType, parenthesizer.parenthesizeExtendsTypeOfConditionalType);
    writeSpace();
    writePunctuation("?");
    writeSpace();
    emit(node.trueType);
    writeSpace();
    writePunctuation(":");
    writeSpace();
    emit(node.falseType);
  }
  function emitInferType(node) {
    writeKeyword("infer");
    writeSpace();
    emit(node.typeParameter);
  }
  function emitParenthesizedType(node) {
    writePunctuation("(");
    emit(node.type);
    writePunctuation(")");
  }
  function emitThisType() {
    writeKeyword("this");
  }
  function emitTypeOperator(node) {
    writeTokenText(node.operator, writeKeyword);
    writeSpace();
    const parenthesizerRule = node.operator === 148 /* ReadonlyKeyword */ ? parenthesizer.parenthesizeOperandOfReadonlyTypeOperator : parenthesizer.parenthesizeOperandOfTypeOperator;
    emit(node.type, parenthesizerRule);
  }
  function emitIndexedAccessType(node) {
    emit(node.objectType, parenthesizer.parenthesizeNonArrayTypeOfPostfixType);
    writePunctuation("[");
    emit(node.indexType);
    writePunctuation("]");
  }
  function emitMappedType(node) {
    const emitFlags = getEmitFlags(node);
    writePunctuation("{");
    if (emitFlags & 1 /* SingleLine */) {
      writeSpace();
    } else {
      writeLine();
      increaseIndent();
    }
    if (node.readonlyToken) {
      emit(node.readonlyToken);
      if (node.readonlyToken.kind !== 148 /* ReadonlyKeyword */) {
        writeKeyword("readonly");
      }
      writeSpace();
    }
    writePunctuation("[");
    pipelineEmit(3 /* MappedTypeParameter */, node.typeParameter);
    if (node.nameType) {
      writeSpace();
      writeKeyword("as");
      writeSpace();
      emit(node.nameType);
    }
    writePunctuation("]");
    if (node.questionToken) {
      emit(node.questionToken);
      if (node.questionToken.kind !== 58 /* QuestionToken */) {
        writePunctuation("?");
      }
    }
    writePunctuation(":");
    writeSpace();
    emit(node.type);
    writeTrailingSemicolon();
    if (emitFlags & 1 /* SingleLine */) {
      writeSpace();
    } else {
      writeLine();
      decreaseIndent();
    }
    emitList(node, node.members, 2 /* PreserveLines */);
    writePunctuation("}");
  }
  function emitLiteralType(node) {
    emitExpression(node.literal);
  }
  function emitTemplateType(node) {
    emit(node.head);
    emitList(node, node.templateSpans, 262144 /* TemplateExpressionSpans */);
  }
  function emitImportTypeNode(node) {
    if (node.isTypeOf) {
      writeKeyword("typeof");
      writeSpace();
    }
    writeKeyword("import");
    writePunctuation("(");
    emit(node.argument);
    if (node.assertions) {
      writePunctuation(",");
      writeSpace();
      writePunctuation("{");
      writeSpace();
      writeKeyword("assert");
      writePunctuation(":");
      writeSpace();
      const elements = node.assertions.assertClause.elements;
      emitList(node.assertions.assertClause, elements, 526226 /* ImportClauseEntries */);
      writeSpace();
      writePunctuation("}");
    }
    writePunctuation(")");
    if (node.qualifier) {
      writePunctuation(".");
      emit(node.qualifier);
    }
    emitTypeArguments(node, node.typeArguments);
  }
  function emitObjectBindingPattern(node) {
    writePunctuation("{");
    emitList(node, node.elements, 525136 /* ObjectBindingPatternElements */);
    writePunctuation("}");
  }
  function emitArrayBindingPattern(node) {
    writePunctuation("[");
    emitList(node, node.elements, 524880 /* ArrayBindingPatternElements */);
    writePunctuation("]");
  }
  function emitBindingElement(node) {
    emit(node.dotDotDotToken);
    if (node.propertyName) {
      emit(node.propertyName);
      writePunctuation(":");
      writeSpace();
    }
    emit(node.name);
    emitInitializer(node.initializer, node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma);
  }
  function emitArrayLiteralExpression(node) {
    const elements = node.elements;
    const preferNewLine = node.multiLine ? 65536 /* PreferNewLine */ : 0 /* None */;
    emitExpressionList(node, elements, 8914 /* ArrayLiteralExpressionElements */ | preferNewLine, parenthesizer.parenthesizeExpressionForDisallowedComma);
  }
  function emitObjectLiteralExpression(node) {
    pushPrivateNameGenerationScope(
      0 /* Auto */,
      /*newReservedMemberNames*/
      void 0
    );
    forEach(node.properties, generateMemberNames);
    const indentedFlag = getEmitFlags(node) & 131072 /* Indented */;
    if (indentedFlag) {
      increaseIndent();
    }
    const preferNewLine = node.multiLine ? 65536 /* PreferNewLine */ : 0 /* None */;
    const allowTrailingComma = currentSourceFile && currentSourceFile.languageVersion >= 1 /* ES5 */ && !isJsonSourceFile(currentSourceFile) ? 64 /* AllowTrailingComma */ : 0 /* None */;
    emitList(node, node.properties, 526226 /* ObjectLiteralExpressionProperties */ | allowTrailingComma | preferNewLine);
    if (indentedFlag) {
      decreaseIndent();
    }
    popPrivateNameGenerationScope();
  }
  function emitPropertyAccessExpression(node) {
    emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
    const token = node.questionDotToken || setTextRangePosEnd(factory.createToken(25 /* DotToken */), node.expression.end, node.name.pos);
    const linesBeforeDot = getLinesBetweenNodes(node, node.expression, token);
    const linesAfterDot = getLinesBetweenNodes(node, token, node.name);
    writeLinesAndIndent(
      linesBeforeDot,
      /*writeSpaceIfNotIndenting*/
      false
    );
    const shouldEmitDotDot = token.kind !== 29 /* QuestionDotToken */ && mayNeedDotDotForPropertyAccess(node.expression) && !writer.hasTrailingComment() && !writer.hasTrailingWhitespace();
    if (shouldEmitDotDot) {
      writePunctuation(".");
    }
    if (node.questionDotToken) {
      emit(token);
    } else {
      emitTokenWithComment(token.kind, node.expression.end, writePunctuation, node);
    }
    writeLinesAndIndent(
      linesAfterDot,
      /*writeSpaceIfNotIndenting*/
      false
    );
    emit(node.name);
    decreaseIndentIf(linesBeforeDot, linesAfterDot);
  }
  function mayNeedDotDotForPropertyAccess(expression) {
    expression = skipPartiallyEmittedExpressions(expression);
    if (isNumericLiteral(expression)) {
      const text = getLiteralTextOfNode(
        expression,
        /*neverAsciiEscape*/
        true,
        /*jsxAttributeEscape*/
        false
      );
      return !(expression.numericLiteralFlags & 448 /* WithSpecifier */) && !stringContains(text, tokenToString(25 /* DotToken */)) && !stringContains(text, String.fromCharCode(69 /* E */)) && !stringContains(text, String.fromCharCode(101 /* e */));
    } else if (isAccessExpression(expression)) {
      const constantValue = getConstantValue(expression);
      return typeof constantValue === "number" && isFinite(constantValue) && Math.floor(constantValue) === constantValue;
    }
  }
  function emitElementAccessExpression(node) {
    emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
    emit(node.questionDotToken);
    emitTokenWithComment(23 /* OpenBracketToken */, node.expression.end, writePunctuation, node);
    emitExpression(node.argumentExpression);
    emitTokenWithComment(24 /* CloseBracketToken */, node.argumentExpression.end, writePunctuation, node);
  }
  function emitCallExpression(node) {
    const indirectCall = getInternalEmitFlags(node) & 16 /* IndirectCall */;
    if (indirectCall) {
      writePunctuation("(");
      writeLiteral("0");
      writePunctuation(",");
      writeSpace();
    }
    emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
    if (indirectCall) {
      writePunctuation(")");
    }
    emit(node.questionDotToken);
    emitTypeArguments(node, node.typeArguments);
    emitExpressionList(node, node.arguments, 2576 /* CallExpressionArguments */, parenthesizer.parenthesizeExpressionForDisallowedComma);
  }
  function emitNewExpression(node) {
    emitTokenWithComment(105 /* NewKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    emitExpression(node.expression, parenthesizer.parenthesizeExpressionOfNew);
    emitTypeArguments(node, node.typeArguments);
    emitExpressionList(node, node.arguments, 18960 /* NewExpressionArguments */, parenthesizer.parenthesizeExpressionForDisallowedComma);
  }
  function emitTaggedTemplateExpression(node) {
    const indirectCall = getInternalEmitFlags(node) & 16 /* IndirectCall */;
    if (indirectCall) {
      writePunctuation("(");
      writeLiteral("0");
      writePunctuation(",");
      writeSpace();
    }
    emitExpression(node.tag, parenthesizer.parenthesizeLeftSideOfAccess);
    if (indirectCall) {
      writePunctuation(")");
    }
    emitTypeArguments(node, node.typeArguments);
    writeSpace();
    emitExpression(node.template);
  }
  function emitTypeAssertionExpression(node) {
    writePunctuation("<");
    emit(node.type);
    writePunctuation(">");
    emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
  }
  function emitParenthesizedExpression(node) {
    const openParenPos = emitTokenWithComment(21 /* OpenParenToken */, node.pos, writePunctuation, node);
    const indented = writeLineSeparatorsAndIndentBefore(node.expression, node);
    emitExpression(
      node.expression,
      /*parenthesizerRule*/
      void 0
    );
    writeLineSeparatorsAfter(node.expression, node);
    decreaseIndentIf(indented);
    emitTokenWithComment(22 /* CloseParenToken */, node.expression ? node.expression.end : openParenPos, writePunctuation, node);
  }
  function emitFunctionExpression(node) {
    generateNameIfNeeded(node.name);
    emitFunctionDeclarationOrExpression(node);
  }
  function emitArrowFunction(node) {
    emitModifierList(node, node.modifiers);
    emitSignatureAndBody(node, emitArrowFunctionHead);
  }
  function emitArrowFunctionHead(node) {
    emitTypeParameters(node, node.typeParameters);
    emitParametersForArrow(node, node.parameters);
    emitTypeAnnotation(node.type);
    writeSpace();
    emit(node.equalsGreaterThanToken);
  }
  function emitDeleteExpression(node) {
    emitTokenWithComment(91 /* DeleteKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
  }
  function emitTypeOfExpression(node) {
    emitTokenWithComment(114 /* TypeOfKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
  }
  function emitVoidExpression(node) {
    emitTokenWithComment(116 /* VoidKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
  }
  function emitAwaitExpression(node) {
    emitTokenWithComment(135 /* AwaitKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
  }
  function emitPrefixUnaryExpression(node) {
    writeTokenText(node.operator, writeOperator);
    if (shouldEmitWhitespaceBeforeOperand(node)) {
      writeSpace();
    }
    emitExpression(node.operand, parenthesizer.parenthesizeOperandOfPrefixUnary);
  }
  function shouldEmitWhitespaceBeforeOperand(node) {
    const operand = node.operand;
    return operand.kind === 223 /* PrefixUnaryExpression */ && (node.operator === 40 /* PlusToken */ && (operand.operator === 40 /* PlusToken */ || operand.operator === 46 /* PlusPlusToken */) || node.operator === 41 /* MinusToken */ && (operand.operator === 41 /* MinusToken */ || operand.operator === 47 /* MinusMinusToken */));
  }
  function emitPostfixUnaryExpression(node) {
    emitExpression(node.operand, parenthesizer.parenthesizeOperandOfPostfixUnary);
    writeTokenText(node.operator, writeOperator);
  }
  function createEmitBinaryExpression() {
    return createBinaryExpressionTrampoline(
      onEnter,
      onLeft,
      onOperator,
      onRight,
      onExit,
      /*foldState*/
      void 0
    );
    function onEnter(node, state) {
      if (state) {
        state.stackIndex++;
        state.preserveSourceNewlinesStack[state.stackIndex] = preserveSourceNewlines;
        state.containerPosStack[state.stackIndex] = containerPos;
        state.containerEndStack[state.stackIndex] = containerEnd;
        state.declarationListContainerEndStack[state.stackIndex] = declarationListContainerEnd;
        const emitComments2 = state.shouldEmitCommentsStack[state.stackIndex] = shouldEmitComments(node);
        const emitSourceMaps = state.shouldEmitSourceMapsStack[state.stackIndex] = shouldEmitSourceMaps(node);
        onBeforeEmitNode == null ? void 0 : onBeforeEmitNode(node);
        if (emitComments2)
          emitCommentsBeforeNode(node);
        if (emitSourceMaps)
          emitSourceMapsBeforeNode(node);
        beforeEmitNode(node);
      } else {
        state = {
          stackIndex: 0,
          preserveSourceNewlinesStack: [void 0],
          containerPosStack: [-1],
          containerEndStack: [-1],
          declarationListContainerEndStack: [-1],
          shouldEmitCommentsStack: [false],
          shouldEmitSourceMapsStack: [false]
        };
      }
      return state;
    }
    function onLeft(next, _workArea, parent) {
      return maybeEmitExpression(next, parent, "left");
    }
    function onOperator(operatorToken, _state, node) {
      const isCommaOperator = operatorToken.kind !== 28 /* CommaToken */;
      const linesBeforeOperator = getLinesBetweenNodes(node, node.left, operatorToken);
      const linesAfterOperator = getLinesBetweenNodes(node, operatorToken, node.right);
      writeLinesAndIndent(linesBeforeOperator, isCommaOperator);
      emitLeadingCommentsOfPosition(operatorToken.pos);
      writeTokenNode(operatorToken, operatorToken.kind === 103 /* InKeyword */ ? writeKeyword : writeOperator);
      emitTrailingCommentsOfPosition(
        operatorToken.end,
        /*prefixSpace*/
        true
      );
      writeLinesAndIndent(
        linesAfterOperator,
        /*writeSpaceIfNotIndenting*/
        true
      );
    }
    function onRight(next, _workArea, parent) {
      return maybeEmitExpression(next, parent, "right");
    }
    function onExit(node, state) {
      const linesBeforeOperator = getLinesBetweenNodes(node, node.left, node.operatorToken);
      const linesAfterOperator = getLinesBetweenNodes(node, node.operatorToken, node.right);
      decreaseIndentIf(linesBeforeOperator, linesAfterOperator);
      if (state.stackIndex > 0) {
        const savedPreserveSourceNewlines = state.preserveSourceNewlinesStack[state.stackIndex];
        const savedContainerPos = state.containerPosStack[state.stackIndex];
        const savedContainerEnd = state.containerEndStack[state.stackIndex];
        const savedDeclarationListContainerEnd = state.declarationListContainerEndStack[state.stackIndex];
        const shouldEmitComments2 = state.shouldEmitCommentsStack[state.stackIndex];
        const shouldEmitSourceMaps2 = state.shouldEmitSourceMapsStack[state.stackIndex];
        afterEmitNode(savedPreserveSourceNewlines);
        if (shouldEmitSourceMaps2)
          emitSourceMapsAfterNode(node);
        if (shouldEmitComments2)
          emitCommentsAfterNode(node, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd);
        onAfterEmitNode == null ? void 0 : onAfterEmitNode(node);
        state.stackIndex--;
      }
    }
    function maybeEmitExpression(next, parent, side) {
      const parenthesizerRule = side === "left" ? parenthesizer.getParenthesizeLeftSideOfBinaryForOperator(parent.operatorToken.kind) : parenthesizer.getParenthesizeRightSideOfBinaryForOperator(parent.operatorToken.kind);
      let pipelinePhase = getPipelinePhase(0 /* Notification */, 1 /* Expression */, next);
      if (pipelinePhase === pipelineEmitWithSubstitution) {
        Debug.assertIsDefined(lastSubstitution);
        next = parenthesizerRule(cast(lastSubstitution, isExpression));
        pipelinePhase = getNextPipelinePhase(1 /* Substitution */, 1 /* Expression */, next);
        lastSubstitution = void 0;
      }
      if (pipelinePhase === pipelineEmitWithComments || pipelinePhase === pipelineEmitWithSourceMaps || pipelinePhase === pipelineEmitWithHint) {
        if (isBinaryExpression(next)) {
          return next;
        }
      }
      currentParenthesizerRule = parenthesizerRule;
      pipelinePhase(1 /* Expression */, next);
    }
  }
  function emitConditionalExpression(node) {
    const linesBeforeQuestion = getLinesBetweenNodes(node, node.condition, node.questionToken);
    const linesAfterQuestion = getLinesBetweenNodes(node, node.questionToken, node.whenTrue);
    const linesBeforeColon = getLinesBetweenNodes(node, node.whenTrue, node.colonToken);
    const linesAfterColon = getLinesBetweenNodes(node, node.colonToken, node.whenFalse);
    emitExpression(node.condition, parenthesizer.parenthesizeConditionOfConditionalExpression);
    writeLinesAndIndent(
      linesBeforeQuestion,
      /*writeSpaceIfNotIndenting*/
      true
    );
    emit(node.questionToken);
    writeLinesAndIndent(
      linesAfterQuestion,
      /*writeSpaceIfNotIndenting*/
      true
    );
    emitExpression(node.whenTrue, parenthesizer.parenthesizeBranchOfConditionalExpression);
    decreaseIndentIf(linesBeforeQuestion, linesAfterQuestion);
    writeLinesAndIndent(
      linesBeforeColon,
      /*writeSpaceIfNotIndenting*/
      true
    );
    emit(node.colonToken);
    writeLinesAndIndent(
      linesAfterColon,
      /*writeSpaceIfNotIndenting*/
      true
    );
    emitExpression(node.whenFalse, parenthesizer.parenthesizeBranchOfConditionalExpression);
    decreaseIndentIf(linesBeforeColon, linesAfterColon);
  }
  function emitTemplateExpression(node) {
    emit(node.head);
    emitList(node, node.templateSpans, 262144 /* TemplateExpressionSpans */);
  }
  function emitYieldExpression(node) {
    emitTokenWithComment(127 /* YieldKeyword */, node.pos, writeKeyword, node);
    emit(node.asteriskToken);
    emitExpressionWithLeadingSpace(node.expression && parenthesizeExpressionForNoAsi(node.expression), parenthesizeExpressionForNoAsiAndDisallowedComma);
  }
  function emitSpreadElement(node) {
    emitTokenWithComment(26 /* DotDotDotToken */, node.pos, writePunctuation, node);
    emitExpression(node.expression, parenthesizer.parenthesizeExpressionForDisallowedComma);
  }
  function emitClassExpression(node) {
    generateNameIfNeeded(node.name);
    emitClassDeclarationOrExpression(node);
  }
  function emitExpressionWithTypeArguments(node) {
    emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
    emitTypeArguments(node, node.typeArguments);
  }
  function emitAsExpression(node) {
    emitExpression(
      node.expression,
      /*parenthesizerRule*/
      void 0
    );
    if (node.type) {
      writeSpace();
      writeKeyword("as");
      writeSpace();
      emit(node.type);
    }
  }
  function emitNonNullExpression(node) {
    emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
    writeOperator("!");
  }
  function emitSatisfiesExpression(node) {
    emitExpression(
      node.expression,
      /*parenthesizerRule*/
      void 0
    );
    if (node.type) {
      writeSpace();
      writeKeyword("satisfies");
      writeSpace();
      emit(node.type);
    }
  }
  function emitMetaProperty(node) {
    writeToken(node.keywordToken, node.pos, writePunctuation);
    writePunctuation(".");
    emit(node.name);
  }
  function emitTemplateSpan(node) {
    emitExpression(node.expression);
    emit(node.literal);
  }
  function emitBlock(node) {
    emitBlockStatements(
      node,
      /*forceSingleLine*/
      !node.multiLine && isEmptyBlock(node)
    );
  }
  function emitBlockStatements(node, forceSingleLine) {
    emitTokenWithComment(
      19 /* OpenBraceToken */,
      node.pos,
      writePunctuation,
      /*contextNode*/
      node
    );
    const format = forceSingleLine || getEmitFlags(node) & 1 /* SingleLine */ ? 768 /* SingleLineBlockStatements */ : 129 /* MultiLineBlockStatements */;
    emitList(node, node.statements, format);
    emitTokenWithComment(
      20 /* CloseBraceToken */,
      node.statements.end,
      writePunctuation,
      /*contextNode*/
      node,
      /*indentLeading*/
      !!(format & 1 /* MultiLine */)
    );
  }
  function emitVariableStatement(node) {
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      false
    );
    emit(node.declarationList);
    writeTrailingSemicolon();
  }
  function emitEmptyStatement(isEmbeddedStatement) {
    if (isEmbeddedStatement) {
      writePunctuation(";");
    } else {
      writeTrailingSemicolon();
    }
  }
  function emitExpressionStatement(node) {
    emitExpression(node.expression, parenthesizer.parenthesizeExpressionOfExpressionStatement);
    if (!currentSourceFile || !isJsonSourceFile(currentSourceFile) || nodeIsSynthesized(node.expression)) {
      writeTrailingSemicolon();
    }
  }
  function emitIfStatement(node) {
    const openParenPos = emitTokenWithComment(101 /* IfKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
    emitExpression(node.expression);
    emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node);
    emitEmbeddedStatement(node, node.thenStatement);
    if (node.elseStatement) {
      writeLineOrSpace(node, node.thenStatement, node.elseStatement);
      emitTokenWithComment(93 /* ElseKeyword */, node.thenStatement.end, writeKeyword, node);
      if (node.elseStatement.kind === 244 /* IfStatement */) {
        writeSpace();
        emit(node.elseStatement);
      } else {
        emitEmbeddedStatement(node, node.elseStatement);
      }
    }
  }
  function emitWhileClause(node, startPos) {
    const openParenPos = emitTokenWithComment(117 /* WhileKeyword */, startPos, writeKeyword, node);
    writeSpace();
    emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
    emitExpression(node.expression);
    emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node);
  }
  function emitDoStatement(node) {
    emitTokenWithComment(92 /* DoKeyword */, node.pos, writeKeyword, node);
    emitEmbeddedStatement(node, node.statement);
    if (isBlock(node.statement) && !preserveSourceNewlines) {
      writeSpace();
    } else {
      writeLineOrSpace(node, node.statement, node.expression);
    }
    emitWhileClause(node, node.statement.end);
    writeTrailingSemicolon();
  }
  function emitWhileStatement(node) {
    emitWhileClause(node, node.pos);
    emitEmbeddedStatement(node, node.statement);
  }
  function emitForStatement(node) {
    const openParenPos = emitTokenWithComment(99 /* ForKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    let pos = emitTokenWithComment(
      21 /* OpenParenToken */,
      openParenPos,
      writePunctuation,
      /*contextNode*/
      node
    );
    emitForBinding(node.initializer);
    pos = emitTokenWithComment(27 /* SemicolonToken */, node.initializer ? node.initializer.end : pos, writePunctuation, node);
    emitExpressionWithLeadingSpace(node.condition);
    pos = emitTokenWithComment(27 /* SemicolonToken */, node.condition ? node.condition.end : pos, writePunctuation, node);
    emitExpressionWithLeadingSpace(node.incrementor);
    emitTokenWithComment(22 /* CloseParenToken */, node.incrementor ? node.incrementor.end : pos, writePunctuation, node);
    emitEmbeddedStatement(node, node.statement);
  }
  function emitForInStatement(node) {
    const openParenPos = emitTokenWithComment(99 /* ForKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
    emitForBinding(node.initializer);
    writeSpace();
    emitTokenWithComment(103 /* InKeyword */, node.initializer.end, writeKeyword, node);
    writeSpace();
    emitExpression(node.expression);
    emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node);
    emitEmbeddedStatement(node, node.statement);
  }
  function emitForOfStatement(node) {
    const openParenPos = emitTokenWithComment(99 /* ForKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    emitWithTrailingSpace(node.awaitModifier);
    emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
    emitForBinding(node.initializer);
    writeSpace();
    emitTokenWithComment(164 /* OfKeyword */, node.initializer.end, writeKeyword, node);
    writeSpace();
    emitExpression(node.expression);
    emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node);
    emitEmbeddedStatement(node, node.statement);
  }
  function emitForBinding(node) {
    if (node !== void 0) {
      if (node.kind === 260 /* VariableDeclarationList */) {
        emit(node);
      } else {
        emitExpression(node);
      }
    }
  }
  function emitContinueStatement(node) {
    emitTokenWithComment(88 /* ContinueKeyword */, node.pos, writeKeyword, node);
    emitWithLeadingSpace(node.label);
    writeTrailingSemicolon();
  }
  function emitBreakStatement(node) {
    emitTokenWithComment(83 /* BreakKeyword */, node.pos, writeKeyword, node);
    emitWithLeadingSpace(node.label);
    writeTrailingSemicolon();
  }
  function emitTokenWithComment(token, pos, writer2, contextNode, indentLeading) {
    const node = getParseTreeNode(contextNode);
    const isSimilarNode = node && node.kind === contextNode.kind;
    const startPos = pos;
    if (isSimilarNode && currentSourceFile) {
      pos = skipTrivia(currentSourceFile.text, pos);
    }
    if (isSimilarNode && contextNode.pos !== startPos) {
      const needsIndent = indentLeading && currentSourceFile && !positionsAreOnSameLine(startPos, pos, currentSourceFile);
      if (needsIndent) {
        increaseIndent();
      }
      emitLeadingCommentsOfPosition(startPos);
      if (needsIndent) {
        decreaseIndent();
      }
    }
    pos = writeTokenText(token, writer2, pos);
    if (isSimilarNode && contextNode.end !== pos) {
      const isJsxExprContext = contextNode.kind === 293 /* JsxExpression */;
      emitTrailingCommentsOfPosition(
        pos,
        /*prefixSpace*/
        !isJsxExprContext,
        /*forceNoNewline*/
        isJsxExprContext
      );
    }
    return pos;
  }
  function commentWillEmitNewLine(node) {
    return node.kind === 2 /* SingleLineCommentTrivia */ || !!node.hasTrailingNewLine;
  }
  function willEmitLeadingNewLine(node) {
    if (!currentSourceFile)
      return false;
    if (some(getLeadingCommentRanges(currentSourceFile.text, node.pos), commentWillEmitNewLine))
      return true;
    if (some(getSyntheticLeadingComments(node), commentWillEmitNewLine))
      return true;
    if (isPartiallyEmittedExpression(node)) {
      if (node.pos !== node.expression.pos) {
        if (some(getTrailingCommentRanges(currentSourceFile.text, node.expression.pos), commentWillEmitNewLine))
          return true;
      }
      return willEmitLeadingNewLine(node.expression);
    }
    return false;
  }
  function parenthesizeExpressionForNoAsi(node) {
    if (!commentsDisabled && isPartiallyEmittedExpression(node) && willEmitLeadingNewLine(node)) {
      const parseNode = getParseTreeNode(node);
      if (parseNode && isParenthesizedExpression(parseNode)) {
        const parens = factory.createParenthesizedExpression(node.expression);
        setOriginalNode(parens, node);
        setTextRange(parens, parseNode);
        return parens;
      }
      return factory.createParenthesizedExpression(node);
    }
    return node;
  }
  function parenthesizeExpressionForNoAsiAndDisallowedComma(node) {
    return parenthesizeExpressionForNoAsi(parenthesizer.parenthesizeExpressionForDisallowedComma(node));
  }
  function emitReturnStatement(node) {
    emitTokenWithComment(
      107 /* ReturnKeyword */,
      node.pos,
      writeKeyword,
      /*contextNode*/
      node
    );
    emitExpressionWithLeadingSpace(node.expression && parenthesizeExpressionForNoAsi(node.expression), parenthesizeExpressionForNoAsi);
    writeTrailingSemicolon();
  }
  function emitWithStatement(node) {
    const openParenPos = emitTokenWithComment(118 /* WithKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
    emitExpression(node.expression);
    emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node);
    emitEmbeddedStatement(node, node.statement);
  }
  function emitSwitchStatement(node) {
    const openParenPos = emitTokenWithComment(109 /* SwitchKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
    emitExpression(node.expression);
    emitTokenWithComment(22 /* CloseParenToken */, node.expression.end, writePunctuation, node);
    writeSpace();
    emit(node.caseBlock);
  }
  function emitLabeledStatement(node) {
    emit(node.label);
    emitTokenWithComment(59 /* ColonToken */, node.label.end, writePunctuation, node);
    writeSpace();
    emit(node.statement);
  }
  function emitThrowStatement(node) {
    emitTokenWithComment(111 /* ThrowKeyword */, node.pos, writeKeyword, node);
    emitExpressionWithLeadingSpace(parenthesizeExpressionForNoAsi(node.expression), parenthesizeExpressionForNoAsi);
    writeTrailingSemicolon();
  }
  function emitTryStatement(node) {
    emitTokenWithComment(113 /* TryKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    emit(node.tryBlock);
    if (node.catchClause) {
      writeLineOrSpace(node, node.tryBlock, node.catchClause);
      emit(node.catchClause);
    }
    if (node.finallyBlock) {
      writeLineOrSpace(node, node.catchClause || node.tryBlock, node.finallyBlock);
      emitTokenWithComment(98 /* FinallyKeyword */, (node.catchClause || node.tryBlock).end, writeKeyword, node);
      writeSpace();
      emit(node.finallyBlock);
    }
  }
  function emitDebuggerStatement(node) {
    writeToken(89 /* DebuggerKeyword */, node.pos, writeKeyword);
    writeTrailingSemicolon();
  }
  function emitVariableDeclaration(node) {
    var _a, _b, _c;
    emit(node.name);
    emit(node.exclamationToken);
    emitTypeAnnotation(node.type);
    emitInitializer(node.initializer, ((_a = node.type) == null ? void 0 : _a.end) ?? ((_c = (_b = node.name.emitNode) == null ? void 0 : _b.typeNode) == null ? void 0 : _c.end) ?? node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma);
  }
  function emitVariableDeclarationList(node) {
    writeKeyword(isLet(node) ? "let" : isVarConst(node) ? "const" : "var");
    writeSpace();
    emitList(node, node.declarations, 528 /* VariableDeclarationList */);
  }
  function emitFunctionDeclaration(node) {
    emitFunctionDeclarationOrExpression(node);
  }
  function emitFunctionDeclarationOrExpression(node) {
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      false
    );
    writeKeyword("function");
    emit(node.asteriskToken);
    writeSpace();
    emitIdentifierName(node.name);
    emitSignatureAndBody(node, emitSignatureHead);
  }
  function emitSignatureAndBody(node, emitSignatureHead2) {
    const body = node.body;
    if (body) {
      if (isBlock(body)) {
        const indentedFlag = getEmitFlags(node) & 131072 /* Indented */;
        if (indentedFlag) {
          increaseIndent();
        }
        pushNameGenerationScope(node);
        forEach(node.parameters, generateNames);
        generateNames(node.body);
        emitSignatureHead2(node);
        emitBlockFunctionBody(body);
        popNameGenerationScope(node);
        if (indentedFlag) {
          decreaseIndent();
        }
      } else {
        emitSignatureHead2(node);
        writeSpace();
        emitExpression(body, parenthesizer.parenthesizeConciseBodyOfArrowFunction);
      }
    } else {
      emitSignatureHead2(node);
      writeTrailingSemicolon();
    }
  }
  function emitSignatureHead(node) {
    emitTypeParameters(node, node.typeParameters);
    emitParameters(node, node.parameters);
    emitTypeAnnotation(node.type);
  }
  function shouldEmitBlockFunctionBodyOnSingleLine(body) {
    if (getEmitFlags(body) & 1 /* SingleLine */) {
      return true;
    }
    if (body.multiLine) {
      return false;
    }
    if (!nodeIsSynthesized(body) && currentSourceFile && !rangeIsOnSingleLine(body, currentSourceFile)) {
      return false;
    }
    if (getLeadingLineTerminatorCount(body, firstOrUndefined(body.statements), 2 /* PreserveLines */) || getClosingLineTerminatorCount(body, lastOrUndefined(body.statements), 2 /* PreserveLines */, body.statements)) {
      return false;
    }
    let previousStatement;
    for (const statement of body.statements) {
      if (getSeparatingLineTerminatorCount(previousStatement, statement, 2 /* PreserveLines */) > 0) {
        return false;
      }
      previousStatement = statement;
    }
    return true;
  }
  function emitBlockFunctionBody(body) {
    onBeforeEmitNode == null ? void 0 : onBeforeEmitNode(body);
    writeSpace();
    writePunctuation("{");
    increaseIndent();
    const emitBlockFunctionBody2 = shouldEmitBlockFunctionBodyOnSingleLine(body) ? emitBlockFunctionBodyOnSingleLine : emitBlockFunctionBodyWorker;
    emitBodyWithDetachedComments(body, body.statements, emitBlockFunctionBody2);
    decreaseIndent();
    writeToken(20 /* CloseBraceToken */, body.statements.end, writePunctuation, body);
    onAfterEmitNode == null ? void 0 : onAfterEmitNode(body);
  }
  function emitBlockFunctionBodyOnSingleLine(body) {
    emitBlockFunctionBodyWorker(
      body,
      /*emitBlockFunctionBodyOnSingleLine*/
      true
    );
  }
  function emitBlockFunctionBodyWorker(body, emitBlockFunctionBodyOnSingleLine2) {
    const statementOffset = emitPrologueDirectives(body.statements);
    const pos = writer.getTextPos();
    emitHelpers(body);
    if (statementOffset === 0 && pos === writer.getTextPos() && emitBlockFunctionBodyOnSingleLine2) {
      decreaseIndent();
      emitList(body, body.statements, 768 /* SingleLineFunctionBodyStatements */);
      increaseIndent();
    } else {
      emitList(
        body,
        body.statements,
        1 /* MultiLineFunctionBodyStatements */,
        /*parenthesizerRule*/
        void 0,
        statementOffset
      );
    }
  }
  function emitClassDeclaration(node) {
    emitClassDeclarationOrExpression(node);
  }
  function emitClassDeclarationOrExpression(node) {
    pushPrivateNameGenerationScope(
      0 /* Auto */,
      /*newReservedMemberNames*/
      void 0
    );
    forEach(node.members, generateMemberNames);
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      true
    );
    emitTokenWithComment(86 /* ClassKeyword */, moveRangePastModifiers(node).pos, writeKeyword, node);
    if (node.name) {
      writeSpace();
      emitIdentifierName(node.name);
    }
    const indentedFlag = getEmitFlags(node) & 131072 /* Indented */;
    if (indentedFlag) {
      increaseIndent();
    }
    emitTypeParameters(node, node.typeParameters);
    emitList(node, node.heritageClauses, 0 /* ClassHeritageClauses */);
    writeSpace();
    writePunctuation("{");
    emitList(node, node.members, 129 /* ClassMembers */);
    writePunctuation("}");
    if (indentedFlag) {
      decreaseIndent();
    }
    popPrivateNameGenerationScope();
  }
  function emitInterfaceDeclaration(node) {
    pushPrivateNameGenerationScope(
      0 /* Auto */,
      /*newReservedMemberNames*/
      void 0
    );
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      false
    );
    writeKeyword("interface");
    writeSpace();
    emit(node.name);
    emitTypeParameters(node, node.typeParameters);
    emitList(node, node.heritageClauses, 512 /* HeritageClauses */);
    writeSpace();
    writePunctuation("{");
    emitList(node, node.members, 129 /* InterfaceMembers */);
    writePunctuation("}");
    popPrivateNameGenerationScope();
  }
  function emitTypeAliasDeclaration(node) {
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      false
    );
    writeKeyword("type");
    writeSpace();
    emit(node.name);
    emitTypeParameters(node, node.typeParameters);
    writeSpace();
    writePunctuation("=");
    writeSpace();
    emit(node.type);
    writeTrailingSemicolon();
  }
  function emitEnumDeclaration(node) {
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      false
    );
    writeKeyword("enum");
    writeSpace();
    emit(node.name);
    writeSpace();
    writePunctuation("{");
    emitList(node, node.members, 145 /* EnumMembers */);
    writePunctuation("}");
  }
  function emitModuleDeclaration(node) {
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      false
    );
    if (~node.flags & 1024 /* GlobalAugmentation */) {
      writeKeyword(node.flags & 16 /* Namespace */ ? "namespace" : "module");
      writeSpace();
    }
    emit(node.name);
    let body = node.body;
    if (!body)
      return writeTrailingSemicolon();
    while (body && isModuleDeclaration(body)) {
      writePunctuation(".");
      emit(body.name);
      body = body.body;
    }
    writeSpace();
    emit(body);
  }
  function emitModuleBlock(node) {
    pushNameGenerationScope(node);
    forEach(node.statements, generateNames);
    emitBlockStatements(
      node,
      /*forceSingleLine*/
      isEmptyBlock(node)
    );
    popNameGenerationScope(node);
  }
  function emitCaseBlock(node) {
    emitTokenWithComment(19 /* OpenBraceToken */, node.pos, writePunctuation, node);
    emitList(node, node.clauses, 129 /* CaseBlockClauses */);
    emitTokenWithComment(
      20 /* CloseBraceToken */,
      node.clauses.end,
      writePunctuation,
      node,
      /*indentLeading*/
      true
    );
  }
  function emitImportEqualsDeclaration(node) {
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      false
    );
    emitTokenWithComment(102 /* ImportKeyword */, node.modifiers ? node.modifiers.end : node.pos, writeKeyword, node);
    writeSpace();
    if (node.isTypeOnly) {
      emitTokenWithComment(156 /* TypeKeyword */, node.pos, writeKeyword, node);
      writeSpace();
    }
    emit(node.name);
    writeSpace();
    emitTokenWithComment(64 /* EqualsToken */, node.name.end, writePunctuation, node);
    writeSpace();
    emitModuleReference(node.moduleReference);
    writeTrailingSemicolon();
  }
  function emitModuleReference(node) {
    if (node.kind === 80 /* Identifier */) {
      emitExpression(node);
    } else {
      emit(node);
    }
  }
  function emitImportDeclaration(node) {
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      false
    );
    emitTokenWithComment(102 /* ImportKeyword */, node.modifiers ? node.modifiers.end : node.pos, writeKeyword, node);
    writeSpace();
    if (node.importClause) {
      emit(node.importClause);
      writeSpace();
      emitTokenWithComment(160 /* FromKeyword */, node.importClause.end, writeKeyword, node);
      writeSpace();
    }
    emitExpression(node.moduleSpecifier);
    if (node.assertClause) {
      emitWithLeadingSpace(node.assertClause);
    }
    writeTrailingSemicolon();
  }
  function emitImportClause(node) {
    if (node.isTypeOnly) {
      emitTokenWithComment(156 /* TypeKeyword */, node.pos, writeKeyword, node);
      writeSpace();
    }
    emit(node.name);
    if (node.name && node.namedBindings) {
      emitTokenWithComment(28 /* CommaToken */, node.name.end, writePunctuation, node);
      writeSpace();
    }
    emit(node.namedBindings);
  }
  function emitNamespaceImport(node) {
    const asPos = emitTokenWithComment(42 /* AsteriskToken */, node.pos, writePunctuation, node);
    writeSpace();
    emitTokenWithComment(130 /* AsKeyword */, asPos, writeKeyword, node);
    writeSpace();
    emit(node.name);
  }
  function emitNamedImports(node) {
    emitNamedImportsOrExports(node);
  }
  function emitImportSpecifier(node) {
    emitImportOrExportSpecifier(node);
  }
  function emitExportAssignment(node) {
    const nextPos = emitTokenWithComment(95 /* ExportKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    if (node.isExportEquals) {
      emitTokenWithComment(64 /* EqualsToken */, nextPos, writeOperator, node);
    } else {
      emitTokenWithComment(90 /* DefaultKeyword */, nextPos, writeKeyword, node);
    }
    writeSpace();
    emitExpression(node.expression, node.isExportEquals ? parenthesizer.getParenthesizeRightSideOfBinaryForOperator(64 /* EqualsToken */) : parenthesizer.parenthesizeExpressionOfExportDefault);
    writeTrailingSemicolon();
  }
  function emitExportDeclaration(node) {
    emitDecoratorsAndModifiers(
      node,
      node.modifiers,
      /*allowDecorators*/
      false
    );
    let nextPos = emitTokenWithComment(95 /* ExportKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    if (node.isTypeOnly) {
      nextPos = emitTokenWithComment(156 /* TypeKeyword */, nextPos, writeKeyword, node);
      writeSpace();
    }
    if (node.exportClause) {
      emit(node.exportClause);
    } else {
      nextPos = emitTokenWithComment(42 /* AsteriskToken */, nextPos, writePunctuation, node);
    }
    if (node.moduleSpecifier) {
      writeSpace();
      const fromPos = node.exportClause ? node.exportClause.end : nextPos;
      emitTokenWithComment(160 /* FromKeyword */, fromPos, writeKeyword, node);
      writeSpace();
      emitExpression(node.moduleSpecifier);
    }
    if (node.assertClause) {
      emitWithLeadingSpace(node.assertClause);
    }
    writeTrailingSemicolon();
  }
  function emitAssertClause(node) {
    emitTokenWithComment(132 /* AssertKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    const elements = node.elements;
    emitList(node, elements, 526226 /* ImportClauseEntries */);
  }
  function emitAssertEntry(node) {
    emit(node.name);
    writePunctuation(":");
    writeSpace();
    const value = node.value;
    if ((getEmitFlags(value) & 1024 /* NoLeadingComments */) === 0) {
      const commentRange = getCommentRange(value);
      emitTrailingCommentsOfPosition(commentRange.pos);
    }
    emit(value);
  }
  function emitNamespaceExportDeclaration(node) {
    let nextPos = emitTokenWithComment(95 /* ExportKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    nextPos = emitTokenWithComment(130 /* AsKeyword */, nextPos, writeKeyword, node);
    writeSpace();
    nextPos = emitTokenWithComment(145 /* NamespaceKeyword */, nextPos, writeKeyword, node);
    writeSpace();
    emit(node.name);
    writeTrailingSemicolon();
  }
  function emitNamespaceExport(node) {
    const asPos = emitTokenWithComment(42 /* AsteriskToken */, node.pos, writePunctuation, node);
    writeSpace();
    emitTokenWithComment(130 /* AsKeyword */, asPos, writeKeyword, node);
    writeSpace();
    emit(node.name);
  }
  function emitNamedExports(node) {
    emitNamedImportsOrExports(node);
  }
  function emitExportSpecifier(node) {
    emitImportOrExportSpecifier(node);
  }
  function emitNamedImportsOrExports(node) {
    writePunctuation("{");
    emitList(node, node.elements, 525136 /* NamedImportsOrExportsElements */);
    writePunctuation("}");
  }
  function emitImportOrExportSpecifier(node) {
    if (node.isTypeOnly) {
      writeKeyword("type");
      writeSpace();
    }
    if (node.propertyName) {
      emit(node.propertyName);
      writeSpace();
      emitTokenWithComment(130 /* AsKeyword */, node.propertyName.end, writeKeyword, node);
      writeSpace();
    }
    emit(node.name);
  }
  function emitExternalModuleReference(node) {
    writeKeyword("require");
    writePunctuation("(");
    emitExpression(node.expression);
    writePunctuation(")");
  }
  function emitJsxElement(node) {
    emit(node.openingElement);
    emitList(node, node.children, 262144 /* JsxElementOrFragmentChildren */);
    emit(node.closingElement);
  }
  function emitJsxSelfClosingElement(node) {
    writePunctuation("<");
    emitJsxTagName(node.tagName);
    emitTypeArguments(node, node.typeArguments);
    writeSpace();
    emit(node.attributes);
    writePunctuation("/>");
  }
  function emitJsxFragment(node) {
    emit(node.openingFragment);
    emitList(node, node.children, 262144 /* JsxElementOrFragmentChildren */);
    emit(node.closingFragment);
  }
  function emitJsxOpeningElementOrFragment(node) {
    writePunctuation("<");
    if (isJsxOpeningElement(node)) {
      const indented = writeLineSeparatorsAndIndentBefore(node.tagName, node);
      emitJsxTagName(node.tagName);
      emitTypeArguments(node, node.typeArguments);
      if (node.attributes.properties && node.attributes.properties.length > 0) {
        writeSpace();
      }
      emit(node.attributes);
      writeLineSeparatorsAfter(node.attributes, node);
      decreaseIndentIf(indented);
    }
    writePunctuation(">");
  }
  function emitJsxText(node) {
    writer.writeLiteral(node.text);
  }
  function emitJsxClosingElementOrFragment(node) {
    writePunctuation("</");
    if (isJsxClosingElement(node)) {
      emitJsxTagName(node.tagName);
    }
    writePunctuation(">");
  }
  function emitJsxAttributes(node) {
    emitList(node, node.properties, 262656 /* JsxElementAttributes */);
  }
  function emitJsxAttribute(node) {
    emit(node.name);
    emitNodeWithPrefix("=", writePunctuation, node.initializer, emitJsxAttributeValue);
  }
  function emitJsxSpreadAttribute(node) {
    writePunctuation("{...");
    emitExpression(node.expression);
    writePunctuation("}");
  }
  function hasTrailingCommentsAtPosition(pos) {
    let result = false;
    forEachTrailingCommentRange((currentSourceFile == null ? void 0 : currentSourceFile.text) || "", pos + 1, () => result = true);
    return result;
  }
  function hasLeadingCommentsAtPosition(pos) {
    let result = false;
    forEachLeadingCommentRange((currentSourceFile == null ? void 0 : currentSourceFile.text) || "", pos + 1, () => result = true);
    return result;
  }
  function hasCommentsAtPosition(pos) {
    return hasTrailingCommentsAtPosition(pos) || hasLeadingCommentsAtPosition(pos);
  }
  function emitJsxExpression(node) {
    var _a;
    if (node.expression || !commentsDisabled && !nodeIsSynthesized(node) && hasCommentsAtPosition(node.pos)) {
      const isMultiline = currentSourceFile && !nodeIsSynthesized(node) && getLineAndCharacterOfPosition(currentSourceFile, node.pos).line !== getLineAndCharacterOfPosition(currentSourceFile, node.end).line;
      if (isMultiline) {
        writer.increaseIndent();
      }
      const end = emitTokenWithComment(19 /* OpenBraceToken */, node.pos, writePunctuation, node);
      emit(node.dotDotDotToken);
      emitExpression(node.expression);
      emitTokenWithComment(20 /* CloseBraceToken */, ((_a = node.expression) == null ? void 0 : _a.end) || end, writePunctuation, node);
      if (isMultiline) {
        writer.decreaseIndent();
      }
    }
  }
  function emitJsxNamespacedName(node) {
    emitIdentifierName(node.namespace);
    writePunctuation(":");
    emitIdentifierName(node.name);
  }
  function emitJsxTagName(node) {
    if (node.kind === 80 /* Identifier */) {
      emitExpression(node);
    } else {
      emit(node);
    }
  }
  function emitCaseClause(node) {
    emitTokenWithComment(84 /* CaseKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    emitExpression(node.expression, parenthesizer.parenthesizeExpressionForDisallowedComma);
    emitCaseOrDefaultClauseRest(node, node.statements, node.expression.end);
  }
  function emitDefaultClause(node) {
    const pos = emitTokenWithComment(90 /* DefaultKeyword */, node.pos, writeKeyword, node);
    emitCaseOrDefaultClauseRest(node, node.statements, pos);
  }
  function emitCaseOrDefaultClauseRest(parentNode, statements, colonPos) {
    const emitAsSingleStatement = statements.length === 1 && // treat synthesized nodes as located on the same line for emit purposes
    (!currentSourceFile || nodeIsSynthesized(parentNode) || nodeIsSynthesized(statements[0]) || rangeStartPositionsAreOnSameLine(parentNode, statements[0], currentSourceFile));
    let format = 163969 /* CaseOrDefaultClauseStatements */;
    if (emitAsSingleStatement) {
      writeToken(59 /* ColonToken */, colonPos, writePunctuation, parentNode);
      writeSpace();
      format &= ~(1 /* MultiLine */ | 128 /* Indented */);
    } else {
      emitTokenWithComment(59 /* ColonToken */, colonPos, writePunctuation, parentNode);
    }
    emitList(parentNode, statements, format);
  }
  function emitHeritageClause(node) {
    writeSpace();
    writeTokenText(node.token, writeKeyword);
    writeSpace();
    emitList(node, node.types, 528 /* HeritageClauseTypes */);
  }
  function emitCatchClause(node) {
    const openParenPos = emitTokenWithComment(85 /* CatchKeyword */, node.pos, writeKeyword, node);
    writeSpace();
    if (node.variableDeclaration) {
      emitTokenWithComment(21 /* OpenParenToken */, openParenPos, writePunctuation, node);
      emit(node.variableDeclaration);
      emitTokenWithComment(22 /* CloseParenToken */, node.variableDeclaration.end, writePunctuation, node);
      writeSpace();
    }
    emit(node.block);
  }
  function emitPropertyAssignment(node) {
    emit(node.name);
    writePunctuation(":");
    writeSpace();
    const initializer = node.initializer;
    if ((getEmitFlags(initializer) & 1024 /* NoLeadingComments */) === 0) {
      const commentRange = getCommentRange(initializer);
      emitTrailingCommentsOfPosition(commentRange.pos);
    }
    emitExpression(initializer, parenthesizer.parenthesizeExpressionForDisallowedComma);
  }
  function emitShorthandPropertyAssignment(node) {
    emit(node.name);
    if (node.objectAssignmentInitializer) {
      writeSpace();
      writePunctuation("=");
      writeSpace();
      emitExpression(node.objectAssignmentInitializer, parenthesizer.parenthesizeExpressionForDisallowedComma);
    }
  }
  function emitSpreadAssignment(node) {
    if (node.expression) {
      emitTokenWithComment(26 /* DotDotDotToken */, node.pos, writePunctuation, node);
      emitExpression(node.expression, parenthesizer.parenthesizeExpressionForDisallowedComma);
    }
  }
  function emitEnumMember(node) {
    emit(node.name);
    emitInitializer(node.initializer, node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma);
  }
  function emitJSDoc(node) {
    write("/**");
    if (node.comment) {
      const text = getTextOfJSDocComment(node.comment);
      if (text) {
        const lines = text.split(/\r\n?|\n/g);
        for (const line of lines) {
          writeLine();
          writeSpace();
          writePunctuation("*");
          writeSpace();
          write(line);
        }
      }
    }
    if (node.tags) {
      if (node.tags.length === 1 && node.tags[0].kind === 350 /* JSDocTypeTag */ && !node.comment) {
        writeSpace();
        emit(node.tags[0]);
      } else {
        emitList(node, node.tags, 33 /* JSDocComment */);
      }
    }
    writeSpace();
    write("*/");
  }
  function emitJSDocSimpleTypedTag(tag) {
    emitJSDocTagName(tag.tagName);
    emitJSDocTypeExpression(tag.typeExpression);
    emitJSDocComment(tag.comment);
  }
  function emitJSDocSeeTag(tag) {
    emitJSDocTagName(tag.tagName);
    emit(tag.name);
    emitJSDocComment(tag.comment);
  }
  function emitJSDocNameReference(node) {
    writeSpace();
    writePunctuation("{");
    emit(node.name);
    writePunctuation("}");
  }
  function emitJSDocHeritageTag(tag) {
    emitJSDocTagName(tag.tagName);
    writeSpace();
    writePunctuation("{");
    emit(tag.class);
    writePunctuation("}");
    emitJSDocComment(tag.comment);
  }
  function emitJSDocTemplateTag(tag) {
    emitJSDocTagName(tag.tagName);
    emitJSDocTypeExpression(tag.constraint);
    writeSpace();
    emitList(tag, tag.typeParameters, 528 /* CommaListElements */);
    emitJSDocComment(tag.comment);
  }
  function emitJSDocTypedefTag(tag) {
    emitJSDocTagName(tag.tagName);
    if (tag.typeExpression) {
      if (tag.typeExpression.kind === 315 /* JSDocTypeExpression */) {
        emitJSDocTypeExpression(tag.typeExpression);
      } else {
        writeSpace();
        writePunctuation("{");
        write("Object");
        if (tag.typeExpression.isArrayType) {
          writePunctuation("[");
          writePunctuation("]");
        }
        writePunctuation("}");
      }
    }
    if (tag.fullName) {
      writeSpace();
      emit(tag.fullName);
    }
    emitJSDocComment(tag.comment);
    if (tag.typeExpression && tag.typeExpression.kind === 328 /* JSDocTypeLiteral */) {
      emitJSDocTypeLiteral(tag.typeExpression);
    }
  }
  function emitJSDocCallbackTag(tag) {
    emitJSDocTagName(tag.tagName);
    if (tag.name) {
      writeSpace();
      emit(tag.name);
    }
    emitJSDocComment(tag.comment);
    emitJSDocSignature(tag.typeExpression);
  }
  function emitJSDocOverloadTag(tag) {
    emitJSDocComment(tag.comment);
    emitJSDocSignature(tag.typeExpression);
  }
  function emitJSDocSimpleTag(tag) {
    emitJSDocTagName(tag.tagName);
    emitJSDocComment(tag.comment);
  }
  function emitJSDocTypeLiteral(lit) {
    emitList(lit, factory.createNodeArray(lit.jsDocPropertyTags), 33 /* JSDocComment */);
  }
  function emitJSDocSignature(sig) {
    if (sig.typeParameters) {
      emitList(sig, factory.createNodeArray(sig.typeParameters), 33 /* JSDocComment */);
    }
    if (sig.parameters) {
      emitList(sig, factory.createNodeArray(sig.parameters), 33 /* JSDocComment */);
    }
    if (sig.type) {
      writeLine();
      writeSpace();
      writePunctuation("*");
      writeSpace();
      emit(sig.type);
    }
  }
  function emitJSDocPropertyLikeTag(param) {
    emitJSDocTagName(param.tagName);
    emitJSDocTypeExpression(param.typeExpression);
    writeSpace();
    if (param.isBracketed) {
      writePunctuation("[");
    }
    emit(param.name);
    if (param.isBracketed) {
      writePunctuation("]");
    }
    emitJSDocComment(param.comment);
  }
  function emitJSDocTagName(tagName) {
    writePunctuation("@");
    emit(tagName);
  }
  function emitJSDocComment(comment) {
    const text = getTextOfJSDocComment(comment);
    if (text) {
      writeSpace();
      write(text);
    }
  }
  function emitJSDocTypeExpression(typeExpression) {
    if (typeExpression) {
      writeSpace();
      writePunctuation("{");
      emit(typeExpression.type);
      writePunctuation("}");
    }
  }
  function emitSourceFile(node) {
    writeLine();
    const statements = node.statements;
    const shouldEmitDetachedComment = statements.length === 0 || !isPrologueDirective(statements[0]) || nodeIsSynthesized(statements[0]);
    if (shouldEmitDetachedComment) {
      emitBodyWithDetachedComments(node, statements, emitSourceFileWorker);
      return;
    }
    emitSourceFileWorker(node);
  }
  function emitSyntheticTripleSlashReferencesIfNeeded(node) {
    emitTripleSlashDirectives(!!node.hasNoDefaultLib, node.syntheticFileReferences || [], node.syntheticTypeReferences || [], node.syntheticLibReferences || []);
    for (const prepend of node.prepends) {
      if (isUnparsedSource(prepend) && prepend.syntheticReferences) {
        for (const ref of prepend.syntheticReferences) {
          emit(ref);
          writeLine();
        }
      }
    }
  }
  function emitTripleSlashDirectivesIfNeeded(node) {
    if (node.isDeclarationFile)
      emitTripleSlashDirectives(node.hasNoDefaultLib, node.referencedFiles, node.typeReferenceDirectives, node.libReferenceDirectives);
  }
  function emitTripleSlashDirectives(hasNoDefaultLib, files, types, libs2) {
    if (hasNoDefaultLib) {
      const pos = writer.getTextPos();
      writeComment(`/// <reference no-default-lib="true"/>`);
      if (bundleFileInfo)
        bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "no-default-lib" /* NoDefaultLib */ });
      writeLine();
    }
    if (currentSourceFile && currentSourceFile.moduleName) {
      writeComment(`/// <amd-module name="${currentSourceFile.moduleName}" />`);
      writeLine();
    }
    if (currentSourceFile && currentSourceFile.amdDependencies) {
      for (const dep of currentSourceFile.amdDependencies) {
        if (dep.name) {
          writeComment(`/// <amd-dependency name="${dep.name}" path="${dep.path}" />`);
        } else {
          writeComment(`/// <amd-dependency path="${dep.path}" />`);
        }
        writeLine();
      }
    }
    for (const directive of files) {
      const pos = writer.getTextPos();
      writeComment(`/// <reference path="${directive.fileName}" />`);
      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(`/// <reference types="${directive.fileName}" ${resolutionMode}/>`);
      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(`/// <reference lib="${directive.fileName}" />`);
      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
