@analogjs/vitest-angular 1.4.0-beta.6 → 1.4.0-beta.7

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
@@ -58,7 +58,7 @@ export default defineConfig(({ mode }) => ({
58
58
  Next, define a `src/test-setup.ts` file to setup the `TestBed`:
59
59
 
60
60
  ```ts
61
- import '@analogjs/vitest-angular/setup';
61
+ import '@analogjs/vitest-angular/setup-zone';
62
62
 
63
63
  import {
64
64
  BrowserDynamicTestingModule,
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@analogjs/vitest-angular",
3
- "version": "1.4.0-beta.6",
3
+ "version": "1.4.0-beta.7",
4
4
  "description": "Vitest Builder for Angular",
5
5
  "type": "commonjs",
6
6
  "author": "Brandon Roberts <robertsbt@gmail.com>",
7
7
  "exports": {
8
8
  ".": "./src/index.js",
9
9
  "./package.json": "./package.json",
10
- "./setup": "./setup.js"
10
+ "./setup-zone": "./setup-zone.js"
11
11
  },
12
12
  "keywords": [
13
13
  "angular",
@@ -45,4 +45,4 @@
45
45
  ]
46
46
  },
47
47
  "main": "./src/index.js"
48
- }
48
+ }
@@ -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';
package/setup-zone.js ADDED
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("zone.js");
4
+ require("zone.js/plugins/sync-test");
5
+ require("zone.js/plugins/proxy");
6
+ require("zone.js/testing");
7
+ /**
8
+ * Patch Vitest's describe/test/beforeEach/afterEach functions so test code
9
+ * always runs in a testZone (ProxyZone).
10
+ */
11
+ /* global Zone */
12
+ const Zone = globalThis['Zone'];
13
+ if (Zone === undefined) {
14
+ throw new Error('Missing: Zone (zone.js)');
15
+ }
16
+ if (globalThis['__vitest_zone_patch__'] === true) {
17
+ throw new Error("'vitest' has already been patched with 'Zone'.");
18
+ }
19
+ globalThis['__vitest_zone_patch__'] = true;
20
+ const SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
21
+ const ProxyZoneSpec = Zone['ProxyZoneSpec'];
22
+ if (SyncTestZoneSpec === undefined) {
23
+ throw new Error('Missing: SyncTestZoneSpec (zone.js/plugins/sync-test)');
24
+ }
25
+ if (ProxyZoneSpec === undefined) {
26
+ throw new Error('Missing: ProxyZoneSpec (zone.js/plugins/proxy.js)');
27
+ }
28
+ const env = globalThis;
29
+ const ambientZone = Zone.current;
30
+ // Create a synchronous-only zone in which to run `describe` blocks in order to
31
+ // raise an error if any asynchronous operations are attempted
32
+ // inside of a `describe` but outside of a `beforeEach` or `it`.
33
+ const syncZone = ambientZone.fork(new SyncTestZoneSpec('vitest.describe'));
34
+ function wrapDescribeInZone(describeBody) {
35
+ return function (...args) {
36
+ return syncZone.run(describeBody, null, args);
37
+ };
38
+ }
39
+ // Create a proxy zone in which to run `test` blocks so that the tests function
40
+ // can retroactively install different zones.
41
+ const testProxyZone = ambientZone.fork(new ProxyZoneSpec());
42
+ function wrapTestInZone(testBody) {
43
+ if (testBody === undefined) {
44
+ return;
45
+ }
46
+ const wrappedFunc = function () {
47
+ return testProxyZone.run(testBody, null, arguments);
48
+ };
49
+ try {
50
+ Object.defineProperty(wrappedFunc, 'length', {
51
+ configurable: true,
52
+ writable: true,
53
+ enumerable: false,
54
+ });
55
+ wrappedFunc.length = testBody.length;
56
+ }
57
+ catch (e) {
58
+ return testBody.length === 0
59
+ ? () => testProxyZone.run(testBody, null)
60
+ : (done) => testProxyZone.run(testBody, null, [done]);
61
+ }
62
+ return wrappedFunc;
63
+ }
64
+ /**
65
+ * Allows Vitest to handle Angular test fixtures
66
+ *
67
+ * Vitest Snapshot guide ==> https://vitest.dev/guide/snapshot.html
68
+ *
69
+ * @returns customSnapshotSerializer for Angular Fixture Component
70
+ */
71
+ const customSnapshotSerializer = () => {
72
+ function serialize(val, config, indentation, depth, refs, printer) {
73
+ // `printer` is a function that serializes a value using existing plugins.
74
+ return `${printer(fixtureVitestSerializer(val), config, indentation, depth, refs)}`;
75
+ }
76
+ function test(val) {
77
+ // * If it's a ComponentFixture we apply the transformation rules
78
+ return val && isAngularFixture(val);
79
+ }
80
+ return {
81
+ serialize,
82
+ test,
83
+ };
84
+ };
85
+ /**
86
+ * Check if is an Angular fixture
87
+ *
88
+ * @param val Angular fixture
89
+ * @returns boolean who check if is an angular fixture
90
+ */
91
+ function isAngularFixture(val) {
92
+ if (typeof val !== 'object') {
93
+ return false;
94
+ }
95
+ if (val['componentRef'] || val['componentInstance']) {
96
+ return true;
97
+ }
98
+ if (val['componentType']) {
99
+ return true;
100
+ }
101
+ // * Angular fixture keys in Fixture component Object
102
+ const fixtureKeys = [
103
+ 'componentRef',
104
+ 'ngZone',
105
+ 'effectRunner',
106
+ '_autoDetect',
107
+ '_isStable',
108
+ '_isDestroyed',
109
+ '_resolve',
110
+ '_promise',
111
+ '_onUnstableSubscription',
112
+ '_onStableSubscription',
113
+ '_onMicrotaskEmptySubscription',
114
+ '_onErrorSubscription',
115
+ 'changeDetectorRef',
116
+ 'elementRef',
117
+ 'debugElement',
118
+ 'componentInstance',
119
+ 'nativeElement',
120
+ ];
121
+ // * Angular fixture keys in Fixture componentRef Object
122
+ const fixtureComponentRefKeys = [
123
+ 'location',
124
+ '_rootLView',
125
+ '_tNode',
126
+ 'previousInputValues',
127
+ 'instance',
128
+ 'changeDetectorRef',
129
+ 'hostView',
130
+ 'componentType',
131
+ ];
132
+ return (JSON.stringify(Object.keys(val)) === JSON.stringify(fixtureKeys) ||
133
+ JSON.stringify(Object.keys(val)) === JSON.stringify(fixtureComponentRefKeys));
134
+ }
135
+ /**
136
+ * Serialize Angular fixture for Vitest
137
+ *
138
+ * @param fixture Angular Fixture Component
139
+ * @returns HTML Child Node
140
+ */
141
+ function fixtureVitestSerializer(fixture) {
142
+ // * Get Component meta data
143
+ const componentType = (fixture && fixture.componentType
144
+ ? fixture.componentType
145
+ : fixture.componentRef.componentType);
146
+ let inputsData = '';
147
+ const selector = Reflect.getOwnPropertyDescriptor(componentType, '__annotations__')?.value[0].selector;
148
+ if (componentType && componentType.propDecorators) {
149
+ inputsData = Object.entries(componentType.propDecorators)
150
+ .map(([key, value]) => `${key}="${value}"`)
151
+ .join('');
152
+ }
153
+ // * Get DOM Elements
154
+ const divElement = fixture && fixture.nativeElement
155
+ ? fixture.nativeElement
156
+ : fixture.location.nativeElement;
157
+ // * Convert string data to HTML data
158
+ const doc = new DOMParser().parseFromString(`<${selector} ${inputsData}>${divElement.innerHTML}</${selector}>`, 'text/html');
159
+ return doc.body.childNodes[0];
160
+ }
161
+ /**
162
+ * bind describe method to wrap describe.each function
163
+ */
164
+ const bindDescribe = (originalVitestFn) => function (...eachArgs) {
165
+ return function (...args) {
166
+ args[1] = wrapDescribeInZone(args[1]);
167
+ // @ts-ignore
168
+ return originalVitestFn.apply(this, eachArgs).apply(this, args);
169
+ };
170
+ };
171
+ /**
172
+ * bind test method to wrap test.each function
173
+ */
174
+ const bindTest = (originalVitestFn) => function (...eachArgs) {
175
+ return function (...args) {
176
+ args[1] = wrapTestInZone(args[1]);
177
+ // @ts-ignore
178
+ return originalVitestFn.apply(this, eachArgs).apply(this, args);
179
+ };
180
+ };
181
+ ['describe'].forEach((methodName) => {
182
+ const originalvitestFn = env[methodName];
183
+ env[methodName] = function (...args) {
184
+ args[1] = wrapDescribeInZone(args[1]);
185
+ return originalvitestFn.apply(this, args);
186
+ };
187
+ env[methodName].each = bindDescribe(originalvitestFn.each);
188
+ if (methodName === 'describe') {
189
+ env[methodName].only = bindDescribe(originalvitestFn.only);
190
+ env[methodName].skip = bindDescribe(originalvitestFn.skip);
191
+ }
192
+ });
193
+ ['test', 'it'].forEach((methodName) => {
194
+ const originalvitestFn = env[methodName];
195
+ env[methodName] = function (...args) {
196
+ args[1] = wrapTestInZone(args[1]);
197
+ return originalvitestFn.apply(this, args);
198
+ };
199
+ env[methodName].each = bindTest(originalvitestFn.each);
200
+ env[methodName].only = bindTest(originalvitestFn.only);
201
+ env[methodName].skip = bindTest(originalvitestFn.skip);
202
+ if (methodName === 'test' || methodName === 'it') {
203
+ env[methodName].todo = function (...args) {
204
+ return originalvitestFn.todo.apply(this, args);
205
+ };
206
+ }
207
+ });
208
+ ['beforeEach', 'afterEach', 'beforeAll', 'afterAll'].forEach((methodName) => {
209
+ const originalvitestFn = env[methodName];
210
+ env[methodName] = function (...args) {
211
+ args[0] = wrapTestInZone(args[0]);
212
+ return originalvitestFn.apply(this, args);
213
+ };
214
+ });
215
+ ['expect'].forEach((methodName) => {
216
+ const originalvitestFn = env[methodName];
217
+ return originalvitestFn.addSnapshotSerializer(customSnapshotSerializer());
218
+ });
219
+ //# sourceMappingURL=setup-zone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-zone.js","sourceRoot":"","sources":["../../../packages/vitest-angular/setup-zone.ts"],"names":[],"mappings":"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"}