diff --git a/jsconfig.json b/jsconfig.json index a38b1f69d..b990f0e9d 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -35,18 +35,9 @@ "enforceRunner": [ "./packages/n4s/src/enforce/enforceRunner.js" ], - "ensure": [ - "./packages/n4s/src/ensure/ensure.js" - ], - "ensureRunner": [ - "./packages/n4s/src/ensure/ensureRunner.js" - ], "enforceExtended": [ "./packages/n4s/src/extended/enforceExtended.js" ], - "ensureExtended": [ - "./packages/n4s/src/extended/ensureExtended.js" - ], "rulesExtended": [ "./packages/n4s/src/extended/rulesExtended.js" ], diff --git a/packages/n4s/README.md b/packages/n4s/README.md index 4db05eb36..7f9d4c6cb 100644 --- a/packages/n4s/README.md +++ b/packages/n4s/README.md @@ -26,12 +26,21 @@ enforce(4) npm i n4s ``` -## Using enforce without a testing framework +## Non throwing validations -If you wish to use enforce's functionality without it throwing errors, you can use its [ensure](https://ealush.github.io/n4s/#/ensure) interface. +> This functionality replaces the no-longer supported ensure export, as it performs the same functionality with better performance. + +If you wish to use enforce's functionality safely with a boolean return interface, you can use its lazy validation interface: + +```js +enforce + .isArray() + .longerThan(3) + .test([1,2,3]) +``` [Read the docs](https://ealush.github.io/n4s) - [List of enforce rules](https://ealush.github.io/n4s/#/rules) +- [Schema validation](https://ealush.github.io/n4s/#/shape) - [Custom enforce rules](https://ealush.github.io/n4s/#/custom) -- [Non throwing validations](https://ealush.github.io/n4s/#/ensure) diff --git a/packages/n4s/config/rollup/ensure.js b/packages/n4s/config/rollup/ensure.js deleted file mode 100644 index 738e0eafa..000000000 --- a/packages/n4s/config/rollup/ensure.js +++ /dev/null @@ -1,14 +0,0 @@ -const genConfig = require('../../../../config/rollup/genConfig'); -const writeMainTemplate = require('../../../../scripts/build/writeMainTemplate'); -const { packageDist, packageNames } = require('../../../../util'); - -const distPath = packageDist(packageNames.N4S); - -writeMainTemplate('ensure', distPath); - -export default genConfig({ - distPath, - input: 'ensure/ensure.js', - libraryName: 'ensure', - packageName: packageNames.N4S, -}); diff --git a/packages/n4s/config/rollup/rollup.config.js b/packages/n4s/config/rollup/rollup.config.js index 58de9cbd9..f1539b735 100644 --- a/packages/n4s/config/rollup/rollup.config.js +++ b/packages/n4s/config/rollup/rollup.config.js @@ -1,5 +1,4 @@ import enforce from './enforce'; import enforceExtended from './enforceExtended'; -import ensure from './ensure'; -export default [].concat(enforce, ensure, enforceExtended); +export default [].concat(enforce, enforceExtended); diff --git a/packages/n4s/docs/README.md b/packages/n4s/docs/README.md index 7d9bf5c2d..ba03a251e 100644 --- a/packages/n4s/docs/README.md +++ b/packages/n4s/docs/README.md @@ -26,13 +26,22 @@ enforce(4) npm i n4s ``` -## Using enforce without a testing framework +## Non throwing validations -If you wish to use enforce's functionality without it throwing errors, you can use its [ensure](./ensure) interface. +> This functionality replaces the no-longer supported ensure export, as it performs the same functionality with better performance. + +If you wish to use enforce's functionality safely with a boolean return interface instead, you can use its lazy validation interface: + +```js +enforce + .isArray() + .longerThan(3) + .test([1,2,3]) +``` ## Content - [List of Enforce rules](./rules) - [Business reated rules](./business_rules) +- [Schema validation](./shape) - [Custom Enforce Rules](./custom) -- [Non throwing validations (ensure)](./ensure) diff --git a/packages/n4s/docs/_sidebar.md b/packages/n4s/docs/_sidebar.md index f198a067e..8665f90c8 100644 --- a/packages/n4s/docs/_sidebar.md +++ b/packages/n4s/docs/_sidebar.md @@ -3,4 +3,3 @@ - [Business reated rules](./business_rules) - [Schema validations](./shape) - [Custom Enforce Rules](./custom) -- [Non throwing validations (ensure)](./ensure) diff --git a/packages/n4s/docs/ensure.md b/packages/n4s/docs/ensure.md deleted file mode 100644 index a49796c35..000000000 --- a/packages/n4s/docs/ensure.md +++ /dev/null @@ -1,40 +0,0 @@ -# Not-throwing validations (ensure) - -If you do not use a validations testing library but still want to use enforce [rules](./rules), you can use the ensure interface. - -Ensure is similar to enforce, only that it returns a boolean value instead of throwing an error. - -Since ensure has no way of knowing when you are done adding rules, you have to do that by putting the `.test()` function last with your value as its argument. - -## Usage example - -For example, if I want to test that the number 4 is both numeric, and is less than 5, I would: - -```js -import ensure from 'n4s/ensure'; - -ensure().isNumeric().lessThan(5).test(4); // The value I am testing. -// `.test()` is always the last function passed - -// returns true -``` - -## Custom rules - -You can [extend](./custom) ensure in the same way you extend enforce. - -```js -import ensure from 'n4s/ensure'; - -ensure.extend({ - isValidEmail: value => value.includes('@'), -}); - -ensure().isValidEmail().test('some invali dstring'); - -// returns false - -ensure().isValidEmail().test('valid@email.com'); - -// returns true -``` diff --git a/packages/n4s/package.json b/packages/n4s/package.json index 9a8ffb9fc..149cac0f4 100644 --- a/packages/n4s/package.json +++ b/packages/n4s/package.json @@ -14,19 +14,9 @@ "./enforceExtended.umd.development.js": "./enforceExtended.umd.development.js", "./enforceExtended.umd.production.js": "./enforceExtended.umd.production.js", "./enforceExtended.umd.production.min.js": "./enforceExtended.umd.production.min.js", - "./ensure.cjs.development.js": "./ensure.cjs.development.js", - "./ensure.cjs.production.js": "./ensure.cjs.production.js", - "./ensure.cjs.production.min.js": "./ensure.cjs.production.min.js", - "./ensure.js": "./ensure.js", - "./ensure.umd.development.js": "./ensure.umd.development.js", - "./ensure.umd.production.js": "./ensure.umd.production.js", - "./ensure.umd.production.min.js": "./ensure.umd.production.min.js", "./esm/enforceExtended.mjs.development.js": "./esm/enforceExtended.mjs.development.js", "./esm/enforceExtended.mjs.production.js": "./esm/enforceExtended.mjs.production.js", "./esm/enforceExtended.mjs.production.min.js": "./esm/enforceExtended.mjs.production.min.js", - "./esm/ensure.mjs.development.js": "./esm/ensure.mjs.development.js", - "./esm/ensure.mjs.production.js": "./esm/ensure.mjs.production.js", - "./esm/ensure.mjs.production.min.js": "./esm/ensure.mjs.production.min.js", "./esm/n4s.mjs.development.js": "./esm/n4s.mjs.development.js", "./esm/n4s.mjs.production.js": "./esm/n4s.mjs.production.js", "./esm/n4s.mjs.production.min.js": "./esm/n4s.mjs.production.min.js", diff --git a/packages/n4s/src/ensure/__tests__/ensure.test.js b/packages/n4s/src/ensure/__tests__/ensure.test.js deleted file mode 100644 index 00161a77b..000000000 --- a/packages/n4s/src/ensure/__tests__/ensure.test.js +++ /dev/null @@ -1,85 +0,0 @@ -import { sample } from 'lodash'; - -import rules from 'rules'; - -const allRules = Object.keys(rules()); -const _proxy = Proxy; - -const suite = ({ withProxy, requirePath }) => - describe('Test ensure function', () => { - let ensure; - beforeAll(() => { - jest.resetModules(); - if (!withProxy) { - global.Proxy = undefined; - delete global.Proxy; - } - ensure = require(requirePath); - }); - - afterAll(() => { - global.Proxy = _proxy; - }); - - describe('.test() function', () => { - describe('When validation succeeds', () => { - it('Should return true', () => { - expect( - [ - ensure().inside([1, 2, 3]).test(1), - ensure().isNumber().test(1), - ensure().isArray().test([1]), - ensure().greaterThan(5).test(10), - ensure().greaterThan(5).lt(100).test(10), - ].every(res => !!res) - ).toBe(true); - }); - }); - - describe('When validation fails', () => { - it('Should return false', () => { - expect( - [ - ensure().inside([1, 2, 3]).test(10), - ensure().isNumber().test('1'), - ensure().isArray().test(1), - ensure().greaterThan(5).test(2), - ensure().greaterThan(5).lt(100).test(101), - ].every(res => !res) - ).toBe(true); - }); - }); - }); - - describe('Rules object', () => { - it('Should expose rules as functions', () => { - const en = ensure(); - allRules.forEach(rule => expect(en[rule]).toBeInstanceOf(Function)); - }); - - it('Should expose `test` function', () => { - expect( - ensure()[sample(allRules)]()[sample(allRules)]().test - ).toBeInstanceOf(Function); - }); - - it('Should predictably return rule object with same rules', () => { - expect(Object.keys(ensure())).toEqual(Object.keys(ensure())); - }); - - it('Should return same rules object after every rule call', () => { - let en; - en = ensure(); - expect(en[sample(allRules)]()).toBe(en[sample(allRules)]()); - expect(en[sample(allRules)]()).toBe(en); - en = ensure(); - expect(en[sample(allRules)]()).toBe(en[sample(allRules)]()); - expect(en[sample(allRules)]()).toBe(en); - }); - }); - }); - -['ensure', '../../../dist/ensure'].forEach(requirePath => { - suite({ withProxy: true, requirePath }); - suite({ withProxy: false, requirePath }); -}); diff --git a/packages/n4s/src/ensure/__tests__/ensureRunner.test.js b/packages/n4s/src/ensure/__tests__/ensureRunner.test.js deleted file mode 100644 index 6a2d1ebc7..000000000 --- a/packages/n4s/src/ensure/__tests__/ensureRunner.test.js +++ /dev/null @@ -1,15 +0,0 @@ -import runner from 'ensureRunner'; - -describe('Test ensure runner', () => { - describe('When failing output', () => { - it('Should return false', () => { - expect(runner(n => n === 2, 1)).toBe(false); - }); - }); - - describe('When passing output', () => { - it('Should return true', () => { - expect(runner(n => n === 1, 1)).toBe(true); - }); - }); -}); diff --git a/packages/n4s/src/ensure/ensure.js b/packages/n4s/src/ensure/ensure.js deleted file mode 100644 index 2f9bc876d..000000000 --- a/packages/n4s/src/ensure/ensure.js +++ /dev/null @@ -1,75 +0,0 @@ -import runner from 'ensureRunner'; -import isRule from 'isRule'; -import proxySupported from 'proxySupported'; -import rules from 'rules'; - -/** - * Accepts list of registered rules and returns a test function - * That runs against them to return a boolean - * - * @param {Array} registeredRules - * @return {Function} test function - */ -const createTestFn = registeredRules => value => - registeredRules.every(({ name, args }) => - runner(rulesObject[name], value, ...args) - ); - -let ensure, rulesList; - -const rulesObject = rules(); - -if (proxySupported()) { - ensure = () => { - const registeredRules = []; - - const proxy = new Proxy(rulesObject, { - get: (rules, ruleName) => { - if (ruleName === 'test') { - return createTestFn(registeredRules); - } - - if (!isRule(rulesObject, ruleName)) { - return; - } - - return (...args) => { - registeredRules.push({ name: ruleName, args }); - return proxy; - }; - }, - }); - - return proxy; - }; -} else { - rulesList = Object.keys(rulesObject); - - ensure = () => { - const registeredRules = []; - return rulesList.reduce( - (allRules, ruleName) => - Object.assign(allRules, { - ...(isRule(rulesObject, ruleName) && { - [ruleName]: (...args) => { - registeredRules.push({ name: ruleName, args }); - return allRules; - }, - }), - }), - { - test: createTestFn(registeredRules), - } - ); - }; -} - -ensure.extend = customRules => { - Object.assign(rulesObject, customRules); - - if (proxySupported()) { - rulesList = Object.keys(rulesObject); - } -}; - -export default ensure; diff --git a/packages/n4s/src/ensure/ensureRunner.js b/packages/n4s/src/ensure/ensureRunner.js deleted file mode 100644 index 5bc555ecf..000000000 --- a/packages/n4s/src/ensure/ensureRunner.js +++ /dev/null @@ -1,19 +0,0 @@ -import { transformResult } from 'transformResult'; - -/** - * Run a single rule against ensured value (e.g. `isNumber()`) - * @param {Function} rule - rule to run - * @param {Any} value - * @param {Array} args list of arguments sent from consumer - * @return {Boolean} - */ -function runner(rule, value, ...args) { - try { - const result = rule(value, ...args); - return transformResult(result, { rule, value }).pass; - } catch (err) { - return false; - } -} - -export default runner; diff --git a/packages/n4s/src/extended/ensureExtended.js b/packages/n4s/src/extended/ensureExtended.js deleted file mode 100644 index c2cee50b8..000000000 --- a/packages/n4s/src/extended/ensureExtended.js +++ /dev/null @@ -1,14 +0,0 @@ -import ensure from 'ensure'; -import rules, { - isAlphanumericLocales, - isMobilePhoneLocales, - isPostalCodeLocales, -} from 'rulesExtended'; - -ensure.extend(rules); - -export default Object.assign(ensure, { - isAlphanumericLocales, - isMobilePhoneLocales, - isPostalCodeLocales, -}); diff --git a/packages/vest/docs/enforce.md b/packages/vest/docs/enforce.md index c455ba22b..b81b7f176 100644 --- a/packages/vest/docs/enforce.md +++ b/packages/vest/docs/enforce.md @@ -1291,9 +1291,9 @@ enforce.extend({ ## Shape validations -Enforce (only, not ensure) comes with a built-in lean schema validator rule called `shape`. It allows you to use all the existing and custom rules of enforce to validate the shape of an object. +Enforce comes with a built-in lean schema validator rule called `shape`. It allows you to use all the existing and custom rules of enforce to validate the shape of an object. -When using enforce rules inside your shape, use the rules that exist as properties on enforce itself (`enforce.isString()`). For rules used like this, rule chaining is not possible. +When using enforce rules inside your shape, use the rules that exist as properties on enforce itself (`enforce.isString()`). ### Example diff --git a/packages/vest/src/typings/vest.d.ts b/packages/vest/src/typings/vest.d.ts index 4a1d1b52b..d45b6ace1 100644 --- a/packages/vest/src/typings/vest.d.ts +++ b/packages/vest/src/typings/vest.d.ts @@ -204,7 +204,7 @@ type LazyInside = ( type TEnforceLazy = { [key: string]: (...args: any[]) => TEnforceLazy | boolean; - run: (...args: any[]) => boolean; + test: (...args: any[]) => boolean; equals: LazyAny; notEquals: LazyAny; numberEquals: LazyNumeral;