vitest-auto-spy 5.32.0 → 5.32.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/AGENTS.md +7 -1
  2. package/CHANGELOG.md +48 -1
  3. package/README.md +8 -2
  4. package/dist/angular-diagnostics.js +10 -10
  5. package/dist/angular-doubles.js +8 -8
  6. package/dist/angular-http.js +4 -4
  7. package/dist/angular-matchers.js +1 -1
  8. package/dist/angular-router.js +5 -5
  9. package/dist/angular.d.ts +1 -1
  10. package/dist/angular.js +30 -14
  11. package/dist/bun-angular.d.ts +1 -1
  12. package/dist/bun-angular.js +34 -19
  13. package/dist/bun.js +9 -9
  14. package/dist/{chunk-SDTXE5SW.js → chunk-24JTFFQL.js} +1 -1
  15. package/dist/{chunk-LWSUV6IX.js → chunk-2QEM4WP7.js} +1 -1
  16. package/dist/{chunk-ANQVIGAG.js → chunk-6JLBZHQ3.js} +2 -2
  17. package/dist/{chunk-KCMPDMLY.js → chunk-6JQ7AFWM.js} +3 -3
  18. package/dist/{chunk-K3EUF6RK.js → chunk-72H6HNDI.js} +2 -2
  19. package/dist/{chunk-4IRFL76M.js → chunk-7WM3A4IB.js} +2 -2
  20. package/dist/{chunk-EDEGKIIR.js → chunk-CLQUJX6E.js} +1 -1
  21. package/dist/{chunk-G5KZLT7Q.js → chunk-DNXCZOYY.js} +1 -1
  22. package/dist/{chunk-4H6KZWGX.js → chunk-F2KBJC7P.js} +1 -1
  23. package/dist/{chunk-SQFEEO4W.js → chunk-GSMWYZ5A.js} +4 -4
  24. package/dist/{chunk-3Q76UTT6.js → chunk-JOPCMFYN.js} +2 -1
  25. package/dist/{chunk-TH64BXPP.js → chunk-JR55747M.js} +3 -3
  26. package/dist/{chunk-E46PPK33.js → chunk-LAPHUX5G.js} +1 -1
  27. package/dist/{chunk-NTCEH2FY.js → chunk-TMFV4DXT.js} +6 -6
  28. package/dist/{chunk-D2R6EQJJ.js → chunk-XNXIHKVM.js} +1 -1
  29. package/dist/{chunk-FRD6NXVY.js → chunk-XUPBHHJD.js} +1 -1
  30. package/dist/{chunk-25OHJOAA.js → chunk-YDPOBKST.js} +3 -3
  31. package/dist/{chunk-X74IM4MQ.js → chunk-YUGSITWJ.js} +1 -1
  32. package/dist/cli.js +21 -7
  33. package/dist/console.js +7 -7
  34. package/dist/eslint-plugin.cjs +10 -7
  35. package/dist/jasmine-compat.js +2 -2
  36. package/dist/jasmine.js +10 -10
  37. package/dist/nestjs.js +10 -10
  38. package/dist/rstest.js +9 -9
  39. package/dist/rxjs.js +2 -2
  40. package/dist/signal-forms.js +1 -1
  41. package/dist/{track-signal-runs-pFMHNAPy.d.ts → track-signal-runs-BVbIBVS7.d.ts} +1 -14
  42. package/dist/zone.js +1 -1
  43. package/package.json +1 -1
  44. package/skills/vitest-auto-spy/SKILL.md +5 -0
package/AGENTS.md CHANGED
@@ -16,7 +16,9 @@ Setting this up for a team? `npx vitest-auto-spy init` writes a pointer to this
16
16
  instruction files this repository's agents actually read — `AGENTS.md` (Codex, Cursor, Copilot and
17
17
  most of the field), `CLAUDE.md` (Claude Code) and `GEMINI.md` (Gemini CLI), plus the glob-scoped
18
18
  rule file of any tool whose own directory already exists. `--check` is the CI form; `--only
19
- CLAUDE.md,.claude` limits it to the files a repository keeps untracked. Full table:
19
+ CLAUDE.md,.claude` limits it to the files a repository keeps untracked. A hand-made copy of the
20
+ package's skill in `.claude/skills/vitest-auto-spy/` is reported `stale` (and fails `--check`): delete
21
+ it and re-run `init`. Full table:
20
22
  <https://asdalexey.github.io/vitest-auto-spy/agents>.
21
23
 
22
24
  | Resource | Where |
@@ -3499,6 +3501,10 @@ const host = hostElement(fixture); // HTMLElement, checked with instanceof
3499
3501
  queryElement(fixture, '.close').click(); // HTMLElement; throws naming the selector when nothing matches
3500
3502
  queryElement(fixture.debugElement, 'input[name=q]', HTMLInputElement).value; // typed; wrong type throws
3501
3503
  // also on /bun-angular; queryElement takes an element found earlier as its root too
3504
+ // a null source (debugElement.query() that matched nothing) throws saying so, not 'Cannot read properties of null'
3505
+ expect(queryElement(fixture, '.title').textContent.trim()).toBe('Orders'); // present: read through queryElement
3506
+ expect(host.querySelector('.empty-state')).toBeNull(); // absent: querySelector on the typed host, no cast
3507
+ // NOT host.querySelector('.title')?.textContent.trim() — a miss is undefined, which toBeFalsy() accepts
3502
3508
 
3503
3509
  // build a class through DI, every unprovided token auto-spied
3504
3510
  const { instance, spies } = createWithAutoSpies(CartService, {
package/CHANGELOG.md CHANGED
@@ -10,6 +10,52 @@ The latest released version here must always match the one published on
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
+ ## [5.32.1] - 2026-09-25
14
+
15
+ ### Fixed
16
+
17
+ - **`hostElement` and `queryElement` name the cause when handed the `null` of a query that matched
18
+ nothing.** Angular types `debugElement.query()` as `DebugElement`, but it returns `null` on a miss,
19
+ so `hostElement(fixture.debugElement.query(By.directive(Missing)))` type-checked and then died on
20
+ `Cannot read properties of null (reading 'nativeElement')`. Both helpers now throw their own
21
+ error, which asks whether a `debugElement.query()` matched nothing. Every message the two throw
22
+ now starts with `[vitest-auto-spy]` and ends with a `Docs:` link, like the rest of the package.
23
+ On `/angular` and `/bun-angular`.
24
+ - **`init` no longer passes over an old copy of the shipped skill.** A
25
+ `.claude/skills/vitest-auto-spy/SKILL.md` without the managed markers was left alone as
26
+ hand-written, and `init --check` said "Up to date" — even when it was a verbatim copy of the
27
+ package's skill from dozens of versions back. A file there whose frontmatter says
28
+ `name: vitest-auto-spy` is now listed as `stale`: `init` still does not overwrite it, but warns to
29
+ delete it and re-run `init`, which writes the managed pointer in its place, and `init --check`
30
+ exits 1 on it.
31
+ - **ESLint fixes import helpers from the adapter entry the spec already uses.** A fix or suggestion
32
+ that adds `mockValueProp`, `mockReadonlyPropGetter`, `asSpy`, `createMock` or `settleDynamicImport`
33
+ (`no-hand-assigned-global`, `no-object-define-property`, `no-reflect-member-access` and the other
34
+ rules that write them) always imported from the root, which in a `/bun`, `/bun-angular`, `/node`
35
+ or `/rstest` spec registered Vitest's adapter next to the runner's own. The import now joins the
36
+ adapter entry the file already imports, and falls back to the root only when it imports none.
37
+
38
+ ### Docs
39
+
40
+ - **Reading text and asserting absence next to `queryElement`.** README, AGENTS.md, the skill and
41
+ the Angular page now show `queryElement(fixture, '.title').textContent.trim()` for an element that
42
+ must be there and `expect(host.querySelector('.x')).toBeNull()` for one that must not, and say why
43
+ `host.querySelector('.title')?.textContent.trim()` is the wrong reading: a miss is `undefined`, which
44
+ `toBeFalsy()` or `not.toContain()` accepts.
45
+ - **The API page lists what 5.32.0 exported.** A row for `stubAnimationFrame` / `stubElementRect`,
46
+ and the public types `AutoMocked<T>`, `ElementConstructor<E>`, `NativeElementHolder`,
47
+ `DialogDataOf<T, Token>`, `AnimationFrameStub`, `AnimationFrameStubOptions` and
48
+ `AnimationFrameMode`.
49
+ - **The docs site covers `autoMocked<T>()` and `AutoMocked<T>`.** The auto-mock page shows a double
50
+ passed as an argument and declared `let logger: AutoMocked<Logger>`; the README rows give the
51
+ `config` argument and name the type.
52
+ - **The Angular page carries the two dialog typing traps AGENTS.md already had.** Naming the type
53
+ argument of `provideMatDialogData` is what passes `no-unsafe-argument`, and the ref type goes in
54
+ the type argument of `injectMatDialogRef`, not in an instantiation expression.
55
+ - **`no-hand-assigned-global` says where its fix imports `mockValueProp` from.** The adapter entry
56
+ the file already imports, or `vitest-auto-spy` when it imports none, when the file has no
57
+ `mockValueProp` in scope; one imported from another entry is used as it is.
58
+
13
59
  ## [5.32.0] - 2026-09-25
14
60
 
15
61
  ### Added
@@ -8186,7 +8232,8 @@ by hand there, in more than one place, by more than one person.
8186
8232
  `mockAccessorsProp`.
8187
8233
  - Dual ESM + CJS build with type declarations; 100% test coverage.
8188
8234
 
8189
- [Unreleased]: https://github.com/ASDAlexey/vitest-auto-spy/compare/v5.32.0...HEAD
8235
+ [Unreleased]: https://github.com/ASDAlexey/vitest-auto-spy/compare/v5.32.1...HEAD
8236
+ [5.32.1]: https://github.com/ASDAlexey/vitest-auto-spy/compare/v5.32.0...v5.32.1
8190
8237
  [5.32.0]: https://github.com/ASDAlexey/vitest-auto-spy/compare/v5.31.0...v5.32.0
8191
8238
  [5.31.0]: https://github.com/ASDAlexey/vitest-auto-spy/compare/v5.30.0...v5.31.0
8192
8239
  [5.30.0]: https://github.com/ASDAlexey/vitest-auto-spy/compare/v5.29.0...v5.30.0
package/README.md CHANGED
@@ -2710,6 +2710,12 @@ or `Element` for markup that is not HTML. A selector that matches nothing throws
2710
2710
  the selector in the message, and so does a match of another type:
2711
2711
  `'.close' matched <a.close> (HTMLAnchorElement), not HTMLButtonElement`.
2712
2712
 
2713
+ Read text through `queryElement` too — `queryElement(fixture, '.title').textContent.trim()` — rather
2714
+ than `host.querySelector('.title')?.textContent.trim()`, whose miss is an `undefined` that
2715
+ `toBeFalsy()` or `not.toContain()` accepts. For an element that must be absent, keep
2716
+ `expect(host.querySelector('.empty-state')).toBeNull()`: `querySelector` on the typed host needs no
2717
+ cast.
2718
+
2713
2719
  #### Building a class with auto-spied dependencies
2714
2720
 
2715
2721
  ```ts
