fix(ngcc): recognize re-exports with require()
calls in UMD (#34512)
Previously, `UmdReflectionHost` would only recognize re-exports of the form `__export(someIdentifier)` and not `__export(require('...'))`. However, it is possible in some UMD variations to have the latter format as well. See discussion in https://github.com/angular/angular/pull/34254/files#r359515373 This commit adds support for re-export of the form `__export(require('...'))` in UMD. PR Close #34512
This commit is contained in:

committed by
Alex Rickabaugh

parent
7bbfccfcd8
commit
79be3544c1
@ -145,11 +145,25 @@ export class UmdReflectionHost extends Esm5ReflectionHost {
|
||||
|
||||
private extractUmdReexports(statement: ReexportStatement, containingFile: ts.SourceFile):
|
||||
UmdExportDeclaration[] {
|
||||
const importParameter = this.findUmdImportParameter(statement.expression.arguments[0]);
|
||||
const importPath = importParameter && this.getUmdImportPath(importParameter);
|
||||
const reexportArg = statement.expression.arguments[0];
|
||||
|
||||
const requireCall = isRequireCall(reexportArg) ?
|
||||
reexportArg :
|
||||
ts.isIdentifier(reexportArg) ? this.findRequireCallReference(reexportArg) : null;
|
||||
|
||||
let importPath: string|null = null;
|
||||
|
||||
if (requireCall !== null) {
|
||||
importPath = requireCall.arguments[0].text;
|
||||
} else if (ts.isIdentifier(reexportArg)) {
|
||||
const importParameter = this.findUmdImportParameter(reexportArg);
|
||||
importPath = importParameter && this.getUmdImportPath(importParameter);
|
||||
}
|
||||
|
||||
if (importPath === null) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const importedFile = this.resolveModuleName(importPath, containingFile);
|
||||
if (importedFile === undefined) {
|
||||
return [];
|
||||
@ -182,6 +196,14 @@ export class UmdReflectionHost extends Esm5ReflectionHost {
|
||||
return declaration && ts.isParameter(declaration) ? declaration : null;
|
||||
}
|
||||
|
||||
private findRequireCallReference(id: ts.Identifier): RequireCall|null {
|
||||
const symbol = id && this.checker.getSymbolAtLocation(id) || null;
|
||||
const declaration = symbol && symbol.valueDeclaration;
|
||||
const initializer =
|
||||
declaration && ts.isVariableDeclaration(declaration) && declaration.initializer || null;
|
||||
return initializer && isRequireCall(initializer) ? initializer : null;
|
||||
}
|
||||
|
||||
private getUmdImportedDeclaration(id: ts.Identifier): Declaration|null {
|
||||
const importInfo = this.getImportOfIdentifier(id);
|
||||
if (importInfo === null) {
|
||||
@ -277,13 +299,12 @@ interface UmdExportDeclaration {
|
||||
declaration: Declaration;
|
||||
}
|
||||
|
||||
type ReexportStatement = ts.ExpressionStatement & {expression: {arguments: [ts.Identifier]}};
|
||||
type ReexportStatement = ts.ExpressionStatement & {expression: ts.CallExpression};
|
||||
function isReexportStatement(statement: ts.Statement): statement is ReexportStatement {
|
||||
return ts.isExpressionStatement(statement) && ts.isCallExpression(statement.expression) &&
|
||||
ts.isIdentifier(statement.expression.expression) &&
|
||||
statement.expression.expression.text === '__export' &&
|
||||
statement.expression.arguments.length === 1 &&
|
||||
ts.isIdentifier(statement.expression.arguments[0]);
|
||||
statement.expression.arguments.length === 1;
|
||||
}
|
||||
|
||||
function getRequiredModulePath(wrapperFn: ts.FunctionExpression, paramIndex: number): string {
|
||||
@ -315,7 +336,8 @@ function getRequiredModulePath(wrapperFn: ts.FunctionExpression, paramIndex: num
|
||||
}
|
||||
}
|
||||
|
||||
function isRequireCall(node: ts.Node): node is ts.CallExpression {
|
||||
type RequireCall = ts.CallExpression & {arguments: [ts.StringLiteral]};
|
||||
function isRequireCall(node: ts.Node): node is RequireCall {
|
||||
return ts.isCallExpression(node) && ts.isIdentifier(node.expression) &&
|
||||
node.expression.text === 'require' && node.arguments.length === 1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user