diff --git a/packages/angular/ssr/package.json b/packages/angular/ssr/package.json index fb2fab874853..75e9251d7693 100644 --- a/packages/angular/ssr/package.json +++ b/packages/angular/ssr/package.json @@ -35,7 +35,8 @@ "@angular/platform-browser": "20.1.0-next.3", "@angular/platform-server": "20.1.0-next.3", "@angular/router": "20.1.0-next.3", - "@schematics/angular": "workspace:*" + "@schematics/angular": "workspace:*", + "vitest": "3.2.4" }, "sideEffects": false, "schematics": "./schematics/collection.json", diff --git a/packages/angular/ssr/test/utils/promise_spec.ts b/packages/angular/ssr/test/utils/promise_spec.ts index 5f33df85e71f..ca589198e49a 100644 --- a/packages/angular/ssr/test/utils/promise_spec.ts +++ b/packages/angular/ssr/test/utils/promise_spec.ts @@ -9,16 +9,36 @@ import { setTimeout } from 'node:timers/promises'; import { promiseWithAbort } from '../../src/utils/promise'; +function expectRejectedWithError(promise: Promise) { + if (typeof expectAsync === 'function') { + return expectAsync(promise).toBeRejectedWithError(); + } else { + // @ts-expect-error + return expect(promise).rejects.toThrowError(); + } +} + +function expectResolved(promise: Promise) { + if (typeof expectAsync === 'function') { + return expectAsync(promise).toBeResolved(); + } else { + // @ts-expect-error + return expect(promise).resolves; + } +} + describe('promiseWithAbort', () => { it('should reject with an AbortError when the signal is aborted', async () => { const abortController = new AbortController(); const promise = promiseWithAbort(setTimeout(500), abortController.signal, 'Test operation'); + console.error('queueMicrotask to abort the signal'); queueMicrotask(() => { abortController.abort('Test reason'); }); - await expectAsync(promise).toBeRejectedWithError(); + console.error('expectAsync to be rejected with AbortError'); + await expectRejectedWithError(promise); }); it('should not reject if the signal is not aborted', async () => { @@ -31,6 +51,6 @@ describe('promiseWithAbort', () => { // Wait briefly to ensure no rejection occurs await setTimeout(20); - await expectAsync(promise).toBeResolved(); + await expectResolved(promise); }); }); diff --git a/packages/angular/ssr/vitest.config.ts b/packages/angular/ssr/vitest.config.ts new file mode 100644 index 000000000000..f3049c02648f --- /dev/null +++ b/packages/angular/ssr/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: ['**/*_spec.ts'], + globals: true, + }, +}); diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json index 622a5b9ce86d..1cdefbf8b8a5 100644 --- a/packages/ngtools/webpack/package.json +++ b/packages/ngtools/webpack/package.json @@ -30,6 +30,7 @@ "@angular/compiler": "20.1.0-next.3", "@angular/compiler-cli": "20.1.0-next.3", "typescript": "5.8.3", + "vitest": "3.2.4", "webpack": "5.99.9" } } diff --git a/packages/ngtools/webpack/vitest.config.ts b/packages/ngtools/webpack/vitest.config.ts new file mode 100644 index 000000000000..f3049c02648f --- /dev/null +++ b/packages/ngtools/webpack/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: ['**/*_spec.ts'], + globals: true, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 088e09e772a3..41121d777e84 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -550,6 +550,9 @@ importers: '@schematics/angular': specifier: workspace:* version: link:../../schematics/angular + vitest: + specifier: 3.2.4 + version: 3.2.4(@types/node@20.19.1)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) packages/angular_devkit/architect: dependencies: @@ -867,6 +870,9 @@ importers: typescript: specifier: 5.8.3 version: 5.8.3 + vitest: + specifier: 3.2.4 + version: 3.2.4(@types/node@20.19.1)(jiti@1.21.7)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) webpack: specifier: 5.99.9 version: 5.99.9(esbuild@0.25.5) @@ -6797,6 +6803,7 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qjobs@1.2.0: @@ -7891,46 +7898,6 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vite@7.0.0: resolution: {integrity: sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -10793,13 +10760,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@20.19.1)(jiti@1.21.7)(less@4.3.0)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.0.0(@types/node@20.19.1)(jiti@1.21.7)(less@4.3.0)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@20.19.1)(jiti@1.21.7)(less@4.3.0)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) + vite: 7.0.0(@types/node@20.19.1)(jiti@1.21.7)(less@4.3.0)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -16406,23 +16373,6 @@ snapshots: - tsx - yaml - vite@6.3.5(@types/node@20.19.1)(jiti@1.21.7)(less@4.3.0)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0): - dependencies: - esbuild: 0.25.5 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.6 - rollup: 4.44.0 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 20.19.1 - fsevents: 2.3.3 - jiti: 1.21.7 - less: 4.3.0 - sass: 1.89.2 - terser: 5.43.1 - yaml: 2.8.0 - vite@7.0.0(@types/node@20.19.1)(jiti@1.21.7)(less@4.3.0)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0): dependencies: esbuild: 0.25.5 @@ -16444,7 +16394,7 @@ snapshots: dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@20.19.1)(jiti@1.21.7)(less@4.3.0)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@7.0.0(@types/node@20.19.1)(jiti@1.21.7)(less@4.3.0)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -16462,7 +16412,7 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@20.19.1)(jiti@1.21.7)(less@4.3.0)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) + vite: 7.0.0(@types/node@20.19.1)(jiti@1.21.7)(less@4.3.0)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) vite-node: 3.2.4(@types/node@20.19.1)(jiti@1.21.7)(less@4.3.0)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: diff --git a/tools/vitest_test.bzl b/tools/vitest_test.bzl new file mode 100644 index 000000000000..80d91eeffc38 --- /dev/null +++ b/tools/vitest_test.bzl @@ -0,0 +1,20 @@ +def _vitest_test_impl(ctx): + pass + +_vitest_test = rule() + +def vitest_test(data = [], args = [], **kwargs): + # Create relative path to root, from current package dir. Necessary as + # we change the `chdir` below to the package directory. + relative_to_root = "/".join([".."] * len(native.package_name().split("/"))) + + _vitest_test( + node_modules = "//:node_modules", + chdir = native.package_name(), + args = [ + # Escape so that the `js_binary` launcher triggers Bash expansion. + "'**/*+(.|_)spec.js'", + ] + args, + data = data + ["//:node_modules/vitest"], + **kwargs + )