Dynamic host attribute values are rejected (and two local-compilation-only transform cases)
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 35/100
Direzione di ricerca
Start with evaluateHostExpressionBindings in annotations/directive/src/shared.ts and follow how parseHostBindings emits plain host attributes; compare that path with the [prop], (event), class, and style handling described here. The expected output is an expression in hostAttrs, matching ngc's hostAttrs: ["test", test], while cases 2 and 3 should retain their full-mode diagnostics. The linked open pull request indicates this work is already underway.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
Three Angular ngtsc specs compile with ngtsc but get a compile error from oxc, so a Vite build fails. Found by running Angular v22.0.0's ngtsc emit specs against oxc main (04cb3b2). Only case 1 is a bug in oxc. Cases 2 and 3 compile only in ngtsc's local compilation mode. That mode skips these checks because a separate full build checks them, and oxc already matches the full-mode diagnostics on purpose (#494).
1. Dynamic host attribute value (bug)
ngtsc_spec.ts: "should accept dynamic host attribute bindings"
// other.d.ts
export declare const foo: any;
// test.ts
import {Component} from '@angular/core';
import {foo} from './other';
const test = foo.bar();
@Component({selector: 'test', template: '', host: {'test': test}})
export class TestCmp {}
Actual
@Component.host depends on 'foo', which is imported from another module. OXC compiles one file at a time and cannot evaluate values from other files.
The error is the same with and without resolveImportedValues. A same-file dynamic value (host: {role: make()}) is also rejected: ... could not be determined statically. OXC does not support dynamic host attribute values.
Expected (ngc)
hostAttrs: ["test", test]
Cause
evaluateHostExpressionBindings (annotations/directive/src/shared.ts) turns a DynamicValue into new WrappedNodeExpr(value.node). parseHostBindings then emits it as is for a plain attribute, and rejects it only for [prop], (event), class and style. oxc stores host attribute values as strings, so it has no way to emit an expression.
2. Input transform from a namespace import (not a bug)
local_compilation_spec.ts: "should generate input info for transform function imported externally using namespace"
import * as n from './some_where';
// ...
@Input({transform: n.externalFunc}) x: string = '';
Actual: Input transform function could not be referenced Value is a reference to 'externalFunc'. Local mode emits inputs: { x: [2, "x", "x", n.externalFunc] }.
3. Inline transform with an untyped parameter (not a bug)
local_compilation_spec.ts: "should not check inline function param type"
@Input({transform: v => v + 'TRANSFORMED!'}) x: string = '';
Actual: Input transform function first parameter must have a type Value could not be determined statically. Local mode emits inputs: { x: [2, "x", "x", v => v + 'TRANSFORMED!'] }.
Why 2 and 3 are not bugs
parseDecoratorInputTransformFunction skips every transform check when compilationMode === LOCAL, "because usually the type check is done in a separate build which runs in full compilation mode". In full mode, which is what ng build uses, ngtsc reports both errors:
- case 3 matches
ngtsc_spec.ts"should produce a diangostic if the transform function first parameter has no arguments" (transform: (val) => 1); - for case 2, a namespace member has no identity in the file (
getIdentityInreturns null), and #494 checked this against ngtsc 22.1.7 (namespace_imported_transform_cannot_be_referenced).
oxc is the only compiler in a Vite build, so no other build would check these. Dropping the checks would let code through that ng build rejects. I left both cases as they are.
- Lingua principale
- Rust
- Stelle
- 244
- Fork
- 26
- Merge medio
- 23h 41m
- PR unite (30g)
- 106
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di voidzero-dev/oxc-angular-compiler
-
Partial mode: NgModule-declared components get no dependencies, so their directives never matchAperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
voidzero-dev/oxc-angular-compiler#655 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
voidzero-dev/oxc-angular-compiler#654 ·
I maintainer di solito rispondono entro 1 giorno
-
Constructor param typed by a same-file interface is injected as a token (ReferenceError at runtime)Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 73/100
voidzero-dev/oxc-angular-compiler#653 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 28/100
voidzero-dev/oxc-angular-compiler#623 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Support useDefineForClassFields: false (Class Field Lowering)Forse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
voidzero-dev/oxc-angular-compiler#73 · 11 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di voidzero-dev/oxc-angular-compiler
Issue simili
-
Add a just recipe that runs the workflow linters locallyForse già presa @sgamelin l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
-
good first issue security
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100
-
Status bar: a progress line that keeps the same text (import at 0%) ages out after 8 s and blinksApertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
transit-audio/transit#216 ·
-
area: effects devices enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
suhina-daw/suhina-daw#1060 ·
I maintainer di solito rispondono entro 1 giorno