text: "use strict";
  Object.defineProperty(exports, "__esModule", { value: true });
  exports.getAppModulePath = exports.findBootstrapModulePath = exports.findBootstrapModuleCall = void 0;
  /**
   * @license
   * Copyright Google Inc. All Rights Reserved.
   *
   * Use of this source code is governed by an MIT-style license that can be
   * found in the LICENSE file at https://angular.io/license
   */
  const core_1 = require("@angular-devkit/core");
  const schematics_1 = require("@angular-devkit/schematics");
  const path_1 = require("path");
  const ts = require("typescript");
  const ast_utils_1 = require("./ast-utils");
  function findBootstrapModuleCall(host, mainPath) {
      const mainBuffer = host.read(mainPath);
      if (!mainBuffer) {
          throw new schematics_1.SchematicsException(`Main file (${mainPath}) not found`);
      }
      const mainText = mainBuffer.toString('utf-8');
      const source = ts.createSourceFile(mainPath, mainText, ts.ScriptTarget.Latest, true);
      const allNodes = ast_utils_1.getSourceNodes(source);
      let bootstrapCall = null;
      for (const node of allNodes) {
          let bootstrapCallNode = null;
          bootstrapCallNode = ast_utils_1.findNode(node, ts.SyntaxKind.Identifier, 'bootstrapModule');
          // Walk up the parent until CallExpression is found.
          while (bootstrapCallNode && bootstrapCallNode.parent
              && bootstrapCallNode.parent.kind !== ts.SyntaxKind.CallExpression) {
              bootstrapCallNode = bootstrapCallNode.parent;
          }
          if (bootstrapCallNode !== null &&
              bootstrapCallNode.parent !== undefined &&
              bootstrapCallNode.parent.kind === ts.SyntaxKind.CallExpression) {
              bootstrapCall = bootstrapCallNode.parent;
              break;
          }
      }
      return bootstrapCall;
  }
  exports.findBootstrapModuleCall = findBootstrapModuleCall;
  function findBootstrapModulePath(host, mainPath) {
      const bootstrapCall = findBootstrapModuleCall(host, mainPath);
      if (!bootstrapCall) {
          throw new schematics_1.SchematicsException('Bootstrap call not found');
      }
      const bootstrapModule = bootstrapCall.arguments[0];
      const mainBuffer = host.read(mainPath);
      if (!mainBuffer) {
          throw new schematics_1.SchematicsException(`Client app main file (${mainPath}) not found`);
      }
      const mainText = mainBuffer.toString('utf-8');
      const source = ts.createSourceFile(mainPath, mainText, ts.ScriptTarget.Latest, true);
      const allNodes = ast_utils_1.getSourceNodes(source);
      const bootstrapModuleRelativePath = allNodes
          .filter(node => node.kind === ts.SyntaxKind.ImportDeclaration)
          .filter(imp => {
          return ast_utils_1.findNode(imp, ts.SyntaxKind.Identifier, bootstrapModule.getText());
      })
          .map((imp) => {
          const modulePathStringLiteral = imp.moduleSpecifier;
          return modulePathStringLiteral.text;
      })[0];
      return bootstrapModuleRelativePath;
  }
  exports.findBootstrapModulePath = findBootstrapModulePath;
  function getAppModulePath(host, mainPath) {
      const moduleRelativePath = findBootstrapModulePath(host, mainPath);
      const mainDir = path_1.dirname(mainPath);
      const modulePath = core_1.normalize(`/${mainDir}/${moduleRelativePath}.ts`);
      return modulePath;
  }
  exports.getAppModulePath = getAppModulePath;
  //# sourceMappingURL=ng-ast-utils.js.map