@@ -68,32 +68,47 @@ function getTranspiledDecoratorExpressionStatements(sourceFile: SourceFile) {
68
68
if ( expressionStatement && expressionStatement . expression
69
69
&& expressionStatement . expression . kind === SyntaxKind . CallExpression
70
70
&& ( 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
+ ) {
72
81
73
82
toReturn . push ( expressionStatement ) ;
74
83
75
84
} 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 ;
95
107
}
96
- } ) ;
108
+ }
109
+ if ( ! immovableDecoratorFound ) {
110
+ toReturn . push ( expressionStatement ) ;
111
+ }
97
112
}
98
113
} ) ;
99
114
return toReturn ;
@@ -170,7 +185,9 @@ function getDecoratorsExpressionStatements(typescriptFile: SourceFile) {
170
185
const expressionStatements = findNodes ( typescriptFile , typescriptFile , SyntaxKind . ExpressionStatement , false ) as ExpressionStatement [ ] ;
171
186
const decoratorExpressionStatements : ExpressionStatement [ ] = [ ] ;
172
187
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' ) {
174
191
decoratorExpressionStatements . push ( expressionStatement ) ;
175
192
}
176
193
}
@@ -248,6 +265,8 @@ function canRemoveDecoratorNode(decoratorType: string) {
248
265
return true ;
249
266
} else if ( decoratorType === VIEW_CHILDREN_DECORATOR ) {
250
267
return true ;
268
+ } else if ( decoratorType === IONIC_PAGE_DECORATOR ) {
269
+ return true ;
251
270
}
252
271
return false ;
253
272
}
@@ -265,5 +284,6 @@ export const OUTPUT_DECORATOR = 'Output';
265
284
export const PIPE_DECORATOR = 'Pipe' ;
266
285
export const VIEW_CHILD_DECORATOR = 'ViewChild' ;
267
286
export const VIEW_CHILDREN_DECORATOR = 'ViewChildren' ;
287
+ export const IONIC_PAGE_DECORATOR = 'IonicPage' ;
268
288
269
289
export const PURE_ANNOTATION = ' /*#__PURE__*/' ;
0 commit comments