mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-18 03:23:57 +08:00
feat(@angular-devkit/build-optimizer): scrub ɵsetClassMetadata and ɵɵsetNgModuleScope calls
This commit is contained in:
parent
b1f7537342
commit
5564ce6ea1
@ -17,6 +17,8 @@ export function testScrubFile(content: string) {
|
|||||||
'__decorate',
|
'__decorate',
|
||||||
'propDecorators',
|
'propDecorators',
|
||||||
'ctorParameters',
|
'ctorParameters',
|
||||||
|
'ɵsetClassMetadata',
|
||||||
|
'ɵɵsetNgModuleScope',
|
||||||
];
|
];
|
||||||
|
|
||||||
return markers.some((marker) => content.indexOf(marker) !== -1);
|
return markers.some((marker) => content.indexOf(marker) !== -1);
|
||||||
@ -51,7 +53,8 @@ function scrubFileTransformer(checker: ts.TypeChecker, isAngularCoreFile: boolea
|
|||||||
}
|
}
|
||||||
const exprStmt = node as ts.ExpressionStatement;
|
const exprStmt = node as ts.ExpressionStatement;
|
||||||
// Do checks that don't need the typechecker first and bail early.
|
// Do checks that don't need the typechecker first and bail early.
|
||||||
if (isCtorParamsAssignmentExpression(exprStmt)) {
|
if (isIvyPrivateCallExpression(exprStmt)
|
||||||
|
|| isCtorParamsAssignmentExpression(exprStmt)) {
|
||||||
nodes.push(node);
|
nodes.push(node);
|
||||||
} else if (isDecoratorAssignmentExpression(exprStmt)) {
|
} else if (isDecoratorAssignmentExpression(exprStmt)) {
|
||||||
nodes.push(...pickDecorationNodesToRemove(exprStmt, ngMetadata, checker));
|
nodes.push(...pickDecorationNodesToRemove(exprStmt, ngMetadata, checker));
|
||||||
@ -310,6 +313,24 @@ function isAssignmentExpressionTo(exprStmt: ts.ExpressionStatement, name: string
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isIvyPrivateCallExpression(exprStmt: ts.ExpressionStatement) {
|
||||||
|
const callExpr = exprStmt.expression;
|
||||||
|
if (!ts.isCallExpression(callExpr)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const propAccExpr = callExpr.expression;
|
||||||
|
if (!ts.isPropertyAccessExpression(propAccExpr)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (propAccExpr.name.text != 'ɵsetClassMetadata'
|
||||||
|
&& propAccExpr.name.text != 'ɵɵsetNgModuleScope') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Remove Angular decorators from`Clazz.decorators = [...];`, or expression itself if all are
|
// Remove Angular decorators from`Clazz.decorators = [...];`, or expression itself if all are
|
||||||
// removed.
|
// removed.
|
||||||
function pickDecorationNodesToRemove(
|
function pickDecorationNodesToRemove(
|
||||||
|
@ -612,4 +612,42 @@ describe('scrub-file', () => {
|
|||||||
expect(tags.oneLine`${transform(input)}`).toEqual(tags.oneLine`${output}`);
|
expect(tags.oneLine`${transform(input)}`).toEqual(tags.oneLine`${output}`);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Ivy', () => {
|
||||||
|
it('removes ɵsetClassMetadata call', () => {
|
||||||
|
const output = tags.stripIndent`
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
${clazz}
|
||||||
|
`;
|
||||||
|
const input = tags.stripIndent`
|
||||||
|
${output}
|
||||||
|
/*@__PURE__*/ i0.ɵsetClassMetadata(Clazz, [{
|
||||||
|
type: Component,
|
||||||
|
args: [{
|
||||||
|
selector: 'app-lazy',
|
||||||
|
template: 'very lazy',
|
||||||
|
styles: []
|
||||||
|
}]
|
||||||
|
}], null, null);
|
||||||
|
`;
|
||||||
|
|
||||||
|
expect(testScrubFile(input)).toBeTruthy();
|
||||||
|
expect(tags.oneLine`${transform(input)}`).toEqual(tags.oneLine`${output}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('removes ɵɵsetNgModuleScope call', () => {
|
||||||
|
const output = tags.stripIndent`
|
||||||
|
import { CommonModule } from '@angular/common';
|
||||||
|
import * as i0 from "@angular/core";
|
||||||
|
${clazz}
|
||||||
|
`;
|
||||||
|
const input = tags.stripIndent`
|
||||||
|
${output}
|
||||||
|
/*@__PURE__*/ i0.ɵɵsetNgModuleScope(Clazz, { declarations: [], imports: [CommonModule] });
|
||||||
|
`;
|
||||||
|
|
||||||
|
expect(testScrubFile(input)).toBeTruthy();
|
||||||
|
expect(tags.oneLine`${transform(input)}`).toEqual(tags.oneLine`${output}`);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user