Initial commit
commit
0d7f280311
@ -0,0 +1 @@
|
|||||||
|
node_modules
|
@ -0,0 +1,5 @@
|
|||||||
|
# @validatem/wrap-error
|
||||||
|
|
||||||
|
Documentation for this module has not been written yet. By the time it reaches 1.0.0, it will have full documentation.
|
||||||
|
|
||||||
|
In the meantime, check out the `example.js` file in the repository for a usage demonstration.
|
@ -0,0 +1,39 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
const { validateValue } = require("@validatem/core");
|
||||||
|
const isString = require("@validatem/is-string");
|
||||||
|
const wrapError = require("./");
|
||||||
|
|
||||||
|
/*** Simple rules ***/
|
||||||
|
|
||||||
|
let rule = wrapError("This is a custom error message complaining that the value must be a string!", [ isString ]);
|
||||||
|
|
||||||
|
console.log(validateValue("hello world", [ rule ])); // hello world
|
||||||
|
|
||||||
|
try {
|
||||||
|
console.log(validateValue(42, [ rule ]));
|
||||||
|
} catch (error) {
|
||||||
|
console.log("Error occurred:", error.stack); /*
|
||||||
|
Error occurred: AggregrateValidationError: One or more validation errors occurred:
|
||||||
|
- At (root): This is a custom error message complaining that the value must be a string!
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** Combinators with properties, and preserving the original errors as well ***/
|
||||||
|
|
||||||
|
let objectRule = wrapError("Must be a valid thingem", {
|
||||||
|
a: [ isString ],
|
||||||
|
b: [ isString ]
|
||||||
|
}, { preserveOriginalErrors: true });
|
||||||
|
|
||||||
|
let objectA = { a: "hello", b: "world" };
|
||||||
|
|
||||||
|
console.log(validateValue(objectA, [ objectRule ])); // { a: 'hello', b: 'world' }
|
||||||
|
|
||||||
|
let objectB = { a: "hello", b: 42 };
|
||||||
|
|
||||||
|
console.log(validateValue(objectB, [ objectRule ])); /*
|
||||||
|
AggregrateValidationError: One or more validation errors occurred:
|
||||||
|
- At (root): Must be a valid thingem
|
||||||
|
- At b: Must be a string
|
||||||
|
*/
|
@ -0,0 +1,79 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
const defaultValue = require("default-value");
|
||||||
|
const asExpression = require("as-expression");
|
||||||
|
const splitFilterN = require("split-filter-n");
|
||||||
|
|
||||||
|
const combinator = require("@validatem/combinator");
|
||||||
|
const ValidationError = require("@validatem/error");
|
||||||
|
const matchValidationError = require("@validatem/match-validation-error");
|
||||||
|
const validationResult = require("@validatem/validation-result");
|
||||||
|
|
||||||
|
// TODO: Document that this passes on context
|
||||||
|
|
||||||
|
function concat(arrays) {
|
||||||
|
return arrays.slice(1).reduce((combined, array) => {
|
||||||
|
return combined.concat(array);
|
||||||
|
}, arrays[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function wrapError(message, rules, options = {}) {
|
||||||
|
let preserveOriginalErrors = defaultValue(options.preserveOriginalErrors, false);
|
||||||
|
|
||||||
|
return combinator((value, applyValidators, context) => {
|
||||||
|
let result = applyValidators(value, rules, context);
|
||||||
|
|
||||||
|
if (result.errors.length > 0) {
|
||||||
|
let { errors, newValue } = result;
|
||||||
|
|
||||||
|
let errorsByType = splitFilterN(errors, [ "validationRoot", "validationPath", "other" ], (error) => {
|
||||||
|
if (matchValidationError(error)) {
|
||||||
|
if (error.path.length === 0) {
|
||||||
|
return "validationRoot";
|
||||||
|
} else {
|
||||||
|
return "validationPath";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return "other";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let hasRootValidationErrors = errorsByType.validationRoot.length > 0;
|
||||||
|
let hasPathValidationErrors = errorsByType.validationPath.length > 0;
|
||||||
|
let hasValidationErrors = hasRootValidationErrors || hasPathValidationErrors;
|
||||||
|
|
||||||
|
let transformedValidationErrors = asExpression(() => {
|
||||||
|
if (hasValidationErrors) {
|
||||||
|
if (!preserveOriginalErrors) {
|
||||||
|
return [ new ValidationError(message) ];
|
||||||
|
} else {
|
||||||
|
let newRootErrors = (hasRootValidationErrors)
|
||||||
|
? errorsByType.validationRoot.map((error) => {
|
||||||
|
// TODO: Currently we cannot set `originalError` due to a bug in `create-error`; switch to a better error implementation
|
||||||
|
// return new ValidationError(`${message} (${error.message})`, { originalError: error })
|
||||||
|
return new ValidationError(`${message} (${error.message})`)
|
||||||
|
})
|
||||||
|
: [ new ValidationError(message) ];
|
||||||
|
|
||||||
|
return concat([
|
||||||
|
newRootErrors,
|
||||||
|
errorsByType.validationPath
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return validationResult({
|
||||||
|
newValue: newValue,
|
||||||
|
errors: concat([
|
||||||
|
transformedValidationErrors,
|
||||||
|
errorsByType.other
|
||||||
|
])
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "@validatem/wrap-error",
|
||||||
|
"description": "Validatem combinator for overriding the validation error message that is produced when a (set of) rules fails",
|
||||||
|
"keywords": [
|
||||||
|
"validatem",
|
||||||
|
"validator",
|
||||||
|
"combinator"
|
||||||
|
],
|
||||||
|
"version": "0.1.0",
|
||||||
|
"main": "index.js",
|
||||||
|
"repository": "http://git.cryto.net/validatem/wrap-error.git",
|
||||||
|
"author": "Sven Slootweg <admin@cryto.net>",
|
||||||
|
"license": "WTFPL OR CC0-1.0",
|
||||||
|
"devDependencies": {
|
||||||
|
"@validatem/core": "^0.3.1",
|
||||||
|
"@validatem/is-string": "^0.1.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@validatem/combinator": "^0.1.1",
|
||||||
|
"@validatem/error": "^1.0.0",
|
||||||
|
"@validatem/match-validation-error": "^0.1.0",
|
||||||
|
"@validatem/validation-result": "^0.1.2",
|
||||||
|
"as-expression": "^1.0.0",
|
||||||
|
"default-value": "^1.0.0",
|
||||||
|
"split-filter-n": "^1.1.2"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,189 @@
|
|||||||
|
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||||
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
"@validatem/annotate-errors@^0.1.2":
|
||||||
|
version "0.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/annotate-errors/-/annotate-errors-0.1.2.tgz#fa9152bb30f4f42b69496b527e38f0c31ff605a9"
|
||||||
|
integrity sha512-EuX7pzdYI/YpTmZcgdPG481Oi3elAg8JWh/LYXuE1h6MaZk3A8eP5DD33/l7EoKzrysn6y8nCsqNa1ngei562w==
|
||||||
|
dependencies:
|
||||||
|
"@validatem/match-validation-error" "^0.1.0"
|
||||||
|
|
||||||
|
"@validatem/any-property@^0.1.0":
|
||||||
|
version "0.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/any-property/-/any-property-0.1.2.tgz#e6cced130ced057ab185d1a61034b77cb277a5ad"
|
||||||
|
integrity sha512-WHiUM9oKTVc3w1ZWXb2c09yx6pT65Z9oPJC6/rEJtygtsL+H5B8PlAAH16BllPxLF1ebeLlEhXs3qwau5I0USQ==
|
||||||
|
dependencies:
|
||||||
|
"@validatem/annotate-errors" "^0.1.2"
|
||||||
|
"@validatem/combinator" "^0.1.0"
|
||||||
|
"@validatem/error" "^1.0.0"
|
||||||
|
"@validatem/validation-result" "^0.1.1"
|
||||||
|
"@validatem/virtual-property" "^0.1.0"
|
||||||
|
default-value "^1.0.0"
|
||||||
|
|
||||||
|
"@validatem/combinator@^0.1.0", "@validatem/combinator@^0.1.1":
|
||||||
|
version "0.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/combinator/-/combinator-0.1.1.tgz#202f31243f8d57cf87f1b449405b134e2fa40c5a"
|
||||||
|
integrity sha512-crzAYCmKUcb1DC5sSpdof4gWHX81VRmm+REWflhFuRlKH6JHRV5RcBCxEjlDfRrxW2yF6s9i0rQAOyVVE+GGAg==
|
||||||
|
|
||||||
|
"@validatem/core@^0.3.1":
|
||||||
|
version "0.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/core/-/core-0.3.1.tgz#33ea24ba4d4c516b5836703aea7e7da0afb6c227"
|
||||||
|
integrity sha512-k9OgvVqxX6rKmnkEQGi14pBqsilXu8pIVelaQsI/3tI5xVDDE5podpuPAJVrIsepy2berCtN9KSD/NCDhX1wLg==
|
||||||
|
dependencies:
|
||||||
|
"@validatem/annotate-errors" "^0.1.2"
|
||||||
|
"@validatem/any-property" "^0.1.0"
|
||||||
|
"@validatem/error" "^1.0.0"
|
||||||
|
"@validatem/is-plain-object" "^0.1.0"
|
||||||
|
"@validatem/match-validation-error" "^0.1.0"
|
||||||
|
"@validatem/match-versioned-special" "^0.1.0"
|
||||||
|
"@validatem/match-virtual-property" "^0.1.0"
|
||||||
|
"@validatem/normalize-rules" "^0.1.0"
|
||||||
|
"@validatem/required" "^0.1.0"
|
||||||
|
"@validatem/validation-result" "^0.1.1"
|
||||||
|
assure-array "^1.0.0"
|
||||||
|
create-error "^0.3.1"
|
||||||
|
default-value "^1.0.0"
|
||||||
|
flatten "^1.0.3"
|
||||||
|
is-arguments "^1.0.4"
|
||||||
|
|
||||||
|
"@validatem/error@^1.0.0":
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/error/-/error-1.0.0.tgz#a975904aa4c3e7618d89088a393567a5e1778340"
|
||||||
|
integrity sha512-7M3tV4DhCuimuCRdC2L/topBByDjhzspzeQGNU0S4/mdn2aDNtESYE43K/2Kh/utCAhqXh2gyw89WYxy//t3fQ==
|
||||||
|
dependencies:
|
||||||
|
create-error "^0.3.1"
|
||||||
|
|
||||||
|
"@validatem/has-shape@^0.1.0":
|
||||||
|
version "0.1.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/has-shape/-/has-shape-0.1.4.tgz#678ebcd2864628515531d75e1b5491387a97bfd9"
|
||||||
|
integrity sha512-MVN4BOxRfsa2D95Lwp8Dh9I8paAhTYgBpZbDAFnyEv51qlGTQPeAnunnslFS+K38QLa9E96Dk5Vs8Pn7F5XH9g==
|
||||||
|
dependencies:
|
||||||
|
"@validatem/annotate-errors" "^0.1.2"
|
||||||
|
"@validatem/combinator" "^0.1.0"
|
||||||
|
"@validatem/error" "^1.0.0"
|
||||||
|
"@validatem/validation-result" "^0.1.1"
|
||||||
|
as-expression "^1.0.0"
|
||||||
|
assure-array "^1.0.0"
|
||||||
|
default-value "^1.0.0"
|
||||||
|
flatten "^1.0.3"
|
||||||
|
|
||||||
|
"@validatem/is-plain-object@^0.1.0":
|
||||||
|
version "0.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/is-plain-object/-/is-plain-object-0.1.1.tgz#b7a3ef8ef960882c7c41e84ed709fa0bfb932e93"
|
||||||
|
integrity sha512-aNGbNIbKRpYI0lRBczlTBbiA+nqN52ADAASdySKg2/QeSCVtYS4uOIeCNIJRAgXe/5sUnLTuL4pgq628uAl7Kw==
|
||||||
|
dependencies:
|
||||||
|
"@validatem/error" "^1.0.0"
|
||||||
|
is-plain-obj "^2.1.0"
|
||||||
|
|
||||||
|
"@validatem/is-string@^0.1.1":
|
||||||
|
version "0.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/is-string/-/is-string-0.1.1.tgz#0710d8cebedd4d6861b4a8c63d7803ed6d2f9d6c"
|
||||||
|
integrity sha512-iyRVYRPgRt2ZlWyc7pzN1WkO6apzE8at39XQa4WUr8qRPfJn12V4khS9MumWbZs8N2qqajrxMigB2LJUCKOCRg==
|
||||||
|
dependencies:
|
||||||
|
"@validatem/error" "^1.0.0"
|
||||||
|
is-string "^1.0.5"
|
||||||
|
|
||||||
|
"@validatem/match-special@^0.1.0":
|
||||||
|
version "0.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/match-special/-/match-special-0.1.0.tgz#4e0c28f1aee5bf53c1ef30bbf8c755d4946ae0ff"
|
||||||
|
integrity sha512-TFiq9Wk/1Hoja4PK85WwNYnwBXk3+Lgoj59ZIMxm2an1qmNYp8j+BnSvkKBflba451yIn6V1laU9NJf+/NYZgw==
|
||||||
|
|
||||||
|
"@validatem/match-validation-error@^0.1.0":
|
||||||
|
version "0.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/match-validation-error/-/match-validation-error-0.1.0.tgz#fa87f5f1836e7c1d9bf6b75b2addf0a5b21e4c1e"
|
||||||
|
integrity sha512-6akGTk7DdulOreyqDiGdikwRSixQz/AlvARSX18dcWaTFc79KxCLouL2hyoFcor9IIUhu5RTY4/i756y4T1yxA==
|
||||||
|
dependencies:
|
||||||
|
"@validatem/match-versioned-special" "^0.1.0"
|
||||||
|
|
||||||
|
"@validatem/match-versioned-special@^0.1.0":
|
||||||
|
version "0.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/match-versioned-special/-/match-versioned-special-0.1.0.tgz#2eacc48debecdbbe7e3d02f0c0a665afaea9bedf"
|
||||||
|
integrity sha512-xoOTY0bdA2ELj+ntcDVJ8YyMEFIJpjZ4HNPL9lGcbnRFwJBhQcHUAhUpZwkMxu02zH9wkNM1FvYGHxPz40745Q==
|
||||||
|
|
||||||
|
"@validatem/match-virtual-property@^0.1.0":
|
||||||
|
version "0.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/match-virtual-property/-/match-virtual-property-0.1.0.tgz#4de2de1075987b5f3b356d3f2bcf6c0be5b5fb83"
|
||||||
|
integrity sha512-ssd3coFgwbLuqvZftLZTy3eHN0TFST8oTS2XTViQdXJPXVoJmwEKBpFhXgwnb5Ly1CE037R/KWpjhd1TP/56kQ==
|
||||||
|
|
||||||
|
"@validatem/normalize-rules@^0.1.0":
|
||||||
|
version "0.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/normalize-rules/-/normalize-rules-0.1.2.tgz#6529f17a6f36c6e2ae3ef285c59347c2ea208aa1"
|
||||||
|
integrity sha512-IHc81Sy/W0OiCbmvE3kTB+5OPVJnXWHP2tTXvKO6hVH0qykclMvIPRGgZf1s4dLaeOLKdkkfKyO/pLTVyNCIbA==
|
||||||
|
dependencies:
|
||||||
|
"@validatem/has-shape" "^0.1.0"
|
||||||
|
"@validatem/is-plain-object" "^0.1.0"
|
||||||
|
"@validatem/match-special" "^0.1.0"
|
||||||
|
assure-array "^1.0.0"
|
||||||
|
default-value "^1.0.0"
|
||||||
|
flatten "^1.0.3"
|
||||||
|
is-plain-obj "^2.1.0"
|
||||||
|
|
||||||
|
"@validatem/required@^0.1.0":
|
||||||
|
version "0.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/required/-/required-0.1.1.tgz#64f4a87333fc5955511634036b7f8948ed269170"
|
||||||
|
integrity sha512-vI4NzLfay4RFAzp7xyU34PHb8sAo6w/3frrNh1EY9Xjnw2zxjY5oaxwmbFP1jVevBE6QQEnKogtzUHz/Zuvh6g==
|
||||||
|
|
||||||
|
"@validatem/validation-result@^0.1.1", "@validatem/validation-result@^0.1.2":
|
||||||
|
version "0.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/validation-result/-/validation-result-0.1.2.tgz#4e75cfd87305fc78f8d05ac84921a2c99a0348e0"
|
||||||
|
integrity sha512-okmP8JarIwIgfpaVcvZGuQ1yOsLKT3Egt49Ynz6h1MAeGsP/bGHXkkXtbiWOVsk5Tzku5vDVFSrFnF+5IEHKxw==
|
||||||
|
dependencies:
|
||||||
|
default-value "^1.0.0"
|
||||||
|
|
||||||
|
"@validatem/virtual-property@^0.1.0":
|
||||||
|
version "0.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@validatem/virtual-property/-/virtual-property-0.1.0.tgz#880540dfd149f98ecf1095d93912e34443381fe4"
|
||||||
|
integrity sha512-JUUvWtdqoSkOwlsl20oB3qFHYIL05a/TAfdY4AJcs55QeVTiX5iI1b8IoQW644sIWWooBuLv+XwoxjRsQFczlQ==
|
||||||
|
|
||||||
|
as-expression@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/as-expression/-/as-expression-1.0.0.tgz#7bc620ca4cb2fe0ee90d86729bd6add33b8fd831"
|
||||||
|
integrity sha512-Iqh4GxNUfxbJdGn6b7/XMzc8m1Dz2ZHouBQ9DDTzyMRO3VPPIAXeoY/sucRxxxXKbUtzwzWZSN6jPR3zfpYHHA==
|
||||||
|
|
||||||
|
assure-array@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/assure-array/-/assure-array-1.0.0.tgz#4f4ad16a87659d6200a4fb7103462033d216ec1f"
|
||||||
|
integrity sha1-T0rRaodlnWIApPtxA0YgM9IW7B8=
|
||||||
|
|
||||||
|
create-error@^0.3.1:
|
||||||
|
version "0.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/create-error/-/create-error-0.3.1.tgz#69810245a629e654432bf04377360003a5351a23"
|
||||||
|
integrity sha1-aYECRaYp5lRDK/BDdzYAA6U1GiM=
|
||||||
|
|
||||||
|
default-value@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/default-value/-/default-value-1.0.0.tgz#8c6f52a5a1193fe78fdc9f86eb71d16c9757c83a"
|
||||||
|
integrity sha1-jG9SpaEZP+eP3J+G63HRbJdXyDo=
|
||||||
|
dependencies:
|
||||||
|
es6-promise-try "0.0.1"
|
||||||
|
|
||||||
|
es6-promise-try@0.0.1:
|
||||||
|
version "0.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/es6-promise-try/-/es6-promise-try-0.0.1.tgz#10f140dad27459cef949973e5d21a087f7274b20"
|
||||||
|
integrity sha1-EPFA2tJ0Wc75SZc+XSGgh/cnSyA=
|
||||||
|
|
||||||
|
flatten@^1.0.3:
|
||||||
|
version "1.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b"
|
||||||
|
integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==
|
||||||
|
|
||||||
|
is-arguments@^1.0.4:
|
||||||
|
version "1.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3"
|
||||||
|
integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==
|
||||||
|
|
||||||
|
is-plain-obj@^2.1.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
|
||||||
|
integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
|
||||||
|
|
||||||
|
is-string@^1.0.5:
|
||||||
|
version "1.0.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
|
||||||
|
integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
|
||||||
|
|
||||||
|
split-filter-n@^1.1.2:
|
||||||
|
version "1.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/split-filter-n/-/split-filter-n-1.1.2.tgz#268be1ec9c4d93dfb27b030c06165ac1b6f70f66"
|
||||||
|
integrity sha512-+hXSQYpKe1uyXPXI4zQtAJAlaF2EzEc+BaF2goMeNL5oUD5YLqrVcpjxELJxpomXfwMCUaYLAszEbdY9gKVdHQ==
|
Loading…
Reference in New Issue