UNPKG

@analogjs/vitest-angular

Version:

Vitest Builder for Angular

119 lines 16.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); require("zone.js"); require("zone.js/plugins/sync-test"); require("zone.js/plugins/proxy"); require("zone.js/testing"); require("./setup-snapshots.js"); /** * Patch Vitest's describe/test/beforeEach/afterEach functions so test code * always runs in a testZone (ProxyZone). */ /* global Zone */ const Zone = globalThis['Zone']; if (Zone === undefined) { throw new Error('Missing: Zone (zone.js)'); } if (globalThis['__vitest_zone_patch__'] === true) { throw new Error("'vitest' has already been patched with 'Zone'."); } globalThis['__vitest_zone_patch__'] = true; const SyncTestZoneSpec = Zone['SyncTestZoneSpec']; const ProxyZoneSpec = Zone['ProxyZoneSpec']; if (SyncTestZoneSpec === undefined) { throw new Error('Missing: SyncTestZoneSpec (zone.js/plugins/sync-test)'); } if (ProxyZoneSpec === undefined) { throw new Error('Missing: ProxyZoneSpec (zone.js/plugins/proxy.js)'); } const env = globalThis; const ambientZone = Zone.current; // Create a synchronous-only zone in which to run `describe` blocks in order to // raise an error if any asynchronous operations are attempted // inside of a `describe` but outside of a `beforeEach` or `it`. const syncZone = ambientZone.fork(new SyncTestZoneSpec('vitest.describe')); function wrapDescribeInZone(describeBody) { return function (...args) { return syncZone.run(describeBody, null, args); }; } // Create a proxy zone in which to run `test` blocks so that the tests function // can retroactively install different zones. const testProxyZone = ambientZone.fork(new ProxyZoneSpec()); function wrapTestInZone(testBody) { if (testBody === undefined) { return; } const wrappedFunc = function () { return testProxyZone.run(testBody, null, arguments); }; try { Object.defineProperty(wrappedFunc, 'length', { configurable: true, writable: true, enumerable: false, }); wrappedFunc.length = testBody.length; } catch (e) { return testBody.length === 0 ? () => testProxyZone.run(testBody, null) : (done) => testProxyZone.run(testBody, null, [done]); } return wrappedFunc; } /** * bind describe method to wrap describe.each function */ const bindDescribe = (self, originalVitestFn) => function (...eachArgs) { return function (...args) { args[1] = wrapDescribeInZone(args[1]); // @ts-ignore return originalVitestFn.apply(self, eachArgs).apply(self, args); }; }; /** * bind test method to wrap test.each function */ const bindTest = (self, originalVitestFn) => function (...eachArgs) { return function (...args) { args[1] = wrapTestInZone(args[1]); // @ts-ignore return originalVitestFn.apply(self, eachArgs).apply(self, args); }; }; ['describe'].forEach((methodName) => { const originalvitestFn = env[methodName]; env[methodName] = function (...args) { args[1] = wrapDescribeInZone(args[1]); return originalvitestFn.apply(this, args); }; env[methodName].each = bindDescribe(originalvitestFn, originalvitestFn.each); if (methodName === 'describe') { env[methodName].only = bindDescribe(originalvitestFn, originalvitestFn.only); env[methodName].skip = bindDescribe(originalvitestFn, originalvitestFn.skip); } }); ['test', 'it'].forEach((methodName) => { const originalvitestFn = env[methodName]; env[methodName] = function (...args) { args[1] = wrapTestInZone(args[1]); return originalvitestFn.apply(this, args); }; env[methodName].each = bindTest(originalvitestFn, originalvitestFn.each); env[methodName].only = bindTest(originalvitestFn, originalvitestFn.only); env[methodName].skip = bindTest(originalvitestFn, originalvitestFn.skip); if (methodName === 'test' || methodName === 'it') { env[methodName].todo = function (...args) { return originalvitestFn.todo.apply(this, args); }; } }); ['beforeEach', 'afterEach', 'beforeAll', 'afterAll'].forEach((methodName) => { const originalvitestFn = env[methodName]; env[methodName] = function (...args) { args[0] = wrapTestInZone(args[0]); return originalvitestFn.apply(this, args); }; }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtem9uZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3ZpdGVzdC1hbmd1bGFyL3NldHVwLXpvbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQkFBaUI7QUFDakIscUNBQW1DO0FBQ25DLGlDQUErQjtBQUMvQiwyQkFBeUI7QUFFekIsZ0NBQThCO0FBQzlCOzs7R0FHRztBQUNILGlCQUFpQjtBQUNqQixNQUFNLElBQUksR0FBSSxVQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXpDLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQsSUFBSyxVQUFrQixDQUFDLHVCQUF1QixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFQSxVQUFrQixDQUFDLHVCQUF1QixDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDbEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTVDLElBQUksZ0JBQWdCLEtBQUssU0FBUyxFQUFFLENBQUM7SUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFDRCxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztJQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVELE1BQU0sR0FBRyxHQUFHLFVBQWlCLENBQUM7QUFDOUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUVqQywrRUFBK0U7QUFDL0UsOERBQThEO0FBQzlELGdFQUFn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Z0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFekUsSUFBSSxVQUFVLEtBQUssTUFBTSxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNqRCxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxHQUFHLFVBQVUsR0FBRyxJQUFTO1lBQzNDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDO0FBRUgsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtJQUMxRSxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV6QyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQVc7UUFDeEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsQyxPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3pvbmUuanMnO1xuaW1wb3J0ICd6b25lLmpzL3BsdWdpbnMvc3luYy10ZXN0JztcbmltcG9ydCAnem9uZS5qcy9wbHVnaW5zL3Byb3h5JztcbmltcG9ydCAnem9uZS5qcy90ZXN0aW5nJztcblxuaW1wb3J0ICcuL3NldHVwLXNuYXBzaG90cy5qcyc7XG4vKipcbiAqIFBhdGNoIFZpdGVzdCdzIGRlc2NyaWJlL3Rlc3QvYmVmb3JlRWFjaC9hZnRlckVhY2ggZnVuY3Rpb25zIHNvIHRlc3QgY29kZVxuICogYWx3YXlzIHJ1bnMgaW4gYSB0ZXN0Wm9uZSAoUHJveHlab25lKS5cbiAqL1xuLyogZ2xvYmFsIFpvbmUgKi9cbmNvbnN0IFpvbmUgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpWydab25lJ107XG5cbmlmIChab25lID09PSB1bmRlZmluZWQpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nOiBab25lICh6b25lLmpzKScpO1xufVxuXG5pZiAoKGdsb2JhbFRoaXMgYXMgYW55KVsnX192aXRlc3Rfem9uZV9wYXRjaF9fJ10gPT09IHRydWUpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiJ3ZpdGVzdCcgaGFzIGFscmVhZHkgYmVlbiBwYXRjaGVkIHdpdGggJ1pvbmUnLlwiKTtcbn1cblxuKGdsb2JhbFRoaXMgYXMgYW55KVsnX192aXRlc3Rfem9uZV9wYXRjaF9fJ10gPSB0cnVlO1xuY29uc3QgU3luY1Rlc3Rab25lU3BlYyA9IFpvbmVbJ1N5bmNUZXN0Wm9uZVNwZWMnXTtcbmNvbnN0IFByb3h5Wm9uZVNwZWMgPSBab25lWydQcm94eVpvbmVTcGVjJ107XG5cbmlmIChTeW5jVGVzdFpvbmVTcGVjID09PSB1bmRlZmluZWQpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nOiBTeW5jVGVzdFpvbmVTcGVjICh6b25lLmpzL3BsdWdpbnMvc3luYy10ZXN0KScpO1xufVxuaWYgKFByb3h5Wm9uZVNwZWMgPT09IHVuZGVmaW5lZCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmc6IFByb3h5Wm9uZVNwZWMgKHpvbmUuanMvcGx1Z2lucy9wcm94eS5qcyknKTtcbn1cblxuY29uc3QgZW52ID0gZ2xvYmFsVGhpcyBhcyBhbnk7XG5jb25zdCBhbWJpZW50Wm9uZSA9IFpvbmUuY3VycmVudDtcblxuLy8gQ3JlYXRlIGEgc3luY2hyb25vdXMtb25seSB6b25lIGluIHdoaWNoIHRvIHJ1biBgZGVzY3JpYmVgIGJsb2NrcyBpbiBvcmRlciB0b1xuLy8gcmFpc2UgYW4gZXJyb3IgaWYgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGFyZSBhdHRlbXB0ZWRcbi8vIGluc2lkZSBvZiBhIGBkZXNjcmliZWAgYnV0IG91dHNpZGUgb2YgYSBgYmVmb3JlRWFjaGAgb3IgYGl0YC5cbmNvbnN0IHN5bmNab25lID0gYW1iaWVudFpvbmUuZm9yayhuZXcgU3luY1Rlc3Rab25lU3BlYygndml0ZXN0LmRlc2NyaWJlJykpO1xuZnVuY3Rpb24gd3JhcERlc2NyaWJlSW5ab25lKGRlc2NyaWJlQm9keTogYW55KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJnczogYW55KSB7XG4gICAgcmV0dXJuIHN5bmNab25lLnJ1bihkZXNjcmliZUJvZHksIG51bGwsIGFyZ3MpO1xuICB9O1xufVxuXG4vLyBDcmVhdGUgYSBwcm94eSB6b25lIGluIHdoaWNoIHRvIHJ1biBgdGVzdGAgYmxvY2tzIHNvIHRoYXQgdGhlIHRlc3RzIGZ1bmN0aW9uXG4vLyBjYW4gcmV0cm9hY3RpdmVseSBpbnN0YWxsIGRpZmZlcmVudCB6b25lcy5cbmNvbnN0IHRlc3RQcm94eVpvbmUgPSBhbWJpZW50Wm9uZS5mb3JrKG5ldyBQcm94eVpvbmVTcGVjKCkpO1xuZnVuY3Rpb24gd3JhcFRlc3RJblpvbmUodGVzdEJvZHk6IHN0cmluZyB8IGFueVtdIHwgdW5kZWZpbmVkKSB7XG4gIGlmICh0ZXN0Qm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgd3JhcHBlZEZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRlc3RQcm94eVpvbmUucnVuKHRlc3RCb2R5LCBudWxsLCBhcmd1bWVudHMpO1xuICB9O1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkRnVuYywgJ2xlbmd0aCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgd3JhcHBlZEZ1bmMubGVuZ3RoID0gdGVzdEJvZHkubGVuZ3RoO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRlc3RCb2R5Lmxlbmd0aCA9PT0gMFxuICAgICAgPyAoKSA9PiB0ZXN0UHJveHlab25lLnJ1bih0ZXN0Qm9keSwgbnVsbClcbiAgICAgIDogKGRvbmU6IGFueSkgPT4gdGVzdFByb3h5Wm9uZS5ydW4odGVzdEJvZHksIG51bGwsIFtkb25lXSk7XG4gIH1cblxuICByZXR1cm4gd3JhcHBlZEZ1bmM7XG59XG5cbi8qKlxuICogYmluZCBkZXNjcmliZSBtZXRob2QgdG8gd3JhcCBkZXNjcmliZS5lYWNoIGZ1bmN0aW9uXG4gKi9cbmNvbnN0IGJpbmREZXNjcmliZSA9IChcbiAgc2VsZjogYW55LFxuICBvcmlnaW5hbFZpdGVzdEZuOiB7XG4gICAgYXBwbHk6IChcbiAgICAgIGFyZzA6IGFueSxcbiAgICAgIGFyZzE6IGFueVtdLFxuICAgICkgPT4ge1xuICAgICAgKCk6IGFueTtcbiAgICAgIG5ldyAoKTogYW55O1xuICAgICAgYXBwbHk6IHsgKGFyZzA6IGFueSwgYXJnMTogYW55W10pOiBhbnk7IG5ldyAoKTogYW55IH07XG4gICAgfTtcbiAgfSxcbikgPT5cbiAgZnVuY3Rpb24gKC4uLmVhY2hBcmdzOiBhbnkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBhcmdzWzFdID0gd3JhcERlc2NyaWJlSW5ab25lKGFyZ3NbMV0pO1xuXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4gb3JpZ2luYWxWaXRlc3RGbi5hcHBseShzZWxmLCBlYWNoQXJncykuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBiaW5kIHRlc3QgbWV0aG9kIHRvIHdyYXAgdGVzdC5lYWNoIGZ1bmN0aW9uXG4gKi9cbmNvbnN0IGJpbmRUZXN0ID0gKFxuICBzZWxmOiBhbnksXG4gIG9yaWdpbmFsVml0ZXN0Rm46IHtcbiAgICBhcHBseTogKFxuICAgICAgYXJnMDogYW55LFxuICAgICAgYXJnMTogYW55W10sXG4gICAgKSA9PiB7XG4gICAgICAoKTogYW55O1xuICAgICAgbmV3ICgpOiBhbnk7XG4gICAgICBhcHBseTogeyAoYXJnMDogYW55LCBhcmcxOiBhbnlbXSk6IGFueTsgbmV3ICgpOiBhbnkgfTtcbiAgICB9O1xuICB9LFxuKSA9PlxuICBmdW5jdGlvbiAoLi4uZWFjaEFyZ3M6IGFueSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAgIGFyZ3NbMV0gPSB3cmFwVGVzdEluWm9uZShhcmdzWzFdKTtcblxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIG9yaWdpbmFsVml0ZXN0Rm4uYXBwbHkoc2VsZiwgZWFjaEFyZ3MpLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH07XG4gIH07XG5cblsnZGVzY3JpYmUnXS5mb3JFYWNoKChtZXRob2ROYW1lKSA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsdml0ZXN0Rm4gPSBlbnZbbWV0aG9kTmFtZV07XG4gIGVudlttZXRob2ROYW1lXSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgIGFyZ3NbMV0gPSB3cmFwRGVzY3JpYmVJblpvbmUoYXJnc1sxXSk7XG5cbiAgICByZXR1cm4gb3JpZ2luYWx2aXRlc3RGbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfTtcbiAgZW52W21ldGhvZE5hbWVdLmVhY2ggPSBiaW5kRGVzY3JpYmUob3JpZ2luYWx2aXRlc3RGbiwgb3JpZ2luYWx2aXRlc3RGbi5lYWNoKTtcbiAgaWYgKG1ldGhvZE5hbWUgPT09ICdkZXNjcmliZScpIHtcbiAgICBlbnZbbWV0aG9kTmFtZV0ub25seSA9IGJpbmREZXNjcmliZShcbiAgICAgIG9yaWdpbmFsdml0ZXN0Rm4sXG4gICAgICBvcmlnaW5hbHZpdGVzdEZuLm9ubHksXG4gICAgKTtcbiAgICBlbnZbbWV0aG9kTmFtZV0uc2tpcCA9IGJpbmREZXNjcmliZShcbiAgICAgIG9yaWdpbmFsdml0ZXN0Rm4sXG4gICAgICBvcmlnaW5hbHZpdGVzdEZuLnNraXAsXG4gICAgKTtcbiAgfVxufSk7XG5cblsndGVzdCcsICdpdCddLmZvckVhY2goKG1ldGhvZE5hbWUpID0+IHtcbiAgY29uc3Qgb3JpZ2luYWx2aXRlc3RGbiA9IGVudlttZXRob2ROYW1lXTtcbiAgZW52W21ldGhvZE5hbWVdID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgYXJnc1sxXSA9IHdyYXBUZXN0SW5ab25lKGFyZ3NbMV0pO1xuXG4gICAgcmV0dXJuIG9yaWdpbmFsdml0ZXN0Rm4uYXBwbHkodGhpcywgYXJncyk7XG4gIH07XG4gIGVudlttZXRob2ROYW1lXS5lYWNoID0gYmluZFRlc3Qob3JpZ2luYWx2aXRlc3RGbiwgb3JpZ2luYWx2aXRlc3RGbi5lYWNoKTtcbiAgZW52W21ldGhvZE5hbWVdLm9ubHkgPSBiaW5kVGVzdChvcmlnaW5hbHZpdGVzdEZuLCBvcmlnaW5hbHZpdGVzdEZuLm9ubHkpO1xuICBlbnZbbWV0aG9kTmFtZV0uc2tpcCA9IGJpbmRUZXN0KG9yaWdpbmFsdml0ZXN0Rm4sIG9yaWdpbmFsdml0ZXN0Rm4uc2tpcCk7XG5cbiAgaWYgKG1ldGhvZE5hbWUgPT09ICd0ZXN0JyB8fCBtZXRob2ROYW1lID09PSAnaXQnKSB7XG4gICAgZW52W21ldGhvZE5hbWVdLnRvZG8gPSBmdW5jdGlvbiAoLi4uYXJnczogYW55KSB7XG4gICAgICByZXR1cm4gb3JpZ2luYWx2aXRlc3RGbi50b2RvLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gIH1cbn0pO1xuXG5bJ2JlZm9yZUVhY2gnLCAnYWZ0ZXJFYWNoJywgJ2JlZm9yZUFsbCcsICdhZnRlckFsbCddLmZvckVhY2goKG1ldGhvZE5hbWUpID0+IHtcbiAgY29uc3Qgb3JpZ2luYWx2aXRlc3RGbiA9IGVudlttZXRob2ROYW1lXTtcblxuICBlbnZbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICBhcmdzWzBdID0gd3JhcFRlc3RJblpvbmUoYXJnc1swXSk7XG5cbiAgICByZXR1cm4gb3JpZ2luYWx2aXRlc3RGbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfTtcbn0pO1xuIl19