diff --git a/jsconfig.json b/jsconfig.json index 343c2a7e7..9979f4be9 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -3,6 +3,7 @@ "baseUrl": ".", "paths": { "asArray": ["./packages/__shared/src/asArray.js"], + "assign": ["./packages/__shared/src/assign.js"], "hasOwnProperty": ["./packages/__shared/src/hasOwnProperty.js"], "isBooleanValue": ["./packages/__shared/src/isBooleanValue.js"], "isFunction": ["./packages/__shared/src/isFunction.js"], diff --git a/packages/__shared/src/assign.js b/packages/__shared/src/assign.js new file mode 100644 index 000000000..9379ae6f1 --- /dev/null +++ b/packages/__shared/src/assign.js @@ -0,0 +1 @@ +export default Object.assign; diff --git a/packages/__shared/src/withArgs.js b/packages/__shared/src/withArgs.js index 17b071cda..d22d965a3 100644 --- a/packages/__shared/src/withArgs.js +++ b/packages/__shared/src/withArgs.js @@ -8,7 +8,8 @@ import setFnName from 'setFnName'; * @return {Function} */ export default function withArgs(cb, fnName) { - return setFnName((...args) => { + return setFnName(function () { + const args = Array.from(arguments); const right = args.splice(cb.length - 1); return cb.apply(null, args.concat([right])); }, fnName || cb.name); diff --git a/packages/n4s/src/compounds/allOf.js b/packages/n4s/src/compounds/allOf.js index 35be68e03..f54c2fdfb 100644 --- a/packages/n4s/src/compounds/allOf.js +++ b/packages/n4s/src/compounds/allOf.js @@ -3,7 +3,7 @@ import runCompoundChain from 'runCompoundChain'; import withArgs from 'withArgs'; /** - * Runs a chaen of rules, making sure that all assertions pass + * Runs a chain of rules, making sure that all assertions pass * * @param {EnforceContext} value * @param {[{test: Function, run: Function}]} ruleChains diff --git a/packages/n4s/src/runtime/EnforceContext.js b/packages/n4s/src/runtime/EnforceContext.js index 064f4b3fc..93679676d 100644 --- a/packages/n4s/src/runtime/EnforceContext.js +++ b/packages/n4s/src/runtime/EnforceContext.js @@ -1,10 +1,12 @@ +import assign from 'assign'; + /** * Stores values and configuration passed down to compound rules. * * @param {Object} content */ export default function EnforceContext(content) { - Object.assign(this, content); + assign(this, content); } /** diff --git a/packages/n4s/src/runtime/RuleResult.js b/packages/n4s/src/runtime/RuleResult.js index bc796686b..f448bb7e5 100644 --- a/packages/n4s/src/runtime/RuleResult.js +++ b/packages/n4s/src/runtime/RuleResult.js @@ -1,5 +1,6 @@ import hasOwnProperty from 'hasOwnProperty'; +import assign from 'assign'; import { isBoolean } from 'isBoolean'; import { isEmpty } from 'isEmpty'; import { isNull } from 'isNull'; @@ -113,7 +114,7 @@ RuleResult.prototype.extend = function (newRes) { const children = mergeChildren(res, this).children; - Object.assign(this, res); + assign(this, res); if (!isEmpty(children)) { this.children = children; } diff --git a/packages/n4s/src/runtime/enforce.extend.js b/packages/n4s/src/runtime/enforce.extend.js index 68d50acde..fb30c45fa 100644 --- a/packages/n4s/src/runtime/enforce.extend.js +++ b/packages/n4s/src/runtime/enforce.extend.js @@ -1,3 +1,4 @@ +import assign from 'assign'; import bindLazyRule from 'bindLazyRule'; import genRuleProxy from 'genRuleProxy'; import proxySupported from 'proxySupported'; @@ -5,7 +6,7 @@ import runtimeRules from 'runtimeRules'; export default function bindExtend(enforce, Enforce) { enforce.extend = customRules => { - Object.assign(runtimeRules, customRules); + assign(runtimeRules, customRules); if (!proxySupported()) { genRuleProxy(Enforce, bindLazyRule); diff --git a/packages/n4s/src/runtime/runtimeRules.js b/packages/n4s/src/runtime/runtimeRules.js index b9c69ded4..c4230d25c 100644 --- a/packages/n4s/src/runtime/runtimeRules.js +++ b/packages/n4s/src/runtime/runtimeRules.js @@ -1,5 +1,6 @@ +import assign from 'assign'; import compounds from 'compounds'; import ruleMeta from 'ruleMeta'; import rules from 'rules'; -export default Object.assign(rules(), compounds, ruleMeta); +export default assign(rules(), compounds, ruleMeta); diff --git a/packages/vest/docs/utilities.md b/packages/vest/docs/utilities.md index b738278a9..3ba767472 100644 --- a/packages/vest/docs/utilities.md +++ b/packages/vest/docs/utilities.md @@ -60,10 +60,8 @@ import vest, { test, enforce } from 'vest'; import any from 'vest/any'; vest.create('Checkout', () => { - test( - 'coupon', - 'When filled, must be at least 5 chars', - () => any( + test('coupon', 'When filled, must be at least 5 chars', () => + any( () => enforce(data.coupon).isEmpty(), () => enforce(data.coupon).longerThanOrEquals(5) ) diff --git a/packages/vest/src/core/ctx.js b/packages/vest/src/core/ctx.js index 678e917e7..be8a1f2a4 100644 --- a/packages/vest/src/core/ctx.js +++ b/packages/vest/src/core/ctx.js @@ -1,5 +1,6 @@ import createContext from 'context'; +import assign from 'assign'; import { EXCLUSION_ITEM_TYPE_TESTS, EXCLUSION_ITEM_TYPE_GROUPS, @@ -8,7 +9,7 @@ import { const context = createContext((ctxRef, parentContext) => parentContext ? null - : Object.assign( + : assign( {}, { exclusion: { diff --git a/packages/vest/src/core/produce/getFailuresByGroup.js b/packages/vest/src/core/produce/getFailuresByGroup.js index 0232640f4..496c8ade2 100644 --- a/packages/vest/src/core/produce/getFailuresByGroup.js +++ b/packages/vest/src/core/produce/getFailuresByGroup.js @@ -3,7 +3,7 @@ import throwError from 'throwError'; /** * Gets failure messages by group. - * @param {'warn'|'error'} severityKey Severity filter. + * @param {'errors'|'warnings'} severityKey lookup severity * @param {string} group Group name. * @param {string} [fieldName] Field name. */ diff --git a/packages/vest/src/core/produce/hasFailuresByGroup.js b/packages/vest/src/core/produce/hasFailuresByGroup.js index 4347786e7..fbd719505 100644 --- a/packages/vest/src/core/produce/hasFailuresByGroup.js +++ b/packages/vest/src/core/produce/hasFailuresByGroup.js @@ -3,7 +3,7 @@ import { useTestObjects } from 'stateHooks'; /** * Checks whether there are failures in a given group. - * @param {'warn'|'error'} severityKey Severity filter. + * @param {'errors'|'warnings'} severityKey lookup severity * @param {string} group Group name. * @param {string} [fieldName] Field name. * @return {boolean} diff --git a/packages/vest/src/core/test/__tests__/__snapshots__/runAsyncTest.test.js.snap b/packages/vest/src/core/test/__tests__/__snapshots__/runAsyncTest.test.js.snap index 2f0a6e971..e8a184263 100644 --- a/packages/vest/src/core/test/__tests__/__snapshots__/runAsyncTest.test.js.snap +++ b/packages/vest/src/core/test/__tests__/__snapshots__/runAsyncTest.test.js.snap @@ -6,14 +6,18 @@ Object { "pending": Object { "lagging": Array [], "pending": Array [ - VestTest { + Object { "asyncTest": Promise {}, + "cancel": [Function], + "fail": [Function], "failed": false, "fieldName": "field_1", "id": "0", "isWarning": false, "statement": "some statement string", "testFn": [Function], + "valueOf": [Function], + "warn": [Function], }, ], }, diff --git a/packages/vest/src/core/test/__tests__/each.test.js b/packages/vest/src/core/test/__tests__/each.test.js index d43735c63..2d38ac730 100644 --- a/packages/vest/src/core/test/__tests__/each.test.js +++ b/packages/vest/src/core/test/__tests__/each.test.js @@ -1,6 +1,5 @@ import faker from 'faker'; -import VestTest from 'VestTest'; import enforce from 'enforce'; import test from 'test'; import vest from 'vest'; @@ -22,8 +21,6 @@ describe("Test Vest's `test.each` function", () => { expect(testObjects).toHaveLength(2); expect(testObjects[0].failed).toBe(false); expect(testObjects[1].failed).toBe(false); - expect(testObjects[0]).toBeInstanceOf(VestTest); - expect(testObjects[1]).toBeInstanceOf(VestTest); }); it('Should mark failed tests as such', () => { diff --git a/packages/vest/src/core/test/__tests__/memo.test.js b/packages/vest/src/core/test/__tests__/memo.test.js index e94837e35..24b116e6c 100644 --- a/packages/vest/src/core/test/__tests__/memo.test.js +++ b/packages/vest/src/core/test/__tests__/memo.test.js @@ -147,7 +147,7 @@ describe('test.memo', () => { expect(newRes).toMatchSnapshot(); }); - it('Should return new VestTest instances', () => { + it('Should return testObject', () => { validate(2); expect(test1Set.size).toBe(2); expect(test2Set.size).toBe(2); diff --git a/packages/vest/src/core/test/__tests__/runAsyncTest.test.js b/packages/vest/src/core/test/__tests__/runAsyncTest.test.js index 7c618d276..9fa021c88 100644 --- a/packages/vest/src/core/test/__tests__/runAsyncTest.test.js +++ b/packages/vest/src/core/test/__tests__/runAsyncTest.test.js @@ -45,7 +45,7 @@ describe.each([CASE_PASSING /*, CASE_FAILING*/])( return state; }); }); - testObject = new VestTest({ + testObject = VestTest({ fieldName, statement: STATEMENT, testFn: () => null, @@ -120,7 +120,7 @@ describe.each([CASE_PASSING /*, CASE_FAILING*/])( beforeEach(() => { context.run({ stateRef }, () => { setPending( - new VestTest({ + VestTest({ fieldName: 'pending_field', statement: STATEMENT, testFn: jest.fn(), diff --git a/packages/vest/src/core/test/lib/VestTest.js b/packages/vest/src/core/test/lib/VestTest.js index 763998d75..34f647b8e 100644 --- a/packages/vest/src/core/test/lib/VestTest.js +++ b/packages/vest/src/core/test/lib/VestTest.js @@ -10,49 +10,55 @@ import removeTestFromState from 'removeTestFromState'; * @param {string} [group] The group in which the test runs. */ function VestTest({ fieldName, statement, testFn, group }) { - Object.assign(this, { + const testObject = { + cancel, + fail, failed: false, fieldName, id: id(), isWarning: false, statement, testFn, - }); + valueOf, + warn, + }; if (group) { - this.groupName = group; + testObject.groupName = group; } -} -/** - * @returns {Boolean} Current validity status of a test. - */ -VestTest.prototype.valueOf = function () { - return this.failed !== true; -}; + return testObject; -/** - * Sets a test to failed. - */ -VestTest.prototype.fail = function () { - this.failed = true; -}; + /** + * @returns {Boolean} Current validity status of a test. + */ + function valueOf() { + return testObject.failed !== true; + } -/** - * Sets a current test's `isWarning` to true. - */ -VestTest.prototype.warn = function () { - this.isWarning = true; -}; + /** + * Sets a test to failed. + */ + function fail() { + testObject.failed = true; + } -/** - * Marks a test as canceled, removes it from the state. - * This function needs to be called within a stateRef context. - */ -VestTest.prototype.cancel = function () { - this.canceled = true; - removePending(this); - removeTestFromState(this); -}; + /** + * Sets a current test's `isWarning` to true. + */ + function warn() { + testObject.isWarning = true; + } + + /** + * Marks a test as canceled, removes it from the state. + * This function needs to be called within a stateRef context. + */ + function cancel() { + testObject.canceled = true; + removePending(this); + removeTestFromState(this); + } +} export default VestTest; diff --git a/packages/vest/src/core/test/lib/__tests__/VestTest.test.js b/packages/vest/src/core/test/lib/__tests__/VestTest.test.js index 9b5d655a7..64cf2345f 100644 --- a/packages/vest/src/core/test/lib/__tests__/VestTest.test.js +++ b/packages/vest/src/core/test/lib/__tests__/VestTest.test.js @@ -17,7 +17,7 @@ describe('VestTest', () => { let testObject; beforeEach(() => { - testObject = new VestTest({ + testObject = VestTest({ fieldName, statement, testFn: jest.fn(), @@ -29,9 +29,8 @@ describe('VestTest', () => { }); it('Should have a unique id', () => { - Array.from( - { length: 100 }, - () => new VestTest({ fieldName, statement, testFn: jest.fn() }) + Array.from({ length: 100 }, () => + VestTest({ fieldName, statement, testFn: jest.fn() }) ).reduce((existing, { id }) => { expect(existing[id]).toBeUndefined(); existing[id] = true; @@ -53,7 +52,7 @@ describe('VestTest', () => { jest.resetModules(); const VestTest = require('VestTest'); - testObject = new VestTest({ + testObject = VestTest({ fieldName, statement, testFn: jest.fn(), diff --git a/packages/vest/src/core/test/lib/__tests__/__snapshots__/VestTest.test.js.snap b/packages/vest/src/core/test/lib/__tests__/__snapshots__/VestTest.test.js.snap index 0c1d235e2..7bbdb1631 100644 --- a/packages/vest/src/core/test/lib/__tests__/__snapshots__/VestTest.test.js.snap +++ b/packages/vest/src/core/test/lib/__tests__/__snapshots__/VestTest.test.js.snap @@ -1,23 +1,31 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`VestTest TestObject constructor 1`] = ` -VestTest { +Object { + "cancel": [Function], + "fail": [Function], "failed": false, "fieldName": "unicycle", "id": "0", "isWarning": false, "statement": "I am Root.", "testFn": [MockFunction], + "valueOf": [Function], + "warn": [Function], } `; exports[`VestTest testObject.warn Should set \`.isWarning\` to true 1`] = ` -VestTest { +Object { + "cancel": [Function], + "fail": [Function], "failed": false, "fieldName": "unicycle", "id": "102", "isWarning": true, "statement": "I am Root.", "testFn": [MockFunction], + "valueOf": [Function], + "warn": [Function], } `; diff --git a/packages/vest/src/core/test/lib/__tests__/__snapshots__/pending.test.js.snap b/packages/vest/src/core/test/lib/__tests__/__snapshots__/pending.test.js.snap index 87e5d9243..cc0b0e6eb 100644 --- a/packages/vest/src/core/test/lib/__tests__/__snapshots__/pending.test.js.snap +++ b/packages/vest/src/core/test/lib/__tests__/__snapshots__/pending.test.js.snap @@ -46,7 +46,9 @@ Object { "pending": Object { "lagging": Array [], "pending": Array [ - VestTest { + Object { + "cancel": [Function], + "fail": [Function], "failed": false, "fieldName": "test_0", "groupName": "group_name", @@ -54,6 +56,8 @@ Object { "isWarning": false, "statement": "Some statement string", "testFn": [MockFunction], + "valueOf": [Function], + "warn": [Function], }, ], }, @@ -75,25 +79,35 @@ Object { "optionalFields": Object {}, "pending": Object { "lagging": Array [ - VestTest { + Object { + "cancel": [Function], + "fail": [Function], "failed": false, "fieldName": "test_2", "id": "12", "isWarning": false, "statement": "Some statement string", "testFn": [MockFunction], + "valueOf": [Function], + "warn": [Function], }, - VestTest { + Object { + "cancel": [Function], + "fail": [Function], "failed": false, "fieldName": "test_1", "id": "11", "isWarning": false, "statement": "Some statement string", "testFn": [MockFunction], + "valueOf": [Function], + "warn": [Function], }, ], "pending": Array [ - VestTest { + Object { + "cancel": [Function], + "fail": [Function], "failed": false, "fieldName": "test_0", "groupName": "group_name", @@ -101,6 +115,8 @@ Object { "isWarning": false, "statement": "failure message", "testFn": [MockFunction], + "valueOf": [Function], + "warn": [Function], }, ], }, diff --git a/packages/vest/src/core/test/lib/__tests__/pending.test.js b/packages/vest/src/core/test/lib/__tests__/pending.test.js index 58a34c8b8..508105676 100644 --- a/packages/vest/src/core/test/lib/__tests__/pending.test.js +++ b/packages/vest/src/core/test/lib/__tests__/pending.test.js @@ -25,7 +25,7 @@ describe('module: pending', () => { beforeEach(() => { stateRef = runCreateRef(state); refContent = _.cloneDeep(expandStateRef(stateRef)); - testObject = new VestTest({ + testObject = VestTest({ fieldName: 'field_1', statement: 'failure_message', testFn: jest.fn(), @@ -93,14 +93,12 @@ describe('module: pending', () => { let testObjects; beforeEach(() => { - testObjects = Array.from( - { length: 5 }, - (v, i) => - new VestTest({ - fieldName: `test_${i}`, - statement: 'Some statement string', - testFn: jest.fn(), - }) + testObjects = Array.from({ length: 5 }, (v, i) => + VestTest({ + fieldName: `test_${i}`, + statement: 'Some statement string', + testFn: jest.fn(), + }) ); testObjects[0].groupName = groupName; }); @@ -138,7 +136,7 @@ describe('module: pending', () => { const [pendingState] = usePending(); expect(pendingState.lagging).toContain(testObjects[0]); } - const added = new VestTest({ + const added = VestTest({ fieldName: testObjects[0].fieldName, group: testObjects[0].groupName, statement: 'failure message', @@ -168,7 +166,7 @@ describe('module: pending', () => { it.ctx('Should set test as canceled', () => { expect(testObjects[0].canceled).toBeUndefined(); setPending( - new VestTest({ + VestTest({ fieldName: testObjects[0].fieldName, group: testObjects[0].groupName, statement: 'failure message', diff --git a/packages/vest/src/core/test/test.js b/packages/vest/src/core/test/test.js index b17c2fc24..951fd60d2 100644 --- a/packages/vest/src/core/test/test.js +++ b/packages/vest/src/core/test/test.js @@ -85,7 +85,7 @@ function test(fieldName, args) { const [, setSkippedTests] = useSkippedTests(); const { groupName } = context.use(); - const testObject = new VestTest({ + const testObject = VestTest({ fieldName, group: groupName, statement, diff --git a/packages/vest/src/hooks/__tests__/exclusive.test.js b/packages/vest/src/hooks/__tests__/exclusive.test.js index c021f11ce..b0e88d087 100644 --- a/packages/vest/src/hooks/__tests__/exclusive.test.js +++ b/packages/vest/src/hooks/__tests__/exclusive.test.js @@ -17,13 +17,13 @@ describe('exclusive hooks', () => { let field1, field2, field3; beforeEach(() => { - field1 = new VestTest({ + field1 = VestTest({ fieldName: faker.lorem.word(), }); - field2 = new VestTest({ + field2 = VestTest({ fieldName: faker.lorem.slug(), }); - field3 = new VestTest({ + field3 = VestTest({ fieldName: faker.random.word(), }); }); diff --git a/packages/vest/src/vest.mjs.js b/packages/vest/src/vest.mjs.js index 8efe4d9bb..c8a288227 100644 --- a/packages/vest/src/vest.mjs.js +++ b/packages/vest/src/vest.mjs.js @@ -1,4 +1,4 @@ - import create from 'createSuite'; +import create from 'createSuite'; import enforce from 'enforce'; import { only, skip, warn, group, skipWhen, optional } from 'hooks'; import test from 'test';