In AOT output, OXC always adds import * as i0 from '@angular/core' and refers to it as i0. If the file already has a top-level i0, the output declares it twice (a SyntaxError), and the Ivy code may use the user's i0. ngtsc picks a free name (i0_1). #504 fixed this for the JIT path by choosing a free name. AOT still uses a fixed name.
Repro A
import {Component} from '@angular/core';
const i0 = 1;
@Component({selector: 'c', template: '<div>{{v}}</div>'})
export class C { v = i0; }
Repro B
import {Component} from '@angular/core';
import * as i0 from './other';
@Component({selector: 'c', template: '<div>{{v}}</div>'})
export class C { v = i0.x; }
OXC (main and #504 tip)
import {Component} from '@angular/core';
import * as i0 from '@angular/core';
const i0 = 1; // duplicate declaration
export class C { v = i0;
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({...
import * as i0 from './other';
import * as i0 from '@angular/core'; // duplicate import binding
ngtsc 22.1.7
import * as i0_1 from "@angular/core";
const i0 = 1;
export class C {
v = i0;
static ɵcmp = /*@__PURE__*/ i0_1.ɵɵdefineComponent({ ... i0_1.ɵɵtext(1); ...
(B: import * as i0 from './other'; import * as i0_1 from "@angular/core";)
Where
i0 is hard-coded in several places:
crates/oxc_angular_compiler/src/component/namespace_registry.rs (@angular/core → i0; the iN names for other modules have the same problem)
class_metadata/compiler.rs (ReadVarExpr { name: "i0" })
component/transform.rs (HMR namespace dependency, and the emitted import)
On main?
Yes. #504 only fixes the JIT path (JIT_ANGULAR_CORE_NS, commit 5128879).
Direction
Pick the namespace alias once per file, avoiding top-level bindings (as #504 does for JIT and as ngtsc's ImportManager does), and pass it to every place that emits the namespace.
In AOT output, OXC always adds
import * as i0 from '@angular/core'and refers to it asi0. If the file already has a top-leveli0, the output declares it twice (a SyntaxError), and the Ivy code may use the user'si0. ngtsc picks a free name (i0_1). #504 fixed this for the JIT path by choosing a free name. AOT still uses a fixed name.Repro A
Repro B
OXC (main and #504 tip)
ngtsc 22.1.7
(B:
import * as i0 from './other'; import * as i0_1 from "@angular/core";)Where
i0is hard-coded in several places:crates/oxc_angular_compiler/src/component/namespace_registry.rs(@angular/core→i0; theiNnames for other modules have the same problem)class_metadata/compiler.rs(ReadVarExpr { name: "i0" })component/transform.rs(HMR namespace dependency, and the emitted import)On main?
Yes. #504 only fixes the JIT path (
JIT_ANGULAR_CORE_NS, commit 5128879).Direction
Pick the namespace alias once per file, avoiding top-level bindings (as #504 does for JIT and as ngtsc's
ImportManagerdoes), and pass it to every place that emits the namespace.