@@ -3207,7 +3213,7 @@ single-purpose utility you can pick up independently — they all ride on the sa
3207
3213
  | `registerResourceMatchers()` | `/angular/matchers` | Adds `toBeLoading` / `toHaveResourceValue` / `toHaveResourceError`; the value matcher fails an unresolved resource |
3208
3214
  | `registerDirectiveMatchers()` | `/angular/matchers` | Adds `expect(fixture).toHaveDirectiveApplied(Directive, selector?)` |
3209
3215
  | `installProxyZonePatch(opts?)` | `/zone` | `fakeAsync` / `waitForAsync` on Vitest — the patch `zone.js/testing` does not ship; `scope: 'callback'` per callback |
3210
- | `autoMocked<T>(overrides?)` | core | `createAutoMock` typed as `T & Spy<T>`, for a collaborator passed as an argument rather than injected |
3216
+ | `autoMocked<T>(overrides?, config?)` | core | `createAutoMock` typed as `T & Spy<T>`; `AutoMocked<T>` names it for a `let` (`AutoMocked<T>`), for a collaborator passed as an argument rather than injected |
3211
3217
  | `mockSystemTime(time)` / `withSystemTime(time, fn)` | `/setup` | Freeze the clock whether or not fake timers are already running |
3212
3218
  | `mockNow(source)` / `useCountingClock(opts?)` | `/setup` | A `Date.now` that survives fake timers being re-installed around every test; counts ticks instead of telling the time |
3213
3219
  | `registerFocusMatchers()` | `/setup` | Adds `expect(el).toHaveFocus()`, which names _why_ focus is elsewhere |
@@ -4213,7 +4219,7 @@ another, and the next one is in that same file.
4213
4219
  | `stubElementRect(el, rect?)` _(`/dom-stubs`)_ | A box for `getBoundingClientRect()` — missing fields `0`, edges derived; returns `RestoreProp` |
4214
4220
  | `createComponentStub(Class, overrides?, opts?)` _(`/angular`)_ | A standalone stand-in for a child component, directive or pipe, built from its compiled definition so the selector cannot drift |
4215
4221
  | `flushEventLoop(turns?)` / `settleDynamicImport(load, turns?)` | Real event-loop turns under fake timers; wait for a dynamic `import()` |
4216
- | `autoMocked<T>(overrides?)` | `createAutoMock` typed as `T & Spy<T>` |
4222
+ | `autoMocked<T>(overrides?, config?)` | `createAutoMock` typed as `T & Spy<T>`; `AutoMocked<T>` names it for a `let` |
4217
4223
  | `mockSystemTime` / `withSystemTime` / `mockNow` / `useCountingClock` _(`/setup`)_ | Clock control that survives fake timers being re-installed per test |
4218
4224
  | `registerFocusMatchers()` _(`/setup`)_ | Adds `expect(el).toHaveFocus()` |
4219
4225
  | `overrideAutoSpy` / `overrideComponentProvider` / `assertNgModuleScopes` / `assertComponentDefIntact` _(Angular)_ | Override a component-level provider — and verify on the next fixture that the override applied; diagnose an NgModule with an empty runtime scope |
@@ -1,15 +1,15 @@
1
- import { pendingRequestsReport, assertAngularInternals, instrumentTestBed, onTestingModuleConfigured, onComponentCreated, beforeTestBedReset, verifyOnTeardown } from './chunk-4H6KZWGX.js';
2
- export { disableTestBedDiagnostics, enableTestBedDiagnostics, formatSpecTiming, getTestBedTiming, instrumentTestBed, reportSpecTiming } from './chunk-4H6KZWGX.js';
3
- import { failOnUnspiedProvider } from './chunk-SQFEEO4W.js';
4
- import './chunk-X74IM4MQ.js';
5
- import './chunk-KCMPDMLY.js';
6
- import './chunk-25OHJOAA.js';
7
- import './chunk-EDEGKIIR.js';
1
+ import { pendingRequestsReport, assertAngularInternals, instrumentTestBed, onTestingModuleConfigured, onComponentCreated, beforeTestBedReset, verifyOnTeardown } from './chunk-F2KBJC7P.js';
2
+ export { disableTestBedDiagnostics, enableTestBedDiagnostics, formatSpecTiming, getTestBedTiming, instrumentTestBed, reportSpecTiming } from './chunk-F2KBJC7P.js';
3
+ import { failOnUnspiedProvider } from './chunk-GSMWYZ5A.js';
4
+ import './chunk-YUGSITWJ.js';
5
+ import './chunk-6JQ7AFWM.js';
6
+ import './chunk-YDPOBKST.js';
7
+ import './chunk-CLQUJX6E.js';
8
8
  import './chunk-PC3FAZT3.js';
9
- import './chunk-K3EUF6RK.js';
10
- import { isAutoSpyLike } from './chunk-D2R6EQJJ.js';
9
+ import './chunk-72H6HNDI.js';
10
+ import { isAutoSpyLike } from './chunk-XNXIHKVM.js';
11
11
  import { count, taskName } from './chunk-M3NTXLZG.js';
12
- import { angularPendingRequests, angularShadowedProviders, angularDeadSchemas, angularNgModuleScopesAuto } from './chunk-3Q76UTT6.js';
12
+ import { angularPendingRequests, angularShadowedProviders, angularDeadSchemas, angularNgModuleScopesAuto } from './chunk-JOPCMFYN.js';
13
13
  import { withDocs } from './chunk-ENCEEH23.js';
14
14
  import { getTestBed } from '@angular/core/testing';
15
15
  import { beforeEach, afterEach } from 'vitest';
@@ -1,14 +1,14 @@
1
- import { describeInstance } from './chunk-SDTXE5SW.js';
2
- import { useVitestAdapter } from './chunk-ANQVIGAG.js';
3
- import './chunk-TH64BXPP.js';
1
+ import { describeInstance } from './chunk-24JTFFQL.js';
2
+ import { useVitestAdapter } from './chunk-6JLBZHQ3.js';
3
+ import './chunk-JR55747M.js';
4
4
  import './chunk-YHDBRBGU.js';
5
- import './chunk-LWSUV6IX.js';
6
- import './chunk-EDEGKIIR.js';
5
+ import './chunk-2QEM4WP7.js';
6
+ import './chunk-CLQUJX6E.js';
7
7
  import './chunk-PC3FAZT3.js';
8
- import { createFunctionSpy } from './chunk-K3EUF6RK.js';
9
- import './chunk-D2R6EQJJ.js';
8
+ import { createFunctionSpy } from './chunk-72H6HNDI.js';
9
+ import './chunk-XNXIHKVM.js';
10
10
  import './chunk-M3NTXLZG.js';
11
- import { angularDialog } from './chunk-3Q76UTT6.js';
11
+ import { angularDialog } from './chunk-JOPCMFYN.js';
12
12
  import { withDocs } from './chunk-ENCEEH23.js';
13
13
  import { TestBed } from '@angular/core/testing';
14
14
  import { ReplaySubject } from 'rxjs';
@@ -1,9 +1,9 @@
1
- import { assertAngularInternals, pendingRequestsReport, verifyOnTeardown, beforeTestBedReset } from './chunk-4H6KZWGX.js';
2
- import { flushEffects } from './chunk-G5KZLT7Q.js';
3
- import './chunk-X74IM4MQ.js';
1
+ import { assertAngularInternals, pendingRequestsReport, verifyOnTeardown, beforeTestBedReset } from './chunk-F2KBJC7P.js';
2
+ import { flushEffects } from './chunk-DNXCZOYY.js';
3
+ import './chunk-YUGSITWJ.js';
4
4
  import './chunk-W5EXSI22.js';
5
5
  import { count, taskName } from './chunk-M3NTXLZG.js';
6
- import { angularHttpNoRequest, angularHttpPending, angularHttpController, angularHttpExpectRequest } from './chunk-3Q76UTT6.js';
6
+ import { angularHttpNoRequest, angularHttpPending, angularHttpController, angularHttpExpectRequest } from './chunk-JOPCMFYN.js';
7
7
  import { withDocs } from './chunk-ENCEEH23.js';
8
8
  import { provideHttpClient } from '@angular/common/http';
9
9
  import { provideHttpClientTesting, HttpTestingController } from '@angular/common/http/testing';
@@ -1,5 +1,5 @@
1
1
  import { count } from './chunk-M3NTXLZG.js';
2
- import { angularDirectiveApplied } from './chunk-3Q76UTT6.js';
2
+ import { angularDirectiveApplied } from './chunk-JOPCMFYN.js';
3
3
  import { withDocs } from './chunk-ENCEEH23.js';
4
4
  import '@angular/compiler';
5
5
  import { ɵSIGNAL as _SIGNAL, isStandalone } from '@angular/core';
@@ -1,9 +1,9 @@
1
- import { describeInstance } from './chunk-SDTXE5SW.js';
2
- import { angularInternalsError } from './chunk-X74IM4MQ.js';
3
- import { createFunctionSpy } from './chunk-K3EUF6RK.js';
4
- import './chunk-D2R6EQJJ.js';
1
+ import { describeInstance } from './chunk-24JTFFQL.js';
2
+ import { angularInternalsError } from './chunk-YUGSITWJ.js';
3
+ import { createFunctionSpy } from './chunk-72H6HNDI.js';
4
+ import './chunk-XNXIHKVM.js';
5
5
  import { count } from './chunk-M3NTXLZG.js';
6
- import { angularRouteDouble, angularRouterInject, angularRouterEvents, angularLocationDouble, angularRouteWiring, angularRouterDouble } from './chunk-3Q76UTT6.js';
6
+ import { angularRouteDouble, angularRouterInject, angularRouterEvents, angularLocationDouble, angularRouteWiring, angularRouterDouble } from './chunk-JOPCMFYN.js';
7
7
  import { withDocs } from './chunk-ENCEEH23.js';
8
8
  import { TestBed } from '@angular/core/testing';
9
9
  import { Router, DefaultUrlSerializer, PRIMARY_OUTLET, RouterState, ActivatedRoute, NavigationEnd, RouterStateSnapshot, ActivatedRouteSnapshot, NavigationStart, NavigationCancel, NavigationError, NavigationSkipped, UrlSegment, VERSION, createUrlTreeFromSnapshot } from '@angular/router';
