feat(transform): support @Service decorator in JIT downlevel transform (#311)#320
Merged
Conversation
#311) Recognize Angular v22's @service decorator in the JIT downlevel pipeline so the runtime JIT facade (compileService) can rediscover it. A @service class is now restructured the same way as @Injectable: decorator removed, static decorators/ctorParameters emitted, and lowered via __decorate(...). - Add `Service` variant to `AngularDecoratorKind` and match it in `find_angular_decorator`; include `"Service"` in `ANGULAR_DECORATOR_NAMES`. - Add `AngularVersion::supports_service_decorator()` (v22+) helper. - Version-gate: when targeting Angular < 22, emit a diagnostic and leave the @service decorator unchanged (pass-through), since the runtime lacks compileService. Unknown version defaults to "supports". - Tests: @service downlevels like @Injectable (snapshot); targeting v21 surfaces a diagnostic and leaves the decorator in source. https://claude.ai/code/session_01U6t6qXHNPsEUk5ZFEcB8NQ
Member
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3637a89799
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…s kind A bare `@Service()` matched by raw name only would shadow a real Angular decorator on the same class. On pre-v22 targets the version gate would then emit a misleading "requires v22" diagnostic and `continue` past the sibling `@Component`/`@Injectable`, leaving it unlowered. Thread the import map into `find_angular_decorator` and require the `Service` identifier to resolve to `@angular/core`. Other Angular decorator names are left as raw-name matches to preserve namespace-style usage like `@core.Component()`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Brooooooklyn
approved these changes
May 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #311
Recognize Angular v22's @service decorator in the JIT downlevel pipeline so
the runtime JIT facade (compileService) can rediscover it. A @service class is
now restructured the same way as @Injectable: decorator removed, static
decorators/ctorParameters emitted, and lowered via __decorate(...).
Servicevariant toAngularDecoratorKindand match it infind_angular_decorator; include"Service"inANGULAR_DECORATOR_NAMES.AngularVersion::supports_service_decorator()(v22+) helper.@service decorator unchanged (pass-through), since the runtime lacks
compileService. Unknown version defaults to "supports".
surfaces a diagnostic and leaves the decorator in source.
https://claude.ai/code/session_01U6t6qXHNPsEUk5ZFEcB8NQ