Skip to content

Angular: Fix zone.js drop in angular-to-angular-vite migration + schema sync + transform widening - #35386

Merged
valentinpalkovic merged 14 commits into
nextfrom
task/ffd6b664-Automigrating-an-ngular-21-pro
Jul 9, 2026
Merged

valentinpalkovic merged 14 commits into
nextfrom
task/ffd6b664-Automigrating-an-ngular-21-pro

Conversation

@valentinpalkovic

@valentinpalkovic valentinpalkovic commented Jul 7, 2026 •

Copy link
Copy Markdown
Contributor

Closes #

What I did

Fixed the angular-to-angular-vite automigration dropping zone.js for zone-based Angular projects (e.g. Bitwarden clients), plus two adjacent bugs so the zoneless story lands coherently in one PR:

  • The migration now detects whether zone.js is needed using a flag-only signal (options.experimentalZoneless !== true) across every :start-storybook/:build-storybook target in angular.json/Nx project.json (skip injection only if EVERY storybook target explicitly sets the flag true). When needed, it idempotently prepends import 'zone.js'; to the Storybook preview file, and renames any leftover experimentalZoneless key to zoneless in the migrated targets.
  • Bug A: @storybook/angular-vite's published start-schema.json/build-schema.json still declared the stale experimentalZoneless option instead of zoneless, so the correct zoneless: false setting failed Angular CLI schema validation while the stale key passed silently. Both schemas now declare zoneless and no longer declare experimentalZoneless.
  • Bug B: preset.ts's runtime transform hook only matched a literal preview.ts, so .tsx (and other) preview files never received the zone.js injection at build time. It now resolves the preview path once via findConfigFile (core's own preview-resolution list), cached in the plugin's config() hook to avoid repeated disk I/O per transformed module.

Checklist for Contributors

Testing

The changes in this PR are covered in the following automated tests:

  • stories
  • unit tests
  • integration tests
  • end-to-end tests

Manual testing

This bug reproduces on any real Angular >= 21 project using zone-based change detection whose Storybook builder target does not explicitly set experimentalZoneless: true (the common case, since the flag defaults to unset). Bitwarden's clients repo is a good real-world reproduction:

  1. Shallow-clone https://github.com/bitwarden/clients and npm install (node >= 22.12, npm ~10, per its engines field).
  2. Reproduce the bug (pre-fix): run the currently-published automigration against the checkout: npx storybook@10.5.0-alpha.11 automigrate angular-to-angular-vite --yes --config-dir .storybook. Note: the checkout's .storybook/main.ts has a webpackFinal hook, which the automigration warns about and auto-declines continuing when --yes is passed — temporarily remove that hook from main.ts before running the migration so it can proceed. Once migrated, open .storybook/preview.tsx and confirm import 'zone.js'; was not added, even though no storybook target in angular.json sets experimentalZoneless: true. This is the bug: @storybook/angular-vite defaults to zoneless outside ng run, so zone-based apps lose NgZone-driven change detection after migrating.
  3. Verify the fix: git checkout -- . to reset the checkout back to the pre-migration state (remove the webpackFinal hook again), then run this branch's local build instead: node <path-to-this-checkout>/code/lib/cli-storybook/dist/bin/index.js automigrate angular-to-angular-vite --yes --skip-install --config-dir .storybook (build cli-storybook and angular-vite first, e.g. yarn nx compile addon-vitest / relevant nx compile targets, or yarn build inside those packages). Confirm the CLI logs Added a zone.js import to .storybook/preview.tsx and that import 'zone.js'; is now the first line of the file.
  4. Additionally, for the schema-sync fix (Bug A): set "zoneless": false explicitly on the components project's storybook target in angular.json and confirm ng run components:storybook passes Angular CLI schema validation (no additionalProperties/unknown-property rejection) — this exercises the fixed start-schema.json/build-schema.json.

Documentation

  • Add or update documentation reflecting your changes
  • If you are deprecating/removing a feature, make sure to update
    MIGRATION.MD