package/dist/angular.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { u as AngularTokenProvider, A as AngularValueProvider, a as AutoSpiedInstance, C as ComponentInputs, b as CreateWithAutoSpiesOptions, E as ElementConstructor, N as NativeElementHolder, R as RenderShallowOptions, c as ResourceStatusLike, d as RunCounter, S as SettleResourceOptions, e as ShallowRender, f as SpyRegistry, g as StableOptions, h as createWithAutoSpies, i as flushEffects, j as hostElement, k as injectSpy, p as provideAutoSpy, v as provideAutoSpyForToken, q as queryElement, r as renderShallow, l as runEffect, s as setInputs, m as settleResource, n as stable, t as trackEffectRuns, o as trackRecomputations } from './track-signal-runs-pFMHNAPy.js';
1
+ export { u as AngularTokenProvider, A as AngularValueProvider, a as AutoSpiedInstance, C as ComponentInputs, b as CreateWithAutoSpiesOptions, E as ElementConstructor, N as NativeElementHolder, R as RenderShallowOptions, c as ResourceStatusLike, d as RunCounter, S as SettleResourceOptions, e as ShallowRender, f as SpyRegistry, g as StableOptions, h as createWithAutoSpies, i as flushEffects, j as hostElement, k as injectSpy, p as provideAutoSpy, v as provideAutoSpyForToken, q as queryElement, r as renderShallow, l as runEffect, s as setInputs, m as settleResource, n as stable, t as trackEffectRuns, o as trackRecomputations } from './track-signal-runs-BVbIBVS7.js';
2
2
  import { InjectionToken, Provider, Type, WritableSignal, Signal } from '@angular/core';
3
3
  import { A as AutoMockConfiguration, D as DeepReadonly } from './expect-emission-wUaoy0NW.js';
4
4
  export { C as CallbackSubscribable, E as EmissionObserver, c as EmissionOptions, d as EmissionSource, S as SubscribableLike, h as expectAllEmissions, i as expectCompletion, j as expectEmission, k as expectEmissions, l as expectError, m as expectNoEmission, s as setEmissionTimeout } from './expect-emission-wUaoy0NW.js';
package/dist/angular.js CHANGED
@@ -40,6 +40,7 @@ var angularMockResource = "https://asdalexey.github.io/vitest-auto-spy/adapters/
40
40
  var angularResources = "https://asdalexey.github.io/vitest-auto-spy/adapters/angular#resources-httpresource-and-resource";
41
41
  var angularSignalProp = "https://asdalexey.github.io/vitest-auto-spy/adapters/angular#signal-readonly-property-mocking";
42
42
  var angularStable = "https://asdalexey.github.io/vitest-auto-spy/adapters/angular#zoneless-waiting";
43
+ var angularTypedElements = "https://asdalexey.github.io/vitest-auto-spy/adapters/angular#typed-elements-under-a-strict-lint";
43
44
  var angularTrackRuns = "https://asdalexey.github.io/vitest-auto-spy/adapters/angular#counting-recomputations-and-effect-runs";
44
45
  var autoMockByType = "https://asdalexey.github.io/vitest-auto-spy/core/auto-mock-by-type";
45
46
  var autoMockHeldBack = "https://asdalexey.github.io/vitest-auto-spy/core/auto-mock-by-type#it-answers-everything-so-it-must-not-answer-these";
@@ -3694,18 +3695,31 @@ function describeElement(element) {
3694
3695
  const classes = [...element.classList].map((name) => `.${name}`).join("");
3695
3696
  return `<${element.tagName.toLowerCase()}${classes}> (${element.constructor.name})`;
3696
3697
  }
3698
+ function fail(message) {
3699
+ return withDocs(`[vitest-auto-spy] ${message}`, angularTypedElements);
3700
+ }
3697
3701
  function rootElement(helper, source) {
3702
+ if (source === null) {
3703
+ throw new TypeError(
3704
+ fail(
3705
+ `${helper}: received null instead of a ComponentFixture, a DebugElement or an Element \u2014 a debugElement.query() that matched nothing?
3706
+ Check the predicate against the rendered template, or use queryElement(fixture, selector), which names the selector on a miss.`
3707
+ )
3708
+ );
3709
+ }
3698
3710
  const element = source instanceof Element ? source : source.nativeElement;
3699
3711
  if (!(element instanceof Element)) {
3700
3712
  throw new TypeError(
3701
- `${helper}: expected a ComponentFixture, a DebugElement or an Element, received a nativeElement of ${element === null ? "null" : typeof element}.`
3713
+ fail(
3714
+ `${helper}: expected a ComponentFixture, a DebugElement or an Element, received a nativeElement of ${element === null ? "null" : typeof element}.`
3715
+ )
3702
3716
  );
3703
3717
  }
3704
3718
  return element;
3705
3719
  }
3706
3720
  function checkType(element, type, what, helper) {
3707
3721
  if (!(element instanceof type)) {
3708
- throw new TypeError(`${helper}: ${what} ${describeElement(element)}, not ${type.name}.`);
3722
+ throw new TypeError(fail(`${helper}: ${what} ${describeElement(element)}, not ${type.name}.`));
3709
3723
  }
3710
3724
  return element;
3711
3725
  }
