Skip to content

Commit e642b53

Browse files
clydinmgechev
authored andcommitted
fix(@ngtools/webpack): only add ctor params to decorated classes (#15416)
Fixes #15404
1 parent 1cc40d8 commit e642b53

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

packages/ngtools/webpack/src/transformers/ctor-parameters.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ export function decoratorDownlevelTransformer(
287287
}
288288

289289
function visitor<T extends ts.Node>(node: T): ts.Node {
290-
if (ts.isClassDeclaration(node)) {
290+
if (ts.isClassDeclaration(node) && node.decorators && node.decorators.length > 0) {
291291
return ts.updateClassDeclaration(
292292
node,
293293
node.decorators,

packages/ngtools/webpack/src/transformers/ctor-parameters_spec.ts

+38-7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,30 @@ function transform(input: string, additionalFiles?: Record<string, string>) {
1919

2020
describe('Constructor Parameter Transformer', () => {
2121
it('records class name in same module', () => {
22+
const input = `
23+
export class ClassInject {};
24+
25+
@Injectable()
26+
export class MyService {
27+
constructor(v: ClassInject) {}
28+
}
29+
`;
30+
31+
const output = `
32+
import * as tslib_1 from "tslib";
33+
export class ClassInject { } ;
34+
let MyService = class MyService { constructor(v) { } };
35+
MyService.ctorParameters = () => [ { type: ClassInject } ];
36+
MyService = tslib_1.__decorate([ Injectable() ], MyService);
37+
export { MyService };
38+
`;
39+
40+
const result = transform(input);
41+
42+
expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`);
43+
});
44+
45+
it('does not record when class does not have a decorator', () => {
2246
const input = `
2347
export class ClassInject {};
2448
@@ -29,7 +53,7 @@ describe('Constructor Parameter Transformer', () => {
2953

3054
const output = `
3155
export class ClassInject { } ;
32-
export class MyService { constructor(v) { } } MyService.ctorParameters = () => [ { type: ClassInject } ];
56+
export class MyService { constructor(v) { } }
3357
`;
3458

3559
const result = transform(input);
@@ -47,19 +71,22 @@ describe('Constructor Parameter Transformer', () => {
4771
constructor() { }
4872
}
4973
74+
@Injectable()
5075
export class MyService {
5176
constructor(v: RootProvidedService) {}
5277
}
5378
`;
5479

55-
// tslint:disable:max-line-length
5680
const output = `
5781
import * as tslib_1 from "tslib";
5882
let RootProvidedService = class RootProvidedService { constructor() { } };
5983
RootProvidedService = tslib_1.__decorate([ Injectable({ providedIn: 'root' }) ], RootProvidedService);
60-
export { RootProvidedService }; export class MyService { constructor(v) { } } MyService.ctorParameters = () => [ { type: RootProvidedService } ];
84+
export { RootProvidedService };
85+
let MyService = class MyService { constructor(v) { } };
86+
MyService.ctorParameters = () => [ { type: RootProvidedService } ];
87+
MyService = tslib_1.__decorate([ Injectable() ], MyService);
88+
export { MyService };
6189
`;
62-
// tslint:enable:max-line-length
6390

6491
const result = transform(input);
6592

@@ -84,6 +111,7 @@ describe('Constructor Parameter Transformer', () => {
84111
const input = `
85112
import { RootProvidedService } from './root-provided-service';
86113
114+
@Injectable()
87115
export class MyService {
88116
constructor(v: RootProvidedService) {}
89117
}
@@ -101,6 +129,7 @@ describe('Constructor Parameter Transformer', () => {
101129
export interface InterInject {}
102130
export const INTERFACE_INJECT = new InjectionToken<InterInject>('interface-inject');
103131
132+
@Injectable()
104133
export class MyService {
105134
constructor(@Inject(INTERFACE_INJECT) v: InterInject) {}
106135
}
@@ -111,7 +140,7 @@ describe('Constructor Parameter Transformer', () => {
111140
export const INTERFACE_INJECT = new InjectionToken('interface-inject');
112141
let MyService = class MyService { constructor(v) { } };
113142
MyService.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [INTERFACE_INJECT,] }] } ];
114-
MyService = tslib_1.__decorate([ tslib_1.__param(0, Inject(INTERFACE_INJECT)) ], MyService);
143+
MyService = tslib_1.__decorate([ Injectable(), tslib_1.__param(0, Inject(INTERFACE_INJECT)) ], MyService);
115144
export { MyService };
116145
`;
117146

@@ -125,6 +154,7 @@ describe('Constructor Parameter Transformer', () => {
125154
interface InterInject {}
126155
export const INTERFACE_INJECT = new InjectionToken<InterInject>('interface-inject');
127156
157+
@Injectable()
128158
export class MyService {
129159
constructor(@Inject(INTERFACE_INJECT) v: InterInject) {}
130160
}
@@ -135,7 +165,7 @@ describe('Constructor Parameter Transformer', () => {
135165
export const INTERFACE_INJECT = new InjectionToken('interface-inject');
136166
let MyService = class MyService { constructor(v) { } };
137167
MyService.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [INTERFACE_INJECT,] }] } ];
138-
MyService = tslib_1.__decorate([ tslib_1.__param(0, Inject(INTERFACE_INJECT)) ], MyService);
168+
MyService = tslib_1.__decorate([ Injectable(), tslib_1.__param(0, Inject(INTERFACE_INJECT)) ], MyService);
139169
export { MyService };
140170
`;
141171

@@ -155,6 +185,7 @@ describe('Constructor Parameter Transformer', () => {
155185
const input = `
156186
import { INTERFACE_INJECT, InterInject } from './module-inject';
157187
188+
@Injectable()
158189
export class MyService {
159190
constructor(@Inject(INTERFACE_INJECT) v: InterInject) {}
160191
}
@@ -165,7 +196,7 @@ describe('Constructor Parameter Transformer', () => {
165196
import { INTERFACE_INJECT } from './module-inject';
166197
let MyService = class MyService { constructor(v) { } };
167198
MyService.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [INTERFACE_INJECT,] }] } ];
168-
MyService = tslib_1.__decorate([ tslib_1.__param(0, Inject(INTERFACE_INJECT)) ], MyService);
199+
MyService = tslib_1.__decorate([ Injectable(), tslib_1.__param(0, Inject(INTERFACE_INJECT)) ], MyService);
169200
export { MyService };
170201
`;
171202

0 commit comments

Comments
 (0)