Title: @angular/build:unit-test (vitest): zoneless project fails to compile with "Top-level await is not available" when zone.js is a transitive dep · Issue #33324 · angular/angular-cli · GitHub
Open Graph Title: @angular/build:unit-test (vitest): zoneless project fails to compile with "Top-level await is not available" when zone.js is a transitive dep · Issue #33324 · angular/angular-cli
X Title: @angular/build:unit-test (vitest): zoneless project fails to compile with "Top-level await is not available" when zone.js is a transitive dep · Issue #33324 · angular/angular-cli
Description: Command test Is this a regression? Yes, this behavior used to work in the previous version The previous version in which this bug was not present was 21.2.13 Description Description A zoneless Angular project (provideZonelessChangeDetect...
Open Graph Description: Command test Is this a regression? Yes, this behavior used to work in the previous version The previous version in which this bug was not present was 21.2.13 Description Description A zoneless Angu...
X Description: Command test Is this a regression? Yes, this behavior used to work in the previous version The previous version in which this bug was not present was 21.2.13 Description Description A zoneless Angu...
Opengraph URL: https://github.com/angular/angular-cli/issues/33324
X: @github
Domain: Github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"@angular/build:unit-test (vitest): zoneless project fails to compile with \"Top-level await is not available\" when zone.js is a transitive dep","articleBody":"### Command\n\ntest\n\n### Is this a regression?\n\n- [x] Yes, this behavior used to work in the previous version\n\n### The previous version in which this bug was not present was\n\n21.2.13\n\n### Description\n\n## Description\n\nA zoneless Angular project (`provideZonelessChangeDetection()` in `main.ts`, no `zone.js` in the `polyfills` array) fails to compile its unit-test bundle with:\nX [ERROR] Top-level await is not available in the configured target environment (\"chrome145.0\", \"ios17.0\", \"safari17.0\" + 2 overrides)\n### Root cause\n\nIn `@angular/build/src/builders/unit-test/runners/vitest/build-options.js`, `getZoneTestingStrategy()` decides what to emit into the virtual `angular:test-bed-init` module:\n\n```js\nfunction getZoneTestingStrategy(buildOptions, projectSourceRoot) {\n if (buildOptions.polyfills?.includes('zone.js/testing')) return 'none';\n if (buildOptions.polyfills?.includes('zone.js')) return 'static';\n try {\n projectRequire.resolve('zone.js');\n return 'dynamic'; // ← falls through to here for zoneless projects\n } catch { return 'none'; }\n}\n```\nFor a zoneless app, polyfills correctly contains neither 'zone.js' nor 'zone.js/testing' — but zone.js is still resolvable on disk because it's an optional/peer dep of @angular/core (and several Angular test utilities like fakeAsync / tick still reference it). The strategy therefore resolves to 'dynamic', which emits this into the virtual module:\n```\nif (typeof Zone !== 'undefined') {\n // 'zone.js/testing' is used to initialize the ZoneJS testing environment.\n // It must be imported dynamically to avoid a static dependency on 'zone.js'.\n await import('zone.js/testing');\n}\n```\n\nThe runtime guard typeof Zone !== 'undefined' would correctly skip the import on a zoneless app, but esbuild evaluates the top-level await at compile time and rejects the syntax — regardless of whether the branch can actually run. The build fails before the guard ever executes.\n\n### Expected\n\nA zoneless project should resolve the strategy to `'none'` and emit no zone-init code. The unit-test bundle should compile cleanly.\n\n### Actual\n\nStrategy resolves to `'dynamic'` because `zone.js` is transitively installed. The virtual `angular:test-bed-init` module contains a top-level `await`, which esbuild rejects against the configured browser targets — even though those targets (Chrome 145, iOS 17, Safari 17) actually do support TLA. The compile-time rejection appears to be tied to the output format guarantees rather than the targets themselves, so tightening browserslist does not help.\n\n### Minimal Reproduction\n\n1. Generate a zoneless Angular 22 app (or upgrade an existing zoneless app).\n2. Confirm main.ts uses provideZonelessChangeDetection() and polyfills in angular.json does not include 'zone.js' or 'zone.js/testing'.\n3. Configure test to use @angular/build:unit-test with the vitest runner.\n4. Run ng test.\n\n### Exception or Error\n\n```text\nTop-level await is not available\n```\n\n### Your Environment\n\n```text\n_ _ ____ _ ___\n / \\ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _|\n / △ \\ | '_ \\ / _` | | | | |/ _` | '__| | | | | | |\n / ___ \\| | | | (_| | |_| | | (_| | | | |___| |___ | |\n /_/ \\_\\_| |_|\\__, |\\__,_|_|\\__,_|_| \\____|_____|___|\n |___/\n \n\nAngular CLI : 22.0.0\nAngular : 22.0.0\nNode.js : 24.16.0\nPackage Manager : npm 11.13.0\nOperating System : win32 x64\n\n┌────────────────────────────────────┬───────────────────┬───────────────────┐\n│ Package │ Installed Version │ Requested Version │\n├────────────────────────────────────┼───────────────────┼───────────────────┤\n│ @angular-devkit/build-angular │ 22.0.0 │ 22.0.0 │\n│ @angular/animations │ 22.0.0 │ 22.0.0 │\n│ @angular/build │ 22.0.0 │ 22.0.0 │\n│ @angular/cdk │ 21.2.13 │ 21.2.13 │\n│ @angular/cli │ 22.0.0 │ 22.0.0 │\n│ @angular/common │ 22.0.0 │ 22.0.0 │\n│ @angular/compiler │ 22.0.0 │ 22.0.0 │\n│ @angular/compiler-cli │ 22.0.0 │ 22.0.0 │\n│ @angular/core │ 22.0.0 │ 22.0.0 │\n│ @angular/forms │ 22.0.0 │ 22.0.0 │\n│ @angular/google-maps │ 21.2.13 │ 21.2.13 │\n│ @angular/language-service │ 22.0.0 │ 22.0.0 │\n│ @angular/material │ 21.2.13 │ 21.2.13 │\n│ @angular/material-date-fns-adapter │ 21.2.13 │ 21.2.13 │\n│ @angular/platform-browser │ 22.0.0 │ 22.0.0 │\n│ @angular/platform-browser-dynamic │ 22.0.0 │ 22.0.0 │\n│ @angular/platform-server │ 22.0.0 │ 22.0.0 │\n│ @angular/router │ 22.0.0 │ 22.0.0 │\n│ @angular/service-worker │ 22.0.0 │ 22.0.0 │\n│ @angular/ssr │ 22.0.0 │ 22.0.0 │\n│ rxjs │ 7.8.2 │ 7.8.2 │\n│ typescript │ 6.0.3 │ 6.0.3 │\n│ vitest │ 4.1.7 │ 4.1.7 │\n```\n\n### Anything else relevant?\n\n_No response_","author":{"url":"https://github.com/rLamonAC","@type":"Person","name":"rLamonAC"},"datePublished":"2026-06-08T07:45:54.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/33324/angular-cli/issues/33324"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:4321195a-445f-66dd-c5ef-8988dcd29bee |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 9BD4:BF832:6AF507:90E135:6A627D5A |
| html-safe-nonce | eccb4f364d058e71253cc46622a996f6eac687785769491cd28b9d31d64d3985 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5QkQ0OkJGODMyOjZBRjUwNzo5MEUxMzU6NkE2MjdENUEiLCJ2aXNpdG9yX2lkIjoiODEwOTYxNTY4Nzk2OTk2MzM1NCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | f3aee7432a6c89ce4055f6fbfd4227911e25bf58cb437da56ce8501f7dc2e9e1 |
| hovercard-subject-tag | issue:4610973087 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/angular/angular-cli/33324/issue_layout |
| twitter:image | https://opengraph.githubassets.com/c12a6894309f68aa3b8c51dfe5ccdcd593a90f7c1578a6763111aa189c2eb091/angular/angular-cli/issues/33324 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/c12a6894309f68aa3b8c51dfe5ccdcd593a90f7c1578a6763111aa189c2eb091/angular/angular-cli/issues/33324 |
| og:image:alt | Command test Is this a regression? Yes, this behavior used to work in the previous version The previous version in which this bug was not present was 21.2.13 Description Description A zoneless Angu... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | rLamonAC |
| hostname | github.com |
| expected-hostname | github.com |
| None | 54d77223ecd96549586d00f1e91ee7d05feebf27ea430279a9c4ba4b7de1a93c |
| turbo-cache-control | no-preview |
| go-import | github.com/angular/angular-cli git https://github.com/angular/angular-cli.git |
| octolytics-dimension-user_id | 139426 |
| octolytics-dimension-user_login | angular |
| octolytics-dimension-repository_id | 36891867 |
| octolytics-dimension-repository_nwo | angular/angular-cli |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 36891867 |
| octolytics-dimension-repository_network_root_nwo | angular/angular-cli |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 4d79f1b99472a521fc5fb66e9fdc3ce742937dff |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width