lisn.js
Version:
Simply handle user gestures and actions. Includes widgets.
1 lines • 15.4 kB
Source Map (JSON)
{"version":3,"file":"validation.cjs","names":["MH","_interopRequireWildcard","require","_errors","_math","_misc","_text","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","isValidStrList","value","checkFn","allowEmpty","res","validateStrList","isNullish","err","isInstanceOf","LisnUsageError","exports","key","_toArray","filterBlank","toArray","map","v","_validateString","validateNumList","_toArray2","_validateNumber","validateNumber","validateBoolean","_validateBoolean","validateString","validateStringRequired","result","isEmpty","usageError","validateBooleanOrString","stringCheckFn","_validateBooleanOrString","isArray","isIterableObject","arrayFrom","isLiteralString","splitOn","trim","undefined","typeDescription","numVal","toNum","boolVal","toBoolean"],"sources":["../../../src/ts/utils/validation.ts"],"sourcesContent":["/**\n * @module Utils\n */\n\nimport * as MH from \"@lisn/globals/minification-helpers\";\n\nimport { LisnUsageError } from \"@lisn/globals/errors\";\n\nimport { CommaSeparatedStr } from \"@lisn/globals/types\";\n\nimport { toNum } from \"@lisn/utils/math\";\nimport { toBoolean } from \"@lisn/utils/misc\";\nimport { splitOn } from \"@lisn/utils/text\";\n\n/**\n * Returns true if the input is a string array or comma-separated string, whose\n * elements are valid according to the `validator` function.\n *\n * @param allowEmpty If `false`, then input without any entries is\n * considered _invalid_.\n *\n * @category Validation\n */\nexport const isValidStrList = <T extends string = string>(\n value: unknown,\n checkFn: (value: string) => value is T,\n allowEmpty = true,\n): value is CommaSeparatedStr<T> | T[] => {\n try {\n const res = validateStrList(\"\", value, checkFn);\n return allowEmpty || !MH.isNullish(res);\n } catch (err) {\n if (MH.isInstanceOf(err, LisnUsageError)) {\n return false;\n }\n throw err;\n }\n};\n\n/**\n * Returns an array of strings from the given list while validating each one\n * using the `checkFn` function.\n *\n * If it returns without throwing, the input is necessarily valid.\n * If the result is an empty array, it will return `null`.\n *\n * @throws {@link Errors.LisnUsageError | LisnUsageError}\n * If the input is not a string or array of strings, or if any\n * entries do not pass `checkFn`.\n *\n * @param key Used in the error message thrown\n *\n * @returns `undefined` if the input contains no non-empty values (after\n * trimming whitespace on left/right from each), otherwise a non-empty array of\n * values.\n *\n * @category Validation\n */\nexport const validateStrList = <T extends string = string>(\n key: string,\n value: unknown,\n checkFn?: (value: string) => value is T,\n): T[] | undefined =>\n MH.filterBlank(\n toArray(value)?.map((v) =>\n _validateString(key, v, checkFn, \"a string or a string array\"),\n ),\n );\n\n/**\n * Returns an array of numbers from the given list.\n *\n * If it returns without throwing, the input is necessarily valid.\n * If the result is an empty array, it will return `null`.\n *\n * @throws {@link Errors.LisnUsageError | LisnUsageError}\n * If the input is not a number or array of numbers. Numerical\n * strings are accepted.\n *\n * @param key Used in the error message thrown\n *\n * @returns `undefined` if the input contains no non-empty values (after\n * trimming whitespace on left/right from each), otherwise a non-empty array of\n * values.\n *\n * @category Validation\n */\nexport const validateNumList = (\n key: string,\n value: unknown,\n): number[] | undefined =>\n MH.filterBlank(\n toArray(value)?.map((v) =>\n _validateNumber(key, v, \"a number or a number array\"),\n ),\n );\n\n/**\n * Returns a number corresponding to the supplied value, ensuring the supplied\n * value is a valid number or a string containing only a number.\n *\n * @throws {@link Errors.LisnUsageError | LisnUsageError}\n * If the value is invalid.\n *\n * @returns `undefined` if the input is nullish.\n *\n * @category Validation\n */\nexport const validateNumber = (key: string, value: unknown) =>\n _validateNumber(key, value);\n\n/**\n * Returns a boolean corresponding to the given value as follows:\n *\n * - `null` and `undefined` result in `undefined`\n * - `false` and `\"false\"` result in `false`\n * - `\"\"`, `true` and `\"true\"` result in `true`\n * - other values throw an error error\n *\n * Note that an empty string is treated as `true`.\n *\n * @throws {@link Errors.LisnUsageError | LisnUsageError}\n * If the value is not a valid boolean or boolean string.\n *\n * @returns `undefined` if the input is nullish.\n *\n * @category Validation\n */\nexport const validateBoolean = (key: string, value: unknown) =>\n _validateBoolean(key, value);\n\n/**\n * Returns a valid string from the supplied value, ensuring the supplied value\n * is a string that conforms to the given `checkFn`.\n *\n * @throws {@link Errors.LisnUsageError | LisnUsageError}\n * If the value is invalid.\n *\n * @param checkFn If given and the supplied value is a string, then it is\n * called with the value as a single argument. It must return\n * true if the value is valid and false otherwise. If it is not\n * given, then any literal string is accepted.\n *\n * @returns `undefined` if the input is nullish.\n *\n * @category Validation\n */\nexport const validateString = <T extends string = string>(\n key: string,\n value: unknown,\n checkFn?: (value: string) => value is T,\n) => _validateString(key, value, checkFn);\n\n/**\n * Like {@link validateString} except it requires input to be given and\n * non-empty.\n *\n * @throws {@link Errors.LisnUsageError | LisnUsageError}\n * If the value is invalid or empty.\n *\n * @category Validation\n */\nexport const validateStringRequired = <T extends string = string>(\n key: string,\n value: unknown,\n checkFn?: (value: string) => value is T,\n): T => {\n const result = _validateString(key, value, checkFn);\n\n if (MH.isEmpty(result)) {\n throw MH.usageError(`'${key}' is required`);\n }\n\n return result;\n};\n\n/**\n * Returns a valid boolean or a string from the supplied value, ensuring the\n * supplied value is either a boolean or boolean string (see\n * {@link validateBoolean}), or a string that conforms to the given `checkFn`.\n *\n * @throws {@link Errors.LisnUsageError | LisnUsageError}\n * If the value is invalid.\n *\n * @param stringCheckFn If given and the supplied value is a string _other than\n * a boolean string_, then it is called with the value as\n * a single argument. It must return true if the value is\n * valid and false otherwise. If it is not given, then any\n * literal string is accepted.\n *\n * @category Validation\n */\nexport const validateBooleanOrString = <T extends string = string>(\n key: string,\n value: unknown,\n stringCheckFn?: (value: string) => value is T,\n) => _validateBooleanOrString(key, value, stringCheckFn);\n\n// --------------------\n\nconst toArray = (value: unknown): unknown[] | undefined => {\n let result: unknown[] | null;\n if (MH.isArray(value)) {\n result = value;\n } else if (MH.isIterableObject(value)) {\n result = MH.arrayFrom(value);\n } else if (MH.isLiteralString(value)) {\n result = splitOn(value, \",\");\n } else if (!MH.isNullish(value)) {\n result = [value];\n } else {\n result = null;\n }\n\n return result\n ? MH.filterBlank(result.map((v) => (MH.isLiteralString(v) ? v.trim() : v)))\n : undefined;\n};\n\nconst _validateNumber = (\n key: string,\n value: unknown,\n typeDescription?: string,\n) => {\n if (MH.isNullish(value)) {\n return;\n }\n\n const numVal = toNum(value, null);\n if (numVal === null) {\n throw MH.usageError(`'${key}' must be ${typeDescription ?? \"a number\"}`);\n }\n\n return numVal;\n};\n\nconst _validateBoolean = (\n key: string,\n value: unknown,\n typeDescription?: string,\n) => {\n if (MH.isNullish(value)) {\n return;\n }\n\n const boolVal = toBoolean(value);\n if (boolVal === null) {\n throw MH.usageError(\n `'${key}' must be ${typeDescription ?? '\"true\" or \"false\"'}`,\n );\n }\n\n return boolVal;\n};\n\nconst _validateString = <T extends string = string>(\n key: string,\n value: unknown,\n checkFn?: (value: string) => value is T,\n typeDescription?: string,\n): (typeof checkFn extends null | undefined ? string : T) | undefined => {\n if (MH.isNullish(value)) {\n return;\n }\n\n if (!MH.isLiteralString(value)) {\n throw MH.usageError(`'${key}' must be ${typeDescription ?? \"a string\"}`);\n } else if (checkFn && !checkFn(value)) {\n throw MH.usageError(`Invalid value for '${key}'`);\n }\n\n return value as typeof checkFn extends null | undefined ? string : T;\n};\n\nconst _validateBooleanOrString = <T extends string = string>(\n key: string,\n value: unknown,\n stringCheckFn?: (value: string) => value is T,\n typeDescription?: string,\n) => {\n if (MH.isNullish(value)) {\n return;\n }\n\n const boolVal = toBoolean(value);\n if (boolVal !== null) {\n return boolVal;\n }\n\n if (!MH.isLiteralString(value)) {\n throw MH.usageError(\n `'${key}' must be ${typeDescription ?? \"a boolean or string\"}`,\n );\n }\n\n return _validateString(key, value, stringCheckFn);\n};\n"],"mappings":"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","ignoreList":[]}