@@ -68,32 +68,47 @@ function getTranspiledDecoratorExpressionStatements(sourceFile: SourceFile) {
6868 if ( expressionStatement && expressionStatement . expression
6969 && expressionStatement . expression . kind === SyntaxKind . CallExpression
7070 && ( expressionStatement . expression as CallExpression ) . expression
71- && ( ( expressionStatement . expression as CallExpression ) . expression as Identifier ) . text === '___decorate' ) {
71+ && ( ( expressionStatement . expression as CallExpression ) . expression as Identifier ) . text === '___decorate'
72+ && ( expressionStatement . expression as CallExpression ) . arguments
73+ && ( expressionStatement . expression as CallExpression ) . arguments . length > 0
74+ && ( expressionStatement . expression as CallExpression ) . arguments [ 0 ] . kind === SyntaxKind . ArrayLiteralExpression
75+ && ( ( expressionStatement . expression as CallExpression ) . arguments [ 0 ] as ArrayLiteralExpression ) . elements
76+ && ( ( expressionStatement . expression as CallExpression ) . arguments [ 0 ] as ArrayLiteralExpression ) . elements . length > 0
77+ && ( ( ( expressionStatement . expression as CallExpression ) . arguments [ 0 ] as ArrayLiteralExpression ) . elements [ 0 ] as CallExpression ) . expression
78+ && ( ( ( expressionStatement . expression as CallExpression ) . arguments [ 0 ] as ArrayLiteralExpression ) . elements [ 0 ] as CallExpression ) . expression . kind === SyntaxKind . Identifier
79+ && canRemoveDecoratorNode ( ( ( ( ( expressionStatement . expression as CallExpression ) . arguments [ 0 ] as ArrayLiteralExpression ) . elements [ 0 ] as CallExpression ) . expression as Identifier ) . text )
80+ ) {
7281
7382 toReturn . push ( expressionStatement ) ;
7483
7584 } else if ( expressionStatement && expressionStatement . expression
76- && expressionStatement . expression . kind === SyntaxKind . BinaryExpression
77- && ( expressionStatement . expression as BinaryExpression ) . right
78- && ( expressionStatement . expression as BinaryExpression ) . right . kind === SyntaxKind . CallExpression
79- && ( ( expressionStatement . expression as BinaryExpression ) . right as CallExpression ) . expression
80- && ( ( ( expressionStatement . expression as BinaryExpression ) . right as CallExpression ) . expression as Identifier ) . text === '___decorate' ) {
81-
82- ( ( expressionStatement . expression as BinaryExpression ) . right as CallExpression ) . arguments . forEach ( argument => {
83- if ( argument . kind === SyntaxKind . ArrayLiteralExpression ) {
84- let injectableFound = false ;
85- for ( const element of ( argument as ArrayLiteralExpression ) . elements ) {
86- if ( element . kind === SyntaxKind . CallExpression && ( element as CallExpression ) . expression
87- && ( ( element as CallExpression ) . expression as Identifier ) . text === 'Injectable' ) {
88- injectableFound = true ;
89- break ;
90- }
91- }
92- if ( ! injectableFound ) {
93- toReturn . push ( expressionStatement ) ;
94- }
85+ && expressionStatement . expression . kind === SyntaxKind . BinaryExpression
86+ && ( expressionStatement . expression as BinaryExpression ) . right
87+ && ( expressionStatement . expression as BinaryExpression ) . right . kind === SyntaxKind . CallExpression
88+ && ( ( expressionStatement . expression as BinaryExpression ) . right as CallExpression ) . expression
89+ && ( ( ( expressionStatement . expression as BinaryExpression ) . right as CallExpression ) . expression as Identifier ) . text === '___decorate'
90+ && ( ( expressionStatement . expression as BinaryExpression ) . right as CallExpression ) . arguments
91+ && ( ( expressionStatement . expression as BinaryExpression ) . right as CallExpression ) . arguments . length > 0
92+ && ( ( expressionStatement . expression as BinaryExpression ) . right as CallExpression ) . arguments [ 0 ] . kind === SyntaxKind . ArrayLiteralExpression
93+ && ( ( ( expressionStatement . expression as BinaryExpression ) . right as CallExpression ) . arguments [ 0 ] as ArrayLiteralExpression ) . elements
94+ && ( ( ( expressionStatement . expression as BinaryExpression ) . right as CallExpression ) . arguments [ 0 ] as ArrayLiteralExpression ) . elements . length > 0 ) {
95+
96+ let immovableDecoratorFound = false ;
97+
98+ // remove the last item in the array as it is always __metadata() and should not be considered here
99+ const numElements = ( ( ( expressionStatement . expression as BinaryExpression ) . right as CallExpression ) . arguments [ 0 ] as ArrayLiteralExpression ) . elements . length - 1 ;
100+ const elementsToEvaluate = ( ( ( expressionStatement . expression as BinaryExpression ) . right as CallExpression ) . arguments [ 0 ] as ArrayLiteralExpression ) . elements . slice ( 0 , numElements ) ;
101+ for ( const element of elementsToEvaluate ) {
102+ if ( element . kind === SyntaxKind . CallExpression && ( element as CallExpression ) . expression
103+ && ! canRemoveDecoratorNode ( ( ( element as CallExpression ) . expression as Identifier ) . text ) ) {
104+
105+ immovableDecoratorFound = true ;
106+ break ;
95107 }
96- } ) ;
108+ }
109+ if ( ! immovableDecoratorFound ) {
110+ toReturn . push ( expressionStatement ) ;
111+ }
97112 }
98113 } ) ;
99114 return toReturn ;
@@ -170,7 +185,9 @@ function getDecoratorsExpressionStatements(typescriptFile: SourceFile) {
170185 const expressionStatements = findNodes ( typescriptFile , typescriptFile , SyntaxKind . ExpressionStatement , false ) as ExpressionStatement [ ] ;
171186 const decoratorExpressionStatements : ExpressionStatement [ ] = [ ] ;
172187 for ( const expressionStatement of expressionStatements ) {
173- if ( expressionStatement . expression && ( expressionStatement . expression as BinaryExpression ) . left && ( ( expressionStatement . expression as BinaryExpression ) . left as PropertyAccessExpression ) . name && ( ( expressionStatement . expression as BinaryExpression ) . left as PropertyAccessExpression ) . name . text === 'decorators' ) {
188+ if ( expressionStatement . expression && ( expressionStatement . expression as BinaryExpression ) . left
189+ && ( ( expressionStatement . expression as BinaryExpression ) . left as PropertyAccessExpression ) . name
190+ && ( ( expressionStatement . expression as BinaryExpression ) . left as PropertyAccessExpression ) . name . text === 'decorators' ) {
174191 decoratorExpressionStatements . push ( expressionStatement ) ;
175192 }
176193 }
@@ -248,6 +265,8 @@ function canRemoveDecoratorNode(decoratorType: string) {
248265 return true ;
249266 } else if ( decoratorType === VIEW_CHILDREN_DECORATOR ) {
250267 return true ;
268+ } else if ( decoratorType === IONIC_PAGE_DECORATOR ) {
269+ return true ;
251270 }
252271 return false ;
253272}
@@ -265,5 +284,6 @@ export const OUTPUT_DECORATOR = 'Output';
265284export const PIPE_DECORATOR = 'Pipe' ;
266285export const VIEW_CHILD_DECORATOR = 'ViewChild' ;
267286export const VIEW_CHILDREN_DECORATOR = 'ViewChildren' ;
287+ export const IONIC_PAGE_DECORATOR = 'IonicPage' ;
268288
269289export const PURE_ANNOTATION = ' /*#__PURE__*/' ;
0 commit comments