mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-18 03:23:57 +08:00
Updates for all angular.io links to the new angular.dev domain. Additionally, adjustment to new resources where the equivalent does not exist on the new site (e.g. Tour of Heroes tutorial)
95 lines
2.9 KiB
TypeScript
95 lines
2.9 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC 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.dev/license
|
|
*/
|
|
|
|
import { SchematicsException, Tree } from '@angular-devkit/schematics';
|
|
import { dirname, join } from 'node:path/posix';
|
|
import * as ts from '../third_party/github.com/Microsoft/TypeScript/lib/typescript';
|
|
import { findNode, getSourceNodes } from '../utility/ast-utils';
|
|
import { findBootstrapApplicationCall } from './standalone/util';
|
|
|
|
export function findBootstrapModuleCall(host: Tree, mainPath: string): ts.CallExpression | null {
|
|
const mainText = host.readText(mainPath);
|
|
const source = ts.createSourceFile(mainPath, mainText, ts.ScriptTarget.Latest, true);
|
|
|
|
const allNodes = getSourceNodes(source);
|
|
|
|
let bootstrapCall: ts.CallExpression | null = null;
|
|
|
|
for (const node of allNodes) {
|
|
let bootstrapCallNode: ts.Node | null = null;
|
|
bootstrapCallNode = 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 as ts.CallExpression;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return bootstrapCall;
|
|
}
|
|
|
|
function findBootstrapModulePath(host: Tree, mainPath: string): string {
|
|
const bootstrapCall = findBootstrapModuleCall(host, mainPath);
|
|
if (!bootstrapCall) {
|
|
throw new SchematicsException('Bootstrap call not found');
|
|
}
|
|
|
|
const bootstrapModule = bootstrapCall.arguments[0];
|
|
|
|
const mainText = host.readText(mainPath);
|
|
const source = ts.createSourceFile(mainPath, mainText, ts.ScriptTarget.Latest, true);
|
|
const allNodes = getSourceNodes(source);
|
|
const bootstrapModuleRelativePath = allNodes
|
|
.filter(ts.isImportDeclaration)
|
|
.filter((imp) => {
|
|
return findNode(imp, ts.SyntaxKind.Identifier, bootstrapModule.getText());
|
|
})
|
|
.map((imp) => {
|
|
const modulePathStringLiteral = imp.moduleSpecifier as ts.StringLiteral;
|
|
|
|
return modulePathStringLiteral.text;
|
|
})[0];
|
|
|
|
return bootstrapModuleRelativePath;
|
|
}
|
|
|
|
export function getAppModulePath(host: Tree, mainPath: string): string {
|
|
const moduleRelativePath = findBootstrapModulePath(host, mainPath);
|
|
const mainDir = dirname(mainPath);
|
|
const modulePath = join(mainDir, `${moduleRelativePath}.ts`);
|
|
|
|
return modulePath;
|
|
}
|
|
|
|
export function isStandaloneApp(host: Tree, mainPath: string): boolean {
|
|
try {
|
|
findBootstrapApplicationCall(host, mainPath);
|
|
|
|
return true;
|
|
} catch (error) {
|
|
if (error instanceof SchematicsException) {
|
|
return false;
|
|
}
|
|
|
|
throw error;
|
|
}
|
|
}
|