@analogjs/vitest-angular 2.4.0-beta.9 → 2.4.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.
package/README.md CHANGED
@@ -101,6 +101,7 @@ Use the following setup:
101
101
  ```ts
102
102
  import '@angular/compiler';
103
103
  import '@analogjs/vitest-angular/setup-snapshots';
104
+ import '@analogjs/vitest-angular/setup-serializers';
104
105
  import { setupTestBed } from '@analogjs/vitest-angular/setup-testbed';
105
106
 
106
107
  setupTestBed();
@@ -126,7 +127,7 @@ The `setupTestBed()` function accepts an optional configuration object with the
126
127
 
127
128
  - `zoneless` (boolean): Whether to use zoneless change detection (default: `true`)
128
129
  - `providers` (`Type<any>[]`): Additional providers to include in the test environment (default: `[]`)
129
- - `browserMode` (boolean): Enables visual test preview in Vitest browser mode by keeping the component rendered, allowing you to inspect its final state (default: `false`)
130
+ - `teardown.destroyAfterEach` (boolean): Whether to destroy the test environment after each test. Set to `false` to keep the component rendered, allowing you to inspect its final state. (default: `true`)
130
131
 
131
132
  **Example with options:**
132
133
 
@@ -134,7 +135,7 @@ The `setupTestBed()` function accepts an optional configuration object with the
134
135
  setupTestBed({
135
136
  zoneless: true,
136
137
  providers: [],
137
- browserMode: false,
138
+ teardown: { destroyAfterEach: false },
138
139
  });
139
140
  ```
140
141
 
@@ -194,6 +195,12 @@ pnpm test
194
195
  ## Snapshot Testing
195
196
 
196
197
  For snapshot testing you can use `toMatchSnapshot` from `expect` API.
198
+ The provided snapshot setup also removes Angular-specific `_ng*` attributes and `<!--container-->` comments from DOM snapshots, which keeps diffs focused on the actual template output.
199
+
200
+ The import of `setup-snapshots` and `setup-serializers` are complementary:
201
+
202
+ - Use `setup-snapshots` to serialize Angular fixtures and component refs so Vitest snapshots print component markup instead of Angular testing internals.
203
+ - Use `setup-serializers` to clean DOM snapshots by removing Angular runtime noise such as `_ngcontent-*`, `_nghost-*`, `ng-reflect-*`, generated ids and classes, and removes comments from DOM snapshots (e.g. `<!--container-->`).
197
204
 
198
205
  Below is a small example of how to write a snapshot test:
199
206
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@analogjs/vitest-angular",
3
- "version": "2.4.0-beta.9",
3
+ "version": "2.4.1",
4
4
  "description": "Vitest Builder for Angular",
5
5
  "type": "module",
6
6
  "author": "Brandon Roberts <robertsbt@gmail.com>",
@@ -9,6 +9,8 @@
9
9
  "./package.json": "./package.json",
10
10
  "./setup-zone": "./setup-zone.js",
11
11
  "./setup-snapshots": "./setup-snapshots.js",
12
+ "./setup-serializers": "./setup-serializers.js",
13
+ "./snapshot-serializers": "./snapshot-serializers.js",
12
14
  "./setup-testbed": "./setup-testbed.js"
13
15
  },
