From febca2e033fcbfb3fb6a261d4c6017ce30a899f4 Mon Sep 17 00:00:00 2001 From: Evyatar Date: Sat, 6 Jun 2020 16:41:31 +0300 Subject: [PATCH] patch: simplify singleton (#188) --- config/builds/vest.js | 4 +- config/eslint/spellCheckerSkip.js | 2 + package.json | 3 +- packages/n4s/dist/enforce.js | 17 +- packages/n4s/dist/enforce.min.js | 2 +- packages/n4s/dist/ensure.js | 20 +- packages/n4s/dist/ensure.min.js | 2 +- packages/n4s/dist/n4s.js | 15 +- packages/n4s/dist/n4s.min.js | 2 +- packages/vest/config/jest/jest.setup.js | 16 -- packages/vest/src/__snapshots__/spec.js.snap | 4 - packages/vest/src/constants/index.js | 1 - .../src/core/state/__snapshots__/spec.js.snap | 8 +- .../core/state/cleanupCompletedSuite/spec.js | 10 +- packages/vest/src/core/state/constants.js | 3 + .../vest/src/core/state/getSuiteState/spec.js | 4 +- packages/vest/src/core/state/index.js | 18 +- packages/vest/src/core/state/patch/spec.js | 6 +- .../vest/src/core/state/registerSuite/spec.js | 14 +- .../state/reset/__snapshots__/spec.js.snap | 178 +++++++++--------- packages/vest/src/core/state/reset/spec.js | 8 +- packages/vest/src/core/state/spec.js | 14 +- packages/vest/src/core/state/symbols.js | 3 - .../vest/src/core/test/lib/canceled/index.js | 8 +- .../vest/src/core/test/lib/canceled/spec.js | 10 +- .../vest/src/core/test/lib/pending/spec.js | 6 +- .../vest/src/core/test/runAsyncTest/index.js | 4 +- .../vest/src/core/test/runAsyncTest/spec.js | 10 +- packages/vest/src/index.js | 36 ++-- packages/vest/src/lib/id/index.js | 6 +- packages/vest/src/lib/singleton/constants.js | 9 + packages/vest/src/lib/singleton/index.js | 24 +-- packages/vest/src/lib/singleton/spec.js | 45 ++--- packages/vest/src/lib/singleton/symbols.js | 9 - packages/vest/testUtils/mock/index.js | 1 + .../resetState/__snapshots__/spec.js.snap | 4 +- packages/vest/testUtils/resetState/index.js | 4 +- packages/vest/testUtils/resetState/spec.js | 8 +- .../vest/testUtils/suiteIdByName/index.js | 4 +- yarn.lock | 61 +++--- 40 files changed, 283 insertions(+), 320 deletions(-) create mode 100644 packages/vest/src/core/state/constants.js delete mode 100644 packages/vest/src/core/state/symbols.js create mode 100644 packages/vest/src/lib/singleton/constants.js delete mode 100644 packages/vest/src/lib/singleton/symbols.js diff --git a/config/builds/vest.js b/config/builds/vest.js index 7d4751c39..e9db8ac75 100644 --- a/config/builds/vest.js +++ b/config/builds/vest.js @@ -41,10 +41,10 @@ const buildConfig = ({ format = DEFAULT_FORMAT, min = false } = {}) => ({ ] .filter(Boolean) .join('.'), - name: PACKAGE_NAME_VEST, format, + name: PACKAGE_NAME_VEST, }, plugins: min ? [...PLUGINS, terser()] : PLUGINS, }); -export default [buildConfig({ min: true }), buildConfig()]; +export default [buildConfig(), buildConfig({ min: true })]; diff --git a/config/eslint/spellCheckerSkip.js b/config/eslint/spellCheckerSkip.js index 13c62383e..28aca86a9 100644 --- a/config/eslint/spellCheckerSkip.js +++ b/config/eslint/spellCheckerSkip.js @@ -31,4 +31,6 @@ module.exports = [ 'utf8', 'writeable', 'lt', + 'iife', + 'namespace', ]; diff --git a/package.json b/package.json index f0d3880f6..1b3f4bc3c 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,8 @@ "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-replace": "^2.2.0", "rollup-plugin-terser": "^6.1.0", - "semver": "^7.3.2" + "semver": "^7.3.2", + "vest": "2.0.0-next-e063c9" }, "scripts": { "build": "rollup -c ./config/builds/index.js", diff --git a/packages/n4s/dist/enforce.js b/packages/n4s/dist/enforce.js index 1e48c4958..7fa87705e 100644 --- a/packages/n4s/dist/enforce.js +++ b/packages/n4s/dist/enforce.js @@ -1,10 +1,9 @@ 'use strict';(function(g,f){"object"===typeof exports&&"undefined"!==typeof module?module.exports=f():"function"===typeof define&&define.amd?define(f):(g=g||self,g.enforce=f())})(this,function(){function g(a){"@babel/helpers - typeof";g="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"===typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};return g(a)}function f(a,b,c){b in a?Object.defineProperty(a, -b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c;return a}function k(){k=Object.assign||function(a){for(var b=1;bNumber(b)}function q(a,b){return d(a)&&d(b)&&Number(a)>=Number(b)}function r(a,b){return Array.isArray(b)&&-1!==["string","number","boolean"].indexOf(g(a))||"string"===typeof b&&"string"===typeof a?-1!==b.indexOf(a):!1}function t(a){return!!Array.isArray(a)}function u(a){return a?d(a)?0===a:Object.prototype.hasOwnProperty.call(a,"length")?0===a.length:"object"===g(a)?0===Object.keys(a).length:!0:!0}function v(a){return"number"===typeof a}function w(a){return"string"=== -typeof a}function x(a){return!!a}function y(a,b){return a.length===b}function z(a,b){return d(a)&&d(b)&&Number(a)b},longerThanOrEquals:function(a,b){return a.length>=b},matches:B,numberEquals:C,shorterThan:function(a, -b){return a.lengthNumber(b)}function p(a,b){return d(a)&&d(b)&&Number(a)>=Number(b)}function q(a,b){return Array.isArray(b)&&-1!==["string","number","boolean"].indexOf(g(a))||"string"===typeof b&&"string"===typeof a?-1!==b.indexOf(a):!1}function r(a){return!!Array.isArray(a)}function t(a){return a?d(a)?0===a:Object.prototype.hasOwnProperty.call(a,"length")?0===a.length:"object"===g(a)?0===Object.keys(a).length:!0:!0}function u(a){return"number"===typeof a}function v(a){return"string"=== +typeof a}function w(a){return!!a}function x(a,b){return a.length===b}function y(a,b){return d(a)&&d(b)&&Number(a)b},longerThanOrEquals:function(a,b){return a.length>=b},matches:A,numberEquals:B,shorterThan:function(a,b){return a.lengthNumber(n)}function c(t,n){return u(t)&&u(n)&&Number(t)>=Number(n)}function f(n,e){return!!(Array.isArray(e)&&-1!==["string","number","boolean"].indexOf(t(n))||"string"==typeof e&&"string"==typeof n)&&-1!==e.indexOf(n)}function s(t){return!!Array.isArray(t)}function l(n){return!n||(u(n)?0===n:Object.prototype.hasOwnProperty.call(n,"length")?0===n.length:"object"!==t(n)||0===Object.keys(n).length)}function y(t){return"number"==typeof t}function p(t){return"string"==typeof t}function g(t){return!!t}function m(t,n){return t.length===n}function b(t,n){return u(t)&&u(n)&&Number(t)n},longerThanOrEquals:function(t,n){return t.length>=n},matches:v,numberEquals:O,shorterThan:function(t,n){return t.lengthNumber(n)}function a(t,n){return i(t)&&i(n)&&Number(t)>=Number(n)}function f(n,r){return!!(Array.isArray(r)&&-1!==["string","number","boolean"].indexOf(t(n))||"string"==typeof r&&"string"==typeof n)&&-1!==r.indexOf(n)}function s(t){return!!Array.isArray(t)}function l(n){return!n||(i(n)?0===n:Object.prototype.hasOwnProperty.call(n,"length")?0===n.length:"object"!==t(n)||0===Object.keys(n).length)}function y(t){return"number"==typeof t}function p(t){return"string"==typeof t}function b(t){return!!t}function g(t,n){return t.length===n}function m(t,n){return i(t)&&i(n)&&Number(t)n},longerThanOrEquals:function(t,n){return t.length>=n},matches:v,numberEquals:O,shorterThan:function(t,n){return t.lengtha.length)b=a.length;for(var c= -0,e=Array(b);cNumber(b)}function r(a,b){return d(a)&&d(b)&&Number(a)>=Number(b)}function t(a,b){return Array.isArray(b)&&-1!==["string","number","boolean"].indexOf(f(a))||"string"===typeof b&&"string"===typeof a?-1!==b.indexOf(a):!1}function u(a){return!!Array.isArray(a)} -function v(a){return a?d(a)?0===a:Object.prototype.hasOwnProperty.call(a,"length")?0===a.length:"object"===f(a)?0===Object.keys(a).length:!0:!0}function w(a){return"number"===typeof a}function x(a){return"string"===typeof a}function y(a){return!!a}function z(a,b){return a.length===b}function A(a,b){return d(a)&&d(b)&&Number(a)b},longerThanOrEquals:function(a,b){return a.length>=b},matches:C,numberEquals:D,shorterThan:function(a,b){return a.lengtha.length)b=a.length;for(var c= +0,e=Array(b);cNumber(b)}function q(a,b){return d(a)&&d(b)&&Number(a)>=Number(b)}function r(a,b){return Array.isArray(b)&&-1!==["string","number","boolean"].indexOf(f(a))||"string"===typeof b&&"string"===typeof a?-1!==b.indexOf(a):!1}function t(a){return!!Array.isArray(a)} +function u(a){return a?d(a)?0===a:Object.prototype.hasOwnProperty.call(a,"length")?0===a.length:"object"===f(a)?0===Object.keys(a).length:!0:!0}function v(a){return"number"===typeof a}function w(a){return"string"===typeof a}function x(a){return!!a}function y(a,b){return a.length===b}function z(a,b){return d(a)&&d(b)&&Number(a)b},longerThanOrEquals:function(a,b){return a.length>=b},matches:B,numberEquals:C,shorterThan:function(a,b){return a.lengtht.length)&&(r=t.length);for(var n=0,e=Array(r);nNumber(r)}function s(t,r){return a(t)&&a(r)&&Number(t)>=Number(r)}function f(r,n){return!!(Array.isArray(n)&&-1!==["string","number","boolean"].indexOf(t(r))||"string"==typeof n&&"string"==typeof r)&&-1!==n.indexOf(r)}function l(t){return!!Array.isArray(t)}function y(r){return!r||(a(r)?0===r:Object.prototype.hasOwnProperty.call(r,"length")?0===r.length:"object"!==t(r)||0===Object.keys(r).length)}function p(t){return"number"==typeof t}function m(t){return"string"==typeof t}function b(t){return!!t}function g(t,r){return t.length===r}function h(t,r){return a(t)&&a(r)&&Number(t)r},longerThanOrEquals:function(t,r){return t.length>=r},matches:O,numberEquals:d,shorterThan:function(t,r){return t.lengthr.length)&&(t=r.length);for(var e=0,n=Array(t);eNumber(t)}function f(r,t){return a(r)&&a(t)&&Number(r)>=Number(t)}function s(t,e){return!!(Array.isArray(e)&&-1!==["string","number","boolean"].indexOf(r(t))||"string"==typeof e&&"string"==typeof t)&&-1!==e.indexOf(t)}function l(r){return!!Array.isArray(r)}function y(t){return!t||(a(t)?0===t:Object.prototype.hasOwnProperty.call(t,"length")?0===t.length:"object"!==r(t)||0===Object.keys(t).length)}function p(r){return"number"==typeof r}function b(r){return"string"==typeof r}function m(r){return!!r}function g(r,t){return r.length===t}function h(r,t){return a(r)&&a(t)&&Number(r)t},longerThanOrEquals:function(r,t){return r.length>=t},matches:O,numberEquals:d,shorterThan:function(r,t){return r.lengtha.length)b=a.length;for(var c= 0,d=Array(b);cNumber(b)}function x(a,b){return e(a)&&e(b)&&Number(a)>=Number(b)}function y(a,b){return Array.isArray(b)&&-1!==["string","number","boolean"].indexOf(h(a))||"string"===typeof b&&"string"===typeof a?-1!==b.indexOf(a):!1}function z(a){return!!Array.isArray(a)} function A(a){return a?e(a)?0===a:Object.prototype.hasOwnProperty.call(a,"length")?0===a.length:"object"===h(a)?0===Object.keys(a).length:!0:!0}function B(a){return"number"===typeof a}function C(a){return"string"===typeof a}function D(a){return!!a}function E(a,b){return a.length===b}function F(a,b){return e(a)&&e(b)&&Number(a)b},longerThanOrEquals:function(a,b){return a.length>=b},matches:H,numberEquals:I,shorterThan:function(a, -b){return a.lengthb},longerThanOrEquals:function(a,b){return a.length>=b},matches:H,numberEquals:I,shorterThan:function(a,b){return a.lengthr.length)&&(t=r.length);for(var n=0,e=Array(t);nNumber(t)}function f(r,t){return a(r)&&a(t)&&Number(r)>=Number(t)}function s(t,n){return!!(Array.isArray(n)&&-1!==["string","number","boolean"].indexOf(r(t))||"string"==typeof n&&"string"==typeof t)&&-1!==n.indexOf(t)}function l(r){return!!Array.isArray(r)}function y(t){return!t||(a(t)?0===t:Object.prototype.hasOwnProperty.call(t,"length")?0===t.length:"object"!==r(t)||0===Object.keys(t).length)}function p(r){return"number"==typeof r}function g(r){return"string"==typeof r}function m(r){return!!r}function b(r,t){return r.length===t}function v(r,t){return a(r)&&a(t)&&Number(r)t},longerThanOrEquals:function(r,t){return r.length>=t},matches:d,numberEquals:O,shorterThan:function(r,t){return r.lengthr.length)&&(t=r.length);for(var n=0,e=Array(t);nNumber(t)}function f(r,t){return a(r)&&a(t)&&Number(r)>=Number(t)}function s(t,n){return!!(Array.isArray(n)&&-1!==["string","number","boolean"].indexOf(r(t))||"string"==typeof n&&"string"==typeof t)&&-1!==n.indexOf(t)}function l(r){return!!Array.isArray(r)}function y(t){return!t||(a(t)?0===t:Object.prototype.hasOwnProperty.call(t,"length")?0===t.length:"object"!==r(t)||0===Object.keys(t).length)}function p(r){return"number"==typeof r}function b(r){return"string"==typeof r}function g(r){return!!r}function m(r,t){return r.length===t}function v(r,t){return a(r)&&a(t)&&Number(r)t},longerThanOrEquals:function(r,t){return r.length>=t},matches:d,numberEquals:O,shorterThan:function(r,t){return r.length { - jest.resetModules(); - jest.mock(packagePath('vest/src/core/state/symbols'), () => ({ - __esModule: true, - ...MOCK_SYMBOLS, - })); -}; - -mockSymbols(); - global.VEST_VERSION = version; // Registers global instance diff --git a/packages/vest/src/__snapshots__/spec.js.snap b/packages/vest/src/__snapshots__/spec.js.snap index 4b23a8395..e5be2d066 100644 --- a/packages/vest/src/__snapshots__/spec.js.snap +++ b/packages/vest/src/__snapshots__/spec.js.snap @@ -155,9 +155,5 @@ Object { "test": [Function], "validate": [Function], "warn": [Function], - Symbol(mock_vest_state): Object { - Symbol(mock_vest_suites): Object {}, - Symbol(mock_vest_canceled): Object {}, - }, } `; diff --git a/packages/vest/src/constants/index.js b/packages/vest/src/constants/index.js index c159efb76..b34ebed11 100644 --- a/packages/vest/src/constants/index.js +++ b/packages/vest/src/constants/index.js @@ -1,3 +1,2 @@ -export const VERSION = VEST_VERSION; export const OPERATION_MODE_STATELESS = 'STATELESS'; export const OPERATION_MODE_STATEFUL = 'STATEFUL'; diff --git a/packages/vest/src/core/state/__snapshots__/spec.js.snap b/packages/vest/src/core/state/__snapshots__/spec.js.snap index 142e2374f..11110f2ee 100644 --- a/packages/vest/src/core/state/__snapshots__/spec.js.snap +++ b/packages/vest/src/core/state/__snapshots__/spec.js.snap @@ -2,14 +2,14 @@ exports[`Module: state state.register When state does not exist Should keep state untouched 1`] = ` Object { - Symbol(mock_vest_suites): Object {}, - Symbol(mock_vest_canceled): Object {}, + "_canceled": Object {}, + "_suites": Object {}, } `; exports[`Module: state state.register When state exists Should keep state untouched 1`] = ` Object { - Symbol(mock_vest_suites): Object {}, - Symbol(mock_vest_canceled): Object {}, + "_canceled": Object {}, + "_suites": Object {}, } `; diff --git a/packages/vest/src/core/state/cleanupCompletedSuite/spec.js b/packages/vest/src/core/state/cleanupCompletedSuite/spec.js index 407c3c73d..53748bf9a 100644 --- a/packages/vest/src/core/state/cleanupCompletedSuite/spec.js +++ b/packages/vest/src/core/state/cleanupCompletedSuite/spec.js @@ -4,7 +4,7 @@ import { OPERATION_MODE_STATEFUL, OPERATION_MODE_STATELESS, } from '../../../constants'; -import { SYMBOL_SUITES } from '../symbols'; +import { KEY_SUITES } from '../constants'; import cleanupCompletedSuite from '.'; const suiteName = 'suite_1'; @@ -39,11 +39,11 @@ describe('cleanupCompletedSuite', () => { runRegisterSuite(defaultContext); }); it('Should remove suite from state', () => { - expect(getState()[SYMBOL_SUITES]).toHaveProperty(suiteId); - expect(getState()[SYMBOL_SUITES]).toHaveProperty(suiteId_2); + expect(getState()[KEY_SUITES]).toHaveProperty(suiteId); + expect(getState()[KEY_SUITES]).toHaveProperty(suiteId_2); cleanupCompletedSuite(suiteId_2); - expect(getState()[SYMBOL_SUITES]).not.toHaveProperty(suiteId_2); - expect(getState()[SYMBOL_SUITES]).toHaveProperty(suiteId); + expect(getState()[KEY_SUITES]).not.toHaveProperty(suiteId_2); + expect(getState()[KEY_SUITES]).toHaveProperty(suiteId); }); }); }); diff --git a/packages/vest/src/core/state/constants.js b/packages/vest/src/core/state/constants.js new file mode 100644 index 000000000..773779aff --- /dev/null +++ b/packages/vest/src/core/state/constants.js @@ -0,0 +1,3 @@ +export const KEY_STATE = '$vestState'; +export const KEY_SUITES = '_suites'; +export const KEY_CANCELED = '_canceled'; diff --git a/packages/vest/src/core/state/getSuiteState/spec.js b/packages/vest/src/core/state/getSuiteState/spec.js index 4ea4af36d..621cdf521 100644 --- a/packages/vest/src/core/state/getSuiteState/spec.js +++ b/packages/vest/src/core/state/getSuiteState/spec.js @@ -1,6 +1,6 @@ import { getState } from '..'; import runRegisterSuite from '../../../../testUtils/runRegisterSuite'; -import { SYMBOL_SUITES } from '../symbols'; +import { KEY_SUITES } from '../constants'; import getSuiteState from '.'; const suiteName = 'suite_1'; @@ -11,7 +11,7 @@ describe('getSuiteState', () => { it('Should return current suite state by key', () => { runRegisterSuite({ name: suiteName, suiteId }); runRegisterSuite({ name: suiteName, suiteId: suiteId_2 }); - const [currentState] = getState(SYMBOL_SUITES)[suiteId]; + const [currentState] = getState(KEY_SUITES)[suiteId]; expect(getSuiteState(suiteId)).toBe(currentState); }); }); diff --git a/packages/vest/src/core/state/index.js b/packages/vest/src/core/state/index.js index 0534f57a3..d595b2596 100644 --- a/packages/vest/src/core/state/index.js +++ b/packages/vest/src/core/state/index.js @@ -1,14 +1,14 @@ import singleton from '../../lib/singleton'; -import { SYMBOL_STATE, SYMBOL_CANCELED, SYMBOL_SUITES } from './symbols'; +import { KEY_STATE, KEY_CANCELED, KEY_SUITES } from './constants'; /** * Registers a new state on Vest's singleton. */ const register = () => { singleton.set( - SYMBOL_STATE, - singleton.use(SYMBOL_STATE) ?? { - [SYMBOL_SUITES]: {}, - [SYMBOL_CANCELED]: {}, + KEY_STATE, + singleton.use(KEY_STATE) ?? { + [KEY_SUITES]: {}, + [KEY_CANCELED]: {}, } ); }; @@ -18,7 +18,7 @@ const register = () => { * @param {string} [key] state portion to retrieve. */ export const getState = key => - key ? singleton.use(SYMBOL_STATE)[key] : singleton.use(SYMBOL_STATE); + key ? singleton.use(KEY_STATE)[key] : singleton.use(KEY_STATE); /** * Updates the state with the value return from the setter callback. @@ -26,7 +26,7 @@ export const getState = key => * @returns {Object} updated state. */ export const setState = setter => { - singleton.set(SYMBOL_STATE, setter(getState())); + singleton.set(KEY_STATE, setter(getState())); return getState(); }; @@ -34,7 +34,7 @@ export const setState = setter => { /** * @returns {Object} all the suites in the state. */ -export const getSuites = () => getState(SYMBOL_SUITES); +export const getSuites = () => getState(KEY_SUITES); /** * Updates the state with the output of the setter callback. @@ -43,7 +43,7 @@ export const getSuites = () => getState(SYMBOL_SUITES); */ export const setSuites = setter => { setState(state => { - state[SYMBOL_SUITES] = setter(state[SYMBOL_SUITES]); + state[KEY_SUITES] = setter(state[KEY_SUITES]); return state; }); return getSuites(); diff --git a/packages/vest/src/core/state/patch/spec.js b/packages/vest/src/core/state/patch/spec.js index 78cbefadf..8b231bdb7 100644 --- a/packages/vest/src/core/state/patch/spec.js +++ b/packages/vest/src/core/state/patch/spec.js @@ -2,8 +2,8 @@ import { getState } from '..'; import resetState from '../../../../testUtils/resetState'; import runRegisterSuite from '../../../../testUtils/runRegisterSuite'; import { OPERATION_MODE_STATEFUL } from '../../../constants'; +import { KEY_SUITES } from '../constants'; import getSuiteState from '../getSuiteState'; -import { SYMBOL_SUITES } from '../symbols'; import patch from '.'; const suiteName = 'suite_1'; @@ -28,13 +28,13 @@ describe('patch', () => { patcher = jest.fn(state => ({ ...state, ...{ k: 'v' } })); resetState(); runRegisterSuite(context); - suite = getState(SYMBOL_SUITES)[suiteId]; + suite = getState(KEY_SUITES)[suiteId]; suiteState = suite[0]; prevState = suite[1]; patch(suiteId, patcher); }); it('Should set current state value to patcher argument return value', () => { - expect(getState(SYMBOL_SUITES)[suiteId][0]).toBe( + expect(getState(KEY_SUITES)[suiteId][0]).toBe( patcher.mock.results[0].value ); }); diff --git a/packages/vest/src/core/state/registerSuite/spec.js b/packages/vest/src/core/state/registerSuite/spec.js index 8fa222028..023ca8fe4 100644 --- a/packages/vest/src/core/state/registerSuite/spec.js +++ b/packages/vest/src/core/state/registerSuite/spec.js @@ -3,8 +3,8 @@ import isDeepCopy from '../../../../testUtils/isDeepCopy'; import resetState from '../../../../testUtils/resetState'; import runRegisterSuite from '../../../../testUtils/runRegisterSuite'; import { OPERATION_MODE_STATEFUL } from '../../../constants'; +import { KEY_SUITES } from '../constants'; import patch from '../patch'; -import { SYMBOL_SUITES } from '../symbols'; const suiteName = 'suite_1'; const suiteId = 'suiteId_1'; @@ -24,11 +24,11 @@ describe('registerSuite', () => { describe('When suite does not exist in state', () => { it('Should create initial suite without prevState', () => { - expect(getState(SYMBOL_SUITES)[suiteId]).toBeUndefined(); + expect(getState(KEY_SUITES)[suiteId]).toBeUndefined(); runRegisterSuite(context); - expect(getState(SYMBOL_SUITES)[suiteId]).toHaveLength(2); - expect(getState(SYMBOL_SUITES)[suiteId][1]).toBeUndefined(); - expect(getState(SYMBOL_SUITES)[suiteId][0]).toMatchSnapshot(); + expect(getState(KEY_SUITES)[suiteId]).toHaveLength(2); + expect(getState(KEY_SUITES)[suiteId][1]).toBeUndefined(); + expect(getState(KEY_SUITES)[suiteId][0]).toMatchSnapshot(); }); }); @@ -36,12 +36,12 @@ describe('registerSuite', () => { let suite; beforeEach(() => { runRegisterSuite(context); - suite = getState(SYMBOL_SUITES)[suiteId]; + suite = getState(KEY_SUITES)[suiteId]; prevSuiteState = suite[0]; runRegisterSuite({ ...context }); }); it('Should move prev prevSuiteState into second array cell', () => { - expect(getState(SYMBOL_SUITES)[suiteId][1]).toBe(prevSuiteState); + expect(getState(KEY_SUITES)[suiteId][1]).toBe(prevSuiteState); }); describe('Prev state data handling', () => { diff --git a/packages/vest/src/core/state/reset/__snapshots__/spec.js.snap b/packages/vest/src/core/state/reset/__snapshots__/spec.js.snap index e8acf08fe..e4aaad093 100644 --- a/packages/vest/src/core/state/reset/__snapshots__/spec.js.snap +++ b/packages/vest/src/core/state/reset/__snapshots__/spec.js.snap @@ -2,7 +2,10 @@ exports[`When suite exists Sanity - making sure everything works as it should 1`] = ` Object { - Symbol(mock_vest_suites): Object { + "_canceled": Object { + "3": true, + }, + "_suites": Object { "suite_id": Array [ Object { "doneCallbacks": Array [], @@ -142,15 +145,30 @@ Object { }, ], }, - Symbol(mock_vest_canceled): Object { - "3": true, - }, } `; exports[`When suite exists Sanity - making sure everything works as it should 2`] = ` Object { - Symbol(mock_vest_suites): Object { + "_canceled": Object { + "0": true, + "10": true, + "11": true, + "13": true, + "15": true, + "16": true, + "18": true, + "19": true, + "2": true, + "21": true, + "23": true, + "27": true, + "3": true, + "5": true, + "7": true, + "8": true, + }, + "_suites": Object { "suite_id": Array [ Object { "doneCallbacks": Array [], @@ -163,7 +181,7 @@ Object { "fieldCallbacks": Object {}, "groups": Object {}, "lagging": Array [ - VestTest { + D { "failed": false, "fieldName": "field_1", "id": "24", @@ -172,7 +190,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + D { "failed": false, "fieldName": "field_3", "id": "26", @@ -184,7 +202,7 @@ Object { ], "name": "suite_id", "pending": Array [ - VestTest { + D { "failed": false, "fieldName": "field_2", "id": "29", @@ -193,7 +211,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + D { "failed": false, "fieldName": "field_4", "id": "31", @@ -205,7 +223,7 @@ Object { ], "suiteId": "suite_id", "testObjects": Array [ - VestTest { + D { "failed": false, "fieldName": "field_2", "id": "29", @@ -214,7 +232,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + D { "failed": false, "fieldName": "field_4", "id": "31", @@ -223,7 +241,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + D { "failed": false, "fieldName": "field_1", "id": "24", @@ -232,7 +250,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + D { "failed": false, "fieldName": "field_3", "id": "26", @@ -258,7 +276,7 @@ Object { "pending": null, "suiteId": "suite_id", "testObjects": Array [ - VestTest { + D { "failed": false, "fieldName": "field_1", "id": "24", @@ -267,7 +285,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + D { "failed": false, "fieldName": "field_3", "id": "26", @@ -276,7 +294,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + D { "failed": false, "fieldName": "field_4", "id": "27", @@ -290,7 +308,12 @@ Object { }, ], }, - Symbol(mock_vest_canceled): Object { +} +`; + +exports[`When suite exists Sanity - making sure everything works as it should 3`] = ` +Object { + "_canceled": Object { "0": true, "10": true, "11": true, @@ -302,18 +325,28 @@ Object { "2": true, "21": true, "23": true, + "24": true, + "26": true, "27": true, + "29": true, "3": true, + "31": true, + "32": true, + "34": true, + "35": true, + "37": true, + "39": true, + "40": true, + "42": true, + "43": true, + "45": true, + "47": true, "5": true, + "51": true, "7": true, "8": true, }, -} -`; - -exports[`When suite exists Sanity - making sure everything works as it should 3`] = ` -Object { - Symbol(mock_vest_suites): Object { + "_suites": Object { "suite_id": Array [ Object { "doneCallbacks": Array [], @@ -326,7 +359,7 @@ Object { "fieldCallbacks": Object {}, "groups": Object {}, "lagging": Array [ - VestTest { + S { "failed": false, "fieldName": "field_1", "id": "48", @@ -335,7 +368,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + S { "failed": false, "fieldName": "field_3", "id": "50", @@ -347,7 +380,7 @@ Object { ], "name": "suite_id", "pending": Array [ - VestTest { + S { "failed": false, "fieldName": "field_2", "id": "53", @@ -356,7 +389,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + S { "failed": false, "fieldName": "field_4", "id": "55", @@ -368,7 +401,7 @@ Object { ], "suiteId": "suite_id", "testObjects": Array [ - VestTest { + S { "failed": false, "fieldName": "field_2", "id": "53", @@ -377,7 +410,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + S { "failed": false, "fieldName": "field_4", "id": "55", @@ -386,7 +419,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + S { "failed": false, "fieldName": "field_1", "id": "48", @@ -395,7 +428,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + S { "failed": false, "fieldName": "field_3", "id": "50", @@ -421,7 +454,7 @@ Object { "pending": null, "suiteId": "suite_id", "testObjects": Array [ - VestTest { + S { "failed": false, "fieldName": "field_1", "id": "48", @@ -430,7 +463,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + S { "failed": false, "fieldName": "field_3", "id": "50", @@ -439,7 +472,7 @@ Object { "suiteId": "suite_id", "testFn": Promise {}, }, - VestTest { + S { "failed": false, "fieldName": "field_4", "id": "51", @@ -453,7 +486,12 @@ Object { }, ], }, - Symbol(mock_vest_canceled): Object { +} +`; + +exports[`When suite exists Sanity - making sure everything works as it should 4`] = ` +Object { + "_canceled": Object { "0": true, "10": true, "11": true, @@ -481,17 +519,27 @@ Object { "43": true, "45": true, "47": true, + "48": true, "5": true, + "50": true, "51": true, + "53": true, + "55": true, + "56": true, + "58": true, + "59": true, + "61": true, + "63": true, + "64": true, + "66": true, + "67": true, + "69": true, "7": true, + "71": true, + "75": true, "8": true, }, -} -`; - -exports[`When suite exists Sanity - making sure everything works as it should 4`] = ` -Object { - Symbol(mock_vest_suites): Object { + "_suites": Object { "suite_id": Array [ Object { "doneCallbacks": Array [], @@ -631,53 +679,5 @@ Object { }, ], }, - Symbol(mock_vest_canceled): Object { - "0": true, - "10": true, - "11": true, - "13": true, - "15": true, - "16": true, - "18": true, - "19": true, - "2": true, - "21": true, - "23": true, - "24": true, - "26": true, - "27": true, - "29": true, - "3": true, - "31": true, - "32": true, - "34": true, - "35": true, - "37": true, - "39": true, - "40": true, - "42": true, - "43": true, - "45": true, - "47": true, - "48": true, - "5": true, - "50": true, - "51": true, - "53": true, - "55": true, - "56": true, - "58": true, - "59": true, - "61": true, - "63": true, - "64": true, - "66": true, - "67": true, - "69": true, - "7": true, - "71": true, - "75": true, - "8": true, - }, } `; diff --git a/packages/vest/src/core/state/reset/spec.js b/packages/vest/src/core/state/reset/spec.js index 967054ffe..8d3f1ce55 100644 --- a/packages/vest/src/core/state/reset/spec.js +++ b/packages/vest/src/core/state/reset/spec.js @@ -5,8 +5,8 @@ import runSpec from '../../../../testUtils/runSpec'; import testDummy from '../../../../testUtils/testDummy'; import vest from '../../../index'; import copy from '../../../lib/copy'; +import { KEY_CANCELED } from '../constants'; import getSuiteState from '../getSuiteState'; -import { SYMBOL_CANCELED } from '../symbols'; import reset from '.'; const suiteId = 'suite_id'; @@ -90,15 +90,15 @@ const spec = _vest => { }); it('Should set all pending and lagging tests as canceled', () => { - const previouslyCanceled = getState(SYMBOL_CANCELED); + const previouslyCanceled = getState(KEY_CANCELED); const state = getSuiteState(suiteId); const allCanceled = [...state.lagging, ...state.pending].reduce( (canceled, { id }) => Object.assign(canceled, { [id]: true }), { ...previouslyCanceled } ); - expect(getState(SYMBOL_CANCELED)).not.toEqual(allCanceled); + expect(getState(KEY_CANCELED)).not.toEqual(allCanceled); _reset(suiteId); - expect(getState(SYMBOL_CANCELED)).toEqual(allCanceled); + expect(getState(KEY_CANCELED)).toEqual(allCanceled); }); }); }; diff --git a/packages/vest/src/core/state/spec.js b/packages/vest/src/core/state/spec.js index 7f295ca1e..c7eabeb95 100644 --- a/packages/vest/src/core/state/spec.js +++ b/packages/vest/src/core/state/spec.js @@ -1,7 +1,7 @@ import _ from 'lodash'; import resetState from '../../../testUtils/resetState'; import singleton from '../../lib/singleton'; -import { SYMBOL_STATE, SYMBOL_CANCELED, SYMBOL_SUITES } from './symbols'; +import { KEY_STATE, KEY_CANCELED, KEY_SUITES } from './constants'; import state, { getState, setState } from '.'; describe('Module: state', () => { @@ -23,7 +23,7 @@ describe('Module: state', () => { describe('When state does not exist', () => { beforeEach(() => { - singleton.set(SYMBOL_STATE, null); + singleton.set(KEY_STATE, null); }); it('Should keep state untouched', () => { @@ -38,18 +38,18 @@ describe('Module: state', () => { describe('getState', () => { describe('When no key specified', () => { it('Should return state', () => { - expect(getState()).toBe(singleton.use(SYMBOL_STATE)); - singleton.set(SYMBOL_STATE, null); + expect(getState()).toBe(singleton.use(KEY_STATE)); + singleton.set(KEY_STATE, null); // this checks the case when the tate doesn't exist - expect(getState()).toBe(singleton.use(SYMBOL_STATE)); + expect(getState()).toBe(singleton.use(KEY_STATE)); }); }); describe('When key specified', () => { it('Should return relevant state portion', () => { - [SYMBOL_CANCELED, SYMBOL_SUITES].forEach(key => { - expect(getState(key)).toBe(singleton.use(SYMBOL_STATE)[key]); + [KEY_CANCELED, KEY_SUITES].forEach(key => { + expect(getState(key)).toBe(singleton.use(KEY_STATE)[key]); }); }); }); diff --git a/packages/vest/src/core/state/symbols.js b/packages/vest/src/core/state/symbols.js deleted file mode 100644 index 8172d641b..000000000 --- a/packages/vest/src/core/state/symbols.js +++ /dev/null @@ -1,3 +0,0 @@ -export const SYMBOL_STATE = Symbol('vestState'); -export const SYMBOL_SUITES = Symbol('vestSuites'); -export const SYMBOL_CANCELED = Symbol('canceledTests'); diff --git a/packages/vest/src/core/test/lib/canceled/index.js b/packages/vest/src/core/test/lib/canceled/index.js index 16cc610be..6e50a1024 100644 --- a/packages/vest/src/core/test/lib/canceled/index.js +++ b/packages/vest/src/core/test/lib/canceled/index.js @@ -1,5 +1,5 @@ import { setState } from '../../../state'; -import { SYMBOL_CANCELED } from '../../../state/symbols'; +import { KEY_CANCELED } from '../../../state/constants'; /** * Adds a VestTest to the canceled state. @@ -12,10 +12,10 @@ export const setCanceled = (...testObjects) => { setState(state => ({ ...state, - [SYMBOL_CANCELED]: testObjects.reduce((ids, testObjects) => { + [KEY_CANCELED]: testObjects.reduce((ids, testObjects) => { ids[testObjects.id] = true; return ids; - }, state[SYMBOL_CANCELED]), + }, state[KEY_CANCELED]), })); }; @@ -25,7 +25,7 @@ export const setCanceled = (...testObjects) => { */ export const removeCanceled = testObject => { setState(state => { - delete state[SYMBOL_CANCELED][testObject.id]; + delete state[KEY_CANCELED][testObject.id]; return state; }); }; diff --git a/packages/vest/src/core/test/lib/canceled/spec.js b/packages/vest/src/core/test/lib/canceled/spec.js index def33b480..fe8a383ab 100644 --- a/packages/vest/src/core/test/lib/canceled/spec.js +++ b/packages/vest/src/core/test/lib/canceled/spec.js @@ -1,6 +1,6 @@ import resetState from '../../../../../testUtils/resetState'; import { getState } from '../../../state'; -import { SYMBOL_CANCELED } from '../../../state/symbols'; +import { KEY_CANCELED } from '../../../state/constants'; import VestTest from '../VestTest'; import { setCanceled, removeCanceled } from '.'; @@ -27,11 +27,11 @@ describe('module: canceled', () => { describe('setCanceled', () => { it('Should add all passed ids to canceled object', () => { const ids = tests.map(({ id }) => id); - expect(Object.keys(getState(SYMBOL_CANCELED))).not.toEqual( + expect(Object.keys(getState(KEY_CANCELED))).not.toEqual( expect.arrayContaining(ids) ); setCanceled(...tests); - expect(Object.keys(getState(SYMBOL_CANCELED))).toEqual( + expect(Object.keys(getState(KEY_CANCELED))).toEqual( expect.arrayContaining(ids) ); }); @@ -43,9 +43,9 @@ describe('module: canceled', () => { }); it('Should remove canceled test', () => { - expect(getState(SYMBOL_CANCELED)).toHaveProperty(tests[0].id); + expect(getState(KEY_CANCELED)).toHaveProperty(tests[0].id); removeCanceled(tests[0]); - expect(getState(SYMBOL_CANCELED)).not.toHaveProperty(tests[0].id); + expect(getState(KEY_CANCELED)).not.toHaveProperty(tests[0].id); }); }); }); diff --git a/packages/vest/src/core/test/lib/pending/spec.js b/packages/vest/src/core/test/lib/pending/spec.js index 1a363f50c..8fed6179f 100644 --- a/packages/vest/src/core/test/lib/pending/spec.js +++ b/packages/vest/src/core/test/lib/pending/spec.js @@ -1,9 +1,9 @@ import _ from 'lodash'; import resetState from '../../../../../testUtils/resetState'; import { getState } from '../../../state'; +import { KEY_CANCELED } from '../../../state/constants'; import getSuiteState from '../../../state/getSuiteState'; import patch from '../../../state/patch'; -import { SYMBOL_CANCELED } from '../../../state/symbols'; import VestTest from '../VestTest'; import { removePending, setPending } from '.'; @@ -113,11 +113,11 @@ describe('module: pending', () => { }); it('Should set test as canceled', () => { - expect(getState(SYMBOL_CANCELED)).not.toMatchObject({ + expect(getState(KEY_CANCELED)).not.toMatchObject({ [testObjects[0].id]: true, }); setPending(suiteId, testObjects[0]); - expect(getState(SYMBOL_CANCELED)).toMatchObject({ + expect(getState(KEY_CANCELED)).toMatchObject({ [testObjects[0].id]: true, }); }); diff --git a/packages/vest/src/core/test/runAsyncTest/index.js b/packages/vest/src/core/test/runAsyncTest/index.js index 49305bb8b..b6ede4544 100644 --- a/packages/vest/src/core/test/runAsyncTest/index.js +++ b/packages/vest/src/core/test/runAsyncTest/index.js @@ -3,9 +3,9 @@ import runWithContext from '../../../lib/runWithContext'; import singleton from '../../../lib/singleton'; import { getState, getSuites } from '../../state'; import cleanupCompletedSuite from '../../state/cleanupCompletedSuite'; +import { KEY_CANCELED } from '../../state/constants'; import getSuiteState from '../../state/getSuiteState'; import hasRemainingTests from '../../state/hasRemainingTests'; -import { SYMBOL_CANCELED } from '../../state/symbols'; import { removeCanceled } from '../lib/canceled'; import { removePending } from '../lib/pending'; /** @@ -36,7 +36,7 @@ const runAsyncTest = testObject => { const { testFn, statement, fieldName, id, suiteId } = testObject; const { operationMode } = singleton.useContext(); const done = cb => { - const isCanceled = getState(SYMBOL_CANCELED)[id]; + const isCanceled = getState(KEY_CANCELED)[id]; if (isCanceled) { removeCanceled(testObject); diff --git a/packages/vest/src/core/test/runAsyncTest/spec.js b/packages/vest/src/core/test/runAsyncTest/spec.js index 25c6cccbb..0e5e41c8e 100644 --- a/packages/vest/src/core/test/runAsyncTest/spec.js +++ b/packages/vest/src/core/test/runAsyncTest/spec.js @@ -4,10 +4,10 @@ import { OPERATION_MODE_STATEFUL } from '../../../constants'; import runWithContext from '../../../lib/runWithContext'; import Context from '../../Context'; import { setState, getState } from '../../state'; +import { KEY_CANCELED } from '../../state/constants'; import getSuiteState from '../../state/getSuiteState'; import patch from '../../state/patch'; import registerSuite from '../../state/registerSuite'; -import { SYMBOL_CANCELED } from '../../state/symbols'; import VestTest from '../lib/VestTest'; import { setPending } from '../lib/pending'; import runAsyncTest from '.'; @@ -78,7 +78,7 @@ describe.each([CASE_PASSING, CASE_FAILING])('runAsyncTest: %s', testCase => { let state; beforeEach(() => { setState(state => { - state[SYMBOL_CANCELED][testObject.id] = true; + state[KEY_CANCELED][testObject.id] = true; return state; }); state = _.cloneDeep(getSuiteState(suiteId)); @@ -100,11 +100,11 @@ describe.each([CASE_PASSING, CASE_FAILING])('runAsyncTest: %s', testCase => { }); it('Should remove test from canceled state', () => { - expect(getState(SYMBOL_CANCELED)).toHaveProperty(testObject.id); + expect(getState(KEY_CANCELED)).toHaveProperty(testObject.id); runRunAsyncTest(testObject); return new Promise(done => { setTimeout(() => { - expect(getState(SYMBOL_CANCELED)).not.toHaveProperty(testObject.id); + expect(getState(KEY_CANCELED)).not.toHaveProperty(testObject.id); done(); }); }); @@ -188,7 +188,7 @@ describe.each([CASE_PASSING, CASE_FAILING])('runAsyncTest: %s', testCase => { describe('When test is canceled', () => { beforeEach(() => { setState(state => { - state[SYMBOL_CANCELED][testObject.id] = true; + state[KEY_CANCELED][testObject.id] = true; return state; }); }); diff --git a/packages/vest/src/index.js b/packages/vest/src/index.js index 6a2dc121e..81cd4856a 100644 --- a/packages/vest/src/index.js +++ b/packages/vest/src/index.js @@ -1,7 +1,6 @@ import any from 'anyone/any'; import enforce from '../../n4s/src/enforce'; -import { VERSION } from './constants'; -import createSuite from './core/createSuite'; +import create from './core/createSuite'; import state from './core/state'; import reset from './core/state/reset'; import test from './core/test'; @@ -10,18 +9,21 @@ import * as hooks from './hooks'; import runWithContext from './lib/runWithContext'; import singleton from './lib/singleton'; -export default singleton.register( - { - Enforce: enforce.Enforce, - VERSION, - any, - create: createSuite, - enforce, - reset, - runWithContext, - test, - validate, - ...hooks, - }, - state.register -); +const VERSION = VEST_VERSION; +const Enforce = enforce.Enforce; + +export default { + Enforce, + VERSION, + any, + create, + enforce, + reset, + runWithContext, + test, + validate, + ...hooks, +}; + +singleton.register(); +state.register(); diff --git a/packages/vest/src/lib/id/index.js b/packages/vest/src/lib/id/index.js index b07408557..3494a7ea8 100644 --- a/packages/vest/src/lib/id/index.js +++ b/packages/vest/src/lib/id/index.js @@ -1,13 +1,13 @@ import singleton from '../singleton'; -const SYMBOL_ID = Symbol('vestId'); +const KEY_ID = 'vestId'; /** * @returns a unique numeric id. */ const id = () => { - const id = singleton.use()[SYMBOL_ID] ?? 0; - singleton.set(SYMBOL_ID, id + 1); + const id = singleton.use()[KEY_ID] ?? 0; + singleton.set(KEY_ID, id + 1); return id.toString(); }; diff --git a/packages/vest/src/lib/singleton/constants.js b/packages/vest/src/lib/singleton/constants.js new file mode 100644 index 000000000..7786eb91e --- /dev/null +++ b/packages/vest/src/lib/singleton/constants.js @@ -0,0 +1,9 @@ +/** + * @type {String} Vest's major version. + */ +const VEST_MAJOR = VEST_VERSION.split('.')[0]; + +/** + * @type {Symbol} Used to store a global reference to Vest's inner state. + */ +export const SYMBOL_VEST_GLOBAL = Symbol.for(`__INTERNAL__VEST#${VEST_MAJOR}`); diff --git a/packages/vest/src/lib/singleton/index.js b/packages/vest/src/lib/singleton/index.js index 14596a80b..5f6ef1bb3 100644 --- a/packages/vest/src/lib/singleton/index.js +++ b/packages/vest/src/lib/singleton/index.js @@ -1,6 +1,6 @@ import go from '../globalObject'; import throwError from '../throwError'; -import { SYMBOL_VEST } from './symbols'; +import { SYMBOL_VEST_GLOBAL } from './constants'; /** * Throws an error when multiple versions of Vest are detected on the same runtime. * @param {String[]} versions List of detected Vest versions. @@ -11,37 +11,33 @@ const throwMultipleVestError = (...versions) => { }; /** - * Registers current Vest instance on global object. - * @param {Object} vest Reference to Vest. - * @return {Function} Global Vest reference. + * Registers current Vest instance on a global object. */ -const register = (vest, cb) => { - const existing = go[SYMBOL_VEST]; +const register = () => { + const existing = go[SYMBOL_VEST_GLOBAL]; if (existing) { - if (existing.VERSION !== vest.VERSION) { - throwMultipleVestError(vest.VERSION, existing.VERSION); + if (existing.VERSION !== VEST_VERSION) { + throwMultipleVestError(VEST_VERSION, existing.VERSION); } } else { - go[SYMBOL_VEST] = vest; + go[SYMBOL_VEST_GLOBAL] = { VERSION: VEST_VERSION }; } - cb(); - - return go[SYMBOL_VEST]; + return go[SYMBOL_VEST_GLOBAL]; }; /** * @returns Global Vest instance or a portion of it. */ -const use = key => (key ? go[SYMBOL_VEST][key] : go[SYMBOL_VEST]); +const use = key => (key ? go[SYMBOL_VEST_GLOBAL][key] : go[SYMBOL_VEST_GLOBAL]); /** * Updates a key in the state. * @param {string} key * @param {*} value */ -const set = (key, value) => (go[SYMBOL_VEST][key] = value); +const set = (key, value) => (go[SYMBOL_VEST_GLOBAL][key] = value); /** * @returns Current Vest context. diff --git a/packages/vest/src/lib/singleton/spec.js b/packages/vest/src/lib/singleton/spec.js index 8f5750082..cf101e46b 100644 --- a/packages/vest/src/lib/singleton/spec.js +++ b/packages/vest/src/lib/singleton/spec.js @@ -6,38 +6,29 @@ import mock from '../../../testUtils/mock'; import { ALL_VEST_BUILDS } from '../../../testUtils/vestBuilds'; import state from '../../core/state'; import go from '../globalObject'; -import { SYMBOL_VEST } from './symbols'; +import { SYMBOL_VEST_GLOBAL } from './constants'; import singleton from '.'; describe('singleton', () => { afterAll(() => { - singleton.register(vest, _.noop); + go.VEST_VERSION = vest.VERSION; + singleton.register(); }); describe('Attaching to global scope', () => { beforeEach(() => { - delete go[SYMBOL_VEST]; + delete go[SYMBOL_VEST_GLOBAL]; }); afterEach(() => { - delete go[SYMBOL_VEST]; + delete go[SYMBOL_VEST_GLOBAL]; }); - test('That global instance is not populated', () => { - expect(go[SYMBOL_VEST]).toBeUndefined(); - }); - - it('Should register vest on the global object', () => { - singleton.register(vest, _.noop); - - expect(go[SYMBOL_VEST]).toBe(vest); + test('Santiy: That global instance is not populated yet', () => { + expect(go[SYMBOL_VEST_GLOBAL]).toBeUndefined(); }); describe('When already registered', () => { - beforeEach(() => { - singleton.register(vest, _.noop); - }); - describe('When same version', () => { it('Should return silently', () => new Promise(done => { @@ -62,33 +53,21 @@ describe('singleton', () => { }); it('Should throw an error', () => { - const fn = () => null; - fn.VERSION = '222'; - - singleton.register(fn, _.noop); + global.VEST_VERSION = '222'; + singleton.register(); expect(mockThrowError.mock.calls[0][0]).toBe( `Multiple versions of Vest detected: (222,${version}).\n Most features should work regularly, but for optimal feature compatibility, you should have all running instances use the same version.` ); + global.VEST_VERSION = vest.VERSION; }); }); }); }); - - describe('callback', () => { - let callback; - - beforeEach(() => { - callback = jest.fn(); - }); - it('Should run provided callback', () => { - singleton.register(vest, callback); - expect(callback).toHaveBeenCalledTimes(1); - }); - }); }); describe('Integration: singleton', () => { beforeAll(() => { - singleton.register(vest, state.register); + singleton.register(); + state.register(); }); const pairs = ALL_VEST_BUILDS.reduce( diff --git a/packages/vest/src/lib/singleton/symbols.js b/packages/vest/src/lib/singleton/symbols.js deleted file mode 100644 index 092f63835..000000000 --- a/packages/vest/src/lib/singleton/symbols.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * @type {String} Vest's major version. - */ -const VEST_MAJOR = VEST_VERSION.split('.')[0]; - -/** - * @type {Symbol} Used to store a global instance of Vest. - */ -export const SYMBOL_VEST = Symbol.for(`VEST#${VEST_MAJOR}`); diff --git a/packages/vest/testUtils/mock/index.js b/packages/vest/testUtils/mock/index.js index 911d3e647..919c8f818 100644 --- a/packages/vest/testUtils/mock/index.js +++ b/packages/vest/testUtils/mock/index.js @@ -14,6 +14,7 @@ const PATHS = { const mock = (moduleName, mockImplementation) => { const mockFn = jest.fn(mockImplementation); jest.resetModules(); + require('../../src'); // re-require vest for global assignments jest.mock(packagePath('vest/src', PATHS[moduleName]), () => ({ __esModule: true, default: mockFn, diff --git a/packages/vest/testUtils/resetState/__snapshots__/spec.js.snap b/packages/vest/testUtils/resetState/__snapshots__/spec.js.snap index ddd1b29b4..dbc4ae96c 100644 --- a/packages/vest/testUtils/resetState/__snapshots__/spec.js.snap +++ b/packages/vest/testUtils/resetState/__snapshots__/spec.js.snap @@ -2,8 +2,8 @@ exports[`resetState Sanity 1`] = ` Object { - Symbol(mock_vest_suites): Object {}, - Symbol(mock_vest_canceled): Object {}, + "_canceled": Object {}, + "_suites": Object {}, } `; diff --git a/packages/vest/testUtils/resetState/index.js b/packages/vest/testUtils/resetState/index.js index 8bb8b11bb..564386774 100644 --- a/packages/vest/testUtils/resetState/index.js +++ b/packages/vest/testUtils/resetState/index.js @@ -1,12 +1,12 @@ import { OPERATION_MODE_STATEFUL } from '../../src/constants'; import state from '../../src/core/state'; +import { KEY_STATE } from '../../src/core/state/constants'; import getSuiteState from '../../src/core/state/getSuiteState'; -import { SYMBOL_STATE } from '../../src/core/state/symbols'; import singleton from '../../src/lib/singleton'; import runRegisterSuite from '../runRegisterSuite'; const resetState = (suiteId, suiteName = suiteId) => { - singleton.set(SYMBOL_STATE, null); + singleton.set(KEY_STATE, null); state.register(); if (suiteName) { diff --git a/packages/vest/testUtils/resetState/spec.js b/packages/vest/testUtils/resetState/spec.js index 62b4c0757..0f1d46874 100644 --- a/packages/vest/testUtils/resetState/spec.js +++ b/packages/vest/testUtils/resetState/spec.js @@ -1,5 +1,5 @@ import { getState } from '../../src/core/state'; -import { SYMBOL_SUITES } from '../../src/core/state/symbols'; +import { KEY_SUITES } from '../../src/core/state/constants'; import resetState from '.'; describe('resetState', () => { @@ -23,10 +23,10 @@ describe('resetState', () => { }); it('Should add a new suite to the state', () => { - expect(getState(SYMBOL_SUITES)).toEqual({}); + expect(getState(KEY_SUITES)).toEqual({}); resetState(suiteId); - expect(getState(SYMBOL_SUITES)[suiteId]).toBeTruthy(); - expect(getState(SYMBOL_SUITES)[suiteId]).toMatchSnapshot(); + expect(getState(KEY_SUITES)[suiteId]).toBeTruthy(); + expect(getState(KEY_SUITES)[suiteId]).toMatchSnapshot(); }); }); }); diff --git a/packages/vest/testUtils/suiteIdByName/index.js b/packages/vest/testUtils/suiteIdByName/index.js index 7822b496c..82e553bce 100644 --- a/packages/vest/testUtils/suiteIdByName/index.js +++ b/packages/vest/testUtils/suiteIdByName/index.js @@ -1,8 +1,8 @@ import { getState } from '../../src/core/state'; -import { SYMBOL_SUITES } from '../../src/core/state/symbols'; +import { KEY_SUITES } from '../../src/core/state/constants'; const suiteIdByName = suiteName => { - const suites = getState(SYMBOL_SUITES); + const suites = getState(KEY_SUITES); if (!suites) { return null; diff --git a/yarn.lock b/yarn.lock index bb44feea0..1a007086f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1178,9 +1178,9 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "14.0.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.9.tgz#43896ab87fc82bda1dfd600cdf44a0c8a64e11d2" - integrity sha512-0sCTiXKXELOBxvZLN4krQ0FPOAA7ij+6WwvD0k/PHd9/KAkr4dXel5J9fh6F4x1FwAQILqAWkmpeuS6mjf1iKA== + version "14.0.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.11.tgz#61d4886e2424da73b7b25547f59fdcb534c165a3" + integrity sha512-lCvvI24L21ZVeIiyIUHZ5Oflv1hhHQ5E1S25IRlKIXaRkVgmXpJMI3wUJkmym2bTbCe+WoIibQnMVAU3FguaOg== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1686,9 +1686,9 @@ camelcase@^6.0.0: integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== caniuse-lite@^1.0.30001043: - version "1.0.30001077" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001077.tgz#5d7da6a120b08d9f4fd94823786ecb454aaa5626" - integrity sha512-AEzsGvjBJL0lby/87W96PyEvwN0GsYvk5LHsglLg9tW37K4BqvAvoSCdWIE13OZQ8afupqZ73+oL/1LkedN8hA== + version "1.0.30001078" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001078.tgz#e1b6e2ae327b6a1ec11f65ec7a0dde1e7093074c" + integrity sha512-sF12qXe9VMm32IEf/+NDvmTpwJaaU7N1igpiH2FdI4DyABJSsOqG3ZAcFvszLkoLoo1y6VJLMYivukUAxaMASw== capture-exit@^2.0.0: version "2.0.0" @@ -2166,9 +2166,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.3.413: - version "1.3.458" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.458.tgz#4ef179f9a0f1d8a658180c09b21bf73edddfc5eb" - integrity sha512-OjRkb0igW0oKE2QbzS7vBYrm7xjW/KRTtIj0OGGx57jr/YhBiKb7oZvdbaojqjfCb/7LbnwsbMbdsYjthdJbAw== + version "1.3.463" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.463.tgz#bae89d8c2c69b4be32f80221fe49ab5786fab368" + integrity sha512-mAqvpG0efJXV9BGXPVjFdBFiqmawGoIc+c8T2uXYEvbV1/261PaOT0EzZ9dKW4IdGiHXQGSKnnOU86QhJ+5JcA== emoji-regex@^7.0.1: version "7.0.3" @@ -2231,9 +2231,9 @@ escape-string-regexp@^2.0.0: integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escodegen@^1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" - integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== + version "1.14.2" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.2.tgz#14ab71bf5026c2aa08173afba22c6f3173284a84" + integrity sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A== dependencies: esprima "^4.0.1" estraverse "^4.2.0" @@ -2300,9 +2300,9 @@ eslint-plugin-spellcheck@^0.0.17: lodash "^4.17.15" eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" + integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -2322,9 +2322,9 @@ eslint-utils@^2.0.0: eslint-visitor-keys "^1.1.0" eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + version "1.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz#74415ac884874495f78ec2a97349525344c981fa" + integrity sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ== eslint@^6.8.0: version "6.8.0" @@ -2842,9 +2842,9 @@ globals@^12.1.0: type-fest "^0.8.1" globals@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.0.0.tgz#34694ea5ce49ba46fde3f110e162586ba58ff6ca" - integrity sha512-TdLO3ykvHpNsJZiMr+RfkwoMI+XdDaFbH87w/UZGrSzNvZ5cUU6W50oPKSDZgb6eoMWZ6Pltf5Y3oQBpKLUSkA== + version "13.1.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.1.0.tgz#ad4f301f0e55e4f72767faa01a69de8fdaf50ea1" + integrity sha512-4N8AdK8YMcr4nLOUsCP62jhMVAaJVdrEevrmuqHQ/TTXCXVL8ywhd/whKrufcp1zGtKBqw4DHcvsokQ60khOJA== dependencies: type-fest "^0.8.1" @@ -3289,11 +3289,11 @@ is-reference@^1.1.2: "@types/estree" "0.0.44" is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" + integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== dependencies: - has "^1.0.3" + has-symbols "^1.0.1" is-stream@^1.1.0: version "1.1.0" @@ -4793,9 +4793,9 @@ regenerate-unicode-properties@^8.2.0: regenerate "^1.4.0" regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + version "1.4.1" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" + integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== regenerator-runtime@^0.13.4: version "0.13.5" @@ -5821,6 +5821,11 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vest@2.0.0-next-e063c9: + version "2.0.0-next-e063c9" + resolved "https://registry.yarnpkg.com/vest/-/vest-2.0.0-next-e063c9.tgz#a6f60b52d98b5c55be031f0ba2250a300b50e566" + integrity sha512-QqNDqzdN1R7xJiKQ093+0B4VywLaxKgkE5jB06C0wfq2upO5Am5mpM4IbH/QYlpry5IJ+JCIUrb/WVYCN7zllg== + vinyl-sourcemaps-apply@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705"