angular-cli icon indicating copy to clipboard operation
angular-cli copied to clipboard

Decorator metadata missing in production build

Open bagbag opened this issue 1 year ago • 5 comments

Which @angular/* package(s) are the source of the bug?

compiler-cli, compiler

Is this a regression?

Yes

Description

Decorator metadata like "design:type" is missing in production builds, while working in development.

Having the following code:

export class MyClass {
  @Property()
  address: string;
}

Compiles the to the following in development:

var MyClass = class {
}
;
__decorate20([Property16(), __metadata20("design:type", String)], MyClass.prototype, "address", void 0);

But to the following in production build:

var Nr = class {
}
;
r([t()], Nr.prototype, "address", 2),

The information about the property address being of type String is missing.

Please provide a link to a minimal reproduction of the bug

No response

Please provide the exception or error you saw

No response

Please provide the environment you discovered this bug in (run ng version)

Angular CLI: 18.1.3
Node: 22.5.1
Package Manager: npm 10.8.2
OS: linux x64

Angular: 18.1.3
... animations, build, cdk, cli, common, compiler, compiler-cli
... core, forms, platform-browser, platform-browser-dynamic
... router, service-worker

Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.1801.3
@angular-devkit/core         18.1.3
@angular-devkit/schematics   18.1.3
@schematics/angular          18.1.3
rxjs                         7.8.1
typescript                   5.5.4

Anything else?

No response

bagbag avatar Aug 03 '24 16:08 bagbag

Hi, could you provide a stackblitz repro or a github repo that exhibits this issue ?

JeanMeche avatar Aug 03 '24 17:08 JeanMeche

I've created a minimal reproduction: https://github.com/bagbag/angular-decorator-metadata

If you start the application with ng serve, you will see Design type: String If you start the application with ng serve --configuration production, you will see Could not get design type, as the decorator metadata is not added to the compiled output.

While trying to reproduce this problem I found out, that it only occurs if isolatedModules is set to true in tsconfig.

bagbag avatar Aug 04 '24 11:08 bagbag

It looks like to be linked to #27752.

Esbuild doesn't generate those metadata.

JeanMeche avatar Aug 04 '24 18:08 JeanMeche

It looks like to be linked to #27752.

Esbuild doesn't generate those metadata.

Yeah, I suppose the CLI should not use this mode when emitDecoratorMetadata is enabled.

That said, I wouldn't want to depend on this metadata going forward, as it's currently only supported for the experimental decorators in TS, not the ES standard ones. reference

JoostK avatar Aug 04 '24 18:08 JoostK

Additionally, emitDecoratorMetadata itself has design flaws that can cause it to generate runtime TDZ errors in ES2015+ code. All code generated by the Angular CLI is ES2015+. Angular does not require the use of the option and unless absolutely required by specific project code, the option should ideally be removed.

clydin avatar Aug 05 '24 12:08 clydin

This issue has been automatically locked due to inactivity. Please file a new issue if you are encountering a similar or related problem.

Read more about our automatic conversation locking policy.

This action has been performed automatically by a bot.