14
16
  "keywords": [
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { createHtmlCommentSnapshotSerializer, createNoNgAttributesSnapshotSerializer, } from './snapshot-serializers.js';
2
+ const env = globalThis;
3
+ ['expect'].forEach((methodName) => {
4
+ const originalVitestFn = env[methodName];
5
+ if (!originalVitestFn) {
6
+ return;
7
+ }
8
+ originalVitestFn.addSnapshotSerializer(createHtmlCommentSnapshotSerializer());
9
+ originalVitestFn.addSnapshotSerializer(createNoNgAttributesSnapshotSerializer());
10
+ });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtc2VyaWFsaXplcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy92aXRlc3QtYW5ndWxhci9zZXR1cC1zZXJpYWxpemVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsbUNBQW1DLEVBQ25DLHNDQUFzQyxHQUN2QyxNQUFNLDJCQUEyQixDQUFDO0FBRW5DLE1BQU0sR0FBRyxHQUFHLFVBQWlCLENBQUM7QUFFOUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtJQUNoQyxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QixPQUFPO0lBQ1QsQ0FBQztJQUNELGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLG1DQUFtQyxFQUFFLENBQUMsQ0FBQztJQUM5RSxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FDcEMsc0NBQXNDLEVBQUUsQ0FDekMsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY3JlYXRlSHRtbENvbW1lbnRTbmFwc2hvdFNlcmlhbGl6ZXIsXG4gIGNyZWF0ZU5vTmdBdHRyaWJ1dGVzU25hcHNob3RTZXJpYWxpemVyLFxufSBmcm9tICcuL3NuYXBzaG90LXNlcmlhbGl6ZXJzLmpzJztcblxuY29uc3QgZW52ID0gZ2xvYmFsVGhpcyBhcyBhbnk7XG5cblsnZXhwZWN0J10uZm9yRWFjaCgobWV0aG9kTmFtZSkgPT4ge1xuICBjb25zdCBvcmlnaW5hbFZpdGVzdEZuID0gZW52W21ldGhvZE5hbWVdO1xuICBpZiAoIW9yaWdpbmFsVml0ZXN0Rm4pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgb3JpZ2luYWxWaXRlc3RGbi5hZGRTbmFwc2hvdFNlcmlhbGl6ZXIoY3JlYXRlSHRtbENvbW1lbnRTbmFwc2hvdFNlcmlhbGl6ZXIoKSk7XG4gIG9yaWdpbmFsVml0ZXN0Rm4uYWRkU25hcHNob3RTZXJpYWxpemVyKFxuICAgIGNyZWF0ZU5vTmdBdHRyaWJ1dGVzU25hcHNob3RTZXJpYWxpemVyKCksXG4gICk7XG59KTtcbiJdfQ==
@@ -1,26 +1 @@
1
- declare const env: any;
2
- /**
3
- * Allows Vitest to handle Angular test fixtures
4
- *
5
- * Vitest Snapshot guide ==> https://vitest.dev/guide/snapshot.html
6
- *
7
- * @returns customSnapshotSerializer for Angular Fixture Component
8
- */
9
- declare const customSnapshotSerializer: () => {
10
- serialize: (val: any, config: any, indentation: any, depth: any, refs: any, printer: any) => string;
11
- test: (val: any) => boolean;
12
- };
13
- /**
14
- * Check if is an Angular fixture
15
- *
16
- * @param val Angular fixture
17
- * @returns boolean who check if is an angular fixture
18
- */
19
- declare function isAngularFixture(val: any): boolean;
20
- /**
21
- * Serialize Angular fixture for Vitest
22
- *
23
- * @param fixture Angular Fixture Component
24
- * @returns HTML Child Node
25
- */
26
- declare function fixtureVitestSerializer(fixture: any): ChildNode;
1
+ export {};
@@ -1,104 +1,10 @@
1
- "use strict";
1
+ import { createAngularFixtureSnapshotSerializer } from './snapshot-serializers.js';
2
2
  const env = globalThis;
3
- /**
4
- * Allows Vitest to handle Angular test fixtures
5
- *
6
- * Vitest Snapshot guide ==> https://vitest.dev/guide/snapshot.html
7
- *
8
- * @returns customSnapshotSerializer for Angular Fixture Component
9
- */
10
- const customSnapshotSerializer = () => {
11
- function serialize(val, config, indentation, depth, refs, printer) {
12
- // `printer` is a function that serializes a value using existing plugins.
13
- return `${printer(fixtureVitestSerializer(val), config, indentation, depth, refs)}`;
14
- }
15
- function test(val) {
16
- // * If it's a ComponentFixture we apply the transformation rules
17
- return val && isAngularFixture(val);
18
- }
19
- return {
20
- serialize,
21
- test,
22
- };
23
- };
24
- /**
25
- * Check if is an Angular fixture
26
- *
27
- * @param val Angular fixture
28
- * @returns boolean who check if is an angular fixture
29
- */
30
- function isAngularFixture(val) {
31
- if (typeof val !== 'object') {
32
- return false;
33
- }
34
- if (val['componentRef'] || val['componentInstance']) {
35
- return true;
36
- }
37
- if (val['componentType']) {
38
- return true;
39
- }
40
- // * Angular fixture keys in Fixture component Object
41
- const fixtureKeys = [
42
- 'componentRef',
43
- 'ngZone',
44
- 'effectRunner',
45
- '_autoDetect',
46
- '_isStable',
47
- '_isDestroyed',
48
- '_resolve',
49
- '_promise',
50
- '_onUnstableSubscription',
51
- '_onStableSubscription',
52
- '_onMicrotaskEmptySubscription',
53
- '_onErrorSubscription',
54
- 'changeDetectorRef',
55
- 'elementRef',
56
- 'debugElement',
57
- 'componentInstance',
58
- 'nativeElement',
59
- ];
60
- // * Angular fixture keys in Fixture componentRef Object
61
- const fixtureComponentRefKeys = [
62
- 'location',
63
- '_rootLView',
64
- '_tNode',
65
- 'previousInputValues',
66
- 'instance',
67
- 'changeDetectorRef',
68
- 'hostView',
69
- 'componentType',
70
- ];
71
- return (JSON.stringify(Object.keys(val)) === JSON.stringify(fixtureKeys) ||
72
- JSON.stringify(Object.keys(val)) === JSON.stringify(fixtureComponentRefKeys));
73
- }
74
- /**
75
- * Serialize Angular fixture for Vitest
76
- *
77
- * @param fixture Angular Fixture Component
78
- * @returns HTML Child Node
79
- */
80
- function fixtureVitestSerializer(fixture) {
81
- // * Get Component meta data
82
- const componentType = (fixture && fixture.componentType
83
- ? fixture.componentType
84
- : fixture.componentRef.componentType);
85
- let inputsData = '';
86
- const selector = Reflect.getOwnPropertyDescriptor(componentType, '__annotations__')?.value[0].selector;
87
- if (componentType && componentType.propDecorators) {
88
- inputsData = Object.entries(componentType.propDecorators)
89
- .map(([key, value]) => `${key}="${value}"`)
90
- .join('');
91
- }
92
- // * Get DOM Elements
93
- const divElement = fixture && fixture.nativeElement
94
- ? fixture.nativeElement
95
- : fixture.location.nativeElement;
96
- // * Convert string data to HTML data
97
- const doc = new DOMParser().parseFromString(`<${selector} ${inputsData}>${divElement.innerHTML}</${selector}>`, 'text/html');
98
- return doc.body.childNodes[0];
99
- }
100
3
  ['expect'].forEach((methodName) => {
101
- const originalvitestFn = env[methodName];
102
- return originalvitestFn.addSnapshotSerializer(customSnapshotSerializer());
4
+ const originalVitestFn = env[methodName];
5
+ if (!originalVitestFn) {
6
+ return;
7
+ }
8
+ originalVitestFn.addSnapshotSerializer(createAngularFixtureSnapshotSerializer());
103
9
  });
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtc25hcHNob3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvdml0ZXN0LWFuZ3VsYXIvc2V0dXAtc25hcHNob3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxNQUFNLEdBQUcsR0FBRyxVQUFpQixDQUFDO0FBRTlCOzs7Ozs7R0FNRztBQUNILE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxFQUFFO0lBQ3BDLFNBQVMsU0FBUyxDQUNoQixHQUFRLEVBQ1IsTUFBVyxFQUNYLFdBQWdCLEVBQ2hCLEtBQVUsRUFDVixJQUFTLEVBQ1QsT0FBWTtRQUVaLDBFQUEwRTtRQUMxRSxPQUFPLEdBQUcsT0FBTyxDQUNmLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxFQUM1QixNQUFNLEVBQ04sV0FBVyxFQUNYLEtBQUssRUFDTCxJQUFJLENBQ0wsRUFBRSxDQUFDO0lBQ04sQ0FBQztJQUNELFNBQVMsSUFBSSxDQUFDLEdBQVE7UUFDcEIsaUVBQWlFO1FBQ2pFLE9BQU8sR0FBRyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxPQUFPO1FBQ0wsU0FBUztRQUNULElBQUk7S0FDTCxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEdBQVE7SUFDaEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQscURBQXFEO0lBQ3JELE1BQU0sV0FBVyxHQUFHO1FBQ2xCLGNBQWM7UUFDZCxRQUFRO1FBQ1IsY0FBYztRQUNkLGFBQWE7UUFDYixXQUFXO1FBQ1gsY0FBYztRQUNkLFVBQVU7UUFDVixVQUFVO1FBQ1YseUJBQXlCO1FBQ3pCLHVCQUF1QjtRQUN2QiwrQkFBK0I7UUFDL0Isc0JBQXNCO1FBQ3RCLG1CQUFtQjtRQUNuQixZQUFZO1FBQ1osY0FBYztRQUNkLG1CQUFtQjtRQUNuQixlQUFlO0tBQ2hCLENBQUM7SUFFRix3REFBd0Q7SUFDeEQsTUFBTSx1QkFBdUIsR0FBRztRQUM5QixVQUFVO1FBQ1YsWUFBWTtRQUNaLFFBQVE7UUFDUixxQkFBcUI7UUFDckIsVUFBVTtRQUNWLG1CQUFtQjtRQUNuQixVQUFVO1FBQ1YsZUFBZTtLQUNoQixDQUFDO0lBRUYsT0FBTyxDQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FDN0UsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsdUJBQXVCLENBQUMsT0FBWTtJQUMzQyw0QkFBNEI7SUFDNUIsTUFBTSxhQUFhLEdBQUcsQ0FDcEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxhQUFhO1FBQzlCLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYTtRQUN2QixDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQ2hDLENBQUM7SUFFVCxJQUFJLFVBQVUsR0FBVyxFQUFFLENBQUM7SUFFNUIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUMvQyxhQUFhLEVBQ2IsaUJBQWlCLENBQ2xCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUVyQixJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEQsVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQzthQUN0RCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssS0FBSyxHQUFHLENBQUM7YUFDMUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixNQUFNLFVBQVUsR0FDZCxPQUFPLElBQUksT0FBTyxDQUFDLGFBQWE7UUFDOUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhO1FBQ3ZCLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztJQUVyQyxxQ0FBcUM7SUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQ3pDLElBQUksUUFBUSxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsU0FBUyxLQUFLLFFBQVEsR0FBRyxFQUNsRSxXQUFXLENBQ1osQ0FBQztJQUVGLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7SUFDaEMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekMsT0FBTyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7QUFDNUUsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBlbnYgPSBnbG9iYWxUaGlzIGFzIGFueTtcblxuLyoqXG4gKiBBbGxvd3MgVml0ZXN0IHRvIGhhbmRsZSBBbmd1bGFyIHRlc3QgZml4dHVyZXNcbiAqXG4gKiBWaXRlc3QgU25hcHNob3QgZ3VpZGUgPT0+IGh0dHBzOi8vdml0ZXN0LmRldi9ndWlkZS9zbmFwc2hvdC5odG1sXG4gKlxuICogQHJldHVybnMgY3VzdG9tU25hcHNob3RTZXJpYWxpemVyIGZvciBBbmd1bGFyIEZpeHR1cmUgQ29tcG9uZW50XG4gKi9cbmNvbnN0IGN1c3RvbVNuYXBzaG90U2VyaWFsaXplciA9ICgpID0+IHtcbiAgZnVuY3Rpb24gc2VyaWFsaXplKFxuICAgIHZhbDogYW55LFxuICAgIGNvbmZpZzogYW55LFxuICAgIGluZGVudGF0aW9uOiBhbnksXG4gICAgZGVwdGg6IGFueSxcbiAgICByZWZzOiBhbnksXG4gICAgcHJpbnRlcjogYW55LFxuICApOiBzdHJpbmcge1xuICAgIC8vIGBwcmludGVyYCBpcyBhIGZ1bmN0aW9uIHRoYXQgc2VyaWFsaXplcyBhIHZhbHVlIHVzaW5nIGV4aXN0aW5nIHBsdWdpbnMuXG4gICAgcmV0dXJuIGAke3ByaW50ZXIoXG4gICAgICBmaXh0dXJlVml0ZXN0U2VyaWFsaXplcih2YWwpLFxuICAgICAgY29uZmlnLFxuICAgICAgaW5kZW50YXRpb24sXG4gICAgICBkZXB0aCxcbiAgICAgIHJlZnMsXG4gICAgKX1gO1xuICB9XG4gIGZ1bmN0aW9uIHRlc3QodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyAqIElmIGl0J3MgYSBDb21wb25lbnRGaXh0dXJlIHdlIGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbiBydWxlc1xuICAgIHJldHVybiB2YWwgJiYgaXNBbmd1bGFyRml4dHVyZSh2YWwpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc2VyaWFsaXplLFxuICAgIHRlc3QsXG4gIH07XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGlzIGFuIEFuZ3VsYXIgZml4dHVyZVxuICpcbiAqIEBwYXJhbSB2YWwgQW5ndWxhciBmaXh0dXJlXG4gKiBAcmV0dXJucyBib29sZWFuIHdobyBjaGVjayBpZiBpcyBhbiBhbmd1bGFyIGZpeHR1cmVcbiAqL1xuZnVuY3Rpb24gaXNBbmd1bGFyRml4dHVyZSh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodmFsWydjb21wb25lbnRSZWYnXSB8fCB2YWxbJ2NvbXBvbmVudEluc3RhbmNlJ10pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh2YWxbJ2NvbXBvbmVudFR5cGUnXSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gKiBBbmd1bGFyIGZpeHR1cmUga2V5cyBpbiBGaXh0dXJlIGNvbXBvbmVudCBPYmplY3RcbiAgY29uc3QgZml4dHVyZUtleXMgPSBbXG4gICAgJ2NvbXBvbmVudFJlZicsXG4gICAgJ25nWm9uZScsXG4gICAgJ2VmZmVjdFJ1bm5lcicsXG4gICAgJ19hdXRvRGV0ZWN0JyxcbiAgICAnX2lzU3RhYmxlJyxcbiAgICAnX2lzRGVzdHJveWVkJyxcbiAgICAnX3Jlc29sdmUnLFxuICAgICdfcHJvbWlzZScsXG4gICAgJ19vblVuc3RhYmxlU3Vic2NyaXB0aW9uJyxcbiAgICAnX29uU3RhYmxlU3Vic2NyaXB0aW9uJyxcbiAgICAnX29uTWljcm90YXNrRW1wdHlTdWJzY3JpcHRpb24nLFxuICAgICdfb25FcnJvclN1YnNjcmlwdGlvbicsXG4gICAgJ2NoYW5nZURldGVjdG9yUmVmJyxcbiAgICAnZWxlbWVudFJlZicsXG4gICAgJ2RlYnVnRWxlbWVudCcsXG4gICAgJ2NvbXBvbmVudEluc3RhbmNlJyxcbiAgICAnbmF0aXZlRWxlbWVudCcsXG4gIF07XG5cbiAgLy8gKiBBbmd1bGFyIGZpeHR1cmUga2V5cyBpbiBGaXh0dXJlIGNvbXBvbmVudFJlZiBPYmplY3RcbiAgY29uc3QgZml4dHVyZUNvbXBvbmVudFJlZktleXMgPSBbXG4gICAgJ2xvY2F0aW9uJyxcbiAgICAnX3Jvb3RMVmlldycsXG4gICAgJ190Tm9kZScsXG4gICAgJ3ByZXZpb3VzSW5wdXRWYWx1ZXMnLFxuICAgICdpbnN0YW5jZScsXG4gICAgJ2NoYW5nZURldGVjdG9yUmVmJyxcbiAgICAnaG9zdFZpZXcnLFxuICAgICdjb21wb25lbnRUeXBlJyxcbiAgXTtcblxuICByZXR1cm4gKFxuICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHZhbCkpID09PSBKU09OLnN0cmluZ2lmeShmaXh0dXJlS2V5cykgfHxcbiAgICBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyh2YWwpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZml4dHVyZUNvbXBvbmVudFJlZktleXMpXG4gICk7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIEFuZ3VsYXIgZml4dHVyZSBmb3IgVml0ZXN0XG4gKlxuICogQHBhcmFtIGZpeHR1cmUgQW5ndWxhciBGaXh0dXJlIENvbXBvbmVudFxuICogQHJldHVybnMgSFRNTCBDaGlsZCBOb2RlXG4gKi9cbmZ1bmN0aW9uIGZpeHR1cmVWaXRlc3RTZXJpYWxpemVyKGZpeHR1cmU6IGFueSkge1xuICAvLyAqIEdldCBDb21wb25lbnQgbWV0YSBkYXRhXG4gIGNvbnN0IGNvbXBvbmVudFR5cGUgPSAoXG4gICAgZml4dHVyZSAmJiBmaXh0dXJlLmNvbXBvbmVudFR5cGVcbiAgICAgID8gZml4dHVyZS5jb21wb25lbnRUeXBlXG4gICAgICA6IGZpeHR1cmUuY29tcG9uZW50UmVmLmNvbXBvbmVudFR5cGVcbiAgKSBhcyBhbnk7XG5cbiAgbGV0IGlucHV0c0RhdGE6IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0IHNlbGVjdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgY29tcG9uZW50VHlwZSxcbiAgICAnX19hbm5vdGF0aW9uc19fJyxcbiAgKT8udmFsdWVbMF0uc2VsZWN0b3I7XG5cbiAgaWYgKGNvbXBvbmVudFR5cGUgJiYgY29tcG9uZW50VHlwZS5wcm9wRGVjb3JhdG9ycykge1xuICAgIGlucHV0c0RhdGEgPSBPYmplY3QuZW50cmllcyhjb21wb25lbnRUeXBlLnByb3BEZWNvcmF0b3JzKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PVwiJHt2YWx1ZX1cImApXG4gICAgICAuam9pbignJyk7XG4gIH1cblxuICAvLyAqIEdldCBET00gRWxlbWVudHNcbiAgY29uc3QgZGl2RWxlbWVudCA9XG4gICAgZml4dHVyZSAmJiBmaXh0dXJlLm5hdGl2ZUVsZW1lbnRcbiAgICAgID8gZml4dHVyZS5uYXRpdmVFbGVtZW50XG4gICAgICA6IGZpeHR1cmUubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcblxuICAvLyAqIENvbnZlcnQgc3RyaW5nIGRhdGEgdG8gSFRNTCBkYXRhXG4gIGNvbnN0IGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoXG4gICAgYDwke3NlbGVjdG9yfSAke2lucHV0c0RhdGF9PiR7ZGl2RWxlbWVudC5pbm5lckhUTUx9PC8ke3NlbGVjdG9yfT5gLFxuICAgICd0ZXh0L2h0bWwnLFxuICApO1xuXG4gIHJldHVybiBkb2MuYm9keS5jaGlsZE5vZGVzWzBdO1xufVxuXG5bJ2V4cGVjdCddLmZvckVhY2goKG1ldGhvZE5hbWUpID0+IHtcbiAgY29uc3Qgb3JpZ2luYWx2aXRlc3RGbiA9IGVudlttZXRob2ROYW1lXTtcbiAgcmV0dXJuIG9yaWdpbmFsdml0ZXN0Rm4uYWRkU25hcHNob3RTZXJpYWxpemVyKGN1c3RvbVNuYXBzaG90U2VyaWFsaXplcigpKTtcbn0pO1xuIl19
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtc25hcHNob3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvdml0ZXN0LWFuZ3VsYXIvc2V0dXAtc25hcHNob3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRW5GLE1BQU0sR0FBRyxHQUFHLFVBQWlCLENBQUM7QUFFOUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtJQUNoQyxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QixPQUFPO0lBQ1QsQ0FBQztJQUNELGdCQUFnQixDQUFDLHFCQUFxQixDQUNwQyxzQ0FBc0MsRUFBRSxDQUN6QyxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVBbmd1bGFyRml4dHVyZVNuYXBzaG90U2VyaWFsaXplciB9IGZyb20gJy4vc25hcHNob3Qtc2VyaWFsaXplcnMuanMnO1xuXG5jb25zdCBlbnYgPSBnbG9iYWxUaGlzIGFzIGFueTtcblxuWydleHBlY3QnXS5mb3JFYWNoKChtZXRob2ROYW1lKSA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsVml0ZXN0Rm4gPSBlbnZbbWV0aG9kTmFtZV07XG4gIGlmICghb3JpZ2luYWxWaXRlc3RGbikge1xuICAgIHJldHVybjtcbiAgfVxuICBvcmlnaW5hbFZpdGVzdEZuLmFkZFNuYXBzaG90U2VyaWFsaXplcihcbiAgICBjcmVhdGVBbmd1bGFyRml4dHVyZVNuYXBzaG90U2VyaWFsaXplcigpLFxuICApO1xufSk7XG4iXX0=
@@ -1,8 +1,15 @@
1
- import { Provider } from '@angular/core';
1
+ import { EnvironmentProviders, Provider } from '@angular/core';
2
2
  type TestBedSetupOptions = {
3
3
  zoneless?: boolean;
4
- providers?: Provider[];
4
+ providers?: (Provider | EnvironmentProviders)[];
5
+ /**
6
+ * @deprecated Use `teardown.destroyAfterEach` instead.
7
+ * @sunset 3.0.0
8
+ */
5
9
  browserMode?: boolean;
10
+ teardown?: {
11
+ destroyAfterEach: boolean;
12
+ };
6
13
  };
7
- export declare function setupTestBed({ zoneless, providers, browserMode, }?: TestBedSetupOptions): void;
14
+ export declare function setupTestBed({ zoneless, providers, browserMode, teardown, }?: TestBedSetupOptions): void;
8
15
  export {};
package/setup-testbed.js CHANGED
@@ -4,7 +4,7 @@ import { ɵgetCleanupHook as getCleanupHook, getTestBed, } from '@angular/core/t
4
4
  import { BrowserTestingModule, platformBrowserTesting, } from '@angular/platform-browser/testing';
5
5
  import { afterEach, beforeEach } from 'vitest';
6
6
  const ANGULAR_TESTBED_SETUP = Symbol.for('testbed-setup');
7
- export function setupTestBed({ zoneless = true, providers = [], browserMode = false, } = {}) {
7
+ export function setupTestBed({ zoneless = true, providers = [], browserMode = false, teardown, } = {}) {
8
8
  beforeEach(getCleanupHook(false));
9
9
  afterEach(getCleanupHook(true));
10
10
  if (!globalThis[ANGULAR_TESTBED_SETUP]) {
@@ -15,11 +15,16 @@ export function setupTestBed({ zoneless = true, providers = [], browserMode = fa
15
15
  NgModule({
16
16
  providers: [
17
17
  ...(zoneless ? [provideZonelessChangeDetection()] : []),
18
- providers,
18
+ ...providers,
19
19
  ],
20
20
  })
21
21
  ], TestModule);
22
- getTestBed().initTestEnvironment([BrowserTestingModule, TestModule], platformBrowserTesting(), browserMode ? { teardown: { destroyAfterEach: false } } : undefined);
22
+ getTestBed().initTestEnvironment([BrowserTestingModule, TestModule], platformBrowserTesting(), {
23
+ teardown: {
24
+ ...{ destroyAfterEach: !browserMode },
25
+ ...teardown,
26
+ },
27
+ });
23
28
  }
24
29
  }
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtdGVzdGJlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3ZpdGVzdC1hbmd1bGFyL3NldHVwLXRlc3RiZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxRQUFRLEVBRVIsOEJBQThCLEdBQy9CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxlQUFlLElBQUksY0FBYyxFQUNqQyxVQUFVLEdBQ1gsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHNCQUFzQixHQUN2QixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRS9DLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQVExRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEVBQzNCLFFBQVEsR0FBRyxJQUFJLEVBQ2YsU0FBUyxHQUFHLEVBQUUsRUFDZCxXQUFXLEdBQUcsS0FBSyxNQUNJLEVBQUU7SUFDekIsVUFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUVoQyxJQUFJLENBQUUsVUFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7UUFDL0MsVUFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLElBQUksQ0FBQztRQVFsRCxJQUFNLFVBQVUsR0FBaEIsTUFBTSxVQUFVO1NBQUcsQ0FBQTtRQUFiLFVBQVU7WUFOZixRQUFRLENBQUM7Z0JBQ1IsU0FBUyxFQUFFO29CQUNULEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsOEJBQThCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3ZELFNBQVM7aUJBQ1Y7YUFDRixDQUFDO1dBQ0ksVUFBVSxDQUFHO1FBRW5CLFVBQVUsRUFBRSxDQUFDLG1CQUFtQixDQUM5QixDQUFDLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxFQUNsQyxzQkFBc0IsRUFBRSxFQUN4QixXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUNwRSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBOZ01vZHVsZSxcbiAgUHJvdmlkZXIsXG4gIHByb3ZpZGVab25lbGVzc0NoYW5nZURldGVjdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICDJtWdldENsZWFudXBIb29rIGFzIGdldENsZWFudXBIb29rLFxuICBnZXRUZXN0QmVkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlL3Rlc3RpbmcnO1xuaW1wb3J0IHtcbiAgQnJvd3NlclRlc3RpbmdNb2R1bGUsXG4gIHBsYXRmb3JtQnJvd3NlclRlc3RpbmcsXG59IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXIvdGVzdGluZyc7XG5pbXBvcnQgeyBhZnRlckVhY2gsIGJlZm9yZUVhY2ggfSBmcm9tICd2aXRlc3QnO1xuXG5jb25zdCBBTkdVTEFSX1RFU1RCRURfU0VUVVAgPSBTeW1ib2wuZm9yKCd0ZXN0YmVkLXNldHVwJyk7XG5cbnR5cGUgVGVzdEJlZFNldHVwT3B0aW9ucyA9IHtcbiAgem9uZWxlc3M/OiBib29sZWFuO1xuICBwcm92aWRlcnM/OiBQcm92aWRlcltdO1xuICBicm93c2VyTW9kZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBUZXN0QmVkKHtcbiAgem9uZWxlc3MgPSB0cnVlLFxuICBwcm92aWRlcnMgPSBbXSxcbiAgYnJvd3Nlck1vZGUgPSBmYWxzZSxcbn06IFRlc3RCZWRTZXR1cE9wdGlvbnMgPSB7fSkge1xuICBiZWZvcmVFYWNoKGdldENsZWFudXBIb29rKGZhbHNlKSk7XG4gIGFmdGVyRWFjaChnZXRDbGVhbnVwSG9vayh0cnVlKSk7XG5cbiAgaWYgKCEoZ2xvYmFsVGhpcyBhcyBhbnkpW0FOR1VMQVJfVEVTVEJFRF9TRVRVUF0pIHtcbiAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpW0FOR1VMQVJfVEVTVEJFRF9TRVRVUF0gPSB0cnVlO1xuXG4gICAgQE5nTW9kdWxlKHtcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAuLi4oem9uZWxlc3MgPyBbcHJvdmlkZVpvbmVsZXNzQ2hhbmdlRGV0ZWN0aW9uKCldIDogW10pLFxuICAgICAgICBwcm92aWRlcnMsXG4gICAgICBdLFxuICAgIH0pXG4gICAgY2xhc3MgVGVzdE1vZHVsZSB7fVxuXG4gICAgZ2V0VGVzdEJlZCgpLmluaXRUZXN0RW52aXJvbm1lbnQoXG4gICAgICBbQnJvd3NlclRlc3RpbmdNb2R1bGUsIFRlc3RNb2R1bGVdLFxuICAgICAgcGxhdGZvcm1Ccm93c2VyVGVzdGluZygpLFxuICAgICAgYnJvd3Nlck1vZGUgPyB7IHRlYXJkb3duOiB7IGRlc3Ryb3lBZnRlckVhY2g6IGZhbHNlIH0gfSA6IHVuZGVmaW5lZCxcbiAgICApO1xuICB9XG59XG4iXX0=
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtdGVzdGJlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3ZpdGVzdC1hbmd1bGFyL3NldHVwLXRlc3RiZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxRQUFRLEVBRVIsOEJBQThCLEdBQy9CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxlQUFlLElBQUksY0FBYyxFQUNqQyxVQUFVLEdBQ1gsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHNCQUFzQixHQUN2QixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRS9DLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQWUxRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEVBQzNCLFFBQVEsR0FBRyxJQUFJLEVBQ2YsU0FBUyxHQUFHLEVBQUUsRUFDZCxXQUFXLEdBQUcsS0FBSyxFQUNuQixRQUFRLE1BQ2UsRUFBRTtJQUN6QixVQUFVLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRWhDLElBQUksQ0FBRSxVQUFrQixDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztRQUMvQyxVQUFrQixDQUFDLHFCQUFxQixDQUFDLEdBQUcsSUFBSSxDQUFDO1FBUWxELElBQU0sVUFBVSxHQUFoQixNQUFNLFVBQVU7U0FBRyxDQUFBO1FBQWIsVUFBVTtZQU5mLFFBQVEsQ0FBQztnQkFDUixTQUFTLEVBQUU7b0JBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDdkQsR0FBRyxTQUFTO2lCQUNiO2FBQ0YsQ0FBQztXQUNJLFVBQVUsQ0FBRztRQUVuQixVQUFVLEVBQUUsQ0FBQyxtQkFBbUIsQ0FDOUIsQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsRUFDbEMsc0JBQXNCLEVBQUUsRUFDeEI7WUFDRSxRQUFRLEVBQUU7Z0JBQ1IsR0FBRyxFQUFFLGdCQUFnQixFQUFFLENBQUMsV0FBVyxFQUFFO2dCQUNyQyxHQUFHLFFBQVE7YUFDWjtTQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIE5nTW9kdWxlLFxuICBQcm92aWRlcixcbiAgcHJvdmlkZVpvbmVsZXNzQ2hhbmdlRGV0ZWN0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIMm1Z2V0Q2xlYW51cEhvb2sgYXMgZ2V0Q2xlYW51cEhvb2ssXG4gIGdldFRlc3RCZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUvdGVzdGluZyc7XG5pbXBvcnQge1xuICBCcm93c2VyVGVzdGluZ01vZHVsZSxcbiAgcGxhdGZvcm1Ccm93c2VyVGVzdGluZyxcbn0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci90ZXN0aW5nJztcbmltcG9ydCB7IGFmdGVyRWFjaCwgYmVmb3JlRWFjaCB9IGZyb20gJ3ZpdGVzdCc7XG5cbmNvbnN0IEFOR1VMQVJfVEVTVEJFRF9TRVRVUCA9IFN5bWJvbC5mb3IoJ3Rlc3RiZWQtc2V0dXAnKTtcblxudHlwZSBUZXN0QmVkU2V0dXBPcHRpb25zID0ge1xuICB6b25lbGVzcz86IGJvb2xlYW47XG4gIHByb3ZpZGVycz86IChQcm92aWRlciB8IEVudmlyb25tZW50UHJvdmlkZXJzKVtdO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGB0ZWFyZG93bi5kZXN0cm95QWZ0ZXJFYWNoYCBpbnN0ZWFkLlxuICAgKiBAc3Vuc2V0IDMuMC4wXG4gICAqL1xuICBicm93c2VyTW9kZT86IGJvb2xlYW47XG4gIHRlYXJkb3duPzoge1xuICAgIGRlc3Ryb3lBZnRlckVhY2g6IGJvb2xlYW47XG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBUZXN0QmVkKHtcbiAgem9uZWxlc3MgPSB0cnVlLFxuICBwcm92aWRlcnMgPSBbXSxcbiAgYnJvd3Nlck1vZGUgPSBmYWxzZSxcbiAgdGVhcmRvd24sXG59OiBUZXN0QmVkU2V0dXBPcHRpb25zID0ge30pIHtcbiAgYmVmb3JlRWFjaChnZXRDbGVhbnVwSG9vayhmYWxzZSkpO1xuICBhZnRlckVhY2goZ2V0Q2xlYW51cEhvb2sodHJ1ZSkpO1xuXG4gIGlmICghKGdsb2JhbFRoaXMgYXMgYW55KVtBTkdVTEFSX1RFU1RCRURfU0VUVVBdKSB7XG4gICAgKGdsb2JhbFRoaXMgYXMgYW55KVtBTkdVTEFSX1RFU1RCRURfU0VUVVBdID0gdHJ1ZTtcblxuICAgIEBOZ01vZHVsZSh7XG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgLi4uKHpvbmVsZXNzID8gW3Byb3ZpZGVab25lbGVzc0NoYW5nZURldGVjdGlvbigpXSA6IFtdKSxcbiAgICAgICAgLi4ucHJvdmlkZXJzLFxuICAgICAgXSxcbiAgICB9KVxuICAgIGNsYXNzIFRlc3RNb2R1bGUge31cblxuICAgIGdldFRlc3RCZWQoKS5pbml0VGVzdEVudmlyb25tZW50KFxuICAgICAgW0Jyb3dzZXJUZXN0aW5nTW9kdWxlLCBUZXN0TW9kdWxlXSxcbiAgICAgIHBsYXRmb3JtQnJvd3NlclRlc3RpbmcoKSxcbiAgICAgIHtcbiAgICAgICAgdGVhcmRvd246IHtcbiAgICAgICAgICAuLi57IGRlc3Ryb3lBZnRlckVhY2g6ICFicm93c2VyTW9kZSB9LFxuICAgICAgICAgIC4uLnRlYXJkb3duLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ import 'zone.js';
2
+ import 'zone.js/plugins/sync-test';
3
+ import 'zone.js/plugins/proxy';
4
+ import 'zone.js/testing';
@@ -0,0 +1,116 @@
1
+ import 'zone.js';
2
+ import 'zone.js/plugins/sync-test';
3
+ import 'zone.js/plugins/proxy';
4
+ import 'zone.js/testing';
5
+ /**
6
+ * Patch Vitest's describe/test/beforeEach/afterEach functions so test code
7
+ * always runs in a testZone (ProxyZone).
8
+ */
9
+ /* global Zone */
10
+ const Zone = globalThis['Zone'];
11
+ if (Zone === undefined) {
12
+ throw new Error('Missing: Zone (zone.js)');
13
+ }
14
+ if (globalThis['__vitest_zone_patch__'] === true) {
15
+ throw new Error("'vitest' has already been patched with 'Zone'.");
16
+ }
17
+ globalThis['__vitest_zone_patch__'] = true;
18
+ const SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
19
+ const ProxyZoneSpec = Zone['ProxyZoneSpec'];
20
+ if (SyncTestZoneSpec === undefined) {
21
+ throw new Error('Missing: SyncTestZoneSpec (zone.js/plugins/sync-test)');
22
+ }
23
+ if (ProxyZoneSpec === undefined) {
24
+ throw new Error('Missing: ProxyZoneSpec (zone.js/plugins/proxy.js)');
25
+ }
26
+ const env = globalThis;
27
+ const ambientZone = Zone.current;
28
+ // Create a synchronous-only zone in which to run `describe` blocks in order to
29
+ // raise an error if any asynchronous operations are attempted
30
+ // inside of a `describe` but outside of a `beforeEach` or `it`.
31
+ const syncZone = ambientZone.fork(new SyncTestZoneSpec('vitest.describe'));
32
+ function wrapDescribeInZone(describeBody) {
33
+ return function (...args) {
34
+ return syncZone.run(describeBody, null, args);
35
+ };
36
+ }
37
+ // Create a proxy zone in which to run `test` blocks so that the tests function
38
+ // can retroactively install different zones.
39
+ const testProxyZone = ambientZone.fork(new ProxyZoneSpec());
40
+ function wrapTestInZone(testBody) {
41
+ if (testBody === undefined) {
42
+ return;
43
+ }
44
+ const wrappedFunc = function () {
45
+ return testProxyZone.run(testBody, null, arguments);
46
+ };
47
+ try {
48
+ Object.defineProperty(wrappedFunc, 'length', {
49
+ configurable: true,
50
+ writable: true,
51
+ enumerable: false,
52
+ });
53
+ wrappedFunc.length = testBody.length;
54
+ }
55
+ catch (e) {
56
+ return testBody.length === 0
57
+ ? () => testProxyZone.run(testBody, null)
58
+ : (done) => testProxyZone.run(testBody, null, [done]);
59
+ }
60
+ return wrappedFunc;
61
+ }
62
+ /**
63
+ * bind describe method to wrap describe.each function
64
+ */
65
+ const bindDescribe = (self, originalVitestFn) => function (...eachArgs) {
66
+ return function (...args) {
67
+ args[1] = wrapDescribeInZone(args[1]);
68
+ // @ts-ignore
69
+ return originalVitestFn.apply(self, eachArgs).apply(self, args);
70
+ };
71
+ };
72
+ /**
73
+ * bind test method to wrap test.each function
74
+ */
75
+ const bindTest = (self, originalVitestFn) => function (...eachArgs) {
76
+ return function (...args) {
77
+ args[1] = wrapTestInZone(args[1]);
78
+ // @ts-ignore
79
+ return originalVitestFn.apply(self, eachArgs).apply(self, args);
80
+ };
81
+ };
82
+ ['describe'].forEach((methodName) => {
83
+ const originalvitestFn = env[methodName];
84
+ env[methodName] = function (...args) {
85
+ args[1] = wrapDescribeInZone(args[1]);
86
+ return originalvitestFn.apply(this, args);
87
+ };
88
+ env[methodName].each = bindDescribe(originalvitestFn, originalvitestFn.each);
89
+ if (methodName === 'describe') {
90
+ env[methodName].only = bindDescribe(originalvitestFn, originalvitestFn.only);
91
+ env[methodName].skip = bindDescribe(originalvitestFn, originalvitestFn.skip);
92
+ }
93
+ });
94
+ ['test', 'it'].forEach((methodName) => {
95
+ const originalvitestFn = env[methodName];
96
+ env[methodName] = function (...args) {
97
+ args[1] = wrapTestInZone(args[1]);
98
+ return originalvitestFn.apply(this, args);
99
+ };
100
+ env[methodName].each = bindTest(originalvitestFn, originalvitestFn.each);
101
+ env[methodName].only = bindTest(originalvitestFn, originalvitestFn.only);
102
+ env[methodName].skip = bindTest(originalvitestFn, originalvitestFn.skip);
103
+ if (methodName === 'test' || methodName === 'it') {
104
+ env[methodName].todo = function (...args) {
105
+ return originalvitestFn.todo.apply(this, args);
106
+ };
107
+ }
108
+ });
109
+ ['beforeEach', 'afterEach', 'beforeAll', 'afterAll'].forEach((methodName) => {
110
+ const originalvitestFn = env[methodName];
111
+ env[methodName] = function (...args) {
112
+ args[0] = wrapTestInZone(args[0]);
113
+ return originalvitestFn.apply(this, args);
114
+ };
115
+ });
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtdml0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvdml0ZXN0LWFuZ3VsYXIvc2V0dXAtdml0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLGlCQUFpQixDQUFDO0FBRXpCOzs7R0FHRztBQUNILGlCQUFpQjtBQUNqQixNQUFNLElBQUksR0FBSSxVQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXpDLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQsSUFBSyxVQUFrQixDQUFDLHVCQUF1QixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFQSxVQUFrQixDQUFDLHVCQUF1QixDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDbEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTVDLElBQUksZ0JBQWdCLEtBQUssU0FBUyxFQUFFLENBQUM7SUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFDRCxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztJQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVELE1BQU0sR0FBRyxHQUFHLFVBQWlCLENBQUM7QUFDOUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUVqQywrRUFB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R0FBRyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFekUsSUFBSSxVQUFVLEtBQUssTUFBTSxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNqRCxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxHQUFHLFVBQVUsR0FBRyxJQUFTO1lBQzNDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDO0FBRUgsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtJQUMxRSxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV6QyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQVc7UUFDeEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsQyxPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3pvbmUuanMnO1xuaW1wb3J0ICd6b25lLmpzL3BsdWdpbnMvc3luYy10ZXN0JztcbmltcG9ydCAnem9uZS5qcy9wbHVnaW5zL3Byb3h5JztcbmltcG9ydCAnem9uZS5qcy90ZXN0aW5nJztcblxuLyoqXG4gKiBQYXRjaCBWaXRlc3QncyBkZXNjcmliZS90ZXN0L2JlZm9yZUVhY2gvYWZ0ZXJFYWNoIGZ1bmN0aW9ucyBzbyB0ZXN0IGNvZGVcbiAqIGFsd2F5cyBydW5zIGluIGEgdGVzdFpvbmUgKFByb3h5Wm9uZSkuXG4gKi9cbi8qIGdsb2JhbCBab25lICovXG5jb25zdCBab25lID0gKGdsb2JhbFRoaXMgYXMgYW55KVsnWm9uZSddO1xuXG5pZiAoWm9uZSA9PT0gdW5kZWZpbmVkKSB7XG4gIHRocm93IG5ldyBFcnJvcignTWlzc2luZzogWm9uZSAoem9uZS5qcyknKTtcbn1cblxuaWYgKChnbG9iYWxUaGlzIGFzIGFueSlbJ19fdml0ZXN0X3pvbmVfcGF0Y2hfXyddID09PSB0cnVlKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIid2aXRlc3QnIGhhcyBhbHJlYWR5IGJlZW4gcGF0Y2hlZCB3aXRoICdab25lJy5cIik7XG59XG5cbihnbG9iYWxUaGlzIGFzIGFueSlbJ19fdml0ZXN0X3pvbmVfcGF0Y2hfXyddID0gdHJ1ZTtcbmNvbnN0IFN5bmNUZXN0Wm9uZVNwZWMgPSBab25lWydTeW5jVGVzdFpvbmVTcGVjJ107XG5jb25zdCBQcm94eVpvbmVTcGVjID0gWm9uZVsnUHJveHlab25lU3BlYyddO1xuXG5pZiAoU3luY1Rlc3Rab25lU3BlYyA9PT0gdW5kZWZpbmVkKSB7XG4gIHRocm93IG5ldyBFcnJvcignTWlzc2luZzogU3luY1Rlc3Rab25lU3BlYyAoem9uZS5qcy9wbHVnaW5zL3N5bmMtdGVzdCknKTtcbn1cbmlmIChQcm94eVpvbmVTcGVjID09PSB1bmRlZmluZWQpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nOiBQcm94eVpvbmVTcGVjICh6b25lLmpzL3BsdWdpbnMvcHJveHkuanMpJyk7XG59XG5cbmNvbnN0IGVudiA9IGdsb2JhbFRoaXMgYXMgYW55O1xuY29uc3QgYW1iaWVudFpvbmUgPSBab25lLmN1cnJlbnQ7XG5cbi8vIENyZWF0ZSBhIHN5bmNocm9ub3VzLW9ubHkgem9uZSBpbiB3aGljaCB0byBydW4gYGRlc2NyaWJlYCBibG9ja3MgaW4gb3JkZXIgdG9cbi8vIHJhaXNlIGFuIGVycm9yIGlmIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhcmUgYXR0ZW1wdGVkXG4vLyBpbnNpZGUgb2YgYSBgZGVzY3JpYmVgIGJ1dCBvdXRzaWRlIG9mIGEgYGJlZm9yZUVhY2hgIG9yIGBpdGAuXG5jb25zdCBzeW5jWm9uZSA9IGFtYmllbnRab25lLmZvcmsobmV3IFN5bmNUZXN0Wm9uZVNwZWMoJ3ZpdGVzdC5kZXNjcmliZScpKTtcbmZ1bmN0aW9uIHdyYXBEZXNjcmliZUluWm9uZShkZXNjcmliZUJvZHk6IGFueSkge1xuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueSkge1xuICAgIHJldHVybiBzeW5jWm9uZS5ydW4oZGVzY3JpYmVCb2R5LCBudWxsLCBhcmdzKTtcbiAgfTtcbn1cblxuLy8gQ3JlYXRlIGEgcHJveHkgem9uZSBpbiB3aGljaCB0byBydW4gYHRlc3RgIGJsb2NrcyBzbyB0aGF0IHRoZSB0ZXN0cyBmdW5jdGlvblxuLy8gY2FuIHJldHJvYWN0aXZlbHkgaW5zdGFsbCBkaWZmZXJlbnQgem9uZXMuXG5jb25zdCB0ZXN0UHJveHlab25lID0gYW1iaWVudFpvbmUuZm9yayhuZXcgUHJveHlab25lU3BlYygpKTtcbmZ1bmN0aW9uIHdyYXBUZXN0SW5ab25lKHRlc3RCb2R5OiBzdHJpbmcgfCBhbnlbXSB8IHVuZGVmaW5lZCkge1xuICBpZiAodGVzdEJvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHdyYXBwZWRGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0ZXN0UHJveHlab25lLnJ1bih0ZXN0Qm9keSwgbnVsbCwgYXJndW1lbnRzKTtcbiAgfTtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcHBlZEZ1bmMsICdsZW5ndGgnLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHdyYXBwZWRGdW5jLmxlbmd0aCA9IHRlc3RCb2R5Lmxlbmd0aDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0ZXN0Qm9keS5sZW5ndGggPT09IDBcbiAgICAgID8gKCkgPT4gdGVzdFByb3h5Wm9uZS5ydW4odGVzdEJvZHksIG51bGwpXG4gICAgICA6IChkb25lOiBhbnkpID0+IHRlc3RQcm94eVpvbmUucnVuKHRlc3RCb2R5LCBudWxsLCBbZG9uZV0pO1xuICB9XG5cbiAgcmV0dXJuIHdyYXBwZWRGdW5jO1xufVxuXG4vKipcbiAqIGJpbmQgZGVzY3JpYmUgbWV0aG9kIHRvIHdyYXAgZGVzY3JpYmUuZWFjaCBmdW5jdGlvblxuICovXG5jb25zdCBiaW5kRGVzY3JpYmUgPSAoXG4gIHNlbGY6IGFueSxcbiAgb3JpZ2luYWxWaXRlc3RGbjoge1xuICAgIGFwcGx5OiAoXG4gICAgICBhcmcwOiBhbnksXG4gICAgICBhcmcxOiBhbnlbXSxcbiAgICApID0+IHtcbiAgICAgICgpOiBhbnk7XG4gICAgICBuZXcgKCk6IGFueTtcbiAgICAgIGFwcGx5OiB7IChhcmcwOiBhbnksIGFyZzE6IGFueVtdKTogYW55OyBuZXcgKCk6IGFueSB9O1xuICAgIH07XG4gIH0sXG4pID0+XG4gIGZ1bmN0aW9uICguLi5lYWNoQXJnczogYW55KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgYXJnc1sxXSA9IHdyYXBEZXNjcmliZUluWm9uZShhcmdzWzFdKTtcblxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIG9yaWdpbmFsVml0ZXN0Rm4uYXBwbHkoc2VsZiwgZWFjaEFyZ3MpLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH07XG4gIH07XG5cbi8qKlxuICogYmluZCB0ZXN0IG1ldGhvZCB0byB3cmFwIHRlc3QuZWFjaCBmdW5jdGlvblxuICovXG5jb25zdCBiaW5kVGVzdCA9IChcbiAgc2VsZjogYW55LFxuICBvcmlnaW5hbFZpdGVzdEZuOiB7XG4gICAgYXBwbHk6IChcbiAgICAgIGFyZzA6IGFueSxcbiAgICAgIGFyZzE6IGFueVtdLFxuICAgICkgPT4ge1xuICAgICAgKCk6IGFueTtcbiAgICAgIG5ldyAoKTogYW55O1xuICAgICAgYXBwbHk6IHsgKGFyZzA6IGFueSwgYXJnMTogYW55W10pOiBhbnk7IG5ldyAoKTogYW55IH07XG4gICAgfTtcbiAgfSxcbikgPT5cbiAgZnVuY3Rpb24gKC4uLmVhY2hBcmdzOiBhbnkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBhcmdzWzFdID0gd3JhcFRlc3RJblpvbmUoYXJnc1sxXSk7XG5cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiBvcmlnaW5hbFZpdGVzdEZuLmFwcGx5KHNlbGYsIGVhY2hBcmdzKS5hcHBseShzZWxmLCBhcmdzKTtcbiAgICB9O1xuICB9O1xuXG5bJ2Rlc2NyaWJlJ10uZm9yRWFjaCgobWV0aG9kTmFtZSkgPT4ge1xuICBjb25zdCBvcmlnaW5hbHZpdGVzdEZuID0gZW52W21ldGhvZE5hbWVdO1xuICBlbnZbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICBhcmdzWzFdID0gd3JhcERlc2NyaWJlSW5ab25lKGFyZ3NbMV0pO1xuXG4gICAgcmV0dXJuIG9yaWdpbmFsdml0ZXN0Rm4uYXBwbHkodGhpcywgYXJncyk7XG4gIH07XG4gIGVudlttZXRob2ROYW1lXS5lYWNoID0gYmluZERlc2NyaWJlKG9yaWdpbmFsdml0ZXN0Rm4sIG9yaWdpbmFsdml0ZXN0Rm4uZWFjaCk7XG4gIGlmIChtZXRob2ROYW1lID09PSAnZGVzY3JpYmUnKSB7XG4gICAgZW52W21ldGhvZE5hbWVdLm9ubHkgPSBiaW5kRGVzY3JpYmUoXG4gICAgICBvcmlnaW5hbHZpdGVzdEZuLFxuICAgICAgb3JpZ2luYWx2aXRlc3RGbi5vbmx5LFxuICAgICk7XG4gICAgZW52W21ldGhvZE5hbWVdLnNraXAgPSBiaW5kRGVzY3JpYmUoXG4gICAgICBvcmlnaW5hbHZpdGVzdEZuLFxuICAgICAgb3JpZ2luYWx2aXRlc3RGbi5za2lwLFxuICAgICk7XG4gIH1cbn0pO1xuXG5bJ3Rlc3QnLCAnaXQnXS5mb3JFYWNoKChtZXRob2ROYW1lKSA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsdml0ZXN0Rm4gPSBlbnZbbWV0aG9kTmFtZV07XG4gIGVudlttZXRob2ROYW1lXSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgIGFyZ3NbMV0gPSB3cmFwVGVzdEluWm9uZShhcmdzWzFdKTtcblxuICAgIHJldHVybiBvcmlnaW5hbHZpdGVzdEZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9O1xuICBlbnZbbWV0aG9kTmFtZV0uZWFjaCA9IGJpbmRUZXN0KG9yaWdpbmFsdml0ZXN0Rm4sIG9yaWdpbmFsdml0ZXN0Rm4uZWFjaCk7XG4gIGVudlttZXRob2ROYW1lXS5vbmx5ID0gYmluZFRlc3Qob3JpZ2luYWx2aXRlc3RGbiwgb3JpZ2luYWx2aXRlc3RGbi5vbmx5KTtcbiAgZW52W21ldGhvZE5hbWVdLnNraXAgPSBiaW5kVGVzdChvcmlnaW5hbHZpdGVzdEZuLCBvcmlnaW5hbHZpdGVzdEZuLnNraXApO1xuXG4gIGlmIChtZXRob2ROYW1lID09PSAndGVzdCcgfHwgbWV0aG9kTmFtZSA9PT0gJ2l0Jykge1xuICAgIGVudlttZXRob2ROYW1lXS50b2RvID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueSkge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsdml0ZXN0Rm4udG9kby5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9XG59KTtcblxuWydiZWZvcmVFYWNoJywgJ2FmdGVyRWFjaCcsICdiZWZvcmVBbGwnLCAnYWZ0ZXJBbGwnXS5mb3JFYWNoKChtZXRob2ROYW1lKSA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsdml0ZXN0Rm4gPSBlbnZbbWV0aG9kTmFtZV07XG5cbiAgZW52W21ldGhvZE5hbWVdID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgYXJnc1swXSA9IHdyYXBUZXN0SW5ab25lKGFyZ3NbMF0pO1xuXG4gICAgcmV0dXJuIG9yaWdpbmFsdml0ZXN0Rm4uYXBwbHkodGhpcywgYXJncyk7XG4gIH07XG59KTtcbiJdfQ==
@@ -0,0 +1 @@
1
+ export { createNoNgAttributesSnapshotSerializer, createAngularFixtureSnapshotSerializer, createHtmlCommentSnapshotSerializer, } from './src/lib/snapshot-serializers/index.js';
@@ -0,0 +1,2 @@
1
+ export { createNoNgAttributesSnapshotSerializer, createAngularFixtureSnapshotSerializer, createHtmlCommentSnapshotSerializer, } from './src/lib/snapshot-serializers/index.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3Qtc2VyaWFsaXplcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy92aXRlc3QtYW5ndWxhci9zbmFwc2hvdC1zZXJpYWxpemVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsc0NBQXNDLEVBQ3RDLHNDQUFzQyxFQUN0QyxtQ0FBbUMsR0FDcEMsTUFBTSx5Q0FBeUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7XG4gIGNyZWF0ZU5vTmdBdHRyaWJ1dGVzU25hcHNob3RTZXJpYWxpemVyLFxuICBjcmVhdGVBbmd1bGFyRml4dHVyZVNuYXBzaG90U2VyaWFsaXplcixcbiAgY3JlYXRlSHRtbENvbW1lbnRTbmFwc2hvdFNlcmlhbGl6ZXIsXG59IGZyb20gJy4vc3JjL2xpYi9zbmFwc2hvdC1zZXJpYWxpemVycy9pbmRleC5qcyc7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ import type { SnapshotSerializer } from 'vitest';
2
+ export declare function createAngularFixtureSnapshotSerializer(): SnapshotSerializer;
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Check if is an Angular fixture
3
+ *
4
+ * @param val Angular fixture
5
+ * @returns boolean who check if is an angular fixture
6
+ */
7
+ function isAngularFixture(val) {
8
+ if (typeof val !== 'object') {
9
+ return false;
10
+ }
11
+ if (val['componentRef'] || val['componentInstance']) {
12
+ return true;
13
+ }
14
+ if (val['componentType']) {
15
+ return true;
16
+ }
17
+ // * Angular fixture keys in Fixture component Object
18
+ const fixtureKeys = [
19
+ 'componentRef',
20
+ 'ngZone',
21
+ 'effectRunner',
22
+ '_autoDetect',
23
+ '_isStable',
24
+ '_isDestroyed',
25
+ '_resolve',
26
+ '_promise',
27
+ '_onUnstableSubscription',
28
+ '_onStableSubscription',
29
+ '_onMicrotaskEmptySubscription',
30
+ '_onErrorSubscription',
31
+ 'changeDetectorRef',
32
+ 'elementRef',
33
+ 'debugElement',
34
+ 'componentInstance',
35
+ 'nativeElement',
36
+ ];
37
+ // * Angular fixture keys in Fixture componentRef Object
38
+ const fixtureComponentRefKeys = [
39
+ 'location',
40
+ '_rootLView',
41
+ '_tNode',
42
+ 'previousInputValues',
43
+ 'instance',
44
+ 'changeDetectorRef',
45
+ 'hostView',
46
+ 'componentType',
47
+ ];
48
+ return (JSON.stringify(Object.keys(val)) === JSON.stringify(fixtureKeys) ||
49
+ JSON.stringify(Object.keys(val)) === JSON.stringify(fixtureComponentRefKeys));
50
+ }
51
+ /**
52
+ * Serialize Angular fixture for Vitest
53
+ *
54
+ * @param fixture Angular Fixture Component
55
+ * @returns HTML Child Node
56
+ */
57
+ function fixtureVitestSerializer(fixture) {
58
+ // * Get Component meta data
59
+ const componentType = (fixture && fixture.componentType
60
+ ? fixture.componentType
61
+ : fixture.componentRef.componentType);
62
+ let inputsData = '';
63
+ const selector = Reflect.getOwnPropertyDescriptor(componentType, '__annotations__')?.value[0]
64
+ ?.selector ?? componentType.ɵcmp?.selectors[0]?.[0];
65
+ if (componentType && componentType.propDecorators) {
66
+ inputsData = Object.entries(componentType.propDecorators)
67
+ .map(([key, value]) => `${key}="${value}"`)
68
+ .join('');
69
+ }
70
+ // * Get DOM Elements
71
+ const divElement = fixture && fixture.nativeElement
72
+ ? fixture.nativeElement
73
+ : fixture.location.nativeElement;
74
+ // * Convert string data to HTML data
75
+ const doc = new DOMParser().parseFromString(`<${selector} ${inputsData}>${divElement.innerHTML}</${selector}>`, 'text/html');
76
+ return doc.body.childNodes[0];
77
+ }
78
+ export function createAngularFixtureSnapshotSerializer() {
79
+ return {
80
+ serialize(val, config, indentation, depth, refs, printer) {
81
+ return printer(fixtureVitestSerializer(val), config, indentation, depth, refs);
82
+ },
83
+ test(val) {
84
+ return val && isAngularFixture(val);
85
+ },
86
+ };
87
+ }
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1maXh0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdml0ZXN0LWFuZ3VsYXIvc3JjL2xpYi9zbmFwc2hvdC1zZXJpYWxpemVycy9hbmd1bGFyLWZpeHR1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0E7Ozs7O0dBS0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEdBQVE7SUFDaEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQscURBQXFEO0lBQ3JELE1BQU0sV0FBVyxHQUFHO1FBQ2xCLGNBQWM7UUFDZCxRQUFRO1FBQ1IsY0FBYztRQUNkLGFBQWE7UUFDYixXQUFXO1FBQ1gsY0FBYztRQUNkLFVBQVU7UUFDVixVQUFVO1FBQ1YseUJBQXlCO1FBQ3pCLHVCQUF1QjtRQUN2QiwrQkFBK0I7UUFDL0Isc0JBQXNCO1FBQ3RCLG1CQUFtQjtRQUNuQixZQUFZO1FBQ1osY0FBYztRQUNkLG1CQUFtQjtRQUNuQixlQUFlO0tBQ2hCLENBQUM7SUFFRix3REFBd0Q7SUFDeEQsTUFBTSx1QkFBdUIsR0FBRztRQUM5QixVQUFVO1FBQ1YsWUFBWTtRQUNaLFFBQVE7UUFDUixxQkFBcUI7UUFDckIsVUFBVTtRQUNWLG1CQUFtQjtRQUNuQixVQUFVO1FBQ1YsZUFBZTtLQUNoQixDQUFDO0lBRUYsT0FBTyxDQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FDN0UsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsdUJBQXVCLENBQUMsT0FBWTtJQUMzQyw0QkFBNEI7SUFDNUIsTUFBTSxhQUFhLEdBQUcsQ0FDcEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxhQUFhO1FBQzlCLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYTtRQUN2QixDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQ2hDLENBQUM7SUFFVCxJQUFJLFVBQVUsR0FBVyxFQUFFLENBQUM7SUFFNUIsTUFBTSxRQUFRLEdBQ1osT0FBTyxDQUFDLHdCQUF3QixDQUFDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDMUUsRUFBRSxRQUFRLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV4RCxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEQsVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQzthQUN0RCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssS0FBSyxHQUFHLENBQUM7YUFDMUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixNQUFNLFVBQVUsR0FDZCxPQUFPLElBQUksT0FBTyxDQUFDLGFBQWE7UUFDOUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhO1FBQ3ZCLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztJQUVyQyxxQ0FBcUM7SUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQ3pDLElBQUksUUFBUSxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsU0FBUyxLQUFLLFFBQVEsR0FBRyxFQUNsRSxXQUFXLENBQ1osQ0FBQztJQUVGLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELE1BQU0sVUFBVSxzQ0FBc0M7SUFDcEQsT0FBTztRQUNMLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU87WUFDdEQsT0FBTyxPQUFPLENBQ1osdUJBQXVCLENBQUMsR0FBRyxDQUFDLEVBQzVCLE1BQU0sRUFDTixXQUFXLEVBQ1gsS0FBSyxFQUNMLElBQUksQ0FDTCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHO1lBQ04sT0FBTyxHQUFHLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb21wb25lbnRGaXh0dXJlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS90ZXN0aW5nJztcbmltcG9ydCB0eXBlIHsgU25hcHNob3RTZXJpYWxpemVyIH0gZnJvbSAndml0ZXN0JztcblxuLyoqXG4gKiBDaGVjayBpZiBpcyBhbiBBbmd1bGFyIGZpeHR1cmVcbiAqXG4gKiBAcGFyYW0gdmFsIEFuZ3VsYXIgZml4dHVyZVxuICogQHJldHVybnMgYm9vbGVhbiB3aG8gY2hlY2sgaWYgaXMgYW4gYW5ndWxhciBmaXh0dXJlXG4gKi9cbmZ1bmN0aW9uIGlzQW5ndWxhckZpeHR1cmUodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiB2YWwgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHZhbFsnY29tcG9uZW50UmVmJ10gfHwgdmFsWydjb21wb25lbnRJbnN0YW5jZSddKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodmFsWydjb21wb25lbnRUeXBlJ10pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vICogQW5ndWxhciBmaXh0dXJlIGtleXMgaW4gRml4dHVyZSBjb21wb25lbnQgT2JqZWN0XG4gIGNvbnN0IGZpeHR1cmVLZXlzID0gW1xuICAgICdjb21wb25lbnRSZWYnLFxuICAgICduZ1pvbmUnLFxuICAgICdlZmZlY3RSdW5uZXInLFxuICAgICdfYXV0b0RldGVjdCcsXG4gICAgJ19pc1N0YWJsZScsXG4gICAgJ19pc0Rlc3Ryb3llZCcsXG4gICAgJ19yZXNvbHZlJyxcbiAgICAnX3Byb21pc2UnLFxuICAgICdfb25VbnN0YWJsZVN1YnNjcmlwdGlvbicsXG4gICAgJ19vblN0YWJsZVN1YnNjcmlwdGlvbicsXG4gICAgJ19vbk1pY3JvdGFza0VtcHR5U3Vic2NyaXB0aW9uJyxcbiAgICAnX29uRXJyb3JTdWJzY3JpcHRpb24nLFxuICAgICdjaGFuZ2VEZXRlY3RvclJlZicsXG4gICAgJ2VsZW1lbnRSZWYnLFxuICAgICdkZWJ1Z0VsZW1lbnQnLFxuICAgICdjb21wb25lbnRJbnN0YW5jZScsXG4gICAgJ25hdGl2ZUVsZW1lbnQnLFxuICBdO1xuXG4gIC8vICogQW5ndWxhciBmaXh0dXJlIGtleXMgaW4gRml4dHVyZSBjb21wb25lbnRSZWYgT2JqZWN0XG4gIGNvbnN0IGZpeHR1cmVDb21wb25lbnRSZWZLZXlzID0gW1xuICAgICdsb2NhdGlvbicsXG4gICAgJ19yb290TFZpZXcnLFxuICAgICdfdE5vZGUnLFxuICAgICdwcmV2aW91c0lucHV0VmFsdWVzJyxcbiAgICAnaW5zdGFuY2UnLFxuICAgICdjaGFuZ2VEZXRlY3RvclJlZicsXG4gICAgJ2hvc3RWaWV3JyxcbiAgICAnY29tcG9uZW50VHlwZScsXG4gIF07XG5cbiAgcmV0dXJuIChcbiAgICBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyh2YWwpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZml4dHVyZUtleXMpIHx8XG4gICAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXModmFsKSkgPT09IEpTT04uc3RyaW5naWZ5KGZpeHR1cmVDb21wb25lbnRSZWZLZXlzKVxuICApO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSBBbmd1bGFyIGZpeHR1cmUgZm9yIFZpdGVzdFxuICpcbiAqIEBwYXJhbSBmaXh0dXJlIEFuZ3VsYXIgRml4dHVyZSBDb21wb25lbnRcbiAqIEByZXR1cm5zIEhUTUwgQ2hpbGQgTm9kZVxuICovXG5mdW5jdGlvbiBmaXh0dXJlVml0ZXN0U2VyaWFsaXplcihmaXh0dXJlOiBhbnkpIHtcbiAgLy8gKiBHZXQgQ29tcG9uZW50IG1ldGEgZGF0YVxuICBjb25zdCBjb21wb25lbnRUeXBlID0gKFxuICAgIGZpeHR1cmUgJiYgZml4dHVyZS5jb21wb25lbnRUeXBlXG4gICAgICA/IGZpeHR1cmUuY29tcG9uZW50VHlwZVxuICAgICAgOiBmaXh0dXJlLmNvbXBvbmVudFJlZi5jb21wb25lbnRUeXBlXG4gICkgYXMgYW55O1xuXG4gIGxldCBpbnB1dHNEYXRhOiBzdHJpbmcgPSAnJztcblxuICBjb25zdCBzZWxlY3RvciA9XG4gICAgUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29tcG9uZW50VHlwZSwgJ19fYW5ub3RhdGlvbnNfXycpPy52YWx1ZVswXVxuICAgICAgPy5zZWxlY3RvciA/PyBjb21wb25lbnRUeXBlLsm1Y21wPy5zZWxlY3RvcnNbMF0/LlswXTtcblxuICBpZiAoY29tcG9uZW50VHlwZSAmJiBjb21wb25lbnRUeXBlLnByb3BEZWNvcmF0b3JzKSB7XG4gICAgaW5wdXRzRGF0YSA9IE9iamVjdC5lbnRyaWVzKGNvbXBvbmVudFR5cGUucHJvcERlY29yYXRvcnMpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX09XCIke3ZhbHVlfVwiYClcbiAgICAgIC5qb2luKCcnKTtcbiAgfVxuXG4gIC8vICogR2V0IERPTSBFbGVtZW50c1xuICBjb25zdCBkaXZFbGVtZW50ID1cbiAgICBmaXh0dXJlICYmIGZpeHR1cmUubmF0aXZlRWxlbWVudFxuICAgICAgPyBmaXh0dXJlLm5hdGl2ZUVsZW1lbnRcbiAgICAgIDogZml4dHVyZS5sb2NhdGlvbi5uYXRpdmVFbGVtZW50O1xuXG4gIC8vICogQ29udmVydCBzdHJpbmcgZGF0YSB0byBIVE1MIGRhdGFcbiAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhcbiAgICBgPCR7c2VsZWN0b3J9ICR7aW5wdXRzRGF0YX0+JHtkaXZFbGVtZW50LmlubmVySFRNTH08LyR7c2VsZWN0b3J9PmAsXG4gICAgJ3RleHQvaHRtbCcsXG4gICk7XG5cbiAgcmV0dXJuIGRvYy5ib2R5LmNoaWxkTm9kZXNbMF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBbmd1bGFyRml4dHVyZVNuYXBzaG90U2VyaWFsaXplcigpOiBTbmFwc2hvdFNlcmlhbGl6ZXIge1xuICByZXR1cm4ge1xuICAgIHNlcmlhbGl6ZSh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSB7XG4gICAgICByZXR1cm4gcHJpbnRlcihcbiAgICAgICAgZml4dHVyZVZpdGVzdFNlcmlhbGl6ZXIodmFsKSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIHJlZnMsXG4gICAgICApO1xuICAgIH0sXG4gICAgdGVzdCh2YWwpIHtcbiAgICAgIHJldHVybiB2YWwgJiYgaXNBbmd1bGFyRml4dHVyZSh2YWwpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ import { type SnapshotSerializer } from 'vitest';
2
+ export declare function createHtmlCommentSnapshotSerializer(): SnapshotSerializer;
@@ -0,0 +1,7 @@
1
+ export function createHtmlCommentSnapshotSerializer() {
2
+ return {
3
+ serialize: () => '',
4
+ test: (val) => typeof Comment !== 'undefined' && val instanceof Comment,
5
+ };
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC1jb21tZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdml0ZXN0LWFuZ3VsYXIvc3JjL2xpYi9zbmFwc2hvdC1zZXJpYWxpemVycy9odG1sLWNvbW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLG1DQUFtQztJQUNqRCxPQUFPO1FBQ0wsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7UUFDbkIsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFXLEVBQUUsQ0FDMUIsT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLEdBQUcsWUFBWSxPQUFPO0tBQzNELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBTbmFwc2hvdFNlcmlhbGl6ZXIgfSBmcm9tICd2aXRlc3QnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSHRtbENvbW1lbnRTbmFwc2hvdFNlcmlhbGl6ZXIoKTogU25hcHNob3RTZXJpYWxpemVyIHtcbiAgcmV0dXJuIHtcbiAgICBzZXJpYWxpemU6ICgpID0+ICcnLFxuICAgIHRlc3Q6ICh2YWw6IGFueSk6IGJvb2xlYW4gPT5cbiAgICAgIHR5cGVvZiBDb21tZW50ICE9PSAndW5kZWZpbmVkJyAmJiB2YWwgaW5zdGFuY2VvZiBDb21tZW50LFxuICB9O1xufVxuIl19
@@ -0,0 +1,3 @@
1
+ export { createAngularFixtureSnapshotSerializer } from './angular-fixture.js';
2
+ export { createHtmlCommentSnapshotSerializer } from './html-comment.js';
3
+ export { createNoNgAttributesSnapshotSerializer } from './no-ng-attributes.js';
@@ -0,0 +1,4 @@
1
+ export { createAngularFixtureSnapshotSerializer } from './angular-fixture.js';
2
+ export { createHtmlCommentSnapshotSerializer } from './html-comment.js';
3
+ export { createNoNgAttributesSnapshotSerializer } from './no-ng-attributes.js';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy92aXRlc3QtYW5ndWxhci9zcmMvbGliL3NuYXBzaG90LXNlcmlhbGl6ZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgY3JlYXRlQW5ndWxhckZpeHR1cmVTbmFwc2hvdFNlcmlhbGl6ZXIgfSBmcm9tICcuL2FuZ3VsYXItZml4dHVyZS5qcyc7XG5leHBvcnQgeyBjcmVhdGVIdG1sQ29tbWVudFNuYXBzaG90U2VyaWFsaXplciB9IGZyb20gJy4vaHRtbC1jb21tZW50LmpzJztcbmV4cG9ydCB7IGNyZWF0ZU5vTmdBdHRyaWJ1dGVzU25hcHNob3RTZXJpYWxpemVyIH0gZnJvbSAnLi9uby1uZy1hdHRyaWJ1dGVzLmpzJztcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import { type SnapshotSerializer } from 'vitest';
2
+ export declare const attributesToRemovePatterns: string[];
3
+ export declare const attributesToClean: Record<string, RegExp[]>;
4
+ export declare function createNoNgAttributesSnapshotSerializer(): SnapshotSerializer;
@@ -0,0 +1,74 @@
1
+ const CLEANED_ELEMENT_MARKER = '__analogSnapshotCleaned__';
2
+ export const attributesToRemovePatterns = [
3
+ 'ng-reflect',
4
+ '_nghost',
5
+ '_ngcontent',
6
+ 'ng-version',
7
+ ];
8
+ export const attributesToClean = {
9
+ class: [/^(?:mat|cdk|ng).*-\w*\d+-\d+$/, /^ng-star-inserted$/],
10
+ id: [/^(?:mat|cdk|ng).*-\d+$/],
11
+ for: [/^(?:mat|cdk|ng).*-\d+$/],
12
+ 'aria-owns': [/^(?:mat|cdk|ng).*-\d+$/],
13
+ 'aria-labelledby': [/^(?:mat|cdk|ng).*-\d+$/],
14
+ 'aria-controls': [/^(?:mat|cdk|ng).*-\d+$/],
15
+ };
16
+ const hasAttributesToRemove = (attribute) => attributesToRemovePatterns.some((removePattern) => attribute.name.startsWith(removePattern));
17
+ const hasAttributesToClean = (attribute) => Object.prototype.hasOwnProperty.call(attributesToClean, attribute.name);
18
+ const attributeNeedsCleaning = (attribute) => hasAttributesToClean(attribute) &&
19
+ attribute.value
20
+ .split(' ')
21
+ .some((attrValue) => attributesToClean[attribute.name].some((attributeCleanRegex) => attributeCleanRegex.test(attrValue)));
22
+ const shouldSerializeElement = (node) => {
23
+ if (node.parentElement?.tagName === 'BODY' && node.hasAttribute('id')) {
24
+ return true;
25
+ }
26
+ return Array.from(node.attributes).some((attribute) => hasAttributesToRemove(attribute) || attributeNeedsCleaning(attribute));
27
+ };
28
+ function cleanAngularElementAttributes(node) {
29
+ const nodeCopy = node.cloneNode(true);
30
+ Object.defineProperty(nodeCopy, CLEANED_ELEMENT_MARKER, {
31
+ configurable: true,
32
+ value: true,
33
+ });
34
+ if (node.parentElement?.tagName === 'BODY') {
35
+ nodeCopy.removeAttribute('id');
36
+ }
37
+ Array.from(nodeCopy.attributes).forEach((attribute) => {
38
+ if (hasAttributesToRemove(attribute)) {
39
+ nodeCopy.removeAttribute(attribute.name);
40
+ return;
41
+ }
42
+ if (hasAttributesToClean(attribute)) {
43
+ const cleanedValue = attribute.value
44
+ .split(' ')
45
+ .filter((attrValue) => !attributesToClean[attribute.name].some((attributeCleanRegex) => attributeCleanRegex.test(attrValue)))
46
+ .join(' ');
47
+ if (cleanedValue === '') {
48
+ nodeCopy.removeAttribute(attribute.name);
49
+ return;
50
+ }
51
+ nodeCopy.setAttribute(attribute.name, cleanedValue);
52
+ }
53
+ });
54
+ return nodeCopy;
55
+ }
56
+ export function createNoNgAttributesSnapshotSerializer() {
57
+ return {
58
+ serialize(val, config, indentation, depth, refs, printer) {
59
+ const cleanedNode = cleanAngularElementAttributes(val);
60
+ if (shouldSerializeElement(cleanedNode)) {
61
+ throw new Error(`NoNgAttributes serializer did not stabilize for <${cleanedNode.tagName.toLowerCase()}>`);
62
+ }
63
+ return printer(cleanedNode, config, indentation, depth, refs);
64
+ },
65
+ test(val) {
66
+ const matches = typeof Element !== 'undefined' &&
67
+ val instanceof Element &&
68
+ !val[CLEANED_ELEMENT_MARKER] &&
69
+ shouldSerializeElement(val);
70
+ return matches;
71
+ },
72
+ };
73
+ }
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tbmctYXR0cmlidXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3ZpdGVzdC1hbmd1bGFyL3NyYy9saWIvc25hcHNob3Qtc2VyaWFsaXplcnMvbm8tbmctYXR0cmlidXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLHNCQUFzQixHQUFHLDJCQUEyQixDQUFDO0FBRTNELE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHO0lBQ3hDLFlBQVk7SUFDWixTQUFTO0lBQ1QsWUFBWTtJQUNaLFlBQVk7Q0FDYixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQTZCO0lBQ3pELEtBQUssRUFBRSxDQUFDLCtCQUErQixFQUFFLG9CQUFvQixDQUFDO0lBQzlELEVBQUUsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQzlCLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQy9CLFdBQVcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQ3ZDLGlCQUFpQixFQUFFLENBQUMsd0JBQXdCLENBQUM7SUFDN0MsZUFBZSxFQUFFLENBQUMsd0JBQXdCLENBQUM7Q0FDNUMsQ0FBQztBQUVGLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxTQUFlLEVBQVcsRUFBRSxDQUN6RCwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUNoRCxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FDekMsQ0FBQztBQUVKLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxTQUFlLEVBQVcsRUFBRSxDQUN4RCxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRTFFLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxTQUFlLEVBQVcsRUFBRSxDQUMxRCxvQkFBb0IsQ0FBQyxTQUFTLENB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QyxPQUFPLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FDekYsQ0FBQztZQUNKLENBQUM7WUFFRCxPQUFPLE9BQU8sQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHO1lBQ04sTUFBTSxPQUFPLEdBQ1gsT0FBTyxPQUFPLEtBQUssV0FBVztnQkFDOUIsR0FBRyxZQUFZLE9BQU87Z0JBQ3RCLENBQUUsR0FBeUMsQ0FBQyxzQkFBc0IsQ0FBQztnQkFDbkUsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFOUIsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBTbmFwc2hvdFNlcmlhbGl6ZXIgfSBmcm9tICd2aXRlc3QnO1xuXG5jb25zdCBDTEVBTkVEX0VMRU1FTlRfTUFSS0VSID0gJ19fYW5hbG9nU25hcHNob3RDbGVhbmVkX18nO1xuXG5leHBvcnQgY29uc3QgYXR0cmlidXRlc1RvUmVtb3ZlUGF0dGVybnMgPSBbXG4gICduZy1yZWZsZWN0JyxcbiAgJ19uZ2hvc3QnLFxuICAnX25nY29udGVudCcsXG4gICduZy12ZXJzaW9uJyxcbl07XG5cbmV4cG9ydCBjb25zdCBhdHRyaWJ1dGVzVG9DbGVhbjogUmVjb3JkPHN0cmluZywgUmVnRXhwW10+ID0ge1xuICBjbGFzczogWy9eKD86bWF0fGNka3xuZykuKi1cXHcqXFxkKy1cXGQrJC8sIC9ebmctc3Rhci1pbnNlcnRlZCQvXSxcbiAgaWQ6IFsvXig/Om1hdHxjZGt8bmcpLiotXFxkKyQvXSxcbiAgZm9yOiBbL14oPzptYXR8Y2RrfG5nKS4qLVxcZCskL10sXG4gICdhcmlhLW93bnMnOiBbL14oPzptYXR8Y2RrfG5nKS4qLVxcZCskL10sXG4gICdhcmlhLWxhYmVsbGVkYnknOiBbL14oPzptYXR8Y2RrfG5nKS4qLVxcZCskL10sXG4gICdhcmlhLWNvbnRyb2xzJzogWy9eKD86bWF0fGNka3xuZykuKi1cXGQrJC9dLFxufTtcblxuY29uc3QgaGFzQXR0cmlidXRlc1RvUmVtb3ZlID0gKGF0dHJpYnV0ZTogQXR0cik6IGJvb2xlYW4gPT5cbiAgYXR0cmlidXRlc1RvUmVtb3ZlUGF0dGVybnMuc29tZSgocmVtb3ZlUGF0dGVybikgPT5cbiAgICBhdHRyaWJ1dGUubmFtZS5zdGFydHNXaXRoKHJlbW92ZVBhdHRlcm4pLFxuICApO1xuXG5jb25zdCBoYXNBdHRyaWJ1dGVzVG9DbGVhbiA9IChhdHRyaWJ1dGU6IEF0dHIpOiBib29sZWFuID0+XG4gIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRyaWJ1dGVzVG9DbGVhbiwgYXR0cmlidXRlLm5hbWUpO1xuXG5jb25zdCBhdHRyaWJ1dGVOZWVkc0NsZWFuaW5nID0gKGF0dHJpYnV0ZTogQXR0cik6IGJvb2xlYW4gPT5cbiAgaGFzQXR0cmlidXRlc1RvQ2xlYW4oYXR0cmlidXRlKSAmJlxuICBhdHRyaWJ1dGUudmFsdWVcbiAgICAuc3BsaXQoJyAnKVxuICAgIC5zb21lKChhdHRyVmFsdWUpID0+XG4gICAgICBhdHRyaWJ1dGVzVG9DbGVhblthdHRyaWJ1dGUubmFtZV0uc29tZSgoYXR0cmlidXRlQ2xlYW5SZWdleCkgPT5cbiAgICAgICAgYXR0cmlidXRlQ2xlYW5SZWdleC50ZXN0KGF0dHJWYWx1ZSksXG4gICAgICApLFxuICAgICk7XG5cbmNvbnN0IHNob3VsZFNlcmlhbGl6ZUVsZW1lbnQgPSAobm9kZTogRWxlbWVudCk6IGJvb2xlYW4gPT4ge1xuICBpZiAobm9kZS5wYXJlbnRFbGVtZW50Py50YWdOYW1lID09PSAnQk9EWScgJiYgbm9kZS5oYXNBdHRyaWJ1dGUoJ2lkJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKG5vZGUuYXR0cmlidXRlcykuc29tZShcbiAgICAoYXR0cmlidXRlKSA9PlxuICAgICAgaGFzQXR0cmlidXRlc1RvUmVtb3ZlKGF0dHJpYnV0ZSkgfHwgYXR0cmlidXRlTmVlZHNDbGVhbmluZyhhdHRyaWJ1dGUpLFxuICApO1xufTtcblxuZnVuY3Rpb24gY2xlYW5Bbmd1bGFyRWxlbWVudEF0dHJpYnV0ZXMobm9kZTogRWxlbWVudCk6IEVsZW1lbnQge1xuICBjb25zdCBub2RlQ29weSA9IG5vZGUuY2xvbmVOb2RlKHRydWUpIGFzIEVsZW1lbnQ7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGVDb3B5LCBDTEVBTkVEX0VMRU1FTlRfTUFSS0VSLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiB0cnVlLFxuICB9KTtcblxuICBpZiAobm9kZS5wYXJlbnRFbGVtZW50Py50YWdOYW1lID09PSAnQk9EWScpIHtcbiAgICBub2RlQ29weS5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7XG4gIH1cblxuICBBcnJheS5mcm9tKG5vZGVDb3B5LmF0dHJpYnV0ZXMpLmZvckVhY2goKGF0dHJpYnV0ZSkgPT4ge1xuICAgIGlmIChoYXNBdHRyaWJ1dGVzVG9SZW1vdmUoYXR0cmlidXRlKSkge1xuICAgICAgbm9kZUNvcHkucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZS5uYW1lKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaGFzQXR0cmlidXRlc1RvQ2xlYW4oYXR0cmlidXRlKSkge1xuICAgICAgY29uc3QgY2xlYW5lZFZhbHVlID0gYXR0cmlidXRlLnZhbHVlXG4gICAgICAgIC5zcGxpdCgnICcpXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGF0dHJWYWx1ZSkgPT5cbiAgICAgICAgICAgICFhdHRyaWJ1dGVzVG9DbGVhblthdHRyaWJ1dGUubmFtZV0uc29tZSgoYXR0cmlidXRlQ2xlYW5SZWdleCkgPT5cbiAgICAgICAgICAgICAgYXR0cmlidXRlQ2xlYW5SZWdleC50ZXN0KGF0dHJWYWx1ZSksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5qb2luKCcgJyk7XG5cbiAgICAgIGlmIChjbGVhbmVkVmFsdWUgPT09ICcnKSB7XG4gICAgICAgIG5vZGVDb3B5LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZUNvcHkuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZS5uYW1lLCBjbGVhbmVkVmFsdWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG5vZGVDb3B5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTm9OZ0F0dHJpYnV0ZXNTbmFwc2hvdFNlcmlhbGl6ZXIoKTogU25hcHNob3RTZXJpYWxpemVyIHtcbiAgcmV0dXJuIHtcbiAgICBzZXJpYWxpemUodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcik6IHN0cmluZyB7XG4gICAgICBjb25zdCBjbGVhbmVkTm9kZSA9IGNsZWFuQW5ndWxhckVsZW1lbnRBdHRyaWJ1dGVzKHZhbCk7XG5cbiAgICAgIGlmIChzaG91bGRTZXJpYWxpemVFbGVtZW50KGNsZWFuZWROb2RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vTmdBdHRyaWJ1dGVzIHNlcmlhbGl6ZXIgZGlkIG5vdCBzdGFiaWxpemUgZm9yIDwke2NsZWFuZWROb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKX0+YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByaW50ZXIoY2xlYW5lZE5vZGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzKTtcbiAgICB9LFxuICAgIHRlc3QodmFsKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBtYXRjaGVzID1cbiAgICAgICAgdHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHZhbCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgISh2YWwgYXMgRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtDTEVBTkVEX0VMRU1FTlRfTUFSS0VSXSAmJlxuICAgICAgICBzaG91bGRTZXJpYWxpemVFbGVtZW50KHZhbCk7XG5cbiAgICAgIHJldHVybiBtYXRjaGVzO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -1,6 +1,7 @@
1
1
  <% if (majorAngularVersion > 20) { %>
2
2
  import '@angular/compiler';
3
3
  import '@analogjs/vitest-angular/setup-snapshots';
4
+ import '@analogjs/vitest-angular/setup-serializers';
4
5
  import { setupTestBed } from '@analogjs/vitest-angular/setup-testbed';
5
6
 
6
7
  <% if (browserMode) { %>
@@ -1,4 +1,4 @@
1
- export declare const ANALOG_JS_VITE_PLUGIN_ANGULAR = "^2.4.0-beta.9";
1
+ export declare const ANALOG_JS_VITE_PLUGIN_ANGULAR = "^2.4.1";
2
2
  export declare const JSDOM = "^22.0.0";
3
3
  export declare const VITE_TSCONFIG_PATHS = "^4.2.0";
4
4
  export declare const VITE = "^7.0.0";
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PLAYWRIGHT = exports.VITEST_BROWSER_PLAYWRIGHT = exports.VITEST_V4 = exports.VITE = exports.VITE_TSCONFIG_PATHS = exports.JSDOM = exports.ANALOG_JS_VITE_PLUGIN_ANGULAR = void 0;
4
4
  // Version constants (Angular 20+)
5
- exports.ANALOG_JS_VITE_PLUGIN_ANGULAR = '^2.4.0-beta.9';
5
+ exports.ANALOG_JS_VITE_PLUGIN_ANGULAR = '^2.4.1';
6
6
  exports.JSDOM = '^22.0.0';
7
7
  exports.VITE_TSCONFIG_PATHS = '^4.2.0';
8
8
  exports.VITE = '^7.0.0';
@@ -1 +1 @@
1
- {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../../../../../../../packages/vitest-angular-tools/src/schematics/utils/versions.ts"],"names":[],"mappings":";;;AAAA,kCAAkC;AACrB,QAAA,6BAA6B,GAAG,eAAe,CAAC;AAChD,QAAA,KAAK,GAAG,SAAS,CAAC;AAClB,QAAA,mBAAmB,GAAG,QAAQ,CAAC;AAC/B,QAAA,IAAI,GAAG,QAAQ,CAAC;AAChB,QAAA,SAAS,GAAG,QAAQ,CAAC;AAElC,4BAA4B;AACf,QAAA,yBAAyB,GAAG,QAAQ,CAAC;AACrC,QAAA,UAAU,GAAG,SAAS,CAAC"}
1
+ {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../../../../../../../packages/vitest-angular-tools/src/schematics/utils/versions.ts"],"names":[],"mappings":";;;AAAA,kCAAkC;AACrB,QAAA,6BAA6B,GAAG,QAAQ,CAAC;AACzC,QAAA,KAAK,GAAG,SAAS,CAAC;AAClB,QAAA,mBAAmB,GAAG,QAAQ,CAAC;AAC/B,QAAA,IAAI,GAAG,QAAQ,CAAC;AAChB,QAAA,SAAS,GAAG,QAAQ,CAAC;AAElC,4BAA4B;AACf,QAAA,yBAAyB,GAAG,QAAQ,CAAC;AACrC,QAAA,UAAU,GAAG,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ import '../setup-vitest';
2
+ import '@angular/compiler';
@@ -0,0 +1,9 @@
1
+ import '../setup-vitest';
2
+ import '@angular/compiler';
3
+ /**
4
+ * Initialize TestBed for all tests inside of vitest-angular
5
+ */
6
+ import { getTestBed } from '@angular/core/testing';
7
+ import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing';
8
+ getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1zZXR1cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3ZpdGVzdC1hbmd1bGFyL3NyYy90ZXN0LXNldHVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8saUJBQWlCLENBQUM7QUFDekIsT0FBTyxtQkFBbUIsQ0FBQztBQUUzQjs7R0FFRztBQUNILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLDZCQUE2QixHQUM5QixNQUFNLDJDQUEyQyxDQUFDO0FBRW5ELFVBQVUsRUFBRSxDQUFDLG1CQUFtQixDQUM5QiwyQkFBMkIsRUFDM0IsNkJBQTZCLEVBQUUsQ0FDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi4vc2V0dXAtdml0ZXN0JztcbmltcG9ydCAnQGFuZ3VsYXIvY29tcGlsZXInO1xuXG4vKipcbiAqIEluaXRpYWxpemUgVGVzdEJlZCBmb3IgYWxsIHRlc3RzIGluc2lkZSBvZiB2aXRlc3QtYW5ndWxhclxuICovXG5pbXBvcnQgeyBnZXRUZXN0QmVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS90ZXN0aW5nJztcbmltcG9ydCB7XG4gIEJyb3dzZXJEeW5hbWljVGVzdGluZ01vZHVsZSxcbiAgcGxhdGZvcm1Ccm93c2VyRHluYW1pY1Rlc3RpbmcsXG59IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYy90ZXN0aW5nJztcblxuZ2V0VGVzdEJlZCgpLmluaXRUZXN0RW52aXJvbm1lbnQoXG4gIEJyb3dzZXJEeW5hbWljVGVzdGluZ01vZHVsZSxcbiAgcGxhdGZvcm1Ccm93c2VyRHluYW1pY1Rlc3RpbmcoKSxcbik7XG4iXX0=