@@ -3717,8 +3731,10 @@ function queryElement(source, selector, type = HTMLElement) {
3717
3731
  const match = root.querySelector(selector);
3718
3732
  if (match === null) {
3719
3733
  throw new Error(
3720
- `queryElement: no element matches '${selector}' inside ${describeElement(root)}.
3734
+ fail(
3735
+ `queryElement: no element matches '${selector}' inside ${describeElement(root)}.
3721
3736
  Render first (\`fixture.detectChanges()\` or \`await stable(fixture)\`), then check the selector against the template.`
3737
+ )
3722
3738
  );
3723
3739
  }
3724
3740
  return checkType(match, type, `'${selector}' matched`, "queryElement");
@@ -4511,7 +4527,7 @@ function collectingObserver(collected, context, settle, handlers) {
4511
4527
  const options = context.options;
4512
4528
  const skip = options?.skip ?? 0;
4513
4529
  const until = options?.until;
4514
- const fail = (error) => {
4530
+ const fail2 = (error) => {
4515
4531
  collected.stop();
4516
4532
  settle.reject(
4517
4533
  emissionFailure(
@@ -4533,7 +4549,7 @@ function collectingObserver(collected, context, settle, handlers) {
4533
4549
  settle.resolve(collected.accepted, collected.subscribing);
4534
4550
  }
4535
4551
  } catch (error) {
4536
- fail(error);
4552
+ fail2(error);
4537
4553
  }
4538
4554
  },
4539
4555
  error: (error) => {
@@ -4643,16 +4659,16 @@ function collectEmissions(source$, count2, options, anchor2, helper) {
4643
4659
  );
4644
4660
  }
4645
4661
  return new Promise((resolve, reject) => {
4646
- const fail = anchoredRejecter(reject, anchor2);
4662
+ const fail2 = anchoredRejecter(reject, anchor2);
4647
4663
  subscribeAndCollect(
4648
4664
  source$,
4649
4665
  options,
4650
4666
  // Resolved with everything that arrived, then narrowed to the accepted ones: the collector's
4651
4667
  // job is to record, and `skip` / `until` decide what the caller is handed.
4652
- { resolve: (values) => resolve(values.slice(0, count2)), reject: fail },
4668
+ { resolve: (values) => resolve(values.slice(0, count2)), reject: fail2 },
4653
4669
  {
4654
4670
  isDone: (acceptedCount) => acceptedCount >= count2,
4655
- onComplete: (_values, received) => fail(completedError(received, { helper, options, expected: count2 })),
4671
+ onComplete: (_values, received) => fail2(completedError(received, { helper, options, expected: count2 })),
4656
4672
  onTimeout: timeoutError,
4657
4673
  onError: rejectAsSourceError,
4658
4674
  emissionsSettle: true,
@@ -4668,13 +4684,13 @@ function expectNoEmission(source$, options) {
4668
4684
  let quietWindow = void 0;
4669
4685
  const context = { helper: "expectNoEmission", options, expected: 1 };
4670
4686
  return new Promise((resolve, reject) => {
4671
- const fail = anchoredRejecter(reject, anchor2);
4687
+ const fail2 = anchoredRejecter(reject, anchor2);
4672
4688
  const collector = subscribeAndCollect(
4673
4689
  source$,
4674
4690
  { ...options, timeout: 0 },
4675
4691
  {
4676
- resolve: (emitted, onSubscribe) => fail(unexpectedEmissionError(emitted, context, onSubscribe)),
4677
- reject: fail
4692
+ resolve: (emitted, onSubscribe) => fail2(unexpectedEmissionError(emitted, context, onSubscribe)),
4693
+ reject: fail2
4678
4694
  },
4679
4695
  {
4680
4696
  isDone: (acceptedCount) => acceptedCount > 0,
@@ -4746,15 +4762,15 @@ function expectError(source$, options) {
4746
4762
  const anchor2 = captureAnchor(expectError);
4747
4763
  const context = { helper: "expectError", options, expected: 0 };
4748
4764
  return new Promise((resolve, reject) => {
4749
- const fail = anchoredRejecter(reject, anchor2);
4765
+ const fail2 = anchoredRejecter(reject, anchor2);
4750
4766
  subscribeAndCollect(
4751
4767
  source$,
4752
4768
  options,
4753
- { resolve, reject: fail },
4769
+ { resolve, reject: fail2 },
4754
4770
  {
4755
4771
  // Only `error` settles this one: an emission is not the answer, and neither is completion.
4756
4772
  isDone: staysOpen,
4757
- onComplete: (_values, received) => fail(completedWithoutErrorError(received, context)),
4773
+ onComplete: (_values, received) => fail2(completedWithoutErrorError(received, context)),
4758
4774
  onTimeout: notErroredError,
4759
4775
  onError: resolveWithError,
4760
4776
  emissionsSettle: false,
@@ -3,7 +3,7 @@ export { AdoptMockOptions, AdoptedMock, ArgCaptor, AsInstances, AssertMockedOpti
3
3
  export { A as AutoMockConfiguration, a as AutoMocked, b as AutoSpyDefaultEntry, C as CallbackSubscribable, E as EmissionObserver, c as EmissionOptions, d as EmissionSource, S as SubscribableLike, e as autoMocked, f as clearAutoSpyDefaults, g as createAutoMock, h as expectAllEmissions, i as expectCompletion, j as expectEmission, k as expectEmissions, l as expectError, m as expectNoEmission, r as registerAutoSpyDefaults, s as setEmissionTimeout } from './expect-emission-wUaoy0NW.js';
4
4
  export { c as createFunctionSpy, d as describeDuplicateCopies, g as getPackageCopies } from './package-identity-5pFBRWW9.js';
5
5
  export { A as AccessorImplementations, O as OutsideHookReaction, R as RestoreProp, c as countMockedProps, m as mockAccessorsProp, a as mockReadonlyProp, b as mockReadonlyPropGetter, d as mockValueProp, r as reportPropsOutsideHooks, e as restoreMockedProps } from './prop-mock-DUcl1uMH.js';
6
- export { A as AngularValueProvider, a as AutoSpiedInstance, C as ComponentInputs, b as CreateWithAutoSpiesOptions, E as ElementConstructor, N as NativeElementHolder, R as RenderShallowOptions, c as ResourceStatusLike, d as RunCounter, S as SettleResourceOptions, e as ShallowRender, f as SpyRegistry, g as StableOptions, h as createWithAutoSpies, i as flushEffects, j as hostElement, k as injectSpy, p as provideAutoSpy, q as queryElement, r as renderShallow, l as runEffect, s as setInputs, m as settleResource, n as stable, t as trackEffectRuns, o as trackRecomputations } from './track-signal-runs-pFMHNAPy.js';
6
+ export { A as AngularValueProvider, a as AutoSpiedInstance, C as ComponentInputs, b as CreateWithAutoSpiesOptions, E as ElementConstructor, N as NativeElementHolder, R as RenderShallowOptions, c as ResourceStatusLike, d as RunCounter, S as SettleResourceOptions, e as ShallowRender, f as SpyRegistry, g as StableOptions, h as createWithAutoSpies, i as flushEffects, j as hostElement, k as injectSpy, p as provideAutoSpy, q as queryElement, r as renderShallow, l as runEffect, s as setInputs, m as settleResource, n as stable, t as trackEffectRuns, o as trackRecomputations } from './track-signal-runs-BVbIBVS7.js';
7
7
  import 'vitest';
8
8
  import '@angular/core';
9
9
  import '@angular/core/testing';
@@ -1,22 +1,22 @@
1
- import { createSpyForToken } from './chunk-4IRFL76M.js';
2
- export { injectSpy, provideAutoSpy } from './chunk-SQFEEO4W.js';
3
- import { stable, flushEffects } from './chunk-G5KZLT7Q.js';
4
- export { flushEffects, stable } from './chunk-G5KZLT7Q.js';
5
- import { angularInternalsError } from './chunk-X74IM4MQ.js';
6
- import './chunk-FRD6NXVY.js';
7
- export { adoptMock, asInstance, asInstances, asSpy, assertMocked, captureArg, createFixture, createFixtureFactory, createLog, createMock, createSpyClass, createSpyFromInstance, describeDuplicateCopies, expectAllEmissions, expectCompletion, expectEmission, expectEmissions, expectError, expectNoEmission, flushEventLoop, flushEventLoopUntil, getPackageCopies, mockConstructor, mockDeep, moduleNamespace, narrow, outOfType, restoreSpiedInstance, setEmissionTimeout, settleDynamicImport, spyOnOwnMethod, spyOnVoidMethod, stubConstructor, withOverrides } from './chunk-NTCEH2FY.js';
8
- import { mockValueProp } from './chunk-KCMPDMLY.js';
9
- export { countMockedProps, mockAccessorsProp, mockReadonlyProp, mockReadonlyPropGetter, mockValueProp, reportPropsOutsideHooks, restoreMockedProps } from './chunk-KCMPDMLY.js';
10
- import { closestName } from './chunk-25OHJOAA.js';
11
- export { autoMocked, clearAutoSpy, clearAutoSpyDefaults, createAutoMock, createSpyFromClass, registerAutoSpyDefaults, resetAutoSpy } from './chunk-25OHJOAA.js';
1
+ import { createSpyForToken } from './chunk-7WM3A4IB.js';
2
+ export { injectSpy, provideAutoSpy } from './chunk-GSMWYZ5A.js';
3
+ import { stable, flushEffects } from './chunk-DNXCZOYY.js';
4
+ export { flushEffects, stable } from './chunk-DNXCZOYY.js';
5
+ import { angularInternalsError } from './chunk-YUGSITWJ.js';
6
+ import './chunk-XUPBHHJD.js';
7
+ export { adoptMock, asInstance, asInstances, asSpy, assertMocked, captureArg, createFixture, createFixtureFactory, createLog, createMock, createSpyClass, createSpyFromInstance, describeDuplicateCopies, expectAllEmissions, expectCompletion, expectEmission, expectEmissions, expectError, expectNoEmission, flushEventLoop, flushEventLoopUntil, getPackageCopies, mockConstructor, mockDeep, moduleNamespace, narrow, outOfType, restoreSpiedInstance, setEmissionTimeout, settleDynamicImport, spyOnOwnMethod, spyOnVoidMethod, stubConstructor, withOverrides } from './chunk-TMFV4DXT.js';
8
+ import { mockValueProp } from './chunk-6JQ7AFWM.js';
9
+ export { countMockedProps, mockAccessorsProp, mockReadonlyProp, mockReadonlyPropGetter, mockValueProp, reportPropsOutsideHooks, restoreMockedProps } from './chunk-6JQ7AFWM.js';
10
+ import { closestName } from './chunk-YDPOBKST.js';
11
+ export { autoMocked, clearAutoSpy, clearAutoSpyDefaults, createAutoMock, createSpyFromClass, registerAutoSpyDefaults, resetAutoSpy } from './chunk-YDPOBKST.js';
12
12
  import { fakeClockBacklog } from './chunk-W5EXSI22.js';
13
- import './chunk-LWSUV6IX.js';
14
- import './chunk-EDEGKIIR.js';
13
+ import './chunk-2QEM4WP7.js';
14
+ import './chunk-CLQUJX6E.js';
15
15
  import './chunk-PC3FAZT3.js';
16
- export { createFunctionSpy, errorHandler } from './chunk-K3EUF6RK.js';
17
- import { libraryWarn } from './chunk-D2R6EQJJ.js';
16
+ export { createFunctionSpy, errorHandler } from './chunk-72H6HNDI.js';
17
+ import { libraryWarn } from './chunk-XNXIHKVM.js';
18
18
  import { displayPath, count } from './chunk-M3NTXLZG.js';
19
- import { angularEffects, angularTrackRuns, bunAngular, angularUnreadResource, angularCreateWithAutoSpies, angularResources, angularInputs, angularKeepTemplate } from './chunk-3Q76UTT6.js';
19
+ import { angularEffects, angularTrackRuns, bunAngular, angularUnreadResource, angularCreateWithAutoSpies, angularResources, angularTypedElements, angularInputs, angularKeepTemplate } from './chunk-JOPCMFYN.js';
20
20
  import { withDocs } from './chunk-ENCEEH23.js';
21
21
  import '@angular/compiler';
22
22
  import { NgModule, provideZonelessChangeDetection, Injector, runInInjectionContext, NO_ERRORS_SCHEMA, untracked, ɵSIGNAL as _SIGNAL } from '@angular/core';
@@ -289,18 +289,31 @@ function describeElement(element) {
289
289
  const classes = [...element.classList].map((name) => `.${name}`).join("");
290
290
  return `<${element.tagName.toLowerCase()}${classes}> (${element.constructor.name})`;
291
291
  }
292
+ function fail(message) {
293
+ return withDocs(`[vitest-auto-spy] ${message}`, angularTypedElements);
294
+ }
292
295
  function rootElement(helper, source) {
296
+ if (source === null) {
297
+ throw new TypeError(
298
+ fail(
299
+ `${helper}: received null instead of a ComponentFixture, a DebugElement or an Element \u2014 a debugElement.query() that matched nothing?
300
+ Check the predicate against the rendered template, or use queryElement(fixture, selector), which names the selector on a miss.`
301
+ )
302
+ );
303
+ }
293
304
  const element = source instanceof Element ? source : source.nativeElement;
294
305
  if (!(element instanceof Element)) {
295
306
  throw new TypeError(
296
- `${helper}: expected a ComponentFixture, a DebugElement or an Element, received a nativeElement of ${element === null ? "null" : typeof element}.`
307
+ fail(
308
+ `${helper}: expected a ComponentFixture, a DebugElement or an Element, received a nativeElement of ${element === null ? "null" : typeof element}.`
309
+ )
297
310
  );
298
311
  }
299
312
  return element;
300
313
  }
301
314
  function checkType(element, type, what, helper) {
302
315
  if (!(element instanceof type)) {
303
- throw new TypeError(`${helper}: ${what} ${describeElement(element)}, not ${type.name}.`);
316
+ throw new TypeError(fail(`${helper}: ${what} ${describeElement(element)}, not ${type.name}.`));
304
317
  }
305
318
  return element;
306
319
  }
@@ -312,8 +325,10 @@ function queryElement(source, selector, type = HTMLElement) {
312
325
  const match = root.querySelector(selector);
313
326
  if (match === null) {
314
327
  throw new Error(
315
- `queryElement: no element matches '${selector}' inside ${describeElement(root)}.
328
+ fail(
329
+ `queryElement: no element matches '${selector}' inside ${describeElement(root)}.
316
330
  Render first (\`fixture.detectChanges()\` or \`await stable(fixture)\`), then check the selector against the template.`
331
+ )
317
332
  );
318
333
  }
319
334
  return checkType(match, type, `'${selector}' matched`, "queryElement");
package/dist/bun.js CHANGED
@@ -1,13 +1,13 @@
1
- import './chunk-FRD6NXVY.js';
2
- export { adoptMock, asInstance, asInstances, asSpy, assertMocked, captureArg, createFixture, createFixtureFactory, createLog, createMock, createSpyClass, createSpyFromInstance, describeDuplicateCopies, expectAllEmissions, expectCompletion, expectEmission, expectEmissions, expectError, expectNoEmission, flushEventLoop, flushEventLoopUntil, getPackageCopies, mockConstructor, mockDeep, moduleNamespace, narrow, outOfType, restoreSpiedInstance, setEmissionTimeout, settleDynamicImport, spyOnOwnMethod, spyOnVoidMethod, stubConstructor, withOverrides } from './chunk-NTCEH2FY.js';
3
- export { countMockedProps, mockAccessorsProp, mockReadonlyProp, mockReadonlyPropGetter, mockValueProp, reportPropsOutsideHooks, restoreMockedProps } from './chunk-KCMPDMLY.js';
4
- export { autoMocked, clearAutoSpy, clearAutoSpyDefaults, createAutoMock, createSpyFromClass, registerAutoSpyDefaults, resetAutoSpy } from './chunk-25OHJOAA.js';
1
+ import './chunk-XUPBHHJD.js';
2
+ export { adoptMock, asInstance, asInstances, asSpy, assertMocked, captureArg, createFixture, createFixtureFactory, createLog, createMock, createSpyClass, createSpyFromInstance, describeDuplicateCopies, expectAllEmissions, expectCompletion, expectEmission, expectEmissions, expectError, expectNoEmission, flushEventLoop, flushEventLoopUntil, getPackageCopies, mockConstructor, mockDeep, moduleNamespace, narrow, outOfType, restoreSpiedInstance, setEmissionTimeout, settleDynamicImport, spyOnOwnMethod, spyOnVoidMethod, stubConstructor, withOverrides } from './chunk-TMFV4DXT.js';
3
+ export { countMockedProps, mockAccessorsProp, mockReadonlyProp, mockReadonlyPropGetter, mockValueProp, reportPropsOutsideHooks, restoreMockedProps } from './chunk-6JQ7AFWM.js';
4
+ export { autoMocked, clearAutoSpy, clearAutoSpyDefaults, createAutoMock, createSpyFromClass, registerAutoSpyDefaults, resetAutoSpy } from './chunk-YDPOBKST.js';
5
5
  import './chunk-W5EXSI22.js';
6
- import './chunk-LWSUV6IX.js';
7
- import './chunk-EDEGKIIR.js';
6
+ import './chunk-2QEM4WP7.js';
7
+ import './chunk-CLQUJX6E.js';
8
8
  import './chunk-PC3FAZT3.js';
9
- export { createFunctionSpy, errorHandler } from './chunk-K3EUF6RK.js';
10
- import './chunk-D2R6EQJJ.js';
9
+ export { createFunctionSpy, errorHandler } from './chunk-72H6HNDI.js';
10
+ import './chunk-XNXIHKVM.js';
11
11
  import './chunk-M3NTXLZG.js';
12
- import './chunk-3Q76UTT6.js';
12
+ import './chunk-JOPCMFYN.js';
13
13
  import './chunk-ENCEEH23.js';
@@ -1,4 +1,4 @@
1
- import { isAutoSpyLike } from './chunk-D2R6EQJJ.js';
1
+ import { isAutoSpyLike } from './chunk-XNXIHKVM.js';
2
2
 
3
3
  // src/lib/angular-instance-name.ts
4
4
  function describeInstance(instance) {
@@ -1,4 +1,4 @@
1
- import { isCannotRedefine, redefineFailure } from './chunk-EDEGKIIR.js';
1
+ import { isCannotRedefine, redefineFailure } from './chunk-CLQUJX6E.js';
2
2
 
3
3
  // src/lib/redefine-accessor-spy.ts
4
4
  function createRedefineMockAdapter({
@@ -1,6 +1,6 @@
1
- import { clearAllFastSpies, resetAllFastSpies, getSpyEngine, createFastSpy } from './chunk-TH64BXPP.js';
1
+ import { clearAllFastSpies, resetAllFastSpies, getSpyEngine, createFastSpy } from './chunk-JR55747M.js';
2
2
  import { SWEEP_SENTINEL } from './chunk-YHDBRBGU.js';
3
- import { guardAccessorSpies, spyOnAccessorByRedefine } from './chunk-LWSUV6IX.js';
3
+ import { guardAccessorSpies, spyOnAccessorByRedefine } from './chunk-2QEM4WP7.js';
4
4
  import { hasMockAdapter, registerMockAdapter } from './shared-state.js';
5
5
  import { vi } from 'vitest';
6
6
 
@@ -1,7 +1,7 @@
1
- import { isCannotRedefine, redefineFailure } from './chunk-EDEGKIIR.js';
2
- import { libraryWarn } from './chunk-D2R6EQJJ.js';
1
+ import { isCannotRedefine, redefineFailure } from './chunk-CLQUJX6E.js';
2
+ import { libraryWarn } from './chunk-XNXIHKVM.js';
3
3
  import { count, displayPath } from './chunk-M3NTXLZG.js';
4
- import { setupGlobals, setupWrongHook, setup } from './chunk-3Q76UTT6.js';
4
+ import { setupGlobals, setupWrongHook, setup } from './chunk-JOPCMFYN.js';
5
5
  import { withDocs } from './chunk-ENCEEH23.js';
6
6
  import { getMockAdapter } from './shared-state.js';
7
7
 
@@ -1,6 +1,6 @@
1
- import { AUTO_SPY_MARK, attachHelpers, markAsMock, reportMisconfiguration, detachedHelperError, decorate } from './chunk-D2R6EQJJ.js';
1
+ import { AUTO_SPY_MARK, attachHelpers, markAsMock, reportMisconfiguration, detachedHelperError, decorate } from './chunk-XNXIHKVM.js';
2
2
  import { displayPath } from './chunk-M3NTXLZG.js';
3
- import { mustBeCalledWith, strictCall, createSpyFromClass } from './chunk-3Q76UTT6.js';
3
+ import { mustBeCalledWith, strictCall, createSpyFromClass } from './chunk-JOPCMFYN.js';
4
4
  import { withDocs } from './chunk-ENCEEH23.js';
5
5
  import { getMockAdapter, getObservableSupport, getJasmineSupport, requireObservableSupport } from './shared-state.js';
6
6
 
@@ -1,5 +1,5 @@
1
- import { createSpyFromClass, createAutoMock } from './chunk-25OHJOAA.js';
2
- import { trackInjectionsUntracked } from './chunk-3Q76UTT6.js';
1
+ import { createSpyFromClass, createAutoMock } from './chunk-YDPOBKST.js';
2
+ import { trackInjectionsUntracked } from './chunk-JOPCMFYN.js';
3
3
  import { withDocs } from './chunk-ENCEEH23.js';
4
4
 
5
5
  // src/lib/track-injections.ts
@@ -1,4 +1,4 @@
1
- import { realSeam, createSpyFromClass, autoMockByType, createSpyFromClassAccessorSpies } from './chunk-3Q76UTT6.js';
1
+ import { realSeam, createSpyFromClass, autoMockByType, createSpyFromClassAccessorSpies } from './chunk-JOPCMFYN.js';
2
2
  import { withDocs } from './chunk-ENCEEH23.js';
3
3
 
4
4
  // src/lib/redefine-failure.ts
@@ -1,6 +1,6 @@
1
1
  import { unpatchedSetTimeout, unpatchedClearTimeout, fakeClockBacklog } from './chunk-W5EXSI22.js';
2
2
  import { count } from './chunk-M3NTXLZG.js';
3
- import { angularStable } from './chunk-3Q76UTT6.js';
3
+ import { angularStable } from './chunk-JOPCMFYN.js';
4
4
  import { withDocs } from './chunk-ENCEEH23.js';
5
5
  import { NgZone } from '@angular/core';
6
6
  import { TestBed } from '@angular/core/testing';
@@ -1,4 +1,4 @@
1
- import { angularInternalsError } from './chunk-X74IM4MQ.js';
1
+ import { angularInternalsError } from './chunk-YUGSITWJ.js';
2
2
  import { count } from './chunk-M3NTXLZG.js';
3
3
  import { TestBed, getTestBed } from '@angular/core/testing';
4
4
  import { expect, beforeAll, afterAll } from 'vitest';
@@ -1,7 +1,7 @@
1
- import { currentSpecFile } from './chunk-KCMPDMLY.js';
2
- import { createSpyFromClass } from './chunk-25OHJOAA.js';
3
- import { isAutoSpyLike, misconfigurationThrows, reportMisconfiguration } from './chunk-D2R6EQJJ.js';
4
- import { angularInjectSpyReal } from './chunk-3Q76UTT6.js';
1
+ import { currentSpecFile } from './chunk-6JQ7AFWM.js';
2
+ import { createSpyFromClass } from './chunk-YDPOBKST.js';
3
+ import { isAutoSpyLike, misconfigurationThrows, reportMisconfiguration } from './chunk-XNXIHKVM.js';
4
+ import { angularInjectSpyReal } from './chunk-JOPCMFYN.js';
5
5
  import { withDocs } from './chunk-ENCEEH23.js';
6
6
  import { TestBed } from '@angular/core/testing';
7
7
 
@@ -24,6 +24,7 @@ var angularShadowedProviders = "https://asdalexey.github.io/vitest-auto-spy/adap
24
24
  var angularEffects = "https://asdalexey.github.io/vitest-auto-spy/adapters/angular#running-one-effect-on-demand";
25
25
  var angularResources = "https://asdalexey.github.io/vitest-auto-spy/adapters/angular#resources-httpresource-and-resource";
26
26
  var angularStable = "https://asdalexey.github.io/vitest-auto-spy/adapters/angular#zoneless-waiting";
27
+ var angularTypedElements = "https://asdalexey.github.io/vitest-auto-spy/adapters/angular#typed-elements-under-a-strict-lint";
27
28
  var angularTrackRuns = "https://asdalexey.github.io/vitest-auto-spy/adapters/angular#counting-recomputations-and-effect-runs";
28
29
  var angularUnreadResource = "https://asdalexey.github.io/vitest-auto-spy/runtimes/bun-angular#a-template-or-stylesheet-that-cannot-be-read";
29
30
  var autoMockByType = "https://asdalexey.github.io/vitest-auto-spy/core/auto-mock-by-type";
@@ -62,4 +63,4 @@ var strictModePassthrough = "https://asdalexey.github.io/vitest-auto-spy/core/st
62
63
  var trackInjectionsUntracked = "https://asdalexey.github.io/vitest-auto-spy/utilities/track-injections#get-on-a-token-that-is-not-tracked";
63
64
  var zoneRequirements = "https://asdalexey.github.io/vitest-auto-spy/utilities/zone#requirements";
64
65
 
65
- export { adoptMock, angularCreateWithAutoSpies, angularDeadSchemas, angularDialog, angularDirectiveApplied, angularEffects, angularHttpController, angularHttpExpectRequest, angularHttpNoRequest, angularHttpPending, angularInjectSpyReal, angularInputs, angularInternals, angularKeepTemplate, angularLocationDouble, angularNgModuleScopesAuto, angularPendingRequests, angularResources, angularRouteDouble, angularRouteWiring, angularRouterDouble, angularRouterEvents, angularRouterInject, angularShadowedProviders, angularStable, angularTrackRuns, angularUnreadResource, autoMockByType, autoMockHeldBack, bunAngular, captureArg, controlHelpers, createSpyFromClass, createSpyFromClassAccessorSpies, createSpyFromClassAccessors, createSpyFromClassInstanceMethods, createSpyFromClassLazySpies, createSpyFromClassReturns, eventLoopUntil, jasmineAutoSpies, jasmineClock, jasmineGlobals, jasmineTimeout, jasmineWithArgs, mockConstructor, moduleMocksAssert, moduleMocksNoOp, mustBeCalledWith, narrow, nestUnitRefusals, nextWithValuesLate, observableFailures, realSeam, setup, setupGlobals, setupWrongHook, signalFormsCreate, signalFormsErrors, strictCall, strictModePassthrough, trackInjectionsUntracked, zoneRequirements };
66
+ export { adoptMock, angularCreateWithAutoSpies, angularDeadSchemas, angularDialog, angularDirectiveApplied, angularEffects, angularHttpController, angularHttpExpectRequest, angularHttpNoRequest, angularHttpPending, angularInjectSpyReal, angularInputs, angularInternals, angularKeepTemplate, angularLocationDouble, angularNgModuleScopesAuto, angularPendingRequests, angularResources, angularRouteDouble, angularRouteWiring, angularRouterDouble, angularRouterEvents, angularRouterInject, angularShadowedProviders, angularStable, angularTrackRuns, angularTypedElements, angularUnreadResource, autoMockByType, autoMockHeldBack, bunAngular, captureArg, controlHelpers, createSpyFromClass, createSpyFromClassAccessorSpies, createSpyFromClassAccessors, createSpyFromClassInstanceMethods, createSpyFromClassLazySpies, createSpyFromClassReturns, eventLoopUntil, jasmineAutoSpies, jasmineClock, jasmineGlobals, jasmineTimeout, jasmineWithArgs, mockConstructor, moduleMocksAssert, moduleMocksNoOp, mustBeCalledWith, narrow, nestUnitRefusals, nextWithValuesLate, observableFailures, realSeam, setup, setupGlobals, setupWrongHook, signalFormsCreate, signalFormsErrors, strictCall, strictModePassthrough, trackInjectionsUntracked, zoneRequirements };
@@ -1,7 +1,7 @@
1
1
  import { DISPOSE } from './chunk-PC3FAZT3.js';
2
- import { isFastSpy, FAST_SPY_BRAND, isThenable } from './chunk-K3EUF6RK.js';
3
- import { setSharedHelperSink, hooksOf } from './chunk-D2R6EQJJ.js';
4
- import { mockConstructor } from './chunk-3Q76UTT6.js';
2
+ import { isFastSpy, FAST_SPY_BRAND, isThenable } from './chunk-72H6HNDI.js';
3
+ import { setSharedHelperSink, hooksOf } from './chunk-XNXIHKVM.js';
4
+ import { mockConstructor } from './chunk-JOPCMFYN.js';
5
5
  import { withDocs } from './chunk-ENCEEH23.js';
6
6
 
7
7
  // src/lib/fast-spy.ts
@@ -1,4 +1,4 @@
1
- import { jasmineWithArgs } from './chunk-3Q76UTT6.js';
1
+ import { jasmineWithArgs } from './chunk-JOPCMFYN.js';
2
2
  import { withDocs } from './chunk-ENCEEH23.js';
3
3
  import { registerJasmineSupport, getMockAdapter } from './shared-state.js';
4
4
 
@@ -1,12 +1,12 @@
1
- import { mockValueProp, mockAccessorsProp } from './chunk-KCMPDMLY.js';
2
- import { resolveConfiguration, mergeAutoSpyDefaults, resolveReadGuard, mergeMethodNames, getCallableMemberNames, createTrackedPropSpy, applyConfiguredReturns, createSpyFromClass, warnOnUnknownMethods, warnOnAccessorNamingAMethod, resolveAccessors, createAccessorsSpies, ownerOf, createProxyPropStore, storeWriteTraps, describeStoredProp, hasStoredProp, isProtocolKey, isDeletedProp, readStoredAccessor, NOT_STORED, disposeAutoSpy, writeStoredValue } from './chunk-25OHJOAA.js';
1
+ import { mockValueProp, mockAccessorsProp } from './chunk-6JQ7AFWM.js';
2
+ import { resolveConfiguration, mergeAutoSpyDefaults, resolveReadGuard, mergeMethodNames, getCallableMemberNames, createTrackedPropSpy, applyConfiguredReturns, createSpyFromClass, warnOnUnknownMethods, warnOnAccessorNamingAMethod, resolveAccessors, createAccessorsSpies, ownerOf, createProxyPropStore, storeWriteTraps, describeStoredProp, hasStoredProp, isProtocolKey, isDeletedProp, readStoredAccessor, NOT_STORED, disposeAutoSpy, writeStoredValue } from './chunk-YDPOBKST.js';
3
3
  import { unpatchedSetTimeout, unpatchedClearTimeout, fakeClockAdvice, fakeClockBacklog } from './chunk-W5EXSI22.js';
4
- import { redefineFailure } from './chunk-EDEGKIIR.js';
4
+ import { redefineFailure } from './chunk-CLQUJX6E.js';
5
5
  import { DISPOSE } from './chunk-PC3FAZT3.js';
6
- import { defineHelper, adoptFunctionSpy, reinstallDispatch, serializeValue, resolveUnstubbedGuard, createFunctionSpy } from './chunk-K3EUF6RK.js';
7
- import { isMarkedMock, reportMisconfiguration, DEEP_CHILDREN } from './chunk-D2R6EQJJ.js';
6
+ import { defineHelper, adoptFunctionSpy, reinstallDispatch, serializeValue, resolveUnstubbedGuard, createFunctionSpy } from './chunk-72H6HNDI.js';
7
+ import { isMarkedMock, reportMisconfiguration, DEEP_CHILDREN } from './chunk-XNXIHKVM.js';
8
8
  import { count, displayPath } from './chunk-M3NTXLZG.js';
9
- import { moduleMocksAssert, moduleMocksNoOp, narrow, adoptMock, observableFailures, strictModePassthrough, createSpyFromClassReturns, captureArg, eventLoopUntil, mockConstructor } from './chunk-3Q76UTT6.js';
9
+ import { moduleMocksAssert, moduleMocksNoOp, narrow, adoptMock, observableFailures, strictModePassthrough, createSpyFromClassReturns, captureArg, eventLoopUntil, mockConstructor } from './chunk-JOPCMFYN.js';
10
10
  import { withDocs } from './chunk-ENCEEH23.js';
11
11
  import { getMockAdapter, emissionTimeout, registerEmissionWait, forgetEmissionWait } from './shared-state.js';
12
12
  export { describeDuplicateCopies, getPackageCopies, setEmissionTimeout } from './shared-state.js';
@@ -1,4 +1,4 @@
1
- import { controlHelpers } from './chunk-3Q76UTT6.js';
1
+ import { controlHelpers } from './chunk-JOPCMFYN.js';
2
2
  import { withDocs } from './chunk-ENCEEH23.js';
3
3
 
4
4
  // src/lib/guard-reaction.ts
@@ -1,4 +1,4 @@
1
- import { guardAccessorSpies, createRedefineMockAdapter } from './chunk-LWSUV6IX.js';
1
+ import { guardAccessorSpies, createRedefineMockAdapter } from './chunk-2QEM4WP7.js';
2
2
  import { mock } from 'bun:test';
3
3
  import { registerMockAdapter } from './shared-state.js';
4
4
 
@@ -1,7 +1,7 @@
1
1
  import { DISPOSE } from './chunk-PC3FAZT3.js';
2
- import { defaultStrict, resolveUnstubbedGuard, seedReturnValue, createFunctionSpy } from './chunk-K3EUF6RK.js';
3
- import { runClearHook, runConfigReset, reportMisconfiguration, AUTO_SPY_MARK, markAsMock, isMarkedMock, readDeepChildren } from './chunk-D2R6EQJJ.js';
4
- import { autoMockHeldBack, createSpyFromClassInstanceMethods, createSpyFromClassAccessors, createSpyFromClassReturns, createSpyFromClassLazySpies } from './chunk-3Q76UTT6.js';
2
+ import { defaultStrict, resolveUnstubbedGuard, seedReturnValue, createFunctionSpy } from './chunk-72H6HNDI.js';
3
+ import { runClearHook, runConfigReset, reportMisconfiguration, AUTO_SPY_MARK, markAsMock, isMarkedMock, readDeepChildren } from './chunk-XNXIHKVM.js';
4
+ import { autoMockHeldBack, createSpyFromClassInstanceMethods, createSpyFromClassAccessors, createSpyFromClassReturns, createSpyFromClassLazySpies } from './chunk-JOPCMFYN.js';
5
5
  import { withDocs } from './chunk-ENCEEH23.js';
6
6
  import { getMockAdapter, requireObservableSupport, getJasmineSupport } from './shared-state.js';
7
7
 
@@ -1,4 +1,4 @@
1
- import { angularInternals } from './chunk-3Q76UTT6.js';
1
+ import { angularInternals } from './chunk-JOPCMFYN.js';
2
2
  import { withDocs } from './chunk-ENCEEH23.js';
3
3
  import { VERSION } from '@angular/core';
4
4
 
package/dist/cli.js CHANGED
@@ -3204,7 +3204,7 @@ function checkForeignPragma(graph) {
3204
3204
  }
3205
3205
 
3206
3206
  // src/cli/checks/export-map.generated.ts
3207
- var EXPORT_MAP_VERSION = "5.31.0";
3207
+ var EXPORT_MAP_VERSION = "5.32.0";
3208
3208
  var ENTRY_SPECIFIERS = "vitest-auto-spy vitest-auto-spy/bun vitest-auto-spy/bun-angular vitest-auto-spy/node vitest-auto-spy/rstest vitest-auto-spy/rxjs vitest-auto-spy/console vitest-auto-spy/dom-stubs vitest-auto-spy/diagnostics vitest-auto-spy/jasmine vitest-auto-spy/jasmine-compat vitest-auto-spy/observer-spy vitest-auto-spy/angular vitest-auto-spy/angular/diagnostics vitest-auto-spy/angular/doubles vitest-auto-spy/angular/matchers vitest-auto-spy/angular-http vitest-auto-spy/angular-router vitest-auto-spy/signal-forms vitest-auto-spy/nestjs vitest-auto-spy/react vitest-auto-spy/vue vitest-auto-spy/svelte vitest-auto-spy/setup vitest-auto-spy/zone vitest-auto-spy/eslint-plugin vitest-auto-spy/perf-reporter";
3209
3209
  var EXPORTED_BY = {
3210
3210
  AccessorImplementations: "0 1 2 3 4 12 20 21 22",
@@ -4730,6 +4730,9 @@ function isStampOnly(plan) {
4730
4730
  }
4731
4731
  var STAMP_ONLY_NOTE = "only the version stamp differs, which `--check` does not count; a plain `init` refreshes it";
4732
4732
  function statusOf(plan, check) {
4733
+ if (plan.staleCopy === true) {
4734
+ return "stale";
4735
+ }
4733
4736
  if (plan.desired === void 0) {
4734
4737
  return "skipped";
4735
4738
  }
@@ -4755,9 +4758,14 @@ function collectTargets(profile, only) {
4755
4758
  function readTarget(cwd, target) {
4756
4759
  return pathExists(join(cwd, target.path)) ? readTextFile(join(cwd, target.path)) : void 0;
4757
4760
  }
4761
+ function isShippedSkillCopy(content) {
4762
+ const frontmatter = /^---\r?\n([\S\s]*?)\r?\n---/.exec(content)?.[1] ?? "";
4763
+ return /^name:\s*(["']?)vitest-auto-spy\1\s*$/m.test(frontmatter);
4764
+ }
4765
+ var STALE_COPY_NOTE = "a copy of the shipped skill that init did not write \u2014 frozen at the version it was copied from";
4758
4766
  function skillPlan(plan, version, frontmatter) {
4759
4767
  if (plan.desired === void 0 && plan.existing !== void 0) {
4760
- return plan;
4768
+ return isShippedSkillCopy(plan.existing) ? { ...plan, staleCopy: true, note: STALE_COPY_NOTE } : plan;
4761
4769
  }
4762
4770
  if (frontmatter === void 0) {
4763
4771
  return { ...plan, desired: void 0, note: "the shipped skill could not be read \u2014 skipped" };
@@ -4824,7 +4832,7 @@ function budgetWarnings(plans) {
4824
4832
  }
4825
4833
  function untouchedWarnings(plans) {
4826
4834
  return plans.filter((plan) => plan.desired === void 0 && plan.existing !== void 0 && plan.target.kind === "owned").map(
4827
- (plan) => `${plan.target.path} exists and was not written by init \u2014 left untouched; fold it into the managed block by hand if you want init to own it.`
4835
+ (plan) => plan.staleCopy === true ? `${plan.target.path} is a copy of the shipped vitest-auto-spy skill, not written by init, so no upgrade refreshes it \u2014 left untouched. Delete it and re-run \`npx vitest-auto-spy init\` to replace it with the managed pointer.` : `${plan.target.path} exists and was not written by init \u2014 left untouched; fold it into the managed block by hand if you want init to own it.`
4828
4836
  );
4829
4837
  }
4830
4838
  function unmatchedWarnings(only) {
@@ -4837,7 +4845,7 @@ function unmatchedWarnings(only) {
4837
4845
  function runInit(profile, version, options) {
4838
4846
  const plans = buildPlans(profile, version, options.only).map((plan) => options.uninstall ? uninstallPlan(plan) : plan);
4839
4847
  const actions = plans.map((plan) => applyPlan(profile.cwd, plan, options));
4840
- const pending = actions.some((action) => action.status === "created" || action.status === "updated");
4848
+ const pending = actions.some((action) => action.status === "created" || action.status === "updated" || action.status === "stale");
4841
4849
  return {
4842
4850
  actions,
4843
4851
  warnings: [...unmatchedWarnings(options.only), ...options.uninstall ? [] : [...untouchedWarnings(plans), ...budgetWarnings(plans)]],
@@ -7267,10 +7275,16 @@ warning ${warning}`);
7267
7275
  }
7268
7276
  if (!result.ok) {
7269
7277
  const stale = result.actions.filter((action) => action.status === "created" || action.status === "updated").map((action) => action.path);
7270
- io.err(
7271
- `
7278
+ if (stale.length > 0) {
7279
+ io.err(
7280
+ `
7272
7281
  ${stale.join(", ")} ${stale.length === 1 ? "is" : "are"} out of date. Run \`npx vitest-auto-spy init\` to update ${stale.length === 1 ? "it" : "them"}.`
7273
- );
7282
+ );
7283
+ }
7284
+ for (const action of result.actions.filter((candidate) => candidate.status === "stale")) {
7285
+ io.err(`
7286
+ ${action.path} is a stale copy of the shipped skill. Delete it, then run \`npx vitest-auto-spy init\`.`);
7287
+ }
7274
7288
  return 1;
7275
7289
  }
7276
7290
  io.out(check ? "\nUp to date." : "\nDone. Re-run after upgrading the package; the block between the markers is regenerated.");
package/dist/console.js CHANGED
@@ -1,13 +1,13 @@
1
- import { useVitestAdapter } from './chunk-ANQVIGAG.js';
2
- import './chunk-TH64BXPP.js';
1
+ import { useVitestAdapter } from './chunk-6JLBZHQ3.js';
2
+ import './chunk-JR55747M.js';
3
3
  import './chunk-YHDBRBGU.js';
4
- import './chunk-LWSUV6IX.js';
5
- import './chunk-EDEGKIIR.js';
4
+ import './chunk-2QEM4WP7.js';
5
+ import './chunk-CLQUJX6E.js';
6
6
  import './chunk-PC3FAZT3.js';
7
- import { createFunctionSpy } from './chunk-K3EUF6RK.js';
8
- import './chunk-D2R6EQJJ.js';
7
+ import { createFunctionSpy } from './chunk-72H6HNDI.js';
8
+ import './chunk-XNXIHKVM.js';
9
9
  import './chunk-M3NTXLZG.js';
10
- import './chunk-3Q76UTT6.js';
10
+ import './chunk-JOPCMFYN.js';
11
11
  import './chunk-ENCEEH23.js';
12
12
  import { getMockAdapter } from './shared-state.js';
13
13
 
@@ -181,6 +181,9 @@ function enclosingFunction(node) {
181
181
 
182
182
  // src/lib/eslint/bindings.ts
183
183
  var PACKAGE = "vitest-auto-spy";
184
+ var CORE_ENTRIES = new Set(
185
+ ["", "/bun", "/bun-angular", "/node", "/rstest", "/react", "/vue", "/svelte"].map((entry) => `${PACKAGE}${entry}`)
186
+ );
184
187
  var IMPORT_DEFINITION = "ImportBinding";
185
188
  function findBinding(scope, name) {
186
189
  for (let current = scope; current; current = current.upper) {
@@ -225,12 +228,16 @@ function insertImport(fixer, node, module, clause) {
225
228
  return fixer.insertTextBeforeRange([at, at], `import ${clause} from '${module}';
226
229
  `);
227
230
  }
231
+ function coreEntryOf(node) {
232
+ return importsOf(node).map((declaration) => String(declaration.source.value)).find((module) => CORE_ENTRIES.has(module)) ?? PACKAGE;
233
+ }
228
234
  function namedImportFrom(node, module) {
229
235
  const declarations = importsOf(node).filter((declaration) => declaration.source.value === module && declaration.importKind !== "type");
230
236
  const [only] = declarations;
231
237
  return declarations.length === 1 && only?.specifiers.every(isNamedImportSpecifier) === true ? only : void 0;
232
238
  }
233
- function importNamed(fixer, node, name, module) {
239
+ function importNamed(fixer, node, name, requested) {
240
+ const module = requested === PACKAGE ? coreEntryOf(node) : requested;
234
241
  const specifiers = namedImportFrom(node, module)?.specifiers.filter(isNamedImportSpecifier) ?? [];
235
242
  const entries2 = specifiers.map((specifier) => ({
236
243
  specifier,
@@ -1746,7 +1753,7 @@ function asSpyFixes(context, fixer, node, value, spy) {
1746
1753
  const call = `asSpy${typeArguments ? sourceCode.getText(typeArguments) : ""}(${sourceCode.getText(value)})`;
1747
1754
  const edits = [fixer.replaceText(node, call)];
1748
1755
  if (bindingState(sourceCode.getScope(node), "asSpy") === "free") {
1749
- edits.push(insertImport(fixer, node, PACKAGE, "{ asSpy }"));
1756
+ edits.push(importNamed(fixer, node, "asSpy", PACKAGE));
1750
1757
  }
1751
1758
  const orphaned = spy?.references.length === 1 ? dropNamedImport(sourceCode, fixer, spy) : void 0;
1752
1759
  if (orphaned) {
@@ -3506,7 +3513,6 @@ var noPrivateMemberAccess = defineRule({
3506
3513
  });
3507
3514
 
3508
3515
  // src/lib/eslint/prop-helpers.ts
3509
- var PACKAGE2 = "vitest-auto-spy";
3510
3516
  function helperFor(property) {
3511
3517
  const name = propertyName(property);
3512
3518
  if (name === "value") {
@@ -3542,7 +3548,7 @@ function propHelperSuggestion(context, node) {
3542
3548
  fix: (fixer) => {
3543
3549
  const edits = [fixer.replaceText(node, replacement)];
3544
3550
  if (state === "free") {
3545
- edits.push(insertImport(fixer, node, PACKAGE2, `{ ${rewrite2.helper} }`));
3551
+ edits.push(importNamed(fixer, node, rewrite2.helper, PACKAGE));
3546
3552
  }
3547
3553
  return edits;
3548
3554
  }
@@ -4551,9 +4557,6 @@ var noRedundantSmokeTest = defineRule({
4551
4557
  var FACTORY = "createSpyFromInstance";
4552
4558
  var OWN = "spyOnOwnMethod";
4553
4559
  var VOID = "spyOnVoidMethod";
4554
- var CORE_ENTRIES = new Set(
4555
- ["", "/bun", "/bun-angular", "/node", "/rstest", "/react", "/vue", "/svelte"].map((entry) => `${PACKAGE}${entry}`)
4556
- );
4557
4560
  var METHOD_NAME = /^[$A-Z_a-z][\w$]*$/;
4558
4561
  var EVENT_CONSTRUCTOR = /^[A-Za-z]*Event$/;
4559
4562
  var DOM_GLOBALS = /* @__PURE__ */ new Set(["document", "window"]);
@@ -1,3 +1,3 @@
1
- export { enableJasmineCompat } from './chunk-E46PPK33.js';
2
- import './chunk-3Q76UTT6.js';
1
+ export { enableJasmineCompat } from './chunk-LAPHUX5G.js';
2
+ import './chunk-JOPCMFYN.js';
3
3
  import './chunk-ENCEEH23.js';
package/dist/jasmine.js CHANGED
@@ -1,16 +1,16 @@
1
- import { enableJasmineCompat } from './chunk-E46PPK33.js';
2
- export { enableJasmineCompat } from './chunk-E46PPK33.js';
3
- import { createSpyFromClass } from './chunk-25OHJOAA.js';
4
- import { useVitestAdapter } from './chunk-ANQVIGAG.js';
5
- import './chunk-TH64BXPP.js';
1
+ import { enableJasmineCompat } from './chunk-LAPHUX5G.js';
2
+ export { enableJasmineCompat } from './chunk-LAPHUX5G.js';
3
+ import { createSpyFromClass } from './chunk-YDPOBKST.js';
4
+ import { useVitestAdapter } from './chunk-6JLBZHQ3.js';
5
+ import './chunk-JR55747M.js';
6
6
  import './chunk-YHDBRBGU.js';
7
- import './chunk-LWSUV6IX.js';
8
- import './chunk-EDEGKIIR.js';
7
+ import './chunk-2QEM4WP7.js';
8
+ import './chunk-CLQUJX6E.js';
9
9
  import './chunk-PC3FAZT3.js';
10
- import { createFunctionSpy } from './chunk-K3EUF6RK.js';
11
- import { reportMisconfiguration, misconfigurationThrows } from './chunk-D2R6EQJJ.js';
10
+ import { createFunctionSpy } from './chunk-72H6HNDI.js';
11
+ import { reportMisconfiguration, misconfigurationThrows } from './chunk-XNXIHKVM.js';
12
12
  import './chunk-M3NTXLZG.js';
13
- import { jasmineGlobals, jasmineClock, jasmineAutoSpies, jasmineTimeout } from './chunk-3Q76UTT6.js';
13
+ import { jasmineGlobals, jasmineClock, jasmineAutoSpies, jasmineTimeout } from './chunk-JOPCMFYN.js';
14
14
  import { withDocs } from './chunk-ENCEEH23.js';
15
15
  import { expect, vi } from 'vitest';
16
16
  import { getMockAdapter } from './shared-state.js';
package/dist/nestjs.js CHANGED
@@ -1,16 +1,16 @@
1
- import { createSpyForToken } from './chunk-4IRFL76M.js';
2
- export { trackInjections } from './chunk-4IRFL76M.js';
3
- import { createSpyFromClass } from './chunk-25OHJOAA.js';
4
- import { useVitestAdapter } from './chunk-ANQVIGAG.js';
5
- import './chunk-TH64BXPP.js';
1
+ import { createSpyForToken } from './chunk-7WM3A4IB.js';
2
+ export { trackInjections } from './chunk-7WM3A4IB.js';
3
+ import { createSpyFromClass } from './chunk-YDPOBKST.js';
4
+ import { useVitestAdapter } from './chunk-6JLBZHQ3.js';
5
+ import './chunk-JR55747M.js';
6
6
  import './chunk-YHDBRBGU.js';
7
- import './chunk-LWSUV6IX.js';
8
- import './chunk-EDEGKIIR.js';
7
+ import './chunk-2QEM4WP7.js';
8
+ import './chunk-CLQUJX6E.js';
9
9
  import './chunk-PC3FAZT3.js';
10
- import './chunk-K3EUF6RK.js';
11
- import './chunk-D2R6EQJJ.js';
10
+ import './chunk-72H6HNDI.js';
11
+ import './chunk-XNXIHKVM.js';
12
12
  import './chunk-M3NTXLZG.js';
13
- import { nestUnitRefusals } from './chunk-3Q76UTT6.js';
13
+ import { nestUnitRefusals } from './chunk-JOPCMFYN.js';
14
14
  import { withDocs } from './chunk-ENCEEH23.js';
15
15
 
16
16
  // src/lib/nestjs.ts
package/dist/rstest.js CHANGED
@@ -1,15 +1,15 @@
1
- export { adoptMock, asInstance, asInstances, asSpy, assertMocked, captureArg, createFixture, createFixtureFactory, createLog, createMock, createSpyClass, createSpyFromInstance, describeDuplicateCopies, expectAllEmissions, expectCompletion, expectEmission, expectEmissions, expectError, expectNoEmission, flushEventLoop, flushEventLoopUntil, getPackageCopies, mockConstructor, mockDeep, moduleNamespace, narrow, outOfType, restoreSpiedInstance, setEmissionTimeout, settleDynamicImport, spyOnOwnMethod, spyOnVoidMethod, stubConstructor, withOverrides } from './chunk-NTCEH2FY.js';
2
- export { countMockedProps, mockAccessorsProp, mockReadonlyProp, mockReadonlyPropGetter, mockValueProp, reportPropsOutsideHooks, restoreMockedProps } from './chunk-KCMPDMLY.js';
3
- export { autoMocked, clearAutoSpy, clearAutoSpyDefaults, createAutoMock, createSpyFromClass, registerAutoSpyDefaults, resetAutoSpy } from './chunk-25OHJOAA.js';
1
+ export { adoptMock, asInstance, asInstances, asSpy, assertMocked, captureArg, createFixture, createFixtureFactory, createLog, createMock, createSpyClass, createSpyFromInstance, describeDuplicateCopies, expectAllEmissions, expectCompletion, expectEmission, expectEmissions, expectError, expectNoEmission, flushEventLoop, flushEventLoopUntil, getPackageCopies, mockConstructor, mockDeep, moduleNamespace, narrow, outOfType, restoreSpiedInstance, setEmissionTimeout, settleDynamicImport, spyOnOwnMethod, spyOnVoidMethod, stubConstructor, withOverrides } from './chunk-TMFV4DXT.js';
2
+ export { countMockedProps, mockAccessorsProp, mockReadonlyProp, mockReadonlyPropGetter, mockValueProp, reportPropsOutsideHooks, restoreMockedProps } from './chunk-6JQ7AFWM.js';
3
+ export { autoMocked, clearAutoSpy, clearAutoSpyDefaults, createAutoMock, createSpyFromClass, registerAutoSpyDefaults, resetAutoSpy } from './chunk-YDPOBKST.js';
4
4
  import './chunk-W5EXSI22.js';
5
- import { clearAllFastSpies, resetAllFastSpies, getSpyEngine, createFastSpy } from './chunk-TH64BXPP.js';
6
- import { guardAccessorSpies, spyOnAccessorByRedefine } from './chunk-LWSUV6IX.js';
7
- import './chunk-EDEGKIIR.js';
5
+ import { clearAllFastSpies, resetAllFastSpies, getSpyEngine, createFastSpy } from './chunk-JR55747M.js';
6
+ import { guardAccessorSpies, spyOnAccessorByRedefine } from './chunk-2QEM4WP7.js';
7
+ import './chunk-CLQUJX6E.js';
8
8
  import './chunk-PC3FAZT3.js';
9
- export { createFunctionSpy, errorHandler } from './chunk-K3EUF6RK.js';
10
- import './chunk-D2R6EQJJ.js';
9
+ export { createFunctionSpy, errorHandler } from './chunk-72H6HNDI.js';
10
+ import './chunk-XNXIHKVM.js';
11
11
  import './chunk-M3NTXLZG.js';
12
- import './chunk-3Q76UTT6.js';
12
+ import './chunk-JOPCMFYN.js';
13
13
  import './chunk-ENCEEH23.js';
14
14
  import { rstest } from '@rstest/core';
15
15
  import { registerMockAdapter } from './shared-state.js';
package/dist/rxjs.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { REPLAY_BUFFER_SIZE } from './chunk-YHDBRBGU.js';
2
- import { decorate, attachHelpers, misconfigurationThrows, reportMisconfiguration, hooksOf, detachedHelperError } from './chunk-D2R6EQJJ.js';
3
- import { nextWithValuesLate } from './chunk-3Q76UTT6.js';
2
+ import { decorate, attachHelpers, misconfigurationThrows, reportMisconfiguration, hooksOf, detachedHelperError } from './chunk-XNXIHKVM.js';
3
+ import { nextWithValuesLate } from './chunk-JOPCMFYN.js';
4
4
  import { withDocs } from './chunk-ENCEEH23.js';
5
5
  import { defer, ReplaySubject, from, concatMap, of, delay, takeWhile, timer, switchMap, throwError, EMPTY, merge, takeUntil, take } from 'rxjs';
6
6
  import { registerObservableSupport } from './shared-state.js';
@@ -1,4 +1,4 @@
1
- import { signalFormsErrors, signalFormsCreate } from './chunk-3Q76UTT6.js';
1
+ import { signalFormsErrors, signalFormsCreate } from './chunk-JOPCMFYN.js';
2
2
  import { withDocs } from './chunk-ENCEEH23.js';
3
3
  import { Injector, isSignal, signal, ɵSIGNAL as _SIGNAL } from '@angular/core';
4
4
  import { TestBed } from '@angular/core/testing';
@@ -201,19 +201,6 @@ interface AutoSpiedInstance<T> {
201
201
  */
202
202
  declare function createWithAutoSpies<T>(target: Type<T>, options?: CreateWithAutoSpiesOptions): AutoSpiedInstance<T>;
203
203
 
204
- /**
205
- * `hostElement` / `queryElement` — a typed element out of a fixture, without a cast.
206
- *
207
- * Angular types `ComponentFixture.nativeElement` and `DebugElement.nativeElement` as `any`. Under
208
- * `@typescript-eslint/strict-type-checked` every read of it is a `no-unsafe-*` report, and the one
209
- * way to type it — `fixture.nativeElement as HTMLElement` — is exactly what
210
- * `consistent-type-assertions: 'never'` forbids. A suite that turns both on has no clean route to
211
- * its own DOM.
212
- *
213
- * These two check the element at run time with `instanceof` and return it typed, so the narrowing
214
- * is a fact rather than a claim: a selector that matches nothing, or matches an element of another
215
- * kind, fails at the call that asked, with the selector and what it found in the message.
216
- */
217
204
  /** A `ComponentFixture` or a `DebugElement` — the only member read is `nativeElement`. */
218
205
  interface NativeElementHolder {
219
206
  readonly nativeElement: unknown;
@@ -230,7 +217,7 @@ type ElementConstructor<E extends Element> = abstract new (...args: never[]) =>
230
217
  *
231
218
  * @param source A `ComponentFixture` or a `DebugElement`.
232
219
  * @param type The element type to check against and return; `HTMLElement` when omitted.
233
- * @throws TypeError when `nativeElement` is not an element, or not an instance of `type`.
220
+ * @throws TypeError when `source` is null, `nativeElement` is not an element, or it is not an instance of `type`.
234
221
  */
235
222
  declare function hostElement(source: NativeElementHolder): HTMLElement;
236
223
  declare function hostElement<E extends Element>(source: NativeElementHolder, type: ElementConstructor<E>): E;
package/dist/zone.js CHANGED
@@ -1,4 +1,4 @@
1
- import { zoneRequirements } from './chunk-3Q76UTT6.js';
1
+ import { zoneRequirements } from './chunk-JOPCMFYN.js';
2
2
  import { withDocs } from './chunk-ENCEEH23.js';
3
3
 
4
4
  // src/lib/proxy-zone.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vitest-auto-spy",
3
- "version": "5.32.0",
3
+ "version": "5.32.1",
4
4
  "description": "Auto-generate fully-typed test spies from a class — across Vitest, Bun, node:test and Rstest, with Angular/NestJS/React/Vue/Svelte recipes. Drop-in replacement for jest-auto-spies and jasmine-auto-spies.",
5
5
  "keywords": [
6
6
  "auto-mock",
@@ -146,6 +146,9 @@ would have broken is reported as `codemod-broke-syntax` and left byte for byte a
146
146
  specs are visited too. An unknown flag for a known command, and a path matching no file, are errors
147
147
  with **exit 2** and nothing runs — `init --dryrun` used to write the files.
148
148
 
149
+ `init` lists a hand-made copy of this skill in `.claude/skills/vitest-auto-spy/` as `stale` and
150
+ `init --check` exits 1 on it: delete the copy and re-run `init`, which writes the managed pointer.
151
+
149
152
  ## Skeleton — anything else
150
153
 
151
154
  ```ts
@@ -280,6 +283,8 @@ it('loads', async () => {
280
283
  | "did the migration lose a test?" with matching counters | `compareTestRuns(before, after)` — `counts` reports `name (×2 → ×1)` |
281
284
  | an input that has to change after the first render | `await setInputs(fixture, { … })` — aliases and `hostDirectives` inputs resolve, unknown names refused |
282
285
  | `fixture.nativeElement as HTMLElement`, or `no-unsafe-*` on `nativeElement` under a strict lint | `hostElement(fixture)` / `queryElement(fixture, '.close', HTMLButtonElement)` — typed and `instanceof`-checked; a miss throws naming the selector |
286
+ | `host.querySelector('.title')?.textContent.trim()` after `hostElement` | `queryElement(fixture, '.title').textContent.trim()` — a miss throws instead of passing as `undefined`; for absence keep `expect(host.querySelector('.x')).toBeNull()` |
287
+ | `Cannot read properties of null (reading 'nativeElement')` on a `debugElement.query(…)` | the query matched nothing — `hostElement` / `queryElement` now throw saying so; fix the predicate |
283
288
  | `CalledExactlyOnceWith()` failing `[] vs [undefined]` on an `output<void>()` listener | the listener gets `undefined` — `await expect(expectEmission(cmp.closed)).resolves.toBeUndefined()`, or `subscribeSpyTo(subject$)` |
284
289
  | `replaced the dispatch … after calledWith()` right after `mockReset()` | `mockReset()` keeps the chain — `resetAutoSpy(spy.method)`, then `mockReturnValue(…)` |
285
290
  | `injectMatDialogRef(MatDialogRef<C, R>)` comes back `any` (`no-unsafe-assignment`) | `injectMatDialogRef<MatDialogRef<C, R>>(MatDialogRef)` — the instantiation expression is read off Material's `any` prototype |