Checklist for Maintainers

  • When this PR is ready for testing, make sure to add ci:normal, ci:merged or ci:daily GH label to it to run a specific set of sandboxes. The particular set of sandboxes can be found in code/lib/cli-storybook/src/sandbox-templates.ts

  • Declare whether manual QA will be needed for this PR during the next release, through qa:needed or qa:skip

  • Make sure this PR contains one of the labels below:

    Available labels
    • bug: Internal changes that fixes incorrect behavior.
    • maintenance: User-facing maintenance tasks.
    • dependencies: Upgrading (sometimes downgrading) dependencies.
    • build: Internal-facing build tooling & test updates. Will not show up in release changelog.
    • cleanup: Minor cleanup style change. Will not show up in release changelog.
    • documentation: Documentation only changes. Will not show up in release changelog.
    • feature request: Introducing a new feature.
    • BREAKING CHANGE: Changes that break compatibility in some way with current major version.
    • other: Changes that don't fit in the above categories.

🦋 Canary release

This pull request has been released as version 0.0.0-pr-35386-sha-531bdf43. Try it out in a new sandbox by running npx storybook@0.0.0-pr-35386-sha-531bdf43 sandbox or in an existing project with npx storybook@0.0.0-pr-35386-sha-531bdf43 upgrade.

More information
Published version 0.0.0-pr-35386-sha-531bdf43
Triggered by @valentinpalkovic
Repository storybookjs/storybook
Branch task/ffd6b664-Automigrating-an-ngular-21-pro
Commit 531bdf43
Datetime Wed Jul 8 19:34:20 UTC 2026 (1783539260)
Workflow run 28970207284

To request a new release of this pull request, mention the @storybookjs/core team.

core team members can create a new canary release here or locally with gh workflow run --repo storybookjs/storybook publish.yml --field pr=35386

Summary by CodeRabbit

  • New Features

    • Angular Storybook migrations now support Vite-based setups and can automatically inject the required zone.js import in the preview config when applicable.
    • Zoneless change detection is standardized to the zoneless option (defaulting to enabled).
  • Bug Fixes

    • Migration logic now performs format-preserving angular.json/project.json edits for more reliable workspace updates.
    • Improved zone.js detection/injection behavior (idempotent, supports .ts/.tsx, includes dry-run handling) and better handling of preview-config path resolution.

…emas, widen preview transform match

The angular-to-angular-vite automigration never re-added zone.js after moving projects off the
webpack builder's implicit polyfill loading, breaking zone-based Angular apps (e.g. Bitwarden
clients) after migrating to @storybook/angular-vite. Detection reads the flag-only signal
(storybook builder target options.experimentalZoneless) across every angular.json/Nx project.json
storybook target, injects import 'zone.js' into the preview when needed, and renames any leftover
experimentalZoneless key to zoneless.

Also fixes two adjacent bugs so the zoneless story lands coherently:
- angular-vite's published start-schema.json/build-schema.json still declared the stale
  experimentalZoneless option instead of zoneless, so the correct zoneless: false setting failed
  schema validation while the stale key passed silently.
