Skip to content

fix(aot): a user binding named i0 collides with the injected import * as i0 from '@angular/core' #509

Description

@Brooooooklyn

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions