Module
x/value_schema/src/libs/StringAdjuster.es
simple, easy-to-use, and declarative input validator; supports Node.js, TypeScript, and Deno
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314import {CAUSE} from "./constants";import {isString} from "./utilities";import AdjusterInterface from "./AdjusterInterface";import AdjusterError from "./AdjusterError";
/** * adjuster for string */export default class StringAdjuster extends AdjusterInterface{ /** * constructor */ constructor() { super();
/** @type {?string} */ this._default = null; /** @type {boolean} */ this._allowEmpty = false; /** @type {?string} */ this._valueOnEmpty = null; /** @type {string[]} */ this._in = null; /** @type {?int} */ this._minLength = null; /** @type {?int} */ this._maxLength = null; /** @type {boolean} */ this._adjustMaxLength = false; /** @type {?RegExp} */ this._pattern = null; }
/** * adjust type * @param {_TypeValues} values * @return {boolean} finished adjustment or not * @private */ __adjustType(values) { if(typeof values.adjustedValue === "string") { return false; }
values.adjustedValue = String(values.adjustedValue); return false; }
/** * set default value; enable to omit * @param {string} value default value * @return {StringAdjuster} */ default(value) { this._default = value; return this; }
/** * adjust * @param {_TypeValues} values * @return {boolean} finished adjustment or not * @private */ __adjustDefault(values) { if(values.adjustedValue !== undefined) { return false; }
if(this._default !== null) { values.adjustedValue = this._default; return true; }
const cause = CAUSE.REQUIRED; throw new AdjusterError(cause, values.originalValue); }
/** * allow empty string (NOT undefined) * @param {?string} [value=null] value on empty * @return {StringAdjuster} */ allowEmpty(value = null) { this._allowEmpty = true; this._valueOnEmpty = value; return this; }
/** * adjust * @param {_TypeValues} values * @return {boolean} finished adjustment or not * @private */ __adjustEmpty(values) { if(values.adjustedValue !== "") { return false; }
if(this._allowEmpty) { values.adjustedValue = this._valueOnEmpty; return true; }
const cause = CAUSE.EMPTY; throw new AdjusterError(cause, values.originalValue); }
/** * accept only specified values * @param {...string} values values to be accepted * @return {StringAdjuster} */ in(...values) { this._in = values; return this; }
/** * adjust * @param {_TypeValues} values * @return {boolean} finished adjustment or not * @private */ __adjustIn(values) { if(this._in === null) { return false; } if(this._in.includes(values.adjustedValue)) { return true; }
const cause = CAUSE.IN; throw new AdjusterError(cause, values.originalValue); }
/** * set min-length * @param {int} length min-length; error if shorter * @return {StringAdjuster} */ minLength(length) { this._minLength = length; return this; }
/** * adjust * @param {_TypeValues} values * @return {boolean} finished adjustment or not * @private */ __adjustMinLength(values) { if(this._minLength === null) { return false; } if(values.adjustedValue.length >= this._minLength) { return false; }
const cause = CAUSE.MIN_LENGTH; throw new AdjusterError(cause, values.originalValue); }
/** * set max-length * @param {int} length max-length * @param {boolean} [adjust=false] truncate if longer; default is ERROR * @return {StringAdjuster} */ maxLength(length, adjust = false) { this._maxLength = length; this._adjustMaxLength = adjust; return this; }
/** * adjust * @param {_TypeValues} values * @return {boolean} finished adjustment or not * @private */ __adjustMaxLength(values) { if(this._maxLength === null) { return false; } if(values.adjustedValue.length <= this._maxLength) { return false; }
if(this._adjustMaxLength) { values.adjustedValue = values.adjustedValue.substr(0, this._maxLength); return false; }
const cause = CAUSE.MAX_LENGTH; throw new AdjusterError(cause, values.originalValue); }
/** * specify acceptable pattern by regular expression * @param {string|String|RegExp} pattern acceptable pattern(regular expression); string or RegExp * @return {StringAdjuster} */ pattern(pattern) { if(isString(pattern)) { pattern = new RegExp(pattern); } this._pattern = pattern; return this; }
/** * adjust * @param {_TypeValues} values * @return {boolean} finished adjustment or not * @private */ __adjustPattern(values) { if(this._pattern === null) { return false; } if(this._pattern.test(values.adjustedValue)) { return false; }
const cause = CAUSE.PATTERN; throw new AdjusterError(cause, values.originalValue); }
/** * do adjust * @param {*} value value to be checked * @param {?_OnError} onError callback function on error * @return {string} adjusted value */ adjust(value, onError = null) { const values = { originalValue: value, adjustedValue: value, };
try { if(this.__adjustDefault(values)) { return values.adjustedValue; } if(this.__adjustType(values)) { return values.adjustedValue; } if(this.__adjustIn(values)) { return values.adjustedValue; } if(this.__adjustEmpty(values)) { return values.adjustedValue; } if(this.__adjustMinLength(values)) { return values.adjustedValue; } if(this.__adjustMaxLength(values)) { return values.adjustedValue; } if(this.__adjustPattern(values)) { return values.adjustedValue; }
return values.adjustedValue; } catch(err) { return AdjusterInterface._handleError(onError, err.cause, err.value); } }}