- preset.ts's transform hook only matched a literal preview.ts, so .tsx (and other) preview files
  never received the runtime zone.js injection. It now resolves the preview path once via
  findConfigFile (core's own resolution list), cached in the plugin's config() hook.
Dropping the standalone schema-consistency test file per request; schema correctness for zoneless/experimentalZoneless is still exercised indirectly through the migration test suite and manual verification.
@valentinpalkovic valentinpalkovic changed the title Fix zone.js drop in angular-to-angular-vite migration + schema sync + transform widening Angular: Fix zone.js drop in angular-to-angular-vite migration + schema sync + transform widening Jul 7, 2026
@valentinpalkovic valentinpalkovic self-assigned this Jul 7, 2026
@valentinpalkovic valentinpalkovic added bug angular ci:normal Run our default set of CI jobs (choose this for most PRs). labels Jul 7, 2026
@valentinpalkovic
valentinpalkovic marked this pull request as ready for review July 7, 2026 16:31
@coderabbitai

coderabbitai Bot commented Jul 7, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Renames Angular Vite zoneless schema fields, adds format-preserving Angular JSON editing, caches preview path resolution, and updates the Angular-to-Angular Vite migration to rewrite Storybook targets, normalize zoneless flags, and inject zone.js when needed.

Changes

Zoneless schema, preset, and migration updates

Layer / File(s) Summary
Schema option rename
code/frameworks/angular-vite/build-schema.json, code/frameworks/angular-vite/start-schema.json
Replaces experimentalZoneless with zoneless, with updated description text and default true.
Format-preserving Angular JSON edits
code/core/package.json, code/core/src/cli/angular/helpers.ts
Adds jsonc-parser, exports JSON path-edit helpers, and makes AngularJSON preserve raw text while applying targeted edits and writing back the original formatting.
Preview path caching
code/frameworks/angular-vite/src/preset.ts
Exports angularOptionsPlugin, resolves the preview file path once in config(), and compares transforms against the cached normalized path.
Workspace rewrite and preview injection
code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.ts
Rewrites Storybook builders and zoneless flags in Angular and Nx configs, tracks workspace-wide state, and conditionally injects import 'zone.js'; into the preview config or warns when it is unavailable.
Automigration zone.js tests
code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.test.ts
Updates filesystem mocking for AngularJSON and adds coverage for target rewrites, zone.js injection, idempotency, dry-run, missing preview paths, and key normalization.

Estimated code review effort: 4 (Complex) | ~60 minutes


Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.ts (1)

647-651: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Remove the duplicate eslint-disable comment and fix the indentation.

There are now two consecutive // eslint-disable-next-line depend/ban-dependencies comments (lines 647 and 649), and the const { globby } declaration is dedented to column 0 inside the run() body, which will fail Prettier/lint formatting checks.

♻️ Proposed cleanup
-    // eslint-disable-next-line depend/ban-dependencies
-
-// eslint-disable-next-line depend/ban-dependencies
-const { globby } = await import('globby');
+    // eslint-disable-next-line depend/ban-dependencies
+    const { globby } = await import('globby');
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.ts`
around lines 647 - 651, Remove the duplicated `eslint-disable-next-line
depend/ban-dependencies` comment in `run()` and restore the `const { globby } =
await import('globby');` indentation so it matches the surrounding block. Keep
only one disable comment immediately before the import and align the following
`projectJsonFiles` logic with the existing formatting in
`angular-to-angular-vite.ts`.
code/frameworks/angular-vite/src/preset.test.ts (1)

8-11: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Mock setup violates repo Vitest spy-mocking conventions.

vi.mock() is missing the spy: true option, and mockFindConfigFile.mockReturnValue(...) is set inline within each it() body instead of a shared beforeEach.

♻️ Suggested refactor
 vi.mock('storybook/internal/common', async (importOriginal) => ({
   ...(await importOriginal<typeof import('storybook/internal/common')>()),
   findConfigFile: vi.fn(),
-}));
+}), { spy: true });

 const mockFindConfigFile = vi.mocked(findConfigFile);
 const normalizePath = (p: string) => p.replace(/\\/g, '/');

 const baseOptions = { configDir: '.storybook' } as unknown as StandaloneOptions;

 describe('angularOptionsPlugin', () => {
+  beforeEach(() => {
+    vi.clearAllMocks();
+  });
+
   const extensions = ['ts', 'js', 'tsx', 'jsx', 'mjs', 'cjs'];

   it.each(extensions)(
     "injects `import 'zone.js';` for a resolved preview.%s when zoneless is false",
     async (ext) => {
       const resolvedPreviewPath = `.storybook/preview.${ext}`;
-      mockFindConfigFile.mockReturnValue(resolvedPreviewPath);
+      mockFindConfigFile.mockReturnValue(resolvedPreviewPath); // move to beforeEach if shared across cases
       ...

As per coding guidelines, **/*.{test,spec}.{ts,tsx}: "Follow the spy mocking rules defined in .cursor/rules/spy-mocking.mdc for consistent mocking patterns with Vitest", and **/*.test.{ts,tsx,js,jsx}: "Implement mock behaviors in beforeEach blocks in Vitest tests" / "Avoid mocking without the spy: true option in Vitest tests" / "Avoid inline mock implementations within test cases in Vitest tests".

Also applies to: 24-85

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@code/frameworks/angular-vite/src/preset.test.ts` around lines 8 - 11, The
Vitest mock setup for `findConfigFile` in `preset.test.ts` should follow the
repo spy-mocking convention. Update the `vi.mock('storybook/internal/common',
...)` setup to use the `spy: true` option, and move any
`mockFindConfigFile.mockReturnValue(...)` behavior out of individual `it()`
blocks into a shared `beforeEach` so the tests use consistent mock
initialization. Use the existing `mockFindConfigFile` reference and the
`preset.test.ts` suite to keep the changes localized.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@code/frameworks/angular-vite/src/preset.test.ts`:
- Around line 8-11: The Vitest mock setup for `findConfigFile` in
`preset.test.ts` should follow the repo spy-mocking convention. Update the
`vi.mock('storybook/internal/common', ...)` setup to use the `spy: true` option,
and move any `mockFindConfigFile.mockReturnValue(...)` behavior out of
individual `it()` blocks into a shared `beforeEach` so the tests use consistent
mock initialization. Use the existing `mockFindConfigFile` reference and the
`preset.test.ts` suite to keep the changes localized.

In `@code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.ts`:
- Around line 647-651: Remove the duplicated `eslint-disable-next-line
depend/ban-dependencies` comment in `run()` and restore the `const { globby } =
await import('globby');` indentation so it matches the surrounding block. Keep
only one disable comment immediately before the import and align the following
`projectJsonFiles` logic with the existing formatting in
`angular-to-angular-vite.ts`.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4af4cbf6-9ea9-47ef-a232-bd1b7e1d83b0

📥 Commits

Reviewing files that changed from the base of the PR and between e72753b and 491173d.

📒 Files selected for processing (6)
  • code/frameworks/angular-vite/build-schema.json
  • code/frameworks/angular-vite/src/preset.test.ts
  • code/frameworks/angular-vite/src/preset.ts
  • code/frameworks/angular-vite/start-schema.json
  • code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.test.ts
  • code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.ts

A direct edit on the PR branch introduced a duplicated eslint-disable comment and mis-indented the globby dynamic import, tripping CI's format-check and eslint jobs. Restores the original correctly formatted line.

@Sidnioulz Sidnioulz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm concerned with maintainability over this one. We should already have easier tools to manipulate both JSON and preview.

Comment thread code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.ts Outdated
Comment thread code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.ts Outdated
…rJSON path-configurable

The angular.json/project.json rename-and-rewrite logic previously hand-rolled a string-literal-aware
bracket-matching scanner to relocate targets for a scoped string replace, guarding against risks
(same-named storybook targets across projects, brace characters inside string values) entirely by
construction rather than by using a real JSON editor.

Replaces it with jsonc-parser's modify/applyEdits: edits are addressed by structural JSON path, so
the same-key-collision problem the scanner defended against becomes structurally impossible, and the
diff stays minimal (verified against a real-world angular.json: only the touched lines change,
compact arrays and trailing newline preserved) unlike a parse-mutate-JSON.stringify round trip, which
was empirically shown to reformat the whole document.

AngularJSON (used by `init` today) gains an optional path parameter and switches its own writes to
the same format-preserving edits, so the automigrate fix can reuse it directly for angular.json
instead of re-implementing JSON I/O. Nx project.json's flatter shape (no `projects.<name>` nesting)
doesn't fit AngularJSON's model, so it uses the same underlying editJsonText primitive directly.

jsonc-parser is added as a direct dependency (not bundled) rather than a devDependency, since
esbuild's bundling of its CJS/UMD build broke on its internal relative requires.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.ts`:
- Around line 203-207: Guard the iteration in angular-to-angular-vite’s
automigration flow against a missing angularJSON.projects object. In the loop
that starts over Object.entries(angularJSON.projects), add an early check before
iterating so the code skips the file or returns safely when projects is
undefined or not an object, instead of letting Object.entries throw. Use the
existing angularJSON variable and the surrounding automigration logic in
angular-to-angular-vite to place the guard close to the iteration point.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3a607809-b5e1-4efe-a24c-6c007712ec2c

📥 Commits

Reviewing files that changed from the base of the PR and between 5164a5c and fb76712.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (4)
  • code/core/package.json
  • code/core/src/cli/angular/helpers.ts
  • code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.test.ts
  • code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.test.ts

Comment thread code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.ts Outdated
@storybook-app-bot

storybook-app-bot Bot commented Jul 8, 2026 •

Copy link
Copy Markdown
Contributor

Package Benchmarks

Commit: 531bdf4, ran on 9 July 2026 at 07:56:47 UTC

The following packages have significant changes to their size or dependencies:

storybook

Before After Difference
Dependency count 72 73 🚨 +1 🚨
Self size 21.95 MB 21.95 MB 🚨 +2 KB 🚨
Dependency size 36.44 MB 36.65 MB 🚨 +213 KB 🚨
Bundle Size Analyzer Link Link

@storybook/angular-vite

Before After Difference
Dependency count 32 33 🚨 +1 🚨
Self size 22.38 MB 22.48 MB 🚨 +94 KB 🚨
Dependency size 20.07 MB 20.07 MB 🚨 +497 B 🚨
Bundle Size Analyzer Link Link

@storybook/cli

Before After Difference
Dependency count 204 205 🚨 +1 🚨
Self size 821 KB 825 KB 🚨 +4 KB 🚨
Dependency size 91.94 MB 92.15 MB 🚨 +216 KB 🚨
Bundle Size Analyzer Link Link

@storybook/codemod

Before After Difference
Dependency count 197 198 🚨 +1 🚨
Self size 32 KB 32 KB 🎉 -36 B 🎉
Dependency size 90.42 MB 90.63 MB 🚨 +216 KB 🚨
Bundle Size Analyzer Link Link

create-storybook

Before After Difference
Dependency count 73 74 🚨 +1 🚨
Self size 1.09 MB 1.09 MB 0 B
Dependency size 58.39 MB 58.60 MB 🚨 +215 KB 🚨
Bundle Size Analyzer node node

…son target walk

isStorybookTarget now narrows its argument to a StorybookBuilderTarget type instead of accepting
any, letting the two call sites drop their manual typeof/any-cast checks.

transformAngularJson and transformProjectJson shared the same per-target walk (detect, snapshot
builder/executor + compodoc + zoneless, decide edits) and only differed in how an edit gets applied
(in-place via AngularJSON vs. accumulated via editJsonText) and how targets are grouped (nested
projects.<name>.architect vs. a single flat targets object). Factored the shared walk into
processStorybookTargets, parameterized by a small TargetEditor interface that AngularJSON already
satisfies and a new TextJsonEditor implements for the string-accumulating project.json case.
… import

Pruned the comments this PR added down to ones that explain non-obvious behavior (edge cases,
snapshot-before-edit reasoning, why a separate function exists) rather than narrating what the
code already says.

Also replaced addZoneJsPreviewImport's regex-based content scan/prepend with ConfigFile
(readConfig/setImport), the same AST-based utility already used elsewhere in this file for
main.ts. setImport(null, 'zone.js') is already idempotent (no-ops if the import exists) and
inserts at the top of the file; the existing-import check is widened to also treat zone.js/*
subpath imports as already-satisfied, matching prior regex behavior. Output is piped through
formatFileContent so the written quote style matches the project's own Prettier config instead of
whatever babel/recast prints by default.
Both describe the generic shape of an angular.json/project.json storybook builder target, not
anything specific to the angular-to-angular-vite migration, so they belong alongside AngularJSON
and editJsonText in code/core/src/cli/angular/helpers.ts and are re-exported via
storybook/internal/cli like the rest of that module.
Comment thread code/frameworks/angular-vite/src/preset.ts Outdated
Comment thread code/lib/cli-storybook/src/automigrate/fixes/angular-to-angular-vite.ts Outdated
This was referenced Jul 14, 2026
@JReinhold JReinhold added qa:success Pull Requests that were successfully QA'ed by the release team. and removed qa:needed Pull Requests that will need manual QA prior to release. labels Aug 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor
Fails
🚫

node failed.

Log

Details
Error:  Error: Could not find the Dangerfile at scripts/dangerfile.ts - if it is local, perhaps you have a typo? If it's using a remote file, it doesn't have a repo reference.
    at /usr/src/danger/dist/platforms/GitHub.js:161:27
    at step (/usr/src/danger/dist/platforms/GitHub.js:44:23)
    at Object.next (/usr/src/danger/dist/platforms/GitHub.js:25:53)
    at /usr/src/danger/dist/platforms/GitHub.js:19:71
    at new Promise (<anonymous>)
    at __awaiter (/usr/src/danger/dist/platforms/GitHub.js:15:12)
    at Object.executeRuntimeEnvironment (/usr/src/danger/dist/platforms/GitHub.js:144:88)
    at /usr/src/danger/dist/commands/danger-runner.js:101:47
    at step (/usr/src/danger/dist/commands/danger-runner.js:34:23)
    at Object.next (/usr/src/danger/dist/commands/danger-runner.js:15:53)
danger-results://tmp/danger-results-d3a1c7ae.json

Generated by 🚫 dangerJS against 531bdf4

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

Labels

angular bug ci:normal Run our default set of CI jobs (choose this for most PRs). qa:success Pull Requests that were successfully QA'ed by the release team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants