@analogjs/vitest-angular 2.4.0-beta.9 → 2.4.0
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 +9 -2
- package/package.json +3 -1
- package/setup-serializers.d.ts +1 -0
- package/setup-serializers.js +11 -0
- package/setup-snapshots.d.ts +1 -26
- package/setup-snapshots.js +7 -101
- package/setup-testbed.d.ts +10 -3
- package/setup-testbed.js +9 -4
- package/setup-vitest.d.ts +4 -0
- package/setup-vitest.js +116 -0
- package/snapshot-serializers.d.ts +1 -0
- package/snapshot-serializers.js +2 -0
- package/src/lib/snapshot-serializers/angular-fixture.d.ts +2 -0
- package/src/lib/snapshot-serializers/angular-fixture.js +88 -0
- package/src/lib/snapshot-serializers/html-comment.d.ts +2 -0
- package/src/lib/snapshot-serializers/html-comment.js +7 -0
- package/src/lib/snapshot-serializers/index.d.ts +3 -0
- package/src/lib/snapshot-serializers/index.js +4 -0
- package/src/lib/snapshot-serializers/no-ng-attributes.d.ts +4 -0
- package/src/lib/snapshot-serializers/no-ng-attributes.js +74 -0
- package/src/lib/tools/src/schematics/setup/files/src/test-setup.ts.template +1 -0
- package/src/lib/tools/src/schematics/utils/versions.d.ts +1 -1
- package/src/lib/tools/src/schematics/utils/versions.js +1 -1
- package/src/lib/tools/src/schematics/utils/versions.js.map +1 -1
- package/src/test-setup.d.ts +2 -0
- package/src/test-setup.js +9 -0
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
|
-
- `
|
|
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
|
-
|
|
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
|
|
3
|
+
"version": "2.4.0",
|
|
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==
|
package/setup-snapshots.d.ts
CHANGED
|
@@ -1,26 +1 @@
|
|
|
1
|
-
|
|
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 {};
|
package/setup-snapshots.js
CHANGED
|
@@ -1,104 +1,10 @@
|
|
|
1
|
-
|
|
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
|
|
102
|
-
|
|
4
|
+
const originalVitestFn = env[methodName];
|
|
5
|
+
if (!originalVitestFn) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
originalVitestFn.addSnapshotSerializer(createAngularFixtureSnapshotSerializer());
|
|
103
9
|
});
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtc25hcHNob3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvdml0ZXN0LWFuZ3VsYXIvc2V0dXAtc25hcHNob3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRW5GLE1BQU0sR0FBRyxHQUFHLFVBQWlCLENBQUM7QUFFOUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtJQUNoQyxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QixPQUFPO0lBQ1QsQ0FBQztJQUNELGdCQUFnQixDQUFDLHFCQUFxQixDQUNwQyxzQ0FBc0MsRUFBRSxDQUN6QyxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVBbmd1bGFyRml4dHVyZVNuYXBzaG90U2VyaWFsaXplciB9IGZyb20gJy4vc25hcHNob3Qtc2VyaWFsaXplcnMuanMnO1xuXG5jb25zdCBlbnYgPSBnbG9iYWxUaGlzIGFzIGFueTtcblxuWydleHBlY3QnXS5mb3JFYWNoKChtZXRob2ROYW1lKSA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsVml0ZXN0Rm4gPSBlbnZbbWV0aG9kTmFtZV07XG4gIGlmICghb3JpZ2luYWxWaXRlc3RGbikge1xuICAgIHJldHVybjtcbiAgfVxuICBvcmlnaW5hbFZpdGVzdEZuLmFkZFNuYXBzaG90U2VyaWFsaXplcihcbiAgICBjcmVhdGVBbmd1bGFyRml4dHVyZVNuYXBzaG90U2VyaWFsaXplcigpLFxuICApO1xufSk7XG4iXX0=
|
package/setup-testbed.d.ts
CHANGED
|
@@ -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(),
|
|
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,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtdGVzdGJlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3ZpdGVzdC1hbmd1bGFyL3NldHVwLXRlc3RiZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxRQUFRLEVBRVIsOEJBQThCLEdBQy9CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxlQUFlLElBQUksY0FBYyxFQUNqQyxVQUFVLEdBQ1gsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHNCQUFzQixHQUN2QixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRS9DLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQWUxRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEVBQzNCLFFBQVEsR0FBRyxJQUFJLEVBQ2YsU0FBUyxHQUFHLEVBQUUsRUFDZCxXQUFXLEdBQUcsS0FBSyxFQUNuQixRQUFRLE1BQ2UsRUFBRTtJQUN6QixVQUFVLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRWhDLElBQUksQ0FBRSxVQUFrQixDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztRQUMvQyxVQUFrQixDQUFDLHFCQUFxQixDQUFDLEdBQUcsSUFBSSxDQUFDO1FBUWxELElBQU0sVUFBVSxHQUFoQixNQUFNLFVBQVU7U0FBRyxDQUFBO1FBQWIsVUFBVTtZQU5mLFFBQVEsQ0FBQztnQkFDUixTQUFTLEVBQUU7b0JBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDdkQsR0FBRyxTQUFTO2lCQUNiO2FBQ0YsQ0FBQztXQUNJLFVBQVUsQ0FBRztRQUVuQixVQUFVLEVBQUUsQ0FBQyxtQkFBbUIsQ0FDOUIsQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsRUFDbEMsc0JBQXNCLEVBQUUsRUFDeEI7WUFDRSxRQUFRLEVBQUU7Z0JBQ1IsR0FBRyxFQUFFLGdCQUFnQixFQUFFLENBQUMsV0FBVyxFQUFFO2dCQUNyQyxHQUFHLFFBQVE7YUFDWjtTQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIE5nTW9kdWxlLFxuICBQcm92aWRlcixcbiAgcHJvdmlkZVpvbmVsZXNzQ2hhbmdlRGV0ZWN0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIMm1Z2V0Q2xlYW51cEhvb2sgYXMgZ2V0Q2xlYW51cEhvb2ssXG4gIGdldFRlc3RCZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUvdGVzdGluZyc7XG5pbXBvcnQge1xuICBCcm93c2VyVGVzdGluZ01vZHVsZSxcbiAgcGxhdGZvcm1Ccm93c2VyVGVzdGluZyxcbn0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci90ZXN0aW5nJztcbmltcG9ydCB7IGFmdGVyRWFjaCwgYmVmb3JlRWFjaCB9IGZyb20gJ3ZpdGVzdCc7XG5cbmNvbnN0IEFOR1VMQVJfVEVTVEJFRF9TRVRVUCA9IFN5bWJvbC5mb3IoJ3Rlc3RiZWQtc2V0dXAnKTtcblxudHlwZSBUZXN0QmVkU2V0dXBPcHRpb25zID0ge1xuICB6b25lbGVzcz86IGJvb2xlYW47XG4gIHByb3ZpZGVycz86IChQcm92aWRlciB8IEVudmlyb25tZW50UHJvdmlkZXJzKVtdO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGB0ZWFyZG93bi5kZXN0cm95QWZ0ZXJFYWNoYCBpbnN0ZWFkLlxuICAgKiBAc3Vuc2V0IDMuMC4wXG4gICAqL1xuICBicm93c2VyTW9kZT86IGJvb2xlYW47XG4gIHRlYXJkb3duPzoge1xuICAgIGRlc3Ryb3lBZnRlckVhY2g6IGJvb2xlYW47XG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBUZXN0QmVkKHtcbiAgem9uZWxlc3MgPSB0cnVlLFxuICBwcm92aWRlcnMgPSBbXSxcbiAgYnJvd3Nlck1vZGUgPSBmYWxzZSxcbiAgdGVhcmRvd24sXG59OiBUZXN0QmVkU2V0dXBPcHRpb25zID0ge30pIHtcbiAgYmVmb3JlRWFjaChnZXRDbGVhbnVwSG9vayhmYWxzZSkpO1xuICBhZnRlckVhY2goZ2V0Q2xlYW51cEhvb2sodHJ1ZSkpO1xuXG4gIGlmICghKGdsb2JhbFRoaXMgYXMgYW55KVtBTkdVTEFSX1RFU1RCRURfU0VUVVBdKSB7XG4gICAgKGdsb2JhbFRoaXMgYXMgYW55KVtBTkdVTEFSX1RFU1RCRURfU0VUVVBdID0gdHJ1ZTtcblxuICAgIEBOZ01vZHVsZSh7XG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgLi4uKHpvbmVsZXNzID8gW3Byb3ZpZGVab25lbGVzc0NoYW5nZURldGVjdGlvbigpXSA6IFtdKSxcbiAgICAgICAgLi4ucHJvdmlkZXJzLFxuICAgICAgXSxcbiAgICB9KVxuICAgIGNsYXNzIFRlc3RNb2R1bGUge31cblxuICAgIGdldFRlc3RCZWQoKS5pbml0VGVzdEVudmlyb25tZW50KFxuICAgICAgW0Jyb3dzZXJUZXN0aW5nTW9kdWxlLCBUZXN0TW9kdWxlXSxcbiAgICAgIHBsYXRmb3JtQnJvd3NlclRlc3RpbmcoKSxcbiAgICAgIHtcbiAgICAgICAgdGVhcmRvd246IHtcbiAgICAgICAgICAuLi57IGRlc3Ryb3lBZnRlckVhY2g6ICFicm93c2VyTW9kZSB9LFxuICAgICAgICAgIC4uLnRlYXJkb3duLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICB9XG59XG4iXX0=
|
package/setup-vitest.js
ADDED
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtdml0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvdml0ZXN0LWFuZ3VsYXIvc2V0dXAtdml0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLGlCQUFpQixDQUFDO0FBRXpCOzs7R0FHRztBQUNILGlCQUFpQjtBQUNqQixNQUFNLElBQUksR0FBSSxVQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXpDLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQsSUFBSyxVQUFrQixDQUFDLHVCQUF1QixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFQSxVQUFrQixDQUFDLHVCQUF1QixDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDbEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTVDLElBQUksZ0JBQWdCLEtBQUssU0FBUyxFQUFFLENBQUM7SUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFDRCxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztJQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVELE1BQU0sR0FBRyxHQUFHLFVBQWlCLENBQUM7QUFDOUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUVqQywrRUFBK0U7QUFDL0UsOERBQThEO0FBQzlELGdFQUFnRTtBQUNoRSxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0FBQzNFLFNBQVMsa0JBQWtCLENBQUMsWUFBaUI7SUFDM0MsT0FBTyxVQUFVLEdBQUcsSUFBUztRQUMzQixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLDZDQUE2QztBQUM3QyxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksYUFBYSxFQUFFLENBQUMsQ0FBQztBQUM1RCxTQUFTLGNBQWMsQ0FBQyxRQUFvQztJQUMxRCxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMzQixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHO1FBQ2xCLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQztRQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRTtZQUMzQyxZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsSUFBSTtZQUNkLFVBQVUsRUFBRSxLQUFLO1NBQ2xCLENBQUMsQ0FBQztRQUNILFdBQVcsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUN2QyxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzFCLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7WUFDekMsQ0FBQyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFlBQVksR0FBRyxDQUNuQixJQUFTLEVBQ1QsZ0JBU0MsRUFDRCxFQUFFLENBQ0YsVUFBVSxHQUFHLFFBQWE7SUFDeEIsT0FBTyxVQUFVLEdBQUcsSUFBVztRQUM3QixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEMsYUFBYTtRQUNiLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVKOztHQUVHO0FBQ0gsTUFBTSxRQUFRLEdBQUcsQ0FDZixJQUFTLEVBQ1QsZ0JBU0MsRUFDRCxFQUFFLENBQ0YsVUFBVSxHQUFHLFFBQWE7SUFDeEIsT0FBTyxVQUFVLEdBQUcsSUFBVztRQUM3QixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxDLGFBQWE7UUFDYixPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFSixDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO0lBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxVQUFVLEdBQUcsSUFBVztRQUN4QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEMsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQztJQUNGLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdFLElBQUksVUFBVSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUNqQyxnQkFBZ0IsRUFDaEIsZ0JBQWdCLENBQUMsSUFBSSxDQUN0QixDQUFDO1FBQ0YsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksR0FBRyxZQUFZLENBQ2pDLGdCQUFnQixFQUNoQixnQkFBZ0IsQ0FBQyxJQUFJLENBQ3RCLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFSCxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtJQUNwQyxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQVc7UUFDeEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsQyxPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDO0lBQ0YsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFekUsSUFBSSxVQUFVLEtBQUssTUFBTSxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNqRCxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxHQUFHLFVBQVUsR0FBRyxJQUFTO1lBQzNDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDO0FBRUgsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtJQUMxRSxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV6QyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQVc7UUFDeEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsQyxPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3pvbmUuanMnO1xuaW1wb3J0ICd6b25lLmpzL3BsdWdpbnMvc3luYy10ZXN0JztcbmltcG9ydCAnem9uZS5qcy9wbHVnaW5zL3Byb3h5JztcbmltcG9ydCAnem9uZS5qcy90ZXN0aW5nJztcblxuLyoqXG4gKiBQYXRjaCBWaXRlc3QncyBkZXNjcmliZS90ZXN0L2JlZm9yZUVhY2gvYWZ0ZXJFYWNoIGZ1bmN0aW9ucyBzbyB0ZXN0IGNvZGVcbiAqIGFsd2F5cyBydW5zIGluIGEgdGVzdFpvbmUgKFByb3h5Wm9uZSkuXG4gKi9cbi8qIGdsb2JhbCBab25lICovXG5jb25zdCBab25lID0gKGdsb2JhbFRoaXMgYXMgYW55KVsnWm9uZSddO1xuXG5pZiAoWm9uZSA9PT0gdW5kZWZpbmVkKSB7XG4gIHRocm93IG5ldyBFcnJvcignTWlzc2luZzogWm9uZSAoem9uZS5qcyknKTtcbn1cblxuaWYgKChnbG9iYWxUaGlzIGFzIGFueSlbJ19fdml0ZXN0X3pvbmVfcGF0Y2hfXyddID09PSB0cnVlKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIid2aXRlc3QnIGhhcyBhbHJlYWR5IGJlZW4gcGF0Y2hlZCB3aXRoICdab25lJy5cIik7XG59XG5cbihnbG9iYWxUaGlzIGFzIGFueSlbJ19fdml0ZXN0X3pvbmVfcGF0Y2hfXyddID0gdHJ1ZTtcbmNvbnN0IFN5bmNUZXN0Wm9uZVNwZWMgPSBab25lWydTeW5jVGVzdFpvbmVTcGVjJ107XG5jb25zdCBQcm94eVpvbmVTcGVjID0gWm9uZVsnUHJveHlab25lU3BlYyddO1xuXG5pZiAoU3luY1Rlc3Rab25lU3BlYyA9PT0gdW5kZWZpbmVkKSB7XG4gIHRocm93IG5ldyBFcnJvcignTWlzc2luZzogU3luY1Rlc3Rab25lU3BlYyAoem9uZS5qcy9wbHVnaW5zL3N5bmMtdGVzdCknKTtcbn1cbmlmIChQcm94eVpvbmVTcGVjID09PSB1bmRlZmluZWQpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nOiBQcm94eVpvbmVTcGVjICh6b25lLmpzL3BsdWdpbnMvcHJveHkuanMpJyk7XG59XG5cbmNvbnN0IGVudiA9IGdsb2JhbFRoaXMgYXMgYW55O1xuY29uc3QgYW1iaWVudFpvbmUgPSBab25lLmN1cnJlbnQ7XG5cbi8vIENyZWF0ZSBhIHN5bmNocm9ub3VzLW9ubHkgem9uZSBpbiB3aGljaCB0byBydW4gYGRlc2NyaWJlYCBibG9ja3MgaW4gb3JkZXIgdG9cbi8vIHJhaXNlIGFuIGVycm9yIGlmIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhcmUgYXR0ZW1wdGVkXG4vLyBpbnNpZGUgb2YgYSBgZGVzY3JpYmVgIGJ1dCBvdXRzaWRlIG9mIGEgYGJlZm9yZUVhY2hgIG9yIGBpdGAuXG5jb25zdCBzeW5jWm9uZSA9IGFtYmllbnRab25lLmZvcmsobmV3IFN5bmNUZXN0Wm9uZVNwZWMoJ3ZpdGVzdC5kZXNjcmliZScpKTtcbmZ1bmN0aW9uIHdyYXBEZXNjcmliZUluWm9uZShkZXNjcmliZUJvZHk6IGFueSkge1xuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueSkge1xuICAgIHJldHVybiBzeW5jWm9uZS5ydW4oZGVzY3JpYmVCb2R5LCBudWxsLCBhcmdzKTtcbiAgfTtcbn1cblxuLy8gQ3JlYXRlIGEgcHJveHkgem9uZSBpbiB3aGljaCB0byBydW4gYHRlc3RgIGJsb2NrcyBzbyB0aGF0IHRoZSB0ZXN0cyBmdW5jdGlvblxuLy8gY2FuIHJldHJvYWN0aXZlbHkgaW5zdGFsbCBkaWZmZXJlbnQgem9uZXMuXG5jb25zdCB0ZXN0UHJveHlab25lID0gYW1iaWVudFpvbmUuZm9yayhuZXcgUHJveHlab25lU3BlYygpKTtcbmZ1bmN0aW9uIHdyYXBUZXN0SW5ab25lKHRlc3RCb2R5OiBzdHJpbmcgfCBhbnlbXSB8IHVuZGVmaW5lZCkge1xuICBpZiAodGVzdEJvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHdyYXBwZWRGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0ZXN0UHJveHlab25lLnJ1bih0ZXN0Qm9keSwgbnVsbCwgYXJndW1lbnRzKTtcbiAgfTtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcHBlZEZ1bmMsICdsZW5ndGgnLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHdyYXBwZWRGdW5jLmxlbmd0aCA9IHRlc3RCb2R5Lmxlbmd0aDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0ZXN0Qm9keS5sZW5ndGggPT09IDBcbiAgICAgID8gKCkgPT4gdGVzdFByb3h5Wm9uZS5ydW4odGVzdEJvZHksIG51bGwpXG4gICAgICA6IChkb25lOiBhbnkpID0+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,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,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,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,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) { %>
|
|
@@ -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
|
|
5
|
+
exports.ANALOG_JS_VITE_PLUGIN_ANGULAR = '^2.4.0';
|
|
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,
|
|
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,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=
|